~alexlauni/libunity-webapps/firefox-crash-lp1068495

« back to all changes in this revision

Viewing changes to src/index-updater/ubuntu-webapps-update-index.c

MergeĀ lp:~robertcarr/libunity-webapps/package-support

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
#include <stdlib.h>
 
3
 
 
4
#include <glib.h>
 
5
#include <glib-object.h>
 
6
#include <glib/gstdio.h>
 
7
 
 
8
#include "apt-cache-parser.h"
 
9
#include "unity-webapps-url-db.h"
 
10
 
 
11
static GMainLoop *main_loop = NULL;
 
12
static AptCacheParser *parser = NULL;
 
13
static UnityWebappsUrlDB *url_db = NULL;
 
14
 
 
15
gboolean
 
16
spawn_apt_cache (GIOChannel **available, GError **error)
 
17
{
 
18
  gchar *argv[] = {"apt-cache", "dumpavail", NULL};
 
19
  gint cstdo;
 
20
  
 
21
  g_spawn_async_with_pipes (NULL, argv, NULL,
 
22
                            G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL,
 
23
                            &cstdo, NULL, error);
 
24
  
 
25
  *available = NULL;
 
26
  
 
27
  if (*error != NULL)
 
28
    {
 
29
      g_warning ("Failed to spawn apt-cache: %s\n", (*error)->message);
 
30
      return FALSE;
 
31
    }
 
32
  
 
33
  *available = g_io_channel_unix_new (cstdo);
 
34
                
 
35
  return TRUE;
 
36
}
 
37
 
 
38
gboolean
 
39
package_info_available (GIOChannel *channel,
 
40
                        GIOCondition condition,
 
41
                        gpointer user_data)
 
42
{
 
43
  gchar *line;
 
44
  GIOStatus ret;
 
45
  
 
46
  ret = G_IO_STATUS_NORMAL;
 
47
 
 
48
  while (ret == G_IO_STATUS_NORMAL)
 
49
    {
 
50
      ret = g_io_channel_read_line (channel, &line, NULL, NULL, NULL);
 
51
 
 
52
      if (line != NULL)
 
53
        {
 
54
          apt_cache_parser_next_line (parser, line);
 
55
        }
 
56
    }
 
57
  return TRUE;
 
58
}
 
59
 
 
60
gboolean
 
61
package_info_done (GIOChannel *channel,
 
62
                   GIOCondition condition,
 
63
                   gpointer user_data)
 
64
{
 
65
  GList *infos;
 
66
  
 
67
  infos= apt_cache_parser_get_webapp_infos (parser);
 
68
  
 
69
  while (infos != NULL)
 
70
    {
 
71
      WebappInfo *info;
 
72
      GPtrArray *urls;
 
73
      const gchar *package_name;
 
74
      int i;
 
75
 
 
76
      info = (WebappInfo *)infos->data;
 
77
      
 
78
      package_name = webapp_info_get_package_name (info);
 
79
      g_printf("Found webapp: %s \n", package_name);
 
80
      infos = infos->next;
 
81
      
 
82
      urls = webapp_info_get_urls (info);
 
83
      
 
84
      for (i = 0; i < urls->len; i++)
 
85
        {
 
86
          gchar *url;
 
87
          
 
88
          url = (gchar *)g_ptr_array_index (urls, i);
 
89
          unity_webapps_url_db_insert_url (url_db, url, package_name);
 
90
        }
 
91
    }
 
92
  
 
93
  g_main_loop_quit (main_loop);
 
94
  return FALSE;
 
95
}
 
96
 
 
97
gboolean
 
98
list_available_webapps ()
 
99
{
 
100
  GIOChannel *available;
 
101
  GError *error;
 
102
  gboolean spawned;
 
103
  
 
104
  error = NULL;
 
105
  
 
106
  spawned = spawn_apt_cache (&available, &error);
 
107
  
 
108
  if (spawned == FALSE)
 
109
    {
 
110
      g_error ("Error listing available packages: %s \n", error->message);
 
111
      g_error_free (error);
 
112
      
 
113
      return FALSE;
 
114
    }
 
115
  
 
116
  parser = apt_cache_parser_new ();
 
117
  
 
118
  
 
119
  
 
120
  g_io_add_watch (available, G_IO_IN, package_info_available, parser);
 
121
  g_io_add_watch (available, G_IO_HUP, package_info_done, NULL);
 
122
  
 
123
  return TRUE;
 
124
}
 
125
 
 
126
int
 
127
main (gint argc, gchar **argv)
 
128
{
 
129
  url_db = unity_webapps_url_db_open_default (FALSE);
 
130
  list_available_webapps();
 
131
  
 
132
  main_loop = g_main_loop_new (NULL, FALSE);
 
133
  g_main_loop_run (main_loop);
 
134
  
 
135
  return 0;
 
136
}