Changeset 409

Show
Ignore:
Timestamp:
05/09/03 14:22:36 (6 years ago)
Author:
jajcus
Message:

- wait before disconnecting after <presence type="unavailable"> is received.

<presence type="invisible"> may come just after that

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/jggtrans.xml

    r399 r409  
    121121 <!-- How long to wait before restart, after jabber server connection is broken 
    122122      negative value means, that jggtrans should terminate --> 
    123  <restart_timeout>60</restart_timeout> 
     123      <restart_timeout>60</restart_timeout> 
     124 
     125 <!-- Delay between the unavailable presence is received from user and loggin out  
     126      from GG - for nice <presence type="invisible"/> support --> 
     127      <disconnect_delay>5</disconnect_delay> 
    124128 
    125129 <!-- list of gg servers to use. 
  • trunk/jggtrans.xml.Pl

    r399 r409  
    127127 <reconnect>300</reconnect> 
    128128 
     129 <!-- Opóźnienie pomiędzy otrzymaniem informacji o nieobecności użytkownika, 
     130      a wylogowaniem z GG. Służy to do poprawnej obsługi <presence type="invisible"/> --> 
     131 <disconnect_delay>5</disconnect_delay> 
     132 
    129133 <!-- Katalog z danymi użytkowników. --> 
    130134 <!-- Proszę uważać na uprawnienie - hasła użytkowników (do GG) będą tam przechowywane --> 
  • trunk/src/sessions.c

    r406 r409  
    1 /* $Id: sessions.c,v 1.70 2003/05/09 10:32:01 jajcus Exp $ */ 
     1/* $Id: sessions.c,v 1.71 2003/05/09 12:22:36 jajcus Exp $ */ 
    22 
    33/* 
     
    3939static int conn_timeout=30; 
    4040static int pong_timeout=30; 
     41static int disconnect_delay=2; 
    4142static int ping_interval=10; 
    4243static int reconnect=0; 
     
    4647static int session_try_login(Session *s); 
    4748static int session_destroy(Session *s); 
     49static void resource_remove(Resource *r,int kill_session); 
    4850 
    4951static void session_stream_destroyed(gpointer key,gpointer value,gpointer user_data){ 
     
    7779        i=config_load_int("pong_timeout",0); 
    7880        if (i>0) pong_timeout=i; 
     81        i=config_load_int("disconnect_delay",0); 
     82        if (i>0) disconnect_delay=i; 
    7983        i=config_load_int("ping_interval",0); 
    8084        if (i>0) ping_interval=i; 
     
    518522static int session_destroy(Session *s){ 
    519523GList *it; 
    520 Resource *r=NULL; 
    521524 
    522525        g_message(L_("Deleting session for '%s'"),s->jid); 
     
    545548                gg_free_session(s->ggs); 
    546549        } 
     550        while(s->resources) resource_remove((Resource *)s->resources->data,0); 
    547551        if (s->query) xmlnode_free(s->query); 
    548552        if (s->user) user_remove(s->user); 
    549         for(it=g_list_first(s->resources);it;){ 
    550                 r=(Resource *)it->data; 
    551                 if (r->name) g_free(r->name); 
    552                 if (r->show) g_free(r->show); 
    553                 if (r->status) g_free(r->status); 
    554                 it=it->next; 
    555                 g_free(r); 
    556         } 
    557         g_list_free(s->resources); 
    558553        if (s->gg_status_descr) g_free(s->gg_status_descr); 
    559         s->resources=NULL; 
    560  
    561554        g_free(s); 
    562555        return 0; 
     
    730723} 
    731724 
     725static void resource_remove(Resource *r,int kill_session){ 
     726Session *s=r->session; 
     727 
     728        debug(L_("Removing resource %s of %s"),r->name,s->jid); 
     729        if (r->name) g_free(r->name); 
     730        if (r->show) g_free(r->show); 
     731        if (r->status) g_free(r->status); 
     732        s->resources=g_list_remove(s->resources,r); 
     733        g_free(r); 
     734        if (!s->resources && kill_session){ 
     735                session_remove(s); 
     736                return; 
     737        } 
     738        if (r->disconnect_delay_func){ 
     739                r->disconnect_delay_func=0; 
     740                g_source_remove(r->disconnect_delay_func); 
     741        } 
     742} 
     743 
     744gboolean delayed_disconnect(gpointer data){ 
     745Resource *r=(Resource *)data; 
     746 
     747        g_assert(r!=NULL); 
     748 
     749        debug(L_("Delayed removal of resource %s of %s"),r->name,r->session->jid); 
     750        r->disconnect_delay_func=0; 
     751        resource_remove(r,1); 
     752        return FALSE; 
     753} 
     754 
     755 
    732756int session_set_status(Session *s,const char *resource,int available, 
    733757                        const char *show,const char *status,int priority){ 
     
    745769 
    746770        if (!available){ 
    747                 if (r){ 
    748                         debug(L_("Removing resource %s of %s"),resource?resource:"NULL",s->jid); 
    749                         if (r->name) g_free(r->name); 
    750                         if (r->show) g_free(r->show); 
    751                         if (r->status) g_free(r->status); 
    752                         s->resources=g_list_remove(s->resources,r); 
    753                         g_free(r); 
    754                         if (!s->resources){ 
    755                                 session_remove(s); 
    756                                 return -1; 
    757                         } 
    758                 } 
    759                 else{ 
     771                if (!r){ 
    760772                        g_warning(N_("Unknown resource %s of %s"),resource?resource:"NULL",s->jid); 
    761773                        return 0; 
    762774                } 
     775                if (disconnect_delay>0 && r->available){ 
     776                        r->available=0; 
     777                        debug(L_("Delaying removal of resource %s of %s"),resource?resource:"NULL",s->jid); 
     778                        r->disconnect_delay_func=g_timeout_add(disconnect_delay*1000,delayed_disconnect,r); 
     779                } 
     780                else resource_remove(r,1); 
     781                return 0; 
    763782        } 
    764783        else{ 
    765  
    766784                if ( r ){ 
     785                        if (r->disconnect_delay_func) g_source_remove(r->disconnect_delay_func); 
    767786                        if (r->show){ 
    768787                                g_free(r->show); 
     
    778797                        r=g_new0(Resource,1); 
    779798                        if (resource) r->name=g_strdup(resource); 
     799                        r->session=s; 
    780800                        s->resources=g_list_append(s->resources,r); 
    781801                } 
  • trunk/src/sessions.h

    r406 r409  
    1 /* $Id: sessions.h,v 1.23 2003/05/09 10:32:01 jajcus Exp $ */ 
     1/* $Id: sessions.h,v 1.24 2003/05/09 12:22:36 jajcus Exp $ */ 
    22 
    33/* 
     
    2929        char *show; 
    3030        char *status; 
     31        struct session_s *session; 
     32        guint disconnect_delay_func; 
    3133}Resource; 
    3234