void cli_AddContactToTree(HWND hwnd,struct ClcData *dat,HANDLE hContact,int updateTotalCount,int checkHideOffline) { struct ClcGroup *group; struct ClcContact * cont; pdisplayNameCacheEntry cacheEntry=(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hContact); if(dat->IsMetaContactsEnabled && cacheEntry && cacheEntry->HiddenSubcontact) return; //contact should not be added if(!dat->IsMetaContactsEnabled && cacheEntry && !mir_strcmp(cacheEntry->szProto,"MetaContacts")) return; saveAddContactToTree(hwnd,dat,hContact,updateTotalCount,checkHideOffline); if (FindItem(hwnd,dat,hContact,&cont,&group,NULL,FALSE)) { if (cont) { //Add subcontacts if (cont && cont->proto) { cont->SubAllocated=0; if (mir_strcmp(cont->proto,"MetaContacts")==0) AddSubcontacts(dat,cont,IsShowOfflineGroup(group)); } cont->avatar_pos=AVATAR_POS_DONT_HAVE; Cache_GetAvatar(dat,cont); Cache_GetText(dat,cont,1); Cache_GetTimezone(dat,cont->hContact); } } return; }
static struct ClcContact * AddContactToGroup(struct ClcData *dat,struct ClcGroup *group,pdisplayNameCacheEntry cacheEntry) { char *szProto; WORD apparentMode; DWORD idleMode; HANDLE hContact; int i; // DBVARIANT dbv; if (cacheEntry==NULL) return NULL; if (group==NULL) return NULL; if (dat==NULL) return NULL; hContact=cacheEntry->hContact; //ClearClcContactCache(hContact); //ShowTracePopup("AddContactToGroup"); dat->NeedResort=1; for(i=group->contactCount-1;i>=0;i--) if(group->contact[i].type!=CLCIT_INFO || !(group->contact[i].flags&CLCIIF_BELOWCONTACTS)) break; i=AddItemToGroup(group,i+1); group->contact[i].type=CLCIT_CONTACT; group->contact[i].SubAllocated=0; group->contact[i].isSubcontact=0; group->contact[i].subcontacts=NULL; group->contact[i].szText=NULL; group->contact[i].szSecondLineText=NULL; group->contact[i].szThirdLineText=NULL; group->contact[i].image_is_special=FALSE; group->contact[i].status=cacheEntry->status; group->contact[i].iImage=CallService(MS_CLIST_GETCONTACTICON,(WPARAM)hContact,0); cacheEntry=GetContactFullCacheEntry(hContact); group->contact[i].hContact=hContact; group->contact[i].avatar_pos = AVATAR_POS_DONT_HAVE; Cache_GetAvatar(dat, &group->contact[i]); //cacheEntry->ClcContact=&(group->contact[i]); //SetClcContactCacheItem(dat,hContact,&(group->contact[i])); szProto=cacheEntry->szProto; if(szProto!=NULL&&!IsHiddenMode(dat,cacheEntry->status)) group->contact[i].flags|=CONTACTF_ONLINE; apparentMode=szProto!=NULL?cacheEntry->ApparentMode:0; if(apparentMode==ID_STATUS_OFFLINE) group->contact[i].flags|=CONTACTF_INVISTO; else if(apparentMode==ID_STATUS_ONLINE) group->contact[i].flags|=CONTACTF_VISTO; else if(apparentMode) group->contact[i].flags|=CONTACTF_VISTO|CONTACTF_INVISTO; if(cacheEntry->NotOnList) group->contact[i].flags|=CONTACTF_NOTONLIST; idleMode=szProto!=NULL?cacheEntry->IdleTS:0; if (idleMode) group->contact[i].flags|=CONTACTF_IDLE; //lstrcpynA(group->contact[i].szText,cacheEntry->name,sizeof(group->contact[i].szText)); group->contact[i].proto = szProto; Cache_GetText(dat, &group->contact[i]); ClearRowByIndexCache(); return &(group->contact[i]); }
static void _LoadDataToContact(ClcContact *cont, ClcGroup *group, ClcData *dat, MCONTACT hContact) { if (!cont) return; cont->type = CLCIT_CONTACT; cont->SubAllocated = 0; cont->isSubcontact = 0; cont->subcontacts = NULL; cont->szText[0] = 0; cont->lastPaintCounter = 0; cont->image_is_special = FALSE; cont->hContact = hContact; pcli->pfnInvalidateDisplayNameCacheEntry(hContact); ClcCacheEntry *cacheEntry = pcli->pfnGetCacheEntry(hContact); char *szProto = cacheEntry->m_cache_cszProto; cont->proto = szProto; if (szProto != NULL && !pcli->pfnIsHiddenMode(dat, pdnce___GetStatus(cacheEntry))) cont->flags |= CONTACTF_ONLINE; WORD apparentMode = szProto != NULL ? cacheEntry->ApparentMode : 0; if (apparentMode) switch (apparentMode) { case ID_STATUS_OFFLINE: cont->flags |= CONTACTF_INVISTO; break; case ID_STATUS_ONLINE: cont->flags |= CONTACTF_VISTO; break; default: cont->flags |= CONTACTF_VISTO | CONTACTF_INVISTO; } if (cacheEntry->NotOnList) cont->flags |= CONTACTF_NOTONLIST; DWORD idleMode = szProto != NULL ? cacheEntry->IdleTS : 0; if (idleMode) cont->flags |= CONTACTF_IDLE; // Add subcontacts if (szProto) if (dat->IsMetaContactsEnabled && mir_strcmp(cont->proto, META_PROTO) == 0) AddSubcontacts(dat, cont, CLCItems_IsShowOfflineGroup(group)); cont->lastPaintCounter = 0; cont->avatar_pos = AVATAR_POS_DONT_HAVE; Cache_GetAvatar(dat, cont); Cache_GetText(dat, cont, 1); Cache_GetTimezone(dat, cont->hContact); cont->iImage = corecli.pfnGetContactIcon(hContact); cont->bContactRate = db_get_b(hContact, "CList", "Rate", 0); }
void AddSubcontacts(ClcData *dat, ClcContact *cont, BOOL showOfflineHereGroup) { ClcCacheEntry *cacheEntry = pcli->pfnGetCacheEntry(cont->hContact); cont->SubExpanded = (db_get_b(cont->hContact, "CList", "Expanded", 0) && (db_get_b(NULL, "CLC", "MetaExpanding", SETTING_METAEXPANDING_DEFAULT))); int subcount = db_mc_getSubCount(cont->hContact); if (subcount <= 0) { cont->isSubcontact = 0; cont->subcontacts = NULL; cont->SubAllocated = 0; return; } cont->isSubcontact = 0; mir_free(cont->subcontacts); cont->subcontacts = (ClcContact *)mir_calloc(sizeof(ClcContact)*subcount); cont->SubAllocated = subcount; int i = 0; int bHideOffline = db_get_b(NULL, "CList", "HideOffline", SETTING_HIDEOFFLINE_DEFAULT); for (int j = 0; j < subcount; j++) { MCONTACT hsub = db_mc_getSub(cont->hContact, j); cacheEntry = pcli->pfnGetCacheEntry(hsub); WORD wStatus = pdnce___GetStatus(cacheEntry); if (!showOfflineHereGroup && bHideOffline && !cacheEntry->m_cache_nNoHiddenOffline && wStatus == ID_STATUS_OFFLINE) continue; ClcContact& p = cont->subcontacts[i]; p.hContact = cacheEntry->hContact; p.avatar_pos = AVATAR_POS_DONT_HAVE; Cache_GetAvatar(dat, &p); p.iImage = corecli.pfnGetContactIcon(cacheEntry->hContact); memset(p.iExtraImage, 0xFF, sizeof(p.iExtraImage)); p.proto = cacheEntry->m_cache_cszProto; p.type = CLCIT_CONTACT; p.flags = 0;//CONTACTF_ONLINE; p.isSubcontact = i + 1; p.lastPaintCounter = 0; p.subcontacts = cont; p.image_is_special = FALSE; //p.status = cacheEntry->status; Cache_GetTimezone(dat, (&p)->hContact); Cache_GetText(dat, &p, 1); char *szProto = cacheEntry->m_cache_cszProto; if (szProto != NULL && !pcli->pfnIsHiddenMode(dat, wStatus)) p.flags |= CONTACTF_ONLINE; int apparentMode = szProto != NULL ? cacheEntry->ApparentMode : 0; if (apparentMode == ID_STATUS_OFFLINE) p.flags |= CONTACTF_INVISTO; else if (apparentMode == ID_STATUS_ONLINE) p.flags |= CONTACTF_VISTO; else if (apparentMode) p.flags |= CONTACTF_VISTO | CONTACTF_INVISTO; if (cacheEntry->NotOnList) p.flags |= CONTACTF_NOTONLIST; int idleMode = szProto != NULL ? cacheEntry->IdleTS : 0; if (idleMode) p.flags |= CONTACTF_IDLE; i++; } cont->SubAllocated = i; if (!i && cont->subcontacts != NULL) mir_free_and_nil(cont->subcontacts); }
/* * Avatar working routines */ BOOL UpdateAllAvatarsProxy(ClcContact *contact, BOOL, void *param) { Cache_GetAvatar((ClcData *)param, contact); return TRUE; }
void AddSubcontacts(struct ClcData *dat, struct ClcContact * cont, BOOL showOfflineHereGroup) { int subcount,i,j; HANDLE hsub; pdisplayNameCacheEntry cacheEntry; DWORD style=GetWindowLong(dat->hWnd,GWL_STYLE); cacheEntry=(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(cont->hContact); cont->SubExpanded=(DBGetContactSettingByte(cont->hContact,"CList","Expanded",0) && (DBGetContactSettingByte(NULL,"CLC","MetaExpanding",1))); subcount=(int)CallService(MS_MC_GETNUMCONTACTS,(WPARAM)cont->hContact,0); if (subcount <= 0) { cont->isSubcontact=0; cont->subcontacts=NULL; cont->SubAllocated=0; return; } cont->isSubcontact=0; cont->subcontacts=(struct ClcContact *) mir_alloc(sizeof(struct ClcContact)*subcount); ZeroMemory(cont->subcontacts, sizeof(struct ClcContact)*subcount); cont->SubAllocated=subcount; i=0; for (j=0; j<subcount; j++) { hsub=(HANDLE)CallService(MS_MC_GETSUBCONTACT,(WPARAM)cont->hContact,j); cacheEntry=(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hsub); if (showOfflineHereGroup||(!(DBGetContactSettingByte(NULL,"CLC","MetaHideOfflineSub",1) && DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT) ) || cacheEntry->status!=ID_STATUS_OFFLINE ) //&& //(!cacheEntry->Hidden || style&CLS_SHOWHIDDEN) ) { cont->subcontacts[i].hContact=cacheEntry->hContact; cont->subcontacts[i].avatar_pos = AVATAR_POS_DONT_HAVE; Cache_GetAvatar(dat, &cont->subcontacts[i]); cont->subcontacts[i].iImage=CallService(MS_CLIST_GETCONTACTICON,(WPARAM)cacheEntry->hContact,0); memset(cont->subcontacts[i].iExtraImage,0xFF,sizeof(cont->subcontacts[i].iExtraImage)); cont->subcontacts[i].proto=cacheEntry->szProto; cont->subcontacts[i].type=CLCIT_CONTACT; cont->subcontacts[i].flags=0;//CONTACTF_ONLINE; cont->subcontacts[i].isSubcontact=i+1; cont->subcontacts[i].subcontacts=cont; cont->subcontacts[i].image_is_special=FALSE; //cont->subcontacts[i].status=cacheEntry->status; Cache_GetTimezone(dat, (&cont->subcontacts[i])->hContact); Cache_GetText(dat, &cont->subcontacts[i],1); { int apparentMode; char *szProto; int idleMode; szProto=cacheEntry->szProto; if(szProto!=NULL&&!pcli->pfnIsHiddenMode(dat,cacheEntry->status)) cont->subcontacts[i].flags|=CONTACTF_ONLINE; apparentMode=szProto!=NULL?cacheEntry->ApparentMode:0; apparentMode=szProto!=NULL?cacheEntry->ApparentMode:0; if(apparentMode==ID_STATUS_OFFLINE) cont->subcontacts[i].flags|=CONTACTF_INVISTO; else if(apparentMode==ID_STATUS_ONLINE) cont->subcontacts[i].flags|=CONTACTF_VISTO; else if(apparentMode) cont->subcontacts[i].flags|=CONTACTF_VISTO|CONTACTF_INVISTO; if(cacheEntry->NotOnList) cont->subcontacts[i].flags|=CONTACTF_NOTONLIST; idleMode=szProto!=NULL?cacheEntry->IdleTS:0; if (idleMode) cont->subcontacts[i].flags|=CONTACTF_IDLE; } i++; } } cont->SubAllocated=i; if (!i && cont->subcontacts != NULL) mir_free(cont->subcontacts); }
static struct ClcContact * AddContactToGroup(struct ClcData *dat,struct ClcGroup *group,pdisplayNameCacheEntry cacheEntry) { char *szProto; WORD apparentMode; DWORD idleMode; HANDLE hContact; int i; if (cacheEntry==NULL) return NULL; if (group==NULL) return NULL; if (dat==NULL) return NULL; hContact=cacheEntry->hContact; //ClearClcContactCache(hContact); dat->NeedResort=1; for(i=group->cl.count-1;i>=0;i--) if(group->cl.items[i]->type!=CLCIT_INFO || !(group->cl.items[i]->flags&CLCIIF_BELOWCONTACTS)) break; i=cli_AddItemToGroup(group,i+1); group->cl.items[i]->type=CLCIT_CONTACT; group->cl.items[i]->SubAllocated=0; group->cl.items[i]->isSubcontact=0; group->cl.items[i]->subcontacts=NULL; group->cl.items[i]->szText[0]=0; // group->cl.items[i]->szSecondLineText=NULL; // group->cl.items[i]->szThirdLineText=NULL; group->cl.items[i]->image_is_special=FALSE; // group->cl.items[i]->status=cacheEntry->status; group->cl.items[i]->iImage=CallService(MS_CLIST_GETCONTACTICON,(WPARAM)hContact,0); cacheEntry=(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hContact); group->cl.items[i]->hContact=hContact; group->cl.items[i]->avatar_pos = AVATAR_POS_DONT_HAVE; Cache_GetAvatar(dat, group->cl.items[i]); szProto=cacheEntry->szProto; if(szProto!=NULL&&!pcli->pfnIsHiddenMode(dat,cacheEntry->status)) group->cl.items[i]->flags |= CONTACTF_ONLINE; apparentMode=szProto!=NULL?cacheEntry->ApparentMode:0; if(apparentMode==ID_STATUS_OFFLINE) group->cl.items[i]->flags|=CONTACTF_INVISTO; else if(apparentMode==ID_STATUS_ONLINE) group->cl.items[i]->flags|=CONTACTF_VISTO; else if(apparentMode) group->cl.items[i]->flags|=CONTACTF_VISTO|CONTACTF_INVISTO; if(cacheEntry->NotOnList) group->cl.items[i]->flags|=CONTACTF_NOTONLIST; idleMode=szProto!=NULL?cacheEntry->IdleTS:0; if (idleMode) group->cl.items[i]->flags|=CONTACTF_IDLE; group->cl.items[i]->proto = szProto; // group->cl.items[i]->timezone = (DWORD)DBGetContactSettingByte(hContact,"UserInfo","Timezone", DBGetContactSettingByte(hContact, szProto,"Timezone",-1)); /* if (group->cl.items[i]->timezone != -1) { int contact_gmt_diff = group->cl.items[i]->timezone; contact_gmt_diff = contact_gmt_diff > 128 ? 256 - contact_gmt_diff : 0 - contact_gmt_diff; contact_gmt_diff *= 60*60/2; if (contact_gmt_diff == dat->local_gmt_diff) group->cl.items[i]->timediff = 0; else group->cl.items[i]->timediff = (int)dat->local_gmt_diff_dst - contact_gmt_diff; } */ pcli->pfnInvalidateDisplayNameCacheEntry(hContact); Cache_GetTimezone(dat, group->cl.items[i]->hContact); Cache_GetText(dat, group->cl.items[i],1); ClearRowByIndexCache(); return group->cl.items[i]; }
static void _LoadDataToContact(struct ClcContact * cont, struct ClcGroup *group, struct ClcData *dat, HANDLE hContact) { pdisplayNameCacheEntry cacheEntry=NULL; WORD apparentMode; DWORD idleMode; char * szProto; if (!cont) return; cont->type=CLCIT_CONTACT; cont->SubAllocated=0; cont->isSubcontact=0; cont->subcontacts=NULL; cont->szText[0]=0; cont->lastPaintCounter=0; cont->image_is_special=FALSE; cont->hContact=hContact; pcli->pfnInvalidateDisplayNameCacheEntry(hContact); cacheEntry=(pdisplayNameCacheEntry)pcli->pfnGetCacheEntry(hContact); szProto=cacheEntry->m_cache_cszProto; cont->proto=szProto; if(szProto!=NULL&&!pcli->pfnIsHiddenMode(dat,pdnce___GetStatus( cacheEntry ))) cont->flags |= CONTACTF_ONLINE; apparentMode=szProto!=NULL?cacheEntry->ApparentMode:0; if (apparentMode) switch (apparentMode) { case ID_STATUS_OFFLINE: cont->flags|=CONTACTF_INVISTO; break; case ID_STATUS_ONLINE: cont->flags|=CONTACTF_VISTO; break; default: cont->flags|=CONTACTF_VISTO|CONTACTF_INVISTO; } if(cacheEntry->NotOnList) cont->flags|=CONTACTF_NOTONLIST; idleMode=szProto!=NULL?cacheEntry->IdleTS:0; if (idleMode) cont->flags|=CONTACTF_IDLE; //Add subcontacts if (szProto) { if ( g_szMetaModuleName && dat->IsMetaContactsEnabled && mir_strcmp(cont->proto,g_szMetaModuleName)==0) AddSubcontacts(dat,cont,CLCItems_IsShowOfflineGroup(group)); } cont->lastPaintCounter=0; cont->avatar_pos=AVATAR_POS_DONT_HAVE; Cache_GetAvatar(dat,cont); Cache_GetText(dat,cont,1); Cache_GetTimezone(dat,cont->hContact); cont->iImage=CallService(MS_CLIST_GETCONTACTICON,(WPARAM)hContact,1); cont->bContactRate=ModernGetSettingByte(hContact, "CList", "Rate",0); }