diff options
-rw-r--r-- | protocols/Skype/src/skype.cpp | 2 | ||||
-rw-r--r-- | protocols/Skype/src/skype_avatars.cpp | 57 | ||||
-rw-r--r-- | protocols/Skype/src/skype_profile.cpp | 31 | ||||
-rw-r--r-- | protocols/Skype/src/skype_proto.h | 6 | ||||
-rw-r--r-- | protocols/Skype/src/skype_utils.cpp | 29 |
5 files changed, 74 insertions, 51 deletions
diff --git a/protocols/Skype/src/skype.cpp b/protocols/Skype/src/skype.cpp index 0a67359a25..78af8aa51c 100644 --- a/protocols/Skype/src/skype.cpp +++ b/protocols/Skype/src/skype.cpp @@ -137,7 +137,7 @@ int StartSkypeRuntime(HINSTANCE hInstance, const wchar_t *profileName, int &port if (skypeKitPath != NULL)
*skypeKitPath = 0;
::swprintf(fileName, SIZEOF(fileName), L"%s\\%s", fileName, L"SkypeKit.exe");
- if ( !::PathFileExists(fileName))
+ if ( ::GetFileAttributes(fileName) == DWORD(-1))
{
HRSRC hRes = ::FindResource(hInstance, MAKEINTRESOURCE(IDR_RUNTIME), L"BIN");
if (hRes)
diff --git a/protocols/Skype/src/skype_avatars.cpp b/protocols/Skype/src/skype_avatars.cpp index 0df0814391..c95d4e3d2a 100644 --- a/protocols/Skype/src/skype_avatars.cpp +++ b/protocols/Skype/src/skype_avatars.cpp @@ -1,6 +1,6 @@ #include "skype_proto.h"
-bool CSkypeProto::IsAvatarChanged(const SEBinary &avatar)
+bool CSkypeProto::IsAvatarChanged(const SEBinary &avatar, HANDLE hContact)
{
bool result = false;
@@ -8,7 +8,7 @@ bool CSkypeProto::IsAvatarChanged(const SEBinary &avatar) ::mir_md5_hash((PBYTE)avatar.data(), (int)avatar.size(), digest);
DBVARIANT dbv;
- ::db_get(NULL, this->m_szModuleName, "AvatarHash", &dbv);
+ ::db_get(hContact, this->m_szModuleName, "AvatarHash", &dbv);
if (dbv.type == DBVT_BLOB && dbv.pbVal && dbv.cpbVal == 16)
{
if (::memcmp(digest, dbv.pbVal, 16) == 0)
@@ -56,7 +56,7 @@ int CSkypeProto::DetectAvatarFormat(const wchar_t *path) wchar_t * CSkypeProto::GetContactAvatarFilePath(HANDLE hContact)
{
- wchar_t *path = new wchar_t[MAX_PATH];
+ wchar_t *path = (wchar_t*)::mir_alloc(MAX_PATH * sizeof(wchar_t));
this->InitCustomFolders();
@@ -78,7 +78,7 @@ wchar_t * CSkypeProto::GetContactAvatarFilePath(HANDLE hContact) ::mir_sntprintf(path, MAX_PATH, _T("%s\\%s avatar.jpg"), path, sid);
else
{
- delete [] path;
+ ::mir_free(path);
return NULL;
}
@@ -94,7 +94,7 @@ INT_PTR __cdecl CSkypeProto::GetAvatarInfo(WPARAM, LPARAM lParam) return GAIR_NOAVATAR;
}
- wchar_t *sid = ::db_get_wsa(pai->hContact, this->m_szModuleName, SKYPE_SETTINGS_LOGIN);
+ mir_ptr<wchar_t> sid = ::db_get_wsa(pai->hContact, this->m_szModuleName, SKYPE_SETTINGS_LOGIN);
if (sid)
{
wchar_t *path = this->GetContactAvatarFilePath(pai->hContact);
@@ -105,7 +105,7 @@ INT_PTR __cdecl CSkypeProto::GetAvatarInfo(WPARAM, LPARAM lParam) return GAIR_SUCCESS;
}
- ::mir_free(sid);
+ ::mir_free(path);
}
return GAIR_NOAVATAR;
@@ -160,10 +160,10 @@ INT_PTR __cdecl CSkypeProto::GetMyAvatar(WPARAM wParam, LPARAM lParam) return -2;
wchar_t *path = this->GetContactAvatarFilePath(NULL);
- if (path && ::PathFileExists(path))
+ if (path && CSkypeProto::FileExists(path))
{
::wcsncpy((wchar_t *)wParam, path, (int)lParam);
- delete path;
+ ::mir_free(path);
return 0;
}
@@ -178,25 +178,31 @@ INT_PTR __cdecl CSkypeProto::SetMyAvatar(WPARAM, LPARAM lParam) if (path)
{
wchar_t *avatarPath = this->GetContactAvatarFilePath(NULL);
- if (::wcscmp(path, avatarPath) && !::CopyFile(path, avatarPath, FALSE))
+ if ( !::wcscmp(path, avatarPath))
{
- this->Log(L"Failed to copy our avatar to local storage.");
+ this->Log(L"New avatar path are same with old.");
return iRet;
}
- SEBinary avatar = this->GetAvatarBinary(avatarPath);
+ SEBinary avatar = this->GetAvatarBinary(path);
if (avatar.size() == 0)
{
this->Log(L"Failed to read avatar file.");
return iRet;
}
- if (!this->IsAvatarChanged(avatar))
+ if (this->IsAvatarChanged(avatar))
{
this->Log(L"New avatar are same with old.");
return iRet;
}
+ if ( !::CopyFile(path, avatarPath, FALSE))
+ {
+ this->Log(L"Failed to copy new avatar to local storage.");
+ return iRet;
+ }
+
Skype::VALIDATERESULT result = Skype::NOT_VALIDATED;
if (!this->account->SetAvatar(avatar, result))
{
@@ -207,6 +213,8 @@ INT_PTR __cdecl CSkypeProto::SetMyAvatar(WPARAM, LPARAM lParam) uint newTS = this->account->GetUintProp(/* *::P_AVATAR_TIMESTAMP */ 182);
::db_set_dw(NULL, this->m_szModuleName, "AvatarTS", newTS);
iRet = 0;
+
+ ::mir_free(avatarPath);
}
else
{
@@ -216,4 +224,29 @@ INT_PTR __cdecl CSkypeProto::SetMyAvatar(WPARAM, LPARAM lParam) }
return iRet;
+}
+
+SEBinary CSkypeProto::GetAvatarBinary(wchar_t *path)
+{
+ SEBinary avatar;
+
+ if (CSkypeProto::FileExists(path))
+ {
+ int len;
+ char *buffer;
+ FILE* fp = ::_wfopen(path, L"rb");
+ if (fp)
+ {
+ ::fseek(fp, 0, SEEK_END);
+ len = ::ftell(fp);
+ ::fseek(fp, 0, SEEK_SET);
+ buffer = new char[len + 1];
+ ::fread(buffer, len, 1, fp);
+ ::fclose(fp);
+
+ avatar.set(buffer, len);
+ }
+ }
+
+ return avatar;
}
\ No newline at end of file diff --git a/protocols/Skype/src/skype_profile.cpp b/protocols/Skype/src/skype_profile.cpp index 31c81d9a97..90ca29133a 100644 --- a/protocols/Skype/src/skype_profile.cpp +++ b/protocols/Skype/src/skype_profile.cpp @@ -41,17 +41,16 @@ SettingItem CSkypeProto::setting[] = { void CSkypeProto::UpdateProfileAvatar(SEObject *obj, HANDLE hContact)
{
uint newTS = hContact ? obj->GetUintProp(Contact::P_AVATAR_TIMESTAMP) : obj->GetUintProp(Account::P_AVATAR_TIMESTAMP);
+ if (!newTS) return;
+
DWORD oldTS = ::db_get_dw(hContact, this->m_szModuleName, "AvatarTS", 0);
-
- wchar_t *path = this->GetContactAvatarFilePath(hContact);
- SEBinary data = hContact ? obj->GetBinProp(Contact::P_AVATAR_IMAGE) : obj->GetBinProp(Account::P_AVATAR_IMAGE);
- bool hasNewAvatar = newTS > oldTS;
- bool isAvatarEmpty = data.size() == 0;
- bool isAvatarFileExists = ::PathFileExists(path) > 0;
- if ( !isAvatarEmpty)
+ wchar_t *path = this->GetContactAvatarFilePath(hContact);
+ bool isAvatarFileExists = CSkypeProto::FileExists(path);
+ if (newTS > oldTS || !isAvatarFileExists)
{
- if (hasNewAvatar || !isAvatarFileExists)
+ SEBinary data = hContact ? obj->GetBinProp(Contact::P_AVATAR_IMAGE) : obj->GetBinProp(Account::P_AVATAR_IMAGE);
+ if (data.size() > 0)
{
FILE *fp = ::_wfopen(path, L"wb");
if (fp)
@@ -81,14 +80,14 @@ void CSkypeProto::UpdateProfileAvatar(SEObject *obj, HANDLE hContact) }
}
}
- }
- else if (isAvatarFileExists)
- {
- ::_wremove(path);
- this->SendBroadcast(hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, NULL, 0);
+ else if (isAvatarFileExists)
+ {
+ ::_wremove(path);
+ this->SendBroadcast(hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS, NULL, 0);
+ }
}
- delete [] path;
+ ::mir_free(path);
}
void CSkypeProto::UpdateProfileAboutText(SEObject *obj, HANDLE hContact)
@@ -331,7 +330,7 @@ void CSkypeProto::UpdateProfileTimezone(SEObject *obj, HANDLE hContact) void CSkypeProto::UpdateProfile(SEObject *obj, HANDLE hContact)
{
- this->UpdateProfileAvatar(obj, hContact);
+ //this->UpdateProfileAvatar(obj, hContact);
uint newTS = hContact ? obj->GetUintProp(Contact::P_PROFILE_TIMESTAMP) : obj->GetUintProp(Account::P_PROFILE_TIMESTAMP);
if (newTS > ::db_get_dw(hContact, this->m_szModuleName, "ProfileTS", 0))
@@ -376,6 +375,6 @@ void __cdecl CSkypeProto::LoadOwnInfo(void *) mir_ptr<wchar_t> nick = ::mir_utf8decodeW(data);
::db_set_ws(NULL, this->m_szModuleName, "Nick", nick);
}
-
+ this->UpdateProfileAvatar(this->account.fetch());
this->UpdateProfile(this->account.fetch());
}
\ No newline at end of file diff --git a/protocols/Skype/src/skype_proto.h b/protocols/Skype/src/skype_proto.h index f42d581b35..bb8388c669 100644 --- a/protocols/Skype/src/skype_proto.h +++ b/protocols/Skype/src/skype_proto.h @@ -222,7 +222,7 @@ protected: void OnAccountChanged(int prop);
// avatars
- bool IsAvatarChanged(const SEBinary &avatar);
+ bool IsAvatarChanged(const SEBinary &avatar, HANDLE hContact = NULL);
static int DetectAvatarFormatBuffer(const char *pBuffer);
static int DetectAvatarFormat(const wchar_t *path);
@@ -234,6 +234,8 @@ protected: INT_PTR __cdecl GetMyAvatar(WPARAM, LPARAM);
INT_PTR __cdecl SetMyAvatar(WPARAM, LPARAM);
+ SEBinary GetAvatarBinary(wchar_t *path);
+
// messages
void OnMessage(CConversation::Ref conversation, CMessage::Ref message);
void OnMessageSended(CConversation::Ref &conversation, CMessage::Ref &message);
@@ -357,7 +359,7 @@ protected: int SkypeToMirandaStatus(CContact::AVAILABILITY availability);
CContact::AVAILABILITY MirandaToSkypeStatus(int status);
- SEBinary GetAvatarBinary(wchar_t *path);
+ static bool FileExists(wchar_t *path);
// instances
static LIST<CSkypeProto> instanceList;
diff --git a/protocols/Skype/src/skype_utils.cpp b/protocols/Skype/src/skype_utils.cpp index 7201041afe..2bd14e00a5 100644 --- a/protocols/Skype/src/skype_utils.cpp +++ b/protocols/Skype/src/skype_utils.cpp @@ -505,27 +505,16 @@ CContact::AVAILABILITY CSkypeProto::MirandaToSkypeStatus(int status) return availability;
}
-SEBinary CSkypeProto::GetAvatarBinary(wchar_t *path)
+bool CSkypeProto::FileExists(wchar_t *path)
{
- SEBinary avatar;
-
- if (::PathFileExists(path))
+ //return ::GetFileAttributes(fileName) != DWORD(-1)
+ WIN32_FIND_DATA wfd;
+ HANDLE hFind = ::FindFirstFile(path, &wfd);
+ if (INVALID_HANDLE_VALUE != hFind)
{
- int len;
- char *buffer;
- FILE* fp = ::_wfopen(path, L"rb");
- if (fp)
- {
- ::fseek(fp, 0, SEEK_END);
- len = ::ftell(fp);
- ::fseek(fp, 0, SEEK_SET);
- buffer = new char[len + 1];
- ::fread(buffer, len, 1, fp);
- ::fclose(fp);
-
- avatar.set(buffer, len);
- }
+ ::FindClose(hFind);
+ return true;
}
+ return false;
+}
- return avatar;
-}
\ No newline at end of file |