[Fwd: Offline mode]



FYI, not working code. I'm trying to find out howcome this isn't
working.

Pointers: camel-imap-folder.c and camel-imap-store.c. Look at
camel_imap_store_connected and imap_get_message. The first function is
the one that sets the CamelException.

The question .. why? ;-)


-- 
Philip Van Hoof, software developer at x-tend 
home: me at pvanhoof dot be 
gnome: pvanhoof at gnome dot org 
work: vanhoof at x-tend dot be 
http://www.pvanhoof.be - http://www.x-tend.be
--- Begin Message ---
(gdb) break imap_get_message
Breakpoint 5 at 0xb57332db: file camel-imap-folder.c, line 2038.
(gdb) cont
Continuing.
[New Thread -1259193424 (LWP 13222)]
[Thread -1259193424 (zombie) exited]

Breakpoint 5, imap_get_message (folder=0x8350e68, uid=0x8396588 "2790",
ex=0x83333b8) at camel-imap-folder.c:2038
2038            CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER
(folder);
(gdb) next
2039            CamelImapStore *store = CAMEL_IMAP_STORE
(folder->parent_store);
(gdb)
2045            mi = (CamelImapMessageInfo *)camel_folder_summary_uid
(folder->summary, uid);
(gdb) print store
$1 = (CamelImapStore *) 0x8334150
(gdb) next
2046            if (mi == NULL) {
(gdb) print *store
$2 = {parent_object = {parent_object = {parent_object = {parent_object =
{klass = 0x8333ce8, magic = 2007188717, hooks = 0x83354b0,
          ref_count = 6, flags = 0, next = 0x0, prev = 0x0}, priv =
0x83346b8, session = 0x831cef0, provider = 0xb57429a0,
        status = CAMEL_SERVICE_CONNECTED, connect_op = 0x0, url =
0x83347e0}, priv = 0x8336200, folders = 0x8335270, flags = 11,
      mode = 3}, status = CAMEL_DISCO_STORE_OFFLINE, diary = 0x8334970},
istream = 0x0, ostream = 0x0, summary = 0x8334ef0,
  connected = 1, preauthed = 0, braindamaged = 0, renaming = 0,
nocustomappend = 0, tag_prefix = 66 'B', command = 0,
  current_folder = 0x0, server_level = IMAP_LEVEL_IMAP4REV1,
capabilities = 350, parameters = 0, namespace = 0x8336738 "INBOX",
  dir_sep = 46 '.', base_url = 0x8334838
"imap://spampvanhoofbe mail pvanhoof be",
  storage_path = 0x8336810
"/home/pvanhoof/.tinymail/mail/imap/spampvanhoofbe mail pvanhoof be",
authtypes = 0x0, refresh_stamp = 0}
(gdb) print *session
No symbol "session" in current context.
(gdb) print *store->session
There is no member named session.
(gdb) print store->session
There is no member named session.
(gdb) print store.session
There is no member named session.
(gdb) print *0x831cef0
$3 = 137481768
(gdb) print *(CamelSession*)0x831cef0
$4 = {parent_object = {klass = 0x831ce28, magic = 2007188717, hooks =
0x0, ref_count = 3, flags = 0, next = 0x0, prev = 0x0},
  priv = 0x831d120, storage_path = 0x8332ae8
"/home/pvanhoof/.tinymail/mail", junk_plugin = 0x0, online = 1,
check_junk = 0,
  network_state = 1}
(gdb) print *store
$5 = {parent_object = {parent_object = {parent_object = {parent_object =
{klass = 0x8333ce8, magic = 2007188717, hooks = 0x83354b0,
          ref_count = 6, flags = 0, next = 0x0, prev = 0x0}, priv =
0x83346b8, session = 0x831cef0, provider = 0xb57429a0,
        status = CAMEL_SERVICE_CONNECTED, connect_op = 0x0, url =
0x83347e0}, priv = 0x8336200, folders = 0x8335270, flags = 11,
      mode = 3}, status = CAMEL_DISCO_STORE_OFFLINE, diary = 0x8334970},
istream = 0x0, ostream = 0x0, summary = 0x8334ef0,
  connected = 1, preauthed = 0, braindamaged = 0, renaming = 0,
nocustomappend = 0, tag_prefix = 66 'B', command = 0,
  current_folder = 0x0, server_level = IMAP_LEVEL_IMAP4REV1,
capabilities = 350, parameters = 0, namespace = 0x8336738 "INBOX",
  dir_sep = 46 '.', base_url = 0x8334838
"imap://spampvanhoofbe mail pvanhoof be",
  storage_path = 0x8336810
"/home/pvanhoof/.tinymail/mail/imap/spampvanhoofbe mail pvanhoof be",
authtypes = 0x0, refresh_stamp = 0}
(gdb) print *(CamelSession*)0x831cef0
$6 = {parent_object = {klass = 0x831ce28, magic = 2007188717, hooks =
0x0, ref_count = 3, flags = 0, next = 0x0, prev = 0x0},
  priv = 0x831d120, storage_path = 0x8332ae8
"/home/pvanhoof/.tinymail/mail", junk_plugin = 0x0, online = 1,
check_junk = 0,
  network_state = 1}
(gdb) bt
#0  imap_get_message (folder=0x8350e68, uid=0x8396588 "2790",
ex=0x83333b8) at camel-imap-folder.c:2046
#1  0xb6e0fa93 in camel_folder_get_message (folder=0x8350e68,
uid=0x8396588 "2790", ex=0x8367b9c) at camel-folder.c:1070
#2  0xb71bbd6b in tny_msg_folder_get_message (self=0x8083640,
header=0x83bd460) at tny-msg-folder.c:661
#3  0xb71d3da2 in tny_msg_folder_iface_get_message (self=0x8083640,
header=0x8191a30) at tny-msg-folder-iface.c:196
#4  0x0804c29e in on_header_view_tree_selection_changed
(selection=0x8367b9c, user_data=0x8367b9c) at tny-summary-window.c:337
#5  0xb730d423 in IA__g_cclosure_marshal_VOID__VOID (closure=0x82655f0,
return_value=0x0, n_param_values=1, param_values=0xbf92f60c,
    invocation_hint=0xbf92f4fc, marshal_data=0x804c219) at gmarshal.c:77
#6  0xb730179f in IA__g_closure_invoke (closure=0x82655f0,
return_value=0x8367b9c, n_param_values=137788316,
param_values=0x8367b9c,
    invocation_hint=0x8367b9c) at gclosure.c:490
#7  0xb73102ea in signal_emit_unlocked_R (node=0x8267058, detail=0,
instance=0x80d4060, emission_return=0x0,
    instance_and_params=0xbf92f60c) at gsignal.c:2438
#8  0xb7311b19 in IA__g_signal_emit_valist (instance=0x80d4060,
signal_id=203, detail=0, var_args=<value optimized out>)
    at gsignal.c:2197
#9  0xb7311e89 in IA__g_signal_emit (instance=0x8367b9c,
signal_id=137788316, detail=137788316) at gsignal.c:2241
#10 0xb7860c57 in _gtk_tree_selection_internal_select_node ()
from /usr/lib/libgtk-x11-2.0.so.0
#11 0xb787307e in gtk_tree_view_scroll_to_cell ()
from /usr/lib/libgtk-x11-2.0.so.0
#12 0xb787b9ca in gtk_tree_view_set_model ()
from /usr/lib/libgtk-x11-2.0.so.0
#13 0xb77aa850 in _gtk_marshal_BOOLEAN__BOXED ()
from /usr/lib/libgtk-x11-2.0.so.0
#14 0xb730116f in g_type_class_meta_marshal (closure=0x80a93e0,
return_value=0x8367b9c, n_param_values=137788316,
    param_values=0xbf92fc2c, invocation_hint=0x8367b9c,
marshal_data=0x8367b9c) at gclosure.c:567
#15 0xb730179f in IA__g_closure_invoke (closure=0x80a93e0,
return_value=0x8367b9c, n_param_values=137788316,
param_values=0x8367b9c,
    invocation_hint=0x8367b9c) at gclosure.c:490
#16 0xb73109ce in signal_emit_unlocked_R (node=0x80a9818, detail=0,
instance=0x80c7b40, emission_return=0xbf92fdec,
    instance_and_params=0xbf92fc2c) at gsignal.c:2476
#17 0xb7311886 in IA__g_signal_emit_valist (instance=0x80c7b40,
signal_id=30, detail=0,
    var_args=0xbf92fe70 "\210�\222�(\0334\b {\f\b!�\210�@{\f\b�j\n\b")
at gsignal.c:2207
#18 0xb7311e89 in IA__g_signal_emit (instance=0x8367b9c,
signal_id=137788316, detail=137788316) at gsignal.c:2241
#19 0xb788cc4f in gtk_widget_activate ()
from /usr/lib/libgtk-x11-2.0.so.0
#20 0xb77a8fcd in gtk_propagate_event ()
from /usr/lib/libgtk-x11-2.0.so.0
#21 0xb77a93db in gtk_main_do_event () from /usr/lib/libgtk-x11-2.0.so.0
#22 0xb764cddc in _gdk_events_queue () from /usr/lib/libgdk-x11-2.0.so.0
#23 0xb71fa8c6 in IA__g_main_context_dispatch (context=0x80862c8) at
gmain.c:1916
#24 0xb71fd986 in g_main_context_iterate (context=0x80862c8, block=1,
dispatch=1, self=0x804e008) at gmain.c:2547
#25 0xb71fdca8 in IA__g_main_loop_run (loop=0x80e1448) at gmain.c:2751
#26 0xb77a86d5 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0
#27 0x0804ad42 in main (argc=1, argv=0xbf930144) at tny-main.c:92
(gdb)
-- 
Philip Van Hoof, software developer at x-tend 
home: me at pvanhoof dot be 
gnome: pvanhoof at gnome dot org 
work: vanhoof at x-tend dot be 
http://www.pvanhoof.be - http://www.x-tend.be
Index: tinymail/tny-summary-window.c
===================================================================
--- tinymail/tny-summary-window.c	(revision 503)
+++ tinymail/tny-summary-window.c	(working copy)
@@ -52,6 +52,10 @@
 #include <tny-summary-window-iface.h>
 #include <tny-account-store-view-iface.h>
 
+
+#define GO_ONLINE_TXT _("Go online")
+#define GO_OFFLINE_TXT _("Go offline")
+
 static GObjectClass *parent_class = NULL;
 
 
@@ -63,12 +67,12 @@
 	GtkTreeView *mailbox_view, *header_view;
 	TnyMsgViewIface *msg_view;
 	guint accounts_reloaded_signal;
-	GtkWidget *status, *progress;
+	GtkWidget *status, *progress, *online_button;
 	guint status_id;
 	gulong mailbox_select_sid;
 	GtkTreeSelection *mailbox_select;
 	GtkTreeIter last_mailbox_correct_select;
-	guint connchanged_signal;
+	guint connchanged_signal, online_button_signal;
 	TnyMsgFolderIface *last_folder;
 };
 
@@ -95,19 +99,19 @@
 	return;
 }
 
+static GtkTreeModel *empty_model;
+
 static void 
 reload_accounts (TnySummaryWindowPriv *priv)
 {
-	static GtkTreeModel *empty_model;
-
 	TnyAccountStoreIface *account_store = priv->account_store;
 	GtkTreeModel *sortable, *mailbox_model = GTK_TREE_MODEL (tny_account_tree_model_new ());
 	const GList* accounts;
 
+	/* You *must* do this (else things will crash) */
 	if (G_UNLIKELY (!empty_model))
 		empty_model = GTK_TREE_MODEL (gtk_list_store_new 
 			(1, G_TYPE_STRING));
-
 	/* Clear the header_view by giving it an empty model */
 	set_header_view_model (GTK_TREE_VIEW (priv->header_view), empty_model);
 
@@ -140,21 +144,60 @@
 accounts_reloaded (TnyAccountStoreIface *store, gpointer user_data)
 {
 	TnySummaryWindowPriv *priv = user_data;
-
+	
 	reload_accounts (priv);
 	
 	return;
 }
 
+static void 
+online_button_toggled (GtkToggleButton *togglebutton, gpointer user_data)
+{
+	TnySummaryWindowIface *self = user_data;
+	TnySummaryWindowPriv *priv = TNY_SUMMARY_WINDOW_GET_PRIVATE (self);
+
+	if (priv->account_store)
+	{
+		const TnyDeviceIface *device = tny_account_store_iface_get_device (priv->account_store);
+
+		/* You *must* do this (else things will crash) */
+		if (G_UNLIKELY (!empty_model))
+			empty_model = GTK_TREE_MODEL (gtk_list_store_new 
+				(1, G_TYPE_STRING));
+		/* Clear the header_view by giving it an empty model */
+		set_header_view_model (GTK_TREE_VIEW (priv->header_view), empty_model);
+
+
+		if (gtk_toggle_button_get_active (togglebutton))
+			tny_device_iface_force_online (device);
+		else
+			tny_device_iface_force_offline (device);
+	}
+}
+
 static void
 connection_changed (TnyDeviceIface *device, gboolean online, gpointer user_data)
 {
 	TnySummaryWindowIface *self = user_data;
+	TnySummaryWindowPriv *priv = TNY_SUMMARY_WINDOW_GET_PRIVATE (self);
 
 	if (online)
+	{
+		gtk_button_set_label  (GTK_BUTTON (priv->online_button), GO_OFFLINE_TXT);
+		g_signal_handler_block (G_OBJECT (priv->online_button), priv->online_button_signal);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->online_button), TRUE);
+		g_signal_handler_unblock (G_OBJECT (priv->online_button), priv->online_button_signal);
+
 		gtk_window_set_title (GTK_WINDOW (self), _("Tinymail - online"));
-	else
+	} else {
+
+		gtk_button_set_label  (GTK_BUTTON (priv->online_button), GO_ONLINE_TXT);
+		g_signal_handler_block (G_OBJECT (priv->online_button), priv->online_button_signal);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->online_button), FALSE);
+		g_signal_handler_unblock (G_OBJECT (priv->online_button), priv->online_button_signal);
+
 		gtk_window_set_title (GTK_WINDOW (self), _("Tinymail - offline"));
+	}
 
 	return;
 }
@@ -296,10 +339,8 @@
 					tny_msg_view_iface_set_msg (priv->msg_view, TNY_MSG_IFACE (msg));
 				else 
 				{
-					GtkTreeModel *rmodel = model;
-					if (GTK_IS_TREE_MODEL_SORT (model))
-						rmodel = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model));
-					tny_list_iface_remove (TNY_LIST_IFACE (rmodel), header);
+					/* Loading the message failed (service unavailable 
+					   or message deleted by an external device) */
 				}
 
 			}
@@ -527,8 +568,12 @@
 	GtkWidget *vpaned1;
 	GtkWidget *vbox;
 	
+	/* TODO: Persist application UI status (of the panes) */
 
-	/* TODO: Persist application UI status (of the panes) */
+	priv->online_button = gtk_toggle_button_new ();
+
+	priv->online_button_signal = g_signal_connect (G_OBJECT (priv->online_button), "toggled", 
+		G_CALLBACK (online_button_toggled), self);
 	priv->last_folder = NULL;
 	platfact = TNY_PLATFORM_FACTORY_IFACE 
 			(tny_platform_factory_get_instance ());
@@ -541,6 +586,9 @@
 	priv->status_id = gtk_statusbar_get_context_id (GTK_STATUSBAR (priv->status), "default");
 
 	gtk_box_pack_start (GTK_BOX (priv->status), priv->progress, FALSE, FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (priv->status), priv->online_button, FALSE, FALSE, 0);
+
+	gtk_widget_show (priv->online_button);
 	gtk_widget_show (priv->status);
 	gtk_widget_show (vbox);
 
Index: libtinymail-gnome-desktop/tny-account-store.c
===================================================================
--- libtinymail-gnome-desktop/tny-account-store.c	(revision 503)
+++ libtinymail-gnome-desktop/tny-account-store.c	(working copy)
@@ -747,6 +747,7 @@
 		tny_platform_factory_get_instance ());
 
 	priv->device = tny_platform_factory_iface_new_device (platfact);
+	//tny_device_iface_force_online (priv->device);
 	priv->session = tny_session_camel_new (TNY_ACCOUNT_STORE_IFACE (self));
 
 	return self;
Index: libtinymail-gnome-desktop/tny-device.c
===================================================================
--- libtinymail-gnome-desktop/tny-device.c	(revision 503)
+++ libtinymail-gnome-desktop/tny-device.c	(working copy)
@@ -28,7 +28,63 @@
 
 #include "tny-device-priv.h"
 
+static void tny_device_on_online (TnyDeviceIface *self);
+static void tny_device_on_offline (TnyDeviceIface *self);
+static gboolean tny_device_is_online (TnyDeviceIface *self);
+
+
+static void 
+nm_callback (libnm_glib_ctx *nm_ctx, gpointer user_data)
+{
+	TnyDeviceIface *self = (TnyDeviceIface *)user_data;
+
+	if (tny_device_is_online (self))
+		tny_device_on_online (self);
+	else
+		tny_device_on_offline (self);
+
+	return;
+}
+
+static void 
+tny_device_reset (TnyDeviceIface *self)
+{
+	TnyDevicePriv *priv = TNY_DEVICE_GET_PRIVATE (self);
+
+	priv->fset = FALSE;
+	priv->forced = FALSE;
+
+	nm_callback (priv->nm_ctx, self);
+}
+
+static void 
+tny_device_force_online (TnyDeviceIface *self)
+{
+	TnyDevicePriv *priv = TNY_DEVICE_GET_PRIVATE (self);
+
+	priv->fset = TRUE;
+	priv->forced = TRUE;
+
+	nm_callback (priv->nm_ctx, self);
+
+	return;
+}
+
+
 static void
+tny_device_force_offline (TnyDeviceIface *self)
+{
+	TnyDevicePriv *priv = TNY_DEVICE_GET_PRIVATE (self);
+
+	priv->fset = TRUE;
+	priv->forced = FALSE;
+
+	nm_callback (priv->nm_ctx, self);
+
+	return;
+}
+
+static void
 tny_device_on_online (TnyDeviceIface *self)
 {
 	g_signal_emit (self, tny_device_iface_signals [TNY_DEVICE_IFACE_CONNECTION_CHANGED], 0, TRUE);
@@ -48,48 +104,41 @@
 tny_device_is_online (TnyDeviceIface *self)
 {
 	TnyDevicePriv *priv = TNY_DEVICE_GET_PRIVATE (self);
+	gboolean retval = priv->forced;
 
-	libnm_glib_state state = libnm_glib_get_network_state (priv->nm_ctx);
-	gboolean retval;
-
-	switch (state)
+	if (!priv->fset)
 	{
-		case LIBNM_NO_NETWORK_CONNECTION:
-		retval = FALSE;
-		break;
+		libnm_glib_state state = libnm_glib_get_network_state (priv->nm_ctx);
+		
+		switch (state)
+		{
+			case LIBNM_NO_NETWORK_CONNECTION:
+			retval = FALSE;
+			break;
 
-		case LIBNM_NO_DBUS:
-		case LIBNM_NO_NETWORKMANAGER:
-		case LIBNM_INVALID_CONTEXT:
-		g_print (_("Invalid network manager installation. Going to assume Online status\n"));
-		case LIBNM_ACTIVE_NETWORK_CONNECTION:
-		default:
-		retval = TRUE;
-		break;
+			case LIBNM_NO_DBUS:
+			case LIBNM_NO_NETWORKMANAGER:
+			case LIBNM_INVALID_CONTEXT:
+			g_print (_("Invalid network manager installation. Going to assume Online status\n"));
+			case LIBNM_ACTIVE_NETWORK_CONNECTION:
+			default:
+			retval = TRUE;
+			break;
+		}
 	}
 
 	return retval;
 }
 
-static void 
-nm_callback (libnm_glib_ctx *nm_ctx, gpointer user_data)
-{
-	TnyDeviceIface *self = (TnyDeviceIface *)user_data;
 
-	if (tny_device_is_online (self))
-		tny_device_on_online (self);
-	else
-		tny_device_on_offline (self);
-
-	return;
-}
-
 static void
 tny_device_instance_init (GTypeInstance *instance, gpointer g_class)
 {
 	TnyDevice *self = (TnyDevice *)instance;
 	TnyDevicePriv *priv = TNY_DEVICE_GET_PRIVATE (self);
 
+	priv->fset = FALSE;
+	priv->forced = FALSE;
 	priv->nm_ctx = libnm_glib_init ();
 	priv->callback_id = libnm_glib_register_callback 
 		(priv->nm_ctx, nm_callback, self, NULL);
@@ -135,6 +184,9 @@
 	TnyDeviceIfaceClass *klass = (TnyDeviceIfaceClass *)g_iface;
 
 	klass->is_online_func = tny_device_is_online;
+	klass->reset_func = tny_device_reset;
+	klass->force_offline_func = tny_device_force_offline;
+	klass->force_online_func = tny_device_force_online;
 
 	return;
 }
Index: libtinymail-gnome-desktop/tny-device-priv.h
===================================================================
--- libtinymail-gnome-desktop/tny-device-priv.h	(revision 503)
+++ libtinymail-gnome-desktop/tny-device-priv.h	(working copy)
@@ -26,6 +26,7 @@
 {
 	libnm_glib_ctx *nm_ctx;
 	guint callback_id;
+	gboolean forced, fset;
 };
 
 
Index: libtinymail-camel/tny-msg-folder.c
===================================================================
--- libtinymail-camel/tny-msg-folder.c	(revision 503)
+++ libtinymail-camel/tny-msg-folder.c	(working copy)
@@ -114,6 +114,9 @@
 		CamelStore *store = (CamelStore*) _tny_account_get_service 
 			(TNY_ACCOUNT (priv->account));
 
+		if (!camel_service_connect (store, &ex))
+			printf ("no con ex %d\n", ex.id);
+
 		priv->folder = camel_store_get_folder 
 			(store, priv->folder_name, 0, &ex);
 
Index: libtinymail-camel/tny-store-account.c
===================================================================
--- libtinymail-camel/tny-store-account.c	(revision 503)
+++ libtinymail-camel/tny-store-account.c	(working copy)
@@ -66,11 +66,47 @@
 	}
 }
 
+
+static void
+walk_folders_uncache_em (TnyStoreAccountIface *self, TnyListIface *folders)
+{
+  if (folders && tny_list_iface_length (folders) > 0)
+  {
+	TnyIteratorIface *iterator = tny_list_iface_create_iterator (folders);
+	gboolean next = TRUE;
+
+	while (next)
+	{
+		TnyMsgFolderIface *folder = tny_iterator_iface_current (iterator);
+		TnyListIface *more_folders = (TnyListIface*)tny_msg_folder_iface_get_folders (folder);
+
+		tny_msg_folder_iface_uncache (folder);
+
+		if (tny_list_iface_length (more_folders) > 0)
+			walk_folders_uncache_em (self, more_folders);
+
+		next = tny_iterator_iface_has_next (iterator);
+
+		if (next)
+			tny_iterator_iface_next (iterator);
+	}
+
+	g_object_unref (G_OBJECT (iterator));
+  }
+}
+
 static void 
 tny_store_account_reconnect (TnyAccount *self)
 {
 	TnyAccountPriv *priv = TNY_ACCOUNT_GET_PRIVATE (self);
+	TnyStoreAccountPriv *spriv = TNY_STORE_ACCOUNT_GET_PRIVATE (self);
 
+	if (spriv->folders)
+		walk_folders_uncache_em (TNY_STORE_ACCOUNT_IFACE (self), spriv->folders);
+
+	if (spriv->ufolders)
+		walk_folders_uncache_em (TNY_STORE_ACCOUNT_IFACE (self), spriv->ufolders);
+
 	if (G_LIKELY (priv->session) && G_UNLIKELY (priv->proto) && 
 		G_UNLIKELY (priv->user) && G_UNLIKELY (priv->host))
 	{
@@ -124,20 +160,25 @@
 		}
 		if (G_UNLIKELY (priv->service))
 			camel_object_unref (CAMEL_OBJECT (priv->service));
-	
-		priv->service = camel_session_get_service 
+
+		priv->service = camel_session_get_service
 			(CAMEL_SESSION (priv->session), priv->url_string, 
 			priv->type, priv->ex);
 
+
+	printf ("recon %d %s\n", priv->ex->id, priv->url_string);
+
 		if (priv->service == NULL)
 			report_error (priv);
 	} else
 	if (G_LIKELY (priv->session) && (priv->url_string))
 	{
 		/* un officially supported provider */
-		priv->service = camel_session_get_service 
+
+		priv->service = camel_session_get_service
 			(CAMEL_SESSION (priv->session), priv->url_string, 
 			priv->type, priv->ex);
+
 		if (priv->service == NULL)
 			report_error (priv);
 	}
@@ -150,7 +191,15 @@
 		&& G_UNLIKELY (priv->host))
 	{
 		priv->connected = FALSE;
-		camel_service_connect (priv->service, priv->ex);
+		if (!camel_service_connect (priv->service, priv->ex))
+			printf ("not ccon\n");
+		else
+		{
+			priv->service = camel_session_get_service_connected
+				(CAMEL_SESSION (priv->session), priv->url_string, 
+				priv->type, priv->ex);
+printf ("--> %s, %d\n", priv->url_string, priv->ex->id);
+		}
 
 		if (camel_exception_is_set (priv->ex))
 		{
@@ -163,7 +212,8 @@
 			priv->connected = TRUE;
 		}
 		
-		camel_session_set_online (CAMEL_SESSION (priv->session), priv->connected);
+
+		/*camel_session_set_online (CAMEL_SESSION (priv->session), priv->connected); */
 	}
 
 	return;
Index: libtinymail-camel/tny-session-camel.c
===================================================================
--- libtinymail-camel/tny-session-camel.c	(revision 503)
+++ libtinymail-camel/tny-session-camel.c	(working copy)
@@ -437,6 +437,8 @@
 static void
 tny_session_camel_init (TnySessionCamel *instance)
 {
+	/* Avoid the first question in connection_changed */
+	instance->prev_constat = TRUE;
 	instance->device = NULL;
 }
 
@@ -444,9 +446,25 @@
 connection_changed (TnyDeviceIface *device, gboolean online, gpointer user_data)
 {
 	TnySessionCamel *self = user_data;
+	GList *copy = password_funcs;
+	TnyAccountIface *account;
 
 	camel_session_set_online ((CamelSession *) self, online); 
 
+	if (online != self->prev_constat && online)
+	{
+		while (G_LIKELY (copy))
+		{
+			PrivPassFunc *pf = copy->data;
+			if (pf->account)
+				TNY_ACCOUNT_GET_CLASS (pf->account)->reconnect_func (TNY_ACCOUNT (pf->account));
+
+			copy = g_list_next (copy);
+		}
+	}
+
+	self->prev_constat = online;
+
 	return;
 }
 
Index: libtinymail-camel/tny-session-camel.h
===================================================================
--- libtinymail-camel/tny-session-camel.h	(revision 503)
+++ libtinymail-camel/tny-session-camel.h	(working copy)
@@ -38,7 +38,7 @@
 
 	gpointer device;
 	gpointer account_store;
-        gboolean interactive;
+        gboolean interactive, prev_constat;
 	guint connchanged_signal;
 };
 
Index: libtinymail/tny-device-iface.c
===================================================================
--- libtinymail/tny-device-iface.c	(revision 503)
+++ libtinymail/tny-device-iface.c	(working copy)
@@ -33,6 +33,45 @@
 
 
 /**
+ * tny_device_iface_reset:
+ * @self: a #TnyDeviceIface object
+ * 
+ * Reset status
+ **/
+void 
+tny_device_iface_reset (TnyDeviceIface *self)
+{
+	TNY_DEVICE_IFACE_GET_CLASS (self)->reset_func (self);
+	return;
+}
+
+/**
+ * tny_device_iface_force_offline:
+ * @self: a #TnyDeviceIface object
+ * 
+ * Force offline status
+ **/
+void 
+tny_device_iface_force_online (TnyDeviceIface *self)
+{
+	TNY_DEVICE_IFACE_GET_CLASS (self)->force_online_func (self);
+	return;
+}
+
+/**
+ * tny_device_iface_force_online:
+ * @self: a #TnyDeviceIface object
+ * 
+ * Force online status
+ **/
+void
+tny_device_iface_force_offline (TnyDeviceIface *self)
+{
+	TNY_DEVICE_IFACE_GET_CLASS (self)->force_offline_func (self);
+	return;
+}
+
+/**
  * tny_device_iface_is_online:
  * @self: a #TnyDeviceIface object
  * 
Index: libtinymail/tny-device-iface.h
===================================================================
--- libtinymail/tny-device-iface.h	(revision 503)
+++ libtinymail/tny-device-iface.h	(working copy)
@@ -47,16 +47,22 @@
 {
 	GTypeInterface parent;
 
-	gboolean (*is_online_func)  (TnyDeviceIface *self);
+	gboolean (*is_online_func) (TnyDeviceIface *self);
 
+	void (*force_online_func) (TnyDeviceIface *self);
+	void (*force_offline_func) (TnyDeviceIface *self);
+	void (*reset_func) (TnyDeviceIface *self);
+
 	/* Signals */
-	void (*connection_changed)  (TnyDeviceIface *self, gboolean online);
+	void (*connection_changed) (TnyDeviceIface *self, gboolean online);
 
 };
 
 GType tny_device_iface_get_type (void);
 
 gboolean tny_device_iface_is_online (TnyDeviceIface *self);
+void tny_device_iface_force_online (TnyDeviceIface *self);
+void tny_device_iface_force_offline (TnyDeviceIface *self);
 
 G_END_DECLS
 

--- End Message ---


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]