Changeset 4739

Show
Ignore:
Timestamp:
05/10/07 18:17:13 (2 years ago)
Author:
morris
Message:

Encapsulate client data fully, use accessors everywhere

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • wired/trunk/wired/accounts.c

    r4738 r4739  
    438438wi_boolean_t wd_accounts_check_privileges(wd_account_t *account) { 
    439439        wd_client_t             *client = wd_client(); 
    440          
    441         if(!client->account->elevate_privileges) { 
    442                 if(account->get_user_info && !client->account->get_user_info) 
    443                         return false; 
    444  
    445                 if(account->broadcast && !client->account->broadcast) 
    446                         return false; 
    447  
    448                 if(account->post_news && !client->account->post_news) 
    449                         return false; 
    450  
    451                 if(account->clear_news && !client->account->clear_news) 
    452                         return false; 
    453  
    454                 if(account->download && !client->account->download) 
    455                         return false; 
    456  
    457                 if(account->upload && !client->account->upload) 
    458                         return false; 
    459  
    460                 if(account->upload_anywhere && !client->account->upload_anywhere) 
    461                         return false; 
    462  
    463                 if(account->create_folders && !client->account->create_folders) 
    464                         return false; 
    465  
    466                 if(account->alter_files && !client->account->alter_files) 
    467                         return false; 
    468  
    469                 if(account->delete_files && !client->account->delete_files) 
    470                         return false; 
    471  
    472                 if(account->view_dropboxes && !client->account->view_dropboxes) 
    473                         return false; 
    474  
    475                 if(account->create_accounts && !client->account->create_accounts) 
    476                         return false; 
    477  
    478                 if(account->edit_accounts && !client->account->edit_accounts) 
    479                         return false; 
    480  
    481                 if(account->delete_accounts && !client->account->delete_accounts) 
    482                         return false; 
    483  
    484                 if(account->elevate_privileges && !client->account->elevate_privileges) 
    485                         return false; 
    486  
    487                 if(account->kick_users && !client->account->kick_users) 
    488                         return false; 
    489  
    490                 if(account->ban_users && !client->account->ban_users) 
    491                         return false; 
    492  
    493                 if(account->cannot_be_kicked && !client->account->cannot_be_kicked) 
    494                         return false; 
    495  
    496                 if(account->set_topic && !client->account->set_topic) 
     440        wd_account_t    *client_account; 
     441         
     442        client_account = wd_client_account(client); 
     443         
     444        if(!client_account->elevate_privileges) { 
     445                if(account->get_user_info && !client_account->get_user_info) 
     446                        return false; 
     447 
     448                if(account->broadcast && !client_account->broadcast) 
     449                        return false; 
     450 
     451                if(account->post_news && !client_account->post_news) 
     452                        return false; 
     453 
     454                if(account->clear_news && !client_account->clear_news) 
     455                        return false; 
     456 
     457                if(account->download && !client_account->download) 
     458                        return false; 
     459 
     460                if(account->upload && !client_account->upload) 
     461                        return false; 
     462 
     463                if(account->upload_anywhere && !client_account->upload_anywhere) 
     464                        return false; 
     465 
     466                if(account->create_folders && !client_account->create_folders) 
     467                        return false; 
     468 
     469                if(account->alter_files && !client_account->alter_files) 
     470                        return false; 
     471 
     472                if(account->delete_files && !client_account->delete_files) 
     473                        return false; 
     474 
     475                if(account->view_dropboxes && !client_account->view_dropboxes) 
     476                        return false; 
     477 
     478                if(account->create_accounts && !client_account->create_accounts) 
     479                        return false; 
     480 
     481                if(account->edit_accounts && !client_account->edit_accounts) 
     482                        return false; 
     483 
     484                if(account->delete_accounts && !client_account->delete_accounts) 
     485                        return false; 
     486 
     487                if(account->elevate_privileges && !client_account->elevate_privileges) 
     488                        return false; 
     489 
     490                if(account->kick_users && !client_account->kick_users) 
     491                        return false; 
     492 
     493                if(account->ban_users && !client_account->ban_users) 
     494                        return false; 
     495 
     496                if(account->cannot_be_kicked && !client_account->cannot_be_kicked) 
     497                        return false; 
     498 
     499                if(account->set_topic && !client_account->set_topic) 
    497500                        return false; 
    498501        } 
     
    562565        wi_enumerator_t         *enumerator; 
    563566        wd_client_t                     *client; 
     567        wd_account_t            *account; 
    564568 
    565569        wi_hash_rdlock(wd_clients); 
     
    568572         
    569573        while((client = wi_enumerator_next_data(enumerator))) { 
    570                 if(wi_is_equal(client->account->name, name)) 
     574                account = wd_client_account(client); 
     575                 
     576                if(wi_is_equal(account->name, name)) 
    571577                        _wd_accounts_reload_client(client); 
    572578        } 
     
    580586        wi_enumerator_t         *enumerator; 
    581587        wd_client_t                     *client; 
     588        wd_account_t            *account; 
    582589 
    583590        wi_hash_rdlock(wd_clients); 
     
    586593         
    587594        while((client = wi_enumerator_next_data(enumerator))) { 
    588                 if(wi_is_equal(client->account->group, name)) 
     595                account = wd_client_account(client); 
     596                 
     597                if(wi_is_equal(account->group, name)) 
    589598                        _wd_accounts_reload_client(client); 
    590599        } 
     
    596605 
    597606static void _wd_accounts_reload_client(wd_client_t *client) { 
    598         wd_account_t    *account; 
    599         wi_boolean_t    admin; 
    600          
    601         account = wd_accounts_read_user_and_group(client->account->name); 
     607        wd_account_t    *account, *new_account; 
     608        wi_boolean_t    admin, new_admin; 
     609         
     610        account = wd_client_account(client); 
     611        new_account = wd_accounts_read_user_and_group(account->name); 
    602612         
    603613        if(!account) 
    604614                return; 
    605615         
    606         wd_client_wrlock_client(client); 
    607          
    608         wi_retain(account); 
    609         wi_release(client->account); 
    610          
    611         client->account = account; 
    612  
    613         admin = client->admin; 
    614         client->admin = (client->account->kick_users || client->account->ban_users); 
    615  
    616         wd_client_unlock_client(client); 
    617          
    618         if(client->admin != admin) 
     616        wd_client_set_account(client, new_account); 
     617         
     618        admin = wd_client_is_admin(client); 
     619        new_admin = (new_account->kick_users || new_account->ban_users); 
     620        wd_client_set_admin(client, new_admin); 
     621         
     622        if(admin != new_admin) 
    619623                wd_client_broadcast_status(client); 
    620624 
     625        _wd_accounts_sreply_privileges(client); 
     626} 
     627 
     628 
     629 
     630static void _wd_accounts_sreply_privileges(wd_client_t *client) { 
     631        wd_account_t    *account; 
     632         
     633        account = wd_client_account(client); 
     634         
    621635        wd_client_lock_socket(client); 
    622         _wd_accounts_sreply_privileges(client); 
     636        wd_sreply(wd_client_socket(client), 602, WI_STR("%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%u%c%u%c%u%c%u%c%d"), 
     637                          account->get_user_info,                       WD_FIELD_SEPARATOR, 
     638                          account->broadcast,                           WD_FIELD_SEPARATOR, 
     639                          account->post_news,                           WD_FIELD_SEPARATOR, 
     640                          account->clear_news,                          WD_FIELD_SEPARATOR, 
     641                          account->download,                            WD_FIELD_SEPARATOR, 
     642                          account->upload,                                      WD_FIELD_SEPARATOR, 
     643                          account->upload_anywhere,                     WD_FIELD_SEPARATOR, 
     644                          account->create_folders,                      WD_FIELD_SEPARATOR, 
     645                          account->alter_files,                         WD_FIELD_SEPARATOR, 
     646                          account->delete_files,                        WD_FIELD_SEPARATOR, 
     647                          account->view_dropboxes,                      WD_FIELD_SEPARATOR, 
     648                          account->create_accounts,                     WD_FIELD_SEPARATOR, 
     649                          account->edit_accounts,                       WD_FIELD_SEPARATOR, 
     650                          account->delete_accounts,                     WD_FIELD_SEPARATOR, 
     651                          account->elevate_privileges,          WD_FIELD_SEPARATOR, 
     652                          account->kick_users,                          WD_FIELD_SEPARATOR, 
     653                          account->ban_users,                           WD_FIELD_SEPARATOR, 
     654                          account->cannot_be_kicked,            WD_FIELD_SEPARATOR, 
     655                          account->download_speed,                      WD_FIELD_SEPARATOR, 
     656                          account->upload_speed,                        WD_FIELD_SEPARATOR, 
     657                          account->download_limit,                      WD_FIELD_SEPARATOR, 
     658                          account->upload_limit,                        WD_FIELD_SEPARATOR, 
     659                          account->set_topic); 
    623660        wd_client_unlock_socket(client); 
    624 } 
    625  
    626  
    627  
    628 static void _wd_accounts_sreply_privileges(wd_client_t *client) { 
    629         wd_sreply(client->socket, 602, WI_STR("%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%d%c%u%c%u%c%u%c%u%c%d"), 
    630                           client->account->get_user_info,                       WD_FIELD_SEPARATOR, 
    631                           client->account->broadcast,                           WD_FIELD_SEPARATOR, 
    632                           client->account->post_news,                           WD_FIELD_SEPARATOR, 
    633                           client->account->clear_news,                          WD_FIELD_SEPARATOR, 
    634                           client->account->download,                            WD_FIELD_SEPARATOR, 
    635                           client->account->upload,                                      WD_FIELD_SEPARATOR, 
    636                           client->account->upload_anywhere,                     WD_FIELD_SEPARATOR, 
    637                           client->account->create_folders,                      WD_FIELD_SEPARATOR, 
    638                           client->account->alter_files,                         WD_FIELD_SEPARATOR, 
    639                           client->account->delete_files,                        WD_FIELD_SEPARATOR, 
    640                           client->account->view_dropboxes,                      WD_FIELD_SEPARATOR, 
    641                           client->account->create_accounts,                     WD_FIELD_SEPARATOR, 
    642                           client->account->edit_accounts,                       WD_FIELD_SEPARATOR, 
    643                           client->account->delete_accounts,                     WD_FIELD_SEPARATOR, 
    644                           client->account->elevate_privileges,          WD_FIELD_SEPARATOR, 
    645                           client->account->kick_users,                          WD_FIELD_SEPARATOR, 
    646                           client->account->ban_users,                           WD_FIELD_SEPARATOR, 
    647                           client->account->cannot_be_kicked,            WD_FIELD_SEPARATOR, 
    648                           client->account->download_speed,                      WD_FIELD_SEPARATOR, 
    649                           client->account->upload_speed,                        WD_FIELD_SEPARATOR, 
    650                           client->account->download_limit,                      WD_FIELD_SEPARATOR, 
    651                           client->account->upload_limit,                        WD_FIELD_SEPARATOR, 
    652                           client->account->set_topic); 
    653661} 
    654662 
  • wired/trunk/wired/chats.c

    r4738 r4739  
    236236 
    237237void wd_chat_add_client(wd_chat_t *chat, wd_client_t *client) { 
    238         wd_client_rdlock_client(client); 
    239238        wd_broadcast(chat, 302, WI_STR("%u%c%u%c%u%c%u%c%u%c%#@%c%#@%c%#@%c%#@%c%#@%c%#@"), 
    240                                  chat->cid,                     WD_FIELD_SEPARATOR, 
    241                                  client->uid,           WD_FIELD_SEPARATOR, 
    242                                  client->idle,          WD_FIELD_SEPARATOR, 
    243                                  client->admin,         WD_FIELD_SEPARATOR, 
    244                                  client->icon,          WD_FIELD_SEPARATOR, 
    245                                  client->nick,          WD_FIELD_SEPARATOR, 
    246                                  client->login,         WD_FIELD_SEPARATOR, 
    247                                  client->ip,            WD_FIELD_SEPARATOR, 
    248                                  client->host,          WD_FIELD_SEPARATOR, 
    249                                  client->status,        WD_FIELD_SEPARATOR, 
    250                                  client->image); 
    251         wd_client_unlock_client(client); 
     239                                 chat->cid,                                             WD_FIELD_SEPARATOR, 
     240                                 wd_client_uid(client),                 WD_FIELD_SEPARATOR, 
     241                                 wd_client_is_idle(client),             WD_FIELD_SEPARATOR, 
     242                                 wd_client_is_admin(client),    WD_FIELD_SEPARATOR, 
     243                                 wd_client_icon(client),                WD_FIELD_SEPARATOR, 
     244                                 wd_client_nick(client),                WD_FIELD_SEPARATOR, 
     245                                 wd_client_login(client),               WD_FIELD_SEPARATOR, 
     246                                 wd_client_ip(client),                  WD_FIELD_SEPARATOR, 
     247                                 wd_client_host(client),                WD_FIELD_SEPARATOR, 
     248                                 wd_client_status(client),              WD_FIELD_SEPARATOR, 
     249                                 wd_client_image(client)); 
    252250         
    253251        wd_chat_wrlock(chat); 
     
    284282         
    285283        while((client = wi_enumerator_next_data(enumerator))) { 
    286                 wd_client_rdlock_client(client); 
    287                  
    288                 if(client->state == WD_CLIENT_STATE_LOGGED_IN) { 
     284                if(wd_client_state(client) == WD_CLIENT_STATE_LOGGED_IN) { 
    289285                        wd_reply(310, WI_STR("%u%c%u%c%u%c%u%c%u%c%#@%c%#@%c%#@%c%#@%c%#@%c%#@"), 
    290                                          chat->cid,                     WD_FIELD_SEPARATOR, 
    291                                          client->uid,         WD_FIELD_SEPARATOR, 
    292                                          client->idle,                WD_FIELD_SEPARATOR, 
    293                                          client->admin,               WD_FIELD_SEPARATOR, 
    294                                          client->icon,                WD_FIELD_SEPARATOR, 
    295                                          client->nick,                WD_FIELD_SEPARATOR, 
    296                                          client->login,               WD_FIELD_SEPARATOR, 
    297                                          client->ip,          WD_FIELD_SEPARATOR, 
    298                                          client->host,                WD_FIELD_SEPARATOR, 
    299                                          client->status,      WD_FIELD_SEPARATOR, 
    300                                          client->image); 
     286                                         chat->cid,                                            WD_FIELD_SEPARATOR, 
     287                                         wd_client_uid(client),                       WD_FIELD_SEPARATOR, 
     288                                         wd_client_is_idle(client),           WD_FIELD_SEPARATOR, 
     289                                         wd_client_is_admin(client),  WD_FIELD_SEPARATOR, 
     290                                         wd_client_icon(client),              WD_FIELD_SEPARATOR, 
     291                                         wd_client_nick(client),              WD_FIELD_SEPARATOR, 
     292                                         wd_client_login(client),             WD_FIELD_SEPARATOR, 
     293                                         wd_client_ip(client),                WD_FIELD_SEPARATOR, 
     294                                         wd_client_host(client),              WD_FIELD_SEPARATOR, 
     295                                         wd_client_status(client),            WD_FIELD_SEPARATOR, 
     296                                         wd_client_image(client)); 
    301297                } 
    302  
    303                 wd_client_unlock_client(client); 
    304298        } 
    305299         
     
    325319 
    326320        wi_release(chat->topic.nick); 
    327         chat->topic.nick = wi_copy(client->nick); 
     321        chat->topic.nick = wi_copy(wd_client_nick(client)); 
    328322 
    329323        wi_release(chat->topic.login); 
    330         chat->topic.login = wi_copy(client->login); 
     324        chat->topic.login = wi_copy(wd_client_login(client)); 
    331325 
    332326        wi_release(chat->topic.ip); 
    333         chat->topic.ip = wi_copy(client->ip); 
     327        chat->topic.ip = wi_copy(wd_client_ip(client)); 
    334328 
    335329        wd_chat_unlock(chat); 
     
    381375        wd_broadcast(chat, 303, WI_STR("%u%c%u"), 
    382376                                 chat->cid,             WD_FIELD_SEPARATOR, 
    383                                  client->uid); 
    384 } 
     377                                 wd_client_uid(client)); 
     378} 
  • wired/trunk/wired/clients.c

    r4738 r4739  
    4545#define WD_CLIENTS_TIMER_INTERVAL               60.0 
    4646 
     47#define WD_CLIENT_SET_VALUE(dst, src)                                   \ 
     48        WI_STMT_START                                                                           \ 
     49                wi_rwlock_wrlock(client->client_lock);                  \ 
     50                (dst) = (src);                                                                  \ 
     51                wi_rwlock_unlock(client->client_lock);                  \ 
     52        WI_STMT_END 
     53 
     54#define WD_CLIENT_SET_OBJECT(dst, src)                                  \ 
     55        WI_STMT_START                                                                           \ 
     56                wi_rwlock_wrlock(client->client_lock);                  \ 
     57                (dst) = wi_retain((src));                                               \ 
     58                wi_rwlock_unlock(client->client_lock);                  \ 
     59        WI_STMT_END 
     60 
     61#define WD_CLIENT_RETURN_VALUE(src)                                             \ 
     62        WI_STMT_START                                                                           \ 
     63                typeof(src)             _value;                                                 \ 
     64                                                                                                                \ 
     65                wi_rwlock_rdlock(client->client_lock);                  \ 
     66                _value = (src);                                                                 \ 
     67                wi_rwlock_unlock(client->client_lock);                  \ 
     68                                                                                                                \ 
     69                return _value;                                                                  \ 
     70        WI_STMT_END 
     71 
     72#define WD_CLIENT_RETURN_OBJECT(src)                                    \ 
     73        WI_STMT_START                                                                           \ 
     74                typeof(src)             _object;                                                \ 
     75                                                                                                                \ 
     76                wi_rwlock_rdlock(client->client_lock);                  \ 
     77                _object = wi_autorelease(wi_retain((src)));             \ 
     78                wi_rwlock_unlock(client->client_lock);                  \ 
     79                                                                                                                \ 
     80                return _object;                                                                 \ 
     81        WI_STMT_END 
     82 
     83 
     84 
     85struct _wd_client { 
     86        wi_runtime_base_t                                       base; 
     87         
     88        wi_rwlock_t                                                     *client_lock; 
     89        wi_lock_t                                                       *socket_lock; 
     90         
     91        wi_socket_t                                                     *socket; 
     92         
     93        wd_uid_t                                                        uid; 
     94        wd_client_state_t                                       state; 
     95        wd_icon_t                                                       icon; 
     96        wi_boolean_t                                            idle; 
     97        wi_boolean_t                                            admin; 
     98         
     99        wd_account_t                                            *account; 
     100 
     101        wi_string_t                                                     *nick; 
     102        wi_string_t                                                     *login; 
     103        wi_string_t                                                     *ip; 
     104        wi_string_t                                                     *host; 
     105        wi_uinteger_t                                           port; 
     106        wi_string_t                                                     *version; 
     107        wi_string_t                                                     *status; 
     108         
     109        wi_string_t                                                     *image; 
     110         
     111        wi_time_interval_t                                      login_time; 
     112        wi_time_interval_t                                      idle_time; 
     113         
     114        wi_array_t                                                      *transfers_queue; 
     115        wi_uinteger_t                                           downloads; 
     116        wi_uinteger_t                                           uploads; 
     117}; 
     118 
    47119 
    48120static void                                                             wd_clients_update_idle(wi_timer_t *); 
     
    51123static wi_string_t *                                    wd_client_description(wi_runtime_instance_t *); 
    52124 
    53 static wd_uid_t                                                 wd_client_uid(void); 
     125static wd_uid_t                                                 _wd_client_next_uid(void); 
    54126 
    55127 
     
    106178                 
    107179                while((client = wi_enumerator_next_data(enumerator))) { 
    108                         wd_client_wrlock_client(client); 
     180                        wi_rwlock_wrlock(client->client_lock); 
    109181                         
    110182                        if(client->state == WD_CLIENT_STATE_LOGGED_IN && 
     
    116188                        } 
    117189 
    118                         wd_client_unlock_client(client); 
     190                        wi_rwlock_unlock(client->client_lock); 
    119191                } 
    120192        } 
     
    166238 
    167239 
     240wd_client_t * wd_clients_client_with_uid(wd_uid_t uid) { 
     241        wd_client_t     *client; 
     242 
     243        wi_hash_rdlock(wd_clients); 
     244        client = wi_autorelease(wi_retain(wi_hash_data_for_key(wd_clients, wi_number_with_int32(uid)))); 
     245        wi_hash_unlock(wd_clients); 
     246         
     247        return client; 
     248} 
     249 
     250 
     251 
     252#pragma mark - 
     253 
     254void wd_client_set(wd_client_t *client) { 
     255        wi_hash_set_data_for_key(wi_thread_hash(), client, WI_STR(WD_CLIENTS_THREAD_KEY)); 
     256} 
     257 
     258 
     259 
     260wd_client_t * wd_client(void) { 
     261        return wi_hash_data_for_key(wi_thread_hash(), WI_STR(WD_CLIENTS_THREAD_KEY)); 
     262} 
     263 
     264 
     265 
    168266#pragma mark - 
    169267 
     
    177275        wi_address_t    *address; 
    178276 
    179         client->uid                             = wd_client_uid(); 
     277        client->uid                             = _wd_client_next_uid(); 
    180278        client->socket                  = wi_retain(socket); 
    181279        client->state                   = WD_CLIENT_STATE_CONNECTED; 
     
    187285        client->host                    = wi_retain(wi_address_hostname(address)); 
    188286         
     287        client->client_lock             = wi_rwlock_init(wi_rwlock_alloc()); 
    189288        client->socket_lock             = wi_lock_init(wi_lock_alloc()); 
    190         client->client_lock             = wi_rwlock_init(wi_rwlock_alloc()); 
    191289         
    192290        client->transfers_queue = wi_array_init(wi_array_alloc()); 
     
    235333#pragma mark - 
    236334 
    237 static wd_uid_t wd_client_uid(void) { 
     335static wd_uid_t _wd_client_next_uid(void) { 
    238336        wd_uid_t                uid; 
    239337         
     
    250348 
    251349        return uid; 
    252 } 
    253  
    254  
    255  
    256 #pragma mark - 
    257  
    258 void wd_client_wrlock_client(wd_client_t *client) { 
    259         wi_rwlock_wrlock(client->client_lock); 
    260 } 
    261  
    262  
    263  
    264 void wd_client_rdlock_client(wd_client_t *client) { 
    265         wi_rwlock_rdlock(client->client_lock); 
    266 } 
    267  
    268  
    269  
    270 void wd_client_unlock_client(wd_client_t *client) { 
    271         wi_rwlock_unlock(client->client_lock); 
    272 } 
    273  
    274  
    275  
    276  
    277 void wd_client_lock_socket(wd_client_t *client) { 
    278         wi_lock_lock(client->socket_lock); 
    279 } 
    280  
    281  
    282  
    283 void wd_client_unlock_socket(wd_client_t *client) { 
    284         wi_lock_unlock(client->socket_lock); 
    285 } 
    286  
    287  
    288  
    289 #pragma mark - 
    290  
    291 void wd_client_set(wd_client_t *client) { 
    292         wi_hash_set_data_for_key(wi_thread_hash(), client, WI_STR(WD_CLIENTS_THREAD_KEY)); 
    293 } 
    294  
    295  
    296  
    297 wd_client_t * wd_client(void) { 
    298         return wi_hash_data_for_key(wi_thread_hash(), WI_STR(WD_CLIENTS_THREAD_KEY)); 
    299 } 
    300  
    301  
    302  
    303 #pragma mark - 
    304  
    305 wd_client_t * wd_client_with_uid(wd_uid_t uid) { 
    306         wd_client_t     *client; 
    307  
    308         wi_hash_rdlock(wd_clients); 
    309         client = wi_autorelease(wi_retain(wi_hash_data_for_key(wd_clients, wi_number_with_int32(uid)))); 
    310         wi_hash_unlock(wd_clients); 
    311          
    312         return client; 
    313350} 
    314351 
     
    326363                                 client->status); 
    327364} 
     365 
     366 
     367 
     368#pragma mark - 
     369 
     370void wd_client_lock_socket(wd_client_t *client) { 
     371        wi_lock_lock(client->socket_lock); 
     372} 
     373 
     374 
     375 
     376void wd_client_unlock_socket(wd_client_t *client) { 
     377        wi_lock_unlock(client->socket_lock); 
     378} 
     379 
     380 
     381 
     382#pragma mark - 
     383 
     384void wd_client_set_socket(wd_client_t *client, wi_socket_t *socket) { 
     385        wi_rwlock_wrlock(client->client_lock); 
     386        client->socket = wi_retain(socket); 
     387        wi_rwlock_unlock(client->client_lock); 
     388} 
     389 
     390 
     391 
     392wi_socket_t * wd_client_socket(wd_client_t *client) { 
     393        wi_socket_t             *socket; 
     394         
     395        wi_rwlock_rdlock(client->client_lock); 
     396        socket = wi_autorelease(wi_retain(client->socket)); 
     397        wi_rwlock_unlock(client->client_lock); 
     398         
     399        return socket; 
     400} 
     401 
     402 
     403 
     404void wd_client_set_uid(wd_client_t *client, wd_uid_t uid) { 
     405        WD_CLIENT_SET_VALUE(client->uid, uid); 
     406} 
     407 
     408 
     409 
     410wd_uid_t wd_client_uid(wd_client_t *client) { 
     411        WD_CLIENT_RETURN_VALUE(client->uid); 
     412} 
     413 
     414 
     415 
     416void wd_client_set_state(wd_client_t *client, wd_client_state_t state) { 
     417        WD_CLIENT_SET_VALUE(client->state, state); 
     418} 
     419 
     420 
     421 
     422wd_client_state_t wd_client_state(wd_client_t *client) { 
     423        WD_CLIENT_RETURN_VALUE(client->state); 
     424} 
     425 
     426 
     427 
     428void wd_client_set_icon(wd_client_t *client, wd_icon_t icon) { 
     429        WD_CLIENT_SET_VALUE(client->icon, icon); 
     430} 
     431 
     432 
     433 
     434wd_icon_t wd_client_icon(wd_client_t *client) { 
     435        WD_CLIENT_RETURN_VALUE(client->icon); 
     436} 
     437 
     438 
     439 
     440void wd_client_set_idle(wd_client_t *client, wi_boolean_t idle) { 
     441        WD_CLIENT_SET_VALUE(client->idle, idle); 
     442} 
     443 
     444 
     445 
     446wi_boolean_t wd_client_is_idle(wd_client_t *client) { 
     447        WD_CLIENT_RETURN_VALUE(client->idle); 
     448} 
     449 
     450 
     451 
     452void wd_client_set_admin(wd_client_t *client, wi_boolean_t admin) { 
     453        WD_CLIENT_SET_VALUE(client->admin, admin); 
     454} 
     455 
     456 
     457 
     458wi_boolean_t wd_client_is_admin(wd_client_t *client) { 
     459        WD_CLIENT_RETURN_VALUE(client->admin); 
     460} 
     461 
     462 
     463 
     464void wd_client_set_account(wd_client_t *client, wd_account_t *account) { 
     465        WD_CLIENT_SET_OBJECT(client->account, account); 
     466} 
     467 
     468 
     469 
     470wd_account_t * wd_client_account(wd_client_t *client) { 
     471        WD_CLIENT_RETURN_OBJECT(client->account); 
     472} 
     473 
     474 
     475 
     476void wd_client_set_nick(wd_client_t *client, wi_string_t *nick) { 
     477        WD_CLIENT_SET_OBJECT(client->nick, nick); 
     478} 
     479 
     480 
     481 
     482wi_string_t * wd_client_nick(wd_client_t *client) { 
     483        WD_CLIENT_RETURN_OBJECT(client->nick); 
     484} 
     485 
     486 
     487 
     488void wd_client_set_login(wd_client_t *client, wi_string_t *login) { 
     489        WD_CLIENT_SET_OBJECT(client->login, login); 
     490} 
     491 
     492 
     493 
     494wi_string_t * wd_client_login(wd_client_t *client) { 
     495        WD_CLIENT_RETURN_OBJECT(client->login); 
     496} 
     497 
     498 
     499 
     500void wd_client_set_ip(wd_client_t *client, wi_string_t *ip) { 
     501        WD_CLIENT_SET_OBJECT(client->ip, ip); 
     502} 
     503 
     504 
     505 
     506wi_string_t * wd_client_ip(wd_client_t *client) { 
     507        WD_CLIENT_RETURN_OBJECT(client->ip); 
     508} 
     509 
     510 
     511 
     512void wd_client_set_host(wd_client_t *client, wi_string_t *host) { 
     513        WD_CLIENT_SET_OBJECT(client->host, host); 
     514} 
     515 
     516 
     517 
     518wi_string_t * wd_client_host(wd_client_t *client) { 
     519        WD_CLIENT_RETURN_OBJECT(client->host); 
     520} 
     521 
     522 
     523 
     524void wd_client_set_port(wd_client_t *client, wi_uinteger_t port) { 
     525        WD_CLIENT_SET_VALUE(client->port, port); 
     526} 
     527 
     528 
     529 
     530wi_uinteger_t wd_client_port(wd_client_t *client) { 
     531        WD_CLIENT_RETURN_VALUE(client->port); 
     532} 
     533 
     534 
     535 
     536void wd_client_set_version(wd_client_t *client, wi_string_t *version) { 
     537        WD_CLIENT_SET_OBJECT(client->version, version); 
     538} 
     539 
     540 
     541 
     542wi_string_t * wd_client_version(wd_client_t *client) { 
     543        WD_CLIENT_RETURN_OBJECT(client->version); 
     544} 
     545 
     546 
     547 
     548void wd_client_set_status(wd_client_t *client, wi_string_t *status) { 
     549        WD_CLIENT_SET_OBJECT(client->status, status); 
     550} 
     551 
     552 
     553 
     554wi_string_t * wd_client_status(wd_client_t *client) { 
     555        WD_CLIENT_RETURN_OBJECT(client->status); 
     556} 
     557 
     558 
     559 
     560void wd_client_set_image(wd_client_t *client, wi_string_t *image) { 
     561        WD_CLIENT_SET_OBJECT(client->image, image); 
     562} 
     563 
     564 
     565wi_string_t * wd_client_image(wd_client_t *client) { 
     566        WD_CLIENT_RETURN_OBJECT(client->image); 
     567} 
     568 
     569 
     570 
     571void wd_client_set_login_time(wd_client_t *client, wi_time_interval_t login_time) { 
     572        WD_CLIENT_SET_VALUE(client->login_time, login_time); 
     573} 
     574 
     575 
     576 
     577wi_time_interval_t wd_client_login_time(wd_client_t *client) { 
     578        WD_CLIENT_RETURN_VALUE(client->login_time); 
     579} 
     580 
     581 
     582 
     583void wd_client_set_idle_time(wd_client_t *client, wi_time_interval_t idle_time) { 
     584        WD_CLIENT_SET_VALUE(client->idle_time, idle_time); 
     585} 
     586 
     587 
     588 
     589wi_time_interval_t wd_client_idle_time(wd_client_t *client) { 
     590        WD_CLIENT_RETURN_VALUE(client->idle_time); 
     591} 
     592 
     593 
     594 
     595void wd_client_set_transfers_queue(wd_client_t *client, wi_array_t *transfers_queue) { 
     596        WD_CLIENT_SET_OBJECT(client->transfers_queue, transfers_queue); 
     597} 
     598 
     599 
     600 
     601wi_array_t * wd_client_transfers_queue(wd_client_t *client) { 
     602        WD_CLIENT_RETURN_OBJECT(client->transfers_queue); 
     603} 
     604 
     605 
     606 
     607void wd_client_increase_downloads(wd_client_t *client) { 
     608        WD_CLIENT_SET_VALUE(client->downloads, client->downloads + 1); 
     609} 
     610 
     611 
     612 
     613void wd_client_decrease_downloads(wd_client_t *client) { 
     614        WD_CLIENT_SET_VALUE(client->downloads, client->downloads - 1); 
     615} 
     616 
     617 
     618 
     619wi_uinteger_t wd_client_downloads(wd_client_t *client) { 
     620        WD_CLIENT_RETURN_VALUE(client->downloads); 
     621} 
     622 
     623 
     624 
     625void wd_client_increase_uploads(wd_client_t *client) { 
     626        WD_CLIENT_SET_VALUE(client->uploads, client->uploads + 1); 
     627} 
     628 
     629 
     630 
     631void wd_client_decrease_uploads(wd_client_t *client) { 
     632        WD_CLIENT_SET_VALUE(client->uploads, client->uploads - 1); 
     633} 
     634