7abf3b1c220a367b4ddb558e1c3144817d6977a2
[jamendo] / branches / nota-show-app / src / gtkapp.c
1 /***************************************************************************
2  *            gtkapp.c
3  *
4  *  Wed Nov 18 10:46:06 2009
5  *  Copyright  2009  Marcin Miklas
6  *  <marcin.miklas@teleca.com>
7  ****************************************************************************/
8
9 #include <gtk/gtk.h>
10 #include <string.h> // for strlen
11 #include <netinet/in.h> 
12 #include <stdlib.h>
13 #include <unistd.h>
14
15 #include "notaio.h"
16 #include "pdu.h"
17
18 GtkWidget* g_image = NULL;
19 GtkWidget* g_text_view = NULL;
20
21 void displayUI()
22 {
23         GtkWidget* mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
24
25         gtk_window_set_default_size(GTK_WINDOW(mainWindow), 400, 300);
26         gtk_window_set_title(GTK_WINDOW(mainWindow), "NoTA Application");
27         gtk_window_set_position(GTK_WINDOW(mainWindow), GTK_WIN_POS_CENTER_ALWAYS);
28
29         gtk_signal_connect(GTK_OBJECT(mainWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
30
31         GtkWidget *vbox = gtk_vbox_new(FALSE,2);
32         gtk_container_add(GTK_CONTAINER(mainWindow),vbox);
33
34         g_text_view = gtk_text_view_new();
35         gtk_text_view_set_editable(GTK_TEXT_VIEW(g_text_view),FALSE);
36         gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(g_text_view),FALSE);
37         
38         GtkWidget* swindow = gtk_scrolled_window_new (NULL, NULL);
39         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
40                                   GTK_POLICY_AUTOMATIC,
41                                   GTK_POLICY_AUTOMATIC);
42         gtk_container_add(GTK_CONTAINER(swindow), g_text_view);
43         
44         g_image = gtk_image_new();
45         GdkPixbuf* pixbuf = gtk_widget_render_icon(GTK_WIDGET(g_image),GTK_STOCK_MISSING_IMAGE,GTK_ICON_SIZE_DIALOG, NULL);
46         gtk_image_set_from_pixbuf(GTK_IMAGE(g_image),pixbuf);
47             
48         gtk_box_pack_end(GTK_BOX(vbox), swindow, TRUE, TRUE, 0);
49         gtk_box_pack_end(GTK_BOX(vbox),g_image,TRUE,TRUE,0);
50
51         gtk_widget_show_all(mainWindow);
52 }
53
54 void gtklog(const char* str) {
55         GtkTextBuffer* text_buffer;
56         GtkTextIter iter;
57
58         gdk_threads_enter();
59
60         text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(g_text_view));
61         gtk_text_buffer_insert_at_cursor(text_buffer,str,strlen(str));
62         gtk_text_buffer_get_end_iter(text_buffer,&iter);
63         gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(g_text_view),&iter,0,FALSE,0,0);
64
65         gdk_threads_leave();
66 }
67
68 void show_image(unsigned char* img_buf,int size) {
69         gdk_threads_enter();
70
71         GdkPixbufLoader* loader = gdk_pixbuf_loader_new();
72         gdk_pixbuf_loader_write(loader,(guchar*)img_buf,size,NULL);
73         gdk_pixbuf_loader_close(loader,NULL);
74         GdkPixbuf* pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
75         gtk_image_set_from_pixbuf(GTK_IMAGE(g_image),pixbuf);
76         g_object_unref(loader);
77
78         gdk_threads_leave();
79 }
80
81 void* app(ServiceCallbacks* cb) {
82         /* Service socket to use for connecting to the service node. */
83         HSSockID sockid;
84         HErrorCode err;
85
86         /* The first parameter specifies the service to connect to (SID).
87          * The other parameters are reserved for legacy purposes.
88          */
89         sockid = n_connect(DEFAULT_SID, NULL, NULL);
90
91         /* sockid will be the number of the socket we got (>0), if successful,
92          * or <0 if something went wrong. Let's check:
93          */
94         if (sockid < 0) {
95                 return NULL;
96         }
97
98         LOG2("Connected socket %d to service '%d'.\n", sockid, DEFAULT_SID);
99
100         while(TRUE) {
101                 int smsg_len;
102                 ServiceMessage* smsg = pack_pdu(GET_IMAGE, NULL, 0, &smsg_len);
103
104                 err = n_send(sockid, smsg, smsg_len, HSSendBlocking);
105                 free(smsg);
106                 if(err < 0){
107                         return NULL;
108                 }
109
110                 usleep(100000);
111
112                 int err = read_smsg(&sockid, HSReceiveNonBlocking, cb); 
113                 if (err < 0)    //error reading service message
114                 {
115                         usleep(100000);
116                 }
117         }
118
119 }
120
121 int main(int argc, char *argv[])
122 {
123         if (!g_thread_supported()) {
124                 g_thread_init(NULL);
125         }
126         gdk_threads_init();
127         gdk_threads_enter();
128         
129         gtk_init(&argc, &argv);
130
131         displayUI();
132
133         ServiceCallbacks* cb = g_new0(ServiceCallbacks,1);
134         cb->log = &gtklog;
135         cb->put_image = &show_image;
136         g_thread_create((GThreadFunc)app,cb,FALSE,NULL);
137         
138         gtk_main();
139
140         gdk_threads_leave();
141         return 0;
142 }