/* * Getting Status message (Away message) * -1 for XStatus, 1 for Status */ int GetStatusMessage(TCHAR *text, int text_size, PDNCE pdnce, BOOL xstatus_has_priority) { DBVARIANT dbv={0}; BOOL noAwayMsg=FALSE; WORD wStatus=pdnce___GetStatus( pdnce ); text[0] = '\0'; // Hide status text if Offline /// no offline if (wStatus==ID_STATUS_OFFLINE || wStatus==0) noAwayMsg=TRUE; // Get XStatusMsg if (!noAwayMsg &&xstatus_has_priority && pdnce->m_cache_hContact && pdnce->m_cache_cszProto) { // Try to get XStatusMsg if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "XStatusMsg", &dbv)) { //lstrcpyn(text, dbv.pszVal, text_size); CopySkipUnprintableChars(text, dbv.ptszVal, text_size-1); ModernDBFreeVariant(&dbv); if (text[0] != '\0') return -1; } } // Get StatusMsg if (pdnce->m_cache_hContact && text[0] == '\0') { if (!ModernGetSettingTString(pdnce->m_cache_hContact, "CList", "StatusMsg", &dbv)) { //lstrcpyn(text, dbv.pszVal, text_size); CopySkipUnprintableChars(text, dbv.ptszVal, text_size-1); ModernDBFreeVariant(&dbv); if (text[0] != '\0') return 1; } } // Get XStatusMsg if (!noAwayMsg && !xstatus_has_priority && pdnce->m_cache_hContact && pdnce->m_cache_cszProto && text[0] == '\0') { // Try to get XStatusMsg if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "XStatusMsg", &dbv)) { //lstrcpyn(text, dbv.pszVal, text_size); CopySkipUnprintableChars(text, dbv.ptszVal, text_size-1); ModernDBFreeVariant(&dbv); if (text[0] != '\0') return -1; } } return 1; }
/* * Getting Status name * -1 for XStatus, 1 for Status */ int GetStatusName(TCHAR *text, int text_size, PDNCE pdnce, BOOL xstatus_has_priority) { BOOL noAwayMsg=FALSE; BOOL noXstatus=FALSE; // Hide status text if Offline /// no offline WORD nStatus=pdnce___GetStatus( pdnce ); if ((nStatus==ID_STATUS_OFFLINE || nStatus==0) && g_CluiData.bRemoveAwayMessageForOffline) noAwayMsg=TRUE; if (nStatus==ID_STATUS_OFFLINE || nStatus==0) noXstatus=TRUE; text[0] = '\0'; // Get XStatusName if (!noAwayMsg&& !noXstatus&& xstatus_has_priority && pdnce->m_cache_hContact && pdnce->m_cache_cszProto) { DBVARIANT dbv={0}; if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "XStatusName", &dbv)) { //lstrcpyn(text, dbv.pszVal, text_size); CopySkipUnprintableChars(text, dbv.ptszVal, text_size-1); ModernDBFreeVariant(&dbv); if (text[0] != '\0') return -1; } } // Get Status name { TCHAR *tmp = (TCHAR *)CallService(MS_CLIST_GETSTATUSMODEDESCRIPTION, (WPARAM)nStatus, GSMDF_TCHAR_MY); lstrcpyn(text, tmp, text_size); //CopySkipUnprintableChars(text, dbv.pszVal, text_size-1); if (text[0] != '\0') return 1; } // Get XStatusName if (!noAwayMsg && !noXstatus && !xstatus_has_priority && pdnce->m_cache_hContact && pdnce->m_cache_cszProto) { DBVARIANT dbv={0}; if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "XStatusName", &dbv)) { //lstrcpyn(text, dbv.pszVal, text_size); CopySkipUnprintableChars(text, dbv.ptszVal, text_size-1); ModernDBFreeVariant(&dbv); if (text[0] != '\0') return -1; } } return 1; }
/* * Get Listening to information */ void GetListeningTo(TCHAR *text, int text_size, PDNCE pdnce) { DBVARIANT dbv={0}; WORD wStatus=pdnce___GetStatus( pdnce ); text[0] = _T('\0'); if (wStatus==ID_STATUS_OFFLINE || wStatus==0) return; if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "ListeningTo", &dbv)) { CopySkipUnprintableChars(text, dbv.ptszVal, text_size-1); ModernDBFreeVariant(&dbv); } }
/* * Get the text for First Line */ void Cache_GetFirstLineText(struct ClcData *dat, struct ClcContact *contact) { if (GetCurrentThreadId()!=g_dwMainThreadID) return; PDNCE pdnce=(PDNCE)pcli->pfnGetCacheEntry(contact->hContact); TCHAR *name = pcli->pfnGetContactDisplayName(contact->hContact,0); if (dat->first_line_append_nick && (!dat->force_in_dialog)) { DBVARIANT dbv = {0}; if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "Nick", &dbv)) { TCHAR nick[SIZEOF(contact->szText)]; lstrcpyn(nick, dbv.ptszVal, SIZEOF(contact->szText)); ModernDBFreeVariant(&dbv); if (_tcsnicmp(name, nick, lstrlen(name)) == 0) { // They are the same -> use the nick to keep the case lstrcpyn(contact->szText, nick, SIZEOF(contact->szText)); } else if (_tcsnicmp(name, nick, lstrlen(nick)) == 0) { // They are the same -> use the nick to keep the case lstrcpyn(contact->szText, name, SIZEOF(contact->szText)); } else { // Append then mir_sntprintf(contact->szText, SIZEOF(contact->szText), _T("%s - %s"), name, nick); } } else { lstrcpyn(contact->szText, name, SIZEOF(contact->szText)); } } else { lstrcpyn(contact->szText, name, SIZEOF(contact->szText)); } if (!dat->force_in_dialog) { struct SHORTDATA data={0}; Sync(CLUI_SyncGetShortData,(WPARAM)pcli->hwndContactTree,(LPARAM)&data); contact->ssText.ReplaceSmileys(&data, pdnce, contact->szText, dat->first_line_draw_smileys); } }
void Cache_GetAvatar(struct ClcData *dat, struct ClcContact *contact) { int old_pos=contact->avatar_pos; if (g_CluiData.bSTATE!=STATE_NORMAL || (dat->use_avatar_service && !ServiceExists(MS_AV_GETAVATARBITMAP)) ) // workaround for avatar service and other wich destroys service on OK_TOEXIT { contact->avatar_pos = AVATAR_POS_DONT_HAVE; contact->avatar_data = NULL; return; } if (dat->use_avatar_service && ServiceExists(MS_AV_GETAVATARBITMAP)) { if (dat->avatars_show && !ModernGetSettingByte(contact->hContact, "CList", "HideContactAvatar", 0)) { contact->avatar_data = (struct avatarCacheEntry *)CallService(MS_AV_GETAVATARBITMAP, (WPARAM)contact->hContact, 0); if (contact->avatar_data == NULL || contact->avatar_data->cbSize != sizeof(struct avatarCacheEntry) || contact->avatar_data->dwFlags == AVS_BITMAP_EXPIRED) { contact->avatar_data = NULL; } if (contact->avatar_data != NULL) { contact->avatar_data->t_lastAccess = (DWORD)time(NULL); } } else { contact->avatar_data = NULL; } Cache_ProceedAvatarInList(dat, contact); } else { contact->avatar_pos = AVATAR_POS_DONT_HAVE; if (dat->avatars_show && !ModernGetSettingByte(contact->hContact, "CList", "HideContactAvatar", 0)) { DBVARIANT dbv; if (!ModernGetSettingTString(contact->hContact, "ContactPhoto", "File", &dbv)) { HBITMAP hBmp = (HBITMAP) CallService(MS_UTILS_LOADBITMAPT, 0, (LPARAM)dbv.ptszVal); if (hBmp != NULL) { // Make bounds BITMAP bm; if (GetObject(hBmp,sizeof(BITMAP),&bm)) { // Create data... HDC hdc; HBITMAP hDrawBmp,oldBmp; // Make bounds -> keep aspect radio LONG width_clip; LONG height_clip; RECT rc = {0}; // Clipping width and height width_clip = dat->avatars_maxheight_size; height_clip = dat->avatars_maxheight_size; if (height_clip * bm.bmWidth / bm.bmHeight <= width_clip) { width_clip = height_clip * bm.bmWidth / bm.bmHeight; } else { height_clip = width_clip * bm.bmHeight / bm.bmWidth; } // Create objs hdc = CreateCompatibleDC(dat->avatar_cache.hdc); hDrawBmp = ske_CreateDIB32(width_clip, height_clip); oldBmp=(HBITMAP)SelectObject(hdc, hDrawBmp); SetBkMode(hdc,TRANSPARENT); { POINT org; GetBrushOrgEx(hdc, &org); SetStretchBltMode(hdc, HALFTONE); SetBrushOrgEx(hdc, org.x, org.y, NULL); } rc.right = width_clip - 1; rc.bottom = height_clip - 1; // Draw bitmap 8//8 { HDC dcMem = CreateCompatibleDC(hdc); HBITMAP obmp=(HBITMAP)SelectObject(dcMem, hBmp); StretchBlt(hdc, 0, 0, width_clip, height_clip,dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); SelectObject(dcMem,obmp); mod_DeleteDC(dcMem); } { RECT rtr={0}; rtr.right=width_clip+1; rtr.bottom=height_clip+1; ske_SetRectOpaque(hdc,&rtr); } hDrawBmp = (HBITMAP)GetCurrentObject(hdc, OBJ_BITMAP); SelectObject(hdc,oldBmp); mod_DeleteDC(hdc); // Add to list if (old_pos >= 0) { ImageArray_ChangeImage(&dat->avatar_cache, hDrawBmp, old_pos); contact->avatar_pos = old_pos; } else { contact->avatar_pos = ImageArray_AddImage(&dat->avatar_cache, hDrawBmp, -1); } DeleteObject(hDrawBmp); } // if (GetObject(hBmp,sizeof(BITMAP),&bm)) DeleteObject(hBmp); } //if (hBmp != NULL) } ModernDBFreeVariant(&dbv); } // Remove avatar if needed if (old_pos >= 0 && contact->avatar_pos == AVATAR_POS_DONT_HAVE) { ImageArray_RemoveImage(&dat->avatar_cache, old_pos); // Update all items ExecuteOnAllContacts(dat, ReduceAvatarPosition, (void *)&old_pos); } if (old_pos==AVATAR_POS_ANIMATED && contact->avatar_pos != AVATAR_POS_ANIMATED) { AniAva_RemoveAvatar( contact->hContact ); } } }
/* * Get the text for specified lines */ int Cache_GetLineText(PDNCE pdnce, int type, LPTSTR text, int text_size, TCHAR *variable_text, BOOL xstatus_has_priority, BOOL show_status_if_no_away, BOOL show_listening_if_no_away, BOOL use_name_and_message_for_xstatus, BOOL pdnce_time_show_only_if_different) { text[0] = '\0'; switch(type) { case TEXT_STATUS: { if (GetStatusName(text, text_size, pdnce, xstatus_has_priority) == -1 && use_name_and_message_for_xstatus) { DBVARIANT dbv={0}; // Try to get XStatusMsg if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "XStatusMsg", &dbv)) { if (dbv.ptszVal != NULL && dbv.ptszVal[0] != 0) { TCHAR *tmp = mir_tstrdup(text); mir_sntprintf(text, text_size, TEXT("%s: %s"), tmp, dbv.pszVal); mir_free_and_nill(tmp); CopySkipUnprintableChars(text, text, text_size-1); } ModernDBFreeVariant(&dbv); } } return TEXT_STATUS; } case TEXT_NICKNAME: { if (pdnce->m_cache_hContact && pdnce->m_cache_cszProto) { DBVARIANT dbv={0}; if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "Nick", &dbv)) { lstrcpyn(text, dbv.ptszVal, text_size); ModernDBFreeVariant(&dbv); CopySkipUnprintableChars(text, text, text_size-1); } } return TEXT_NICKNAME; } case TEXT_STATUS_MESSAGE: { if (GetStatusMessage(text, text_size, pdnce, xstatus_has_priority) == -1 && use_name_and_message_for_xstatus) { DBVARIANT dbv={0}; // Try to get XStatusName if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "XStatusName", &dbv)) { if (dbv.pszVal != NULL && dbv.pszVal[0] != 0) { TCHAR *tmp = mir_tstrdup(text); mir_sntprintf(text, text_size, TEXT("%s: %s"), dbv.pszVal, tmp); mir_free_and_nill(tmp); } CopySkipUnprintableChars(text, text, text_size-1); ModernDBFreeVariant(&dbv); } } else if (use_name_and_message_for_xstatus && xstatus_has_priority) { DBVARIANT dbv={0}; // Try to get XStatusName if (!ModernGetSettingTString(pdnce->m_cache_hContact, pdnce->m_cache_cszProto, "XStatusName", &dbv)) { if (dbv.pszVal != NULL && dbv.pszVal[0] != 0) mir_sntprintf(text, text_size, TEXT("%s"), dbv.pszVal); CopySkipUnprintableChars(text, text, text_size-1); ModernDBFreeVariant(&dbv); } } if (text[0] == '\0') { if (show_listening_if_no_away) { Cache_GetLineText(pdnce, TEXT_LISTENING_TO, text, text_size, variable_text, xstatus_has_priority, 0, 0, use_name_and_message_for_xstatus, pdnce_time_show_only_if_different); if (text[0] != '\0') return TEXT_LISTENING_TO; } if (show_status_if_no_away) { //re-request status if no away return Cache_GetLineText(pdnce, TEXT_STATUS, text, text_size, variable_text, xstatus_has_priority, 0, 0, use_name_and_message_for_xstatus, pdnce_time_show_only_if_different); } } return TEXT_STATUS_MESSAGE; } case TEXT_LISTENING_TO: { GetListeningTo(text, text_size, pdnce); return TEXT_LISTENING_TO; } case TEXT_TEXT: { TCHAR *tmp = variables_parsedup(variable_text, pdnce->m_cache_tcsName, pdnce->m_cache_hContact); lstrcpyn(text, tmp, text_size); if (tmp) free(tmp); CopySkipUnprintableChars(text, text, text_size-1); return TEXT_TEXT; } case TEXT_CONTACT_TIME: { if (pdnce->hTimeZone) { // Get pdnce time text[0] = 0; tmi.printDateTime( pdnce->hTimeZone, _T("t"), text, text_size, 0); } return TEXT_CONTACT_TIME; } } return TEXT_EMPTY; }
int __fastcall CLVM_GetContactHiddenStatus(HANDLE hContact, char *szProto, struct ClcData *dat) { int dbHidden = ModernGetSettingByte(hContact, "CList", "Hidden", 0); // default hidden state, always respect it. int filterResult = 1; DBVARIANT dbv = {0}; char szTemp[64]; TCHAR szGroupMask[256]; DWORD dwLocalMask; PDNCE pdnce=(PDNCE)pcli->pfnGetCacheEntry(hContact); BOOL fEmbedded=dat->force_in_dialog; // always hide subcontacts (but show them on embedded contact lists) if(g_CluiData.bMetaAvail && dat != NULL && dat->IsMetaContactsEnabled && g_szMetaModuleName && ModernGetSettingByte(hContact, g_szMetaModuleName, "IsSubcontact", 0)) return -1; //subcontact if (pdnce && pdnce->isUnknown && !fEmbedded) return 1; //'Unknown Contact' if(pdnce && g_CluiData.bFilterEffective && !fEmbedded) { if(szProto == NULL) szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); // check stickies first (priority), only if we really have stickies defined (CLVM_STICKY_CONTACTS is set). if(g_CluiData.bFilterEffective & CLVM_STICKY_CONTACTS) { if((dwLocalMask = ModernGetSettingDword(hContact, CLVM_MODULE, g_CluiData.current_viewmode, 0)) != 0) { if(g_CluiData.bFilterEffective & CLVM_FILTER_STICKYSTATUS) { WORD wStatus = ModernGetSettingWord(hContact, szProto, "Status", ID_STATUS_OFFLINE); return !((1 << (wStatus - ID_STATUS_OFFLINE)) & HIWORD(dwLocalMask)); } return 0; } } // check the proto, use it as a base filter result for all further checks if(g_CluiData.bFilterEffective & CLVM_FILTER_PROTOS) { mir_snprintf(szTemp, SIZEOF(szTemp), "%s|", szProto); filterResult = strstr(g_CluiData.protoFilter, szTemp) ? 1 : 0; } if(g_CluiData.bFilterEffective & CLVM_FILTER_GROUPS) { if(!ModernGetSettingTString(hContact, "CList", "Group", &dbv)) { mir_sntprintf(szGroupMask, SIZEOF(szGroupMask), _T("%s|"), &dbv.ptszVal[0]); filterResult = (g_CluiData.filterFlags & CLVM_PROTOGROUP_OP) ? (filterResult | (_tcsstr(g_CluiData.groupFilter, szGroupMask) ? 1 : 0)) : (filterResult & (_tcsstr(g_CluiData.groupFilter, szGroupMask) ? 1 : 0)); mir_free(dbv.ptszVal); } else if(g_CluiData.filterFlags & CLVM_INCLUDED_UNGROUPED) filterResult = (g_CluiData.filterFlags & CLVM_PROTOGROUP_OP) ? filterResult : filterResult & 1; else filterResult = (g_CluiData.filterFlags & CLVM_PROTOGROUP_OP) ? filterResult : filterResult & 0; } if(g_CluiData.bFilterEffective & CLVM_FILTER_STATUS) { WORD wStatus = ModernGetSettingWord(hContact, szProto, "Status", ID_STATUS_OFFLINE); filterResult = (g_CluiData.filterFlags & CLVM_GROUPSTATUS_OP) ? ((filterResult | ((1 << (wStatus - ID_STATUS_OFFLINE)) & g_CluiData.statusMaskFilter ? 1 : 0))) : (filterResult & ((1 << (wStatus - ID_STATUS_OFFLINE)) & g_CluiData.statusMaskFilter ? 1 : 0)); } if(g_CluiData.bFilterEffective & CLVM_FILTER_LASTMSG) { DWORD now; PDNCE pdnce=(PDNCE)pcli->pfnGetCacheEntry(hContact); if (pdnce) { now = g_CluiData.t_now; now -= g_CluiData.lastMsgFilter; if(g_CluiData.bFilterEffective & CLVM_FILTER_LASTMSG_OLDERTHAN) filterResult = filterResult & (pdnce->dwLastMsgTime < now); else if(g_CluiData.bFilterEffective & CLVM_FILTER_LASTMSG_NEWERTHAN) filterResult = filterResult & (pdnce->dwLastMsgTime > now); } } return (dbHidden | !filterResult); } else return dbHidden; }