diff options
Diffstat (limited to 'protocols/JabberG/src')
| -rwxr-xr-x | protocols/JabberG/src/jabber_caps.h | 1 | ||||
| -rw-r--r-- | protocols/JabberG/src/jabber_disco.cpp | 11 | ||||
| -rw-r--r-- | protocols/JabberG/src/jabber_ft.cpp | 32 | 
3 files changed, 38 insertions, 6 deletions
diff --git a/protocols/JabberG/src/jabber_caps.h b/protocols/JabberG/src/jabber_caps.h index 6bb1ac8446..511347028f 100755 --- a/protocols/JabberG/src/jabber_caps.h +++ b/protocols/JabberG/src/jabber_caps.h @@ -196,6 +196,7 @@ typedef unsigned __int64 JabberCapsBits;  #define JABBER_FEAT_JUD									"jabber:iq:search"
  #define JABBER_FEAT_SERVER_AVATAR               "storage:client:avatar"
  #define JABBER_FEAT_UPLOAD                      "urn:xmpp:http:upload"
 +#define JABBER_FEAT_UPLOAD0                     "urn:xmpp:http:upload:0"
  #define JABBER_FEAT_PUBSUB_EVENT                "http://jabber.org/protocol/pubsub#event"
  #define JABBER_FEAT_PUBSUB_NODE_CONFIG          "http://jabber.org/protocol/pubsub#node_config"
 diff --git a/protocols/JabberG/src/jabber_disco.cpp b/protocols/JabberG/src/jabber_disco.cpp index f4b82a748d..647309492a 100644 --- a/protocols/JabberG/src/jabber_disco.cpp +++ b/protocols/JabberG/src/jabber_disco.cpp @@ -1026,7 +1026,7 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM  		SD_ACT_LOGON = 100, SD_ACT_LOGOFF, SD_ACT_UNREGISTER,
  		SD_ACT_REGISTER = 200, SD_ACT_ADHOC, SD_ACT_ADDDIRECTORY,
 -		SD_ACT_JOIN, SD_ACT_BOOKMARK, SD_ACT_PROXY, SD_ACT_VCARD, SD_ACT_UPLOAD
 +		SD_ACT_JOIN, SD_ACT_BOOKMARK, SD_ACT_PROXY, SD_ACT_VCARD, SD_ACT_UPLOAD, SD_ACT_UPLOAD0
  	};
  	enum
 @@ -1064,6 +1064,7 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM  		{ JABBER_FEAT_JUD,           LPGENW("Add search directory"),  SD_ACT_ADDDIRECTORY},
  		{ JABBER_FEAT_BYTESTREAMS,   LPGENW("Use this proxy"),        SD_ACT_PROXY},
  		{ JABBER_FEAT_UPLOAD,        LPGENW("Use for uploads"),       SD_ACT_UPLOAD},
 +		{ JABBER_FEAT_UPLOAD0,       LPGENW("Use for uploads"),       SD_ACT_UPLOAD0},
  		{ nullptr },
  		{ JABBER_FEAT_REGISTER,      LPGENW("Register"),              SD_ACT_REGISTER},
  		{ "jabber:iq:gateway",       LPGENW("Unregister"),            SD_ACT_UNREGISTER,       SD_FLG_ONROSTER | SD_FLG_SUBSCRIBED},
 @@ -1138,6 +1139,7 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM  					break;
  				case SD_ACT_UPLOAD:
 +				case SD_ACT_UPLOAD0:
  					if (m_bUseHttpUpload)
  						dwFlags += MF_CHECKED;
  					break;
 @@ -1252,6 +1254,13 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM  	case SD_ACT_UPLOAD:
  		m_bUseHttpUpload = !m_bUseHttpUpload;
  		setUString("HttpUpload", pNode->GetJid());
 +		setByte("HttpUploadVer", 1);
 +		break;
 +
 +	case SD_ACT_UPLOAD0:
 +		m_bUseHttpUpload = !m_bUseHttpUpload;
 +		setUString("HttpUpload", pNode->GetJid());
 +		setByte("HttpUploadVer", 0);
  		break;
  	case SD_ACT_JOIN:
 diff --git a/protocols/JabberG/src/jabber_ft.cpp b/protocols/JabberG/src/jabber_ft.cpp index a162d7504d..c7123fb2d5 100644 --- a/protocols/JabberG/src/jabber_ft.cpp +++ b/protocols/JabberG/src/jabber_ft.cpp @@ -103,9 +103,20 @@ void CJabberProto::FtInitiate(const char* jid, filetransfer *ft)  			if (pwszContentType == nullptr)
  				pwszContentType = "application/octet-stream";
 +			char szSize[100];
 +			_i64toa(st.st_size, szSize, 10);
 +
  			XmlNodeIq iq(AddIQ(&CJabberProto::OnHttpSlotAllocated, JABBER_IQ_TYPE_GET, szUploadService, ft));
 -			iq << XCHILDNS("request", "urn:xmpp:http:upload:0") 
 -				<< XATTR("filename", T2Utf(filename)) << XATTRI64("size", st.st_size) << XATTR("content-type", pwszContentType);
 +			if (getByte("HttpUploadVer")) {
 +				auto *p = iq << XCHILDNS("request", JABBER_FEAT_UPLOAD);
 +				p << XCHILD("filename", T2Utf(filename));
 +				p << XCHILD("size", szSize);
 +				p << XCHILD("content-type", pwszContentType);
 +			}
 +			else {
 +				iq << XCHILDNS("request", JABBER_FEAT_UPLOAD0)
 +					<< XATTR("filename", T2Utf(filename)) << XATTR("size", szSize) << XATTR("content-type", pwszContentType);
 +			}
  			m_ThreadInfo->send(iq);
  			return;
  		}
 @@ -566,7 +577,18 @@ LBL_Fail:  	if (auto *slotNode = XmlFirstChild(iqNode, "slot")) {
  		if (auto *putNode = XmlFirstChild(slotNode, "put")) {
 -			if (auto *szUrl = putNode->Attribute("url")) {
 +			const char *szXmlns = slotNode->Attribute("xmlns"), *szUrl = nullptr;
 +			if (!mir_strcmp(szXmlns, JABBER_FEAT_UPLOAD)) {
 +				szUrl = putNode->GetText();
 +				debugLogA("%s: setting url to %s", szXmlns, szUrl);
 +			}
 +			else if (!mir_strcmp(szXmlns, JABBER_FEAT_UPLOAD0)) {
 +				szUrl = putNode->Attribute("url");
 +				debugLogA("%s: setting url to %s", szXmlns, szUrl);
 +			}
 +			else debugLogA("missing url location");
 +
 +			if (szUrl) {
  				NETLIBHTTPHEADER hdr[10];
  				NETLIBHTTPREQUEST nlhr = {};
 @@ -636,8 +658,8 @@ LBL_Fail:  				return;
  			}
  		}
 +		else debugLogA("missing put node");
  	}
 -	
 -	debugLogA("wrong or not recognizable http slot received");
 +	else debugLogA("wrong or not recognizable http slot received");
  	goto LBL_Fail;
  }
  | 
