diff options
-rw-r--r-- | MySpace/proto.cpp | 48 | ||||
-rw-r--r-- | MySpace/server_con.cpp | 83 | ||||
-rw-r--r-- | MySpace/version.h | 2 |
3 files changed, 97 insertions, 36 deletions
diff --git a/MySpace/proto.cpp b/MySpace/proto.cpp index 48d65ad..0cdf64d 100644 --- a/MySpace/proto.cpp +++ b/MySpace/proto.cpp @@ -332,23 +332,53 @@ int SendTyping(WPARAM wParam, LPARAM lParam) { return 0;
}
+bool FileExists(char *filename) {
+ HANDLE hFile = CreateFileA(filename, 0, 0, 0, OPEN_EXISTING, 0, 0);
+ if(hFile != INVALID_HANDLE_VALUE) {
+ CloseHandle(hFile);
+ return true;
+ }
+}
+
int GetAvatarInfo(WPARAM wParam,LPARAM lParam) {
if (DBGetContactSettingByte(0, MODULE, "EnableAvatars", 1) == 0)
return GAIR_NOAVATAR;
PROTO_AVATAR_INFORMATION* AI = ( PROTO_AVATAR_INFORMATION* )lParam;
- DBVARIANT dbv;
- if(!DBGetContactSetting(AI->hContact, MODULE, "AvatarFilename", &dbv)) {
- strncpy(AI->filename, dbv.pszVal, sizeof(AI->filename));
- DBFreeVariant(&dbv);
- return GAIR_SUCCESS;
- } else if((wParam && GAIF_FORCE) != 0 && status > ID_STATUS_OFFLINE && !DBGetContactSetting(AI->hContact, MODULE, "ImageURL", &dbv)) {
- DownloadAvatar(AI->hContact, dbv.pszVal);
+ int ret = GAIR_NOAVATAR;
+ DBVARIANT dbv, dbv2;
+
+ bool url_exists = (DBGetContactSetting(AI->hContact, MODULE, "ImageURL", &dbv) == 0);
+ if(!url_exists) {
DBFreeVariant(&dbv);
- return GAIR_WAITFOR;
- } else
return GAIR_NOAVATAR;
+ }
+
+ bool online = (status > ID_STATUS_OFFLINE);
+ bool force = ((wParam & GAIF_FORCE) != 0);
+ bool file_exists = (DBGetContactSetting(AI->hContact, MODULE, "AvatarFilename", &dbv2) == 0) && FileExists(dbv2.pszVal);
+
+ if(force && online) {
+ if(file_exists) {
+ DeleteFileA(dbv2.pszVal);
+ DBDeleteContactSetting(0, MODULE, "AvatarFilename");
+ }
+ DownloadAvatar(AI->hContact, dbv.pszVal);
+ ret = GAIR_WAITFOR;
+ } else if(file_exists) {
+ strncpy(AI->filename, dbv2.pszVal, sizeof(AI->filename));
+ ret = GAIR_SUCCESS;
+ } else if(online) {
+ DownloadAvatar(AI->hContact, dbv.pszVal);
+ ret = GAIR_WAITFOR;
+ } else {
+ ret = GAIR_NOAVATAR;
+ }
+
+ DBFreeVariant(&dbv);
+ if(file_exists) DBFreeVariant(&dbv2);
+ return ret;
}
diff --git a/MySpace/server_con.cpp b/MySpace/server_con.cpp index 5131655..47624ba 100644 --- a/MySpace/server_con.cpp +++ b/MySpace/server_con.cpp @@ -35,6 +35,13 @@ int signon_status = ID_STATUS_ONLINE; char signon_status_msg[512] = {0};
bool WriteData(char *fn, int fn_size, char *data, int data_size) {
+ char szTempPath[MAX_PATH], szTempFileName[MAX_PATH];
+
+ if (GetTempPathA(sizeof(szTempPath), szTempPath) <= 0) lstrcpyA( szTempPath, ".\\" );
+
+ mir_snprintf(szTempFileName, MAX_PATH, "%s%s", szTempPath, fn);
+ mir_snprintf(fn, fn_size, "%s", szTempFileName);
+
// prepend dir to filename & create dir?
HANDLE hSaveFile = CreateFileA(fn, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(hSaveFile == INVALID_HANDLE_VALUE) return false;
@@ -42,7 +49,6 @@ bool WriteData(char *fn, int fn_size, char *data, int data_size) { unsigned long bytes_written = 0;
bool ret = false;
if(WriteFile(hSaveFile, data, data_size, &bytes_written, NULL) == TRUE) ret = true;
-
CloseHandle(hSaveFile);
return ret;
}
@@ -553,17 +559,40 @@ void __cdecl ServerThreadFunc(void*) { } else if(strcmp(kv.first.text, "ImageURL") == 0) {
DBVARIANT dbv;
if(!DBGetContactSettingStringUtf(hContact, MODULE, "ImageURL", &dbv)) {
- if(strcmp(kv.first.text, dbv.pszVal) != 0) {
+ if(strcmp(kv.second.text, dbv.pszVal) != 0) {
// avatar changed
- DBDeleteContactSetting(hContact, MODULE, "AvatarFilename");
- if(uid == my_uid) DBDeleteContactSetting(0, MODULE, "AvatarFilename");
+ DBVARIANT dbv2;
+ if(!DBGetContactSettingStringUtf(hContact, MODULE, "AvatarFilename", &dbv2)) {
+ DeleteFileA(dbv2.pszVal);
+ DBFreeVariant(&dbv2);
+ DBDeleteContactSetting(hContact, MODULE, "AvatarFilename");
+ }
DBWriteContactSettingStringUtf(hContact, MODULE, kv.first.text, kv.second.text);
- if(uid == my_uid) DBWriteContactSettingStringUtf(0, MODULE, kv.first.text, kv.second.text);
+ DownloadAvatar(hContact, kv.second.text);
}
DBFreeVariant(&dbv);
}else {
DBWriteContactSettingStringUtf(hContact, MODULE, kv.first.text, kv.second.text);
- if(uid == my_uid) DBWriteContactSettingStringUtf(0, MODULE, kv.first.text, kv.second.text);
+ DownloadAvatar(hContact, kv.second.text);
+ }
+ if(uid == my_uid) { // same again for null hContact
+ if(!DBGetContactSettingStringUtf(0, MODULE, "ImageURL", &dbv)) {
+ if(strcmp(kv.second.text, dbv.pszVal) != 0) {
+ // avatar changed
+ DBVARIANT dbv2;
+ if(!DBGetContactSettingStringUtf(0, MODULE, "AvatarFilename", &dbv2)) {
+ DeleteFileA(dbv2.pszVal);
+ DBFreeVariant(&dbv2);
+ DBDeleteContactSetting(0, MODULE, "AvatarFilename");
+ }
+ DBWriteContactSettingStringUtf(0, MODULE, kv.first.text, kv.second.text);
+ DownloadAvatar(0, kv.second.text);
+ }
+ DBFreeVariant(&dbv);
+ }else {
+ DBWriteContactSettingStringUtf(0, MODULE, kv.first.text, kv.second.text);
+ DownloadAvatar(0, kv.second.text);
+ }
}
} else {
DBWriteContactSettingStringUtf(hContact, MODULE, kv.first.text, kv.second.text);
@@ -889,27 +918,29 @@ void __cdecl sttDownloadAvatar(void *param) { int uid = DBGetContactSettingDword(info->hContact, MODULE, "UID", 0);
char fn[MAX_PATH];
- char buff[128];
- mir_snprintf(fn, MAX_PATH, "%s_%s.%s", _itoa(uid, buff, 10), _itoa((int)time(0), buff, 10), ext);
-
- WriteData(fn, MAX_PATH, nlhrReply->pData, nlhrReply->dataLength);
-
- PROTO_AVATAR_INFORMATION AI = {0};
- AI.cbSize = sizeof(PROTO_AVATAR_INFORMATION);
- AI.hContact = info->hContact;
- strncpy(AI.filename, fn, MAX_PATH);
- AI.format =
- (stricmp(ext, ".png") ? PA_FORMAT_PNG :
- (stricmp(ext, ".jpg") ? PA_FORMAT_JPEG :
- (stricmp(ext, ".jpeg") ? PA_FORMAT_JPEG :
- (stricmp(ext, ".gif") ? PA_FORMAT_GIF :
- (stricmp(ext, ".swf") ? PA_FORMAT_SWF : PA_FORMAT_UNKNOWN)))));
-
-
- CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)nlhrReply);
- ProtoBroadcastAck(MODULE,info->hContact,ACKTYPE_AVATAR,ACKRESULT_SUCCESS,(HANDLE) &AI, 0);
+ char buff[128], tbuff[128];
+ mir_snprintf(fn, MAX_PATH, "%s_%s.%s", _itoa(uid, buff, 10), _itoa(GetTickCount(), tbuff, 10), ext);
+
+ if(WriteData(fn, MAX_PATH, nlhrReply->pData, nlhrReply->dataLength)) {
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)nlhrReply);
+ DBWriteContactSettingStringUtf(info->hContact, MODULE, "AvatarFilename", fn);
+
+ PROTO_AVATAR_INFORMATION AI = {0};
+ AI.cbSize = sizeof(PROTO_AVATAR_INFORMATION);
+ AI.hContact = info->hContact;
+ strncpy(AI.filename, fn, MAX_PATH);
+ AI.format =
+ (stricmp(ext, ".png") ? PA_FORMAT_PNG :
+ (stricmp(ext, ".jpg") ? PA_FORMAT_JPEG :
+ (stricmp(ext, ".jpeg") ? PA_FORMAT_JPEG :
+ (stricmp(ext, ".gif") ? PA_FORMAT_GIF :
+ (stricmp(ext, ".swf") ? PA_FORMAT_SWF : PA_FORMAT_UNKNOWN)))));
+
+ ProtoBroadcastAck(MODULE,info->hContact,ACKTYPE_AVATAR,ACKRESULT_SUCCESS,(HANDLE) &AI, 0);
+ } else
+ ProtoBroadcastAck(MODULE,info->hContact,ACKTYPE_AVATAR,ACKRESULT_FAILED, 0, 0);
} else
- ProtoBroadcastAck(MODULE,info->hContact,ACKTYPE_AVATAR,ACKRESULT_FAILED,0, 0);
+ ProtoBroadcastAck(MODULE,info->hContact,ACKTYPE_AVATAR,ACKRESULT_FAILED, 0, 0);
free_and_exit:
free(info->url);
diff --git a/MySpace/version.h b/MySpace/version.h index c2ef289..8dcc3b3 100644 --- a/MySpace/version.h +++ b/MySpace/version.h @@ -5,7 +5,7 @@ #define __MAJOR_VERSION 0
#define __MINOR_VERSION 0
#define __RELEASE_NUM 1
-#define __BUILD_NUM 18
+#define __BUILD_NUM 19
#define __FILEVERSION_STRING __MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM
#define __FILEVERSION_STRING_DOTS __MAJOR_VERSION.__MINOR_VERSION.__RELEASE_NUM.__BUILD_NUM
|