Handle FT cancelation
This commit is contained in:
parent
03c7d96eab
commit
b55ba07e93
9 changed files with 83 additions and 10 deletions
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue