This commit was manufactured by cvs2svn to create branch 'decode'.
[gnokii.git] / xgnokii / xgnokii_lowlevel.c
diff --git a/xgnokii/xgnokii_lowlevel.c b/xgnokii/xgnokii_lowlevel.c
deleted file mode 100644 (file)
index 78a9ba4..0000000
+++ /dev/null
@@ -1,1000 +0,0 @@
-/*
-
-  X G N O K I I
-
-  A Linux/Unix GUI for Nokia mobile phones.
-
-  Released under the terms of the GNU GPL, see file COPYING for more details.
-
-*/
-
-#include <unistd.h>
-#include <pthread.h>
-#include <string.h>
-#include <glib.h>
-#include "gsm-api.h"
-#include "xgnokii_lowlevel.h"
-#include "xgnokii.h"
-#include "xgnokii_common.h"
-
-pthread_t monitor_th;
-PhoneMonitor phoneMonitor;
-pthread_mutex_t memoryMutex;
-pthread_cond_t  memoryCond;
-pthread_mutex_t calendarMutex;
-pthread_cond_t  calendarCond;
-pthread_mutex_t smsMutex;
-pthread_mutex_t sendSMSMutex;
-pthread_cond_t  sendSMSCond;
-pthread_mutex_t callMutex;
-pthread_mutex_t netMonMutex;
-pthread_mutex_t speedDialMutex;
-pthread_cond_t  speedDialCond;
-pthread_mutex_t callerGroupMutex;
-pthread_cond_t  callerGroupCond;
-pthread_mutex_t smsCenterMutex;  
-pthread_cond_t  smsCenterCond;
-pthread_mutex_t alarmMutex;  
-pthread_cond_t  alarmCond;
-pthread_mutex_t getBitmapMutex;
-pthread_cond_t  getBitmapCond;
-pthread_mutex_t setBitmapMutex;
-pthread_cond_t  setBitmapCond;
-pthread_mutex_t getNetworkInfoMutex;
-pthread_cond_t  getNetworkInfoCond;
-static pthread_mutex_t eventsMutex;
-static GSList *ScheduledEvents = NULL;
-
-
-inline void GUI_InsertEvent (PhoneEvent *event)
-{
-  while (phoneMonitor.working) {
-    usleep(1);
-  }
-
-# ifdef XDEBUG
-  g_print ("Inserting Event: %d\n", event->event);
-# endif
-  pthread_mutex_lock (&eventsMutex);
-  ScheduledEvents = g_slist_prepend (ScheduledEvents, event);
-  pthread_mutex_unlock (&eventsMutex);
-}
-
-
-inline static PhoneEvent *RemoveEvent (void)
-{
-  GSList *list;
-  PhoneEvent *event = NULL;
-
-  pthread_mutex_lock (&eventsMutex);
-  list = g_slist_last (ScheduledEvents);
-  if (list)
-  {
-    event = (PhoneEvent *) list->data;
-    ScheduledEvents = g_slist_remove_link (ScheduledEvents, list);
-    g_slist_free_1 (list);
-  }
-  pthread_mutex_unlock (&eventsMutex);
-
-  return (event);
-}
-
-
-static void InitModelInf (void)
-{
-  gchar buf[64];
-  GSM_Error error;
-  register gint i = 0;
-
-  while ((error = GSM->GetModel(buf)) != GE_NONE && i++ < 15)
-    sleep(1);
-
-  if (error == GE_NONE)
-  {
-    g_free (phoneMonitor.phone.model);
-    phoneMonitor.phone.version = g_strdup (buf);
-    phoneMonitor.phone.model = GetModelName (buf);
-    if (phoneMonitor.phone.model == NULL)
-      phoneMonitor.phone.model = g_strdup (_("unknown"));
-  }
-
-  i = 0;
-  while ((error = GSM->GetRevision (buf)) != GE_NONE && i++ < 5)
-    sleep(1);
-
-  if (error == GE_NONE)
-  {
-    g_free (phoneMonitor.phone.revision);
-    phoneMonitor.phone.revision = g_strdup (buf);
-  }
-
-  i = 0;
-  while ((error = GSM->GetIMEI (buf)) != GE_NONE && i++ < 5)
-    sleep(1);
-
-  if (error == GE_NONE)
-  {
-    g_free (phoneMonitor.phone.imei);
-    phoneMonitor.phone.imei = g_strdup (buf);
-  }
-
-
-#ifdef XDEBUG
-  g_print ("Version: %s\n", phoneMonitor.phone.version);
-  g_print ("Model: %s\n", phoneMonitor.phone.model);
-  g_print ("IMEI: %s\n", phoneMonitor.phone.imei);
-  g_print ("Revision: %s\n", phoneMonitor.phone.revision);
-#endif
-}
-
-static GSM_Error fbusinit(bool enable_monitoring)
-{
-  int count=0;
-  static GSM_Error error=GE_NOLINK;
-
-#ifndef WIN32
-  if (strcmp(GetMygnokiiVersion(),VERSION)!=0)
-    fprintf(stderr,_("WARNING: version of installed libmygnokii.so (%s) is different to version of xgnokii (%s)\n"),GetMygnokiiVersion(),VERSION);
-#endif
-
-  /* Initialise the code for the GSM interface. */     
-  if (error == GE_NOLINK)
-    error = GSM_Initialise (xgnokiiConfig.model, xgnokiiConfig.port,
-                            xgnokiiConfig.initlength,
-                           GetConnectionTypeFromString(xgnokiiConfig.connection),
-                           RLP_DisplayF96Frame,
-                           xgnokiiConfig.synchronizetime);
-
-#ifdef XDEBUG
-  g_print ("fbusinit: error %d\n", error);
-#endif
-
-  if (error != GE_NONE) {
-    g_print (_("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
-    /* FIXME: should popup some message... */
-    return (error);
-  }
-
-  while (count++ < 40 && *GSM_LinkOK == false)
-    usleep(50000);
-#ifdef XDEBUG
-  g_print("After usleep. GSM_LinkOK: %d\n", *GSM_LinkOK);
-#endif
-
-  if (*GSM_LinkOK == true)
-    InitModelInf ();
-
-  return *GSM_LinkOK;
-}
-
-
-void GUI_InitPhoneMonitor (void)
-{
-  phoneMonitor.phone.model = g_strdup (_("unknown"));
-  phoneMonitor.phone.version = phoneMonitor.phone.model;
-  phoneMonitor.phone.revision = g_strdup (_("unknown"));
-  phoneMonitor.phone.imei = g_strdup (_("unknown"));
-  phoneMonitor.rfLevel = phoneMonitor.batteryLevel = -1;
-  phoneMonitor.powerSource = GPS_BATTERY;
-  phoneMonitor.working = FALSE;
-  phoneMonitor.alarm = FALSE;
-  phoneMonitor.sms.unRead = phoneMonitor.sms.number = phoneMonitor.sms.number2 = 0;
-  phoneMonitor.sms.messages = NULL;
-  phoneMonitor.call.callInProgress = CS_Idle;
-  *phoneMonitor.call.callNum = '\0';
-  phoneMonitor.netmonitor.number = 0;
-  *phoneMonitor.netmonitor.screen = *phoneMonitor.netmonitor.screen3 = 
-  *phoneMonitor.netmonitor.screen4 = *phoneMonitor.netmonitor.screen5 = '\0';
-  pthread_mutex_init (&memoryMutex, NULL);
-  pthread_cond_init (&memoryCond, NULL);
-  pthread_mutex_init (&calendarMutex, NULL);
-  pthread_cond_init (&calendarCond, NULL);
-  pthread_mutex_init (&smsMutex, NULL);
-  pthread_mutex_init (&sendSMSMutex, NULL);
-  pthread_cond_init (&sendSMSCond, NULL);
-  pthread_mutex_init (&callMutex, NULL);
-  pthread_mutex_init (&eventsMutex, NULL);
-  pthread_mutex_init (&callMutex, NULL);
-  pthread_mutex_init (&netMonMutex, NULL);
-  pthread_mutex_init (&speedDialMutex, NULL);
-  pthread_cond_init (&speedDialCond, NULL);
-  pthread_mutex_init (&callerGroupMutex, NULL);
-  pthread_cond_init (&callerGroupCond, NULL);
-  pthread_mutex_init (&smsCenterMutex, NULL);
-  pthread_cond_init (&smsCenterCond, NULL);
-  pthread_mutex_init (&getBitmapMutex, NULL);
-  pthread_cond_init (&getBitmapCond, NULL);
-  pthread_mutex_init (&setBitmapMutex, NULL);
-  pthread_cond_init (&setBitmapCond, NULL);
-  pthread_mutex_init (&getNetworkInfoMutex, NULL);
-  pthread_cond_init (&getNetworkInfoCond, NULL);
-}
-
-
-static inline void FreeElement (gpointer data, gpointer userData)
-{
-  g_free ((GSM_SMSMessage *) data);
-}
-
-
-static inline void FreeArray (GSList **array)
-{
-  if (*array)
-  {
-    g_slist_foreach (*array, FreeElement, NULL);
-    g_slist_free (*array);
-    *array = NULL;
-  }
-}
-
-
-void RefreshSMS (const gint number)
-{
-  GSM_Error error;
-  GSM_SMSMessage *msg;
-  register gint i;
-
-# ifdef XDEBUG
-  g_print ("RefreshSMS is running...\n");
-# endif
-
-  pthread_mutex_lock (&smsMutex);
-  FreeArray (&(phoneMonitor.sms.messages));
-  phoneMonitor.sms.number = 0;
-  phoneMonitor.sms.number2 = 0;
-  pthread_mutex_unlock (&smsMutex);
-
-  i = 1;
-  while (1)
-  {
-    msg = g_malloc (sizeof (GSM_SMSMessage));
-    msg->MemoryType = GMT_SM;
-    msg->Location = i;
-#ifdef XDEBUG
-    fprintf(stdout, _("test: %d %i %i %i\n"),msg->Location,phoneMonitor.sms.number,phoneMonitor.sms.number2,number);
-#endif
-    pthread_mutex_lock (&smsMutex);
-    if( GetModelFeature(FN_SMS)==F_SMS71 ) msg->Location = 0;  /* read next sms for 6210/7110 */
-    error = GSM->GetSMSMessage (msg);
-    pthread_mutex_unlock (&smsMutex);
-    switch (error) {
-      case GE_NONE:
-        pthread_mutex_lock (&smsMutex);
-#ifdef XDEBUG
-    fprintf(stdout, _("Refresh SMS: g_slist_append: sms message"));
-    fprintf(stdout, _(" Location: %d"),msg->Location);
-    fprintf(stdout, _(" folder: %d"),msg->folder);
-    if ( msg-> SMSData) fprintf(stdout, _(" SMSData true\n"));
-       else  fprintf(stdout, _(" SMSData false\n"));
-#endif
-       /* RTH:  unread sms from folder 0 to INBOX */
-        phoneMonitor.sms.messages = g_slist_append (phoneMonitor.sms.messages, msg);
-        phoneMonitor.sms.number++;
-        phoneMonitor.sms.number2++;
-        pthread_mutex_unlock (&smsMutex);
-        if (phoneMonitor.sms.number2 == number) return;
-       break;
-      case GE_SMSTOOLONG: /* Picture Image in 7110 comp phone */
-        g_free (msg);
-        phoneMonitor.sms.number2++;
-        if (phoneMonitor.sms.number2 == number) return;
-       break;
-      default:
-        g_free (msg);
-       break;
-    }
-    i++;
-  }
-}
-
-
-static gint A_GetMemoryStatus (gpointer data)
-{
-  GSM_Error error;
-  D_MemoryStatus *ms = (D_MemoryStatus *) data;
-
-  error = ms->status = GE_UNKNOWN;
-
-  if (ms)
-  {
-    pthread_mutex_lock (&memoryMutex);
-    error = ms->status = GSM->GetMemoryStatus (&(ms->memoryStatus));
-    pthread_cond_signal (&memoryCond);
-    pthread_mutex_unlock (&memoryMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_GetMemoryLocation (gpointer data)
-{
-  GSM_Error error;
-  D_MemoryLocation *ml = (D_MemoryLocation *) data;
-
-  error = ml->status = GE_UNKNOWN;
-
-  if (ml)
-  {
-    pthread_mutex_lock (&memoryMutex);
-    error = ml->status = GSM->GetMemoryLocation (ml->entry);
-    pthread_cond_signal (&memoryCond);
-    pthread_mutex_unlock (&memoryMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_GetMemoryLocationAll (gpointer data)
-{
-  GSM_PhonebookEntry entry;
-  GSM_Error error;
-  D_MemoryLocationAll *mla = (D_MemoryLocationAll *) data;
-  register gint i;
-  gint readed=0;
-
-  error = mla->status = GE_NONE;
-  entry.MemoryType = mla->type;
-
-  pthread_mutex_lock (&memoryMutex);
-  for (i = mla->min; i <= mla->max; i++)
-  {
-    entry.Location = i;
-    if (readed<mla->used) {
-      error = GSM->GetMemoryLocation (&entry);
-      if (error != GE_NONE)
-      {
-        gint err_count = 0;
-
-        while (error != GE_NONE &&
-              error != GE_INVALIDPHBOOKLOCATION && error != GE_UNKNOWN) //n7110.c
-        {
-          g_print (_("%s: line %d: Can't get memory entry number %d from memory %d! %d\n"),
-                   __FILE__, __LINE__, i, entry.MemoryType, error);
-          if (err_count++ > 3)
-          {
-            mla->ReadFailed (i);
-            mla->status = error;
-            pthread_cond_signal (&memoryCond);
-            pthread_mutex_unlock (&memoryMutex);
-            return (error);
-          }
-
-          error = GSM->GetMemoryLocation (&entry);
-          sleep (2);
-        }
-      }
-      
-      if (strcmp(entry.Number, "\0") || strcmp(entry.Name, "\0"))
-        readed++;
-
-    } else {
-      entry.Number[0]='\0';
-      entry.Name[0]='\0';
-    }
-
-    error = mla->InsertEntry (&entry);
-    if (error != GE_NONE)
-      break;
-  }
-  mla->status = error;
-  pthread_cond_signal (&memoryCond);
-  pthread_mutex_unlock (&memoryMutex);
-  return (error);
-}
-
-
-static gint A_WriteMemoryLocation (gpointer data)
-{
-  GSM_Error error;
-  D_MemoryLocation *ml = (D_MemoryLocation *) data;
-
-  error = ml->status = GE_UNKNOWN;
-
-  if (ml)
-  {
-    pthread_mutex_lock (&memoryMutex);
-    error = ml->status = GSM->WritePhonebookLocation (ml->entry);
-    pthread_cond_signal (&memoryCond);
-    pthread_mutex_unlock (&memoryMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_WriteMemoryLocationAll (gpointer data)
-{
-/*  GSM_PhonebookEntry entry; */
-  GSM_Error error;
-  D_MemoryLocationAll *mla = (D_MemoryLocationAll *) data;
-/*  register gint i;
-*/
-  error = mla->status = GE_NONE;
-/*  entry.MemoryType = mla->type;
-
-  pthread_mutex_lock (&memoryMutex);
-  for (i = mla->min; i <= mla->max; i++)
-  {
-    entry.Location = i;
-    error = GSM->GetMemoryLocation (&entry);
-    if (error != GE_NONE)
-    {
-      gint err_count = 0;
-
-      while (error != GE_NONE)
-      {
-        g_print (_("%s: line %d: Can't get memory entry number %d from memory %d! %d\n"),
-                 __FILE__, __LINE__, i, entry.MemoryType, error);
-        if (err_count++ > 3)
-        {
-          mla->ReadFailed (i);
-          mla->status = error;
-          pthread_cond_signal (&memoryCond);
-          pthread_mutex_unlock (&memoryMutex);
-          return (error);
-        }
-
-        error = GSM->GetMemoryLocation (&entry);
-        sleep (2);
-      }
-    }
-    error = mla->InsertEntry (&entry);
-    if (error != GE_NONE)
-      break;
-  }
-  mla->status = error;
-  pthread_cond_signal (&memoryCond);
-  pthread_mutex_unlock (&memoryMutex); */
-  return (error);
-}
-
-
-static gint A_GetCalendarNote (gpointer data)
-{
-  GSM_Error error;
-  D_CalendarNote *cn = (D_CalendarNote *) data;
-
-  error = cn->status = GE_UNKNOWN;
-
-  if (cn)
-  {
-    pthread_mutex_lock (&calendarMutex);
-    error = cn->status = GSM->GetCalendarNote (cn->entry);
-    pthread_cond_signal (&calendarCond);
-    pthread_mutex_unlock (&calendarMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_GetCalendarNoteAll (gpointer data)
-{
-  GSM_CalendarNote entry;
-  D_CalendarNoteAll *cna = (D_CalendarNoteAll *) data;
-  GSM_Error e;
-  register gint i = 1;
-
-  pthread_mutex_lock (&calendarMutex);
-  while (1)
-  {
-    entry.Location = i++;
-
-    if ((e = GSM->GetCalendarNote (&entry)) != GE_NONE)
-      break;
-
-    if (cna->InsertEntry (&entry) != GE_NONE)
-      break;
-  }
-
-  pthread_mutex_unlock (&calendarMutex);
-  g_free (cna);
-  if (e == GE_INVALIDCALNOTELOCATION)
-    return (GE_NONE);
-  else
-    return (e);
-}
-
-static gint A_WriteCalendarNote (gpointer data)
-{
-  GSM_Error error;
-  D_CalendarNote *cn = (D_CalendarNote *) data;
-
-  error = cn->status = GE_UNKNOWN;
-
-  if (cn)
-  {
-    pthread_mutex_lock (&calendarMutex);
-    error = cn->status = GSM->WriteCalendarNote (cn->entry);
-    pthread_cond_signal (&calendarCond);
-    pthread_mutex_unlock (&calendarMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_DeleteCalendarNote (gpointer data)
-{
-  GSM_CalendarNote *note = (GSM_CalendarNote *) data;
-  GSM_Error error = GE_UNKNOWN;
-
-  if (note)
-  {
-    error = GSM->DeleteCalendarNote (note);
-    g_free (note);
-  }
-
-  return (error);
-}
-
-static gint A_GetCallerGroup (gpointer data)
-{
-  GSM_Bitmap bitmap;
-  GSM_Error error;
-  D_CallerGroup *cg = (D_CallerGroup *) data;
-
-  error = cg->status = GE_UNKNOWN;
-
-  if (cg)
-  {
-    bitmap.type = GSM_CallerLogo;
-    bitmap.number = cg->number;
-
-    pthread_mutex_lock (&callerGroupMutex);
-    error = cg->status = GSM->GetBitmap (&bitmap);
-    strncpy (cg->text, bitmap.text, 256);
-    cg->text[255] = '\0';
-    pthread_cond_signal (&callerGroupCond);
-    pthread_mutex_unlock (&callerGroupMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_SendCallerGroup (gpointer data)
-{
-  GSM_Bitmap bitmap;
-  D_CallerGroup *cg = (D_CallerGroup *) data;
-  GSM_Error error;
-
-  if (!cg)
-    return (GE_UNKNOWN);
-
-  bitmap.type = GSM_CallerLogo;
-  bitmap.number = cg->number;
-  if ((error = GSM->GetBitmap (&bitmap)) != GE_NONE)
-  {
-    g_free (cg);
-    return (error);
-  }
-  strncpy (bitmap.text, cg->text, 256);
-  bitmap.text[255] = '\0';
-  g_free (cg);
-  return (GSM->SetBitmap (&bitmap));
-}
-
-
-static gint A_GetSMSCenter (gpointer data)
-{
-  D_SMSCenter *c = (D_SMSCenter *) data;
-  GSM_Error error;
-
-  error = c->status = GE_UNKNOWN;
-  if (c)
-  {
-    pthread_mutex_lock (&smsCenterMutex);
-    error = c->status = GSM->GetSMSCenter (c->center);
-    pthread_cond_signal (&smsCenterCond);
-    pthread_mutex_unlock (&smsCenterMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_SetSMSCenter (gpointer data)
-{
-  D_SMSCenter *c = (D_SMSCenter *) data;
-  GSM_Error error;
-
-  error = c->status = GE_UNKNOWN;
-  if (c)
-  {
-    //pthread_mutex_lock (&smsCenterMutex);
-    error = c->status = GSM->SetSMSCenter (c->center);
-    g_free (c);
-    //pthread_cond_signal (&smsCenterCond);
-    //pthread_mutex_unlock (&smsCenterMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_SendSMSMessage (gpointer data)
-{
-  D_SMSMessage *d = (D_SMSMessage *) data;
-  GSM_Error error;
-
-  error = d->status = GE_UNKNOWN;
-  if (d)
-  {
-    pthread_mutex_lock (&sendSMSMutex);
-    error = d->status = GSM->SendSMSMessage (d->sms);
-    pthread_cond_signal (&sendSMSCond);
-    pthread_mutex_unlock (&sendSMSMutex);
-  }
-
-  if (d->status == GE_SMSSENDOK)
-    return (GE_NONE);
-  else
-    return (error);
-}
-
-
-static gint A_DeleteSMSMessage (gpointer data)
-{
-  GSM_SMSMessage *sms = (GSM_SMSMessage *) data;
-  GSM_Error error = GE_UNKNOWN;
-
-  if (sms)
-  {
-    error = GSM->DeleteSMSMessage(sms);
-    g_free (sms);
-  }
-
-  return (error);
-}
-
-
-static gint A_GetSpeedDial (gpointer data)
-{
-  D_SpeedDial *d = (D_SpeedDial *) data;
-  GSM_Error error;
-
-  error = d->status = GE_UNKNOWN;
-
-  if (d)
-  {
-    pthread_mutex_lock (&speedDialMutex);
-    error = d->status = GSM->GetSpeedDial (&(d->entry));
-    pthread_cond_signal (&speedDialCond);
-    pthread_mutex_unlock (&speedDialMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_SendSpeedDial (gpointer data)
-{
-  D_SpeedDial *d = (D_SpeedDial *) data;
-  GSM_Error error;
-
-  error = d->status = GE_UNKNOWN;
-
-  if (d)
-  {
-    //pthread_mutex_lock (&speedDialMutex);
-    error = d->status = GSM->SetSpeedDial (&(d->entry));
-    g_free (d);
-    //pthread_cond_signal (&speedDialCond);
-    //pthread_mutex_unlock (&speedDialMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_SendDTMF (gpointer data)
-{
-  gchar *buf = (gchar *) data;
-  GSM_Error error = GE_UNKNOWN;
-
-  if (buf) 
-  {
-    error = GSM->SendDTMF (buf);
-    g_free (buf);
-  }
-
-  return (error);
-}
-
-
-static gint A_NetMonOnOff (gpointer data)
-{
-  gchar screen[50];
-  gint mode = GPOINTER_TO_INT (data);
-  GSM_Error error = GE_UNKNOWN;
-
-  if (mode)
-    error = GSM->NetMonitor (0xf3, screen);
-  else
-    error = GSM->NetMonitor (0xf1, screen);
-
-  return (error);
-}
-
-
-static gint A_NetMonitor (gpointer data)
-{
-  gint number = GPOINTER_TO_INT (data);
-
-  if (data == 0)
-    phoneMonitor.netmonitor.number = 0;
-  else
-    phoneMonitor.netmonitor.number = number;
-    
-  return (0);
-}
-
-
-static gint A_DialVoice (gpointer data)
-{
-  gchar *number = (gchar *) data;
-  GSM_Error error = GE_UNKNOWN;
-
-  if (number)
-  {
-    error = GSM->DialVoice (number);
-    g_free (number);
-  }
-
-  return (error);
-}
-
-
-static gint A_GetAlarm (gpointer data)
-{
-  D_Alarm *a = (D_Alarm *) data;
-  GSM_Error error;
-
-  error = a->status = GE_UNKNOWN;
-
-  if (a)
-  {
-    pthread_mutex_lock (&alarmMutex);
-    error = a->status = GSM->GetAlarm (0, &(a->time));
-    pthread_cond_signal (&alarmCond);
-    pthread_mutex_unlock (&alarmMutex);
-  }
-
-  return (error);
-}
-
-
-static gint A_SetAlarm (gpointer data)
-{
-  D_Alarm *a = (D_Alarm *) data;
-  GSM_Error error;
-
-  error = a->status = GE_UNKNOWN;
-
-  if (a)
-  {
-    error = a->status = GSM->SetAlarm (0, &(a->time));
-    g_free (a);
-  }
-
-  return (error);
-}
-
-
-static gint A_SendKeyStroke (gpointer data)
-{
-  gchar *buf = (gchar *) data;
-
-  if (buf) 
-  {
-    GSM->PressKey(buf[1], buf[0]);
-    g_free (buf);
-  }
-
-  return (0);
-}
-
-static gint A_GetBitmap(gpointer data) {
-  GSM_Error error;
-  D_Bitmap *d = (D_Bitmap *)data;
-
-  pthread_mutex_lock(&getBitmapMutex);
-  error = d->status = GSM->GetBitmap(d->bitmap);
-  pthread_cond_signal(&getBitmapCond);
-  pthread_mutex_unlock(&getBitmapMutex);
-  return error;
-}
-
-static gint A_SetBitmap(gpointer data) {
-  GSM_Error error;
-  D_Bitmap *d = (D_Bitmap *)data;
-  GSM_Bitmap bitmap;
-  
-  pthread_mutex_lock(&setBitmapMutex);
-  if (d->bitmap->type == GSM_CallerLogo) {
-    bitmap.type = d->bitmap->type;
-    bitmap.number = d->bitmap->number;
-    error = d->status = GSM->GetBitmap(&bitmap);
-    if (error == GE_NONE) {
-      strncpy(d->bitmap->text,bitmap.text,sizeof(bitmap.text));
-      d->bitmap->ringtone = bitmap.ringtone;
-      error = d->status = GSM->SetBitmap(d->bitmap);
-    }
-  } else {
-    error = d->status = GSM->SetBitmap(d->bitmap);
-  }
-  pthread_cond_signal(&setBitmapCond);
-  pthread_mutex_unlock(&setBitmapMutex);
-  return error;
-}
-
-static gint A_GetNetworkInfo(gpointer data) {
-  GSM_Error error;
-  D_NetworkInfo *d = (D_NetworkInfo *)data;
-
-  pthread_mutex_lock(&getNetworkInfoMutex);
-  error = d->status = GSM->GetNetworkInfo(d->info);
-  pthread_cond_signal(&getNetworkInfoCond);
-  pthread_mutex_unlock(&getNetworkInfoMutex);
-  return error;
-}
-
-static gint A_Exit (gpointer data)
-{
-  pthread_exit (0);
-  return (0); /* just to be proper */
-}
-
-
-gint (*DoAction[])(gpointer) = {
-  A_GetMemoryStatus,
-  A_GetMemoryLocation,
-  A_GetMemoryLocationAll,
-  A_WriteMemoryLocation,
-  A_WriteMemoryLocationAll,
-  A_GetCalendarNote,
-  A_GetCalendarNoteAll,
-  A_WriteCalendarNote,
-  A_DeleteCalendarNote,
-  A_GetCallerGroup,
-  A_SendCallerGroup,
-  A_GetSMSCenter,
-  A_SetSMSCenter,
-  A_SendSMSMessage,
-  A_DeleteSMSMessage,
-  A_GetSpeedDial,
-  A_SendSpeedDial,
-  A_SendDTMF,
-  A_NetMonOnOff,
-  A_NetMonitor,
-  A_DialVoice,
-  A_GetAlarm,
-  A_SetAlarm,
-  A_SendKeyStroke,
-  A_GetBitmap,
-  A_SetBitmap,
-  A_GetNetworkInfo,
-  A_Exit
-};
-
-void *GUI_Connect (void *a)
-{
-  /* Define required unit types for RF and Battery level meters. */
-  GSM_RFUnits rf_units = GRF_Arbitrary;
-  GSM_BatteryUnits batt_units = GBU_Arbitrary;
-
-  GSM_DateTime Alarm;
-  gchar number[INCALL_NUMBER_LENGTH];
-  PhoneEvent *event=NULL;
-  GSM_Error error;
-  gint status;
-
-
-# ifdef XDEBUG
-  g_print ("Initializing connection...\n");
-# endif
-
-  phoneMonitor.working = _("Connecting...");
-  while (!fbusinit (true))
-    sleep (1);
-
-# ifdef XDEBUG
-  g_print ("Phone connected. Starting monitoring...\n");
-# endif
-
-  while (1)
-  {
-    if (event != NULL) {
-      phoneMonitor.working = _("Working...");
-    } else {
-      phoneMonitor.working = NULL;
-
-      if (GSM->GetRFLevel (&rf_units, &phoneMonitor.rfLevel) != GE_NONE)
-        phoneMonitor.rfLevel = -1;
-
-      if (rf_units == GRF_Arbitrary)
-        phoneMonitor.rfLevel *= 25;
-
-      if (GSM->GetPowerSource (&phoneMonitor.powerSource) == GE_NONE 
-          && phoneMonitor.powerSource == GPS_ACDC)
-        phoneMonitor.batteryLevel = ((gint) phoneMonitor.batteryLevel + 25) % 125;
-      else
-      {
-        if (GSM->GetBatteryLevel (&batt_units, &phoneMonitor.batteryLevel) != GE_NONE)
-          phoneMonitor.batteryLevel = -1;
-        if (batt_units == GBU_Arbitrary)
-          phoneMonitor.batteryLevel *= 25;
-      }
-
-      if (GSM->GetAlarm (0, &Alarm) == GE_NONE && Alarm.IsSet != 0)
-        phoneMonitor.alarm = TRUE;
-      else
-        phoneMonitor.alarm = FALSE;
-
-      if (GSM->GetIncomingCallNr (number) == GE_NONE)
-      {
-#   ifdef XDEBUG
-        g_print ("Call in progress: %s\n", phoneMonitor.call.callNum);
-#   endif
-
-        if (GSM->GetDisplayStatus (&status)==GE_NONE) {
-          if (status & (1<<DS_Call_In_Progress))
-          {
-            pthread_mutex_lock (&callMutex);
-            phoneMonitor.call.callInProgress = CS_InProgress;
-            pthread_mutex_unlock (&callMutex);
-          }
-          else
-          {
-            pthread_mutex_lock (&callMutex);
-            phoneMonitor.call.callInProgress = CS_Waiting;
-            strncpy (phoneMonitor.call.callNum, number, INCALL_NUMBER_LENGTH);
-            pthread_mutex_unlock (&callMutex);
-         }
-        } else {
-          pthread_mutex_lock (&callMutex);
-          phoneMonitor.call.callInProgress = CS_Idle;
-          *phoneMonitor.call.callNum = '\0';
-          pthread_mutex_unlock (&callMutex);
-       }
-      }
-      else
-      {
-        pthread_mutex_lock (&callMutex);
-        phoneMonitor.call.callInProgress = CS_Idle;
-        *phoneMonitor.call.callNum = '\0';
-        pthread_mutex_unlock (&callMutex);
-      }
-
-      pthread_mutex_lock (&netMonMutex);
-      if (phoneMonitor.netmonitor.number)
-      {
-        GSM->NetMonitor (phoneMonitor.netmonitor.number,
-                         phoneMonitor.netmonitor.screen);
-        GSM->NetMonitor (3, phoneMonitor.netmonitor.screen3);
-        GSM->NetMonitor (4, phoneMonitor.netmonitor.screen4);
-        GSM->NetMonitor (5, phoneMonitor.netmonitor.screen5);
-      }
-      else
-      {
-        *phoneMonitor.netmonitor.screen = *phoneMonitor.netmonitor.screen3 = 
-        *phoneMonitor.netmonitor.screen4 = *phoneMonitor.netmonitor.screen5 = '\0';
-      }
-      pthread_mutex_unlock (&netMonMutex);
-    }
-    while ((event = RemoveEvent ()) != NULL)
-    {
-#     ifdef XDEBUG      
-      g_print ("Processing Event: %d\n", event->event);
-#     endif
-      phoneMonitor.working = _("Working...");
-      if (event->event <= Event_Exit)
-        if ((error = DoAction[event->event] (event->data)) != GE_NONE)
-          g_print (_("Event %d failed with return code %d!\n"), event->event, error);
-      g_free (event);
-    }
-  }
-}