--- /dev/null
+/***************************************************************************
+ * 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 = >klog;
+ cb->put_image = &show_image;
+ g_thread_create((GThreadFunc)app,cb,FALSE,NULL);
+
+ gtk_main();
+
+ gdk_threads_leave();
+ return 0;
+}