Handle FT cancelation

This commit is contained in:
HanzZ 2011-10-03 11:35:32 +02:00
parent 03c7d96eab
commit b55ba07e93
9 changed files with 83 additions and 10 deletions

View file

@ -1344,11 +1344,17 @@ static void XferDestroyed(PurpleXfer *xfer) {
}
static void xferCanceled(PurpleXfer *xfer) {
// FiletransferRepeater *repeater = (FiletransferRepeater *) xfer->ui_data;
// if (!repeater)
// return;
// GlooxMessageHandler::instance()->ftManager->removeSID(repeater->getSID());
// repeater->handleXferCanceled();
PurpleAccount *account = purple_xfer_get_account(xfer);
std::string filename(xfer ? purple_xfer_get_filename(xfer) : "");
purple_xfer_ref(xfer);
std::string w = xfer->who;
size_t pos = w.find("/");
if (pos != std::string::npos)
w.erase((int) pos, w.length() - (int) pos);
FTData *ftdata = (FTData *) xfer->ui_data;
np->handleFTFinish(np->m_accounts[account], w, filename, purple_xfer_get_size(xfer), ftdata ? ftdata->id : 0);
purple_xfer_unref(xfer);
}
@ -1369,7 +1375,6 @@ static void fileRecvStart(PurpleXfer *xfer) {
}
static void newXfer(PurpleXfer *xfer) {
// GlooxMessageHandler::instance()->ftManager->handleXferFileReceiveRequest(xfer);
PurpleAccount *account = purple_xfer_get_account(xfer);
std::string filename(xfer ? purple_xfer_get_filename(xfer) : "");
purple_xfer_ref(xfer);

View file

@ -33,6 +33,21 @@ void MyOutgoingSIFileTransfer::start() {
void MyOutgoingSIFileTransfer::stop() {
}
void MyOutgoingSIFileTransfer::cancel() {
// TODO
// session->sendTerminate(JinglePayload::Reason::Cancel);
if (ibbSession) {
ibbSession->stop();
}
SOCKS5BytestreamServerSession *serverSession = registry->getConnectedSession(SOCKS5BytestreamRegistry::getHostname(id, from, to));
if (serverSession) {
serverSession->stop();
}
onStateChange(FileTransfer::State(FileTransfer::State::Canceled));
}
void MyOutgoingSIFileTransfer::handleStreamInitiationRequestResponse(StreamInitiation::ref response, ErrorPayload::ref error) {
if (error) {
finish(FileTransferError());

View file

@ -30,7 +30,7 @@ namespace Swift {
virtual void start();
virtual void stop();
virtual void cancel() {}
virtual void cancel();
boost::signal<void (const boost::optional<FileTransferError>&)> onFinished;

View file

@ -28,13 +28,14 @@ namespace Transport {
class MemoryReadBytestream : public Swift::ReadBytestream {
public:
MemoryReadBytestream();
MemoryReadBytestream(unsigned long size);
virtual ~MemoryReadBytestream();
unsigned long appendData(const std::string &data);
virtual boost::shared_ptr<std::vector<unsigned char> > read(size_t size);
void setFinished() { m_finished = true; }
bool isFinished() const;
boost::signal<void ()> onDataNeeded;
@ -43,6 +44,8 @@ class MemoryReadBytestream : public Swift::ReadBytestream {
bool m_finished;
std::string m_data;
bool neededData;
unsigned long m_sent;
unsigned long m_size;
};
}

View file

@ -145,6 +145,7 @@ class NetworkPlugin {
void handleAttention(const std::string &user, const std::string &buddyName, const std::string &message);
void handleFTStart(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size);
void handleFTFinish(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size, unsigned long ftid);
void handleFTData(unsigned long ftID, const std::string &data);

View file

@ -92,6 +92,7 @@ class NetworkPluginServer {
void handleAttentionPayload(const std::string &payload);
void handleStatsPayload(Backend *c, const std::string &payload);
void handleFTStartPayload(const std::string &payload);
void handleFTFinishPayload(const std::string &payload);
void handleFTDataPayload(Backend *b ,const std::string &payload);
void handleUserCreated(User *user);

View file

@ -27,9 +27,11 @@ using namespace log4cxx;
namespace Transport {
MemoryReadBytestream::MemoryReadBytestream() {
MemoryReadBytestream::MemoryReadBytestream(unsigned long size) {
neededData = false;
m_finished = false;
m_sent = 0;
m_size = size;
}
MemoryReadBytestream::~MemoryReadBytestream() {
@ -51,12 +53,18 @@ boost::shared_ptr<std::vector<unsigned char> > MemoryReadBytestream::read(size_t
if (m_data.size() < size) {
boost::shared_ptr<std::vector<unsigned char> > ptr(new std::vector<unsigned char>(m_data.begin(), m_data.end()));
m_sent += m_data.size();
m_data.clear();
if (m_sent == m_size)
m_finished = true;
onDataNeeded();
return ptr;
}
boost::shared_ptr<std::vector<unsigned char> > ptr(new std::vector<unsigned char>(m_data.begin(), m_data.begin() + size));
m_data.erase(m_data.begin(), m_data.begin() + size);
m_sent += size;
if (m_sent == m_size)
m_finished = true;
if (m_data.size() < 500000 && !neededData) {
neededData = true;
onDataNeeded();

View file

@ -279,6 +279,24 @@ void NetworkPlugin::handleFTStart(const std::string &user, const std::string &bu
send(message);
}
void NetworkPlugin::handleFTFinish(const std::string &user, const std::string &buddyName, const std::string fileName, unsigned long size, unsigned long ftid) {
pbnetwork::File room;
room.set_username(user);
room.set_buddyname(buddyName);
room.set_filename(fileName);
room.set_size(size);
if (ftid) {
room.set_ftid(ftid);
}
std::string message;
room.SerializeToString(&message);
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_FT_FINISH);
send(message);
}
void NetworkPlugin::handleFTData(unsigned long ftID, const std::string &data) {
pbnetwork::FileTransferData d;
d.set_ftid(ftID);

View file

@ -601,7 +601,7 @@ void NetworkPluginServer::handleFTStartPayload(const std::string &data) {
fileInfo.setName(payload.filename());
Backend *c = (Backend *) user->getData();
boost::shared_ptr<MemoryReadBytestream> bytestream(new MemoryReadBytestream());
boost::shared_ptr<MemoryReadBytestream> bytestream(new MemoryReadBytestream(payload.size()));
bytestream->onDataNeeded.connect(boost::bind(&NetworkPluginServer::handleFTDataNeeded, this, c, bytestream_id + 1));
LOG4CXX_INFO(logger, "jid=" << buddy->getJID());
@ -617,6 +617,25 @@ void NetworkPluginServer::handleFTStartPayload(const std::string &data) {
transfer.ft->start();
}
void NetworkPluginServer::handleFTFinishPayload(const std::string &data) {
pbnetwork::File payload;
if (payload.ParseFromString(data) == false) {
// TODO: ERROR
return;
}
if (payload.has_ftid()) {
if (m_filetransfers.find(payload.ftid()) != m_filetransfers.end()) {
FileTransferManager::Transfer &transfer = m_filetransfers[payload.ftid()];
transfer.ft->cancel();
}
else {
LOG4CXX_ERROR(logger, "FTFinishPayload for unknown ftid=" << payload.ftid());
}
}
}
void NetworkPluginServer::handleFTDataPayload(Backend *b, const std::string &data) {
pbnetwork::FileTransferData payload;
if (payload.ParseFromString(data) == false) {
@ -740,6 +759,9 @@ void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr<Swift::Sa
case pbnetwork::WrapperMessage_Type_TYPE_FT_START:
handleFTStartPayload(wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_FT_FINISH:
handleFTFinishPayload(wrapper.payload());
break;
case pbnetwork::WrapperMessage_Type_TYPE_FT_DATA:
handleFTDataPayload(c, wrapper.payload());
break;