Show
Ignore:
Timestamp:
06/14/08 03:45:40 (7 months ago)
Author:
flynd
Message:

Rewrote group handling to be full objects instead of just two lists. New groups have persistant ids that doesn't change when groups are added, removed or resorted.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/licq/src/icqd-srv.cpp

    r6277 r6282  
    118118{ 
    119119  // Export groups 
    120   GroupList groups; 
    121   GroupList *g = gUserManager.LockGroupList(LOCK_R); 
    122   GroupIDList *gID = gUserManager.LockGroupIDList(LOCK_R); 
    123  
    124   for (unsigned int i = 0; i < gID->size(); i++) 
    125   { 
    126     if ((*gID)[i] == 0) 
    127     { 
    128       groups.push_back((*g)[i]); 
    129     } 
    130   } 
    131  
    132   gUserManager.UnlockGroupList(); 
    133   gUserManager.UnlockGroupIDList(); 
    134  
    135   if (groups.size()) 
     120  GroupNameMap groups; 
     121  FOR_EACH_GROUP_START(LOCK_R) 
     122  { 
     123    if (pGroup->icqGroupId() == 0) 
     124      groups[pGroup->id()] = pGroup->name(); 
     125  } 
     126  FOR_EACH_GROUP_END 
     127 
     128  if (groups.size() > 0) 
    136129    icqExportGroups(groups); 
    137130 
     
    224217  if (!UseServerContactList())  return; 
    225218  CSrvPacketTcp *pReply; 
    226    
     219 
    227220  pReply = new CPU_UpdateToServerList("", ICQ_ROSTxGROUP, 0); 
    228221  addToModifyUsers(pReply->SubSequence(), ""); 
    229222  gLog.Info(tr("%sUpdating top level group.\n"), L_SRVxSTR); 
    230223  SendExpectEvent_Server(0, pReply, NULL); 
    231   
    232   GroupList *g = gUserManager.LockGroupList(LOCK_R); 
    233   GroupIDList *gID = gUserManager.LockGroupIDList(LOCK_R); 
    234  
    235   for (unsigned int i = 0; i < gID->size(); i++) 
    236   { 
    237     if ((*gID)[i]) 
    238     { 
    239       pReply = new CPU_UpdateToServerList((*g)[i], ICQ_ROSTxGROUP, 
    240         (*gID)[i]); 
    241       gLog.Info(tr("%sUpdating group %s.\n"), L_SRVxSTR, (*g)[i]);    
     224 
     225  FOR_EACH_GROUP_START(LOCK_R) 
     226  { 
     227    unsigned int gid = pGroup->icqGroupId(); 
     228    if (gid != 0) 
     229    { 
     230      const char* gname = pGroup->name().c_str(); 
     231      pReply = new CPU_UpdateToServerList(gname, ICQ_ROSTxGROUP, gid); 
     232      gLog.Info(tr("%sUpdating group %s.\n"), L_SRVxSTR, gname); 
    242233      addToModifyUsers(pReply->SubSequence(), ""); 
    243234      SendExpectEvent_Server(0, pReply, NULL); 
    244235    } 
    245236  } 
    246  
    247   gUserManager.UnlockGroupList(); 
    248   gUserManager.UnlockGroupIDList();        
     237  FOR_EACH_GROUP_END 
    249238} 
    250239 
     
    310299 
    311300//-----icqExportGroups---------------------------------------------------------- 
    312 void CICQDaemon::icqExportGroups(GroupList &groups) 
     301void CICQDaemon::icqExportGroups(const GroupNameMap& groups) 
    313302{ 
    314303  if (!UseServerContactList()) return; 
     
    42834272                } 
    42844273              } 
    4285                
     4274 
    42864275              u->SetIgnoreList(nType == ICQ_ROSTxIGNORE); 
    4287                
     4276 
    42884277              if (!isOnList) 
    42894278              { 
     
    42924281              } 
    42934282 
     4283              // Save GSID, SID and group memberships 
     4284              u->SaveLicqInfo(); 
     4285 
    42944286              PushPluginSignal(new CICQSignal(SIGNAL_UPDATExUSER, USER_GENERAL, 
    42954287                u->IdString(), u->PPID())); 
     
    43144306          { 
    43154307            if (!UseServerContactList()) break;  
    4316                        
     4308 
    43174309            if (szId[0] != '\0' && nTag != 0) 
    43184310            { 
    43194311              // Rename the group if we have it already or else add it 
    43204312              unsigned short nGroup = gUserManager.GetGroupFromID(nTag); 
    4321               if (nGroup == gUserManager.NumGroups()) 
     4313              if (nGroup == 0) 
    43224314              { 
    43234315                if (!gUserManager.AddGroup(szUnicodeName, nTag)) 
     
    45324524 
    45334525 
    4534               GroupList *g = gUserManager.LockGroupList(LOCK_R); 
     4526              LicqGroup* group = gUserManager.FetchGroup(n, LOCK_R); 
    45354527              std::string groupName; 
    4536               if (e->ExtraInfo() == 0) 
     4528              if (e->ExtraInfo() == 0 || group == NULL) 
    45374529                groupName = ""; // top level 
    45384530              else 
    4539                 groupName = (*g)[n-1]; 
    4540               gUserManager.UnlockGroupList(); 
     4531                groupName = group->name(); 
     4532              if (group != NULL) 
     4533                gUserManager.DropGroup(group); 
    45414534 
    45424535              // Start editing server list