Show
Ignore:
Timestamp:
06/09/08 09:04:59 (7 months ago)
Author:
eugene
Message:

Simplified filtering logic and cleaned up the code a bit.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/newosd/src/iface.cpp

    r6220 r6247  
    7171 
    7272        case USER_EVENTS: 
    73           if (sig->Argument() < 0) 
    74           { 
    75             msg.clear(); 
    76             break; 
    77           } 
    78  
    7973          if (sig->Argument() == 0) 
    8074          { 
     
    8377          } 
    8478 
     79          control = false; 
     80 
     81          if (conf->notifyOnly) 
    8582          { 
    86             control = false; 
    87             if (conf->notifyOnly) 
     83            msg = "Message from "; 
     84            msg += u->GetAlias(); 
     85            if (conf->markSecure && u->Secure()) 
     86              msg += " [secured]"; 
     87            msg += "."; 
     88          } 
     89          else 
     90          { 
     91            CUserEvent* ue = u->EventPeekId(sig->Argument()); 
     92            if (ue == NULL) 
    8893            { 
    89               msg = "Message from "; 
    90               msg += u->GetAlias(); 
    91               if (conf->markSecure && u->Secure()) 
    92                 msg += " [secured]"; 
    93               msg += "."; 
     94              msg.clear(); 
     95              break; 
    9496            } 
    95             else 
    96             { 
    97               CUserEvent* ue = u->EventPeekId(sig->Argument()); 
    98               if (ue == NULL) 
    99               { 
    100                 msg.clear(); 
    101                 break; 
    102               } 
    103               if (conf->markSecure && u->Secure()) 
    104                 msg += " (S)"; 
    105               msg += ": "; 
    106               char* trans = gTranslator.ToUnicode(const_cast<char*>(ue->Text()), 
    107                   u->UserEncoding()); 
    108               msg += trans; 
    109               delete[] trans; 
    110             } 
     97            if (conf->markSecure && u->Secure()) 
     98              msg += " (S)"; 
     99            msg += ": "; 
     100            char* trans = gTranslator.ToUnicode(const_cast<char*>(ue->Text()), 
     101                u->UserEncoding()); 
     102            msg += trans; 
     103            delete[] trans; 
    111104          } 
    112105          break; 
    113  
    114         default: 
    115           msg.clear(); 
    116           break; 
    117106      } 
    118107 
    119108      gUserManager.DropUser(u); 
     109      break; 
    120110    } 
    121       break; 
    122111 
    123112    case SIGNAL_LOGON: 
    124113    case SIGNAL_LOGOFF: 
    125114      ppidTimers[sig->PPID()] = time(NULL) + conf->quietTimeout; 
    126       break; 
    127  
    128     default: 
    129115      break; 
    130116  } 
     
    164150bool Iface::filterSignal(CICQSignal* sig) 
    165151{ 
    166   if (!(sig->SubSignal() == USER_EVENTS && sig->Argument() > 0) && 
    167       ppidTimers[sig->PPID()] > time(NULL)) 
    168     return true; 
     152  switch (sig->SubSignal()) 
     153  { 
     154    case USER_STATUS: 
     155    case USER_EVENTS: 
     156      break; 
     157 
     158    default: 
     159      return true; 
     160  } 
     161 
     162  bool isMessage = (sig->SubSignal() == USER_EVENTS && sig->Argument() > 0); 
     163 
     164  if (!isMessage && (ppidTimers[sig->PPID()] > time(NULL))) 
     165    return true; 
     166 
     167  ICQOwner* o = gUserManager.FetchOwner(sig->PPID(), LOCK_R); 
     168  if (o == NULL) 
     169    return true; 
     170 
     171  bool isOwner = (strcmp(o->IdString(), sig->Id()) == 0); 
     172  unsigned short ourStatus = o->Status(); 
     173 
     174  gUserManager.DropOwner(sig->PPID()); 
     175 
     176  // TODO status check 
     177 
     178  if (isOwner) 
     179  { 
     180    if (isMessage && conf->showMessage != GROUP_TYPE_NONE) 
     181      return false; 
     182 
     183    return true; 
     184  } 
    169185 
    170186  ICQUser* u = gUserManager.FetchUser(sig->Id(), sig->PPID(), LOCK_R); 
     
    172188    return true; 
    173189 
    174   bool ret = u->IgnoreList(); 
     190  bool ign = u->IgnoreList(); 
    175191  bool on = u->OnlineNotify(); 
    176192 
    177193  gUserManager.DropUser(u); 
    178194 
    179   if (ret) 
    180     return true; 
    181  
    182   ICQOwner* o = gUserManager.FetchOwner(sig->PPID(), LOCK_R); 
    183   if (o == NULL) 
    184     return true; 
     195  if (ign) 
     196    return true; 
     197 
     198#define GROUP_DISABLED(type) \ 
     199  (conf->type == GROUP_TYPE_NONE || \ 
     200  (conf->type == GROUP_TYPE_ONLINE_NOTIFY && !on)) 
    185201 
    186202  if (sig->SubSignal() == USER_STATUS) 
    187203  { 
    188     if (sig->Argument() == 0) 
    189     { 
    190       if (conf->statusChange == GROUP_TYPE_NONE || 
    191           (conf->statusChange == GROUP_TYPE_ONLINE_NOTIFY && !on)) 
    192         ret = true; 
    193     } 
    194     else 
    195       if (conf->logonLogoff == GROUP_TYPE_NONE || 
    196           (conf->logonLogoff == GROUP_TYPE_ONLINE_NOTIFY && !on)) 
    197         ret = true; 
     204    if (sig->Argument() == 0 && GROUP_DISABLED(statusChange)) 
     205      return true; 
     206 
     207    if (GROUP_DISABLED(logonLogoff)) 
     208      return true; 
    198209  } 
    199210 
     
    201212  { 
    202213    if (sig->Argument() < 0) 
    203       ret = true; 
    204     else 
    205       if (sig->Argument() == 0) 
    206       { 
    207         if (conf->autoResponse == GROUP_TYPE_NONE || 
    208             (conf->autoResponse == GROUP_TYPE_ONLINE_NOTIFY && !on)) 
    209           ret = true; 
    210       } 
    211       else 
    212       { 
    213         if (conf->showMessage == GROUP_TYPE_NONE || 
    214             (conf->showMessage == GROUP_TYPE_ONLINE_NOTIFY && !on && 
    215              strcmp(sig->Id(), o->IdString()) != 0)) 
    216           ret = true; 
    217       } 
    218   } 
    219  
    220   if (ret) 
    221   { 
    222     gUserManager.DropOwner(o->PPID()); 
    223     return true; 
    224   } 
    225  
    226   do 
    227   { 
    228     // TODO status check 
    229  
    230     // Don't let owner messages (e.g. auth-reqs) be filtered 
    231     if (sig->SubSignal() == USER_EVENTS && 
    232         sig->Argument() > 0) 
    233       break; 
    234  
    235     if (strcmp(sig->Id(), o->IdString()) == 0) 
    236     { 
    237       ret = true; 
    238       break; 
    239     } 
    240   } while (false); 
    241  
    242   gUserManager.DropOwner(o->PPID()); 
    243  
    244   return ret; 
     214      return true; 
     215 
     216    if (sig->Argument() == 0 && GROUP_DISABLED(autoResponse)) 
     217      return true; 
     218 
     219    if (GROUP_DISABLED(showMessage)) 
     220      return true; 
     221  } 
     222#undef GROUP_DISABLED 
     223 
     224  return false; 
    245225} 
    246226