[recipes/todoist-2: 3/3] Fix infinite loop introduced in previous commit



commit 691a6d6c0338e19a3eafa761006438cfa72b4a85
Author: Ekta Nandwani <mailnandwaniekta gmail com>
Date:   Tue Aug 1 08:20:57 2017 +0530

    Fix infinite loop introduced in previous commit

 src/gr-ingredients-exporter.c |  344 ++++++++++++++++++++++++----------------
 1 files changed, 206 insertions(+), 138 deletions(-)
---
diff --git a/src/gr-ingredients-exporter.c b/src/gr-ingredients-exporter.c
index 0e9bce7..3dd7b56 100644
--- a/src/gr-ingredients-exporter.c
+++ b/src/gr-ingredients-exporter.c
@@ -44,7 +44,7 @@ get_project_id (GrIngredientsExporter *exporter);
 
         gchar *access_token;
         GoaObject *account_object;
-        gchar *sync_token;
+        const gchar *sync_token;
         glong project_id;
 
         GtkWidget *export_button;
@@ -64,13 +64,11 @@ get_project_id (GrIngredientsExporter *exporter);
 };
 
 
-G_DEFINE_TYPE (GrIngredientsExporter, gr_ingredients_exporter, G_TYPE_OBJECT)
+G_DEFINE_TYPE (GrIngredientsExporter, gr_ingredients_exporter, G_TYPE_OBJECT);
 
 static void
 gr_ingredients_exporter_finalize (GObject *object)
 {
-        GrIngredientsExporter *exporter = GR_INGREDIENTS_EXPORTER (object);
-
         G_OBJECT_CLASS (gr_ingredients_exporter_parent_class)->finalize (object);
 }
 
@@ -79,7 +77,6 @@ static void
 gr_ingredients_exporter_class_init (GrIngredientsExporterClass *klass)
 {
         GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
         object_class->finalize = gr_ingredients_exporter_finalize;
 }
 
@@ -96,19 +93,31 @@ gr_ingredients_exporter_new (GtkWindow *parent)
         exporter = g_object_new (GR_TYPE_INGREDIENTS_EXPORTER, NULL);
 
         exporter->window = parent;
-
         return exporter;
 }
 
-static void
-get_ingredients_list(GrIngredientsExporter *exporter)
+static gboolean
+get_ingredients_list (GrIngredientsExporter *exporter)
 {
-        GtkWidget *shopping_page;
+               GtkWidget *shopping_page;
+               GList *list;
+               GString *s;
 
-        shopping_page = gr_shopping_page_new ();
-        gr_shopping_page_populate (GR_SHOPPING_PAGE(shopping_page));
-        exporter->ingredients = get_ingredients (GR_SHOPPING_PAGE(shopping_page));
-       g_print("inside get_ingredients_list\n");
+               shopping_page = gr_shopping_page_new ();
+               gr_shopping_page_populate (GR_SHOPPING_PAGE(shopping_page));
+               exporter->ingredients = get_ingredients (GR_SHOPPING_PAGE(shopping_page));
+
+               for (list = exporter->ingredients; list != NULL; list = list->next)
+               {
+               ShoppingListItem *item = list->data;
+               s = g_string_new ("");
+               g_string_append_printf (s, "%s %s", item->amount, item->name);
+               }
+
+               if (exporter->ingredients)
+                       return TRUE;
+               else
+                       return FALSE;
 }
 
 static void
@@ -117,7 +126,6 @@ switch_dialog_contents (GrIngredientsExporter *exporter)
                if (gtk_stack_get_visible_child (GTK_STACK (exporter->dialog_stack)) == 
exporter->accounts_box)
                {
                        if (!exporter->providers_box)
-                               g_print("providers_box empty");
                        gtk_widget_set_visible (exporter->export_button, FALSE);
                        gtk_stack_set_visible_child_name (GTK_STACK (exporter->dialog_stack), 
"providers_box");
                        gtk_stack_set_visible_child_name (GTK_STACK (exporter->header_start_stack), "back");
@@ -131,8 +139,10 @@ switch_dialog_contents (GrIngredientsExporter *exporter)
                        gtk_header_bar_set_title (GTK_HEADER_BAR (exporter->header), "Export Ingredients");
                }
 }
+
 static void
-export_shopping_list_callback (RestProxyCall *call, GError *error, GObject *obj, GrIngredientsExporter 
*exporter)
+export_shopping_list_callback (RestProxyCall *call, GError *error, 
+                                                               GObject *obj, GrIngredientsExporter *exporter)
 {
                JsonObject *object;
                JsonParser *parser;
@@ -140,11 +150,9 @@ export_shopping_list_callback (RestProxyCall *call, GError *error, GObject *obj,
                const gchar *payload;
                guint status_code;
                gsize payload_length;
-               gchar *sync_token;
-               GList *lists;
-               GList *l;
+               const gchar *sync_token;
 
-               g_print("reaches do_something_here\n");
+               g_print("export_shopping_list_callback\n");
                parse_error = NULL;
                status_code = rest_proxy_call_get_status_code (call);
                parser = json_parser_new ();
@@ -171,10 +179,8 @@ export_shopping_list_callback (RestProxyCall *call, GError *error, GObject *obj,
                        g_print("No Data found");
                }
                sync_token = json_object_get_string_member (object, "sync_token");
+               exporter->sync_token = sync_token;
                g_print("%s",sync_token);
-               exporter->sync_token;
-
-               json_object_unref (object);
 
                out:
                  g_object_unref (parser);
@@ -186,50 +192,49 @@ static void
 export_shopping_list (GrIngredientsExporter *exporter)
 {
        
-               GError *error;
-           JsonObject *params;
-           JsonObject *project;
-           params = json_object_new ();
-           project = json_object_new ();
-           GList *l;
            RestProxy *proxy;
                RestProxyCall *call;
+               GError *error;
+
+           GList *list;
+
                GString *commands;
                commands = g_string_new ("");
                error = NULL;
                GString *commands_arg;
+               gboolean got_ingredients;
 
+               got_ingredients = get_ingredients_list (exporter);
 
-           json_object_set_string_member (project, "type", "project_add");
-           json_object_set_string_member (project, "args", "{\"name\": \"Project4\"}");
-
-           get_ingredients_list(exporter);
-
-           for (l = exporter->ingredients; l != NULL; l = l->next)
-           {
-               GString *s;
+               if (got_ingredients)
+               {
+                   for (list = exporter->ingredients; list != NULL; list = list->next)
+                   {
+                       GString *s;
+
+                       ShoppingListItem *item = list->data;
+                       s = g_string_new ("");
+                       g_string_append_printf (s, "%s %s", item->amount, item->name);
+                       g_print ("appending item");
+                       g_print("%s\n",s->str);
+                       gchar *uuid = g_uuid_string_random();
+                       gchar *temp_id = g_uuid_string_random();
+
+                       g_string_append_printf (commands, "{\"type\": \"item_add\", 
\"temp_id\":\"%s\",\"uuid\":\"%s\", "
+                                            "\"args\":{\"content\":\"%s\",\"project_id\":%ld}},",
+                                            temp_id, uuid,
+                                            s->str, exporter->project_id);
+                       }
+               }
 
-               ShoppingListItem *item = l->data;
-               s = g_string_new ("");
-               g_string_append_printf (s, "%s %s", item->amount, item->name);
-               g_print ("appending item");
-               g_print("%s\n",s->str);
-               gchar *uuid = g_uuid_string_random();
-               gchar *temp_id = g_uuid_string_random();
-
-               g_string_append_printf (commands, "{\"type\": \"item_add\", 
\"temp_id\":\"%s\",\"uuid\":\"%s\", "
-                                    "\"args\":{\"content\":\"%s\",\"project_id\":%ld}},",
-                                    temp_id, uuid,
-                                    s->str, exporter->project_id);
-               }
                g_print("exits the loop");
-               g_print("%d",commands->len);
+
                commands = g_string_truncate (commands, commands->len-1);
                commands_arg = g_string_new("[");
                g_string_append_printf (commands_arg, "%s]", commands->str);
 
                
-               proxy = rest_proxy_new ("https://todoist.com/API/v7/sync";, FALSE);
+               proxy = rest_proxy_new (TODOIST_URL, FALSE);
            call = rest_proxy_new_call (proxy);
            rest_proxy_call_set_method (call, "POST");  
            rest_proxy_call_add_header (call, "content-type", "application/x-www-form-urlencoded");
@@ -243,11 +248,9 @@ export_shopping_list (GrIngredientsExporter *exporter)
            rest_proxy_call_add_param (call, "commands", commands_arg->str);
 
                if (!rest_proxy_call_async (call, (RestProxyCallAsyncCallback) export_shopping_list_callback,
-                                                                       NULL,
-                                               exporter,
-                                               &error))
+                                                                       NULL, exporter, &error))
                {
-                     g_print("calling async failed\n");
+                   g_print("calling async failed\n");
            }
 
            g_object_unref (proxy);
@@ -261,7 +264,7 @@ cancel_export (GrIngredientsExporter *exporter)
        g_print ("cancel_export\n");
 }
 
-static GtkWidget *
+static void
 get_selected_account (GtkListBox *list, GrIngredientsExporter *exporter)
 {
        g_print("get_selected_account\n");
@@ -273,17 +276,17 @@ static gboolean
 get_todoist_account(GrIngredientsExporter *exporter)
 {
 
-                                   GoaClient *client;
+               GoaClient *client;
            GList *accounts, *l;
            GoaAccount *account;
            GError *error;
 
-                           client = goa_client_new_sync (NULL, &error);
+           client = goa_client_new_sync (NULL, &error);
            
            if (!client)
            {
                g_error ("Could not create GoaClient: %s", error->message);
-               return;
+               return 0;
                }
 
                accounts = goa_client_get_accounts (client);
@@ -300,38 +303,139 @@ get_todoist_account(GrIngredientsExporter *exporter)
                        exporter->account_object = GOA_OBJECT(l->data);
                        g_print("provider type %s \n", goa_account_get_provider_type(account));
                            return TRUE;
-                       }
-                   else
-                       return FALSE;
-                       
+                       }       
                }
+               return FALSE;
 }
 
 static void get_access_token (GrIngredientsExporter *exporter)
 {
 
 
-           GoaObject *account_object;
            gchar *access_token;
            GoaOAuth2Based *oauth2 = NULL;
            GError *error;
 
+               error = NULL;
+               oauth2 = goa_object_get_oauth2_based (GOA_OBJECT (exporter->account_object));
 
+               if (!goa_oauth2_based_call_get_access_token_sync (oauth2, &access_token, NULL, NULL, &error))
+           {
+              g_print("access token not found!");
+           }
 
-               error = NULL;
-       oauth2 = goa_object_get_oauth2_based (GOA_OBJECT (exporter->account_object));
-
-       if (!goa_oauth2_based_call_get_access_token_sync (oauth2, &access_token, NULL, NULL, &error))
-    {
-       g_print("access token not found!");
-    }
-
-    if (exporter->todoist_row == exporter->account_row_selected)
-    {
-       g_print ("export the list here\n");
-    }
-    exporter->access_token = access_token;
-    g_print("%s",access_token);
+           if (exporter->todoist_row == exporter->account_row_selected)
+           {
+               g_print ("export the list here\n");
+           }
+           exporter->access_token = access_token;
+           g_print("%s",access_token);
+}
+
+static void 
+add_project_id (GrIngredientsExporter *exporter)
+{
+
+               RestProxy *proxy;
+               RestProxyCall *call;
+               gchar *uuid = g_uuid_string_random();
+               gchar *temp_id = g_uuid_string_random();
+               guint status_code;
+               GError *error;
+
+               JsonObject *object;
+               JsonParser *parser;
+               GError *parse_error;
+               const gchar *payload;
+               JsonArray *projects;
+
+               gsize payload_length;
+               const gchar *sync_token;
+
+               GList *lists;
+               GList *l;
+               GString *project_add_commands;
+
+               project_add_commands = g_string_new ("");
+               g_print("inside the loop to add project_id");
+               proxy = rest_proxy_new (TODOIST_URL, FALSE);
+               call = rest_proxy_new_call (proxy);
+               rest_proxy_call_set_method (call, "POST");      
+               rest_proxy_call_add_header (call, "content-type", "application/x-www-form-urlencoded");
+               rest_proxy_call_add_param (call, "token", exporter->access_token);
+               rest_proxy_call_add_param (call, "resource_types", "[\"projects\"]" );
+
+
+               if (!exporter->sync_token)
+                       rest_proxy_call_add_param (call, "sync_token", "\'*\'");
+               else
+                       rest_proxy_call_add_param (call, "sync_token", exporter->sync_token);
+
+               g_string_append_printf (project_add_commands, "[{\"type\": \"project_add\", 
\"temp_id\":\"%s\",\"uuid\":\"%s\", "
+                                   "\"args\":{\"name\":\"Shopping List from Recipes\"}}]",
+                               temp_id, uuid);
+
+               rest_proxy_call_add_param (call, "commands",project_add_commands->str);
+               g_print("before caaling sync");
+
+               if (!rest_proxy_call_sync (call,
+                                     &error))
+               {
+                   g_clear_error (&error);
+               }
+
+               g_print("after caaling sync");
+               status_code = rest_proxy_call_get_status_code (call);
+               g_print("status code : %d",status_code);
+               if (status_code != 200)
+               {
+                       g_print("status code %d", status_code);
+               }
+
+               parser = json_parser_new ();
+               payload = rest_proxy_call_get_payload (call);
+               if (!payload)
+               {
+                       g_print("payload empty\n");
+               }
+               payload_length = rest_proxy_call_get_payload_length (call);
+
+               if (!json_parser_load_from_data (parser, payload, payload_length, &parse_error))
+               {
+                   g_clear_error (&parse_error);
+                   g_print("couldnt load payload");
+               }
+
+               object = json_node_dup_object (json_parser_get_root (parser));
+               
+               if (!object)
+                       g_print("No Data found");
+               g_print("get array member");
+               projects = json_object_get_array_member (object, "projects");
+
+               lists = json_array_get_elements (projects);
+               sync_token = json_object_get_string_member(object, "sync_token");
+               exporter->sync_token = sync_token;
+
+               for (l = lists; l != NULL; l = l->next)
+               {
+                   JsonObject *object;
+                    
+                       const gchar *name;
+                   double id;
+                           
+                   object = json_node_get_object (l->data);
+
+                   name = json_object_get_string_member (object, "name");
+                   g_print("%s" , name);
+                   if (strcmp (name, "Shopping List from Recipes") == 0)
+                   {           
+                       id = json_object_get_double_member (object, "id");
+                               (exporter->project_id) = (glong) id;
+                               g_print("id : %ld\n",exporter->project_id);
+                            //         goto export;
+                   }
+               }
 }
 
 static void
@@ -340,10 +444,17 @@ get_project_id (GrIngredientsExporter *exporter)
                RestProxy *proxy;
                RestProxyCall *call;
                GError *error;
-           JsonObject *params;
-           JsonObject *project;
-           params = json_object_new ();
-           project = json_object_new ();
+
+           JsonObject *object;
+               JsonParser *parser;
+               GError *parse_error;
+               const gchar *payload;
+               guint status_code;
+               gsize payload_length;
+               const gchar *sync_token;
+               GList *lists;
+               GList *l;
+               JsonArray *projects;
 
 
            proxy = rest_proxy_new (TODOIST_URL, FALSE);
@@ -357,26 +468,13 @@ get_project_id (GrIngredientsExporter *exporter)
                rest_proxy_call_add_param (call, "sync_token", exporter->sync_token);
            rest_proxy_call_add_param (call, "resource_types", "[\"projects\"]");
 
-           if (!rest_proxy_call_sync (call,
-                                     &error))
-
+           g_print("before get sync call");
+           if (!rest_proxy_call_sync (call, &error))
            {
              g_clear_error (&error);
-
            }
 
            g_object_unref(proxy);
-           JsonObject *object;
-               JsonParser *parser;
-               GError *parse_error;
-               const gchar *payload;
-               guint status_code;
-               gsize payload_length;
-               gchar *sync_token;
-               GList *lists;
-               GList *l;
-               JsonArray *projects;
-               RestProxyCall *call2;
 
                parse_error = NULL;
                status_code = rest_proxy_call_get_status_code (call);
@@ -417,54 +515,24 @@ get_project_id (GrIngredientsExporter *exporter)
                    g_print("%s" , name);
                    if (strcmp (name, "Shopping List from Recipes") == 0)
                    {
+                       
                        id = json_object_get_double_member (object, "id");
-                       exporter->project_id  = (glong)malloc(sizeof(glong));
-                       g_print ("size of project_id %d" , sizeof(exporter->project_id));
                        (exporter->project_id) = (glong) id;
                        g_print("id : %ld\n",exporter->project_id);
                        goto export;
                    }
                }
                
-               if (exporter->project_id == NULL)
+               if (!exporter->project_id)
                {
-                       gchar *uuid = g_uuid_string_random();
-                       gchar *temp_id = g_uuid_string_random();
-                       guint status_code2;
-                       GString *project_add_commands;
-                       project_add_commands = g_string_new ("");
-                       g_print("inside the loop to add project_id");
-                       proxy = rest_proxy_new (TODOIST_URL, FALSE);
-                   call2 = rest_proxy_new_call (proxy);
-                   rest_proxy_call_set_method (call2, "POST"); 
-                   rest_proxy_call_add_header (call2, "content-type", "application/x-www-form-urlencoded");
-                   rest_proxy_call_add_param (call2, "token", exporter->access_token);
-                   if(!exporter->sync_token)
-                       rest_proxy_call_add_param (call2, "sync_token", "\'*\'");
-                   else
-                       rest_proxy_call_add_param (call2, "sync_token", exporter->sync_token);
-
-                   g_string_append_printf (project_add_commands, "[{\"type\": \"project_add\", 
\"temp_id\":\"%s\",\"uuid\":\"%s\", "
-                             "\"args\":{\"name\":\"Shopping List from Recipes\"}}]",
-                             temp_id, uuid);
-
-
-                   rest_proxy_call_add_param (call2, "commands",project_add_commands->str);
-
-                   if (!rest_proxy_call_sync (call2,
-                                     &error))
-                   {
-                     g_clear_error (&error);
-
-                   }
-                   status_code2 = rest_proxy_call_get_status_code (call2);
-                               if (status_code2 != 200)
-                       {
-                       g_print("status code %d", status_code);
-                       }
-                       get_project_id(exporter);
+                       add_project_id(exporter);
                }
 
+               sync_token = json_object_get_string_member (object, "sync_token");
+                       
+               exporter->sync_token = sync_token;
+               g_print("%s",exporter->sync_token);
+
                export:
                if (exporter->project_id)
                {
@@ -474,10 +542,11 @@ get_project_id (GrIngredientsExporter *exporter)
 } 
 
 static void
-initialize_export (GrIngredientsExporter *exporter) {
+initialize_export (GrIngredientsExporter *exporter)
+{
 
        get_access_token (exporter);
-       if (exporter->project_id == NULL)
+       if (!exporter->project_id)
        {
                get_project_id (exporter);
        }
@@ -491,7 +560,6 @@ show_export_dialog (GrIngredientsExporter *exporter)
         GtkWidget *dialog;
         GObject *add_service;
 
-
         builder = gtk_builder_new_from_resource ("/org/gnome/Recipes/ingredients-exporter-dialog.ui");
         dialog = GTK_WIDGET (gtk_builder_get_object (builder, "dialog"));
         exporter->todoist_row = GTK_WIDGET (gtk_builder_get_object (builder, "todoist_account_row"));


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