Changeset 2218
- Timestamp:
- 06/19/07 12:24:17
- Files:
-
- trunk/libtinymail-camel/camel-lite/camel/camel-object.c (modified) (20 diffs)
- trunk/libtinymail-camel/camel-lite/camel/camel-service.c (modified) (2 diffs)
- trunk/libtinymail-camel/camel-lite/camel/camel-service.h (modified) (1 diff)
- trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store.c (modified) (2 diffs)
- trunk/libtinymail-camel/tny-camel-account-priv.h (modified) (1 diff)
- trunk/libtinymail-camel/tny-camel-store-account.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libtinymail-camel/camel-lite/camel/camel-object.c
r2216 r2218 127 127 static void camel_object_bag_remove_unlocked(CamelObjectBag *inbag, CamelObject *o, CamelHookList *hooks); 128 128 129 static GStaticRecMutex hooks_lock = G_STATIC_REC_MUTEX_INIT; 130 129 131 #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))) 131 133 132 134 … … 213 215 o->ref_count = 1; 214 216 o->flags = 0; 217 o->hooks = NULL; 215 218 } 216 219 … … 1168 1171 CamelHookPair *pair, *next; 1169 1172 1173 g_static_rec_mutex_lock (&hooks_lock); 1174 1170 1175 if (o->hooks) { 1171 1176 g_assert(o->hooks->depth == 0); … … 1188 1193 o->hooks = NULL; 1189 1194 } 1195 1196 g_static_rec_mutex_unlock (&hooks_lock); 1197 1190 1198 } 1191 1199 … … 1196 1204 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 1197 1205 CamelHookList *hooks; 1206 CamelHookList *retval = NULL; 1207 1208 g_static_rec_mutex_lock (&hooks_lock); 1198 1209 1199 1210 /* if we have it, we dont have to do any other locking, … … 1213 1224 } 1214 1225 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; 1218 1233 } 1219 1234 … … 1229 1244 g_return_val_if_fail(name != NULL, 0); 1230 1245 g_return_val_if_fail(func != NULL, 0); 1246 1247 g_static_rec_mutex_lock (&hooks_lock); 1231 1248 1232 1249 hook = co_find_pair(obj->klass, name); … … 1248 1265 g_warning("camel_object_hook_event: trying to hook event `%s' in class `%s' with no defined events.", 1249 1266 name, obj->klass->name); 1267 1268 g_static_rec_mutex_unlock (&hooks_lock); 1250 1269 1251 1270 return 0; … … 1269 1288 h(printf("%p hook event '%s' %p %p = %d\n", vo, name, func, data, id)); 1270 1289 1290 g_static_rec_mutex_unlock (&hooks_lock); 1291 1271 1292 return id; 1272 1293 } … … 1281 1302 g_return_if_fail (CAMEL_IS_OBJECT (obj)); 1282 1303 1283 if (id == 0) 1304 if (id == 0) 1284 1305 return; 1306 1307 1308 g_static_rec_mutex_lock (&hooks_lock); 1285 1309 1286 1310 if (obj->hooks == NULL) { 1287 1311 g_warning("camel_object_unhook_event: trying to unhook `%u` from an instance of `%s' with no hooks", 1288 1312 id, obj->klass->name); 1313 g_static_rec_mutex_unlock (&hooks_lock); 1289 1314 return; 1290 1315 } … … 1308 1333 } 1309 1334 camel_object_unget_hooks(obj); 1335 g_static_rec_mutex_unlock (&hooks_lock); 1310 1336 return; 1311 1337 } … … 1317 1343 g_warning("camel_object_unhook_event: cannot find hook id %u in instance of `%s'", 1318 1344 id, obj->klass->name); 1345 g_static_rec_mutex_unlock (&hooks_lock); 1319 1346 } 1320 1347 … … 1330 1357 g_return_if_fail (func != NULL); 1331 1358 1359 g_static_rec_mutex_lock (&hooks_lock); 1360 1332 1361 if (obj->hooks == NULL) { 1333 1362 g_warning("camel_object_unhook_event: trying to unhook `%s` from an instance of `%s' with no hooks", 1334 1363 name, obj->klass->name); 1364 g_static_rec_mutex_unlock (&hooks_lock); 1335 1365 return; 1336 1366 } … … 1356 1386 } 1357 1387 camel_object_unget_hooks(obj); 1388 g_static_rec_mutex_unlock (&hooks_lock); 1358 1389 return; 1359 1390 } … … 1365 1396 g_warning("camel_object_unhook_event: cannot find hook/data pair %p/%p in an instance of `%s' attached to `%s'", 1366 1397 func, data, obj->klass->name, name); 1398 g_static_rec_mutex_unlock (&hooks_lock); 1367 1399 } 1368 1400 … … 1380 1412 g_return_if_fail (name); 1381 1413 1414 g_static_rec_mutex_lock (&hooks_lock); 1415 1382 1416 hook = co_find_pair(obj->klass, name); 1383 1417 if (hook) 1384 1418 goto trigger; 1385 1419 1386 if (obj->hooks == NULL) 1420 if (obj->hooks == NULL) { 1421 g_static_rec_mutex_unlock (&hooks_lock); 1387 1422 return; 1423 } 1388 1424 1389 1425 /* interface events can't have prep functions */ … … 1402 1438 name, obj->klass->name); 1403 1439 1440 g_static_rec_mutex_unlock (&hooks_lock); 1441 1404 1442 return; 1405 1443 1406 1444 trigger: 1407 1445 /* 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); 1409 1448 return; 1449 } 1410 1450 1411 1451 /* 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); 1413 1454 return; 1455 } 1456 1414 1457 trigger_interface: 1415 1458 /* lock the object for hook emission */ … … 1458 1501 camel_object_unget_hooks(obj); 1459 1502 camel_object_unref(obj); 1503 g_static_rec_mutex_unlock (&hooks_lock); 1460 1504 } 1461 1505 … … 1598 1642 CamelHookList *hooks; 1599 1643 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); 1601 1648 return NULL; 1649 } 1602 1650 1603 1651 hooks = camel_object_get_hooks(obj); 1604 1652 pair = hooks->list; 1605 1653 while (pair) { 1606 if (pair->name == meta_name) 1654 if (pair->name == meta_name) { 1655 g_static_rec_mutex_unlock (&hooks_lock); 1607 1656 return pair; 1608 1657 } 1609 1658 pair = pair->next; 1610 1659 } … … 1623 1672 } 1624 1673 1674 g_static_rec_mutex_unlock (&hooks_lock); 1625 1675 return pair; 1626 1676 } trunk/libtinymail-camel/camel-lite/camel/camel-service.c
r2216 r2218 91 91 camel_object_class_add_event(object_class, "disconnection", NULL); 92 92 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 93 96 } 94 97 … … 98 101 CamelService *service = o; 99 102 103 service->reconnecting = FALSE; 100 104 service->data = NULL; 101 105 service->priv = g_malloc0(sizeof(*service->priv)); trunk/libtinymail-camel/camel-lite/camel/camel-service.h
r1943 r2218 70 70 CamelURL *url; 71 71 gpointer data; 72 gboolean reconnecting; 72 73 }; 73 74 trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store.c
r2215 r2218 148 148 camel_imap_recon (CamelImapStore *store, CamelException *mex) 149 149 { 150 CAMEL_SERVICE (store)->reconnecting = TRUE; 151 152 camel_object_trigger_event (CAMEL_OBJECT (store), 153 "reconnecting", (gpointer) FALSE); 154 150 155 camel_service_disconnect (CAMEL_SERVICE (store), FALSE, NULL); 151 156 camel_service_connect (CAMEL_SERVICE (store), mex); 157 152 158 if (mex && camel_exception_is_set (mex)) 153 159 { … … 156 162 camel_service_connect (CAMEL_SERVICE (store), mex); 157 163 } 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; 158 172 } 159 173 trunk/libtinymail-camel/tny-camel-account-priv.h
r2216 r2218 64 64 TnyAccountType account_type; 65 65 gboolean custom_url_string; 66 guint dsid, csid;67 66 RefreshStatusInfo *csyncop; 68 67 }; trunk/libtinymail-camel/tny-camel-store-account.c
r2216 r2218 115 115 { 116 116 #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":""); 118 120 #endif 119 121 } 122 120 123 121 124 static void … … 123 126 { 124 127 #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 134 static void 135 reconnection (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 146 static void 147 reconnecting (CamelService *service, gpointer data, TnyAccount *self) 148 { 149 #ifdef DEBUG 150 g_print ("TNY_DEBUG: %s reconnecting\n", 151 tny_account_get_name (self)); 126 152 #endif 127 153 } … … 205 231 camel_exception_clear (apriv->ex); 206 232 207 if (apriv->service && CAMEL_IS_OBJECT (apriv->service) )233 if (apriv->service && CAMEL_IS_OBJECT (apriv->service) && CAMEL_IS_SERVICE (apriv->service)) 208 234 camel_object_unref (CAMEL_OBJECT (apriv->service)); 209 210 235 apriv->service = camel_session_get_service 211 236 ((CamelSession*) apriv->session, apriv->url_string, 212 237 apriv->type, apriv->ex); 213 238 214 if (apriv->service ) {239 if (apriv->service && !camel_exception_is_set (apriv->ex)) { 215 240 apriv->service->data = self; 216 217 apriv->dsid = camel_object_hook_event (apriv->service, 241 camel_object_hook_event (apriv->service, 218 242 "disconnection", (CamelObjectEventHookFunc)disconnection, self); 219 apriv->csid =camel_object_hook_event (apriv->service,243 camel_object_hook_event (apriv->service, 220 244 "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; 222 253 } 223 254
