Changeset 2218

Show
Ignore:
Timestamp:
06/19/07 12:24:17
Author:
pvanhoof
Message:

More baby steps

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libtinymail-camel/camel-lite/camel/camel-object.c

    r2216 r2218  
    127127static void camel_object_bag_remove_unlocked(CamelObjectBag *inbag, CamelObject *o, CamelHookList *hooks); 
    128128 
     129static GStaticRecMutex hooks_lock = G_STATIC_REC_MUTEX_INIT; 
     130 
    129131#define camel_object_unget_hooks(o) \ 
    130         (g_static_rec_mutex_unlock(&CAMEL_OBJECT(o)->hooks->lock)) 
     132        (g_static_rec_mutex_unlock(&(CAMEL_OBJECT(o)->hooks->lock))) 
    131133 
    132134 
     
    213215        o->ref_count = 1; 
    214216        o->flags = 0; 
     217        o->hooks = NULL; 
    215218} 
    216219 
     
    11681171        CamelHookPair *pair, *next; 
    11691172 
     1173        g_static_rec_mutex_lock (&hooks_lock); 
     1174 
    11701175        if (o->hooks) { 
    11711176                g_assert(o->hooks->depth == 0); 
     
    11881193                o->hooks = NULL; 
    11891194        } 
     1195 
     1196        g_static_rec_mutex_unlock (&hooks_lock); 
     1197 
    11901198} 
    11911199 
     
    11961204        static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
    11971205        CamelHookList *hooks; 
     1206        CamelHookList *retval = NULL; 
     1207 
     1208        g_static_rec_mutex_lock (&hooks_lock); 
    11981209 
    11991210        /* if we have it, we dont have to do any other locking, 
     
    12131224        } 
    12141225         
    1215         g_static_rec_mutex_lock(&o->hooks->lock); 
    1216          
    1217         return o->hooks;         
     1226        g_static_rec_mutex_lock(&(o->hooks->lock)); 
     1227 
     1228        g_static_rec_mutex_unlock (&hooks_lock); 
     1229 
     1230        retval = o->hooks; 
     1231 
     1232        return retval; 
    12181233} 
    12191234 
     
    12291244        g_return_val_if_fail(name != NULL, 0); 
    12301245        g_return_val_if_fail(func != NULL, 0); 
     1246 
     1247        g_static_rec_mutex_lock (&hooks_lock); 
    12311248 
    12321249        hook = co_find_pair(obj->klass, name); 
     
    12481265                g_warning("camel_object_hook_event: trying to hook event `%s' in class `%s' with no defined events.", 
    12491266                          name, obj->klass->name); 
     1267 
     1268                g_static_rec_mutex_unlock (&hooks_lock); 
    12501269 
    12511270                return 0; 
     
    12691288        h(printf("%p hook event '%s' %p %p = %d\n", vo, name, func, data, id)); 
    12701289 
     1290        g_static_rec_mutex_unlock (&hooks_lock); 
     1291 
    12711292        return id; 
    12721293} 
     
    12811302        g_return_if_fail (CAMEL_IS_OBJECT (obj)); 
    12821303 
    1283         if (id == 0) 
     1304        if (id == 0)  
    12841305                return; 
     1306 
     1307 
     1308        g_static_rec_mutex_lock (&hooks_lock); 
    12851309 
    12861310        if (obj->hooks == NULL) { 
    12871311                g_warning("camel_object_unhook_event: trying to unhook `%u` from an instance of `%s' with no hooks", 
    12881312                          id, obj->klass->name); 
     1313                g_static_rec_mutex_unlock (&hooks_lock); 
    12891314                return; 
    12901315        } 
     
    13081333                        } 
    13091334                        camel_object_unget_hooks(obj); 
     1335                        g_static_rec_mutex_unlock (&hooks_lock); 
    13101336                        return; 
    13111337                } 
     
    13171343        g_warning("camel_object_unhook_event: cannot find hook id %u in instance of `%s'", 
    13181344                  id, obj->klass->name); 
     1345        g_static_rec_mutex_unlock (&hooks_lock); 
    13191346} 
    13201347 
     
    13301357        g_return_if_fail (func != NULL); 
    13311358 
     1359        g_static_rec_mutex_lock (&hooks_lock); 
     1360 
    13321361        if (obj->hooks == NULL) { 
    13331362                g_warning("camel_object_unhook_event: trying to unhook `%s` from an instance of `%s' with no hooks", 
    13341363                          name, obj->klass->name); 
     1364                g_static_rec_mutex_unlock (&hooks_lock); 
    13351365                return; 
    13361366        } 
     
    13561386                        } 
    13571387                        camel_object_unget_hooks(obj); 
     1388                        g_static_rec_mutex_unlock (&hooks_lock); 
    13581389                        return; 
    13591390                } 
     
    13651396        g_warning("camel_object_unhook_event: cannot find hook/data pair %p/%p in an instance of `%s' attached to `%s'", 
    13661397                  func, data, obj->klass->name, name); 
     1398        g_static_rec_mutex_unlock (&hooks_lock); 
    13671399} 
    13681400 
     
    13801412        g_return_if_fail (name); 
    13811413 
     1414        g_static_rec_mutex_lock (&hooks_lock); 
     1415 
    13821416        hook = co_find_pair(obj->klass, name); 
    13831417        if (hook) 
    13841418                goto trigger; 
    13851419 
    1386         if (obj->hooks == NULL) 
     1420        if (obj->hooks == NULL) { 
     1421                g_static_rec_mutex_unlock (&hooks_lock); 
    13871422                return; 
     1423        } 
    13881424 
    13891425        /* interface events can't have prep functions */ 
     
    14021438                  name, obj->klass->name); 
    14031439 
     1440        g_static_rec_mutex_unlock (&hooks_lock); 
     1441 
    14041442        return; 
    14051443 
    14061444trigger: 
    14071445        /* try prep function, if false, then quit */ 
    1408         if (hook->func.prep != NULL && !hook->func.prep(obj, event_data)) 
     1446        if (hook->func.prep != NULL && !hook->func.prep(obj, event_data)) { 
     1447                g_static_rec_mutex_unlock (&hooks_lock); 
    14091448                return; 
     1449        } 
    14101450 
    14111451        /* also, no hooks, dont bother going further */ 
    1412         if (obj->hooks == NULL) 
     1452        if (obj->hooks == NULL) { 
     1453                g_static_rec_mutex_unlock (&hooks_lock); 
    14131454                return; 
     1455        } 
     1456 
    14141457trigger_interface: 
    14151458        /* lock the object for hook emission */ 
     
    14581501        camel_object_unget_hooks(obj); 
    14591502        camel_object_unref(obj); 
     1503        g_static_rec_mutex_unlock (&hooks_lock); 
    14601504} 
    14611505 
     
    15981642        CamelHookList *hooks; 
    15991643 
    1600         if (obj->hooks == NULL && !create) 
     1644        g_static_rec_mutex_lock (&hooks_lock); 
     1645 
     1646        if (obj->hooks == NULL && !create) { 
     1647                g_static_rec_mutex_unlock (&hooks_lock); 
    16011648                return NULL; 
     1649        } 
    16021650 
    16031651        hooks = camel_object_get_hooks(obj); 
    16041652        pair = hooks->list; 
    16051653        while (pair) { 
    1606                 if (pair->name == meta_name) 
     1654                if (pair->name == meta_name) { 
     1655                        g_static_rec_mutex_unlock (&hooks_lock); 
    16071656                        return pair; 
    1608  
     1657                } 
    16091658                pair = pair->next; 
    16101659        } 
     
    16231672        } 
    16241673 
     1674        g_static_rec_mutex_unlock (&hooks_lock); 
    16251675        return pair; 
    16261676} 
  • trunk/libtinymail-camel/camel-lite/camel/camel-service.c

    r2216 r2218  
    9191        camel_object_class_add_event(object_class, "disconnection", NULL); 
    9292        camel_object_class_add_event(object_class, "connection", NULL); 
     93        camel_object_class_add_event(object_class, "reconnection", NULL); 
     94        camel_object_class_add_event(object_class, "reconnecting", NULL); 
     95 
    9396} 
    9497 
     
    98101        CamelService *service = o; 
    99102 
     103        service->reconnecting = FALSE; 
    100104        service->data = NULL; 
    101105        service->priv = g_malloc0(sizeof(*service->priv)); 
  • trunk/libtinymail-camel/camel-lite/camel/camel-service.h

    r1943 r2218  
    7070        CamelURL *url; 
    7171        gpointer data; 
     72        gboolean reconnecting; 
    7273}; 
    7374 
  • trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store.c

    r2215 r2218  
    148148camel_imap_recon (CamelImapStore *store, CamelException *mex) 
    149149{ 
     150        CAMEL_SERVICE (store)->reconnecting = TRUE; 
     151 
     152        camel_object_trigger_event (CAMEL_OBJECT (store),  
     153                        "reconnecting", (gpointer) FALSE); 
     154 
    150155        camel_service_disconnect (CAMEL_SERVICE (store), FALSE, NULL); 
    151156        camel_service_connect (CAMEL_SERVICE (store), mex); 
     157 
    152158        if (mex && camel_exception_is_set (mex)) 
    153159        { 
     
    156162                camel_service_connect (CAMEL_SERVICE (store), mex); 
    157163        } 
     164        if (!camel_exception_is_set (mex)) 
     165                camel_object_trigger_event (CAMEL_OBJECT (store),  
     166                        "reconnection", (gpointer) TRUE); 
     167        else 
     168                camel_object_trigger_event (CAMEL_OBJECT (store),  
     169                        "reconnection", (gpointer) FALSE); 
     170 
     171        CAMEL_SERVICE (store)->reconnecting = FALSE; 
    158172} 
    159173 
  • trunk/libtinymail-camel/tny-camel-account-priv.h

    r2216 r2218  
    6464        TnyAccountType account_type; 
    6565        gboolean custom_url_string; 
    66         guint dsid, csid; 
    6766        RefreshStatusInfo *csyncop; 
    6867}; 
  • trunk/libtinymail-camel/tny-camel-store-account.c

    r2216 r2218  
    115115{ 
    116116#ifdef DEBUG 
    117         g_print ("TNY_DEBUG: %s disconnected\n", tny_account_get_name (self)); 
     117        g_print ("TNY_DEBUG: %s disconnected %s\n",  
     118                tny_account_get_name (self),  
     119                service->reconnecting?"reconnecting":""); 
    118120#endif 
    119121} 
     122 
    120123 
    121124static void  
     
    123126{ 
    124127#ifdef DEBUG 
    125         g_print ("TNY_DEBUG: %s connected\n", tny_account_get_name (self)); 
     128        g_print ("TNY_DEBUG: %s connected %s\n",  
     129                tny_account_get_name (self), 
     130                service->reconnecting?"reconnecting":""); 
     131#endif 
     132
     133 
     134static void  
     135reconnection (CamelService *service, gpointer data, TnyAccount *self) 
     136
     137#ifdef DEBUG 
     138        gboolean suc = (gboolean) data; 
     139 
     140        g_print ("TNY_DEBUG: %s reconnecting %s\n",  
     141                tny_account_get_name (self),  
     142                suc?"succeeded":"failed"); 
     143#endif 
     144
     145 
     146static void  
     147reconnecting (CamelService *service, gpointer data, TnyAccount *self) 
     148
     149#ifdef DEBUG 
     150        g_print ("TNY_DEBUG: %s reconnecting\n",  
     151                tny_account_get_name (self)); 
    126152#endif 
    127153} 
     
    205231                        camel_exception_clear (apriv->ex); 
    206232 
    207                 if (apriv->service && CAMEL_IS_OBJECT (apriv->service)
     233                if (apriv->service && CAMEL_IS_OBJECT (apriv->service) && CAMEL_IS_SERVICE (apriv->service)
    208234                        camel_object_unref (CAMEL_OBJECT (apriv->service)); 
    209  
    210235                apriv->service = camel_session_get_service 
    211236                        ((CamelSession*) apriv->session, apriv->url_string,  
    212237                        apriv->type, apriv->ex); 
    213238 
    214                 if (apriv->service) { 
     239                if (apriv->service && !camel_exception_is_set (apriv->ex)) { 
    215240                        apriv->service->data = self; 
    216  
    217                         apriv->dsid = camel_object_hook_event (apriv->service,  
     241                        camel_object_hook_event (apriv->service,  
    218242                                "disconnection", (CamelObjectEventHookFunc)disconnection, self); 
    219                         apriv->csid = camel_object_hook_event (apriv->service,  
     243                        camel_object_hook_event (apriv->service,  
    220244                                "connection", (CamelObjectEventHookFunc)connection, self); 
    221  
     245                        camel_object_hook_event (apriv->service,  
     246                                "reconnection", (CamelObjectEventHookFunc)reconnection, self); 
     247                        camel_object_hook_event (apriv->service,  
     248                                "reconnecting", (CamelObjectEventHookFunc)reconnecting, self); 
     249                } else if (camel_exception_is_set (apriv->ex) && apriv->service) 
     250                { 
     251                        g_warning ("Must cleanup service pointer\n"); 
     252                        apriv->service = NULL; 
    222253                } 
    223254