+++ /dev/null
-/*
-
- 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);
- }
- }
-}