#ifndef _H_TRANSFER
#define _H_TRANSFER
#include <Security/streams.h>
#include <Security/ip++.h>
#include "protocol.h"
#include "target.h"
#include "parameters.h"
#include "observer.h"
using namespace IPPlusPlus;
namespace Security {
namespace Network {
class Protocol;
class Transfer : public ParameterPointer {
friend class Manager;
friend class Connection;
public:
typedef Protocol::Operation Operation;
Transfer(Protocol &proto, const Target &tgt, Operation op, IPPort defaultPort = 0);
virtual ~Transfer();
Protocol &protocol;
const Target target;
enum State {
cold, warm, active, frozen, finished, failed };
enum ResultClass {
success, localFailure, networkFailure, remoteFailure, authorizationFailure, abortedFailure, unclassifiedFailure };
State state() const { return mState; }
Operation operation() const { return mOperation; }
virtual ResultClass resultClass() const;
virtual OSStatus errorStatus() const; virtual string errorDescription() const;
template <class Conn>
Conn &connectionAs() const
{ assert(mConnection); return *safe_cast<Conn *>(mConnection); }
bool isDocked() const { return mConnection; }
Sink &sink() const { assert(mSink); return *mSink; }
Source &source() const { assert(mSource); return *mSource; }
void sink(Sink &snk) { assert(!mSink); mSink = &snk; }
void source(Source &src) { assert(!mSource); mSource = &src; }
bool hasSink() const { return mSink; }
bool hasSource() const { return mSource; }
Observer *observer() const { return mObserver; }
void observer(Observer *ob) { mObserver = ob; }
bool shareConnections() const { return mShareConnections; }
void shareConnections(bool share) { mShareConnections = share; }
const HostTarget &proxyHostTarget() const
{ return protocol.isProxy() ? protocol.proxyHost() : target; }
static const OSStatus defaultOSStatusError = -30785;
protected:
virtual void start() = 0; virtual void abort();
void restart();
void observe(Observer::Events events, const void *info = NULL);
void setError(const char *s, OSStatus err = defaultOSStatusError)
{ if (s) mErrorStatus = err; mErrorDescription = s; }
void finish();
void fail();
private:
State mState; Operation mOperation; Connection *mConnection; Observer *mObserver; Source *mSource; Sink *mSink; bool mShareConnections;
OSStatus mErrorStatus; string mErrorDescription; };
} }
#endif _H_TRANSFER