Show
Ignore:
Timestamp:
03/13/08 10:28:17 (4 years ago)
Author:
rakshasa
Message:

* Fixed minor bugs in the display of tracker groups. Patch by Josef
Drexler.

* Cleanup of the CommandMap? class.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/rtorrent/src/rpc/command_map.cc

    r1006 r1041  
    6262} 
    6363 
    64 // The functions below should be reduced to just one. 
    65 void 
    66 CommandMap::insert_generic(key_type key, Command* variable, generic_slot targetSlot, int flags, const char* parm, const char* doc) { 
    67   iterator itr = insert(key, variable, flags, parm, doc); 
    68  
    69   itr->second.m_target      = target_generic; 
    70   itr->second.m_genericSlot = targetSlot; 
    71 } 
    72  
    73 void 
    74 CommandMap::insert_any(key_type key, Command* variable, any_slot targetSlot, int flags, const char* parm, const char* doc) { 
    75   iterator itr = insert(key, variable, flags, parm, doc); 
    76  
    77   itr->second.m_target  = target_any; 
    78   itr->second.m_anySlot = targetSlot; 
    79 } 
    80  
    81 void 
    82 CommandMap::insert_download(key_type key, Command* variable, download_slot targetSlot, int flags, const char* parm, const char* doc) { 
    83   iterator itr = insert(key, variable, flags, parm, doc); 
    84  
    85   itr->second.m_target       = target_download; 
    86   itr->second.m_downloadSlot = targetSlot; 
    87 } 
    88  
    89 void 
    90 CommandMap::insert_peer(key_type key, Command* variable, peer_slot targetSlot, int flags, const char* parm, const char* doc) { 
    91   iterator itr = insert(key, variable, flags, parm, doc); 
    92  
    93   itr->second.m_target   = target_peer; 
    94   itr->second.m_peerSlot = targetSlot; 
    95 } 
    96  
    97 void 
    98 CommandMap::insert_tracker(key_type key, Command* variable, tracker_slot targetSlot, int flags, const char* parm, const char* doc) { 
    99   iterator itr = insert(key, variable, flags, parm, doc); 
    100  
    101   itr->second.m_target      = target_tracker; 
    102   itr->second.m_trackerSlot = targetSlot; 
    103 } 
    104  
    105 void 
    106 CommandMap::insert_file(key_type key, Command* variable, file_slot targetSlot, int flags, const char* parm, const char* doc) { 
    107   iterator itr = insert(key, variable, flags, parm, doc); 
    108  
    109   itr->second.m_target   = target_file; 
    110   itr->second.m_fileSlot = targetSlot; 
    111 } 
    112  
    113 void 
    114 CommandMap::insert_file_itr(key_type key, Command* variable, file_itr_slot targetSlot, int flags, const char* parm, const char* doc) { 
    115   iterator itr = insert(key, variable, flags, parm, doc); 
    116  
    117   itr->second.m_target      = target_file_itr; 
    118   itr->second.m_fileItrSlot = targetSlot; 
    119 } 
    120  
    12164void 
    12265CommandMap::insert(key_type key, const command_map_data_type src) { 
     
    13275  // This _should_ be optimized int just one assignment. 
    13376  switch (itr->second.m_target) { 
    134   case target_generic:  itr->second.m_genericSlot  = src.m_genericSlot; break; 
    135   case target_any:      itr->second.m_anySlot      = src.m_anySlot; break; 
    136   case target_download: itr->second.m_downloadSlot = src.m_downloadSlot; break; 
    137   case target_file:     itr->second.m_fileSlot     = src.m_fileSlot; break; 
    138   case target_file_itr: itr->second.m_fileItrSlot  = src.m_fileItrSlot; break; 
    139   case target_peer:     itr->second.m_peerSlot     = src.m_peerSlot; break; 
    140   case target_tracker:  itr->second.m_trackerSlot  = src.m_trackerSlot; break; 
     77  case Command::target_generic:  itr->second.m_genericSlot  = src.m_genericSlot; break; 
     78  case Command::target_any:      itr->second.m_anySlot      = src.m_anySlot; break; 
     79  case Command::target_download: itr->second.m_downloadSlot = src.m_downloadSlot; break; 
     80  case Command::target_file:     itr->second.m_fileSlot     = src.m_fileSlot; break; 
     81  case Command::target_file_itr: itr->second.m_fileItrSlot  = src.m_fileItrSlot; break; 
     82  case Command::target_peer:     itr->second.m_peerSlot     = src.m_peerSlot; break; 
     83  case Command::target_tracker:  itr->second.m_trackerSlot  = src.m_trackerSlot; break; 
    14184  default: throw torrent::internal_error("CommandMap::insert(...) Invalid target."); 
    14285  } 
     
    15093    throw torrent::input_error("Command \"" + std::string(key) + "\" does not exist."); 
    15194 
    152   if (target.first != target_generic && target.second == NULL) { 
     95  if (target.first != Command::target_generic && target.second == NULL) { 
    15396    // We received a target that is NULL, so throw an exception unless 
    15497    // we can convert it to a void target. 
    155     if (itr->second.m_target > target_any) 
     98    if (itr->second.m_target > Command::target_any) 
    15699      throw torrent::input_error("Command type mis-match."); 
    157100 
    158     target.first = target_generic; 
     101    target.first = Command::target_generic; 
    159102  } 
    160103 
    161   if (itr->second.m_target != target.first && itr->second.m_target > target_any) { 
     104  if (itr->second.m_target != target.first && itr->second.m_target > Command::target_any) { 
    162105    // Mismatch between the target and command type. If it is not 
    163106    // possible to convert, then throw an input error. 
    164     if (target.first == target_file_itr && itr->second.m_target == target_file) 
    165       target = target_type((int)target_file, static_cast<torrent::FileListIterator*>(target.second)->file()); 
     107    if (target.first == Command::target_file_itr && itr->second.m_target == Command::target_file) 
     108      target = target_type((int)Command::target_file, static_cast<torrent::FileListIterator*>(target.second)->file()); 
    166109    else 
    167110      throw torrent::input_error("Command type mis-match."); 
     
    170113  // This _should_ be optimized int just two calls. 
    171114  switch (itr->second.m_target) { 
    172   case target_generic:  return itr->second.m_genericSlot (itr->second.m_variable, arg); 
    173   case target_any:      return itr->second.m_anySlot     (itr->second.m_variable, target, arg); 
    174   case target_download: return itr->second.m_downloadSlot(itr->second.m_variable, (core::Download*)target.second, arg); 
    175   case target_peer:     return itr->second.m_peerSlot    (itr->second.m_variable, (torrent::Peer*)target.second, arg); 
    176   case target_tracker:  return itr->second.m_trackerSlot (itr->second.m_variable, (torrent::Tracker*)target.second, arg); 
    177   case target_file:     return itr->second.m_fileSlot    (itr->second.m_variable, (torrent::File*)target.second, arg); 
    178   case target_file_itr: return itr->second.m_fileItrSlot (itr->second.m_variable, (torrent::FileListIterator*)target.second, arg); 
     115  case Command::target_generic:  return itr->second.m_genericSlot (itr->second.m_variable, arg); 
     116  case Command::target_any:      return itr->second.m_anySlot     (itr->second.m_variable, target, arg); 
     117  case Command::target_download: return itr->second.m_downloadSlot(itr->second.m_variable, (core::Download*)target.second, arg); 
     118  case Command::target_peer:     return itr->second.m_peerSlot    (itr->second.m_variable, (torrent::Peer*)target.second, arg); 
     119  case Command::target_tracker:  return itr->second.m_trackerSlot (itr->second.m_variable, (torrent::Tracker*)target.second, arg); 
     120  case Command::target_file:     return itr->second.m_fileSlot    (itr->second.m_variable, (torrent::File*)target.second, arg); 
     121  case Command::target_file_itr: return itr->second.m_fileItrSlot (itr->second.m_variable, (torrent::FileListIterator*)target.second, arg); 
    179122  default: throw torrent::internal_error("CommandMap::call_command(...) Invalid target."); 
    180123  } 
     
    183126const CommandMap::mapped_type 
    184127CommandMap::call_command(const_iterator itr, const mapped_type& arg, target_type target) { 
    185   if (target.first != target_generic && target.second == NULL) { 
     128  if (target.first != Command::target_generic && target.second == NULL) { 
    186129    // We received a target that is NULL, so throw an exception unless 
    187130    // we can convert it to a void target. 
    188     if (itr->second.m_target > target_any) 
     131    if (itr->second.m_target > Command::target_any) 
    189132      throw torrent::input_error("Command type mis-match."); 
    190133 
    191     target.first = target_generic; 
     134    target.first = Command::target_generic; 
    192135  } 
    193136 
    194   if (itr->second.m_target != target.first && itr->second.m_target > target_any) 
     137  if (itr->second.m_target != target.first && itr->second.m_target > Command::target_any) 
    195138    throw torrent::input_error("Command type mis-match."); 
    196139 
    197140  // This _should_ be optimized int just two calls. 
    198141  switch (itr->second.m_target) { 
    199   case target_generic:  return itr->second.m_genericSlot (itr->second.m_variable, arg); 
    200   case target_any:      return itr->second.m_anySlot     (itr->second.m_variable, target, arg); 
    201   case target_download: return itr->second.m_downloadSlot(itr->second.m_variable, (core::Download*)target.second, arg); 
    202   case target_peer:     return itr->second.m_peerSlot    (itr->second.m_variable, (torrent::Peer*)target.second, arg); 
    203   case target_tracker:  return itr->second.m_trackerSlot (itr->second.m_variable, (torrent::Tracker*)target.second, arg); 
    204   case target_file:     return itr->second.m_fileSlot    (itr->second.m_variable, (torrent::File*)target.second, arg); 
    205   case target_file_itr: return itr->second.m_fileItrSlot (itr->second.m_variable, (torrent::FileListIterator*)target.second, arg); 
     142  case Command::target_generic:  return itr->second.m_genericSlot (itr->second.m_variable, arg); 
     143  case Command::target_any:      return itr->second.m_anySlot     (itr->second.m_variable, target, arg); 
     144  case Command::target_download: return itr->second.m_downloadSlot(itr->second.m_variable, (core::Download*)target.second, arg); 
     145  case Command::target_peer:     return itr->second.m_peerSlot    (itr->second.m_variable, (torrent::Peer*)target.second, arg); 
     146  case Command::target_tracker:  return itr->second.m_trackerSlot (itr->second.m_variable, (torrent::Tracker*)target.second, arg); 
     147  case Command::target_file:     return itr->second.m_fileSlot    (itr->second.m_variable, (torrent::File*)target.second, arg); 
     148  case Command::target_file_itr: return itr->second.m_fileItrSlot (itr->second.m_variable, (torrent::FileListIterator*)target.second, arg); 
    206149  default: throw torrent::internal_error("CommandMap::call_command(...) Invalid target."); 
    207150  }