#include "transfer.h"
#include "netmanager.h"
#include "netconnection.h"
#include "protocol.h"
#include "neterror.h"
namespace Security {
namespace Network {
Transfer::Transfer(Protocol &proto, const Target &tgt, Operation op, IPPort defPort)
: protocol(proto),
target(tgt.host.defaultPort(defPort), tgt.path),
mState(cold), mOperation(op), mConnection(NULL),
mSource(NULL), mSink(NULL),
mShareConnections(proto.manager.reuseConnections()),
mErrorStatus(defaultOSStatusError)
{
debug("netxfer", "%p created for protocol %p(%s) target %s operation %d",
this, &proto, proto.name(), target.urlForm().c_str(), mOperation);
parameters(protocol.manager); mObserver = protocol.manager.observer();
}
Transfer::~Transfer()
{
debug("netxfer", "transfer %p destroyed", this);
}
Transfer::ResultClass Transfer::resultClass() const
{
switch (state()) {
case failed:
return unclassifiedFailure;
case finished:
return success;
default:
Error::throwMe();
}
}
OSStatus Transfer::errorStatus() const
{
assert(state() == failed);
return mErrorStatus;
}
string Transfer::errorDescription() const
{
assert(state() == failed);
return mErrorDescription;
}
void Transfer::restart()
{
assert(mConnection);
return mConnection->restart();
}
void Transfer::observe(Observer::Events events, const void *info)
{
if (mObserver && mObserver->wants(events))
mObserver->observe(events, this, info);
}
void Transfer::finish()
{
debug("xferengine", "transfer %p is finishing up", this);
mState = finished;
if (isDocked())
mConnection->undock();
protocol.manager.done(this);
observe(Observer::transferComplete);
}
void Transfer::fail()
{
debug("xferengine", "transfer %p is failing", this);
mState = failed;
if (isDocked())
mConnection->undock();
protocol.manager.done(this);
observe(Observer::transferFailed);
}
void Transfer::abort()
{
observe(Observer::aborting);
if (isDocked())
mConnection->retain(false); fail();
}
} }