diff --git a/src/moodle-provider.c b/src/moodle-provider.c index e7138b442aa12a9078d4381eef4b16cab89e15a2..c10f99a8fc1792e46a50d0cecd9433c666fa0d71 100644 --- a/src/moodle-provider.c +++ b/src/moodle-provider.c @@ -32,6 +32,7 @@ typedef struct MoodleProviderState { const gchar *password; MoodleOnlineMode online_mode; gboolean connected; + gboolean connecting; } MoodleProviderState; static MoodleProviderState self; @@ -139,6 +140,24 @@ cache_is_usable_for (const gchar *filename) return FALSE; // no file info: this file doesn't exists; we better not rely on cache } +static void +ensure_connected (void) +{ + if (self.connected) + return; + + if (self.connecting) { + // wait until we are connected + while (!self.connected) { + usleep (100*1000); // 100ms + } + } else { + // use _connect? + moodle_provider_get_courses_sync (NULL, NULL); + // TODO: update course cache + } +} + static void request_url_cb (GObject *unused, GAsyncResult *res, @@ -182,6 +201,8 @@ request_url (const gchar *url, if (!cache_is_usable_for (filename) && self.online_mode == MOODLE_MODE_ONLINE) { + ensure_connected (); + SoupMessage *msg; msg = soup_message_new ("GET", url); soup_message_set_priority (msg, priority); @@ -288,6 +309,12 @@ moodle_provider_connect (GInputStream **response) char *html; size_t html_size;*/ + if (self.connecting) + g_warning ("Connecting while already connecting, that's odd\n"); + if (self.connected) + g_warning ("Connecting while already connected, that's odd\n"); + self.connecting = TRUE; + msg = soup_message_new ("GET", EPFL_TEQUILA_LOGIN); soup_session_send_message (self.session, msg); if (msg->status_code != 200) @@ -327,6 +354,7 @@ moodle_provider_connect (GInputStream **response) } self.connected = TRUE; + self.connecting = FALSE; g_object_unref (msg); return MOODLE_ERROR_OK; @@ -431,6 +459,7 @@ moodle_provider_init (MoodleOnlineMode mode, { self.online_mode = mode; self.connected = FALSE; + self.connecting = FALSE; moodle_parser_init ();