Initial commit
[jamendo] / branches / nota-show-app / src / gtkapp.c
diff --git a/branches/nota-show-app/src/gtkapp.c b/branches/nota-show-app/src/gtkapp.c
new file mode 100644 (file)
index 0000000..7abf3b1
--- /dev/null
@@ -0,0 +1,142 @@
+/***************************************************************************
+ *            gtkapp.c
+ *
+ *  Wed Nov 18 10:46:06 2009
+ *  Copyright  2009  Marcin Miklas
+ *  <marcin.miklas@teleca.com>
+ ****************************************************************************/
+
+#include <gtk/gtk.h>
+#include <string.h> // for strlen
+#include <netinet/in.h> 
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "notaio.h"
+#include "pdu.h"
+
+GtkWidget* g_image = NULL;
+GtkWidget* g_text_view = NULL;
+
+void displayUI()
+{
+       GtkWidget* mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+       gtk_window_set_default_size(GTK_WINDOW(mainWindow), 400, 300);
+       gtk_window_set_title(GTK_WINDOW(mainWindow), "NoTA Application");
+       gtk_window_set_position(GTK_WINDOW(mainWindow), GTK_WIN_POS_CENTER_ALWAYS);
+
+       gtk_signal_connect(GTK_OBJECT(mainWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
+
+       GtkWidget *vbox = gtk_vbox_new(FALSE,2);
+       gtk_container_add(GTK_CONTAINER(mainWindow),vbox);
+
+       g_text_view = gtk_text_view_new();
+       gtk_text_view_set_editable(GTK_TEXT_VIEW(g_text_view),FALSE);
+       gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(g_text_view),FALSE);
+       
+       GtkWidget* swindow = gtk_scrolled_window_new (NULL, NULL);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+                                  GTK_POLICY_AUTOMATIC,
+                                  GTK_POLICY_AUTOMATIC);
+       gtk_container_add(GTK_CONTAINER(swindow), g_text_view);
+       
+       g_image = gtk_image_new();
+       GdkPixbuf* pixbuf = gtk_widget_render_icon(GTK_WIDGET(g_image),GTK_STOCK_MISSING_IMAGE,GTK_ICON_SIZE_DIALOG, NULL);
+       gtk_image_set_from_pixbuf(GTK_IMAGE(g_image),pixbuf);
+           
+       gtk_box_pack_end(GTK_BOX(vbox), swindow, TRUE, TRUE, 0);
+       gtk_box_pack_end(GTK_BOX(vbox),g_image,TRUE,TRUE,0);
+
+       gtk_widget_show_all(mainWindow);
+}
+
+void gtklog(const char* str) {
+       GtkTextBuffer* text_buffer;
+       GtkTextIter iter;
+
+       gdk_threads_enter();
+
+       text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(g_text_view));
+       gtk_text_buffer_insert_at_cursor(text_buffer,str,strlen(str));
+       gtk_text_buffer_get_end_iter(text_buffer,&iter);
+       gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(g_text_view),&iter,0,FALSE,0,0);
+
+       gdk_threads_leave();
+}
+
+void show_image(unsigned char* img_buf,int size) {
+       gdk_threads_enter();
+
+       GdkPixbufLoader* loader = gdk_pixbuf_loader_new();
+       gdk_pixbuf_loader_write(loader,(guchar*)img_buf,size,NULL);
+       gdk_pixbuf_loader_close(loader,NULL);
+       GdkPixbuf* pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
+       gtk_image_set_from_pixbuf(GTK_IMAGE(g_image),pixbuf);
+       g_object_unref(loader);
+
+       gdk_threads_leave();
+}
+
+void* app(ServiceCallbacks* cb) {
+       /* Service socket to use for connecting to the service node. */
+       HSSockID sockid;
+       HErrorCode err;
+
+       /* The first parameter specifies the service to connect to (SID).
+        * The other parameters are reserved for legacy purposes.
+        */
+       sockid = n_connect(DEFAULT_SID, NULL, NULL);
+
+       /* sockid will be the number of the socket we got (>0), if successful,
+        * or <0 if something went wrong. Let's check:
+        */
+       if (sockid < 0) {
+               return NULL;
+       }
+
+       LOG2("Connected socket %d to service '%d'.\n", sockid, DEFAULT_SID);
+
+       while(TRUE) {
+               int smsg_len;
+               ServiceMessage* smsg = pack_pdu(GET_IMAGE, NULL, 0, &smsg_len);
+
+               err = n_send(sockid, smsg, smsg_len, HSSendBlocking);
+               free(smsg);
+               if(err < 0){
+                       return NULL;
+               }
+
+               usleep(100000);
+
+               int err = read_smsg(&sockid, HSReceiveNonBlocking, cb); 
+               if (err < 0)    //error reading service message
+               {
+                       usleep(100000);
+               }
+       }
+
+}
+
+int main(int argc, char *argv[])
+{
+       if (!g_thread_supported()) {
+               g_thread_init(NULL);
+       }
+       gdk_threads_init();
+       gdk_threads_enter();
+       
+       gtk_init(&argc, &argv);
+
+       displayUI();
+
+       ServiceCallbacks* cb = g_new0(ServiceCallbacks,1);
+       cb->log = &gtklog;
+       cb->put_image = &show_image;
+       g_thread_create((GThreadFunc)app,cb,FALSE,NULL);
+       
+       gtk_main();
+
+       gdk_threads_leave();
+       return 0;
+}