Changeset 312

Show
Ignore:
Timestamp:
02/26/08 23:23:14 (9 months ago)
Author:
rm
Message:

support tracking group membership

Location:
trunk/thrucommon/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/thrucommon/src/Spread.cpp

    r311 r312  
    4747{ 
    4848    LOG4CXX_INFO (logger, "~Spread"); 
    49     map<string, vector<string> >::iterator i; 
     49    map<string, set<string> >::iterator i; 
    5050    for (i = this->groups.begin (); 
    5151         i != this->groups.end (); 
     
    6060{ 
    6161    LOG4CXX_DEBUG (logger, "join: group=" + group); 
    62     map<string, vector<string> >::iterator i; 
     62    map<string, set<string> >::iterator i; 
    6363    i = this->groups.find (group.c_str ()); 
    6464    if (i != this->groups.end ()) 
     
    8686{ 
    8787    LOG4CXX_DEBUG (logger, "leave: group=" + group); 
    88     map<string, vector<string> >::iterator i; 
     88    map<string, set<string> >::iterator i; 
    8989    i = this->groups.find (group.c_str ()); 
    9090    if (i != this->groups.end ()) 
     
    195195            if (Is_regular_mess (service_type)) 
    196196            { 
    197                 // TODO: null terminate the message, can't hurt and we, so  
    198                 // long as it's not size - 1 in length... 
    199                 buf[buf_len] = '\0'; 
    200                 LOG4CXX_DEBUG (logger, string ("receive: buf=") + buf); 
     197                // can't really hurt since we don't change the size, only 
     198                // useful when plain text is being sent 
     199                if (buf_len < buf_size) 
     200                    buf[buf_len] = '\0'; 
     201                // convert groups array to a vector 
    201202                vector<string> group_strs; 
    202203                for (int n = 0; n < num_groups; n++) 
    203204                    group_strs.push_back (groups[n]); 
     205                // and dispatch 
    204206                this->dispatch (sender, group_strs, type, buf, buf_len); 
     207                // count it as handled 
    205208                i++; 
    206209            } 
    207             // TODO: handle membership messages here 
     210            else if (Is_reg_memb_mess (service_type)) 
     211            { 
     212                membership_info  memb_info; 
     213                int ret = SP_get_memb_info (buf, service_type, &memb_info); 
     214                if (ret < 0) 
     215                { 
     216                    string error = SP_error_to_string (ret); 
     217                    LOG4CXX_ERROR (logger, error); 
     218                    throw new SpreadException (error); 
     219                } 
     220                else if (Is_caused_join_mess (service_type)) 
     221                { 
     222                    LOG4CXX_INFO (logger, string ("run: new member=") +  
     223                                  memb_info.changed_member); 
     224                } 
     225                else if (Is_caused_leave_mess (service_type) || 
     226                         Is_caused_disconnect_mess (service_type)) 
     227                { 
     228                    LOG4CXX_INFO (logger, string ("run: leaving member=") +  
     229                                  memb_info.changed_member); 
     230                } 
     231                else if (Is_caused_network_mess (service_type)) 
     232                { 
     233                    LOG4CXX_INFO (logger, "run: network change..."); 
     234                } 
     235 
     236                this->groups[sender].clear (); 
     237                LOG4CXX_DEBUG (logger, string ("run: membership group=") + 
     238                               sender); 
     239                for (int j = 0; j < num_groups; j++) 
     240                { 
     241                    this->groups[sender].insert (groups[j]); 
     242                    LOG4CXX_DEBUG (logger, string ("run:    member=") + 
     243                                   groups[j]); 
     244                } 
     245            } 
    208246        } 
    209247        else 
  • trunk/thrucommon/src/Spread.h

    r311 r312  
    1111#include <string> 
    1212#include <queue> 
     13#include <set> 
    1314#include <vector> 
    1415 
     
    8687        std::string private_group; 
    8788        mailbox mbox; 
    88         std::map<std::string, std::vector<std::string> > groups; 
     89        std::map<std::string, std::set<std::string> > groups; 
    8990        std::map<std::string, std::map<int, std::map<std::string, 
    9091            std::vector<SubscriberCallbackInfo *> > > > subscriptions;