summaryrefslogtreecommitdiff
path: root/protocols
diff options
context:
space:
mode:
authorElzorFox <elzorfox@ya.ru>2017-01-24 15:41:25 +0500
committerElzorFox <elzorfox@ya.ru>2017-01-24 15:41:25 +0500
commit0479fc77ff072b34b01f17d51daf7569a80cf54c (patch)
tree7093f3d3b94aab41e2fcb9d2c967ebfdc8aedc47 /protocols
parent0960c4ae216d12ad03a8bff4071ff55cb0d48129 (diff)
VKontakte:
set low priority for loading history requests rework loading groups to clist add ‘Load last messages when message window open and local history is empty’ option (default true) version bump
Diffstat (limited to 'protocols')
-rw-r--r--protocols/VKontakte/res/resource.rc20
-rw-r--r--protocols/VKontakte/src/misc.cpp111
-rw-r--r--protocols/VKontakte/src/resource.h3
-rw-r--r--protocols/VKontakte/src/version.h2
-rw-r--r--protocols/VKontakte/src/vk_dialogs.cpp20
-rw-r--r--protocols/VKontakte/src/vk_dialogs.h2
-rw-r--r--protocols/VKontakte/src/vk_history.cpp24
-rw-r--r--protocols/VKontakte/src/vk_messages.cpp65
-rw-r--r--protocols/VKontakte/src/vk_options.cpp38
-rw-r--r--protocols/VKontakte/src/vk_options.h11
-rw-r--r--protocols/VKontakte/src/vk_struct.cpp9
-rw-r--r--protocols/VKontakte/src/vk_struct.h19
-rw-r--r--protocols/VKontakte/src/vk_thread.cpp91
13 files changed, 212 insertions, 203 deletions
diff --git a/protocols/VKontakte/res/resource.rc b/protocols/VKontakte/res/resource.rc
index 5badf44389..04052a8f97 100644
--- a/protocols/VKontakte/res/resource.rc
+++ b/protocols/VKontakte/res/resource.rc
@@ -111,7 +111,7 @@ BEGIN
VERTGUIDE, 192
VERTGUIDE, 288
TOPMARGIN, 7
- BOTTOMMARGIN, 177
+ BOTTOMMARGIN, 182
END
IDD_INVITE, DIALOG
@@ -286,31 +286,33 @@ BEGIN
EDITTEXT IDC_RET_CHAT_MES,134,208,157,12,ES_AUTOHSCROLL
END
-IDD_OPT_MAIN DIALOGEX 0, 0, 304, 182
+IDD_OPT_MAIN DIALOGEX 0, 0, 304, 187
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
- GROUPBOX "Login settings",IDC_STATIC,4,8,293,50
+ GROUPBOX "Login settings",IDC_STATIC,4,8,293,49
RTEXT "E-mail or phone number:",IDC_STATIC,12,17,150,10
EDITTEXT IDC_LOGIN,167,16,121,12,ES_AUTOHSCROLL
RTEXT "Password:",IDC_STATIC,12,30,150,10
EDITTEXT IDC_PASSWORD,167,30,121,12,ES_PASSWORD | ES_AUTOHSCROLL
CONTROL "Open VKontakte site",IDC_URL,"Hyperlink",WS_TABSTOP,59,44,174,11
- GROUPBOX "Local settings",IDC_STATIC,4,59,293,115
+ GROUPBOX "Local settings",IDC_STATIC,4,58,293,122
RTEXT "Contact list group:",IDC_STATIC,12,71,150,8
EDITTEXT IDC_GROUPNAME,167,69,121,12,ES_AUTOHSCROLL
RTEXT "Language for names and titles:",IDC_STATIC,12,86,148,10
COMBOBOX IDC_COMBO_LANGUAGE,167,84,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
- CONTROL "Server-side delivery confirmation",IDC_DELIVERY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,157,278,10
- CONTROL "Use local time for received messages",IDC_USE_LOCAL_TIME,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,137,278,10
- CONTROL "Load only friends to local contact list",IDC_LOADONLYFRIENDS,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,147,278,10
RTEXT "Mark message as read:",IDC_STATIC,12,101,150,12,SS_CENTERIMAGE
COMBOBOX IDC_COMBO_MARKASREAD,167,101,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
RTEXT "Sync history on protocol online:",IDC_STATIC,12,117,150,12,SS_CENTERIMAGE
COMBOBOX IDC_COMBO_SYNCHISTORY,167,117,121,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Load last messages when message window open and local history is empty",IDC_LASTHISTORYLOAD,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,133,278,10
+ CONTROL "Use local time for received messages",IDC_USE_LOCAL_TIME,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,143,278,10
+ CONTROL "Load only friends to local contact list",IDC_LOADONLYFRIENDS,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,153,278,10
+ CONTROL "Server-side delivery confirmation",IDC_DELIVERY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,163,278,10
END
IDD_CAPTCHAFORM DIALOGEX 0, 0, 258, 224
diff --git a/protocols/VKontakte/src/misc.cpp b/protocols/VKontakte/src/misc.cpp
index fb518e1420..885f00f9a1 100644
--- a/protocols/VKontakte/src/misc.cpp
+++ b/protocols/VKontakte/src/misc.cpp
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdafx.h"
-static const char *szImageTypes[] = { "photo_2560", "photo_1280", "photo_807", "photo_604", "photo_256", "photo_130", "photo_128", "photo_75", "photo_64" , "preview"};
+static const char *szImageTypes[] = { "photo_2560", "photo_1280", "photo_807", "photo_604", "photo_256", "photo_130", "photo_128", "photo_75", "photo_64" , "preview" };
static const char *szGiftTypes[] = { "thumb_256", "thumb_96", "thumb_48" };
@@ -102,14 +102,14 @@ char* ExpUrlEncode(const char *szUrl, bool strict)
const BYTE *s;
int outputLen;
- for (outputLen = 0, s = (const BYTE*)szUrl; *s; s++)
+ for (outputLen = 0, s = (const BYTE*)szUrl; *s; s++)
if ((*s & 0x80 && !strict) || // UTF-8 multibyte
('0' <= *s && *s <= '9') || //0-9
('A' <= *s && *s <= 'Z') || //ABC...XYZ
('a' <= *s && *s <= 'z') || //abc...xyz
- *s == '~' || *s == '-' || *s == '_' || *s == '.' || *s == ' ')
+ *s == '~' || *s == '-' || *s == '_' || *s == '.' || *s == ' ')
outputLen++;
- else
+ else
outputLen += 3;
char *szOutput = (char*)mir_alloc(outputLen + 1);
@@ -122,9 +122,9 @@ char* ExpUrlEncode(const char *szUrl, bool strict)
('0' <= *s && *s <= '9') || //0-9
('A' <= *s && *s <= 'Z') || //ABC...XYZ
('a' <= *s && *s <= 'z') || //abc...xyz
- *s == '~' || *s == '-' || *s == '_' || *s == '.')
+ *s == '~' || *s == '-' || *s == '_' || *s == '.')
*d++ = *s;
- else if (*s == ' ')
+ else if (*s == ' ')
*d++ = '+';
else {
*d++ = '%';
@@ -132,8 +132,8 @@ char* ExpUrlEncode(const char *szUrl, bool strict)
*d++ = szHexDigits[*s & 0xF];
}
- *d = '\0';
- return szOutput;
+ *d = '\0';
+ return szOutput;
}
@@ -216,7 +216,7 @@ MCONTACT CVkProto::FindChat(LONG dwUserid)
return NULL;
}
-bool CVkProto::IsGroupUser(MCONTACT hContact)
+bool CVkProto::IsGroupUser(MCONTACT hContact)
{
if (getBool(hContact, "IsGroup", false))
return true;
@@ -374,10 +374,10 @@ static CMStringA getAttr(char *szSrc, LPCSTR szAttrName)
p1 += 2;
char *p2 = strchr(p1, '\"');
*pEnd = '>';
- if (p2 == NULL)
+ if (p2 == NULL)
return "";
- return CMStringA(p1, (int)(p2-p1));
+ return CMStringA(p1, (int)(p2 - p1));
}
bool CVkProto::AutoFillForm(char *pBody, CMStringA &szAction, CMStringA& szResult)
@@ -386,11 +386,11 @@ bool CVkProto::AutoFillForm(char *pBody, CMStringA &szAction, CMStringA& szResul
szResult.Empty();
char *pFormBeg = strstr(pBody, "<form ");
- if (pFormBeg == NULL)
+ if (pFormBeg == NULL)
return false;
char *pFormEnd = strstr(pFormBeg, "</form>");
- if (pFormEnd == NULL)
+ if (pFormEnd == NULL)
return false;
*pFormEnd = 0;
@@ -400,7 +400,7 @@ bool CVkProto::AutoFillForm(char *pBody, CMStringA &szAction, CMStringA& szResul
CMStringA result;
char *pFieldBeg = pFormBeg;
while (true) {
- if ((pFieldBeg = strstr(pFieldBeg+1, "<input ")) == NULL)
+ if ((pFieldBeg = strstr(pFieldBeg + 1, "<input ")) == NULL)
break;
CMStringA type = getAttr(pFieldBeg, "type");
@@ -428,7 +428,7 @@ bool CVkProto::AutoFillForm(char *pBody, CMStringA &szAction, CMStringA& szResul
MessageBoxW(NULL, wszTitle, TranslateT("Attention!"), MB_ICONWARNING | MB_OK);
}
}
-
+
value = RunConfirmationCode(wszTitle);
}
@@ -496,7 +496,7 @@ void CVkProto::GrabCookies(NETLIBHTTPREQUEST *nhr)
if (!szCookieName.IsEmpty() && !szDomain.IsEmpty()) {
int k;
- for (k=0; k < m_cookies.getCount(); k++) {
+ for (k = 0; k < m_cookies.getCount(); k++) {
if (m_cookies[k].m_name == szCookieName) {
m_cookies[k].m_value = szCookieVal;
break;
@@ -513,7 +513,7 @@ void CVkProto::ApplyCookies(AsyncHttpRequest *pReq)
debugLogA("CVkProto::ApplyCookies");
CMStringA szCookie;
- for (int i=0; i < m_cookies.getCount(); i++) {
+ for (int i = 0; i < m_cookies.getCount(); i++) {
if (!strstr(pReq->m_szUrl, m_cookies[i].m_domain))
continue;
@@ -538,7 +538,7 @@ void __cdecl CVkProto::DBAddAuthRequestThread(void *p)
for (int i = 0; i < MAX_RETRIES && IsEmpty(ptrW(db_get_wsa(param->hContact, m_szModuleName, "Nick"))); i++) {
Sleep(1500);
-
+
if (!IsOnline())
return;
}
@@ -638,7 +638,7 @@ void CVkProto::SetMirVer(MCONTACT hContact, int platform)
case 3584591: // Windows 8.x
case 6:
MirVer = L"VKontakte (Windows)";
- break;
+ break;
case 7:
MirVer = L"VKontakte (Website)";
break;
@@ -678,6 +678,13 @@ int CVkProto::OnProcessSrmmEvent(WPARAM, LPARAM lParam)
if (event->uType == MSG_WINDOW_EVT_OPENING && !ServiceExists(MS_MESSAGESTATE_UPDATE))
SetSrmmReadStatus(event->hContact);
+ if (event->uType == MSG_WINDOW_EVT_OPENING && m_vkOptions.bLoadLastMessageOnMsgWindowsOpen
+ && getDword(event->hContact, "lastmsgid", -1) == -1 && !isChatRoom(event->hContact)) {
+ m_bNotifyForEndLoadingHistory = false;
+ GetServerHistory(event->hContact, 0, 100, 0, 0, true);
+ }
+
+
return 0;
}
@@ -699,7 +706,7 @@ void CVkProto::SetSrmmReadStatus(MCONTACT hContact)
CallService(MS_MSG_SETSTATUSTEXT, (WPARAM)hContact, (LPARAM)&st);
}
-void CVkProto::MarkDialogAsRead(MCONTACT hContact)
+void CVkProto::MarkDialogAsRead(MCONTACT hContact)
{
debugLogA("CVkProto::MarkDialogAsRead");
if (!IsOnline())
@@ -711,7 +718,7 @@ void CVkProto::MarkDialogAsRead(MCONTACT hContact)
MEVENT hDBEvent = NULL;
MCONTACT hMContact = db_mc_tryMeta(hContact);
- while ((hDBEvent = db_event_firstUnread(hContact)) != NULL)
+ while ((hDBEvent = db_event_firstUnread(hContact)) != NULL)
{
DBEVENTINFO dbei = {};
if (!db_event_get(hDBEvent, &dbei) && !mir_strcmp(m_szModuleName, dbei.szModule))
@@ -741,7 +748,7 @@ char* CVkProto::GetStickerId(const char *Msg, int &stickerid)
CMStringA szMsg(Msg, int(mir_strlen(Msg) - mir_strlen(tmpMsg)));
szMsg.Append(&tmpMsg[retLen]);
retMsg = mir_strdup(szMsg.Trim());
- }
+ }
}
return retMsg;
@@ -780,7 +787,7 @@ CMStringA CVkProto::GetAttachmentsFromMessage(const char *Msg)
for (int i = 0; i < _countof(szVKLinkParam) && !pos2; i++) {
pos2 = strstr(pos, szVKLinkParam[i]);
- if (pos2 && (!nextpos || pos2 < nextpos))
+ if (pos2 && (!nextpos || pos2 < nextpos))
pos = pos2 + mir_strlen(szVKLinkParam[i]);
}
@@ -796,13 +803,13 @@ CMStringA CVkProto::GetAttachmentsFromMessage(const char *Msg)
if (iRes == 2) {
CMStringA szAttachment(FORMAT, szAttachmentMasks[i], iOwner, iId);
CMStringA szAttachment2;
-
+
if (nextpos)
szAttachment2 = GetAttachmentsFromMessage(pos + szAttachment.GetLength());
-
+
if (!szAttachment2.IsEmpty())
szAttachment += "," + szAttachment2;
-
+
return szAttachment;
}
else if (iRes == 1)
@@ -825,12 +832,12 @@ int CVkProto::OnDbSettingChanged(WPARAM hContact, LPARAM lParam)
szListeningTo += "Enabled";
if (!strcmp(cws->szSetting, szListeningTo)) {
MusicSendMetod iOldMusicSendMetod = (MusicSendMetod)getByte("OldMusicSendMetod", sendBroadcastAndStatus);
-
+
if (cws->value.bVal == 0)
setByte("OldMusicSendMetod", m_vkOptions.iMusicSendMetod);
else
db_unset(0, m_szModuleName, "OldMusicSendMetod");
-
+
m_vkOptions.iMusicSendMetod = cws->value.bVal == 0 ? sendNone : iOldMusicSendMetod;
setByte("MusicSendMetod", m_vkOptions.iMusicSendMetod);
}
@@ -866,13 +873,13 @@ CMStringW CVkProto::SpanVKNotificationType(CMStringW& wszType, VKObjType& vkFeed
{ L"like_photo", vkPhoto, vkUsers, TranslateT("liked your photo") },
{ L"like_video", vkVideo, vkUsers, TranslateT("liked your video") },
{ L"like_comment_photo", vkComment, vkUsers, TranslateT("liked your comment to photo") },
- { L"like_comment_video", vkComment, vkUsers, TranslateT("liked your comment to video" ) },
+ { L"like_comment_video", vkComment, vkUsers, TranslateT("liked your comment to video") },
{ L"like_comment_topic", vkComment, vkUsers, TranslateT("liked your comment to topic") },
{ L"copy_post", vkPost, vkCopy, TranslateT("shared your post") },
{ L"copy_photo", vkPhoto, vkCopy, TranslateT("shared your photo") },
{ L"copy_video", vkVideo, vkCopy, TranslateT("shared your video") },
{ L"mention_comments", vkPost, vkComment, L"mentioned you in comment" },
- { L"mention_comment_photo", vkPhoto, vkComment, L"mentioned you in comment to photo" },
+ { L"mention_comment_photo", vkPhoto, vkComment, L"mentioned you in comment to photo" },
{ L"mention_comment_video", vkVideo, vkComment, L"mentioned you in comment to video" }
};
@@ -1012,7 +1019,7 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport
res += SetBBCString(TranslateT("Attachments:"), iBBC, vkbbcB);
res.AppendChar('\n');
-
+
for (auto it = jnAttachments.begin(); it != jnAttachments.end(); ++it) {
const JSONNode &jnAttach = (*it);
@@ -1025,7 +1032,7 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport
res += GetVkPhotoItem(jnPhoto, iBBC);
}
- else if (wszType ==L"audio") {
+ else if (wszType == L"audio") {
const JSONNode &jnAudio = jnAttach["audio"];
if (!jnAudio)
continue;
@@ -1043,7 +1050,7 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport
SetBBCString(TranslateT("Audio"), iBBC, vkbbcB),
SetBBCString(wszAudio, iBBC, vkbbcUrl, wszUrl));
}
- else if (wszType ==L"video") {
+ else if (wszType == L"video") {
const JSONNode &jnVideo = jnAttach["video"];
if (!jnVideo)
continue;
@@ -1079,7 +1086,7 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport
res.AppendFormat(L"%s: %s",
SetBBCString(TranslateT("Wall post"), iBBC, vkbbcUrl, wszUrl),
wszText.IsEmpty() ? L" " : wszText);
-
+
const JSONNode &jnCopyHystory = jnWall["copy_history"];
for (auto aCHit = jnCopyHystory.begin(); aCHit != jnCopyHystory.end(); ++aCHit) {
const JSONNode &jnCopyHystoryItem = (*aCHit);
@@ -1148,10 +1155,10 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport
res.AppendFormat(L"%s: %s",
SetBBCString(TranslateT("Link"), iBBC, vkbbcB),
SetBBCString(wszTitle, iBBC, vkbbcUrl, wszUrl));
-
+
if (!wszCaption.IsEmpty())
res.AppendFormat(L"\n\t%s", SetBBCString(wszCaption, iBBC, vkbbcI));
-
+
if (jnLink["photo"])
res.AppendFormat(L"\n\t%s", GetVkPhotoItem(jnLink["photo"], iBBC));
@@ -1177,13 +1184,13 @@ CMStringW CVkProto::GetAttachmentDescr(const JSONNode &jnAttachments, BBCSupport
SetBBCString(wszTitle, iBBC, vkbbcUrl, wszUrl));
if (!wszPhoto.IsEmpty())
- res.AppendFormat(L"\n\t%s: %s",
- SetBBCString(TranslateT("Photo"), iBBC, vkbbcB),
- SetBBCString(wszPhoto, iBBC, vkbbcImg));
-
+ res.AppendFormat(L"\n\t%s: %s",
+ SetBBCString(TranslateT("Photo"), iBBC, vkbbcB),
+ SetBBCString(wszPhoto, iBBC, vkbbcImg));
+
if (jnMarket["price"] && jnMarket["price"]["text"])
- res.AppendFormat(L"\n\t%s: %s",
- SetBBCString(TranslateT("Price"), iBBC, vkbbcB),
+ res.AppendFormat(L"\n\t%s: %s",
+ SetBBCString(TranslateT("Price"), iBBC, vkbbcB),
jnMarket["price"]["text"].as_mstring());
if (!wszDescription.IsEmpty())
@@ -1235,7 +1242,7 @@ CMStringW CVkProto::GetFwdMessages(const JSONNode &jnMessages, const JSONNode &j
int iUserId = jnUser["id"].as_int();
CMStringW wszNick(FORMAT, L"%s %s", jnUser["first_name"].as_mstring(), jnUser["last_name"].as_mstring());
CMStringW wszLink(FORMAT, L"https://vk.com/id%d", iUserId);
-
+
CVkUserInfo *vkUser = new CVkUserInfo(jnUser["id"].as_int(), false, wszNick, wszLink, FindUser(iUserId));
vkUsers.insert(vkUser);
}
@@ -1251,13 +1258,13 @@ CMStringW CVkProto::GetFwdMessages(const JSONNode &jnMessages, const JSONNode &j
if (vkUser) {
wszNick = vkUser->m_wszUserNick;
wszUrl = vkUser->m_wszLink;
- }
+ }
else {
MCONTACT hContact = FindUser(uid);
if (hContact || uid == m_msgId)
wszNick = ptrW(db_get_wsa(hContact, m_szModuleName, "Nick"));
- else
- wszNick = TranslateT("(Unknown contact)");
+ else
+ wszNick = TranslateT("(Unknown contact)");
wszUrl.AppendFormat(L"https://vk.com/id%d", uid);
}
@@ -1320,7 +1327,7 @@ void CVkProto::SetInvisible(MCONTACT hContact)
setDword(hContact, "InvisibleTS", (DWORD)now);
}
-CMStringW CVkProto::RemoveBBC(CMStringW& wszSrc)
+CMStringW CVkProto::RemoveBBC(CMStringW& wszSrc)
{
static const wchar_t *wszSimpleBBCodes[][2] = {
{ L"[b]", L"[/b]" },
@@ -1336,14 +1343,14 @@ CMStringW CVkProto::RemoveBBC(CMStringW& wszSrc)
{ L"[color=", L"[/color]" },
};
- CMStringW wszRes(wszSrc);
- CMStringW wszLow(wszSrc);
+ CMStringW wszRes(wszSrc);
+ CMStringW wszLow(wszSrc);
wszLow.MakeLower();
for (int i = 0; i < _countof(wszSimpleBBCodes); i++) {
CMStringW wszOpenTag(wszSimpleBBCodes[i][0]);
CMStringW wszCloseTag(wszSimpleBBCodes[i][1]);
-
+
int lenOpen = wszOpenTag.GetLength();
int lenClose = wszCloseTag.GetLength();
@@ -1380,7 +1387,7 @@ CMStringW CVkProto::RemoveBBC(CMStringW& wszSrc)
while (true) {
if ((posOpen = wszLow.Find(wszOpenTag, posOpen)) < 0)
break;
-
+
if ((posOpen2 = wszLow.Find(L"]", posOpen + lenOpen)) < 0)
break;
@@ -1407,7 +1414,7 @@ void CVkProto::ShowCaptchaInBrowser(HBITMAP hBitmap)
return;
CMStringW wszHTMLPath(FORMAT, L"%s\\miranda_captcha.html", wszTempDir);
-
+
FILE *pFile = _wfopen(wszHTMLPath, L"w");
if (pFile == NULL)
return;
diff --git a/protocols/VKontakte/src/resource.h b/protocols/VKontakte/src/resource.h
index edfaff5ac3..15ac29bc9c 100644
--- a/protocols/VKontakte/src/resource.h
+++ b/protocols/VKontakte/src/resource.h
@@ -1,6 +1,6 @@
//{{NO_DEPENDENCIES}}
// Âêëþ÷àåìûé ôàéë, ñîçäàííûé â Microsoft Visual C++.
-// Èñïîëüçóåòñÿ d:\svn\protocols\VKontakte\res\resource.rc
+// Èñïîëüçóåòñÿ d:\github\miranda-ng\protocols\VKontakte\res\resource.rc
//
#define IDOPENBROWSER 3
#define IDD_ACCMGRUI 101
@@ -41,6 +41,7 @@
#define IDC_CLIST 1013
#define IDC_HIDECHATS 1014
#define IDC_CONTACT 1015
+#define IDC_LASTHISTORYLOAD 1019
#define IDC_LOADONLYFRIENDS 1020
#define IDC_MESASUREAD 1025
#define IDC_SYNC_MSG_STATUS 1026
diff --git a/protocols/VKontakte/src/version.h b/protocols/VKontakte/src/version.h
index 6c45de27ca..7b75abe875 100644
--- a/protocols/VKontakte/src/version.h
+++ b/protocols/VKontakte/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 1
#define __RELEASE_NUM 2
-#define __BUILD_NUM 11
+#define __BUILD_NUM 12
#include <stdver.h>
diff --git a/protocols/VKontakte/src/vk_dialogs.cpp b/protocols/VKontakte/src/vk_dialogs.cpp
index 8f8420e827..64b0b5927c 100644
--- a/protocols/VKontakte/src/vk_dialogs.cpp
+++ b/protocols/VKontakte/src/vk_dialogs.cpp
@@ -119,10 +119,10 @@ CVkWallPostForm::CVkWallPostForm(CVkProto *proto, WALLPOST_FORM_PARAMS *param) :
void CVkWallPostForm::OnInitDialog()
{
Window_SetIcon_IcoLib(m_hwnd, GetIconHandle(IDI_WALL));
-
+
CMStringW wszTitle(FORMAT, TranslateT("Wall message for %s"), m_param->pwszNick);
SetCaption(wszTitle);
-
+
m_btnShare.Disable();
}
@@ -148,9 +148,9 @@ void CVkWallPostForm::On_edtValue_Change(CCtrlEdit*)
////////////////////////////////// IDD_INVITE /////////////////////////////////////////////
CVkInviteChatForm::CVkInviteChatForm(CVkProto *proto) :
- CVkDlgBase(proto, IDD_INVITE, false),
- m_btnOk(this, IDOK),
- m_cbxCombo(this, IDC_CONTACT),
+ CVkDlgBase(proto, IDD_INVITE, false),
+ m_btnOk(this, IDOK),
+ m_cbxCombo(this, IDC_CONTACT),
m_hContact(NULL)
{
m_btnOk.OnClick = Callback(this, &CVkInviteChatForm::btnOk_OnOk);
@@ -162,7 +162,7 @@ void CVkInviteChatForm::OnInitDialog()
if (!m_proto->isChatRoom(hContact)) {
wchar_t *pwszNick = pcli->pfnGetContactDisplayName(hContact, 0);
m_cbxCombo.AddString(pwszNick, hContact);
- }
+ }
}
}
@@ -175,9 +175,9 @@ void CVkInviteChatForm::btnOk_OnOk(CCtrlButton*)
////////////////////////////////// IDD_GC_CREATE //////////////////////////////////////////
CVkGCCreateForm::CVkGCCreateForm(CVkProto *proto) :
- CVkDlgBase(proto, IDD_GC_CREATE, false),
- m_btnOk(this, IDOK),
- m_clCList(this, IDC_CLIST),
+ CVkDlgBase(proto, IDD_GC_CREATE, false),
+ m_btnOk(this, IDOK),
+ m_clCList(this, IDC_CLIST),
m_edtTitle(this, IDC_TITLE)
{
m_btnOk.OnClick = Callback(this, &CVkGCCreateForm::btnOk_OnOk);
@@ -186,7 +186,7 @@ CVkGCCreateForm::CVkGCCreateForm(CVkProto *proto) :
void CVkGCCreateForm::OnInitDialog()
{
- SetWindowLongPtr(m_clCList.GetHwnd(), GWL_STYLE, GetWindowLongPtr(m_clCList.GetHwnd(), GWL_STYLE)
+ SetWindowLongPtr(m_clCList.GetHwnd(), GWL_STYLE, GetWindowLongPtr(m_clCList.GetHwnd(), GWL_STYLE)
| CLS_CHECKBOXES | CLS_HIDEEMPTYGROUPS | CLS_USEGROUPS | CLS_GREYALTERNATE);
m_clCList.SendMsg(CLM_SETEXSTYLE, CLS_EX_DISABLEDRAGDROP | CLS_EX_TRACKSELECT, 0);
diff --git a/protocols/VKontakte/src/vk_dialogs.h b/protocols/VKontakte/src/vk_dialogs.h
index c6a6bc26d1..993e50ce3e 100644
--- a/protocols/VKontakte/src/vk_dialogs.h
+++ b/protocols/VKontakte/src/vk_dialogs.h
@@ -45,7 +45,7 @@ public:
void On_btnOpenInBrowser_Click(CCtrlButton*);
void On_btnOk_Click(CCtrlButton*);
void On_edtValue_Change(CCtrlEdit*);
-
+
};
////////////////////////////////// IDD_WALLPOST ///////////////////////////////////////////
diff --git a/protocols/VKontakte/src/vk_history.cpp b/protocols/VKontakte/src/vk_history.cpp
index 4f4bfb15fc..8883238694 100644
--- a/protocols/VKontakte/src/vk_history.cpp
+++ b/protocols/VKontakte/src/vk_history.cpp
@@ -60,7 +60,7 @@ INT_PTR __cdecl CVkProto::SvcGetAllServerHistory(WPARAM, LPARAM)
if (userID == VK_INVALID_USER || userID == VK_FEED_USER)
continue;
-
+
MEVENT hDBEvent = db_event_first(hContact);
while (hDBEvent) {
MEVENT hDBEventNext = db_event_next(hContact, hDBEvent);
@@ -74,10 +74,10 @@ INT_PTR __cdecl CVkProto::SvcGetAllServerHistory(WPARAM, LPARAM)
m_bNotifyForEndLoadingHistoryAllContact = m_bNotifyForEndLoadingHistory = true;
debugLogA("CVkProto::SvcGetAllServerHistory for ID=%d m_iLoadHistoryTask=%d", userID, m_iLoadHistoryTask);
}
-
+
db_unset(hContact, m_szModuleName, "lastmsgid");
GetServerHistory(hContact, 0, MAXHISTORYMIDSPERONE, 0, 0);
-
+
}
return 1;
@@ -132,9 +132,9 @@ void CVkProto::GetServerHistory(MCONTACT hContact, int iOffset, int iCount, int
"var Jdx=0;var CFMsgs=parseInt(FMsgs[Idx].length);while(Jdx<CFMsgs){"
"Uids.unshift(FMsgs[Idx][Jdx].user_id);Jdx=Jdx+1;};Idx=Idx+1;};"
"var FUsers=API.users.get({\"user_ids\":Uids,\"name_case\":\"gen\"});"
- "return{\"count\":index,\"datetime\":iTime,\"items\":ret,\"fwd_users\":FUsers,\"once\":%d,\"rcount\":iReqCount};",
+ "return{\"count\":index,\"datetime\":iTime,\"items\":ret,\"fwd_users\":FUsers,\"once\":%d,\"rcount\":iReqCount};",
iOffset, iCount, userID, iTime, iLastMsgId, (int)once);
- Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/execute.json", true, &CVkProto::OnReceiveHistoryMessages)
+ Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/execute.json", true, &CVkProto::OnReceiveHistoryMessages, AsyncHttpRequest::rpLow)
<< CHAR_PARAM("code", code))->pUserInfo = new CVkSendMsgParam(hContact, iLastMsgId, iOffset);
}
@@ -185,9 +185,9 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque
if (!jnResponse) {
if (!pReq->bNeedsRestart || m_bTerminated) {
mir_cslock lck(m_csLoadHistoryTask);
- if (m_iLoadHistoryTask > 0)
+ if (m_iLoadHistoryTask > 0)
m_iLoadHistoryTask--;
-
+
ptrW pwszNick(db_get_wsa(param->hContact, m_szModuleName, "Nick"));
CMStringW str(FORMAT, TranslateT("Error loading message history for %s from server."), pwszNick);
@@ -205,7 +205,7 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque
return;
}
- int iTime = jnResponse["datetime"].as_int();
+ int iTime = jnResponse["datetime"].as_int();
const JSONNode &jnMsgs = jnResponse["items"];
const JSONNode &jnFUsers = jnResponse["fwd_users"];
@@ -217,7 +217,7 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque
const JSONNode &jnMsg = (*it);
int mid = jnMsg["id"].as_int();
- if (iLastMsgId < mid)
+ if (iLastMsgId < mid)
iLastMsgId = mid;
char szMid[40];
@@ -226,8 +226,8 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque
CMStringW wszBody(jnMsg["body"].as_mstring());
int datetime = jnMsg["date"].as_int();
int isOut = jnMsg["out"].as_int();
- int isRead = jnMsg["read_state"].as_int();
- int uid = jnMsg["user_id"].as_int();
+ int isRead = jnMsg["read_state"].as_int();
+ int uid = jnMsg["user_id"].as_int();
const JSONNode &jnFwdMessages = jnMsg["fwd_messages"];
if (jnFwdMessages) {
@@ -289,7 +289,7 @@ void CVkProto::OnReceiveHistoryMessages(NETLIBHTTPREQUEST *reply, AsyncHttpReque
if (m_iLoadHistoryTask == 0 && m_bNotifyForEndLoadingHistoryAllContact) {
MsgPopup(NULL, TranslateT("Loading messages for all contacts is completed."), TranslateT("Loading history"));
- m_bNotifyForEndLoadingHistoryAllContact = m_bNotifyForEndLoadingHistory = false;
+ m_bNotifyForEndLoadingHistoryAllContact = m_bNotifyForEndLoadingHistory = false;
}
}
diff --git a/protocols/VKontakte/src/vk_messages.cpp b/protocols/VKontakte/src/vk_messages.cpp
index a627fbaf93..c13efc9516 100644
--- a/protocols/VKontakte/src/vk_messages.cpp
+++ b/protocols/VKontakte/src/vk_messages.cpp
@@ -44,7 +44,7 @@ int CVkProto::SendMsg(MCONTACT hContact, int, const char *szMsg)
return 0;
bool bIsChat = isChatRoom(hContact);
- LONG iUserID = getDword(hContact, bIsChat ? "vk_chat_id" : "ID" , VK_INVALID_USER);
+ LONG iUserID = getDword(hContact, bIsChat ? "vk_chat_id" : "ID", VK_INVALID_USER);
if (iUserID == VK_INVALID_USER || iUserID == VK_FEED_USER) {
ForkThread(&CVkProto::SendMsgAck, new CVkSendMsgParam(hContact));
@@ -55,9 +55,9 @@ int CVkProto::SendMsg(MCONTACT hContact, int, const char *szMsg)
ptrA pszRetMsg(GetStickerId(szMsg, StickerId));
ULONG uMsgId = ::InterlockedIncrement(&m_msgId);
- AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_POST, "/method/messages.send.json", true, bIsChat? &CVkProto::OnSendChatMsg : &CVkProto::OnSendMessage, AsyncHttpRequest::rpHigh)
+ AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_POST, "/method/messages.send.json", true, bIsChat ? &CVkProto::OnSendChatMsg : &CVkProto::OnSendMessage, AsyncHttpRequest::rpHigh)
<< INT_PARAM(bIsChat ? "chat_id" : "peer_id", iUserID)
- << INT_PARAM("random_id", ((LONG) time(NULL)) * 100 + uMsgId % 100);
+ << INT_PARAM("random_id", ((LONG)time(NULL)) * 100 + uMsgId % 100);
pReq->AddHeader("Content-Type", "application/x-www-form-urlencoded");
if (StickerId)
@@ -75,13 +75,13 @@ int CVkProto::SendMsg(MCONTACT hContact, int, const char *szMsg)
if (!bIsChat)
pReq->pUserInfo = new CVkSendMsgParam(hContact, uMsgId);
-
+
Push(pReq);
if (!m_bServerDelivery && !bIsChat)
ForkThread(&CVkProto::SendMsgAck, new CVkSendMsgParam(hContact, uMsgId));
- if (!IsEmpty(pszRetMsg))
+ if (!IsEmpty(pszRetMsg))
SendMsg(hContact, 0, pszRetMsg);
return uMsgId;
@@ -102,7 +102,7 @@ void CVkProto::OnSendMessage(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
const JSONNode &jnResponse = CheckJsonResponse(pReq, reply, jnRoot);
if (jnResponse) {
UINT mid;
- if (jnResponse.type() != JSON_STRING)
+ if (jnResponse.type() != JSON_STRING)
mid = jnResponse.as_int();
else if (swscanf(jnResponse.as_mstring(), L"%d", &mid) != 1)
mid = 0;
@@ -122,7 +122,7 @@ void CVkProto::OnSendMessage(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
if (param->pFUP) {
ProtoBroadcastAck(param->hContact, ACKTYPE_FILE, iResult, (HANDLE)(param->pFUP));
- if (!pReq->bNeedsRestart || m_bTerminated)
+ if (!pReq->bNeedsRestart || m_bTerminated)
delete param->pFUP;
}
else if (m_bServerDelivery)
@@ -142,7 +142,7 @@ int CVkProto::OnDbEventRead(WPARAM, LPARAM hDbEvent)
MCONTACT hContact = db_event_getContact(hDbEvent);
if (!hContact)
return 0;
-
+
CMStringA szProto(GetContactProto(hContact));
if (szProto.IsEmpty() || szProto != m_szModuleName)
return 0;
@@ -210,11 +210,11 @@ void CVkProto::RetrieveUnreadMessages()
debugLogA("CVkProto::RetrieveUnreadMessages");
if (!IsOnline())
return;
-
+
Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/execute.json", true, &CVkProto::OnReceiveDlgs, AsyncHttpRequest::rpHigh)
<< CHAR_PARAM("code", "var dlg=API.messages.getDialogs({\"count\":200});"
- "var users=API.friends.areFriends({\"user_ids\":dlg.items@.message@.user_id});"
- "return{\"dialogs\":dlg, \"users\":users};"));
+ "var users=API.friends.areFriends({\"user_ids\":dlg.items@.message@.user_id});var groups=API.groups.get();"
+ "return{\"dialogs\":dlg, \"users\":users, \"groups\":groups.items};"));
}
void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
@@ -256,7 +256,7 @@ void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe
CMStringW wszFwdMessages = GetFwdMessages(jnFwdMessages, jnFUsers, m_vkOptions.BBCForAttachments());
if (!wszBody.IsEmpty())
wszFwdMessages = L"\n" + wszFwdMessages;
- wszBody += wszFwdMessages;
+ wszBody += wszFwdMessages;
}
CMStringW wszAttachmentDescr;
@@ -354,21 +354,31 @@ void CVkProto::OnReceiveDlgs(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
if (!jnDlgs)
return;
- OBJLIST<CVKUsersAreFriend> lufUsers(20, NumericKeySortT);
+ LIST<void> lufUsers(20, PtrKeySortT);
const JSONNode &jnUsers = jnResponse["users"];
- if (jnUsers) {
+ if (jnUsers)
for (auto it = jnUsers.begin(); it != jnUsers.end(); ++it) {
int iUserId = (*it)["user_id"].as_int();
int iStatus = (*it)["friend_status"].as_int();
- CVKUsersAreFriend* ufUser = lufUsers.find((CVKUsersAreFriend*)&iUserId);
- if (ufUser)
+ // iStatus == 3 - user is friend
+ // uid < 0 - user is group
+ if (iUserId < 0 || iStatus != 3 || lufUsers.indexOf((HANDLE)iUserId) != -1)
continue;
- ufUser = new CVKUsersAreFriend(iUserId, iStatus);
- lufUsers.insert(ufUser);
- }
- }
+ lufUsers.insert((HANDLE)iUserId);
+ }
+
+ const JSONNode &jnGroups = jnResponse["groups"];
+ if (jnGroups)
+ for (auto it = jnGroups.begin(); it != jnGroups.end(); ++it) {
+ int iUserId = 1000000000 + (*it).as_int();
+
+ if (lufUsers.indexOf((HANDLE)iUserId) != -1)
+ continue;
+
+ lufUsers.insert((HANDLE)iUserId);
+ }
CMStringA szGroupIds;
@@ -382,19 +392,16 @@ void CVkProto::OnReceiveDlgs(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
int uid = 0;
MCONTACT hContact(NULL);
-
+
int chatid = jnDlg["chat_id"].as_int();
if (!chatid) {
uid = jnDlg["user_id"].as_int();
+ int iSearchId = (uid < 0) ? 1000000000 - uid : uid;
+ int iIndex = lufUsers.indexOf((HANDLE)iSearchId);
+ debugLogA("CVkProto::OnReceiveDlgs UserId = %d, iIndex = %d, numUnread = %d", uid, iIndex, numUnread);
- CVKUsersAreFriend* ufUser = lufUsers.find((CVKUsersAreFriend*)&uid);
- int iFriendStatus = ufUser ? ufUser->iStatus : 0;
- debugLogA("CVkProto::OnReceiveDlgs UserId = %d, FriendStatus = %d, numUnread = %d", uid, iFriendStatus, numUnread);
-
- // iFriendStatus == 3 - user is friend
- // uid > 0 - user is not group and etc.
- if (m_vkOptions.bLoadOnlyFriends && uid > 0 && numUnread == 0 && iFriendStatus != 3)
+ if (m_vkOptions.bLoadOnlyFriends && numUnread == 0 && iIndex == -1)
continue;
hContact = FindUser(uid, true);
@@ -414,7 +421,7 @@ void CVkProto::OnReceiveDlgs(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
}
}
}
-
+
if (chatid) {
debugLogA("CVkProto::OnReceiveDlgs chatid = %d", chatid);
if (m_chats.find((CVkChatInfo*)&chatid) == NULL)
diff --git a/protocols/VKontakte/src/vk_options.cpp b/protocols/VKontakte/src/vk_options.cpp
index 15cec12e55..2f6f6e0b29 100644
--- a/protocols/VKontakte/src/vk_options.cpp
+++ b/protocols/VKontakte/src/vk_options.cpp
@@ -28,7 +28,7 @@ INT_PTR CVkProto::SvcCreateAccMgrUI(WPARAM, LPARAM lParam)
//////////////////////////////////////////////////////////////////////////////
-CVkAccMgrForm::CVkAccMgrForm(CVkProto *proto, HWND hwndParent):
+CVkAccMgrForm::CVkAccMgrForm(CVkProto *proto, HWND hwndParent) :
CVkDlgBase(proto, IDD_ACCMGRUI, false),
m_edtLogin(this, IDC_LOGIN),
m_edtPassword(this, IDC_PASSWORD),
@@ -121,7 +121,7 @@ static CVKLang vkLangCodes[] = {
{ L"it", LPGENW("Italian") },
};
-static CVKSync vkHistorySyncMethods[] =
+static CVKSync vkHistorySyncMethods[] =
{
{ TranslateT("off"), SyncHistoryMetod::syncOff },
{ TranslateT("automatically"), SyncHistoryMetod::syncAuto },
@@ -137,7 +137,7 @@ static CVKMarkMsgRead vkMarkMsgAsReadMethods[] =
{ TranslateT("on typing"), MarkMsgReadOn::markOnTyping }
};
-CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto):
+CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto) :
CVkDlgBase(proto, IDD_OPT_MAIN, false),
m_edtLogin(this, IDC_LOGIN),
m_edtPassword(this, IDC_PASSWORD),
@@ -145,6 +145,7 @@ CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto):
m_edtGroupName(this, IDC_GROUPNAME),
m_cbxVKLang(this, IDC_COMBO_LANGUAGE),
m_cbDelivery(this, IDC_DELIVERY),
+ m_cbLoadLastMessageOnMsgWindowsOpen(this, IDC_LASTHISTORYLOAD),
m_cbUseLocalTime(this, IDC_USE_LOCAL_TIME),
m_cbLoadOnlyFriends(this, IDC_LOADONLYFRIENDS),
m_cbxMarkAsRead(this, IDC_COMBO_MARKASREAD),
@@ -153,6 +154,7 @@ CVkOptionAccountForm::CVkOptionAccountForm(CVkProto *proto):
CreateLink(m_edtLogin, "Login", L"");
CreateLink(m_edtGroupName, m_proto->m_vkOptions.pwszDefaultGroup);
CreateLink(m_cbDelivery, m_proto->m_vkOptions.bServerDelivery);
+ CreateLink(m_cbLoadLastMessageOnMsgWindowsOpen, m_proto->m_vkOptions.bLoadLastMessageOnMsgWindowsOpen);
CreateLink(m_cbUseLocalTime, m_proto->m_vkOptions.bUseLocalTime);
CreateLink(m_cbLoadOnlyFriends, m_proto->m_vkOptions.bLoadOnlyFriends);
}
@@ -177,13 +179,13 @@ void CVkOptionAccountForm::OnInitDialog()
m_cbxMarkAsRead.SetCurSel(iListIndex);
iListIndex = SyncHistoryMetod::syncOff;
- for (int i = 0; i < _countof(vkHistorySyncMethods); i++) {
+ for (int i = 0; i < _countof(vkHistorySyncMethods); i++) {
m_cbxSyncHistory.InsertString((wchar_t *)vkHistorySyncMethods[i].type, i, vkHistorySyncMethods[i].data);
if (vkHistorySyncMethods[i].data == m_proto->m_vkOptions.iSyncHistoryMetod)
iListIndex = i;
}
m_cbxSyncHistory.SetCurSel(iListIndex);
-
+
iListIndex = 0;
for (int i = 0; i < _countof(vkLangCodes); i++) {
m_cbxVKLang.InsertString(TranslateW(vkLangCodes[i].szDescription), i, (LPARAM)vkLangCodes[i].szCode);
@@ -191,7 +193,7 @@ void CVkOptionAccountForm::OnInitDialog()
iListIndex = i;
}
m_cbxVKLang.SetCurSel(iListIndex);
-
+
}
void CVkOptionAccountForm::OnApply()
@@ -199,7 +201,7 @@ void CVkOptionAccountForm::OnApply()
m_proto->m_vkOptions.iSyncHistoryMetod = m_cbxSyncHistory.GetItemData(m_cbxSyncHistory.GetCurSel());
m_proto->m_vkOptions.iMarkMessageReadOn = m_cbxMarkAsRead.GetItemData(m_cbxMarkAsRead.GetCurSel());
m_proto->m_vkOptions.pwszVKLang = (wchar_t *)m_cbxVKLang.GetItemData(m_cbxVKLang.GetCurSel());
-
+
ptrW pwszGroupName(m_edtGroupName.GetText());
if (mir_wstrcmp(m_pwszOldGroup, pwszGroupName)) {
Clist_GroupCreate(NULL, pwszGroupName);
@@ -219,12 +221,12 @@ void CVkOptionAccountForm::OnApply()
if (bPassChanged || mir_wstrcmpi(m_pwszOldLogin, pwszNewLogin))
m_proto->ClearAccessToken();
m_pwszOldLogin = pwszNewLogin;
-
+
}
////////////////////// Advanced page /////////////////////////////////////////
-CVkOptionAdvancedForm::CVkOptionAdvancedForm(CVkProto *proto):
+CVkOptionAdvancedForm::CVkOptionAdvancedForm(CVkProto *proto) :
CVkDlgBase(proto, IDD_OPT_ADV, false),
m_cbHideChats(this, IDC_HIDECHATS),
m_cbSyncReadMessageStatusFromServer(this, IDC_SYNC_MSG_STATUS),
@@ -307,7 +309,7 @@ void CVkOptionAdvancedForm::On_cbSendVKLinksAsAttachmentsChange(CCtrlCheck *)
////////////////////// News and notifications ////////////////////////////////
-CVkOptionFeedsForm::CVkOptionFeedsForm(CVkProto *proto):
+CVkOptionFeedsForm::CVkOptionFeedsForm(CVkProto *proto) :
CVkDlgBase(proto, IDD_OPT_FEEDS, false),
m_cbNewsEnabled(this, IDC_NEWS_ENBL),
m_edtNewsInterval(this, IDC_ED_INT_NEWS),
@@ -367,11 +369,11 @@ CVkOptionFeedsForm::CVkOptionFeedsForm(CVkProto *proto):
void CVkOptionFeedsForm::OnInitDialog()
{
m_spNewsInterval.SetRange(60 * 24, 1);
- m_spNewsInterval.SetPosition(m_proto->m_vkOptions.iNewsInterval);
+ m_spNewsInterval.SetPosition(m_proto->m_vkOptions.iNewsInterval);
m_spNotificationsInterval.SetRange(60 * 24, 1);
m_spNotificationsInterval.SetPosition(m_proto->m_vkOptions.iNotificationsInterval);
-
+
On_cbNewsEnabledChange(&m_cbNewsEnabled);
On_cbNotificationsEnabledChange(&m_cbNotificationsEnabled);
}
@@ -411,7 +413,7 @@ void CVkOptionFeedsForm::On_cbNotificationsEnabledChange(CCtrlCheck*)
////////////////////// View page /////////////////////////////////////////////
-CVkOptionViewForm::CVkOptionViewForm(CVkProto *proto):
+CVkOptionViewForm::CVkOptionViewForm(CVkProto *proto) :
CVkDlgBase(proto, IDD_OPT_VIEW, false),
m_cbIMGBBCSupportOff(this, IDC_IMG_OFF),
m_cbIMGBBCSupportFullSize(this, IDC_IMG_FULLSIZE),
@@ -444,7 +446,7 @@ void CVkOptionViewForm::OnInitDialog()
m_cbBBCForNewsOff.SetState(m_proto->m_vkOptions.iBBCForNews == BBCSupport::bbcNo);
m_cbBBCForNewsBasic.SetState(m_proto->m_vkOptions.iBBCForNews == BBCSupport::bbcBasic);
m_cbBBCForNewsAdvanced.SetState(m_proto->m_vkOptions.iBBCForNews == BBCSupport::bbcAdvanced);
-
+
m_cbBBCForAttachmentsOff.SetState(m_proto->m_vkOptions.iBBCForAttachments == BBCSupport::bbcNo);
m_cbBBCForAttachmentsBasic.SetState(m_proto->m_vkOptions.iBBCForAttachments == BBCSupport::bbcBasic);
m_cbBBCForAttachmentsAdvanced.SetState(m_proto->m_vkOptions.iBBCForAttachments == BBCSupport::bbcAdvanced);
@@ -478,7 +480,7 @@ void CVkOptionViewForm::OnApply()
////////////////////// Menu page /////////////////////////////////////////////
-CVkOptionMenuForm::CVkOptionMenuForm(CVkProto *proto):
+CVkOptionMenuForm::CVkOptionMenuForm(CVkProto *proto) :
CVkDlgBase(proto, IDD_OPT_MENU, false),
m_cbMenuEnabled0(this, IDC_SHOW_MENU0),
m_cbMenuEnabled1(this, IDC_SHOW_MENU1),
@@ -499,10 +501,10 @@ CVkOptionMenuForm::CVkOptionMenuForm(CVkProto *proto):
void CVkOptionMenuForm::OnApply()
{
- if (MessageBoxW(NULL,
+ if (MessageBoxW(NULL,
TranslateT("These changes will take effect after Miranda NG restart.\nWould you like to restart it now?"),
- TranslateT("VKontakte protocol"), MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2) == IDYES)
- CallServiceSync(MS_SYSTEM_RESTART, 1, 0);
+ TranslateT("VKontakte protocol"), MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2) == IDYES)
+ CallServiceSync(MS_SYSTEM_RESTART, 1, 0);
}
diff --git a/protocols/VKontakte/src/vk_options.h b/protocols/VKontakte/src/vk_options.h
index 9758d95ddf..f58dcff171 100644
--- a/protocols/VKontakte/src/vk_options.h
+++ b/protocols/VKontakte/src/vk_options.h
@@ -29,7 +29,7 @@ class CVkAccMgrForm : public CVkDlgBase
CCtrlEdit m_edtLogin;
CCtrlEdit m_edtPassword;
CCtrlHyperlink m_hlLink;
-
+
pass_ptrW m_pwszOldPass;
ptrW m_pwszOldLogin;
@@ -49,6 +49,7 @@ class CVkOptionAccountForm : public CVkDlgBase
CCtrlEdit m_edtGroupName;
CCtrlCombo m_cbxVKLang;
CCtrlCheck m_cbDelivery;
+ CCtrlCheck m_cbLoadLastMessageOnMsgWindowsOpen;
CCtrlCheck m_cbUseLocalTime;
CCtrlCheck m_cbLoadOnlyFriends;
CCtrlCombo m_cbxSyncHistory;
@@ -105,7 +106,7 @@ public:
class CVkOptionFeedsForm : public CVkDlgBase
{
CCtrlCheck m_cbNewsEnabled;
-
+
CCtrlEdit m_edtNewsInterval;
CCtrlSpin m_spNewsInterval;
@@ -129,7 +130,7 @@ class CVkOptionFeedsForm : public CVkDlgBase
CCtrlCheck m_cbNewsSourceFollowing;
CCtrlCheck m_cbNewsSourceIncludeBanned;
CCtrlCheck m_cbNewsSourceNoReposts;
-
+
CCtrlCheck m_cbNotificationFilterComments;
CCtrlCheck m_cbNotificationFilterLikes;
CCtrlCheck m_cbNotificationFilterReposts;
@@ -153,7 +154,7 @@ class CVkOptionViewForm : public CVkDlgBase
CCtrlCheck m_cbIMGBBCSupportFullSize;
CCtrlCheck m_cbIMGBBCSupport130;
CCtrlCheck m_cbIMGBBCSupport604;
-
+
CCtrlCheck m_cbBBCForNewsOff;
CCtrlCheck m_cbBBCForNewsBasic;
CCtrlCheck m_cbBBCForNewsAdvanced;
@@ -167,7 +168,7 @@ class CVkOptionViewForm : public CVkDlgBase
CCtrlCheck m_cbStikersAsSmyles;
CCtrlCheck m_cbShortenLinksForAudio;
CCtrlCheck m_cbUseNonStandardNotifications;
-
+
public:
CVkOptionViewForm(CVkProto *proto);
void OnInitDialog();
diff --git a/protocols/VKontakte/src/vk_struct.cpp b/protocols/VKontakte/src/vk_struct.cpp
index 67eec095fa..d931f2d911 100644
--- a/protocols/VKontakte/src/vk_struct.cpp
+++ b/protocols/VKontakte/src/vk_struct.cpp
@@ -44,13 +44,13 @@ AsyncHttpRequest::AsyncHttpRequest(CVkProto *ppro, int iRequestType, LPCSTR _url
bIsMainConn = false;
bExpUrlEncode = (BYTE)ppro->m_vkOptions.bUseNonStandardUrlEncode != 0;
AddHeader("Connection", "keep-alive");
-
+
if (*_url == '/') { // relative url leads to a site
m_szUrl = ((bSecure) ? "https://" : "http://") + CMStringA("api.vk.com");
m_szUrl += _url;
bIsMainConn = true;
}
- else
+ else
m_szUrl = _url;
flags = VK_NODUMPHEADERS | NLHRF_DUMPASTEXT | NLHRF_HTTP11 | NLHRF_REDIRECT;
@@ -167,6 +167,7 @@ CVkChatUser* CVkChatInfo::GetUserById(int user_id)
/////////////////////////////////////////////////////////////////////////////////////////
CVKOptions::CVKOptions(PROTO_INTERFACE *proto) :
+ bLoadLastMessageOnMsgWindowsOpen(proto, "LoadLastMessageOnMsgWindowsOpen", true),
bLoadOnlyFriends(proto, "LoadOnlyFriends", false),
bServerDelivery(proto, "BsDirect", true),
bHideChats(proto, "HideChats", true),
@@ -214,7 +215,7 @@ CVKOptions::CVKOptions(PROTO_INTERFACE *proto) :
bLoadFullCList(proto, "LoadFullCList", false),
bShowVkDeactivateEvents(proto, "ShowVkDeactivateEvents", true),
- bShowProtoMenuItem0(proto, "ShowProtoMenuItem0", true),
+ bShowProtoMenuItem0(proto, "ShowProtoMenuItem0", true),
bShowProtoMenuItem1(proto, "ShowProtoMenuItem1", true),
bShowProtoMenuItem2(proto, "ShowProtoMenuItem2", true),
bShowProtoMenuItem3(proto, "ShowProtoMenuItem3", true),
@@ -242,7 +243,7 @@ CVKOptions::CVKOptions(PROTO_INTERFACE *proto) :
// Note: Delete this code after next stable build
int iAutoClean = db_get_b(NULL, proto->m_szModuleName, "AutoClean", -1);
if (iAutoClean != -1) {
- bLoadOnlyFriends = (BYTE) iAutoClean;
+ bLoadOnlyFriends = (BYTE)iAutoClean;
db_set_b(NULL, proto->m_szModuleName, "LoadOnlyFriends", bLoadOnlyFriends);
db_unset(NULL, proto->m_szModuleName, "AutoClean");
}
diff --git a/protocols/VKontakte/src/vk_struct.h b/protocols/VKontakte/src/vk_struct.h
index 45ddd37fcf..88642cccd4 100644
--- a/protocols/VKontakte/src/vk_struct.h
+++ b/protocols/VKontakte/src/vk_struct.h
@@ -255,9 +255,9 @@ struct CVKInteres {
wchar_t *pwszTranslate;
};
-struct CVKLang {
- wchar_t *szCode;
- wchar_t *szDescription;
+struct CVKLang {
+ wchar_t *szCode;
+ wchar_t *szDescription;
};
enum MarkMsgReadOn : BYTE { markOnRead, markOnReceive, markOnReply, markOnTyping };
@@ -287,6 +287,7 @@ struct CVkCookie
};
struct CVKOptions {
+ CMOption<BYTE> bLoadLastMessageOnMsgWindowsOpen;
CMOption<BYTE> bLoadOnlyFriends;
CMOption<BYTE> bServerDelivery;
CMOption<BYTE> bHideChats;
@@ -357,7 +358,7 @@ struct CVKOptions {
CMOption<wchar_t*> pwszVKLang;
CVKOptions(PROTO_INTERFACE *proto);
-
+
__forceinline BBCSupport BBCForNews() { return (BBCSupport)(BYTE)iBBCForNews; };
__forceinline BBCSupport BBCForAttachments() { return (BBCSupport)(BYTE)iBBCForAttachments; };
@@ -366,14 +367,4 @@ struct CVKOptions {
struct CVKDeactivateEvent {
wchar_t *wszType;
char *szDescription;
-};
-
-struct CVKUsersAreFriend {
- CVKUsersAreFriend(int _iUserId, int _iStatus) :
- iUserId(_iUserId),
- iStatus(_iStatus)
- {}
-
- int iUserId;
- int iStatus;
}; \ No newline at end of file
diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp
index 9bec13a8f6..a6dd0b385d 100644
--- a/protocols/VKontakte/src/vk_thread.cpp
+++ b/protocols/VKontakte/src/vk_thread.cpp
@@ -23,9 +23,9 @@ mir_cs CVkProto::m_csTimer;
char szBlankUrl[] = "https://oauth.vk.com/blank.html";
static char VK_TOKEN_BEG[] = "access_token=";
static char VK_LOGIN_DOMAIN[] = "https://m.vk.com";
-static char fieldsName[] = "id, first_name, last_name, photo_100, bdate, sex, timezone, "
- "contacts, last_seen, online, status, country, city, relation, interests, activities, "
- "music, movies, tv, books, games, quotes, about, domain";
+static char fieldsName[] = "id, first_name, last_name, photo_100, bdate, sex, timezone, "
+"contacts, last_seen, online, status, country, city, relation, interests, activities, "
+"music, movies, tv, books, games, quotes, about, domain";
/////////////////////////////////////////////////////////////////////////////////////////
@@ -33,7 +33,7 @@ void CVkProto::ShutdownSession()
{
debugLogA("CVkProto::ShutdownSession");
m_bTerminated = true;
- if (m_hWorkerThread)
+ if (m_hWorkerThread)
SetEvent(m_evRequestsQueue);
OnLoggedOut();
}
@@ -55,7 +55,7 @@ static VOID CALLBACK TimerProc(HWND, UINT, UINT_PTR, DWORD)
for (int i = 0; i < vk_Instances.getCount(); i++)
if (vk_Instances[i]->IsOnline()) {
vk_Instances[i]->debugLogA("Tic timer for %i - %s", i, vk_Instances[i]->m_szModuleName);
- vk_Instances[i]->OnTimerTic();
+ vk_Instances[i]->OnTimerTic();
}
}
@@ -136,14 +136,14 @@ void CVkProto::OnOAuthAuthorize(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq
if (reply->resultCode == 302) { // manual redirect
LPCSTR pszLocation = findHeader(reply, "Location");
if (pszLocation) {
- if (!_strnicmp(pszLocation, szBlankUrl, sizeof(szBlankUrl)-1)) {
+ if (!_strnicmp(pszLocation, szBlankUrl, sizeof(szBlankUrl) - 1)) {
m_szAccessToken = NULL;
LPCSTR p = strstr(pszLocation, VK_TOKEN_BEG);
if (p) {
- p += sizeof(VK_TOKEN_BEG)-1;
- for (LPCSTR q = p+1; *q; q++) {
+ p += sizeof(VK_TOKEN_BEG) - 1;
+ for (LPCSTR q = p + 1; *q; q++) {
if (*q == '&' || *q == '=' || *q == '\"') {
- m_szAccessToken = mir_strndup(p, q-p);
+ m_szAccessToken = mir_strndup(p, q - p);
break;
}
}
@@ -175,7 +175,7 @@ void CVkProto::OnOAuthAuthorize(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq
Push(pRedirectReq);
}
}
- else
+ else
ConnectionFailed(LOGINERR_NOSERVER);
return;
}
@@ -250,7 +250,7 @@ void CVkProto::OnReceiveMyInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
m_myUserId = jnUser["id"].as_int();
setDword("ID", m_myUserId);
-
+
OnLoggedIn();
RetrieveUserInfo(m_myUserId);
RetrieveUnreadMessages();
@@ -302,14 +302,14 @@ MCONTACT CVkProto::SetContactInfo(const JSONNode &jnItem, bool flag, bool self)
setWString(hContact, "Nick", wszNick);
wszValue = jnItem["deactivated"].as_mstring();
- CMStringW wszOldDeactivated(ptrW(db_get_wsa(hContact, m_szModuleName, "Deactivated")));
+ CMStringW wszOldDeactivated(ptrW(db_get_wsa(hContact, m_szModuleName, "Deactivated")));
if (wszValue != wszOldDeactivated) {
AddVkDeactivateEvent(hContact, wszValue);
- if (wszValue.IsEmpty())
- db_unset(hContact, m_szModuleName, "Deactivated");
- else
+ if (wszValue.IsEmpty())
+ db_unset(hContact, m_szModuleName, "Deactivated");
+ else
setWString(hContact, "Deactivated", wszValue);
- }
+ }
if (!wszValue.IsEmpty())
return hContact;
@@ -340,7 +340,7 @@ MCONTACT CVkProto::SetContactInfo(const JSONNode &jnItem, bool flag, bool self)
if (jnLastSeen) {
int iLastSeen = jnLastSeen["time"].as_int();
int iOldLastSeen = db_get_dw(hContact, "BuddyExpectator", "LastSeen");
- if (iLastSeen && iLastSeen > iOldLastSeen) {
+ if (iLastSeen && iLastSeen > iOldLastSeen) {
db_set_dw(hContact, "BuddyExpectator", "LastSeen", (DWORD)iLastSeen);
db_set_w(hContact, "BuddyExpectator", "LastStatus", ID_STATUS_ONLINE);
}
@@ -360,7 +360,7 @@ MCONTACT CVkProto::SetContactInfo(const JSONNode &jnItem, bool flag, bool self)
SetMirVer(hContact, 7); // vk.com
else if (online_app != 0)
SetMirVer(hContact, online_app); // App
- else
+ else
SetMirVer(hContact, 1); // m.vk.com
}
else
@@ -413,21 +413,21 @@ MCONTACT CVkProto::SetContactInfo(const JSONNode &jnItem, bool flag, bool self)
}
// MaritalStatus
- BYTE cMaritalStatus[] = {0, 10, 11, 12, 20, 70, 50, 60, 80};
+ BYTE cMaritalStatus[] = { 0, 10, 11, 12, 20, 70, 50, 60, 80 };
if (jnItem["relation"] && jnItem["relation"].as_int() < _countof(cMaritalStatus))
setByte(hContact, "MaritalStatus", cMaritalStatus[jnItem["relation"].as_int()]);
// interests, activities, music, movies, tv, books, games, quotes
- CVKInteres vkInteres[] = {
- { "interests", TranslateT("Interests") },
- { "activities", TranslateT("Activities") },
- { "music", TranslateT("Music") },
- { "movies", TranslateT("Movies") },
+ CVKInteres vkInteres[] = {
+ { "interests", TranslateT("Interests") },
+ { "activities", TranslateT("Activities") },
+ { "music", TranslateT("Music") },
+ { "movies", TranslateT("Movies") },
{ "tv", TranslateT("TV") },
- { "books", TranslateT("Books") },
+ { "books", TranslateT("Books") },
{ "games", TranslateT("Games") },
- { "quotes", TranslateT("Quotes") }
+ { "quotes", TranslateT("Quotes") }
};
int iInteres = 0;
@@ -436,7 +436,7 @@ MCONTACT CVkProto::SetContactInfo(const JSONNode &jnItem, bool flag, bool self)
wszValue = jnItem[vkInteres[i].szField].as_mstring();
if (wszValue.IsEmpty())
continue;
-
+
CMStringA InteresCat(FORMAT, "Interest%dCat", iInteres);
CMStringA InteresText(FORMAT, "Interest%dText", iInteres);
@@ -444,7 +444,7 @@ MCONTACT CVkProto::SetContactInfo(const JSONNode &jnItem, bool flag, bool self)
setWString(hContact, InteresText, wszValue);
iInteres++;
-
+
}
for (int i = iInteres; iInteres > 0; i++) {
@@ -501,7 +501,7 @@ void CVkProto::RetrieveGroupInfo(LONG groupID)
Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/groups.getById.json", true, &CVkProto::OnReceiveGroupInfo)
<< CHAR_PARAM("fields", "description")
- << INT_PARAM("group_id", -1*groupID));
+ << INT_PARAM("group_id", -1 * groupID));
}
void CVkProto::RetrieveGroupInfo(CMStringA& groupIDs)
@@ -535,7 +535,7 @@ void CVkProto::RetrieveUsersInfo(bool bFreeOffline, bool bRepeat)
if (!userIDs.IsEmpty())
userIDs.AppendChar(',');
userIDs.AppendFormat(L"%i", userID);
-
+
if (i == MAX_CONTACTS_PER_REQUEST)
break;
i++;
@@ -655,13 +655,10 @@ void CVkProto::OnReceiveGroupInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pR
for (auto it = jnResponse.begin(); it != jnResponse.end(); ++it) {
const JSONNode &jnItem = (*it);
-
+
int iGroupId = (-1)*jnItem["id"].as_int();
bool bIsMember = jnItem["is_member"].as_bool();
- if (!bIsMember && m_vkOptions.bLoadOnlyFriends)
- continue;
-
MCONTACT hContact = FindUser(iGroupId, true);
if (!hContact)
continue;
@@ -671,13 +668,13 @@ void CVkProto::OnReceiveGroupInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pR
wszValue = jnItem["name"].as_mstring();
if (!wszValue.IsEmpty())
setWString(hContact, "Nick", wszValue);
-
+
setWord(hContact, "Status", ID_STATUS_ONLINE);
setByte(hContact, "Auth", !bIsMember);
setByte(hContact, "friend", bIsMember);
setByte(hContact, "IsGroup", 1);
-
+
wszValue = jnItem["screen_name"].as_mstring();
if (!wszValue.IsEmpty()) {
setWString(hContact, "domain", wszValue);
@@ -685,7 +682,7 @@ void CVkProto::OnReceiveGroupInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pR
setWString(hContact, "Homepage", wszValue);
}
- wszValue = jnItem["description"].as_mstring();
+ wszValue = jnItem["description"].as_mstring();
if (!wszValue.IsEmpty())
setWString(hContact, "About", wszValue);
@@ -693,8 +690,8 @@ void CVkProto::OnReceiveGroupInfo(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pR
if (!wszValue.IsEmpty()) {
SetAvatarUrl(hContact, wszValue);
ReloadAvatarInfo(hContact);
- }
-
+ }
+
wszValue = jnItem["status"].as_mstring();
db_set_ws(hContact, "CList", "StatusMsg", wszValue);
@@ -738,13 +735,13 @@ void CVkProto::OnReceiveFriends(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq
const JSONNode &jnResponse = CheckJsonResponse(pReq, reply, jnRoot);
if (!jnResponse)
return;
-
+
CVkSendMsgParam *param = (CVkSendMsgParam *)pReq->pUserInfo;
bool bCleanContacts = (param->iMsgID != 0);
delete param;
LIST<void> arContacts(10, PtrKeySortT);
-
+
for (MCONTACT hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName)) {
if (!isChatRoom(hContact) && !IsGroupUser(hContact))
setByte(hContact, "Auth", 1);
@@ -776,7 +773,7 @@ void CVkProto::OnReceiveFriends(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq
continue;
db_delete_contact(hContact);
}
-
+
arContacts.destroy();
}
@@ -795,7 +792,7 @@ INT_PTR __cdecl CVkProto::SvcAddAsFriend(WPARAM hContact, LPARAM)
INT_PTR CVkProto::SvcWipeNonFriendContacts(WPARAM, LPARAM)
{
debugLogA("CVkProto::SvcWipeNonFriendContacts");
- if (IDNO == MessageBoxW(NULL, TranslateT("Are you sure to wipe local contacts missing in your friend list?"),
+ if (IDNO == MessageBoxW(NULL, TranslateT("Are you sure to wipe local contacts missing in your friend list?"),
TranslateT("Attention!"), MB_ICONWARNING | MB_YESNO))
return 0;
@@ -905,13 +902,13 @@ INT_PTR __cdecl CVkProto::SvcBanUser(WPARAM hContact, LPARAM)
ptrW pwszNick(db_get_wsa(hContact, m_szModuleName, "Nick"));
CMStringW pwszMsg(FORMAT, TranslateT("Are you sure to ban %s? %s%sContinue?"),
- IsEmpty(pwszNick) ? TranslateT("(Unknown contact)") : pwszNick,
+ IsEmpty(pwszNick) ? TranslateT("(Unknown contact)") : pwszNick,
wszVarWarning.IsEmpty() ? L" " : TranslateT("\nIt will also"),
wszVarWarning.IsEmpty() ? L"\n" : wszVarWarning);
if (IDNO == MessageBoxW(NULL, pwszMsg, TranslateT("Attention!"), MB_ICONWARNING | MB_YESNO))
return 1;
-
+
Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/execute.json", true, &CVkProto::OnReceiveSmth)
<< CHAR_PARAM("code", code));
@@ -956,7 +953,7 @@ INT_PTR __cdecl CVkProto::SvcVisitProfile(WPARAM hContact, LPARAM)
debugLogA("CVkProto::SvcVisitProfile");
if (isChatRoom(hContact)) {
ptrW wszHomepage(db_get_wsa(hContact, m_szModuleName, "Homepage"));
- if(!IsEmpty(wszHomepage))
+ if (!IsEmpty(wszHomepage))
Utils_OpenUrlW(wszHomepage);
return 0;
}
@@ -969,7 +966,7 @@ INT_PTR __cdecl CVkProto::SvcVisitProfile(WPARAM hContact, LPARAM)
wszUrl.Append(wszDomain);
else
wszUrl.AppendFormat(L"id%i", userID);
-
+
Utils_OpenUrlW(wszUrl);
return 0;
} \ No newline at end of file