/*
Copyright (c) 2013-15 Miranda NG project (http://miranda-ng.org)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation version 2
of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "stdafx.h"
HANDLE CVkProto::SearchBasic(const PROTOCHAR* id)
{
ForkThread(&CVkProto::SearchBasicThread, (void *)id);
return (HANDLE)1;
}
HANDLE CVkProto::SearchByEmail(const PROTOCHAR* email)
{
ForkThread(&CVkProto::SearchByMailThread, (void *)email);
return (HANDLE)1;
}
HANDLE CVkProto::SearchByName(const PROTOCHAR* nick, const PROTOCHAR* firstName, const PROTOCHAR* lastName)
{
PROTOSEARCHBYNAME * psr = new (PROTOSEARCHBYNAME);
psr->pszFirstName = mir_wstrdup(firstName);
psr->pszLastName = mir_wstrdup(lastName);
psr->pszNick = mir_wstrdup(nick);
ForkThread(&CVkProto::SearchThread, (void *)psr);
return (HANDLE)1;
}
void CVkProto::SearchBasicThread(void* id)
{
debugLogA("CVkProto::OnSearchBasicThread");
if (!IsOnline())
return;
AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_GET, "/method/users.get.json", true, &CVkProto::OnSearch)
<< TCHAR_PARAM("user_ids", (TCHAR *)id)
<< CHAR_PARAM("fields", "nickname, domain")
<< VER_API;
pReq->pUserInfo = NULL;
Push(pReq);
}
void CVkProto::SearchByMailThread(void* email)
{
debugLogA("CVkProto::OnSearchBasicThread");
if (!IsOnline())
return;
AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_GET, "/method/account.lookupContacts.json", true, &CVkProto::OnSearchByMail)
<< TCHAR_PARAM("contacts", (TCHAR *)email)
<< CHAR_PARAM("service", "email")
<< VER_API;
Push(pReq);
}
void __cdecl CVkProto::SearchThread(void* p)
{
PROTOSEARCHBYNAME *pParam = (PROTOSEARCHBYNAME *)p;
TCHAR arg[200];
mir_sntprintf(arg, SIZEOF(arg), _T("%s %s %s"), pParam->pszFirstName, pParam->pszNick, pParam->pszLastName);
debugLog(_T("CVkProto::SearchThread %s"), arg);
if (!IsOnline())
return;
AsyncHttpRequest *pReq = new AsyncHttpRequest(this, REQUEST_GET, "/method/users.search.json", true, &CVkProto::OnSearch)
<< TCHAR_PARAM("q", (TCHAR *)arg)
<< CHAR_PARAM("fields", "nickname, domain")
<< INT_PARAM("count", 200)
<< VER_API;
pReq->pUserInfo = p;
Push(pReq);
}
void CVkProto::OnSearch(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
{
PROTOSEARCHBYNAME *pParam = (PROTOSEARCHBYNAME *)pReq->pUserInfo;
debugLogA("CVkProto::OnSearch %d", reply->resultCode);
if (reply->resultCode != 200) {
if (pParam) {
mir_free(pParam->pszFirstName);
mir_free(pParam->pszLastName);
mir_free(pParam->pszNick);
delete pParam;
}
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
return;
}
JSONROOT pRoot;
JSONNODE *pResponse = CheckJsonResponse(pReq, reply, pRoot);
if (pResponse == NULL) {
if (pParam) {
mir_free(pParam->pszFirstName);
mir_free(pParam->pszLastName);
mir_free(pParam->pszNick);
delete pParam;
}
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
return;
}
int iCount = json_as_int(json_get(pResponse, "count"));
JSONNODE *pItems = json_get(pResponse, "items");
if (!pItems) {
pItems = pResponse;
iCount = 1;
}
for (int i = 0; ipszFirstName)
filter = tlstrstr(psr.firstName, pParam->pszFirstName) && filter;
if (psr.lastName&&pParam->pszLastName)
filter = tlstrstr(psr.lastName, pParam->pszLastName) && filter;
if (psr.nick&&pParam->pszNick)
filter = tlstrstr(psr.nick, pParam->pszNick) && filter;
}
if (filter)
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)1, (LPARAM)&psr);
}
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
if (pParam) {
mir_free(pParam->pszFirstName);
mir_free(pParam->pszLastName);
mir_free(pParam->pszNick);
delete pParam;
}
}
void CVkProto::OnSearchByMail(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
{
debugLogA("CVkProto::OnSearch %d", reply->resultCode);
if (reply->resultCode != 200) {
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
return;
}
JSONROOT pRoot;
JSONNODE *pResponse = CheckJsonResponse(pReq, reply, pRoot);
if (pResponse == NULL) {
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
return;
}
JSONNODE *pItems = json_get(pResponse, "found");
if (!pItems) {
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
return;
}
for (int i = 0;; i++) {
JSONNODE *pRecord = json_at(pItems, i);
if (pRecord == NULL)
break;
PROTOSEARCHRESULT psr = { sizeof(psr) };
psr.flags = PSR_TCHAR;
ptrT pId(json_as_string(json_get(pRecord, "id")));
ptrT pFirstName(json_as_string(json_get(pRecord, "first_name")));
ptrT pLastName(json_as_string(json_get(pRecord, "last_name")));
ptrT pNick(json_as_string(json_get(pRecord, "nickname")));
ptrT pEmail(json_as_string(json_get(pRecord, "contact")));
psr.id = mir_wstrdup(pId);
psr.firstName = mir_wstrdup(pFirstName);
psr.lastName = mir_wstrdup(pLastName);
psr.nick = mir_wstrdup(pNick);
psr.email = mir_wstrdup(pEmail);
if (!psr.nick || !psr.nick[0])
psr.nick = psr.email;
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)1, (LPARAM)&psr);
}
ProtoBroadcastAck(0, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)1, 0);
}