http://marcin-wiacek.fkn.pl/english/zips/mygnokii.tar.gz
[gnokii.git] / xgnokii / xgnokii_sms.c
index b310434..d5da1f4 100644 (file)
@@ -1,12 +1,8 @@
 /*
 
-  $Id$
-
   X G N O K I I
 
   A Linux/Unix GUI for Nokia mobile phones.
-  Copyright (C) 1999 Pavel Janík ml., Hugh Blemings
-  & Ján Derfiòák <ja@mail.upjs.sk>.
 
   Released under the terms of the GNU GPL, see file COPYING for more details.
 
@@ -23,6 +19,8 @@
 #include <gdk/gdkkeysyms.h>
 #include "misc.h"
 #include "gsm-api.h"
+#include "gsm-datetime.h"
+#include "gsm-sms.h"
 #include "xgnokii_common.h"
 #include "xgnokii.h"
 #include "xgnokii_lowlevel.h"
@@ -70,23 +68,26 @@ typedef struct {
   GtkWidget *status;
   GtkWidget *report;
   GtkWidget *longSMS;
+  GtkWidget *class;
   GtkWidget *smscOptionMenu;
   GtkTooltips *addrTip;
   gint       center;
   GSList    *addressLine;
 } SendSMSWidget;
 
+int prev_num_of_folders=0;
+
 static GtkWidget *GUI_SMSWindow;
 static SMSWidget SMS = {NULL, NULL, NULL};
-static SendSMSWidget sendSMS = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL};
+static SendSMSWidget sendSMS = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL};
 static ErrorDialog errorDialog = {NULL, NULL};
 static InfoDialog infoDialog = {NULL, NULL};
 static QuestMark questMark;
-
+static GtkWidget *treeFolderItem[MAX_SMS_FOLDERS], *subTree;
 
 static inline void Help1 (GtkWidget *w, gpointer data)
 {
-  gchar *indx = g_strdup_printf ("/help/%s/windows/sms/index.html", xgnokiiConfig.locale);
+  gchar *indx = g_strdup_printf ("/%s/gnokii/xgnokii/sms/index.htm", xgnokiiConfig.locale);
   Help (w, indx);
   g_free (indx);
 }
@@ -205,133 +206,105 @@ static inline void DestroyMsgPtrs (gpointer data)
 }
 
 
-static void InsertInboxElement (gpointer d, gpointer userData)
+static void InsertFolderElement (gpointer d, gpointer userData)
 {
   GSM_SMSMessage *data = (GSM_SMSMessage *) d;
   MessagePointers *msgPtrs;
-  SMS_DateTime *dt;
+  GSM_DateTime *dt;
 
-  if (data->Type == SMS_Deliver || data->Type == SMS_Delivery_Report)
+  if (data->folder == SMS.currentBox)
   {
-/*    if (data->Type == GST_MT && data->UDHType == GSM_ConcatenatedMessages)
+    gchar *row[4];
+
+    if (data->Type == GST_DR)
     {
-      //FIX ME
-
-      msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
-      msgPtrs->count = data->UDH[4];
-      msgPtrs->number = data->UDH[5];
-      msgPtrs->validity = data->Validity;
-      msgPtrs->class = data->Class;
-      strcpy (msgPtrs->sender, data->Sender);
-      msgPtrs->msgPtr = (gint *) g_malloc (msgPtrs->count * sizeof (gint));
-      *(msgPtrs->msgPtr + msgPtrs->number - 1) = data->MessageNumber;
+      row[0] = g_strdup (_("report"));
+      dt = &(data->SMSCTime);
     }
-    else */
+    else
     {
-      gchar *row[4];
-
-      if (data->Type == SMS_Delivery_Report)
-      {
-        row[0] = g_strdup (_("report"));
-        dt = &(data->SMSCTime);
-      }
-      else if (data->Status)
-      {
-        row[0] = g_strdup (_("read"));
         dt = &(data->Time);
-      }
-      else
-      {
-        row[0] = g_strdup (_("unread"));
-        dt = &(data->Time);
-      }
+       switch (data->Status)
+       {
+            case  GSS_SENTREAD:
+               if (data->folder==0) //GST_INBOX
+                       row[0] = g_strdup (_("read"));
+               else
+                       row[0] = g_strdup (_("sent"));
+                break;
+            case  GSS_NOTSENTREAD:
+               if (data->folder==0) //GST_INBOX
+                       row[0] = g_strdup (_("unread"));
+               else
+                       row[0] = g_strdup (_("not sent"));
+                break;
+            case  GSS_UNKNOWN:
+               row[0] = g_strdup (_("not known :-("));
+                break;
+            case  GSS_TEMPLATE:
+               row[0] = g_strdup (_("template"));
+                break;
+            default:
+               row[0] = g_strdup (_("unknown"));
+                break;
+       }
+    }
 
+    if (data->SMSData) {
       if (dt->Timezone)
-        row[1] = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d %c%02d00",
+          row[1] = g_strdup_printf ("%s %02d/%02d/%02d %02d:%02d:%02d %c%02d00",
+                                 DayOfWeek(dt->Year, dt->Month, dt->Day),
                                   dt->Day, dt->Month, dt->Year,
                                   dt->Hour, dt->Minute, dt->Second,
                                   dt->Timezone > 0 ? '+' : '-', abs (dt->Timezone));
       else
-        row[1] = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d",
+          row[1] = g_strdup_printf ("%s %02d/%02d/%02d %02d:%02d:%02d",
+                                 DayOfWeek(dt->Year, dt->Month, dt->Day),
                                   dt->Day, dt->Month, dt->Year,
                                   dt->Hour, dt->Minute, dt->Second);
+    } else {
+      row[1] = g_strdup_printf ("unknown");
+    }
+      
+    row[2] = GUI_GetName (data->Sender);
+    if (row[2] == NULL || row[2][0]==0) row[2] = data->Sender;
 
-      row[2] = GUI_GetName (data->RemoteNumber.number);
-      if (row[2] == NULL)
-        row[2] = data->RemoteNumber.number;
-      row[3] = data->MessageText;
+    row[3] = data->MessageText;
 
-      gtk_clist_append (GTK_CLIST (SMS.smsClist), row);
-      msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
+    msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
+    msgPtrs->validity = data->Validity;
+    msgPtrs->class = data->Class;
+    strcpy (msgPtrs->sender, data->Sender);
+
+//    if (data->UDHType == GSM_ConcatenatedMessages)
+//    {
+//      msgPtrs->count = data->UDH[5];
+//      msgPtrs->number = data->UDH[4];
+//      msgPtrs->msgPtr = (gint *) g_malloc (msgPtrs->count * sizeof (gint));
+//      *(msgPtrs->msgPtr + msgPtrs->number - 1) = data->MessageNumber;
+//    } else {
       msgPtrs->count = msgPtrs->number = 1;
-      msgPtrs->validity = data->Validity.u.Relative;
-      //      msgPtrs->class = data->Class;
-      strcpy (msgPtrs->sender, data->RemoteNumber.number);
       msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint));
-      *(msgPtrs->msgPtr) = (int)data->Number;
+      *(msgPtrs->msgPtr) = data->MessageNumber;
+
+      gtk_clist_append (GTK_CLIST (SMS.smsClist), row);
       gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++,
                                    msgPtrs, DestroyMsgPtrs);
-      g_free (row[0]);
-      g_free (row[1]);
-    }
-  }
-}
-
-
-static inline void RefreshInbox (void)
-{
-  gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
-
-  gtk_clist_clear (GTK_CLIST (SMS.smsClist));
-
-  SMS.row_i = 0;
-  g_slist_foreach (phoneMonitor.sms.messages, InsertInboxElement, (gpointer) NULL);
-
-  gtk_clist_sort (GTK_CLIST (SMS.smsClist));
-  gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
-}
-
-
-static void InsertOutboxElement (gpointer d, gpointer userData)
-{
-  GSM_SMSMessage *data = (GSM_SMSMessage *) d;
-  MessagePointers *msgPtrs;
-
-  if (data->Type == SMS_Submit)
-  {
-    gchar *row[4];
-
-    if (data->Status)
-      row[0] = g_strdup (_("sent"));
-    else
-      row[0] = g_strdup (_("unsent"));
-
-    row[1] = row[2] = g_strdup ("");
-    row[3] = data->MessageText;
+//    }
 
-    gtk_clist_append( GTK_CLIST (SMS.smsClist), row);
-    msgPtrs = (MessagePointers *) g_malloc (sizeof (MessagePointers));
-    msgPtrs->count = msgPtrs->number = 1;
-    msgPtrs->validity = data->Validity.u.Relative;
-    //    msgPtrs->class = data->Class;
-    strcpy (msgPtrs->sender, data->RemoteNumber.number);
-    msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint));
-    *(msgPtrs->msgPtr) = (int)data->Number;
-    gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++,
-                                 msgPtrs, DestroyMsgPtrs);
     g_free (row[0]);
     g_free (row[1]);
   }
 }
 
-
-static inline void RefreshOutbox (void)
+static inline void RefreshFolder (void)
 {
   gtk_clist_freeze (GTK_CLIST (SMS.smsClist));
+
   gtk_clist_clear (GTK_CLIST (SMS.smsClist));
 
   SMS.row_i = 0;
-  g_slist_foreach (phoneMonitor.sms.messages, InsertOutboxElement, (gpointer) NULL);
+  g_slist_foreach (phoneMonitor.sms.messages, InsertFolderElement, (gpointer) NULL);
 
   gtk_clist_sort (GTK_CLIST (SMS.smsClist));
   gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
@@ -343,10 +316,7 @@ inline void GUI_RefreshMessageWindow (void)
   if (!GTK_WIDGET_VISIBLE (GUI_SMSWindow))
     return;
 
-  if (SMS.currentBox)
-    RefreshOutbox ();
-  else
-    RefreshInbox ();
+  RefreshFolder();
 }
 
 
@@ -397,6 +367,27 @@ static void ClickEntry (GtkWidget      *clist,
 
 inline void GUI_ShowSMS (void)
 {
+  int i,j;
+  
+  GUI_InitSMSFoldersInf();
+  
+  for (i=1;i<folders.number+1;i++) {
+    if (i>prev_num_of_folders) {
+      treeFolderItem[i-1] = gtk_tree_item_new_with_label (_(folders.Folder[i-1].Name));
+      gtk_tree_append (GTK_TREE (subTree), treeFolderItem[i-1]);
+      gtk_signal_connect (GTK_OBJECT (treeFolderItem[i-1]), "select",
+                          GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (i-1));
+      gtk_widget_show (treeFolderItem[i-1]);
+    } else {
+      gtk_widget_set_name(treeFolderItem[i-1],_(folders.Folder[i-1].Name));
+    }
+  }
+  
+  for (j=i+1;j<prev_num_of_folders;j++)
+    gtk_widget_hide (treeFolderItem[j-1]);
+      
+  prev_num_of_folders=folders.number;
+  
   gtk_widget_show (GUI_SMSWindow);
   GUI_RefreshMessageWindow ();
 }
@@ -422,15 +413,13 @@ static void OkDeleteSMSDialog (GtkWidget *widget, gpointer data)
     sel = sel->next;
     for (count = 0; count < ((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->count; count++)
     {
-      int number;
       message = (GSM_SMSMessage *) g_malloc (sizeof (GSM_SMSMessage));
-      number = *(((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->msgPtr + count);
-      if (number == -1)
+      message->Location = *(((MessagePointers *) gtk_clist_get_row_data (GTK_CLIST (SMS.smsClist), row))->msgPtr + count);
+      if (message->Location == -1)
       {
         g_free (message);
         continue;
       }
-      message->Number = number;
       message->MemoryType = GMT_SM;
 
       e = (PhoneEvent *) g_malloc (sizeof (PhoneEvent));
@@ -462,6 +451,28 @@ static void OkDeleteSMSDialog (GtkWidget *widget, gpointer data)
   gtk_clist_thaw (GTK_CLIST (SMS.smsClist));
 }
 
+static void ReadFromPhone (void)
+{
+  GSM_SMSStatus SMSStatus;
+
+  SMSStatus.UnRead = 0;
+  SMSStatus.Number = 0;
+  
+  if (GSM->GetSMSStatus (&SMSStatus) == GE_NONE) {
+    if (phoneMonitor.sms.unRead  != SMSStatus.UnRead ||
+        phoneMonitor.sms.number2 != SMSStatus.Number)
+    {
+      phoneMonitor.working = _("Refreshing SMSes...");
+#ifdef XDEBUG
+   printf("Refreshing %d SMSes...\n",SMSStatus.Number);
+#endif
+      RefreshSMS (SMSStatus.Number);
+      phoneMonitor.working = NULL;
+    }
+
+    phoneMonitor.sms.unRead = SMSStatus.UnRead;
+  }
+}
 
 static void DeleteSMS (void)
 {
@@ -917,7 +928,7 @@ static gint SendSMSCore (GSM_SMSMessage *sms)
 
 #ifdef XDEBUG
   g_print ("Address: %s\nText: %s\nDelivery report: %d\nSMS Center: %d\n",
-           sms->RemoteNumber.number,
+           sms->Destination,
            sms->MessageText,
            GTK_TOGGLE_BUTTON (sendSMS.report)->active,
            sendSMS.center);
@@ -929,13 +940,13 @@ static gint SendSMSCore (GSM_SMSMessage *sms)
   if (error != GE_SMSSENDOK)
   {
     gchar *buf = g_strdup_printf (_("SMS send to %s failed\n(error=%d)"),
-                                  sms->RemoteNumber.number, error);
+                                  sms->Destination, error);
     gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
     gtk_widget_show (errorDialog.dialog);
     g_free (buf);
   }
   else
-    g_print ("Message sent to: %s\n", sms->RemoteNumber.number);
+    g_print ("Message sent to: %s\n", sms->Destination);
 
   return (error);
 }
@@ -943,14 +954,15 @@ static gint SendSMSCore (GSM_SMSMessage *sms)
 
 static void SendSMS (void)
 {
-  GSM_SMSMessage sms;
+  GSM_UDH UDHType;
+  GSM_MultiSMSMessage Multisms;
+  int chars_read;
   AddressPar aps;
-  char udh[256];
   GSList *r;
   gchar *text, *number;
   gchar **addresses;
   gchar *buf;
-  gint offset, nr_msg, l;
+  gint l;
   gint longSMS;
   register gint i = 0, j;
 
@@ -980,124 +992,46 @@ static void SendSMS (void)
     else
       number = addresses[i];
 
-    sms.MessageCenter = xgnokiiConfig.smsSetting[sendSMS.center];
-    sms.MessageCenter.No = 0;
+    chars_read=strlen(text);
+    UDHType = GSM_NoUDH;
+    if (l > GSM_MAX_SMS_LENGTH && longSMS) UDHType = GSM_ConcatenatedMessages;
+    if (UDHType == GSM_NoUDH && chars_read>160) chars_read=160;
 
-    if (GTK_TOGGLE_BUTTON (sendSMS.report)->active)
-      sms.Report = true;
-    else
-      sms.Report = false;
-    sms.Type = SMS_Submit;
-
-    sms.DCS.Type = SMS_GeneralDataCoding;
-    sms.DCS.u.General.Compressed = false;
-    sms.DCS.u.General.Alphabet = SMS_DefaultAlphabet;
-    sms.DCS.u.General.Class = 0;
-    sms.MessageCenter.No = 1;
-    sms.Validity.VPF = SMS_RelativeFormat;
-    sms.Validity.u.Relative = sms.MessageCenter.Validity; /* 4320 minutes == 72 hours */
-    sms.UDH_No = 0;
-
-    strncpy (sms.RemoteNumber.number, number, GSM_MAX_DESTINATION_LENGTH + 1);
-    sms.RemoteNumber.number[GSM_MAX_DESTINATION_LENGTH] = '\0';
-
-    if (l > GSM_MAX_SMS_LENGTH)
-    {
-      if (longSMS)
-      {
-        sms.UDH[0].Type = SMS_ConcatenatedMessages;
-        nr_msg = ((l - 1) / 153) + 1;
-        udh[0] = 0x05; // UDH length
-        udh[1] = 0x00; // concatenated messages (IEI)
-        udh[2] = 0x03; // IEI data length
-        udh[3] = 0x01; // reference number
-        udh[4] = nr_msg;       // number of messages
-        udh[5] = 0x00; // message reference number
-        offset = 6;
-
-        for (j = 0; j < nr_msg; j++)
-        {
-          udh[5] = j + 1;
-
-          memcpy(sms.MessageText,udh,offset);
-          strncpy (sms.MessageText+offset, text + (j * 153), 153);
-          sms.MessageText[153] = '\0';
-
-          buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"),
-                                 sms.RemoteNumber.number, j + 1, nr_msg);
-          gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
-          gtk_widget_show_now (infoDialog.dialog);
-          g_free (buf);
-          GUI_Refresh ();
-
-          if (SendSMSCore (&sms) != GE_SMSSENDOK)
-          {
-            gtk_widget_hide (infoDialog.dialog);
-            GUI_Refresh ();
-            break;
-          }
-
-          gtk_widget_hide (infoDialog.dialog);
-          GUI_Refresh ();
-
-          sleep (1);
-        }
-      }
-      else
-      {
-        sms.UDH_Length = 0;
-        nr_msg = ((l - 1) / 153) + 1;
-        if (nr_msg > 99) // We have place only for 99 messages in header.
-          nr_msg = 99;
-        for (j = 0; j < nr_msg; j++)
-        {
-          gchar header[8];
+    GSM_MakeMultiPartSMS2(&Multisms,text,chars_read,UDHType,GSM_Coding_Default);
+    
+    for (j=0;j<Multisms.number;j++) {
+      Multisms.SMS[j].MessageCenter = xgnokiiConfig.smsSetting[sendSMS.center];
+      Multisms.SMS[j].MessageCenter.No = 0;
 
-          g_snprintf (header, 8, "%2d/%-2d: ", j + 1, nr_msg);
-          header[7] = '\0';
+      if (GTK_TOGGLE_BUTTON (sendSMS.report)->active) Multisms.SMS[j].Type = GST_DR;
 
-          strcpy (sms.MessageText, header);
-          strncat (sms.MessageText, text + (j * 153), 153);
-          sms.MessageText[160] = '\0';
+      if (GTK_TOGGLE_BUTTON (sendSMS.class)->active)\r Multisms.SMS[j].Class = 0;\r
 
-          buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"),
-                                 sms.RemoteNumber.number, j + 1, nr_msg);
-          gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
-          gtk_widget_show_now (infoDialog.dialog);
-          g_free (buf);
-          GUI_Refresh ();
+      Multisms.SMS[j].Validity = Multisms.SMS[j].MessageCenter.Validity;
 
-          if (SendSMSCore (&sms) != GE_SMSSENDOK)
-          {
-            gtk_widget_hide (infoDialog.dialog);
-            GUI_Refresh ();
-            break;
-          }
-
-          gtk_widget_hide (infoDialog.dialog);
-          GUI_Refresh ();
-
-          sleep (1);
-        }
-      }
-    }
-    else
-    {
-      sms.UDH_Length = 0;
-      strncpy (sms.MessageText, text, GSM_MAX_SMS_LENGTH + 1);
-      sms.MessageText[GSM_MAX_SMS_LENGTH] = '\0';
+      strncpy (Multisms.SMS[j].Destination, number, GSM_MAX_DESTINATION_LENGTH + 1);
+      Multisms.SMS[j].Destination[GSM_MAX_DESTINATION_LENGTH] = '\0';      
 
-      buf = g_strdup_printf (_("Sending SMS to %s ...\n"), sms.RemoteNumber.number);
+      buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"),
+                                 Multisms.SMS[j].Destination, j + 1, Multisms.number);
       gtk_label_set_text (GTK_LABEL (infoDialog.text), buf);
       gtk_widget_show_now (infoDialog.dialog);
       g_free (buf);
       GUI_Refresh ();
 
-      (void) SendSMSCore (&sms);
+      if (SendSMSCore (&Multisms.SMS[j]) != GE_SMSSENDOK)
+      {
+        gtk_widget_hide (infoDialog.dialog);
+        GUI_Refresh ();
+        break;
+      }
+
       gtk_widget_hide (infoDialog.dialog);
       GUI_Refresh ();
-    }
 
+      sleep (1);
+    }
+    
     i++;
   }
 
@@ -1158,7 +1092,6 @@ static void CreateSMSSendWindow (void)
 
   InitSendMenu ();
   sendSMS.SMSSendWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_wmclass (GTK_WINDOW(sendSMS.SMSSendWindow), "SMSSendWindow", "Xgnokii");
 
   //gtk_widget_set_usize (GTK_WIDGET (sendSMS.SMSSendWindow), 436, 220);
   gtk_signal_connect (GTK_OBJECT (sendSMS.SMSSendWindow), "delete_event",
@@ -1293,6 +1226,10 @@ static void CreateSMSSendWindow (void)
   gtk_box_pack_start (GTK_BOX (vbox), sendSMS.longSMS, FALSE, FALSE, 3);
   gtk_widget_show (sendSMS.longSMS);
 
+  sendSMS.class = gtk_check_button_new_with_label (_("Send as Flash SMS (Class 0)"));\r
+  gtk_box_pack_start (GTK_BOX (vbox), sendSMS.class, FALSE, FALSE, 3);\r
+  gtk_widget_show (sendSMS.class);\r
+
   label = gtk_label_new (_("SMS Center:"));
   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 1);
   gtk_widget_show (label);
@@ -1366,7 +1303,7 @@ static void ForwardSMS (void)
 /*
 static inline gint CompareSMSMessageLocation (gconstpointer a, gconstpointer b)
 {
-  return !(((GSM_SMSMessage *) a)->Number == ((GSM_SMSMessage *) b)->Number);
+  return !(((GSM_SMSMessage *) a)->Location == ((GSM_SMSMessage *) b)->Location);
 }
 */
 
@@ -1398,7 +1335,7 @@ static void ReplySMS (void)
 
   gtk_text_thaw (GTK_TEXT (sendSMS.smsSendText));
 
-  //msg.Number = *(((MessagePointers *) gtk_clist_get_row_data(GTK_CLIST (SMS.smsClist),
+  //msg.Location = *(((MessagePointers *) gtk_clist_get_row_data(GTK_CLIST (SMS.smsClist),
   //               GPOINTER_TO_INT (GTK_CLIST (SMS.smsClist)->selection->data)))->msgPtr);
 
   //r = g_slist_find_custom (SMS.messages, &msg, CompareSMSMessageLocation);
@@ -1490,6 +1427,8 @@ static void NewBC (void)
 
 static GtkItemFactoryEntry menu_items[] = {
   { NULL,              NULL,           NULL,           0, "<Branch>"},
+  { NULL,              NULL,           ReadFromPhone,  0, NULL},
+  { NULL,              NULL,           NULL,           0, "<Separator>"},
   { NULL,              "<control>S",   NULL,           0, NULL},
   { NULL,              "<control>M",   SaveToMailbox,  0, NULL},
   { NULL,              NULL,           NULL,           0, "<Separator>"},
@@ -1512,6 +1451,8 @@ static void InitMainMenu (void)
   register gint i = 0;
   
   menu_items[i++].path = g_strdup (_("/_File"));
+  menu_items[i++].path = g_strdup (_("/File/Read from phone"));
+  menu_items[i++].path = g_strdup (_("/File/Sep0"));
   menu_items[i++].path = g_strdup (_("/File/_Save"));
   menu_items[i++].path = g_strdup (_("/File/Save to mailbo_x"));
   menu_items[i++].path = g_strdup (_("/File/Sep1"));
@@ -1539,16 +1480,14 @@ void GUI_CreateSMSWindow (void)
   GtkWidget *toolbar;
   GtkWidget *scrolledWindow;
   GtkWidget *vpaned, *hpaned;
-  GtkWidget *tree, *treeSMSItem, *treeInboxItem, *treeOutboxItem, *subTree;
+  GtkWidget *tree, *treeSMSItem;
   SortColumn *sColumn;
   GdkColormap *cmap;
   register gint i;
   gchar *titles[4] = { _("Status"), _("Date / Time"), _("Sender"), _("Message")};
 
-
   InitMainMenu ();
   GUI_SMSWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_window_set_wmclass (GTK_WINDOW (GUI_SMSWindow), "SMSWindow", "Xgnokii");
   gtk_window_set_title (GTK_WINDOW (GUI_SMSWindow), _("Short Message Service"));
   //gtk_widget_set_usize (GTK_WIDGET (GUI_SMSWindow), 436, 220);
   gtk_signal_connect (GTK_OBJECT (GUI_SMSWindow), "delete_event",
@@ -1632,18 +1571,6 @@ void GUI_CreateSMSWindow (void)
   gtk_tree_set_view_mode (GTK_TREE (subTree), GTK_TREE_VIEW_ITEM);
   gtk_tree_item_set_subtree (GTK_TREE_ITEM (treeSMSItem), subTree);
 
-  treeInboxItem = gtk_tree_item_new_with_label (_("Inbox"));
-  gtk_tree_append (GTK_TREE (subTree), treeInboxItem);
-  gtk_signal_connect (GTK_OBJECT (treeInboxItem), "select",
-                      GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (0));
-  gtk_widget_show (treeInboxItem);
-
-  treeOutboxItem = gtk_tree_item_new_with_label (_("Outbox"));
-  gtk_tree_append (GTK_TREE (subTree), treeOutboxItem);
-  gtk_signal_connect (GTK_OBJECT (treeOutboxItem), "select",
-                      GTK_SIGNAL_FUNC (SelectTreeItem), GINT_TO_POINTER (1));
-  gtk_widget_show (treeOutboxItem);
-
   scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
   gtk_widget_set_usize (scrolledWindow, 75, 80);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledWindow),
@@ -1656,7 +1583,6 @@ void GUI_CreateSMSWindow (void)
                                          tree);
   gtk_widget_show (scrolledWindow);
 
-
   /* Message viewer */
   SMS.smsText = gtk_text_new (NULL, NULL);
   gtk_text_set_editable (GTK_TEXT (SMS.smsText), FALSE);