You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by ab...@apache.org on 2011/11/03 12:01:51 UTC

svn commit: r1197062 - in /incubator/celix/trunk: examples/osgi-in-action/chapter04-paint-example/circle/private/src/ examples/osgi-in-action/chapter04-paint-example/paint/ examples/osgi-in-action/chapter04-paint-example/paint/MANIFEST/ examples/osgi-i...

Author: abroekhuis
Date: Thu Nov  3 11:01:50 2011
New Revision: 1197062

URL: http://svn.apache.org/viewvc?rev=1197062&view=rev
Log:
Updated Paint example

Disabled assignable check due to module and service layer mixup in Celix

Added:
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/gtktest.glade
Modified:
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/circle/private/src/circle_shape.c
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/CMakeLists.txt
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/MANIFEST/MANIFEST.MF
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/default_shape.h
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/paint_frame.h
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/shape_component.h
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/activator.c
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/paint_frame.c
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/shape_component.c
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/square/private/src/square_shape.c
    incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/triangle/private/src/triangle_shape.c
    incubator/celix/trunk/framework/private/src/service_reference.c

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/circle/private/src/circle_shape.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/circle/private/src/circle_shape.c?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/circle/private/src/circle_shape.c (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/circle/private/src/circle_shape.c Thu Nov  3 11:01:50 2011
@@ -40,6 +40,7 @@ celix_status_t circleShape_create(BUNDLE
 				if (!*shape) {
 					status = CELIX_ENOMEM;
 				} else {
+					(*shape)->name = "Circle";
 					(*shape)->icon_path = NULL;
 					celix_status_t status = bundle_getEntry(bundle, CIRCLE_FILE, pool, &(*shape)->icon_path);
 					if (status == CELIX_SUCCESS) {

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/CMakeLists.txt
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/CMakeLists.txt?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/CMakeLists.txt (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/CMakeLists.txt Thu Nov  3 11:01:50 2011
@@ -20,6 +20,7 @@ cmake_policy(SET CMP0014 NEW)
 pkg_search_module (GLIB  REQUIRED glib-2.0)
 pkg_search_module (GTHR  REQUIRED gthread-2.0)
 pkg_search_module (GTK   REQUIRED gtk+-2.0)
+pkg_search_module (GMODULE   REQUIRED gmodule-2.0)
 include_directories(
 	../circle/public/include
 	../square/public/include
@@ -32,19 +33,21 @@ include_directories(
 include_directories(${GTK_INCLUDE_DIRS})
 include_directories(${GLIB_INCLUDE_DIRS})
 include_directories(${GTHR_INCLUDE_DIRS})
+include_directories(${GMODULE_INCLUDE_DIRS})
 
 link_directories(${GTK_LIBRARY_DIRS})
 link_directories(${GLIB_LIBRARY_DIRS})
 link_directories(${GTHR_LIBRARY_DIRS})
+link_directories(${GMODULE_LIBRARY_DIRS})
 
 add_library(chapter04-paint-example SHARED 
 	private/src/activator
 	private/src/default_shape
-	private/src/paint_frame
 	private/src/shape_component
+	private/src/paint_frame
  )
 include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
-target_link_libraries(chapter04-paint-example framework ${GLIB_LIBRARIES} ${GTK_LIBRARIES} ${GTHR_LIBRARIES})
+target_link_libraries(chapter04-paint-example framework ${MODULE_LIBRARIES} ${GLIB_LIBRARIES} ${GTK_LIBRARIES} ${GTHR_LIBRARIES})
 
-bundle(chapter04-paint-example FILES private/src/underc.png)
+bundle(chapter04-paint-example FILES private/src/underc.png gtktest.glade)

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/MANIFEST/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/MANIFEST/MANIFEST.MF?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/MANIFEST/MANIFEST.MF (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/MANIFEST/MANIFEST.MF Thu Nov  3 11:01:50 2011
@@ -1,6 +1,3 @@
 Bundle-SymbolicName: chapter04-paint-example
 Bundle-Version: 1.0.0
 library: chapter04-paint-example
-Import-Service: simple_shape
-
-

Added: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/gtktest.glade
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/gtktest.glade?rev=1197062&view=auto
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/gtktest.glade (added)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/gtktest.glade Thu Nov  3 11:01:50 2011
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.24"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">600</property>
+    <property name="height_request">400</property>
+    <property name="can_focus">False</property>
+    <signal name="destroy" handler="on_window1_destroy" swapped="no"/>
+    <child>
+      <object class="GtkVBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <object class="GtkToolbar" id="toolbar1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkDrawingArea" id="drawingarea1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property>
+            <signal name="button-press-event" handler="newFrame_mousePressed" after="yes" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/default_shape.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/default_shape.h?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/default_shape.h (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/default_shape.h Thu Nov  3 11:01:50 2011
@@ -8,8 +8,6 @@
 #ifndef DEFAULT_SHAPE_H_
 #define DEFAULT_SHAPE_H_
 
-#define PAINT_FRAME_SERVICE_NAME "paint"
-
 extern SIMPLE_SHAPE defaultShape_create(BUNDLE_CONTEXT context);
 
 #endif /* DEFAULT_SHAPE_H_ */

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/paint_frame.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/paint_frame.h?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/paint_frame.h (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/paint_frame.h Thu Nov  3 11:01:50 2011
@@ -8,33 +8,32 @@
 #ifndef PAINT_FRAME_H_
 #define PAINT_FRAME_H_
 
-static const int BOX = 54;
-
 #define PAINT_FRAME_SERVICE_NAME "paint"
 
 struct paint_frame {
-	GtkWidget *m_toolBar;
+	apr_pool_t *pool;
+	GtkWidget *window;
+	GtkWidget *drawingArea;
+	GtkWidget *toolbar;
+	GdkPixmap *pixMap;
+	bool showing;
+
 	char *m_selected;
-	GtkWidget *m_mainPanel, *m_window, *m_drawingArea;
-	GdkPixmap *m_pixMap;
-	//SHAPE_COMPONENT *m_selectedComponent;
 	HASH_MAP m_shapes;
-	//private ActionListener m_reusableActionListener = new ShapeActionListener();
 	SIMPLE_SHAPE m_defaultShape;
 	LINKED_LIST m_shapeComponents;
-	/* methods */
-	void (*paintFrame_show)(void);
-	void (*paintFrame_selectShape)(char *name);
-	SIMPLE_SHAPE (*paintFrame_getShape)(char *name);
-	void (*paintFrame_addShape)(BUNDLE_CONTEXT context, char* name, void *icon, SIMPLE_SHAPE shape);
-	void (*paintFrame_removeShape)(char *name);
+	BUNDLE_CONTEXT context;
+	GThread *main;
 };
 
 
 typedef struct paint_frame *PAINT_FRAME;
-extern PAINT_FRAME paintFrame_create(BUNDLE_CONTEXT context, apr_pool_t *pool);
-
+celix_status_t paintFrame_create(BUNDLE_CONTEXT context, apr_pool_t *pool, PAINT_FRAME *frame);
+celix_status_t paintFrame_exit(PAINT_FRAME frame);
 
+SIMPLE_SHAPE paintFrame_getShape(PAINT_FRAME frame, char *name);
+celix_status_t paintFrame_addShape(PAINT_FRAME frame, BUNDLE_CONTEXT context, SIMPLE_SHAPE shape);
+celix_status_t paintFrame_removeShape(PAINT_FRAME frame, SIMPLE_SHAPE sshape);
 
 
 #endif /* PAINT_FRAME_H_ */

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/shape_component.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/shape_component.h?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/shape_component.h (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/include/shape_component.h Thu Nov  3 11:01:50 2011
@@ -7,17 +7,20 @@
 
 #ifndef SHAPE_COMPONENT_H_
 #define SHAPE_COMPONENT_H_
+
+#include "paint_frame.h"
+
 typedef struct shape_component *SHAPE_COMPONENT;
 
 struct shape_component {
-	char shapeName[30];
+	char *shapeName;
 	PAINT_FRAME m_frame;
 	gdouble x, y, w, h;
 	void (*shapeComponent_paintComponent)(SHAPE_COMPONENT shapeComponent, PAINT_FRAME frame,
 			GdkPixmap *pixMap, GtkWidget *widget);
 };
 
-extern SHAPE_COMPONENT shapeComponent_create(PAINT_FRAME frame, char *shapeName,
+extern SHAPE_COMPONENT shapeComponent_create(PAINT_FRAME frame, SIMPLE_SHAPE sshape,
 		gdouble x, gdouble y);
 
 #endif /* SHAPE_COMPONENT_H_ */

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/activator.c?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/activator.c (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/activator.c Thu Nov  3 11:01:50 2011
@@ -56,7 +56,8 @@ celix_status_t bundleActivator_create(BU
 		activator->reg = NULL;
 		activator->pool = pool;
 		activator->context = context;
-		activator->paint_frame = paintFrame_create(context, pool);
+		activator->paint_frame = NULL;
+		status = paintFrame_create(context, pool, &activator->paint_frame);
         cust = (SERVICE_TRACKER_CUSTOMIZER) apr_palloc(pool, sizeof(*cust));
         cust->handle = activator;
         cust->addedService = addedServ;
@@ -65,6 +66,7 @@ celix_status_t bundleActivator_create(BU
         cust->removedService = removedServ;
         serviceTracker_create(context, SIMPLE_SHAPE_SERVICE_NAME, cust, &activator->tracker);
 		serviceTracker_open(activator->tracker);
+
 	}
 	return status;
 }
@@ -72,14 +74,13 @@ celix_status_t bundleActivator_create(BU
 celix_status_t bundleActivator_start(void * userData, BUNDLE_CONTEXT ctx) {
 	struct paintFrameActivatorData * act = (struct paintFrameActivatorData *) userData;
 	celix_status_t status = CELIX_SUCCESS;
-    status = bundleContext_registerService(ctx, PAINT_FRAME_SERVICE_NAME,
-    		act->paint_frame, NULL, &act->reg);
 	return status;
 }
 
 celix_status_t bundleActivator_stop(void * userData, BUNDLE_CONTEXT context) {
 	struct paintFrameActivatorData * act = (struct paintFrameActivatorData *) userData;
 	serviceTracker_close(act->tracker);
+	paintFrame_exit(act->paint_frame);
 	return CELIX_SUCCESS;
 }
 
@@ -97,7 +98,7 @@ celix_status_t addingServ(void * handle,
 celix_status_t addedServ(void * handle, SERVICE_REFERENCE ref, void * service) {
 	struct paintFrameActivatorData * data = (struct paintFrameActivatorData *) handle;
 	char * serviceName = properties_get(ref->registration->properties, "name");
-	data->paint_frame->paintFrame_addShape(data->context, serviceName, NULL, service);
+	paintFrame_addShape(data->paint_frame, data->context, service);
 	return CELIX_SUCCESS;
  }
 
@@ -110,6 +111,6 @@ celix_status_t modifiedServ(void * handl
 celix_status_t removedServ(void * handle, SERVICE_REFERENCE ref, void * service) {
 	struct paintFrameActivatorData * data = (struct paintFrameActivatorData *) handle;
 	char * serviceName = properties_get(ref->registration->properties, "name");
-	data->paint_frame->paintFrame_removeShape(serviceName);
+	paintFrame_removeShape(data->paint_frame, service);
 	return CELIX_SUCCESS;
 }

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/paint_frame.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/paint_frame.c?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/paint_frame.c (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/paint_frame.c Thu Nov  3 11:01:50 2011
@@ -15,12 +15,13 @@
  **/
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <gtk/gtk.h>
 #include <string.h>
 #include <stdbool.h>
-#include <stdlib.h>
 #include <glib.h>
-#include <gtk/gtk.h>
 #include <gdk/gdk.h>
+#include "headers.h"
 #include "bundle_context.h"
 #include "bundle.h"
 #include "utils.h"
@@ -31,156 +32,181 @@
 #include "paint_frame.h"
 #include "shape_component.h"
 #include "default_shape.h"
+#include "celix_errno.h"
 
 static PAINT_FRAME this = NULL;
 
-struct gtk_thread_data {
-	apr_pool_t *pool;
-	BUNDLE_CONTEXT context;
-};
 struct shape_info {
 	char *name;
-	SIMPLE_SHAPE m_shape;
+	SIMPLE_SHAPE shape;
 	GtkWidget *button;
 };
 
-typedef struct shape_info *SHAPE_INFO;
+typedef struct shape_info *shape_info_t;
+static celix_status_t paintFrame_redraw(PAINT_FRAME frame, GdkModifierType state);
+static celix_status_t paintFrame_show(PAINT_FRAME frame);
+static void paintFrame_destroy(GtkWidget *widget, gpointer data);
+static void paintFrame_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data);
+static void paintFrame_configure(GtkWidget *widget, GdkEventConfigure *event, gpointer data);
+static void paintFrame_buttonClicked(GtkWidget *button, gpointer data);
+static gboolean paintFrame_mousePressed( GtkWidget *widget, GdkEventButton *event, gpointer data);
+static gpointer paintFrame_gtkmain(gpointer a_data);
+static void paintFrame_destroyWidgets(PAINT_FRAME frame);
 
+/**
+ * Default constructor that populates the main window.
+ **/
+celix_status_t paintFrame_create(BUNDLE_CONTEXT context, apr_pool_t *pool, PAINT_FRAME *frame) {
+	celix_status_t status = CELIX_SUCCESS;
+	apr_pool_t *mypool = NULL;
+	apr_pool_create(&mypool, pool);
+	this = malloc(sizeof(*this));
+	if (!this) {
+		this = NULL;
+		status = CELIX_ENOMEM;
+	} else {
+		*frame = this;
+		GtkBuilder *builder;
+		char *builderFile;
+		BUNDLE bundle;
+		GError *error = NULL;
+
+		(*frame)->showing = false;
+		(*frame)->pool = mypool;
+		(*frame)->pixMap = NULL;
+		(*frame)->m_selected = NULL;
+		(*frame)->context = context;
+		(*frame)->m_shapes = hashMap_create(string_hash, NULL, string_equals, NULL);
+		(*frame)->m_defaultShape = defaultShape_create((*frame)->context);
+		linkedList_create((*frame)->pool, &(*frame)->m_shapeComponents);
+
+
+		status = bundleContext_getBundle(context, &bundle);
+		if (status == CELIX_SUCCESS) {
+			status = bundle_getEntry(bundle, "gtktest.glade", mypool, &builderFile);
+			if (status == CELIX_SUCCESS) {
+				g_thread_init(NULL);
+				gdk_threads_init();
+				gtk_init(NULL, NULL);
+
+				builder = gtk_builder_new();
+				gtk_builder_add_from_file(builder, builderFile, NULL);
+
+				(*frame)->window = GTK_WIDGET(gtk_builder_get_object (builder, "window1"));
+				(*frame)->toolbar = GTK_WIDGET(gtk_builder_get_object (builder, "toolbar1"));
+				(*frame)->drawingArea = GTK_WIDGET(gtk_builder_get_object (builder, "drawingarea1"));
+				g_object_unref(G_OBJECT(builder));
+
+				gtk_window_set_title(GTK_WINDOW((*frame)->window), "OSGi in Action, Paint-Example");
+
+				gtk_widget_set_events ((*frame)->drawingArea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
+
+				g_signal_connect(G_OBJECT((*frame)->window), "destroy", G_CALLBACK(paintFrame_destroy), (*frame));
+				g_signal_connect(G_OBJECT((*frame)->drawingArea), "expose_event", G_CALLBACK(paintFrame_expose), (*frame));
+				g_signal_connect(G_OBJECT((*frame)->drawingArea), "configure_event", G_CALLBACK(paintFrame_configure), (*frame));
+				g_signal_connect(G_OBJECT((*frame)->drawingArea), "button_press_event", G_CALLBACK(paintFrame_mousePressed), (*frame));
+
+
+				paintFrame_show((*frame));
+				(*frame)->showing = true;
+
+				if( g_thread_supported()) {
+					(*frame)->main = g_thread_create(paintFrame_gtkmain, (*frame), TRUE, &error);
+					if ((*frame)->main == NULL){
+						g_printerr ("Failed to create thread: %s\n", error->message);
+						status = CELIX_BUNDLE_EXCEPTION;
+					}
+				} else {
+					g_printerr("g_thread NOT supported\n");
+				}
+			}
+		}
+	}
 
-static SHAPE_INFO shapeInfo_create(char* name, GtkWidget *button, SIMPLE_SHAPE shape){
-	SHAPE_INFO info = malloc(sizeof(*info));
-	info->m_shape = shape;
-	info->name = name;
-	info->button = button;
-	return info;
-}
-static void paintFrame_show() {
-	gtk_widget_show (this->m_drawingArea);
-	gtk_widget_show (this->m_mainPanel);
-	gtk_widget_show (this->m_toolBar);
-	gtk_widget_show (this->m_window);
+	return status;
 }
 
-/* main function */
-static gpointer _gtkthread(gpointer a_data) {
+celix_status_t paintFrame_exit(PAINT_FRAME frame) {
+	frame->showing = false;
+
+	paintFrame_destroyWidgets(frame);
+
 	gdk_threads_enter();
-	gtk_main ();
+
+	gtk_main_quit();
+
 	gdk_threads_leave();
-	return NULL;
-}
 
-static void redraw(GtkWidget *widget, GdkModifierType state){
-	if (this->m_pixMap != NULL) {
-		GdkRectangle update_rect;
+	g_thread_join(frame->main);
 
-		update_rect.x = 0;
-		update_rect.y = 0;
-		update_rect.width = widget->allocation.width;
-		update_rect.height = widget->allocation.height;
-		gdk_draw_rectangle (this->m_pixMap,
-				widget->style->white_gc,
-				TRUE,
-				update_rect.x, update_rect.y,
-				update_rect.width, update_rect.height);
-		gtk_widget_draw(widget, &update_rect);
-		LINKED_LIST_ITERATOR it = linkedListIterator_create(this->m_shapeComponents, 0);
-		while (linkedListIterator_hasNext(it)){
-			SHAPE_COMPONENT sc = linkedListIterator_next(it);
-			(*sc->shapeComponent_paintComponent)(sc, this, this->m_pixMap, widget);
-		}
-	}
+	return CELIX_SUCCESS;
 }
 
+static celix_status_t shapeInfo_create(PAINT_FRAME frame, char* name, GtkWidget *button, SIMPLE_SHAPE shape, shape_info_t *info){
+	*info = malloc(sizeof(**info));
+	(*info)->shape = shape;
+	(*info)->name = name;
+	(*info)->button = button;
+	return CELIX_SUCCESS;
+}
+static celix_status_t paintFrame_show(PAINT_FRAME frame) {
+	gtk_widget_show(frame->drawingArea);
+	gtk_widget_show(frame->toolbar);
+	gtk_widget_show(frame->window);
 
-static void button_handler( GtkWidget *widget,
-                   	   gpointer   data )
-{
-    this->m_selected = (gchar *) data;
-}
-static void destroy( GtkWidget *widget,
-                     gpointer   data )
-{
-    gtk_main_quit ();
-}
-static gboolean delete(GtkWidget *widget,
-                     gpointer   data )
-{
-    gtk_main_quit ();
-    return TRUE;
+	return CELIX_SUCCESS;
 }
-/******************************** mouse event handler *******************/
+
 /**
- * notification of a mouse motion
- */
-static gboolean
-motion_notify_event( GtkWidget *widget, GdkEventMotion *event )
-{
-  int x, y;
-  GdkModifierType state;
-  if (event->is_hint) {
-    gdk_window_get_pointer (event->window, &x, &y, &state);
-  } else {
-      x = event->x;
-      y = event->y;
-      state = event->state;
-    }
-  return TRUE;
-}
-/******************************** drawable event handler *******************/
-/* Redraw the screen from the backing pixmap */
-static gboolean
-expose_event( GtkWidget *widget, GdkEventExpose *event )
-{
-	gdk_draw_drawable(widget->window,
-			widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
-			this->m_pixMap,
-			event->area.x, event->area.y,
-			event->area.x, event->area.y,
-			event->area.width, event->area.height);
-	return TRUE;
-}
-/* configuration events  */
-static gboolean
-configure_event( GtkWidget *widget, GdkEventConfigure *event )
-{
-  if (this->m_pixMap) {
-    g_object_unref(this->m_pixMap);
-  }
-
-  this->m_pixMap = gdk_pixmap_new(widget->window,
-              widget->allocation.width,
-              widget->allocation.height,
-              -1);
-  redraw(widget, 0);
-  return TRUE;
-}
-
-static gboolean
-button_press_event( GtkWidget *widget, GdkEventButton *event )
-{
-  if (event->button == 1 && this->m_pixMap != NULL) {
-	  if (this->m_selected == NULL){
-		 printf("no button selected yet\n");
-	  } else {
-	    SHAPE_COMPONENT sc = shapeComponent_create(this, this->m_selected, event->x, event->y);
-	    linkedList_addFirst(this->m_shapeComponents, sc);
-	    (*sc->shapeComponent_paintComponent)(sc, this, this->m_pixMap, widget);
-	  }
-  }
-  return TRUE;
-}
+ * Injects an available <tt>SimpleShape</tt> into the drawing frame.
+ *
+ * @param name The name of the injected <tt>SimpleShape</tt>.
+ * @param icon The icon associated with the injected <tt>SimpleShape</tt>.
+ * @param shape The injected <tt>SimpleShape</tt> instance.
+ **/
+celix_status_t paintFrame_addShape(PAINT_FRAME frame, BUNDLE_CONTEXT context, SIMPLE_SHAPE shape) {
+	celix_status_t status = CELIX_SUCCESS;
 
+	gdk_threads_enter();
+	GError *gerror = NULL;
+	GtkWidget *button = gtk_button_new();
+	gtk_widget_set_name((GtkWidget *) button, shape->name);
+	GtkWidget *im = gtk_image_new_from_file(shape->icon_path);
+	gtk_button_set_image((GtkButton *) button, im);
+	gtk_toolbar_append_widget((GtkToolbar *) frame->toolbar, (GtkWidget *) button, "", "");
+	g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (paintFrame_buttonClicked), frame);
+	gtk_widget_show(button);
+	if (hashMap_get(frame->m_shapes, shape->name) == NULL) {
+		shape_info_t info = NULL;
+		shapeInfo_create(frame, shape->name, button, shape, &info);
+		hashMap_put(frame->m_shapes, shape->name, info);
+	}
+	paintFrame_redraw(frame, 0);
+	paintFrame_show(frame);
+	gdk_threads_leave();
+
+	return status;
+}
 
 /**
- * This method sets the currently selected shape to be used for drawing on the
- * canvas.
+ * Removes a no longer available <tt>SimpleShape</tt> from the drawing frame.
  *
- * @param name The name of the shape to use for drawing on the canvas.
+ * @param name The name of the <tt>SimpleShape</tt> to remove.
  **/
-void paintFrame_selectShape(char *name) {
+celix_status_t paintFrame_removeShape(PAINT_FRAME frame, SIMPLE_SHAPE sshape) {
+	celix_status_t status = CELIX_SUCCESS;
 	gdk_threads_enter();
-	this->m_selected = name;
+	shape_info_t shape = (shape_info_t) hashMap_remove(this->m_shapes, sshape->name);
+	if (shape != NULL) {
+		this->m_selected = NULL;
+		gtk_widget_destroy(GTK_WIDGET(shape->button));
+		gtk_widget_show_all(this->toolbar);
+		paintFrame_redraw(this, 0);
+		paintFrame_show(this);
+	}
 	gdk_threads_leave();
+
+	return status;
 }
 
 /**
@@ -191,147 +217,112 @@ void paintFrame_selectShape(char *name) 
  * @return The corresponding <tt>SimpleShape</tt> instance if available or
  *         <tt>null</tt>.
  **/
-SIMPLE_SHAPE paintFrame_getShape(char *name) {
-	SHAPE_INFO info = (SHAPE_INFO) hashMap_get(this->m_shapes, name);
+SIMPLE_SHAPE paintFrame_getShape(PAINT_FRAME frame, char *name) {
+	shape_info_t info = (shape_info_t) hashMap_get(frame->m_shapes, name);
 	if (info == NULL) {
-		return this->m_defaultShape;
+		return frame->m_defaultShape;
 	} else {
-		return info->m_shape;
+		return info->shape;
 	}
 }
 
-/**
- * Injects an available <tt>SimpleShape</tt> into the drawing frame.
- *
- * @param name The name of the injected <tt>SimpleShape</tt>.
- * @param icon The icon associated with the injected <tt>SimpleShape</tt>.
- * @param shape The injected <tt>SimpleShape</tt> instance.
- **/
-void paintFrame_addShape(BUNDLE_CONTEXT context, char* name, void *icon, SIMPLE_SHAPE shape) {
+static void paintFrame_destroy(GtkWidget *widget, gpointer data) {
+	PAINT_FRAME frame = data;
+	BUNDLE bundle = NULL;
+
+	frame->showing = false;
+
+	bundleContext_getBundleById(frame->context, 0, &bundle);
+	bundle_stop(bundle, 0);
+}
+
+static void paintFrame_destroyWidgets(PAINT_FRAME frame) {
 	gdk_threads_enter();
-	char png_file[30], *path;
-	GError *gerror = NULL;
-	BUNDLE bundle;
-	apr_pool_t *pool;
-	/* Add the buttons to the graph navigation panel. */
-	GtkWidget *button = gtk_button_new();
-	sprintf(png_file, "%s.png", name);
-	bundleContext_getBundle(context, &bundle);
-	bundleContext_getMemoryPool(context, &pool);
-	celix_status_t status = bundle_getEntry(bundle, png_file, pool, &path);
-	if (status == CELIX_SUCCESS) {
-		GtkWidget *im = gtk_image_new_from_file(path);
-		gtk_button_set_image((GtkButton *) button, im);
-		gsize rd = 0, wr = 0;
-		gchar *gfn = g_locale_to_utf8(name, strlen(name), &rd, &wr, &gerror);
-		//gtk_widget_set_size_request(button, 10, 10);
-		gtk_button_set_label((GtkButton *) button, gfn);
-		gtk_box_pack_start (GTK_BOX(this->m_toolBar), button, TRUE, TRUE, 0);
-	} else {
-		printf("Cannot find resource %s\n", png_file);
+
+	if (frame->pixMap != NULL) {
+		gdk_pixmap_unref(frame->pixMap);
 	}
-	g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (button_handler), name);
-	gtk_widget_show(button);
-	if (hashMap_get(this->m_shapes, name) == NULL) {
-		hashMap_put(this->m_shapes, name, shapeInfo_create(name, button, shape));
+	if (frame->toolbar != NULL) {
+		gtk_widget_destroy(frame->toolbar);
+	}
+	if (frame->drawingArea != NULL) {
+		gtk_widget_destroy(frame->drawingArea);
 	}
-	redraw(this->m_drawingArea, 0);
-	paintFrame_show();
+	if (frame->window != NULL) {
+		gtk_widget_destroy(frame->window);
+	}
+
+	frame->pixMap = NULL;
+	frame->toolbar = NULL;
+	frame->window = NULL;
+	frame->drawingArea = NULL;
+
 	gdk_threads_leave();
 }
 
-/**
- * Removes a no longer available <tt>SimpleShape</tt> from the drawing frame.
- *
- * @param name The name of the <tt>SimpleShape</tt> to remove.
- **/
-void paintFrame_removeShape(char *name) {
-	gdk_threads_enter();
-	SHAPE_INFO shape = (SHAPE_INFO) hashMap_remove(this->m_shapes, name);
-	this->m_selected = NULL;
-	gtk_container_remove(GTK_CONTAINER(this->m_toolBar), shape->button);
-	gtk_widget_show_all(this->m_toolBar);
-	redraw(this->m_drawingArea, 0);
-	paintFrame_show();
-	gdk_threads_leave();
+static void paintFrame_configure(GtkWidget *widget, GdkEventConfigure *event, gpointer data) {
+	PAINT_FRAME frame = data;
+	if (frame->pixMap != NULL) {
+		gdk_pixmap_unref(frame->pixMap);
+	}
+
+	frame->pixMap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1);
+	paintFrame_redraw(frame, 0);
 }
 
+static void paintFrame_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
+	PAINT_FRAME frame = data;
+	gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], frame->pixMap,
+			event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height);
+}
+
+static void paintFrame_buttonClicked(GtkWidget *button, gpointer data) {
+	PAINT_FRAME frame = data;
+	frame->m_selected = (char *) gtk_widget_get_name(button);
+}
+
+static gboolean paintFrame_mousePressed( GtkWidget *widget, GdkEventButton *event, gpointer data) {
+	PAINT_FRAME frame = data;
+	if (event->button == 1 && frame->pixMap != NULL) {
+		if (frame->m_selected == NULL){
+			printf("no button selected yet\n");
+		} else {
+			SHAPE_COMPONENT sc = shapeComponent_create(frame, paintFrame_getShape(frame, frame->m_selected), event->x, event->y);
+			linkedList_addFirst(frame->m_shapeComponents, sc);
+			(*sc->shapeComponent_paintComponent)(sc, frame, frame->pixMap, widget);
+		}
+	}
+	return TRUE;
+}
 
-/**
- * Default constructor that populates the main window.
- **/
-PAINT_FRAME paintFrame_create(BUNDLE_CONTEXT context, apr_pool_t *pool) {
-	GError *error = NULL;
-	GThread *l_th;
-	struct gtk_thread_data *data = apr_palloc(pool, sizeof(*data));
-	data->pool = pool;
-	data->context = context;
-	this = malloc(sizeof(*this));
-	/* set the methods */
-	this->paintFrame_addShape = paintFrame_addShape;
-	this->paintFrame_getShape = paintFrame_getShape;
-	this->paintFrame_removeShape = paintFrame_removeShape;
-	this->paintFrame_selectShape = paintFrame_selectShape;
-	this->paintFrame_show = paintFrame_show;
-	this->m_selected = NULL;
-	this->m_pixMap = NULL;
-	g_thread_init(NULL);
-	gdk_threads_init();
-	gtk_init(NULL, NULL);
-	this->m_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	gtk_container_set_border_width (GTK_CONTAINER (this->m_window), 10);
-	gtk_window_set_title (GTK_WINDOW (this->m_window), "OSGi in Action, Paint-Example");
-
-	g_signal_connect (G_OBJECT (this->m_window), "delete_event",
-			G_CALLBACK (delete), NULL);
-
-	g_signal_connect (G_OBJECT (this->m_window), "destroy",
-			G_CALLBACK (destroy), NULL);
-	/* Create the graph navigation panel and add it to the window. */
-	this->m_toolBar = gtk_hbox_new (FALSE, 0);
-	this->m_mainPanel = gtk_vbox_new(FALSE, 0);
-
-	gtk_container_add  (GTK_CONTAINER (this->m_window), this->m_mainPanel);
-
-
-	this->m_drawingArea = gtk_drawing_area_new();
-
-	gtk_signal_connect (GTK_OBJECT (this->m_drawingArea), "expose_event",
-			(GtkSignalFunc) expose_event, NULL);
-	gtk_signal_connect (GTK_OBJECT(this->m_drawingArea),"configure_event",
-			(GtkSignalFunc) configure_event, NULL);
-	gtk_signal_connect (GTK_OBJECT (this->m_drawingArea), "motion_notify_event",
-			(GtkSignalFunc) motion_notify_event, NULL);
-	gtk_signal_connect (GTK_OBJECT (this->m_drawingArea), "button_press_event",
-			(GtkSignalFunc) button_press_event, NULL);
-
-	gtk_widget_set_events (this->m_drawingArea, GDK_EXPOSURE_MASK
-			| GDK_LEAVE_NOTIFY_MASK
-			| GDK_BUTTON_PRESS_MASK
-			| GDK_POINTER_MOTION_MASK
-			| GDK_POINTER_MOTION_HINT_MASK);
-
-	gtk_widget_set_size_request(this->m_drawingArea, 200, 200);
-
-	/*Add the graph navigation panel to the main panel. */
-	gtk_box_pack_start (GTK_BOX(this->m_mainPanel), this->m_toolBar, TRUE, TRUE, 0);
-	/* Add the draw-able area to the main panel. */
-	gtk_box_pack_start (GTK_BOX(this->m_mainPanel), this->m_drawingArea, TRUE, TRUE, 0);
-
-	this->m_shapes = hashMap_create(string_hash, NULL, string_equals, NULL);
-	linkedList_create(data->pool, &this->m_shapeComponents);
-	this->m_defaultShape = defaultShape_create(data->context);
-	paintFrame_show();
-	if( g_thread_supported()) {
-		l_th = g_thread_create(_gtkthread, data, TRUE, &error);
-		if (l_th == NULL){
-			g_printerr ("Failed to create thread: %s\n", error->message);
-			return NULL;
+static celix_status_t paintFrame_redraw(PAINT_FRAME frame, GdkModifierType state) {
+	if (frame->pixMap != NULL && frame->showing) {
+		GdkRectangle update_rect;
+
+		update_rect.x = 0;
+		update_rect.y = 0;
+		update_rect.width = frame->drawingArea->allocation.width;
+		update_rect.height = frame->drawingArea->allocation.height;
+		gdk_draw_rectangle (this->pixMap,
+				frame->drawingArea->style->white_gc,
+				TRUE,
+				update_rect.x, update_rect.y,
+				update_rect.width, update_rect.height);
+		gtk_widget_draw(frame->drawingArea, &update_rect);
+		LINKED_LIST_ITERATOR it = linkedListIterator_create(this->m_shapeComponents, 0);
+		while (linkedListIterator_hasNext(it)) {
+			SHAPE_COMPONENT sc = linkedListIterator_next(it);
+			(*sc->shapeComponent_paintComponent)(sc, this, this->pixMap, frame->drawingArea);
 		}
-	} else {
-		g_printerr("g_thread NOT supported\n");
 	}
-	return this;
+
+	return CELIX_SUCCESS;
 }
 
+static gpointer paintFrame_gtkmain(gpointer a_data) {
+	gdk_threads_enter();
+	gtk_main();
+	gdk_threads_leave();
 
+	return NULL;
+}

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/shape_component.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/shape_component.c?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/shape_component.c (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/paint/private/src/shape_component.c Thu Nov  3 11:01:50 2011
@@ -18,17 +18,18 @@
 #include "linkedlist.h"
 #include "hash_map.h"
 #include "simple_shape.h"
-#include "paint_frame.h"
 #include "shape_component.h"
 
+static const int BOX = 54;
+
 extern void shapeComponent_paintComponent(SHAPE_COMPONENT shapeComponent, PAINT_FRAME frame,
 		GdkPixmap *pixMap, GtkWidget *widget);
 
-SHAPE_COMPONENT shapeComponent_create(PAINT_FRAME frame, char *shapeName,
+SHAPE_COMPONENT shapeComponent_create(PAINT_FRAME frame, SIMPLE_SHAPE sshape,
 		gdouble x, gdouble y) {
 	SHAPE_COMPONENT shape = malloc(sizeof(*shape));
 	shape->m_frame = frame;
-	strcpy(shape->shapeName, shapeName);
+	shape->shapeName = strdup(sshape->name);
 	shape->x = x - BOX /2;
 	shape->y = y - BOX /2;
 	shape->w = BOX;
@@ -40,7 +41,7 @@ SHAPE_COMPONENT shapeComponent_create(PA
 
 void shapeComponent_paintComponent(SHAPE_COMPONENT shapeComponent, PAINT_FRAME frame,
 		GdkPixmap *pixMap, GtkWidget *widget) {
-	SIMPLE_SHAPE shape = frame->paintFrame_getShape(shapeComponent->shapeName);
+	SIMPLE_SHAPE shape = paintFrame_getShape(frame, shapeComponent->shapeName);
 	if (shape == NULL) {
 		g_printerr("cannot find shape %s\n", shapeComponent->shapeName);
 	} else {

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/square/private/src/square_shape.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/square/private/src/square_shape.c?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/square/private/src/square_shape.c (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/square/private/src/square_shape.c Thu Nov  3 11:01:50 2011
@@ -28,6 +28,7 @@ SIMPLE_SHAPE squareShape_create(BUNDLE_C
 	SIMPLE_SHAPE shape = (SIMPLE_SHAPE) malloc(sizeof(*shape));
 	bundleContext_getBundle(context, &bundle);
 	bundleContext_getMemoryPool(context, &pool);
+	shape->name = "Square";
 	shape->icon_path = NULL;
 	celix_status_t status = bundle_getEntry(bundle, SQUARE_FILE, pool, &shape->icon_path);
 	shape->simpleShape_draw = squareShape_draw;

Modified: incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/triangle/private/src/triangle_shape.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/triangle/private/src/triangle_shape.c?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/triangle/private/src/triangle_shape.c (original)
+++ incubator/celix/trunk/examples/osgi-in-action/chapter04-paint-example/triangle/private/src/triangle_shape.c Thu Nov  3 11:01:50 2011
@@ -28,6 +28,7 @@ SIMPLE_SHAPE triangleShape_create(BUNDLE
 	SIMPLE_SHAPE shape = (SIMPLE_SHAPE) malloc(sizeof(*shape));
 	bundleContext_getBundle(context, &bundle);
 	bundleContext_getMemoryPool(context, &pool);
+	shape->name = "Triangle";
 	shape->icon_path = NULL;
 	celix_status_t status = bundle_getEntry(bundle, TRIANGLE_FILE, pool, &shape->icon_path);
 	shape->simpleShape_draw = triangleShape_draw;

Modified: incubator/celix/trunk/framework/private/src/service_reference.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/service_reference.c?rev=1197062&r1=1197061&r2=1197062&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/service_reference.c (original)
+++ incubator/celix/trunk/framework/private/src/service_reference.c Thu Nov  3 11:01:50 2011
@@ -36,18 +36,18 @@ bool serviceReference_isAssignableTo(SER
 		return allow;
 	}
 
-	WIRE providerWire = module_getWire(bundle_getCurrentModule(provider), serviceName);
-	WIRE requesterWire = module_getWire(bundle_getCurrentModule(requester), serviceName);
-
-	if (providerWire == NULL && requesterWire != NULL) {
-		allow = (bundle_getCurrentModule(provider) == wire_getExporter(requesterWire));
-	} else if (providerWire != NULL && requesterWire != NULL) {
-		allow = (wire_getExporter(providerWire) == wire_getExporter(requesterWire));
-	} else if (providerWire != NULL && requesterWire == NULL) {
-		allow = (wire_getExporter(providerWire) == bundle_getCurrentModule(requester));
-	} else {
-		allow = false;
-	}
+//	WIRE providerWire = module_getWire(bundle_getCurrentModule(provider), serviceName);
+//	WIRE requesterWire = module_getWire(bundle_getCurrentModule(requester), serviceName);
+//
+//	if (providerWire == NULL && requesterWire != NULL) {
+//		allow = (bundle_getCurrentModule(provider) == wire_getExporter(requesterWire));
+//	} else if (providerWire != NULL && requesterWire != NULL) {
+//		allow = (wire_getExporter(providerWire) == wire_getExporter(requesterWire));
+//	} else if (providerWire != NULL && requesterWire == NULL) {
+//		allow = (wire_getExporter(providerWire) == bundle_getCurrentModule(requester));
+//	} else {
+//		allow = false;
+//	}
 
 	return allow;
 }