From aa5b93489cf1185018e00a48033ac8a844dca533 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 14 Feb 2019 18:33:08 +0300 Subject: Skype -> TinyXml --- protocols/SkypeWeb/src/skype_chatrooms.cpp | 128 +++++++++++------------------ protocols/SkypeWeb/src/skype_events.cpp | 102 +++++++++-------------- protocols/SkypeWeb/src/skype_files.cpp | 38 +++++---- protocols/SkypeWeb/src/skype_utils.cpp | 3 + protocols/SkypeWeb/src/version.h | 2 +- 5 files changed, 114 insertions(+), 159 deletions(-) (limited to 'protocols') diff --git a/protocols/SkypeWeb/src/skype_chatrooms.cpp b/protocols/SkypeWeb/src/skype_chatrooms.cpp index 62ed991ddd..1236756b3e 100644 --- a/protocols/SkypeWeb/src/skype_chatrooms.cpp +++ b/protocols/SkypeWeb/src/skype_chatrooms.cpp @@ -245,7 +245,6 @@ INT_PTR CSkypeProto::OnLeaveChatRoom(WPARAM hContact, LPARAM) void CSkypeProto::OnChatEvent(const JSONNode &node) { - //CMStringA szMessageId = node["clientmessageid"] ? node["clientmessageid"].as_string().c_str() : node["skypeeditedid"].as_string().c_str(); CMStringA szConversationName(UrlToSkypename(node["conversationLink"].as_string().c_str())); CMStringA szFromSkypename(UrlToSkypename(node["from"].as_string().c_str())); @@ -256,7 +255,6 @@ void CSkypeProto::OnChatEvent(const JSONNode &node) std::string strContent = node["content"].as_string(); int nEmoteOffset = node["skypeemoteoffset"].as_int(); - if (FindChatRoom(szConversationName) == NULL) SendRequest(new GetChatInfoRequest(szConversationName, li), &CSkypeProto::OnGetChatInfo, szTopic.Detach()); @@ -266,97 +264,71 @@ void CSkypeProto::OnChatEvent(const JSONNode &node) AddMessageToChat(_A2T(szConversationName), _A2T(szFromSkypename), szClearedContent, nEmoteOffset != NULL, nEmoteOffset, timestamp); } else if (messageType == "ThreadActivity/AddMember") { - ptrA xinitiator, xtarget, initiator; - //content = 14291862291648:initiator8:user - - HXML xml = xmlParseString(ptrW(mir_utf8decodeW(strContent.c_str())), nullptr, L"addmember"); - if (xml == nullptr) + // 14291862291648:initiator8:user + TiXmlDocument doc; + if (0 != doc.Parse(strContent.c_str())) return; - for (int i = 0; i < xmlGetChildCount(xml); i++) { - HXML xmlNode = xmlGetNthChild(xml, L"target", i); - if (xmlNode == nullptr) - break; - - xtarget = mir_u2a(xmlGetText(xmlNode)); - - CMStringA target = ParseUrl(xtarget, "8:"); + if (auto *pRoot = doc.FirstChildElement("addMember")) { + CMStringA target = ParseUrl(pRoot->FirstChildElement("target")->Value(), "8:"); AddChatContact(_A2T(szConversationName), target, target, L"User"); } - xmlDestroyNode(xml); } else if (messageType == "ThreadActivity/DeleteMember") { - ptrA xinitiator, xtarget; - //content = 14291862291648:initiator8:user - - HXML xml = xmlParseString(ptrW(mir_utf8decodeW(strContent.c_str())), nullptr, L"deletemember"); - if (xml != nullptr) { - HXML xmlNode = xmlGetChildByPath(xml, L"initiator", 0); - xinitiator = node != NULL ? mir_u2a(xmlGetText(xmlNode)) : nullptr; - - xmlNode = xmlGetChildByPath(xml, L"target", 0); - xtarget = xmlNode != nullptr ? mir_u2a(xmlGetText(xmlNode)) : nullptr; - - xmlDestroyNode(xml); - } - if (xtarget == NULL) + // 14291862291648:initiator8:user + TiXmlDocument doc; + if (0 != doc.Parse(strContent.c_str())) return; - CMStringA target = ParseUrl(xtarget, "8:"); - CMStringA initiator = ParseUrl(xinitiator, "8:"); - RemoveChatContact(_A2T(szConversationName), target, target, true, initiator); - + if (auto *pRoot = doc.FirstChildElement("deletemember")) { + CMStringA target = ParseUrl(pRoot->FirstChildElement("target")->Value(), "8:"); + CMStringA initiator = ParseUrl(pRoot->FirstChildElement("initiator")->Value(), "8:"); + RemoveChatContact(_A2T(szConversationName), target, target, true, initiator); + } } else if (messageType == "ThreadActivity/TopicUpdate") { - //content=14295327021308:usertest topic - ptrA xinitiator, value; - HXML xml = xmlParseString(ptrW(mir_utf8decodeW(strContent.c_str())), nullptr, L"topicupdate"); - if (xml != nullptr) { - HXML xmlNode = xmlGetChildByPath(xml, L"initiator", 0); - xinitiator = xmlNode != nullptr ? mir_u2a(xmlGetText(xmlNode)) : nullptr; - - xmlNode = xmlGetChildByPath(xml, L"value", 0); - value = xmlNode != nullptr ? mir_u2a(xmlGetText(xmlNode)) : nullptr; + // 14295327021308:usertest topic + TiXmlDocument doc; + if (0 != doc.Parse(strContent.c_str())) + return; - xmlDestroyNode(xml); + auto *pRoot = doc.FirstChildElement("topicupdate"); + if (pRoot) { + CMStringA initiator = ParseUrl(pRoot->FirstChildElement("initiator")->Value(), "8:"); + CMStringA value = pRoot->FirstChildElement("value")->Value(); + RenameChat(szConversationName, value); + ChangeChatTopic(szConversationName, value, initiator); } - - CMStringA initiator = ParseUrl(xinitiator, "8:"); - RenameChat(szConversationName, value); - ChangeChatTopic(szConversationName, value, initiator); } else if (messageType == "ThreadActivity/RoleUpdate") { - //content=14295512583638:user8:user1admin - ptrA xinitiator, xId, xRole; - HXML xml = xmlParseString(ptrW(mir_utf8decodeW(strContent.c_str())), nullptr, L"roleupdate"); - if (xml != nullptr) { - HXML xmlNode = xmlGetChildByPath(xml, L"initiator", 0); - xinitiator = xmlNode != nullptr ? mir_u2a(xmlGetText(xmlNode)) : nullptr; - - xmlNode = xmlGetChildByPath(xml, L"target", 0); - if (xmlNode != nullptr) { - HXML xmlId = xmlGetChildByPath(xmlNode, L"id", 0); - HXML xmlRole = xmlGetChildByPath(xmlNode, L"role", 0); - xId = xmlId != nullptr ? mir_u2a(xmlGetText(xmlId)) : nullptr; - xRole = xmlRole != nullptr ? mir_u2a(xmlGetText(xmlRole)) : nullptr; + // 14295512583638:user8:user1admin + TiXmlDocument doc; + if (0 != doc.Parse(strContent.c_str())) + return; + + auto *pRoot = doc.FirstChildElement("roleupdate"); + if (pRoot) { + CMStringA initiator = ParseUrl(pRoot->FirstChildElement("initiator")->Value(), "8:"); + + auto *pTarget = pRoot->FirstChildElement("target"); + if (pTarget) { + CMStringA id = ParseUrl(pTarget->FirstChildElement("id")->Value(), "8:"); + const char *role = pTarget->FirstChildElement("role")->Value(); + + ptrW tszId(mir_a2u(id)); + ptrW tszRole(mir_a2u(role)); + ptrW tszInitiator(mir_a2u(initiator)); + + GCEVENT gce = { m_szModuleName, _A2T(szConversationName), !mir_strcmpi(role, "Admin") ? GC_EVENT_ADDSTATUS : GC_EVENT_REMOVESTATUS }; + gce.dwFlags = GCEF_ADDTOLOG; + gce.ptszNick = tszId; + gce.ptszUID = tszId; + gce.ptszText = tszInitiator; + gce.time = time(0); + gce.bIsMe = IsMe(id); + gce.ptszStatus = TranslateT("Admin"); + Chat_Event(&gce); } - xmlDestroyNode(xml); - - CMStringA initiator = ParseUrl(xinitiator, "8:"); - CMStringA id = ParseUrl(xId, "8:"); - ptrW tszId(mir_a2u(id)); - ptrW tszRole(mir_a2u(xRole)); - ptrW tszInitiator(mir_a2u(initiator)); - - GCEVENT gce = { m_szModuleName, _A2T(szConversationName), !mir_strcmpi(xRole, "Admin") ? GC_EVENT_ADDSTATUS : GC_EVENT_REMOVESTATUS }; - gce.dwFlags = GCEF_ADDTOLOG; - gce.ptszNick = tszId; - gce.ptszUID = tszId; - gce.ptszText = tszInitiator; - gce.time = time(0); - gce.bIsMe = IsMe(id); - gce.ptszStatus = TranslateT("Admin"); - Chat_Event(&gce); } } } diff --git a/protocols/SkypeWeb/src/skype_events.cpp b/protocols/SkypeWeb/src/skype_events.cpp index 4a0c2cec69..f5124b96da 100644 --- a/protocols/SkypeWeb/src/skype_events.cpp +++ b/protocols/SkypeWeb/src/skype_events.cpp @@ -16,13 +16,12 @@ along with this program. If not, see . */ #include "stdafx.h" -#define INVALID_DATA Translate("SkypeWeb error: Invalid data!") INT_PTR CSkypeProto::GetEventText(WPARAM pEvent, LPARAM datatype) { DBEVENTINFO *dbei = (DBEVENTINFO*)pEvent; - CMStringA szText; + CMStringA szText = Translate("SkypeWeb error: Invalid data!"); BOOL bUseBB = db_get_b(0, dbei->szModule, "UseBBCodes", 1); switch (dbei->eventType) { @@ -42,74 +41,54 @@ INT_PTR CSkypeProto::GetEventText(WPARAM pEvent, LPARAM datatype) szText.AppendFormat(bUseBB ? Translate("[b]Edited at %s:[/b]\n%s\n") : Translate("Edited at %s:\n%s\n"), szTime, mir_utf8decodeA(jEdit["text"].as_string().c_str())); } - - } - else { - szText = INVALID_DATA; } - break; } + break; case SKYPE_DB_EVENT_TYPE_CALL_INFO: { - HXML xml = xmlParseString(ptrW(mir_utf8decodeW((char*)dbei->pBlob)), nullptr, L"partlist"); - if (xml != nullptr) { - ptrA type(mir_u2a(xmlGetAttrValue(xml, L"type"))); - bool bType = (!mir_strcmpi(type, "started")) ? 1 : 0; - time_t callDuration = 0; + TiXmlDocument doc; + if (0 != doc.Parse((char*)dbei->pBlob)) + break; - for (int i = 0; i < xmlGetChildCount(xml); i++) { - HXML xmlPart = xmlGetNthChild(xml, L"part", i); - if (xmlPart != nullptr) { - HXML xmlDuration = xmlGetChildByPath(xmlPart, L"duration", 0); + if (auto *pRoot = doc.FirstChildElement("partlist")) { + bool bType = pRoot->IntAttribute("started") ? 1 : 0; - if (xmlDuration != nullptr) { - callDuration = _wtol(xmlGetText(xmlDuration)); - break; - } + time_t callDuration = 0; + for (auto *it : TiXmlFilter(pRoot, "part")) { + auto *xmlDuration = it->FirstChildElement("duration"); + if (xmlDuration != nullptr) { + callDuration = atoi(xmlDuration->GetText()); + break; } } - if (bType) { + if (bType) szText = Translate("Call"); - } + else if (callDuration == 0) + szText = Translate("Call missed"); else { - if (callDuration == 0) { - szText = Translate("Call missed"); - } - else { - char szTime[100]; - strftime(szTime, sizeof(szTime), "%X", gmtime(&callDuration)); - szText.Format(Translate("Call ended (%s)"), szTime); - } + char szTime[100]; + strftime(szTime, sizeof(szTime), "%X", gmtime(&callDuration)); + szText.Format(Translate("Call ended (%s)"), szTime); } - xmlDestroyNode(xml); - } - else { - szText = INVALID_DATA; } - break; } + break; + case SKYPE_DB_EVENT_TYPE_FILETRANSFER_INFO: { - HXML xml = xmlParseString(ptrW(mir_utf8decodeW((char*)dbei->pBlob)), nullptr, L"files"); - if (xml != nullptr) { - for (int i = 0; i < xmlGetChildCount(xml); i++) { - LONGLONG fileSize = 0; - HXML xmlNode = xmlGetNthChild(xml, L"file", i); - if (xmlNode != nullptr) { - fileSize = _wtol(xmlGetAttrValue(xmlNode, L"size")); - char *fileName = _T2A(xmlGetText(xmlNode)); - if (fileName != nullptr) { - szText.AppendFormat(Translate("File transfer:\n\tFile name: %s \n\tSize: %lld bytes \n"), fileName, fileSize); - } - - } + TiXmlDocument doc; + if (0 != doc.Parse((char*)dbei->pBlob)) + break; + + if (auto *pRoot = doc.FirstChildElement("files")) { + for (auto *it : TiXmlFilter(pRoot, "file")) { + LONGLONG fileSize = it->Int64Attribute("size"); + const char *fileName = it->GetText(); + if (fileName != nullptr) + szText.AppendFormat(Translate("File transfer:\n\tFile name: %s \n\tSize: %lld bytes \n"), fileName, fileSize); } - xmlDestroyNode(xml); - } - else { - szText = INVALID_DATA; } } break; @@ -118,18 +97,13 @@ INT_PTR CSkypeProto::GetEventText(WPARAM pEvent, LPARAM datatype) case SKYPE_DB_EVENT_TYPE_MOJI: case SKYPE_DB_EVENT_TYPE_URIOBJ: { - HXML xml = xmlParseString(ptrW(mir_utf8decodeW((char*)dbei->pBlob)), nullptr, L"URIObject"); - if (xml != nullptr) { - //szText.Append(_T2A(xmlGetText(xml))); - HXML xmlA = xmlGetChildByPath(xml, L"a", 0); - if (xmlA != nullptr) { - szText += T2Utf(xmlGetAttrValue(xmlA, L"href")); - } - xmlDestroyNode(xml); - } - else { - szText = INVALID_DATA; - } + TiXmlDocument doc; + if (0 != doc.Parse((char*)dbei->pBlob)) + break; + + if (auto *pRoot = doc.FirstChildElement("URIObject")) + if (auto *xmlA = pRoot->FirstChildElement("a")) + szText += xmlA->Attribute("href"); } break; diff --git a/protocols/SkypeWeb/src/skype_files.cpp b/protocols/SkypeWeb/src/skype_files.cpp index 1ce9e54808..28a1f1e908 100644 --- a/protocols/SkypeWeb/src/skype_files.cpp +++ b/protocols/SkypeWeb/src/skype_files.cpp @@ -74,22 +74,28 @@ void CSkypeProto::OnASMObjectUploaded(const NETLIBHTTPREQUEST *response, void *a wchar_t *tszFile = wcsrchr(fup->tszFileName, L'\\') + 1; - HXML xml = xmlCreateNode(L"URIObject", nullptr, 0); - xmlAddChild(xml, L"Title", tszFile); - xmlAddChild(xml, L"Description", fup->tszDesc); - HXML xmlA = xmlAddChild(xml, L"a", CMStringW(FORMAT, L"https://login.skype.com/login/sso?go=webclient.xmm&docid=%s", _A2T(fup->uid))); - xmlAddAttr(xmlA, L"href", CMStringW(FORMAT, L"https://login.skype.com/login/sso?go=webclient.xmm&docid=%s", _A2T(fup->uid))); - HXML xmlOrigName = xmlAddChild(xml, L"OriginalName", nullptr); - xmlAddAttr(xmlOrigName, L"v", tszFile); - HXML xmlSize = xmlAddChild(xml, L"FileSize", nullptr); - xmlAddAttr(xmlSize, L"v", CMStringW(FORMAT, L"%d", fup->size)); - - xmlAddAttr(xml, L"Type", L"File.1"); - xmlAddAttr(xml, L"uri", CMStringW(FORMAT, L"https://api.asm.skype.com/v1/objects/%s", _A2T(fup->uid))); - xmlAddAttr(xml, L"url_thumbnail", CMStringW(FORMAT, L"https://api.asm.skype.com/v1/objects/%s/views/thumbnail", _A2T(fup->uid))); - - SendRequest(new SendMessageRequest(Contacts[fup->hContact], time(NULL), T2Utf(ptrW(xmlToString(xml, nullptr))), li, "RichText/Media_GenericFile")); - xmlDestroyNode(xml); + TiXmlDocument doc; + auto *pRoot = doc.NewElement("URIObject"); + doc.InsertEndChild(pRoot); + + auto *pTitle = doc.NewElement("Title"); pTitle->SetText(tszFile); pRoot->InsertEndChild(pTitle); + auto *pDescr = doc.NewElement("Description"); pDescr->SetText(fup->tszDesc.get()); pRoot->InsertEndChild(pDescr); + + auto *xmlA = doc.NewElement("a"); xmlA->SetText(CMStringA(FORMAT, "https://login.skype.com/login/sso?go=webclient.xmm&docid=%s", fup->uid)); + xmlA->SetAttribute("href", CMStringA(FORMAT, "https://login.skype.com/login/sso?go=webclient.xmm&docid=%s", fup->uid)); + pRoot->InsertEndChild(xmlA); + + auto *xmlOrigName = doc.NewElement("OriginalName"); xmlOrigName->SetAttribute("v", tszFile); pRoot->InsertEndChild(xmlOrigName); + auto *xmlSize = doc.NewElement("FileSize"); xmlSize->SetAttribute("v", (int)fup->size); pRoot->InsertEndChild(xmlSize); + + pRoot->SetAttribute("Type", "File.1"); + pRoot->SetAttribute("uri", CMStringA(FORMAT, "https://api.asm.skype.com/v1/objects/%s", fup->uid)); + pRoot->SetAttribute("url_thumbnail", CMStringA(FORMAT, "https://api.asm.skype.com/v1/objects/%s/views/thumbnail", fup->uid)); + + tinyxml2::XMLPrinter printer(0, true); + doc.Print(&printer); + SendRequest(new SendMessageRequest(Contacts[fup->hContact], time(NULL), printer.CStr(), li, "RichText/Media_GenericFile")); + ProtoBroadcastAck(fup->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, (HANDLE)fup); delete fup; } diff --git a/protocols/SkypeWeb/src/skype_utils.cpp b/protocols/SkypeWeb/src/skype_utils.cpp index 723df9a4b1..66f68b297f 100644 --- a/protocols/SkypeWeb/src/skype_utils.cpp +++ b/protocols/SkypeWeb/src/skype_utils.cpp @@ -470,6 +470,9 @@ bool CSkypeProto::IsFileExists(std::wstring path) CMStringA CSkypeProto::ParseUrl(const char *url, const char *token) { + if (url == nullptr) + return CMStringA(); + const char *start = strstr(url, token); if (start == nullptr) return CMStringA(); diff --git a/protocols/SkypeWeb/src/version.h b/protocols/SkypeWeb/src/version.h index 351d653f24..81bd4d2567 100644 --- a/protocols/SkypeWeb/src/version.h +++ b/protocols/SkypeWeb/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 12 #define __RELEASE_NUM 3 -#define __BUILD_NUM 1 +#define __BUILD_NUM 2 #include -- cgit v1.2.3