void AddSubcontacts(struct ClcContact * cont) { int subcount,i,j; HANDLE hsub; ClcCacheEntry *cacheEntry; cacheEntry = GetContactFullCacheEntry(cont->hContact); OutputDebugStringA("Proceed AddSubcontacts\r\n"); subcount = (int)CallService(MS_MC_GETNUMCONTACTS,(WPARAM)cont->hContact,0); cont->SubExpanded = db_get_b(cont->hContact,"CList","Expanded",0); cont->isSubcontact = 0; cont->subcontacts = (struct ClcContact *) mir_realloc(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 = GetContactFullCacheEntry(hsub); if ( !(db_get_b(NULL,"CLC","MetaHideOfflineSub",1) && db_get_b(NULL, "CList", "HideOffline", SETTING_HIDEOFFLINE_DEFAULT)) || cacheEntry->status != ID_STATUS_OFFLINE ) { cont->subcontacts[i].hContact = cacheEntry->hContact; cont->subcontacts[i].iImage = pcli->pfnGetContactIcon(cacheEntry->hContact); memset(cont->subcontacts[i].iExtraImage, 0xFF, sizeof(cont->subcontacts[i].iExtraImage)); cont->subcontacts[i].proto = cacheEntry->szProto; lstrcpyn(cont->subcontacts[i].szText,cacheEntry->tszName,SIZEOF(cont->subcontacts[i].szText)); cont->subcontacts[i].type = CLCIT_CONTACT; //cont->flags = 0;//CONTACTF_ONLINE; cont->subcontacts[i].isSubcontact = 1; i++; } } cont->SubAllocated = i; if (i == 0) mir_free(cont->subcontacts); }
void LoadContactTree(void) { int tick = GetTickCount(); CallService(MS_CLUI_LISTBEGINREBUILD,0,0); for (int i=1;; i++) { if ((char*)CallService(MS_CLIST_GROUPGETNAME2, i, 0) == NULL) break; CallService(MS_CLUI_GROUPADDED, i, 0); } int hideOffline = db_get_b(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT); for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { ClcCacheEntry *cacheEntry = GetContactFullCacheEntry(hContact); if (cacheEntry == NULL) { MessageBoxA(0,"Fail To Get CacheEntry for hContact","!!!!!",0); break; } int status = cacheEntry->status; if ((!hideOffline || status != ID_STATUS_OFFLINE) && !cacheEntry->bIsHidden) ChangeContactIcon(hContact,ExtIconFromStatusMode(hContact,(char*)cacheEntry->szProto,status),1); } sortByStatus = db_get_b(NULL,"CList","SortByStatus",SETTING_SORTBYSTATUS_DEFAULT); sortByProto = db_get_b(NULL,"CList","SortByProto",SETTING_SORTBYPROTO_DEFAULT); sortNoOfflineBottom = db_get_b(NULL,"CList","NoOfflineBottom",SETTING_NOOFFLINEBOTTOM_DEFAULT); CallService(MS_CLUI_LISTENDREBUILD,0,0); tick = GetTickCount()-tick; char buf[255]; mir_snprintf(buf, SIZEOF(buf), "LoadContactTree %d \r\n", tick); OutputDebugStringA(buf); }
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]); }
int GetContactIcon(WPARAM wParam,LPARAM lParam) { char *szProto; int status; pdisplayNameCacheEntry cacheEntry; cacheEntry=GetContactFullCacheEntry((HANDLE)wParam); //szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,wParam,0); szProto=cacheEntry->szProto; status=cacheEntry->status; return ExtIconFromStatusMode((HANDLE)wParam,szProto,szProto==NULL?ID_STATUS_OFFLINE:status); //by FYR }
void LoadContactTree(void) { HANDLE hContact; int i,hideOffline,status,tick; pdisplayNameCacheEntry cacheEntry; tick=GetTickCount(); CallService(MS_CLUI_LISTBEGINREBUILD,0,0); for(i=1;;i++) { if((char*)CallService(MS_CLIST_GROUPGETNAME2,i,(LPARAM)(int*)NULL)==NULL) break; CallService(MS_CLUI_GROUPADDED,i,0); } hideOffline=DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT); hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); while(hContact!=NULL) { cacheEntry=GetContactFullCacheEntry(hContact); if (cacheEntry==NULL) { MessageBoxA(0,"Fail To Get CacheEntry for hContact","!!!!!",0); break; } status=cacheEntry->status; if((!hideOffline || status!=ID_STATUS_OFFLINE) && !cacheEntry->Hidden) ChangeContactIcon(hContact,ExtIconFromStatusMode(hContact,(char*)cacheEntry->szProto,status),1); hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0); } sortBy[0]=DBGetContactSettingByte(NULL,"CList","SortBy1",SETTING_SORTBY1_DEFAULT); sortBy[1]=DBGetContactSettingByte(NULL,"CList","SortBy2",SETTING_SORTBY2_DEFAULT); sortBy[2]=DBGetContactSettingByte(NULL,"CList","SortBy3",SETTING_SORTBY3_DEFAULT); sortNoOfflineBottom=DBGetContactSettingByte(NULL,"CList","NoOfflineBottom",SETTING_NOOFFLINEBOTTOM_DEFAULT); CallService(MS_CLUI_SORTLIST,0,0); CallService(MS_CLUI_LISTENDREBUILD,0,0); tick=GetTickCount()-tick; { char buf[255]; //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick); sprintf(buf,"LoadContactTree %d \r\n",tick); TRACE(buf); } }
static int ProtocolAck(WPARAM wParam,LPARAM lParam) { ACKDATA *ack=(ACKDATA*)lParam; /* if (ack->type==ACKTYPE_AWAYMSG && ack->lParam) { DBVARIANT dbv; if (!DBGetContactSetting(ack->hContact, "CList", "StatusMsg", &dbv)) { if (!MyStrCmp(dbv.pszVal, (char *)ack->lParam)) { DBFreeVariant(&dbv); return 0; } DBFreeVariant(&dbv); } DBWriteContactSettingString(ack->hContact, "CList", "StatusMsg", (char *)ack->lParam); return 0; } */ if(ack->type!=ACKTYPE_STATUS) return 0; CallService(MS_CLUI_PROTOCOLSTATUSCHANGED,ack->lParam,(LPARAM)ack->szModule); if((int)ack->hProcess<ID_STATUS_ONLINE && ack->lParam>=ID_STATUS_ONLINE) { DWORD caps; caps=(DWORD)CallProtoService(ack->szModule,PS_GETCAPS,PFLAGNUM_1,0); if(caps&PF1_SERVERCLIST) { HANDLE hContact; char *szProto; hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); while(hContact) { pdisplayNameCacheEntry cacheEntry; cacheEntry=GetContactFullCacheEntry(hContact); szProto=cacheEntry->szProto; if(szProto!=NULL && !MyStrCmp(szProto,ack->szModule)) if(DBGetContactSettingByte(hContact,"CList","Delete",0)) CallService(MS_DB_CONTACT_DELETE,(WPARAM)hContact,0); hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0); } } } TrayIconUpdateBase(ack->szModule); return 0; }
LRESULT CALLBACK ContactListControlWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { struct ClcData *dat = (struct ClcData*)GetWindowLongPtr(hwnd,0); if ( msg >= CLM_FIRST && msg < CLM_LAST ) return pcli->pfnProcessExternalMessages(hwnd,dat,msg,wParam,lParam); switch (msg) { case WM_CREATE: dat = (struct ClcData*)mir_calloc( sizeof(struct ClcData)); SetWindowLong(hwnd,0,(LPARAM)dat); InitDisplayNameCache(&dat->lCLCContactsCache); break; case INTM_ICONCHANGED: { struct ClcContact *contact=NULL; struct ClcGroup *group=NULL; int recalcScrollBar=0,shouldShow; HANDLE hSelItem=NULL; struct ClcContact *selcontact=NULL; pdisplayNameCacheEntry cacheEntry = GetContactFullCacheEntry((HANDLE)wParam); WORD status; int NeedResort=0; char *szProto = cacheEntry->szProto; if(szProto==NULL) status=ID_STATUS_OFFLINE; else status=cacheEntry->status; shouldShow=(GetWindowLong(hwnd,GWL_STYLE)&CLS_SHOWHIDDEN || !cacheEntry->Hidden) && (!pcli->pfnIsHiddenMode(dat,status)||cacheEntry->noHiddenOffline || CallService(MS_CLIST_GETCONTACTICON,wParam,0)!=LOWORD(lParam)); //this means an offline msg is flashing, so the contact should be shown if(!FindItem(hwnd,dat,(HANDLE)wParam,&contact,&group,NULL)) { if(shouldShow && CallService(MS_DB_CONTACT_IS, wParam, 0)) { if(dat->selection>=0 && GetRowByIndex(dat,dat->selection,&selcontact,NULL)!=-1) hSelItem=pcli->pfnContactToHItem(selcontact); AddContactToTree(hwnd,dat,(HANDLE)wParam,0,0); NeedResort=1; recalcScrollBar=1; FindItem(hwnd,dat,(HANDLE)wParam,&contact,NULL,NULL); if (contact) { contact->iImage=(WORD)lParam; pcli->pfnNotifyNewContact(hwnd,(HANDLE)wParam); dat->NeedResort=1; } } } else { //item in list already DWORD style=GetWindowLong(hwnd,GWL_STYLE); if(contact->iImage== (WORD)lParam) break; if (sortByStatus) dat->NeedResort=1; if(!shouldShow && !(style&CLS_NOHIDEOFFLINE) && (style&CLS_HIDEOFFLINE || group->hideOffline)) { if(dat->selection>=0 && GetRowByIndex(dat,dat->selection,&selcontact,NULL)!=-1) hSelItem=pcli->pfnContactToHItem(selcontact); RemoveItemFromGroup(hwnd,group,contact,0); recalcScrollBar=1; dat->NeedResort=1; } else { int oldflags; contact->iImage=(WORD)lParam; oldflags=contact->flags; if(!pcli->pfnIsHiddenMode(dat,status)||cacheEntry->noHiddenOffline) contact->flags|=CONTACTF_ONLINE; else contact->flags&=~CONTACTF_ONLINE; if (oldflags!=contact->flags) dat->NeedResort=1; } } if(hSelItem) { struct ClcGroup *selgroup; if(FindItem(hwnd,dat,hSelItem,&selcontact,&selgroup,NULL)) dat->selection=GetRowsPriorTo(&dat->list,selgroup,li.List_IndexOf((SortedList*)&selgroup->cl, selcontact)); else dat->selection=-1; } SortClcByTimer(hwnd); if(recalcScrollBar) RecalcScrollBar(hwnd,dat); goto LBL_Exit; } case INTM_STATUSMSGCHANGED: { struct ClcContact *contact=NULL; struct ClcGroup *group=NULL; DBVARIANT dbv; if (!(dat->style&CLS_SHOWSTATUSMESSAGES)) break; if(FindItem(hwnd,dat,(HANDLE)wParam,&contact,&group,NULL) && contact!=NULL) { contact->flags &= ~CONTACTF_STATUSMSG; if (!DBGetContactSettingTString((HANDLE)wParam, "CList", "StatusMsg", &dbv)) { int j; if (dbv.ptszVal==NULL||_tcslen(dbv.ptszVal)==0) break; lstrcpyn(contact->szStatusMsg, dbv.ptszVal, SIZEOF(contact->szStatusMsg)); for (j=(int)_tcslen(contact->szStatusMsg)-1;j>=0;j--) { if (contact->szStatusMsg[j]=='\r' || contact->szStatusMsg[j]=='\n' || contact->szStatusMsg[j]=='\t') { contact->szStatusMsg[j] = ' '; } } DBFreeVariant(&dbv); if (_tcslen(contact->szStatusMsg)>0) { contact->flags |= CONTACTF_STATUSMSG; dat->NeedResort=TRUE; } } } InvalidateRect(hwnd,NULL,TRUE); SortClcByTimer(hwnd); RecalcScrollBar(hwnd,dat); goto LBL_Exit; } case WM_TIMER: if (wParam==TIMERID_DELAYEDREPAINT) { KillTimer(hwnd,TIMERID_DELAYEDREPAINT); InvalidateRect(hwnd,NULL,FALSE); break; } if ( wParam == TIMERID_SUBEXPAND) { KillTimer(hwnd,TIMERID_SUBEXPAND); if (hitcontact) { if (hitcontact->SubExpanded) hitcontact->SubExpanded=0; else hitcontact->SubExpanded=1; DBWriteContactSettingByte(hitcontact->hContact,"CList","Expanded",hitcontact->SubExpanded); } hitcontact=NULL; dat->NeedResort=1; SortCLC(hwnd,dat,1); RecalcScrollBar(hwnd,dat); break; } break; case WM_DESTROY: FreeDisplayNameCache(&dat->lCLCContactsCache); stopStatusUpdater = 1; break; } { LRESULT res = saveContactListControlWndProc(hwnd, msg, wParam, lParam); switch (msg) { case WM_CREATE: mir_forkthread(StatusUpdaterThread,0); break; } return res; } LBL_Exit: return DefWindowProc(hwnd, msg, wParam, lParam); }
void RebuildEntireList(HWND hwnd,struct ClcData *dat) { // char *szProto; DWORD style=GetWindowLong(hwnd,GWL_STYLE); HANDLE hContact; struct ClcContact * cont; struct ClcGroup *group; //DBVARIANT dbv; int tick=GetTickCount(); KillTimer(hwnd,TIMERID_REBUILDAFTER); //EnterCriticalSection(&(dat->lockitemCS)); //ShowTracePopup("RebuildEntireList"); #ifdef _DEBUG { static int num_calls = 0; char tmp[128]; mir_snprintf(tmp, sizeof(tmp), "********************* RebuildEntireList (%d)\r\n", num_calls); num_calls++; TRACE(tmp); } #endif ClearRowByIndexCache(); ClearClcContactCache(dat,INVALID_HANDLE_VALUE); ImageArray_Clear(&dat->avatar_cache); RowHeights_Clear(dat); RowHeights_GetMaxRowHeight(dat, hwnd); dat->list.expanded=1; dat->list.hideOffline=DBGetContactSettingByte(NULL,"CLC","HideOfflineRoot",0); dat->list.contactCount=0; dat->list.totalMembers=0; dat->NeedResort=1; dat->selection=-1; dat->HiLightMode=DBGetContactSettingByte(NULL,"CLC","HiLightMode",0); { int i; TCHAR *szGroupName; DWORD groupFlags; for(i=1;;i++) { szGroupName=(TCHAR*)CallService(MS_CLIST_GROUPGETNAMET,i,(LPARAM)&groupFlags); //UNICODE if(szGroupName==NULL) break; AddGroup(hwnd,dat,szGroupName,groupFlags,i,0); } lastGroupId=i; } hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); while(hContact) { pdisplayNameCacheEntry cacheEntry; cont=NULL; cacheEntry=GetContactFullCacheEntry(hContact); //cacheEntry->ClcContact=NULL; ClearClcContactCache(dat,hContact); if((dat->IsMetaContactsEnabled||MyStrCmp(cacheEntry->szProto,"MetaContacts"))&&(style&CLS_SHOWHIDDEN || !cacheEntry->Hidden) && (!cacheEntry->HiddenSubcontact || !dat->IsMetaContactsEnabled )) { if(lstrlen(cacheEntry->szGroup)==0) group=&dat->list; else { group=AddGroup(hwnd,dat,cacheEntry->szGroup,(DWORD)-1,0,0); // if (!group) group=AddTempGroup(hwnd,dat,cacheEntry->szGroup,(DWORD)-1,0,0); //mir_free(dbv.pszVal); } if(group!=NULL) { if (cacheEntry->status==ID_STATUS_OFFLINE) if (DBGetContactSettingByte(NULL,"CList","PlaceOfflineToRoot",0)) group=&dat->list; group->totalMembers++; if(!(style&CLS_NOHIDEOFFLINE) && (style&CLS_HIDEOFFLINE || group->hideOffline)) { //szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); if(cacheEntry->szProto==NULL) { if(!IsHiddenMode(dat,ID_STATUS_OFFLINE)||cacheEntry->noHiddenOffline) cont=AddContactToGroup(dat,group,cacheEntry); } else if(!IsHiddenMode(dat,cacheEntry->status)||cacheEntry->noHiddenOffline) cont=AddContactToGroup(dat,group,cacheEntry); } else cont=AddContactToGroup(dat,group,cacheEntry); } } if (cont) { cont->SubAllocated=0; if (cont->proto && strcmp(cont->proto,"MetaContacts")==0) AddSubcontacts(dat,cont); } hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0); } if(style&CLS_HIDEEMPTYGROUPS) { group=&dat->list; group->scanIndex=0; for(;;) { if(group->scanIndex==group->contactCount) { group=group->parent; if(group==NULL) break; } else if(group->contact[group->scanIndex].type==CLCIT_GROUP) { if(group->contact[group->scanIndex].group->contactCount==0) { group=RemoveItemFromGroup(hwnd,group,&group->contact[group->scanIndex],0); } else { group=group->contact[group->scanIndex].group; group->scanIndex=0; } continue; } group->scanIndex++; } } SortCLC(hwnd,dat,0); // LOCK_IMAGE_UPDATING=0; //LeaveCriticalSection(&(dat->lockitemCS)); #ifdef _DEBUG tick=GetTickCount()-tick; { char buf[255]; //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick); sprintf(buf,"RebuildEntireList %d \r\n",tick); TRACE(buf); DBWriteContactSettingDword((HANDLE)0,"CLUI","PF:Last RebuildEntireList Time:",tick); } #endif }
void AddContactToTree(HWND hwnd,struct ClcData *dat,HANDLE hContact,int updateTotalCount,int checkHideOffline) { struct ClcGroup *group; struct ClcContact * cont; pdisplayNameCacheEntry cacheEntry; DWORD style=GetWindowLong(hwnd,GWL_STYLE); WORD status; char *szProto; if (FindItem(hwnd,dat,hContact,NULL,NULL,NULL,FALSE)==1){return;}; cacheEntry=GetContactFullCacheEntry(hContact); if (cacheEntry==NULL) return; if (dat->IsMetaContactsEnabled && cacheEntry->HiddenSubcontact) return; ///----- szProto=cacheEntry->szProto; //char *szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); dat->NeedResort=1; ClearRowByIndexCache(); ClearClcContactCache(dat,hContact); if(style&CLS_NOHIDEOFFLINE) checkHideOffline=0; if(checkHideOffline) { if(szProto==NULL) status=ID_STATUS_OFFLINE; else status=cacheEntry->status; } if(lstrlen(cacheEntry->szGroup)==0) group=&dat->list; else { group=AddGroup(hwnd,dat,cacheEntry->szGroup,(DWORD)-1,0,0); if(group==NULL) { int i,len; DWORD groupFlags; TCHAR *szGroupName; if(!(style&CLS_HIDEEMPTYGROUPS)) { // /*mir_free(dbv.pszVal);*/AddTempGroup(hwnd,dat,cacheEntry->szGroup,(DWORD)-1,0,0); return; } if(checkHideOffline && IsHiddenMode(dat,status)) { for(i=1;;i++) { szGroupName=(TCHAR*)CallService(MS_CLIST_GROUPGETNAMET,i,(LPARAM)&groupFlags); //UNICODE if(szGroupName==NULL) {/*mir_free(dbv.pszVal);*/ return;} //never happens if(!lstrcmp(szGroupName,cacheEntry->szGroup)) break; } if(groupFlags&GROUPF_HIDEOFFLINE) {/*mir_free(dbv.pszVal);*/ return;} } for(i=1;;i++) { szGroupName=(TCHAR*)CallService(MS_CLIST_GROUPGETNAMET,i,(LPARAM)&groupFlags); //UNICODE if(szGroupName==NULL) {/*mir_free(dbv.pszVal);*/ return;} //never happens if(!lstrcmp(szGroupName,cacheEntry->szGroup)) break; len=lstrlen(szGroupName); if(!_tcsncmp(szGroupName,cacheEntry->szGroup,len) && cacheEntry->szGroup[len]=='\\') AddGroup(hwnd,dat,szGroupName,groupFlags,i,1); } group=AddGroup(hwnd,dat,cacheEntry->szGroup,groupFlags,i,1); } // mir_free(dbv.pszVal); } if (cacheEntry->status==ID_STATUS_OFFLINE) if (DBGetContactSettingByte(NULL,"CList","PlaceOfflineToRoot",0)) group=&dat->list; if(checkHideOffline) { if(IsHiddenMode(dat,status) && (style&CLS_HIDEOFFLINE || group->hideOffline)) { if(updateTotalCount) group->totalMembers++; return; } } if(dat->IsMetaContactsEnabled && cacheEntry->HiddenSubcontact) return; if(!dat->IsMetaContactsEnabled && !MyStrCmp(cacheEntry->szProto,"MetaContacts")) return; cont=AddContactToGroup(dat,group,cacheEntry); if (cont) if (cont->proto) { cont->SubAllocated=0; if (MyStrCmp(cont->proto,"MetaContacts")==0) AddSubcontacts(dat,cont); } if(updateTotalCount && group) group->totalMembers++; ClearRowByIndexCache(); }
void AddSubcontacts(struct ClcData *dat, struct ClcContact * cont) { int subcount,i,j; HANDLE hsub; pdisplayNameCacheEntry cacheEntry; cacheEntry=GetContactFullCacheEntry(cont->hContact); TRACE("Proceed AddSubcontacts\r\n"); 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=GetContactFullCacheEntry(hsub); if (!(DBGetContactSettingByte(NULL,"CLC","MetaHideOfflineSub",1) && DBGetContactSettingByte(NULL,"CList","HideOffline",SETTING_HIDEOFFLINE_DEFAULT) )|| cacheEntry->status!=ID_STATUS_OFFLINE ) { 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; //lstrcpynA(cont->subcontacts[i].szText,cacheEntry->name,sizeof(cont->subcontacts[i].szText)); //Cache_GetText(dat, &cont->subcontacts[i]); 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; //lstrcpyn(cont->subcontacts[i].szText,cacheEntry->name,sizeof(cont->subcontacts[i].szText)); Cache_GetTimezone(dat, &cont->subcontacts[i]); Cache_GetText(dat, &cont->subcontacts[i]); { int apparentMode; char *szProto; int idleMode; szProto=cacheEntry->szProto; if(szProto!=NULL&&!IsHiddenMode(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); }
struct ClcGroup *AddGroup(HWND hwnd,struct ClcData *dat,const TCHAR *szName,DWORD flags,int groupId,int calcTotalMembers) { TCHAR *pBackslash,*pNextField,szThisField[120-MAXEXTRACOLUMNS]; TCHAR *HiddenGroup=NULL; struct ClcGroup *group=&dat->list; int i,compareResult; ClearRowByIndexCache(); dat->NeedResort=1; if (GetWindowLong(hwnd,GWL_STYLE)&CLS_USEGROUPS) //groups is using if (ServiceExists(MS_MC_GETDEFAULTCONTACT)) //metacontacts dll is loaded if (DBGetContactSettingByte(NULL,"MetaContacts","Enabled",1)); //and enabled { HiddenGroup=DBGetStringT(NULL,"MetaContacts","HiddenGroupName"); //TODO: UNICODE + Hidden groupname // if (!HiddenGroup) strdup("MetaContacts Hidden Group"); if (szName && HiddenGroup) if (!lstrcmp(HiddenGroup,szName)) //group is metahidden { if (HiddenGroup) mir_free(HiddenGroup); return NULL; } } if (HiddenGroup) mir_free(HiddenGroup); if(!(GetWindowLong(hwnd,GWL_STYLE)&CLS_USEGROUPS)) return &dat->list; pNextField=(TCHAR*)szName; do { pBackslash=_tcschr(pNextField,'\\'); if(pBackslash==NULL) { lstrcpyn(szThisField,pNextField,sizeof(szThisField)); pNextField=NULL; } else { lstrcpyn(szThisField,pNextField,min(sizeof(szThisField),pBackslash-pNextField+1)); pNextField=pBackslash+1; } compareResult=1; for(i=0;i<group->contactCount;i++) { if(group->contact[i].type==CLCIT_CONTACT) break; if(group->contact[i].type!=CLCIT_GROUP) continue; compareResult=lstrcmp(szThisField,group->contact[i].szText); if(compareResult==0) { if(pNextField==NULL && flags!=(DWORD)-1) { group->contact[i].groupId=(WORD)groupId; group=group->contact[i].group; group->expanded=(flags&GROUPF_EXPANDED)!=0; group->hideOffline=(flags&GROUPF_HIDEOFFLINE)!=0; group->groupId=groupId; } else group=group->contact[i].group; break; } if(pNextField==NULL && group->contact[i].groupId==0) break; if(groupId && group->contact[i].groupId>groupId) break; } if(compareResult) { if(groupId==0) { return NULL; groupId=lastGroupId++; }//return NULL; i=AddItemToGroup(group,i); group->contact[i].type=CLCIT_GROUP; if (group->contact[i].szText) mir_free(group->contact[i].szText); group->contact[i].szText=mir_strdupT(szThisField); group->contact[i].groupId=(WORD)(pNextField?0:groupId); group->contact[i].group=(struct ClcGroup*)mir_alloc(sizeof(struct ClcGroup)); ZeroMemory(group->contact[i].group, sizeof(struct ClcGroup)); group->contact[i].group->parent=group; group=group->contact[i].group; group->allocedCount=group->contactCount=0; group->contact=NULL; if(flags==(DWORD)-1 || pNextField!=NULL) { group->expanded=0; group->hideOffline=0; } else { group->expanded=(flags&GROUPF_EXPANDED)!=0; group->hideOffline=(flags&GROUPF_HIDEOFFLINE)!=0; } group->groupId=pNextField?0:groupId; group->totalMembers=0; if(flags!=(DWORD)-1 && pNextField==NULL && calcTotalMembers) { HANDLE hContact; //DBVARIANT dbv; int tick; DWORD style=GetWindowLong(hwnd,GWL_STYLE); hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0); tick=GetTickCount(); while(hContact) { pdisplayNameCacheEntry cacheEntry; cacheEntry=GetContactFullCacheEntry(hContact); if(cacheEntry->szGroup!=NULL&&lstrlen(cacheEntry->szGroup)!=0) { if(!lstrcmp(cacheEntry->szGroup,szName) && (style&CLS_SHOWHIDDEN || !cacheEntry->Hidden)) group->totalMembers++; //mir_free(dbv.pszVal); } hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0); } #ifdef _DEBUG { char buf[255]; tick=GetTickCount()-tick; sprintf(buf,"AddGroup Finds %d\r\n",tick); TRACE(buf); } #endif } } } while(pNextField); ClearRowByIndexCache(); return group; }
void RebuildEntireList(HWND hwnd,struct ClcData *dat) { // char *szProto; DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE); struct ClcContact * cont; ClcGroup *group; //DBVARIANT dbv; int tick = GetTickCount(); ClearRowByIndexCache(); ClearClcContactCache(dat,INVALID_HANDLE_VALUE); dat->list.expanded = 1; dat->list.hideOffline = db_get_b(NULL,"CLC","HideOfflineRoot",0); memset( &dat->list.cl, 0, sizeof( dat->list.cl )); dat->list.cl.increment = 30; dat->needsResort = 1; dat->selection = -1; { int i; TCHAR *szGroupName; DWORD groupFlags; for (i = 1;;i++) { szGroupName = pcli->pfnGetGroupName(i,&groupFlags); if (szGroupName == NULL) break; AddGroup(hwnd,dat,szGroupName,groupFlags,i,0); } } for (HANDLE hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { ClcCacheEntry *cacheEntry; cont = NULL; cacheEntry = GetContactFullCacheEntry(hContact); //cacheEntry->ClcContact = NULL; ClearClcContactCache(dat,hContact); if (cacheEntry == NULL) MessageBoxA(0,"Fail To Get CacheEntry for hContact","!!!!!!!!",0); if (style&CLS_SHOWHIDDEN || !cacheEntry->bIsHidden) { if (lstrlen(cacheEntry->tszGroup) == 0) group = &dat->list; else { group = AddGroup(hwnd,dat,cacheEntry->tszGroup,(DWORD)-1,0,0); //mir_free(dbv.pszVal); } if (group != NULL) { group->totalMembers++; if ( !(style & CLS_NOHIDEOFFLINE) && (style & CLS_HIDEOFFLINE || group->hideOffline)) { if (cacheEntry->szProto == NULL) { if ( !pcli->pfnIsHiddenMode(dat,ID_STATUS_OFFLINE)||cacheEntry->noHiddenOffline) cont = AddContactToGroup(dat,group,cacheEntry); } else if ( !pcli->pfnIsHiddenMode(dat,cacheEntry->status)||cacheEntry->noHiddenOffline) cont = AddContactToGroup(dat,group,cacheEntry); } else cont = AddContactToGroup(dat,group,cacheEntry); } } if (cont && cont->proto) { cont->SubAllocated = 0; if (strcmp(cont->proto,"MetaContacts") == 0) AddSubcontacts(cont); } } if (style&CLS_HIDEEMPTYGROUPS) { group = &dat->list; group->scanIndex = 0; for (;;) { if (group->scanIndex == group->cl.count) { group = group->parent; if (group == NULL) break; } else if (group->cl.items[group->scanIndex]->type == CLCIT_GROUP) { if (group->cl.items[group->scanIndex]->group->cl.count == 0) { group = RemoveItemFromGroup(hwnd,group,group->cl.items[group->scanIndex],0); } else { group = group->cl.items[group->scanIndex]->group; group->scanIndex = 0; } continue; } group->scanIndex++; } } SortCLC(hwnd,dat,0); tick = GetTickCount()-tick; { char buf[255]; //sprintf(buf,"%s %s took %i ms",__FILE__,__LINE__,tick); mir_snprintf(buf, SIZEOF(buf), "RebuildEntireList %d \r\n", tick); OutputDebugStringA(buf); db_set_dw((HANDLE)0,"CLUI","PF:Last RebuildEntireList Time:",tick); } }
void AddContactToTree(HWND hwnd, ClcData *dat, HANDLE hContact, int updateTotalCount, int checkHideOffline) { if ( FindItem(hwnd,dat,hContact,NULL,NULL,NULL) == 1) return; ClcCacheEntry *cacheEntry = GetContactFullCacheEntry(hContact); if (cacheEntry == NULL) return; char *szProto = cacheEntry->szProto; dat->needsResort = 1; ClearRowByIndexCache(); ClearClcContactCache(dat,hContact); WORD status; DWORD style = GetWindowLongPtr(hwnd,GWL_STYLE); if (style & CLS_NOHIDEOFFLINE) checkHideOffline = 0; if (checkHideOffline) { if (szProto == NULL) status = ID_STATUS_OFFLINE; else status = cacheEntry->status; } ClcGroup *group; if (lstrlen(cacheEntry->tszGroup) == 0) group = &dat->list; else { group = AddGroup(hwnd,dat,cacheEntry->tszGroup,(DWORD)-1,0,0); if (group == NULL) { DWORD groupFlags; int i; if ( !(style & CLS_HIDEEMPTYGROUPS)) return; if (checkHideOffline && pcli->pfnIsHiddenMode(dat,status)) { for (i = 1;;i++) { TCHAR *szGroupName = pcli->pfnGetGroupName(i, &groupFlags); if (szGroupName == NULL) return; //never happens if ( !lstrcmp(szGroupName,cacheEntry->tszGroup)) break; } if (groupFlags & GROUPF_HIDEOFFLINE) return; } for (i = 1;; i++) { TCHAR *szGroupName = pcli->pfnGetGroupName(i, &groupFlags); if (szGroupName == NULL) return; //never happens if ( !lstrcmp(szGroupName,cacheEntry->tszGroup)) break; size_t len = lstrlen(szGroupName); if ( !_tcsncmp(szGroupName,cacheEntry->tszGroup,len) && cacheEntry->tszGroup[len] == '\\') AddGroup(hwnd,dat,szGroupName,groupFlags,i,1); } group = AddGroup(hwnd,dat,cacheEntry->tszGroup,groupFlags,i,1); } } if (checkHideOffline) { if (pcli->pfnIsHiddenMode(dat,status) && (style & CLS_HIDEOFFLINE || group->hideOffline)) { if (updateTotalCount) group->totalMembers++; return; } } ClcContact *cont = AddContactToGroup(dat,group,cacheEntry); if (cont && cont->proto) { cont->SubAllocated = 0; if (strcmp(cont->proto,"MetaContacts") == 0) AddSubcontacts(cont); } if (updateTotalCount) group->totalMembers++; ClearRowByIndexCache(); }
static struct ClcContact* AddContactToGroup(struct ClcData *dat,ClcGroup *group,ClcCacheEntry *cacheEntry) { char *szProto; WORD apparentMode; DWORD idleMode; HANDLE hContact; DBVARIANT dbv; int i; int img = -1; int basicIcon = 0; if (cacheEntry == NULL || group == NULL || dat == NULL) return NULL; hContact = cacheEntry->hContact; dat->needsResort = 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 = 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; if (ProtoServiceExists(cacheEntry->szProto, PS_GETADVANCEDSTATUSICON)) img = ProtoCallService(cacheEntry->szProto, PS_GETADVANCEDSTATUSICON, (WPARAM)hContact, 0); if (img == -1 || !(LOWORD(img))) img = pcli->pfnGetContactIcon(hContact); group->cl.items[i]->iImage = img; cacheEntry = GetContactFullCacheEntry(hContact); group->cl.items[i]->hContact = hContact; //cacheEntry->ClcContact = &(group->cl.items[i]); //SetClcContactCacheItem(dat,hContact,&(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; lstrcpyn(group->cl.items[i]->szText,cacheEntry->tszName, SIZEOF(group->cl.items[i]->szText)); group->cl.items[i]->proto = szProto; if (dat->style & CLS_SHOWSTATUSMESSAGES) { if ( !db_get_ts(hContact, "CList", "StatusMsg", &dbv)) { int j; lstrcpyn(group->cl.items[i]->szStatusMsg, dbv.ptszVal, SIZEOF(group->cl.items[i]->szStatusMsg)); for (j = (int)_tcslen(group->cl.items[i]->szStatusMsg)-1;j>=0;j--) { if (group->cl.items[i]->szStatusMsg[j] == '\r' || group->cl.items[i]->szStatusMsg[j] == '\n' || group->cl.items[i]->szStatusMsg[j] == '\t') { group->cl.items[i]->szStatusMsg[j] = ' '; } } db_free(&dbv); if (group->cl.items[i]->szStatusMsg[0] != 0) { group->cl.items[i]->flags |= CONTACTF_STATUSMSG; } } } ClearRowByIndexCache(); return group->cl.items[i]; }