void FacebookProto::StickerAsSmiley(std::string sticker, const std::string &url, MCONTACT hContact) { std::string b64 = ptrA(mir_base64_encode((PBYTE)sticker.c_str(), (unsigned)sticker.length())); b64 = utils::url::encode(b64); std::tstring filename = GetAvatarFolder() + _T("\\stickers\\"); ptrT dir(mir_tstrdup(filename.c_str())); filename += (TCHAR*)_A2T(b64.c_str()); filename += _T(".png"); // Check if we have this sticker already and download it it not if (GetFileAttributes(filename.c_str()) == INVALID_FILE_ATTRIBUTES) { HANDLE nlc = NULL; facy.save_url(url, filename, nlc); Netlib_CloseHandle(nlc); } SMADD_CONT cont; cont.cbSize = sizeof(SMADD_CONT); cont.hContact = hContact; cont.type = 0; cont.path = dir; CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, (LPARAM)&cont); }
/* void *p should always be a struct of type update_avatar */ void TwitterProto::UpdateAvatarWorker(void *p) { if(p == 0) return; std::auto_ptr<update_avatar> data( static_cast<update_avatar*>(p)); DBVARIANT dbv = {0}; // db_get_s returns 0 when it suceeds, so if this suceeds it will return 0, or false. // therefore if it returns 1, or true, we want to return as there is no such user. // as a side effect, dbv now has the username in it i think if(db_get_ts(data->hContact,m_szModuleName,TWITTER_KEY_UN,&dbv)) return; std::string ext = data->url.substr(data->url.rfind('.')); // finds the filetype of the avatar std::tstring filename = GetAvatarFolder() + _T('\\') + dbv.ptszVal + (TCHAR*)_A2T(ext.c_str()); // local filename and path db_free(&dbv); PROTO_AVATAR_INFORMATIONT ai = {sizeof(ai)}; ai.hContact = data->hContact; ai.format = ProtoGetAvatarFormat(filename.c_str()); if (ai.format == PA_FORMAT_UNKNOWN) { debugLogA( _T("***** Update avatar: Terminated for this contact, extension format unknown for %s"), data->url.c_str()); return; // lets just ignore unknown formats... if not it crashes miranda. should probably speak to borkra about this. } _tcsncpy(ai.filename,filename.c_str(),MAX_PATH); // puts the local file name in the avatar struct, to a max of 260 chars (as of now) debugLogA( _T("***** Updating avatar: %s"), data->url.c_str()); WaitForSingleObjectEx(avatar_lock_,INFINITE,true); if(CallService(MS_SYSTEM_TERMINATED,0,0)) // if miranda is shutting down... { debugLogA( _T("***** Terminating avatar update early: %s"),data->url.c_str()); return; } if(save_url(hAvatarNetlib_,data->url,filename)) { db_set_s(data->hContact,m_szModuleName,TWITTER_KEY_AV_URL,data->url.c_str()); ProtoBroadcastAck(data->hContact,ACKTYPE_AVATAR,ACKRESULT_SUCCESS,&ai,0); } else ProtoBroadcastAck(data->hContact,ACKTYPE_AVATAR,ACKRESULT_FAILED, &ai,0); ReleaseMutex(avatar_lock_); debugLogA( _T("***** Done avatar: %s"),data->url.c_str()); }
void TwitterProto::UpdateAvatarWorker(void *p) { if(p == 0) return; std::auto_ptr<update_avatar> data( static_cast<update_avatar*>(p) ); DBVARIANT dbv; if(DBGetContactSettingString(data->hContact,m_szModuleName,TWITTER_KEY_UN,&dbv)) return; std::string ext = data->url.substr(data->url.rfind('.')); std::string filename = GetAvatarFolder() + '\\' + dbv.pszVal + ext; DBFreeVariant(&dbv); PROTO_AVATAR_INFORMATION ai = {sizeof(ai)}; ai.hContact = data->hContact; ai.format = ext_to_format(ext); strncpy(ai.filename,filename.c_str(),MAX_PATH); LOG("***** Updating avatar: %s",data->url.c_str()); WaitForSingleObjectEx(avatar_lock_,INFINITE,true); if(CallService(MS_SYSTEM_TERMINATED,0,0)) { LOG("***** Terminating avatar update early: %s",data->url.c_str()); return; } if(save_url(hAvatarNetlib_,data->url,filename)) { DBWriteContactSettingString(data->hContact,m_szModuleName,TWITTER_KEY_AV_URL, data->url.c_str()); ProtoBroadcastAck(m_szModuleName,data->hContact,ACKTYPE_AVATAR, ACKRESULT_SUCCESS,&ai,0); } else ProtoBroadcastAck(m_szModuleName,data->hContact,ACKTYPE_AVATAR, ACKRESULT_FAILED, &ai,0); ReleaseMutex(avatar_lock_); LOG("***** Done avatar: %s",data->url.c_str()); }