r2342 - in trunk/src/target/OM-2007/applications/openmoko-dialer: . data src

njp at sita.openmoko.org njp at sita.openmoko.org
Mon Jun 25 14:04:27 CEST 2007


Author: njp
Date: 2007-06-25 14:04:24 +0200 (Mon, 25 Jun 2007)
New Revision: 2342

Added:
   trunk/src/target/OM-2007/applications/openmoko-dialer/data/org.openmoko.Dialer.service.in
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer-dbus.xml
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer.c
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer.h
Modified:
   trunk/src/target/OM-2007/applications/openmoko-dialer/configure.ac
   trunk/src/target/OM-2007/applications/openmoko-dialer/data/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-main.c
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-main.h
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-incoming.c
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-outgoing.c
   trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-talking.c
Log:
Port the dialer to use Dbus for single instance behaviour; Add a MokoDialer object that wraps most of the dialer-main.c code; Emit signals over the bus, allowing for other applications to respond to dialer events; Export methods over Dbus to allow other applications to control the Dialer

Modified: trunk/src/target/OM-2007/applications/openmoko-dialer/configure.ac
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/configure.ac	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/configure.ac	2007-06-25 12:04:24 UTC (rev 2342)
@@ -11,7 +11,7 @@
 AC_PROG_LIBTOOL
 
 # base deps
-PKG_CHECK_MODULES(DIALER, openmoko-libs >= 0.0.1 alsa libebook-1.2)
+PKG_CHECK_MODULES(DIALER, openmoko-libs >= 0.0.1 alsa libebook-1.2 dbus-glib-1)
 
 old_cflags=$CFLAGS
 CFLAGS=$DIALER_CFLAGS
@@ -27,6 +27,13 @@
 
 CFLAGS="$DIALER_CFLAGS"
 
+dnl ==============================================
+dnl DBUS
+dnl ==============================================
+
+DBUS_GLIB_BIN="`$PKG_CONFIG --variable=exec_prefix dbus-glib-1`/bin"
+AC_SUBST(DBUS_GLIB_BIN)
+
 # output stuff
 AC_OUTPUT([
 Makefile

Modified: trunk/src/target/OM-2007/applications/openmoko-dialer/data/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/data/Makefile.am	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/data/Makefile.am	2007-06-25 12:04:24 UTC (rev 2342)
@@ -47,3 +47,13 @@
 appicondir = $(datadir)/pixmaps
 dist_appicon_DATA = Dialer.png
 
+#
+# Dbus service file
+#
+servicedir = $(datadir)/dbus-1/services
+service_in_files = org.openmoko.Dialer.service.in
+service_DATA = $(service_in_files:.service.in=.service)
+
+# Expand the bindir in the service file
+$(service_DATA) : $(service_in_files) Makefile
+	sed -e "s|\@bindir\@|$(bindir)|g" $< > $@

Added: trunk/src/target/OM-2007/applications/openmoko-dialer/data/org.openmoko.Dialer.service.in
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/data/org.openmoko.Dialer.service.in	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/data/org.openmoko.Dialer.service.in	2007-06-25 12:04:24 UTC (rev 2342)
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=org.openmoko.Dialer
+Exec=@bindir@/openmoko-dialer

Modified: trunk/src/target/OM-2007/applications/openmoko-dialer/src/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/Makefile.am	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/Makefile.am	2007-06-25 12:04:24 UTC (rev 2342)
@@ -5,43 +5,57 @@
 bin_PROGRAMS = openmoko-dialer
 
 openmoko_dialer_SOURCES = \
-dialer-callbacks-connection.c\
-dialer-main.c\
-moko-digit-button.c\
-moko-dialer-panel.c\
-moko-dialer-textview.c\
-moko-dialer-tip.c\
-moko-dialer-autolist.c\
-contacts.c\
-common.c\
-dialer-window-history.c\
-dialer-window-dialer.c\
-dialer-window-outgoing.c\
-dialer-window-incoming.c\
-dialer-window-talking.c\
-dialer-window-pin.c\
-moko-dialer-status.c\
-alsa.c \
-alsa.h \
-common.h \
-contacts.h \
-dialer-callbacks-connection.h \
-dialer-main.h \
-dialer-window-dialer.h \
-dialer-window-history.h \
-dialer-window-incoming.h \
-dialer-window-outgoing.h \
-dialer-window-pin.h \
-dialer-window-talking.h \
-error.h \
-moko-dialer-autolist.h \
-moko-dialer-declares.h \
-moko-dialer-includes.h \
-moko-dialer-panel.h \
-moko-dialer-status.h \
-moko-dialer-textview.h \
-moko-dialer-tip.h \
-moko-digit-button.h
+	dialer-callbacks-connection.c\
+	dialer-main.c\
+	moko-dialer.c\
+	moko-digit-button.c\
+	moko-dialer-panel.c\
+	moko-dialer-textview.c\
+	moko-dialer-tip.c\
+	moko-dialer-autolist.c\
+	contacts.c\
+	common.c\
+	dialer-window-history.c\
+	dialer-window-dialer.c\
+	dialer-window-outgoing.c\
+	dialer-window-incoming.c\
+	dialer-window-talking.c\
+	dialer-window-pin.c\
+	moko-dialer-status.c\
+	alsa.c \
+	alsa.h \
+	common.h \
+	contacts.h \
+	dialer-callbacks-connection.h \
+	dialer-main.h \
+	dialer-window-dialer.h \
+	dialer-window-history.h \
+	dialer-window-incoming.h \
+	dialer-window-outgoing.h \
+	dialer-window-pin.h \
+	dialer-window-talking.h \
+	error.h \
+	moko-dialer.h\
+	moko-dialer-glue.h\
+	moko-dialer-autolist.h \
+	moko-dialer-declares.h \
+	moko-dialer-includes.h \
+	moko-dialer-panel.h \
+	moko-dialer-status.h \
+	moko-dialer-textview.h \
+	moko-dialer-tip.h \
+	moko-digit-button.h
 
 openmoko_dialer_LDADD = @LIBS@
 
+moko-dialer-glue.h: moko-dialer-dbus.xml
+	$(LIBTOOL) --mode=execute $(DBUS_GLIB_BIN)/dbus-binding-tool --prefix=moko_dialer --mode=glib-server --output=$@ $<
+	
+BUILT_SOURCES =                         \
+        moko-dialer-glue.h
+
+EXTRA_DIST =                            \
+        moko-dialer-dbus.xml
+
+
+

Modified: trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-main.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-main.c	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-main.c	2007-06-25 12:04:24 UTC (rev 2342)
@@ -15,30 +15,26 @@
  *
  *  Current Version: $Rev$ ($Date) [$Author: Tony Guan $]
  */
-#include <libmokoui/moko-ui.h>
-#include <libmokogsmd/moko-gsmd-connection.h>
-
 #include <gtk/gtk.h>
 #include <signal.h>
 #include <unistd.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <signal.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-bindings.h>
 
-#include "contacts.h"
 #include "error.h"
 #include "errno.h"
+#include "moko-dialer.h"
 #include "dialer-main.h"
-#include "dialer-window-dialer.h"
-#include "dialer-window-talking.h"
-#include "dialer-window-outgoing.h"
-#include "dialer-window-incoming.h"
-#include "dialer-window-pin.h"
 #include "dialer-window-history.h"
 
-#include "dialer-callbacks-connection.h"
+#define DIALER_NAMESPACE "org.openmoko.Dialer"
+#define DIALER_OBJECT "/org/openmoko/Dialer"
 
-MokoDialerData *p_dialer_data = 0;
+static MokoDialerData *p_dialer_data = 0;
+
 MokoDialerData *
 moko_get_app_data ()
 {
@@ -46,109 +42,45 @@
 }
 
 static void
-handle_sigusr1 (int value)
+_show_dialer (DBusGConnection *conn)
 {
-  MokoDialerData *p_data = moko_get_app_data ();
-  if (!p_data)
-    return;
-  GtkWidget *mainwindow = p_data->window_present;
-  if (mainwindow == 0)
-    mainwindow = p_data->window_dialer;
+  DBusGProxy *proxy = NULL;
+  GError *error = NULL;
 
-  if (mainwindow == NULL)
-  {
-    return;
-  }
-  gtk_widget_show_all (mainwindow);
-  gtk_window_present (GTK_WINDOW (mainwindow));
-  signal (SIGUSR1, handle_sigusr1);
-}
+  proxy = dbus_g_proxy_new_for_name (conn,
+                                      DIALER_NAMESPACE,
+                                      DIALER_OBJECT,
+                                      DIALER_NAMESPACE);
 
-static void
-handle_sigusr2 (int value)
-{
-  /* Show missed calls */
-  MokoDialerData *p_data = moko_get_app_data ();
-  if (!p_data)
+  if (!proxy)
     return;
-  GtkWidget *window = p_data->window_history;
+  
+  dbus_g_proxy_call (proxy, "ShowDialer", &error,
+                     G_TYPE_INVALID, G_TYPE_INVALID);
+  if (error)
+    g_warning (error->message);
 
-  if (!window)
-    return;
-
-  /*
-   * Filter history on missed calls
-   */
-  window_history_filter (p_data, CALLS_MISSED);
-
-  gtk_widget_show_all (window);
-  gtk_window_present (GTK_WINDOW (window));
-  signal (SIGUSR2, handle_sigusr2);
 }
 
-
-
-static pid_t
-testlock (char *fname)
-{
-  int fd;
-  struct flock fl;
-
-  fd = open (fname, O_WRONLY, S_IWUSR);
-  if (fd < 0)
-  {
-    if (errno == ENOENT)
-    {
-      return 0;
-    }
-    else
-    {
-      perror ("Test lock open file");
-      return -1;
-    }
-  }
-
-  fl.l_type = F_WRLCK;
-  fl.l_whence = SEEK_SET;
-  fl.l_start = 0;
-  fl.l_len = 0;
-
-  if (fcntl (fd, F_GETLK, &fl) < 0)
-  {
-    close (fd);
-    return -1;
-  }
-  close (fd);
-
-  if (fl.l_type == F_UNLCK)
-    return 0;
-
-  return fl.l_pid;
-}
-
 static void
-setlock (char *fname)
+_show_missed (DBusGConnection *conn)
 {
-  int fd;
-  struct flock fl;
+  DBusGProxy *proxy = NULL;
+  GError *error = NULL;
 
-  fd = open (fname, O_WRONLY | O_CREAT, S_IWUSR);
-  if (fd < 0)
-  {
-    perror ("Set lock open file");
+  proxy = dbus_g_proxy_new_for_name (conn,
+                                      DIALER_NAMESPACE,
+                                      DIALER_OBJECT,
+                                      DIALER_NAMESPACE);
+
+  if (!proxy)
     return;
-  }
+  
+  dbus_g_proxy_call (proxy, "ShowMissedCalls", &error,
+                     G_TYPE_INVALID, G_TYPE_INVALID);
+  if (error)
+    g_warning (error->message);
 
-  fl.l_type = F_WRLCK;
-  fl.l_whence = SEEK_SET;
-  fl.l_start = 0;
-  fl.l_len = 0;
-
-  if (fcntl (fd, F_SETLK, &fl) < 0)
-  {
-    perror ("Lock file");
-    close (fd);
-  }
 }
 
 static gboolean show_dialer;
@@ -162,13 +94,15 @@
   {NULL}
 };
 
-
 int
 main (int argc, char **argv)
 {
-  pid_t lockapp;
+  MokoDialer *dialer;
+  DBusGConnection *connection;
+  DBusGProxy *proxy;
+  GError *error = NULL;
+  guint32 ret;
 
-
   if (argc != 1)
   {
     /* Add init code. */
@@ -182,80 +116,72 @@
     g_option_context_free (context);
   }
 
-  //FIXME: the following lines to enable unique instance will be changed.
-  lockapp = testlock ("/tmp/dialer.lock");
+  /* Initialize Threading & GTK+ */
+  gtk_init (&argc, &argv);
+  moko_stock_register ();
 
-  if (lockapp > 0)
+  /* Try and setup our DBus service */
+  connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+  if (connection == NULL)
   {
+    g_warning ("Failed to make a connection to the session bus: %s", 
+               error->message);
+    g_error_free (error);
+  }
+  proxy = dbus_g_proxy_new_for_name (connection, 
+                                     DBUS_SERVICE_DBUS,
+                                     DBUS_PATH_DBUS, 
+                                     DBUS_INTERFACE_DBUS);
+  if (!org_freedesktop_DBus_request_name (proxy,
+                                          DIALER_NAMESPACE,
+                                          0, &ret, &error))
+  {
+    /* Error requesting the name */
+    g_warning ("There was an error requesting the name: %s\n",error->message);
+    g_error_free (error);
+    
+    gdk_init(&argc, &argv);
+    gdk_notify_startup_complete ();
+
+    return 1;
+  }
+  if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
+  {
+    /* Someone else hase registere dthe object */
+    g_warning ("Another instance is running\n");
+
     if (show_missed)
-      kill (lockapp, SIGUSR2);
+      _show_missed (connection);
     else
-      kill (lockapp, SIGUSR1);
+      _show_dialer (connection);
+    
+    dbus_g_connection_unref (connection);
+    
 
-    /* make sure startup notifaction is terminated */
     gdk_init(&argc, &argv);
     gdk_notify_startup_complete ();
-
-    return 0;
+    return 1;
   }
-  setlock ("/tmp/dialer.lock");
+  
+  /* Create the MokoDialer object */
+  dialer = moko_dialer_get_default ();
 
-  /* Initialize Threading & GTK+ */
-  gtk_init (&argc, &argv);
-  moko_stock_register ();
+  p_dialer_data = moko_dialer_get_data (dialer);
 
-  p_dialer_data = g_new0 (MokoDialerData, 1);
+  /* Add the object onto the bus */
+  dbus_g_connection_register_g_object (connection, 
+                                       DIALER_OBJECT,
+                                       G_OBJECT (dialer));
 
-  //init application data
-  contact_init_contact_data (&(p_dialer_data->g_contactlist));
-
   /* application object */
   g_set_application_name ("OpenMoko Dialer");
-
-  /* Set up gsmd connection object */
-  MokoGsmdConnection* conn = p_dialer_data->connection = moko_gsmd_connection_new ();
-
-  /* power on GSM */
-  moko_gsmd_connection_set_antenna_power (conn, TRUE);
-  /* handle network registration some seconds after powering GSM */
-  g_timeout_add( 5 * 1000, (GSourceFunc) initial_timeout_cb, p_dialer_data );
-
-  g_signal_connect (G_OBJECT (conn), "network-registration", (GCallback) network_registration_cb, p_dialer_data);
-  g_signal_connect (G_OBJECT (conn), "incoming-call", (GCallback) incoming_call_cb, p_dialer_data);
-  g_signal_connect (G_OBJECT (conn), "pin-requested", (GCallback) incoming_pin_request_cb, p_dialer_data);
-
-  /* Set up journal handling */
-  p_dialer_data->journal = moko_journal_open_default ();
-  moko_journal_load_from_storage (p_dialer_data->journal);
-
-  /* set up signal handling */
-  signal (SIGUSR1, handle_sigusr1);
-  signal (SIGUSR2, handle_sigusr2);
-
-  //init the dialer windows
-  window_dialer_init (p_dialer_data);
-  window_incoming_init (p_dialer_data);
-  window_pin_init (p_dialer_data);
-  window_outgoing_init (p_dialer_data);
-  window_history_init (p_dialer_data);
-
+ 
   if (show_dialer)
-  {
-    handle_sigusr1 (SIGUSR1);
-  }
+    moko_dialer_show_dialer (dialer, NULL);
+  else if (show_missed)
+    moko_dialer_show_missed_calls (dialer, NULL);
 
-  if (show_missed)
-  {
-    handle_sigusr2 (SIGUSR2);
-  }
- 
   gtk_main ();
   
-  //release everything
-  contact_release_contact_list (&(p_dialer_data->g_contactlist));
-
-  /* closes the journal and frees allocated memory */
-  moko_journal_close (p_dialer_data->journal);
-
   return 0;
 }

Modified: trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-main.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-main.h	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-main.h	2007-06-25 12:04:24 UTC (rev 2342)
@@ -22,14 +22,14 @@
 #include "moko-dialer-includes.h"
 #include <libmokogsmd/moko-gsmd-connection.h>
 #include <libmokojournal/moko-journal.h>
+#include <libmokoui/moko-ui.h>
 
 typedef struct _dialer_data
 {
   //the global data area begins here
-
   MokoGsmdConnection *connection;
   MokoJournal *journal;
-
+  
   GtkListStore *history;
 
   char str_sim_pin[MOKO_DIALER_MAX_PIN_LEN + 1];

Modified: trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-incoming.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-incoming.c	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-incoming.c	2007-06-25 12:04:24 UTC (rev 2342)
@@ -22,6 +22,7 @@
 #include <string.h>
 #include "contacts.h"
 #include "dialer-main.h"
+#include "moko-dialer.h"
 #include "moko-dialer-status.h"
 #include "dialer-window-incoming.h"
 #include "dialer-window-talking.h"
@@ -67,6 +68,7 @@
 void
 window_incoming_show (MokoDialerData *data)
 {
+  MokoDialer *dialer = moko_dialer_get_default ();
   MokoJournalEntry *entry = NULL;
   MokoJournalVoiceInfo *info = NULL;
   gulong progress_handler, clip_handler;
@@ -101,9 +103,13 @@
       window_talking_init (data);
     gtk_widget_show_all (data->window_talking);
     moko_journal_voice_info_set_was_missed (info, FALSE);
+    /* Tell dialer we're talking */
+    moko_dialer_talking (dialer);
   }
   else
   {
+    /* Tell dialer we rejected the call */
+    moko_dialer_rejected (dialer);
     moko_gsmd_connection_voice_hangup (data->connection);
     /* mark the call as misssed
      * FIXME: this is not strictly true if the call was rejected

Modified: trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-outgoing.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-outgoing.c	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-outgoing.c	2007-06-25 12:04:24 UTC (rev 2342)
@@ -24,6 +24,7 @@
 
 #include "contacts.h"
 #include "dialer-main.h"
+#include "moko-dialer.h"
 #include "moko-dialer-status.h"
 #include "dialer-window-outgoing.h"
 #include "dialer-window-history.h"
@@ -146,10 +147,14 @@
 void
 window_outgoing_dial (MokoDialerData *data, gchar *number)
 {
+  MokoDialer *dialer = moko_dialer_get_default ();
   MokoJournalEntry *entry = NULL;
   MokoJournalVoiceInfo *info = NULL;
   
   gulong progress_handler;
+
+  /* Let dialer know that we have started dialing */
+  moko_dialer_outgoing_call (dialer, number);
   
   /* create the journal entry for this call and add it to the journal */
   entry = moko_journal_entry_new (VOICE_JOURNAL_ENTRY);
@@ -173,6 +178,9 @@
   
   if (gtk_dialog_run (GTK_DIALOG (data->window_outgoing)) == GTK_RESPONSE_OK)
   {
+    /* Tell dialer we a talking */
+    moko_dialer_talking (dialer);
+    
     g_print ("Outgoing: Preparing talking window\n");
     /* call has connected, so open the talking window */
     //gtk_widget_show (data->window_talking);
@@ -185,6 +193,7 @@
   {
     /* call canceled */
     moko_gsmd_connection_voice_hangup (data->connection);
+    moko_dialer_hung_up (dialer);
   }
 
   gtk_widget_hide (data->window_outgoing);

Modified: trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-talking.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-talking.c	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/dialer-window-talking.c	2007-06-25 12:04:24 UTC (rev 2342)
@@ -32,6 +32,7 @@
 
 #include "contacts.h"
 #include "common.h"
+#include "moko-dialer.h"
 #include "dialer-main.h"
 #include "moko-dialer-status.h"
 #include "dialer-window-talking.h"
@@ -108,6 +109,14 @@
 }
 
 static void
+cb_tool_button_hang_up_clicked (GtkButton *button, MokoDialerData *data)
+{
+  MokoDialer *dialer = moko_dialer_get_default ();
+
+  moko_dialer_hung_up (dialer);
+}
+  
+static void
 on_dtmf_panel_user_input (GtkWidget * widget, gchar parac, gpointer user_data)
 {
   char input[2];
@@ -236,7 +245,9 @@
 on_window_talking_show (GtkWidget * widget, MokoDialerData * appdata)
 {
   DBG_ENTER ();
+  MokoDialer *dialer = moko_dialer_get_default ();
 
+  moko_dialer_talking (dialer);
   appdata->dtmf_in_talking_window = TRUE;
   //hide the talking button in talking mode.
   g_print ("Talking: Show\n");
@@ -425,6 +436,9 @@
     g_signal_connect_swapped (G_OBJECT (button), "clicked",
                       G_CALLBACK (gtk_widget_hide),
                       p_dialer_data->window_talking);
+    g_signal_connect (G_OBJECT (button), "clicked",
+                      G_CALLBACK (cb_tool_button_hang_up_clicked), 
+                      p_dialer_data);
     gtk_widget_show (GTK_WIDGET (tools));
     gtk_widget_show (GTK_WIDGET (wheel));
 

Added: trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer-dbus.xml
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer-dbus.xml	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer-dbus.xml	2007-06-25 12:04:24 UTC (rev 2342)
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<node name="/org/openmoko/Dialer">
+<interface name="org.openmoko.Dialer">
+<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="moko_dialer"/>
+	
+	<method name="ShowDialer">
+	</method>
+	
+	<method name="ShowMissedCalls">
+	</method>
+	
+  <method name="GetStatus">
+    <arg type="i" name="status" direction="out" />
+  </method>
+
+  <method name="Dial">
+    <arg type="s" name="number" direction="in" />
+  </method>
+
+  <method name="HangUp">
+    <arg type="s" name="message" direction="in" />
+  </method>
+
+	<signal name="IncomingCall">
+		<arg type="s" name="number"/>
+	</signal>
+	<signal name="OutgoingCall">
+		<arg type="s" name="number" />
+	</signal>
+
+	<signal name="Talking">
+	</signal>
+
+	<signal name="HungUp">
+	</signal>
+
+	<signal name="Rejected">
+	</signal>
+
+</interface>
+</node>

Added: trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer.c	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer.c	2007-06-25 12:04:24 UTC (rev 2342)
@@ -0,0 +1,432 @@
+/*
+ *  moko-dialer; a GObject wrapper for the dialer.
+ *
+ *  Authored by OpenedHand Ltd <info at openedhand.com>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser Public License as published by
+ *  the Free Software Foundation; version 2 of the license.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Lesser Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+#include <gtk/gtk.h>
+
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#include <libmokogsmd/moko-gsmd-connection.h>
+#include <libmokojournal/moko-journal.h>
+
+#include "contacts.h"
+#include "moko-dialer.h"
+#include "dialer-main.h"
+#include "dialer-window-dialer.h"
+#include "dialer-window-talking.h"
+#include "dialer-window-outgoing.h"
+#include "dialer-window-incoming.h"
+#include "dialer-window-pin.h"
+#include "dialer-window-history.h"
+
+#include "dialer-callbacks-connection.h"
+
+G_DEFINE_TYPE (MokoDialer, moko_dialer, G_TYPE_OBJECT)
+
+#define MOKO_DIALER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE(obj, \
+        MOKO_TYPE_DIALER, MokoDialerPrivate))
+
+#define GSM_REGISTER_TIMEOUT 5000 /* Five seconds after powering up */
+
+struct _MokoDialerPrivate
+{
+  MokoDialerData *data;
+  gint            status;
+
+};
+
+enum
+{
+  INCOMING_CALL,
+  OUTGOING_CALL,
+  TALKING,
+  HUNG_UP,
+  REJECTED,
+  
+  LAST_SIGNAL
+};
+
+static guint dialer_signals[LAST_SIGNAL] = {0, };
+
+MokoDialerData*
+moko_dialer_get_data (MokoDialer *dialer)
+{
+  g_return_val_if_fail (MOKO_IS_DIALER (dialer), NULL);
+  
+  return dialer->priv->data;
+}
+
+/* DBus functions */
+gboolean
+moko_dialer_show_dialer (MokoDialer *dialer, GError *error)
+{
+  MokoDialerPrivate *priv;
+  GtkWidget *window;
+
+  g_return_val_if_fail (MOKO_IS_DIALER (dialer), FALSE);
+  priv = dialer->priv;
+ 
+  window = priv->data->window_present;
+  if (window == 0)
+    window = priv->data->window_dialer;
+
+  if (window == NULL)
+    return FALSE;
+
+  gtk_widget_show_all (window);
+  gtk_window_present (GTK_WINDOW (window));
+
+  return TRUE;
+}
+
+
+gboolean
+moko_dialer_show_missed_calls (MokoDialer *dialer, GError *error)
+{
+  MokoDialerPrivate *priv;
+  GtkWidget *window;
+
+  g_return_val_if_fail (MOKO_IS_DIALER (dialer), FALSE);
+  priv = dialer->priv;
+
+  window = priv->data->window_history;
+
+  if (!window)
+    return FALSE;
+
+  /*
+   * Filter history on missed calls
+   */
+  window_history_filter (priv->data, CALLS_MISSED);
+
+  gtk_widget_show_all (window);
+  gtk_window_present (GTK_WINDOW (window));
+
+  return TRUE;
+}
+
+static gboolean
+moko_dialer_get_status (MokoDialer *dialer, gint *OUT_status, GError *error)
+{
+  MokoDialerPrivate *priv;
+  
+  g_return_val_if_fail (MOKO_IS_DIALER (dialer), FALSE);
+  priv = dialer->priv;
+
+  *OUT_status = priv->status;
+
+  return TRUE;
+}
+
+static gboolean
+moko_dialer_dial (MokoDialer *dialer, gchar *number, GError *error)
+{
+  MokoDialerPrivate *priv;
+
+  g_return_val_if_fail (MOKO_IS_DIALER (dialer), FALSE);
+  g_return_val_if_fail (number != NULL, FALSE);
+  g_return_val_if_fail (moko_dialer_show_dialer (dialer, NULL), FALSE);
+  priv = dialer->priv;
+
+  window_outgoing_dial (priv->data, number);
+
+  return TRUE;
+}
+
+static gboolean
+moko_dialer_hang_up (MokoDialer *dialer, gchar *message, GError *error)
+{
+  g_return_val_if_fail (MOKO_IS_DIALER (dialer), FALSE);
+  
+  /* FIXME: Create a dialog and let the user know that another program is
+   * requesting the connection be dropped, and why ($message).
+   */
+
+}
+
+/* </dbus functions> */
+
+void
+moko_dialer_outgoing_call (MokoDialer *dialer, const gchar *number)
+{
+  g_return_if_fail (MOKO_IS_DIALER (dialer));
+  dialer->priv->status = DIALER_STATUS_DIALING;
+
+  g_signal_emit (G_OBJECT (dialer), dialer_signals[OUTGOING_CALL], 0, number);
+}
+
+
+void
+moko_dialer_talking (MokoDialer *dialer)
+{
+  g_return_if_fail (MOKO_IS_DIALER (dialer));
+  dialer->priv->status = DIALER_STATUS_TALKING;
+
+  g_signal_emit (G_OBJECT (dialer), dialer_signals[TALKING], 0);
+}
+
+void
+moko_dialer_hung_up (MokoDialer *dialer)
+{
+  g_return_if_fail (MOKO_IS_DIALER (dialer));
+  dialer->priv->status = DIALER_STATUS_NORMAL;
+
+  g_signal_emit (G_OBJECT (dialer), dialer_signals[HUNG_UP], 0);
+}
+
+void
+moko_dialer_rejected (MokoDialer *dialer)
+{
+  g_return_if_fail (MOKO_IS_DIALER (dialer));
+  dialer->priv->status = DIALER_STATUS_NORMAL;
+
+  g_signal_emit (G_OBJECT (dialer), dialer_signals[REJECTED], 0);
+}
+
+
+/* Callbacks for MokoGsmdConnection */
+static void
+on_network_registered (MokoGsmdConnection *conn, 
+                       int type, 
+                       int lac, 
+                       int cell,
+                       MokoDialer *dialer)
+{
+  /* Network registered */
+}
+
+static void
+on_incoming_call (MokoGsmdConnection *conn, int type, MokoDialer *dialer)
+{
+  MokoDialerPrivate *priv;
+  
+  g_return_if_fail (MOKO_IS_DIALER (dialer));
+  priv = dialer->priv;
+
+  window_incoming_show (priv->data);
+
+  g_signal_emit (G_OBJECT (dialer), dialer_signals[INCOMING_CALL], 0, NULL);
+}
+
+static void
+on_pin_requested (MokoGsmdConnection *conn, int type, MokoDialer *dialer)
+{
+  MokoDialerPrivate *priv;
+
+  g_return_if_fail (MOKO_IS_DIALER (dialer));
+  priv = dialer->priv;
+
+  g_debug ("Incoming pin request for type %d", type);
+  gtk_widget_show_all (priv->data->window_pin);
+}
+
+
+static void
+on_call_progress_changed (MokoGsmdConnection *conn, 
+                          int type, 
+                          MokoDialer *dialer)
+{
+  MokoDialerPrivate *priv;
+
+  g_return_if_fail (MOKO_IS_DIALER (dialer));
+  priv = dialer->priv;
+
+  switch (type) 
+  {
+    case MOKO_GSMD_PROG_DISCONNECT:
+    case MOKO_GSMD_PROG_RELEASE:
+      moko_dialer_hung_up (dialer);
+      break;
+    case MOKO_GSMD_PROG_REJECT:
+      moko_dialer_rejected (dialer);
+      break;
+    default:
+      break;
+  }
+}
+static gboolean
+register_network_cb (MokoDialer *dialer)
+{
+  MokoDialerPrivate *priv;
+
+  g_return_val_if_fail (MOKO_DIALER (dialer), TRUE);
+  priv = MOKO_DIALER_GET_PRIVATE (dialer);
+
+  g_debug ("Initial timeout");
+
+  /* Check whether PIN window is currently visible - if not, issue register */
+  if (GTK_WIDGET_MAPPED (priv->data->window_pin))
+  {
+    g_debug ("PIN window is visible, delaying call to register");
+    return TRUE;
+  }
+  else
+  {
+    g_debug ("PIN window not visible, calling register");
+    moko_gsmd_connection_network_register (priv->data->connection);
+  }
+  return FALSE;
+}
+
+/* GObject functions */
+static void
+moko_dialer_dispose (GObject *object)
+{
+  MokoDialer *dialer;
+  MokoDialerPrivate *priv;
+
+  dialer = MOKO_DIALER (object);
+  priv = dialer->priv;
+
+  /* Close journal */
+  moko_journal_close (priv->data->journal);
+
+  /* Free contacts list */
+  contact_release_contact_list (&(priv->data->g_contactlist));
+
+  G_OBJECT_CLASS (moko_dialer_parent_class)->dispose (object);
+}
+
+static void
+moko_dialer_finalize (GObject *dialer)
+{
+  G_OBJECT_CLASS (moko_dialer_parent_class)->finalize (dialer);
+}
+
+#include "moko-dialer-glue.h"
+
+static void
+moko_dialer_class_init (MokoDialerClass *klass)
+{
+  GObjectClass *obj_class = G_OBJECT_CLASS (klass);
+
+  obj_class->finalize = moko_dialer_finalize;
+  obj_class->dispose = moko_dialer_dispose;
+
+  /* add class signals */
+  dialer_signals[INCOMING_CALL] =
+    g_signal_new ("incoming_call", 
+                  G_TYPE_FROM_CLASS (obj_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (MokoDialerClass, incoming_call),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__STRING,
+                  G_TYPE_NONE, 
+                  1, G_TYPE_STRING);
+
+  dialer_signals[OUTGOING_CALL] =
+    g_signal_new ("outgoing_call", 
+                  G_TYPE_FROM_CLASS (obj_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (MokoDialerClass, outgoing_call),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__STRING,
+                  G_TYPE_NONE, 
+                  1, G_TYPE_STRING);
+
+   dialer_signals[TALKING] =
+    g_signal_new ("talking", 
+                  G_TYPE_FROM_CLASS (obj_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (MokoDialerClass, talking),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
+   dialer_signals[HUNG_UP] =
+    g_signal_new ("hung_up", 
+                  G_TYPE_FROM_CLASS (obj_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (MokoDialerClass, hung_up),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
+   dialer_signals[REJECTED] =
+    g_signal_new ("rejected", 
+                  G_TYPE_FROM_CLASS (obj_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (MokoDialerClass, rejected),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
+  g_type_class_add_private (obj_class, sizeof (MokoDialerPrivate)); 
+  dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass), 
+                                   &dbus_glib_moko_dialer_object_info);
+}
+
+static void
+moko_dialer_init (MokoDialer *dialer)
+{
+  MokoDialerPrivate *priv;
+  MokoGsmdConnection *conn;
+
+  priv = dialer->priv = MOKO_DIALER_GET_PRIVATE (dialer);
+
+  /* create the dialer_data struct */
+  priv->data = g_new0 (MokoDialerData, 1);
+  priv->status = DIALER_STATUS_NORMAL;
+
+  /* Initialise the contacts list */
+  contact_init_contact_data (&(priv->data->g_contactlist));
+
+  /* Init the gsmd connection, and power it up */
+  conn = priv->data->connection = moko_gsmd_connection_new ();
+  moko_gsmd_connection_set_antenna_power (conn, TRUE);
+
+  /* Handle network registration a few seconds after powering up the antenna*/ 
+  g_timeout_add (GSM_REGISTER_TIMEOUT, 
+                 (GSourceFunc)register_network_cb, 
+                 dialer);
+  
+  /* Connect to the gsmd signals */
+  g_signal_connect (G_OBJECT (conn), "network-registration", 
+                    G_CALLBACK (on_network_registered), (gpointer)dialer);
+  g_signal_connect (G_OBJECT (conn), "incoming-call", 
+                    G_CALLBACK (on_incoming_call), (gpointer)dialer);
+  g_signal_connect (G_OBJECT (conn), "pin-requested", 
+                    G_CALLBACK (on_pin_requested), (gpointer)dialer);
+  g_signal_connect (G_OBJECT (conn), "call-progress", 
+                    G_CALLBACK (on_call_progress_changed), (gpointer)dialer);
+
+  /* Set up the journal */
+  priv->data->journal = moko_journal_open_default ();
+  moko_journal_load_from_storage (priv->data->journal);
+
+  /* Initialise the dialer windows */
+  window_dialer_init (priv->data);
+  window_incoming_init (priv->data);
+  window_pin_init (priv->data);
+  window_outgoing_init (priv->data);
+  window_history_init (priv->data);
+
+}
+
+MokoDialer*
+moko_dialer_get_default (void)
+{
+  static MokoDialer *dialer = NULL;
+  if (dialer)
+    return dialer;
+  
+  dialer = g_object_new (MOKO_TYPE_DIALER, NULL);
+
+  return dialer;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer.h	2007-06-24 21:43:42 UTC (rev 2341)
+++ trunk/src/target/OM-2007/applications/openmoko-dialer/src/moko-dialer.h	2007-06-25 12:04:24 UTC (rev 2342)
@@ -0,0 +1,124 @@
+/*
+ *  moko-dialer; a GObject wrapper for the dialer.
+ *
+ *  Authored by OpenedHand Ltd <info at openedhand.com>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser Public License as published by
+ *  the Free Software Foundation; version 2 of the license.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Lesser Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+#ifndef _HAVE_MOKO_DIALER_H
+#define _HAVE_MOKO_DIALER_H
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "dialer-main.h"
+
+G_BEGIN_DECLS
+
+#define MOKO_TYPE_DIALER (moko_dialer_get_type ())
+
+#define MOKO_DIALER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+        MOKO_TYPE_DIALER, MokoDialer))
+
+#define MOKO_DIALER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \
+        MOKO_TYPE_DIALER, MokoDialerClass))
+
+#define MOKO_IS_DIALER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+        MOKO_TYPE_DIALER))
+
+#define MOKO_IS_DIALER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+        MOKO_TYPE_DIALER))
+
+#define MOKO_DIALER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+        MOKO_TYPE_DIALER, MokoDialerClass))
+
+typedef struct _MokoDialer MokoDialer;
+typedef struct _MokoDialerClass MokoDialerClass;
+typedef struct _MokoDialerPrivate MokoDialerPrivate;
+
+enum MokoDialerStatus
+{
+  DIALER_STATUS_NORMAL=0,
+  DIALER_STATUS_INCOMING,
+  DIALER_STATUS_DIALING,
+  DIALER_STATUS_TALKING
+
+};
+
+struct _MokoDialer
+{
+  GObject         parent;
+
+  /*< private >*/
+  MokoDialerPrivate   *priv;
+};
+
+struct _MokoDialerClass 
+{
+  /*< private >*/
+  GObjectClass    parent_class;
+  
+  /* signals */
+
+    /* Initiating a connection */
+  void (*incoming_call) (MokoDialer *dialer, const gchar *number);
+  void (*outgoing_call) (MokoDialer *dialer, const gchar *number);
+  
+    /* Connected, either user accepted the call, or the outgoing call was
+     * successful
+     */
+  void (*talking)       (MokoDialer *dialer);
+
+    /* Finished a call */
+  void (*hung_up)       (MokoDialer *dialer);
+  void (*rejected)      (MokoDialer *dialer);  
+    
+  /* future padding */
+  void (*_moko_dialer_1) (void);
+  void (*_moko_dialer_2) (void);
+  void (*_moko_dialer_3) (void);
+  void (*_moko_dialer_4) (void);
+}; 
+
+GType moko_dialer_get_type (void) G_GNUC_CONST;
+
+MokoDialer*        
+moko_dialer_get_default (void);
+
+MokoDialerData*
+moko_dialer_get_data (MokoDialer *dialer);
+
+gboolean
+moko_dialer_show_dialer (MokoDialer *dialer, GError *error);
+
+gboolean
+moko_dialer_show_missed_calls (MokoDialer *dialer, GError *error);
+
+void
+moko_dialer_outgoing_call (MokoDialer *dialer, const gchar *number);
+
+void
+moko_dialer_talking (MokoDialer *dialer);
+
+void
+moko_dialer_hung_up (MokoDialer *dialer);
+
+void
+moko_dialer_rejected (MokoDialer *dialer);
+
+
+G_END_DECLS
+
+#endif /* _HAVE_MOKO_DIALER_H */





More information about the commitlog mailing list