From cc9402b1daabb0a27065e5eb704948cc2f74f7df Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 8 Feb 2015 21:06:03 +0000 Subject: bunch of small fixes git-svn-id: http://svn.miranda-ng.org/main/trunk@12057 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp | 4 +-- protocols/WhatsApp/src/WhatsAPI++/WAConnection.h | 4 +-- protocols/WhatsApp/src/avatars.cpp | 37 ++++++++++++++-------- protocols/WhatsApp/src/chat.cpp | 33 +++++++++++++++++-- protocols/WhatsApp/src/contacts.cpp | 2 +- protocols/WhatsApp/src/proto.h | 3 ++ 6 files changed, 63 insertions(+), 20 deletions(-) (limited to 'protocols/WhatsApp') diff --git a/protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp b/protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp index 16fafbf871..40d9970751 100644 --- a/protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp +++ b/protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp @@ -710,7 +710,7 @@ void WAConnection::sendGetGroups() throw (WAException) m_pMutex->unlock(); } -void WAConnection::sendGetPicture(const std::string &jid, const std::string &type) throw (WAException) +void WAConnection::sendGetPicture(const char *jid, const char *type) throw (WAException) { std::string id = makeId("iq_"); this->pending_server_requests[id] = new IqResultGetPhotoHandler(this, jid); @@ -852,7 +852,7 @@ void WAConnection::sendQueryLastOnline(const std::string &jid) throw (WAExceptio << XATTR("id", id) << XATTR("type", "get") << XATTR("to", jid) << XATTR("xmlns", "jabber:iq:last")); } -void WAConnection::sendSetPicture(const std::string &jid, std::vector* data, std::vector* preview) throw (WAException) +void WAConnection::sendSetPicture(const char *jid, std::vector* data, std::vector* preview) throw (WAException) { std::string id = this->makeId("set_photo_"); this->pending_server_requests[id] = new IqResultSetPhotoHandler(this, jid); diff --git a/protocols/WhatsApp/src/WhatsAPI++/WAConnection.h b/protocols/WhatsApp/src/WhatsAPI++/WAConnection.h index bddfe1ccd7..957fcf7dfc 100644 --- a/protocols/WhatsApp/src/WhatsAPI++/WAConnection.h +++ b/protocols/WhatsApp/src/WhatsAPI++/WAConnection.h @@ -405,8 +405,8 @@ public: void sendRemoveParticipants(const std::string &gjid, const std::vector &participant) throw (WAException); void sendSetNewSubject(const std::string &gjid, const std::string &subject) throw (WAException); void sendStatusUpdate(std::string& status) throw (WAException); - void sendGetPicture(const std::string &jid, const std::string &type) throw (WAException); - void sendSetPicture(const std::string &jid, std::vector* data, std::vector* preview) throw (WAException); + void sendGetPicture(const char *jid, const char *type) throw (WAException); + void sendSetPicture(const char *jid, std::vector* data, std::vector* preview) throw (WAException); void sendDeleteAccount() throw(WAException); }; diff --git a/protocols/WhatsApp/src/avatars.cpp b/protocols/WhatsApp/src/avatars.cpp index 8bdfe9212b..2694b278b6 100644 --- a/protocols/WhatsApp/src/avatars.cpp +++ b/protocols/WhatsApp/src/avatars.cpp @@ -4,7 +4,7 @@ INT_PTR WhatsAppProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) { PROTO_AVATAR_INFORMATIONT* AI = (PROTO_AVATAR_INFORMATIONT*)lParam; - ptrA id(getStringA(AI->hContact, WHATSAPP_KEY_ID)); + ptrA id(getStringA(AI->hContact, isChatRoom(AI->hContact) ? "ChatRoomID" : WHATSAPP_KEY_ID)); if (id == NULL) return GAIR_NOAVATAR; @@ -14,10 +14,10 @@ INT_PTR WhatsAppProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam) ptrA szAvatarId(getStringA(AI->hContact, WHATSAPP_KEY_AVATAR_ID)); if (szAvatarId == NULL || (wParam & GAIF_FORCE) != 0) - if (AI->hContact != NULL && m_pConnection != NULL) { - m_pConnection->sendGetPicture((const char*)id, "image"); - return GAIR_WAITFOR; - } + if (AI->hContact != NULL && m_pConnection != NULL) { + m_pConnection->sendGetPicture(id, "preview"); + return GAIR_WAITFOR; + } debugLogA("No avatar"); return GAIR_NOAVATAR; @@ -50,7 +50,7 @@ std::tstring WhatsAppProto::GetAvatarFileName(MCONTACT hContact) std::string jid; if (hContact != NULL) { - ptrA szId(getStringA(hContact, "ID")); + ptrA szId(getStringA(hContact, isChatRoom(hContact) ? "ChatRoomID" : WHATSAPP_KEY_ID)); if (szId == NULL) return _T(""); @@ -81,12 +81,11 @@ static std::vector* sttFileToMem(const TCHAR *ptszFileName) return result; } -INT_PTR WhatsAppProto::SetMyAvatar(WPARAM wParam, LPARAM lParam) +int WhatsAppProto::InternalSetAvatar(MCONTACT hContact, const char *szJid, const TCHAR *ptszFileName) { - if (!isOnline()) + if (!isOnline() || ptszFileName == NULL) return 1; - const TCHAR *ptszFileName = (const TCHAR*)lParam; if (_taccess(ptszFileName, 4) != 0) return errno; @@ -96,14 +95,21 @@ INT_PTR WhatsAppProto::SetMyAvatar(WPARAM wParam, LPARAM lParam) resize.size = sizeof(resize); resize.fit = RESIZEBITMAP_KEEP_PROPORTIONS; resize.max_height = resize.max_width = 96; - + HBITMAP hbmpPreview = (HBITMAP)CallService(MS_IMG_RESIZE, (LPARAM)&resize, 0); if (hbmpPreview == NULL) return 3; TCHAR tszTempFile[MAX_PATH], tszMyFile[MAX_PATH]; - mir_sntprintf(tszMyFile, SIZEOF(tszMyFile), _T("%s\\myavatar.jpg"), m_tszAvatarFolder.c_str()); - mir_sntprintf(tszTempFile, SIZEOF(tszTempFile), _T("%s\\myavatar.preview.jpg"), m_tszAvatarFolder.c_str()); + if (hContact == NULL) { + mir_sntprintf(tszMyFile, SIZEOF(tszMyFile), _T("%s\\myavatar.jpg"), m_tszAvatarFolder.c_str()); + mir_sntprintf(tszTempFile, SIZEOF(tszTempFile), _T("%s\\myavatar.preview.jpg"), m_tszAvatarFolder.c_str()); + } + else { + std::tstring tszContactAva = GetAvatarFileName(hContact); + _tcsncpy_s(tszMyFile, tszContactAva.c_str(), _TRUNCATE); + _tcsncpy_s(tszTempFile, (tszContactAva + _T(".preview")).c_str(), _TRUNCATE); + } IMGSRVC_INFO saveInfo = { sizeof(saveInfo), 0 }; saveInfo.hbm = hbmpPreview; @@ -118,6 +124,11 @@ INT_PTR WhatsAppProto::SetMyAvatar(WPARAM wParam, LPARAM lParam) CopyFile(ptszFileName, tszMyFile, FALSE); - m_pConnection->sendSetPicture(m_szJid, sttFileToMem(ptszFileName), sttFileToMem(tszTempFile)); + m_pConnection->sendSetPicture(szJid, sttFileToMem(ptszFileName), sttFileToMem(tszTempFile)); return 0; } + +INT_PTR WhatsAppProto::SetMyAvatar(WPARAM wParam, LPARAM lParam) +{ + return InternalSetAvatar(NULL, m_szJid.c_str(), (const TCHAR*)lParam); +} diff --git a/protocols/WhatsApp/src/chat.cpp b/protocols/WhatsApp/src/chat.cpp index f5d1545c04..7c78a1d5c4 100644 --- a/protocols/WhatsApp/src/chat.cpp +++ b/protocols/WhatsApp/src/chat.cpp @@ -8,7 +8,7 @@ enum IDM_INVITE, IDM_LEAVE, IDM_TOPIC, - IDM_MESSAGE, IDM_KICK, + IDM_AVATAR, IDM_KICK, IDM_CPY_NICK, IDM_CPY_TOPIC, IDM_ADD_RJID, IDM_CPY_RJID }; @@ -105,6 +105,9 @@ static gc_item sttLogListItems[] = { LPGENT("&Room options"), 0, MENU_NEWPOPUP }, { LPGENT("View/change &topic"), IDM_TOPIC, MENU_POPUPITEM }, { LPGENT("&Leave chat session"), IDM_LEAVE, MENU_POPUPITEM }, +#ifdef _DEBUG + { LPGENT("Set &avatar"), IDM_AVATAR, MENU_POPUPITEM }, // doesn't work, therefore commented out +#endif { NULL, 0, MENU_SEPARATOR }, { LPGENT("Copy room &JID"), IDM_CPY_RJID, MENU_ITEM }, { LPGENT("Copy room topic"), IDM_CPY_TOPIC, MENU_ITEM }, @@ -133,6 +136,10 @@ void WhatsAppProto::ChatLogMenuHook(WAChatInfo *pInfo, struct GCHOOK *gch) if (isOnline()) m_pConnection->sendJoinLeaveGroup(_T2A(pInfo->tszJid), false); break; + + case IDM_AVATAR: + SetChatAvatar(pInfo); + break; } } @@ -167,6 +174,27 @@ void WhatsAppProto::InviteChatUser(WAChatInfo *pInfo) } } +void WhatsAppProto::SetChatAvatar(WAChatInfo *pInfo) +{ + TCHAR tszFileName[MAX_PATH]; tszFileName[0] = '\0'; + + TCHAR filter[256]; filter[0] = '\0'; + CallService(MS_UTILS_GETBITMAPFILTERSTRINGST, SIZEOF(filter), (LPARAM)filter); + + OPENFILENAME ofn = { 0 }; + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.lpstrFilter = filter; + ofn.hwndOwner = 0; + ofn.lpstrFile = tszFileName; + ofn.nMaxFile = ofn.nMaxFileTitle = SIZEOF(tszFileName); + ofn.Flags = OFN_HIDEREADONLY; + ofn.lpstrInitialDir = _T("."); + ofn.lpstrDefExt = _T(""); + if (GetOpenFileName(&ofn)) + if (_taccess(tszFileName, 4) != -1) + InternalSetAvatar(pInfo->hContact, _T2A(pInfo->tszJid), tszFileName); +} + ///////////////////////////////////////////////////////////////////////////////////////// // nicklist menu event handler @@ -393,7 +421,7 @@ void WhatsAppProto::onGroupNewSubject(const std::string &gjid, const std::string void WhatsAppProto::onGroupAddUser(const std::string &gjid, const std::string &ujid, int ts) { WAChatInfo *pInfo = SafeGetChat(gjid); - if (pInfo == NULL) + if (pInfo == NULL || !pInfo->bActive) return; ptrT tszUID(str2t(ujid)); @@ -452,6 +480,7 @@ void WhatsAppProto::onGetParticipants(const std::string &gjid, const std::vector if (pInfo == NULL) return; + pInfo->bActive = true; for (size_t i = 0; i < participants.size(); i++) { std::string curr = participants[i]; diff --git a/protocols/WhatsApp/src/contacts.cpp b/protocols/WhatsApp/src/contacts.cpp index d1146a5ca6..8a091af1fa 100644 --- a/protocols/WhatsApp/src/contacts.cpp +++ b/protocols/WhatsApp/src/contacts.cpp @@ -168,7 +168,7 @@ void WhatsAppProto::onContactChanged(const std::string &jid, bool added) void WhatsAppProto::onPictureChanged(const std::string &jid, const std::string &id, bool set) { if (isOnline()) - m_pConnection->sendGetPicture(jid, "image"); + m_pConnection->sendGetPicture(jid.c_str(), "preview"); } void WhatsAppProto::onSendGetPicture(const std::string &jid, const std::vector& data, const std::string &id) diff --git a/protocols/WhatsApp/src/proto.h b/protocols/WhatsApp/src/proto.h index 8702f2c060..4585d9e48f 100644 --- a/protocols/WhatsApp/src/proto.h +++ b/protocols/WhatsApp/src/proto.h @@ -127,6 +127,7 @@ public: void InviteChatUser(WAChatInfo *pInfo); void KickChatUser(WAChatInfo *pInfo, const TCHAR *ptszJid); TCHAR* GetChatUserNick(const std::string &jid); + void SetChatAvatar(WAChatInfo *pInfo); void onGroupMessageReceived(const FMessage &fmsg); @@ -161,6 +162,8 @@ private: INT_PTR __cdecl GetMyAvatar(WPARAM, LPARAM); INT_PTR __cdecl SetMyAvatar(WPARAM, LPARAM); + int InternalSetAvatar(MCONTACT hContact, const char *szJid, const TCHAR *ptszFileName); + // Private data ////////////////////////////////////////////////////////////////////// HGENMENU m_hMenuRoot; -- cgit v1.2.3