HXML __fastcall operator<<(HXML node, const XQUERY& child) { HXML n = xmlAddChild(node, _T("query")); if (n) xmlAddAttr(n, _T("xmlns"), child.ns); return n; }
void __fastcall XmlAddAttr(HXML hXml, LPCTSTR pszName, unsigned __int64 value) { TCHAR buf[60]; _ui64tot(value, buf, 10); xmlAddAttr(hXml, T2UTF(pszName), T2UTF(buf)); }
BOOL CJabberProto::OnHandleDiscoItemsRequest(HXML iqNode, CJabberIqInfo *pInfo) { if (!pInfo->GetChildNode()) return TRUE; // ad-hoc commands check: const TCHAR *szNode = xmlGetAttrValue(pInfo->GetChildNode(), _T("node")); if (szNode && m_adhocManager.HandleItemsRequest(iqNode, pInfo, szNode)) return TRUE; // another request, send empty result XmlNodeIq iq(_T("result"), pInfo); HXML resultQuery = iq << XQUERY(JABBER_FEAT_DISCO_ITEMS); if (szNode) xmlAddAttr(resultQuery, _T("node"), szNode); if (!szNode && m_options.EnableRemoteControl) resultQuery << XCHILD(_T("item")) << XATTR(_T("jid"), m_ThreadInfo->fullJID) << XATTR(_T("node"), JABBER_FEAT_COMMANDS) << XATTR(_T("name"), _T("Ad-hoc commands")); m_ThreadInfo->send(iq); return TRUE; }
void __fastcall XmlAddAttr(HXML hXml, LPCTSTR name, LPCTSTR value) { if (value) xmlAddAttr(hXml, name, T2UTF(value)); }
void __fastcall xmlAddAttrID(HXML hXml, int id) { TCHAR text[100]; mir_sntprintf(text, SIZEOF(text), _T(JABBER_IQID) _T("%d"), id); xmlAddAttr(hXml, _T("id"), text); }
HXML __fastcall operator<<(HXML node, const XCHILDNS& child) { HXML res = xmlAddChild(node, child.name); xmlAddAttr(res, _T("xmlns"), child.ns); return res; }
BOOL CJabberProto::OnIqRequestOOB(HXML, CJabberIqInfo *pInfo) { if (!pInfo->GetFrom() || !pInfo->GetHContact()) return TRUE; HXML n = xmlGetChild(pInfo->GetChildNode(), "url"); if (!n || !xmlGetText(n)) return TRUE; if (m_options.BsOnlyIBB) { // reject XmlNodeIq iq(_T("error"), pInfo); HXML e = xmlAddChild(iq, _T("error"), _T("File transfer refused")); xmlAddAttr(e, _T("code"), 406); m_ThreadInfo->send(iq); return TRUE; } filetransfer *ft = new filetransfer(this); ft->std.totalFiles = 1; ft->jid = mir_tstrdup(pInfo->GetFrom()); ft->std.hContact = pInfo->GetHContact(); ft->type = FT_OOB; ft->httpHostName = NULL; ft->httpPort = 80; ft->httpPath = NULL; // Parse the URL TCHAR *str = (TCHAR*)xmlGetText(n); // URL of the file to get if (!_tcsnicmp(str, _T("http://"), 7)) { TCHAR *p = str + 7, *q; if ((q = _tcschr(p, '/')) != NULL) { TCHAR text[1024]; if (q-p < SIZEOF(text)) { _tcsncpy(text, p, q-p); text[q-p] = '\0'; if ((p = _tcschr(text, ':')) != NULL) { ft->httpPort = (WORD)_ttoi(p+1); *p = '\0'; } ft->httpHostName = mir_t2a(text); } } } if (pInfo->GetIdStr()) ft->iqId = pInfo->GetIqId(); if (ft->httpHostName && ft->httpPath) { TCHAR *desc = NULL; debugLogA("Host=%s Port=%d Path=%s", ft->httpHostName, ft->httpPort, ft->httpPath); if ((n = xmlGetChild(pInfo->GetChildNode(), "desc")) != NULL) desc = (TCHAR*)xmlGetText(n); TCHAR *str2; debugLogA("description = %s", desc); if ((str2 = _tcsrchr(ft->httpPath, '/')) != NULL) str2++; else str2 = ft->httpPath; str2 = mir_tstrdup(str2); JabberHttpUrlDecode(str2); PROTORECVFILET pre; pre.flags = PREF_TCHAR; pre.timestamp = time(NULL); pre.tszDescription = desc; pre.ptszFiles = &str2; pre.fileCount = 1; pre.lParam = (LPARAM)ft; ProtoChainRecvFile(ft->std.hContact, &pre); mir_free(str2); } else { // reject XmlNodeIq iq(_T("error"), pInfo); HXML e = xmlAddChild(iq, _T("error"), _T("File transfer refused")); xmlAddAttr(e, _T("code"), 406); m_ThreadInfo->send(iq); delete ft; } return TRUE; }