From 7b2a41081e47ef013f53145ae5d7f6395ff26833 Mon Sep 17 00:00:00 2001 From: Sergey Bolhovskoy Date: Thu, 28 May 2015 10:09:40 +0000 Subject: VKontakte: rework code to JSONNode class upgrade vk api to 5.33 code cleanup version bump git-svn-id: http://svn.miranda-ng.org/main/trunk@13868 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/VKontakte/src/misc.cpp | 288 +++++++++++++++++++-------------------- 1 file changed, 144 insertions(+), 144 deletions(-) (limited to 'protocols/VKontakte/src/misc.cpp') diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp index f8ad79efd1..1da3b4cf92 100644 --- a/protocols/VKontakte/src/misc.cpp +++ b/protocols/VKontakte/src/misc.cpp @@ -17,9 +17,11 @@ along with this program. If not, see . #include "stdafx.h" -static char* szImageTypes[] = { "photo_2560", "photo_1280", "photo_807", "photo_604", "photo_256", "photo_130", "photo_128", "photo_75", "photo_64" }; +static const char* szImageTypes[] = { "photo_2560", "photo_1280", "photo_807", "photo_604", "photo_256", "photo_130", "photo_128", "photo_75", "photo_64" }; -static char* szGiftTypes[] = { "thumb_256", "thumb_96", "thumb_48" }; +static const char* szGiftTypes[] = { "thumb_256", "thumb_96", "thumb_48" }; + +JSONNode nullNode(JSON_NULL); bool IsEmpty(TCHAR *str) { @@ -39,13 +41,6 @@ bool IsEmpty(char *str) return false; } -CMString json_as_CMString(JSONNODE* pNode) -{ - ptrT pString(json_as_string(pNode)); - CMString tszString = pString; - return tszString; -} - LPCSTR findHeader(NETLIBHTTPREQUEST *pReq, LPCSTR szField) { for (int i = 0; i < pReq->headersCount; i++) @@ -306,30 +301,32 @@ bool CVkProto::CheckMid(LIST &lList, int guid) ///////////////////////////////////////////////////////////////////////////////////////// -JSONNODE* CVkProto::CheckJsonResponse(AsyncHttpRequest *pReq, NETLIBHTTPREQUEST *reply, JSONROOT &pRoot) +JSONNode& CVkProto::CheckJsonResponse(AsyncHttpRequest *pReq, NETLIBHTTPREQUEST *reply, JSONNode &root) { - debugLogA("CVkProto::CheckJsonResponse"); - pRoot.Parse(reply->pData); - if (pRoot == NULL) - return NULL; - - if (!CheckJsonResult(pReq, pRoot)) - return NULL; + debugLogA("CVkProto::CheckJsonResponse JSONNode"); + root = JSONNode::parse(reply->pData); - return json_get(pRoot, "response"); + if (!root) + return nullNode; + if (!CheckJsonResult(pReq, root)) + return nullNode; + + return root["response"]; } -bool CVkProto::CheckJsonResult(AsyncHttpRequest *pReq, JSONNODE *pNode) +bool CVkProto::CheckJsonResult(AsyncHttpRequest *pReq, JSONNode &jnNode) { debugLogA("CVkProto::CheckJsonResult"); - if (pNode == NULL) + if (!jnNode) return false; - JSONNODE *pError = json_get(pNode, "error"), *pErrorCode = json_get(pError, "error_code"); - if (pError == NULL || pErrorCode == NULL) + const JSONNode &jnError = jnNode["error"]; + const JSONNode &jnErrorCode = jnError["error_code"]; + + if (!jnError || !jnErrorCode) return true; - int iErrorCode = json_as_int(pErrorCode); + int iErrorCode = jnErrorCode.as_int(); debugLogA("CVkProto::CheckJsonResult %d", iErrorCode); CVkFileUploadParam * fup = (CVkFileUploadParam *)pReq->pUserInfo; CVkSendMsgParam *param = (CVkSendMsgParam*)pReq->pUserInfo; @@ -340,16 +337,16 @@ bool CVkProto::CheckJsonResult(AsyncHttpRequest *pReq, JSONNODE *pNode) case VKERR_ACCESS_DENIED: if (time(NULL) - getDword("LastAccessTokenTime", 0) > 60 * 60 * 24) { debugLogA("CVkProto::CheckJsonResult VKERR_ACCESS_DENIED (AccessToken fail?)"); - setDword("LastAccessTokenTime", (DWORD)time(NULL)); + setDword("LastAccessTokenTime", (DWORD)time(NULL)); delSetting("AccessToken"); ShutdownSession(); return false; } - debugLogA("CVkProto::CheckJsonResult VKERR_ACCESS_DENIED"); + debugLogA("CVkProto::CheckJsonResult VKERR_ACCESS_DENIED"); MsgPopup(NULL, TranslateT("Access denied! Data will not be sent or received."), TranslateT("Error"), true); break; case VKERR_CAPTCHA_NEEDED: - ApplyCaptcha(pReq, pError); + ApplyCaptcha(pReq, jnError); break; case VKERR_COULD_NOT_SAVE_FILE: case VKERR_INVALID_ALBUM_ID: @@ -399,10 +396,9 @@ bool CVkProto::CheckJsonResult(AsyncHttpRequest *pReq, JSONNODE *pNode) void CVkProto::OnReceiveSmth(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq) { - JSONROOT pRoot; - JSONNODE *pResponse = CheckJsonResponse(pReq, reply, pRoot); - ptrT ptszLog(json_as_string(pResponse)); - debugLog(_T("CVkProto::OnReceiveSmth %s"), ptszLog); + JSONNode jnRoot; + const JSONNode &jnResponse = CheckJsonResponse(pReq, reply, jnRoot); + debugLogA("CVkProto::OnReceiveSmth %d", jnResponse.as_int()); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -845,48 +841,49 @@ CMString CVkProto::SpanVKNotificationType(CMString& tszType, VKObjType& vkFeedba return tszRes; } -CMString CVkProto::GetVkPhotoItem(JSONNODE *pPhoto, BBCSupport iBBC) +CMString CVkProto::GetVkPhotoItem(const JSONNode &jnPhoto, BBCSupport iBBC) { CMString tszRes; - if (pPhoto == NULL) + if (!jnPhoto) return tszRes; - ptrT ptszLink, ptszPreviewLink; + CMString tszLink, tszPreviewLink; for (int i = 0; i < SIZEOF(szImageTypes); i++) { - JSONNODE *n = json_get(pPhoto, szImageTypes[i]); - if (n != NULL) { - ptszLink = json_as_string(n); + const JSONNode &n = jnPhoto[szImageTypes[i]]; + if (!n.isnull()) { + tszLink = n.as_mstring(); break; } } switch (m_iIMGBBCSupport) { case imgNo: - ptszPreviewLink = NULL; + tszPreviewLink = _T(""); break; case imgFullSize: - ptszPreviewLink = ptszLink; + tszPreviewLink = tszLink; break; case imgPreview130: case imgPreview604: - ptszPreviewLink = json_as_string(json_get(pPhoto, m_iIMGBBCSupport == imgPreview130 ? "photo_130" : "photo_604")); + tszPreviewLink = jnPhoto[ m_iIMGBBCSupport == imgPreview130 ? "photo_130" : "photo_604"].as_mstring(); break; } - int iWidth = json_as_int(json_get(pPhoto, "width")); - int iHeight = json_as_int(json_get(pPhoto, "height")); + int iWidth = jnPhoto["width"].as_int(); + int iHeight = jnPhoto["height"].as_int(); - tszRes.AppendFormat(_T("%s (%dx%d)"), SetBBCString(TranslateT("Photo"), iBBC, vkbbcUrl, ptszLink).GetBuffer(), iWidth, iHeight); + tszRes.AppendFormat(_T("%s (%dx%d)"), SetBBCString(TranslateT("Photo"), iBBC, vkbbcUrl, tszLink.GetBuffer()).GetBuffer(), iWidth, iHeight); if (m_iIMGBBCSupport) - tszRes.AppendFormat(_T("\n\t[img]%s[/img]"), ptszPreviewLink ? ptszPreviewLink : (ptszLink ? ptszLink : _T(""))); - CMString tszText = json_as_CMString(json_get(pPhoto, "text")); + tszRes.AppendFormat(_T("\n\t[img]%s[/img]"), !tszPreviewLink.IsEmpty() ? tszPreviewLink.GetBuffer() : (!tszLink.IsEmpty() ? tszLink.GetBuffer() : _T(""))); + CMString tszText(jnPhoto["text"].as_mstring()); if (!tszText.IsEmpty()) tszRes += _T("\n") + tszText; return tszRes; } + CMString CVkProto::SetBBCString(TCHAR *ptszString, BBCSupport iBBC, VKBBCType bbcType, TCHAR *tszAddString) { CVKBBCItem bbcItem[] = { @@ -955,160 +952,162 @@ CMString& CVkProto::ClearFormatNick(CMString& tszText) ///////////////////////////////////////////////////////////////////////////////////////// -CMString CVkProto::GetAttachmentDescr(JSONNODE *pAttachments, BBCSupport iBBC) +CMString CVkProto::GetAttachmentDescr(const JSONNode jnAttachments, BBCSupport iBBC) { debugLogA("CVkProto::GetAttachmentDescr"); CMString res; - if (pAttachments == NULL) { + if (!jnAttachments) { debugLogA("CVkProto::GetAttachmentDescr pAttachments == NULL"); return res; } res += SetBBCString(TranslateT("Attachments:"), iBBC, vkbbcB); res.AppendChar('\n'); - JSONNODE *pAttach; - for (int k = 0; (pAttach = json_at(pAttachments, k)) != NULL; k++) { + + for (auto it = jnAttachments.begin(); it != jnAttachments.end(); ++it) { + const JSONNode jnAttach = (*it); + res.AppendChar('\t'); - ptrT ptszType(json_as_string(json_get(pAttach, "type"))); - if (!mir_tstrcmp(ptszType, _T("photo"))) { - JSONNODE *pPhoto = json_get(pAttach, "photo"); - if (pPhoto == NULL) + CMString tszType(jnAttach["type"].as_mstring()); + if (tszType == _T("photo")) { + const JSONNode &jnPhoto = jnAttach["photo"]; + if (!jnPhoto) continue; - res += GetVkPhotoItem(pPhoto, iBBC); + res += GetVkPhotoItem(jnPhoto, iBBC); } - else if (!mir_tstrcmp(ptszType, _T("audio"))) { - JSONNODE *pAudio = json_get(pAttach, "audio"); - if (pAudio == NULL) + else if (tszType ==_T("audio")) { + const JSONNode &jnAudio = jnAttach["audio"]; + if (!jnAudio) continue; - ptrT ptszArtist(json_as_string(json_get(pAudio, "artist"))); - ptrT ptszTitle(json_as_string(json_get(pAudio, "title"))); - ptrT ptszUrl(json_as_string(json_get(pAudio, "url"))); + CMString tszArtist(jnAudio["artist"].as_mstring()); + CMString tszTitle(jnAudio["title"].as_mstring()); + CMString tszUrl(jnAudio["url"].as_mstring()); CMString tszAudio; - tszAudio.AppendFormat(_T("%s - %s"), ptszArtist, ptszTitle); + tszAudio.AppendFormat(_T("%s - %s"), tszArtist.GetBuffer(), tszTitle.GetBuffer()); res.AppendFormat(_T("%s: %s"), - SetBBCString(TranslateT("Audio"), iBBC, vkbbcB).GetBuffer(), - SetBBCString(tszAudio.GetBuffer(), iBBC, vkbbcUrl, ptszUrl).GetBuffer()); + SetBBCString(TranslateT("Audio"), iBBC, vkbbcB).GetBuffer(), + SetBBCString(tszAudio.GetBuffer(), iBBC, vkbbcUrl, tszUrl.GetBuffer()).GetBuffer()); } - else if (!mir_tstrcmp(ptszType, _T("video"))) { - JSONNODE *pVideo = json_get(pAttach, "video"); - if (pVideo == NULL) + else if (tszType ==_T("video")) { + const JSONNode &jnVideo = jnAttach["video"]; + if (jnVideo) continue; - ptrT ptszTitle(json_as_string(json_get(pVideo, "title"))); - int vid = json_as_int(json_get(pVideo, "id")); - int ownerID = json_as_int(json_get(pVideo, "owner_id")); + CMString tszTitle(jnVideo["title"].as_mstring()); + int vid = jnVideo["id"].as_int(); + int ownerID = jnVideo["owner_id"].as_int(); CMString tszUrl; tszUrl.AppendFormat(_T("http://vk.com/video%d_%d"), ownerID, vid); - res.AppendFormat(_T("%s: %s"), - SetBBCString(TranslateT("Video"), iBBC, vkbbcB).GetBuffer(), - SetBBCString(ptszTitle, iBBC, vkbbcUrl, tszUrl.GetBuffer()).GetBuffer()); + res.AppendFormat(_T("%s: %s"), + SetBBCString(TranslateT("Video"), iBBC, vkbbcB).GetBuffer(), + SetBBCString(tszTitle.GetBuffer(), iBBC, vkbbcUrl, tszUrl.GetBuffer()).GetBuffer()); } - else if (!mir_tstrcmp(ptszType, _T("doc"))) { - JSONNODE *pDoc = json_get(pAttach, "doc"); - if (pDoc == NULL) + else if (tszType == _T("doc")) { + const JSONNode &jnDoc = jnAttach["doc"]; + if (!jnDoc) continue; - ptrT ptszTitle(json_as_string(json_get(pDoc, "title"))); - ptrT ptszUrl(json_as_string(json_get(pDoc, "url"))); - res.AppendFormat(_T("%s: %s"), - SetBBCString(TranslateT("Document"), iBBC, vkbbcB).GetBuffer(), - SetBBCString(ptszTitle, iBBC, vkbbcUrl, ptszUrl).GetBuffer()); + CMString tszTitle(jnDoc["title"].as_mstring()); + CMString tszUrl(jnDoc["url"].as_mstring()); + res.AppendFormat(_T("%s: %s"), + SetBBCString(TranslateT("Document"), iBBC, vkbbcB).GetBuffer(), + SetBBCString(tszTitle.GetBuffer(), iBBC, vkbbcUrl, tszUrl.GetBuffer()).GetBuffer()); } - else if (!mir_tstrcmp(ptszType, _T("wall"))) { - JSONNODE *pWall = json_get(pAttach, "wall"); - if (pWall == NULL) + else if (tszType == _T("wall")) { + const JSONNode &jnWall = jnAttach["wall"]; + if (!jnWall) continue; - ptrT ptszText(json_as_string(json_get(pWall, "text"))); - int id = json_as_int(json_get(pWall, "id")); - int fromID = json_as_int(json_get(pWall, "from_id")); + CMString tszText(jnWall["text"].as_mstring()); + int id = jnWall["id"].as_int(); + int fromID = jnWall["from_id"].as_int(); CMString tszUrl; tszUrl.AppendFormat(_T("http://vk.com/wall%d_%d"), fromID, id); - res.AppendFormat(_T("%s: %s"), - SetBBCString(TranslateT("Wall post"), iBBC, vkbbcUrl, tszUrl.GetBuffer()).GetBuffer(), - ptszText ? ptszText : _T(" ")); + res.AppendFormat(_T("%s: %s"), + SetBBCString(TranslateT("Wall post"), iBBC, vkbbcUrl, tszUrl.GetBuffer()).GetBuffer(), + tszText.IsEmpty() ? _T(" ") : tszText.GetBuffer()); - JSONNODE *pSubAttachments = json_get(pWall, "attachments"); - if (pSubAttachments != NULL) { + const JSONNode &jnSubAttachments = jnWall["attachments"]; + if (!jnSubAttachments.isnull()) { debugLogA("CVkProto::GetAttachmentDescr SubAttachments"); - CMString tszAttachmentDescr = GetAttachmentDescr(pSubAttachments, m_iBBCForAttachments); + CMString tszAttachmentDescr = GetAttachmentDescr(jnSubAttachments, m_iBBCForAttachments); tszAttachmentDescr.Replace(_T("\n"), _T("\n\t")); res += _T("\n\t") + tszAttachmentDescr; } } - else if (!mir_tstrcmp(ptszType, _T("sticker"))) { - JSONNODE *pSticker = json_get(pAttach, "sticker"); - if (pSticker == NULL) + else if (tszType == _T("sticker")) { + const JSONNode &jnSticker = jnAttach["sticker"]; + if (!jnSticker) continue; res.Empty(); // sticker is not really an attachment, so we don't want all that heading info if (m_bStikersAsSmyles) { - int id = json_as_int(json_get(pSticker, "id")); + int id = jnSticker["id"].as_int(); res.AppendFormat(_T("[sticker:%d]"), id); } else { - ptrT ptszLink; + CMString tszLink; for (int i = 0; i < SIZEOF(szImageTypes); i++) { - JSONNODE *n = json_get(pSticker, szImageTypes[i]); - if (n != NULL) { - ptszLink = json_as_string(n); + const JSONNode &n = jnSticker[szImageTypes[i]]; + if (!n.isnull()) { + tszLink = n.as_mstring(); break; } } - res.AppendFormat(_T("%s"), ptszLink); + res.AppendFormat(_T("%s"), tszLink); if (m_iIMGBBCSupport) - res.AppendFormat(_T("[img]%s[/img]"), ptszLink); + res.AppendFormat(_T("[img]%s[/img]"), tszLink.GetBuffer()); } } - else if (!mir_tstrcmp(ptszType, _T("link"))) { - JSONNODE *pLink = json_get(pAttach, "link"); - if (pLink == NULL) + else if (tszType == _T("link")) { + const JSONNode &jnLink = jnAttach["link"]; + if (!jnLink) continue; - ptrT ptszUrl(json_as_string(json_get(pLink, "url"))); - ptrT ptszTitle(json_as_string(json_get(pLink, "title"))); - ptrT ptszDescription(json_as_string(json_get(pLink, "description"))); - ptrT ptszImage(json_as_string(json_get(pLink, "image_src"))); + CMString tszUrl(jnLink["url"].as_mstring()); + CMString tszTitle(jnLink["title"].as_mstring()); + CMString tszDescription(jnLink["description"].as_mstring()); + CMString tszImage(jnLink["image_src"].as_mstring()); - res.AppendFormat(_T("%s: %s"), - SetBBCString(TranslateT("Link"), iBBC, vkbbcB).GetBuffer(), - SetBBCString(ptszTitle, iBBC, vkbbcUrl, ptszUrl).GetBuffer()); - if (!IsEmpty(ptszImage)) + res.AppendFormat(_T("%s: %s"), + SetBBCString(TranslateT("Link"), iBBC, vkbbcB).GetBuffer(), + SetBBCString(tszTitle.GetBuffer(), iBBC, vkbbcUrl, tszUrl.GetBuffer()).GetBuffer()); + if (!tszImage.IsEmpty()) if (m_iIMGBBCSupport) - res.AppendFormat(_T("\n\t%s: [img]%s[/img]"), TranslateT("Image"), ptszImage); + res.AppendFormat(_T("\n\t%s: [img]%s[/img]"), TranslateT("Image"), tszImage.GetBuffer()); else - res.AppendFormat(_T("\n\t%s: %s"), TranslateT("Image"), ptszImage); + res.AppendFormat(_T("\n\t%s: %s"), TranslateT("Image"), tszImage.GetBuffer()); - if (ptszDescription) - res.AppendFormat(_T("\n\t%s"), ptszDescription); + if (tszDescription) + res.AppendFormat(_T("\n\t%s"), tszDescription.GetBuffer()); } - else if (!mir_tstrcmp(ptszType, _T("gift"))) { - JSONNODE *pGift = json_get(pAttach, "gift"); - if (pGift == NULL) + else if (tszType == _T("gift")) { + const JSONNode &jnGift = jnAttach["gift"]; + if (!jnGift) continue; - ptrT ptszLink; + CMString tszLink; for (int i = 0; i < SIZEOF(szGiftTypes); i++) { - JSONNODE *n = json_get(pGift, szGiftTypes[i]); - if (n != NULL) { - ptszLink = json_as_string(n); + const JSONNode &n = jnGift[szGiftTypes[i]]; + if (!n.isnull()) { + tszLink = n.as_mstring(); break; } } - if (IsEmpty(ptszLink)) + if (tszLink.IsEmpty()) continue; - res += SetBBCString(TranslateT("Gift"), iBBC, vkbbcUrl, ptszLink); + res += SetBBCString(TranslateT("Gift"), iBBC, vkbbcUrl, tszLink.GetBuffer()); if (m_iIMGBBCSupport) - res.AppendFormat(_T("\n\t[img]%s[/img]"), ptszLink); + res.AppendFormat(_T("\n\t[img]%s[/img]"), tszLink.GetBuffer()); } - else - res.AppendFormat(TranslateT("Unsupported or unknown attachment type: %s"), SetBBCString(ptszType, iBBC, vkbbcB).GetBuffer()); + else + res.AppendFormat(TranslateT("Unsupported or unknown attachment type: %s"), SetBBCString(tszType.GetBuffer(), iBBC, vkbbcB).GetBuffer()); res.AppendChar('\n'); } @@ -1116,50 +1115,51 @@ CMString CVkProto::GetAttachmentDescr(JSONNODE *pAttachments, BBCSupport iBBC) return res; } -CMString CVkProto::GetFwdMessages(JSONNODE *pMessages, BBCSupport iBBC) +CMString CVkProto::GetFwdMessages(const JSONNode &jnMessages, BBCSupport iBBC) { CMString res; debugLogA("CVkProto::GetFwdMessages"); - if (pMessages == NULL) { + if (!jnMessages) { debugLogA("CVkProto::GetFwdMessages pMessages == NULL"); return res; } + + for (auto it = jnMessages.begin(); it != jnMessages.end(); --it) { + const JSONNode &jnMsg = (*it); - JSONNODE *pMsg; - for (int i = 0; (pMsg = json_at(pMessages, i)) != NULL; i++) { - int uid = json_as_int(json_get(pMsg, "user_id")); + int uid = jnMsg["user_id"].as_int(); MCONTACT hContact = FindUser(uid); CMString tszNick; if (hContact) tszNick = ptrT(db_get_tsa(hContact, m_szModuleName, "Nick")); if (tszNick.IsEmpty()) tszNick = TranslateT("(Unknown contact)"); - + CMString tszUrl = _T("https://vk.com/id"); tszUrl.AppendFormat(_T("%d"), uid); - time_t datetime = (time_t)json_as_int(json_get(pMsg, "date")); + time_t datetime = (time_t)jnMsg["date"].as_int(); TCHAR ttime[64]; _locale_t locale = _create_locale(LC_ALL, ""); _tcsftime_l(ttime, SIZEOF(ttime), _T("%x %X"), localtime(&datetime), locale); _free_locale(locale); - CMString tszBody = json_as_CMString(json_get(pMsg, "body")); + CMString tszBody(jnMsg["body"].as_mstring()); - JSONNODE *pFwdMessages = json_get(pMsg, "fwd_messages"); - if (pFwdMessages != NULL) { - CMString tszFwdMessages = GetFwdMessages(pFwdMessages, m_iBBCForAttachments); + const JSONNode &jnFwdMessages = jnMsg["fwd_messages"]; + if (!jnFwdMessages) { + CMString tszFwdMessages = GetFwdMessages(jnFwdMessages, m_iBBCForAttachments); if (!tszBody.IsEmpty()) tszFwdMessages = _T("\n") + tszFwdMessages; tszBody += tszFwdMessages; } - - JSONNODE *pAttachments = json_get(pMsg, "attachments"); - if (pAttachments != NULL) { - CMString tszAttachmentDescr = GetAttachmentDescr(pAttachments, m_iBBCForAttachments); + + const JSONNode &jnAttachments = jnMsg["attachments"]; + if (!jnAttachments) { + CMString tszAttachmentDescr = GetAttachmentDescr(jnAttachments, m_iBBCForAttachments); if (!tszBody.IsEmpty()) tszAttachmentDescr = _T("\n") + tszAttachmentDescr; - tszBody += tszAttachmentDescr; + tszBody += tszAttachmentDescr; } tszBody.Replace(_T("\n"), _T("\n\t")); -- cgit v1.2.3