X-Git-Url: https://git.jankratochvil.net/?p=gnokii.git;a=blobdiff_plain;f=xgnokii%2Fxgnokii_sms.c;h=d5da1f42a2136c95da467ec506dfe72932542fed;hp=39c2e40b311abaa025893b33c6ea4cb7536501a8;hb=2a2206f128cdd3ef136166e586026c774da5c490;hpb=4ee1266711b695852ec88f06784fd84400cd70bb diff --git a/xgnokii/xgnokii_sms.c b/xgnokii/xgnokii_sms.c index 39c2e40..d5da1f4 100644 --- a/xgnokii/xgnokii_sms.c +++ b/xgnokii/xgnokii_sms.c @@ -3,14 +3,9 @@ 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 . Released under the terms of the GNU GPL, see file COPYING for more details. - Last modification: Sun Apr 30 2000 - Modified by Jan Derfinak - */ #include #include @@ -24,6 +19,8 @@ #include #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" @@ -71,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); } @@ -206,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; GSM_DateTime *dt; - if (data->Type == GST_MT || data->Type == GST_DR) + 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 == GST_DR) - { - 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); - - row[2] = GUI_GetName (data->Sender); - if (row[2] == NULL) - row[2] = data->Sender; - 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; - msgPtrs->class = data->Class; - strcpy (msgPtrs->sender, data->Sender); - msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint)); - *(msgPtrs->msgPtr) = data->MessageNumber; - gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++, - msgPtrs, DestroyMsgPtrs); - g_free (row[0]); - g_free (row[1]); + } else { + row[1] = g_strdup_printf ("unknown"); } - } -} - - -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 == GST_MO) - { - gchar *row[4]; - - if (data->Status) - row[0] = g_strdup (_("sent")); - else - row[0] = g_strdup (_("unsent")); + + row[2] = GUI_GetName (data->Sender); + if (row[2] == NULL || row[2][0]==0) row[2] = data->Sender; - 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; msgPtrs->class = data->Class; strcpy (msgPtrs->sender, data->Sender); - msgPtrs->msgPtr = (gint *) g_malloc (sizeof (gint)); - *(msgPtrs->msgPtr) = data->MessageNumber; - gtk_clist_set_row_data_full (GTK_CLIST (SMS.smsClist), SMS.row_i++, - msgPtrs, DestroyMsgPtrs); + +// 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->msgPtr = (gint *) g_malloc (sizeof (gint)); + *(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 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)); @@ -344,10 +316,7 @@ inline void GUI_RefreshMessageWindow (void) if (!GTK_WIDGET_VISIBLE (GUI_SMSWindow)) return; - if (SMS.currentBox) - RefreshOutbox (); - else - RefreshInbox (); + RefreshFolder(); } @@ -398,6 +367,27 @@ static void ClickEntry (GtkWidget *clist, inline void GUI_ShowSMS (void) { + int i,j; + + GUI_InitSMSFoldersInf(); + + for (i=1;iprev_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;jGetSMSStatus (&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) { @@ -942,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[GSM_MAX_USER_DATA_HEADER_LENGTH]; GSList *r; gchar *text, *number; gchar **addresses; gchar *buf; - gint offset, nr_msg, l; + gint l; gint longSMS; register gint i = 0, j; @@ -979,119 +992,46 @@ static void SendSMS (void) else number = addresses[i]; - sms.MessageCenter = xgnokiiConfig.smsSetting[sendSMS.center]; - sms.MessageCenter.No = 0; - - if (GTK_TOGGLE_BUTTON (sendSMS.report)->active) - sms.Type = GST_DR; - else - sms.Type = GST_MO; - - sms.Class = -1; - sms.Compression = false; - sms.EightBit = false; - sms.Validity = sms.MessageCenter.Validity; + 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; - strncpy (sms.Destination, number, GSM_MAX_DESTINATION_LENGTH + 1); - sms.Destination[GSM_MAX_DESTINATION_LENGTH] = '\0'; + GSM_MakeMultiPartSMS2(&Multisms,text,chars_read,UDHType,GSM_Coding_Default); + + for (j=0;j GSM_MAX_SMS_LENGTH) - { - if (longSMS) - { - sms.UDHType = GSM_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.UDH,udh,offset); - strncpy (sms.MessageText, text + (j * 153), 153); - sms.MessageText[153] = '\0'; - - buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"), - sms.Destination, 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.UDHType = GSM_NoUDH; - 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]; - - 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) Multisms.SMS[j].Class = 0; - buf = g_strdup_printf (_("Sending SMS to %s (%d/%d) ...\n"), - sms.Destination, 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; - } + strncpy (Multisms.SMS[j].Destination, number, GSM_MAX_DESTINATION_LENGTH + 1); + Multisms.SMS[j].Destination[GSM_MAX_DESTINATION_LENGTH] = '\0'; - gtk_widget_hide (infoDialog.dialog); - GUI_Refresh (); - - sleep (1); - } - } - } - else - { - sms.UDHType = GSM_NoUDH; - strncpy (sms.MessageText, text, GSM_MAX_SMS_LENGTH + 1); - sms.MessageText[GSM_MAX_SMS_LENGTH] = '\0'; - - buf = g_strdup_printf (_("Sending SMS to %s ...\n"), sms.Destination); + 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++; } @@ -1152,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", @@ -1287,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)")); + gtk_box_pack_start (GTK_BOX (vbox), sendSMS.class, FALSE, FALSE, 3); + gtk_widget_show (sendSMS.class); + label = gtk_label_new (_("SMS Center:")); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 1); gtk_widget_show (label); @@ -1484,6 +1427,8 @@ static void NewBC (void) static GtkItemFactoryEntry menu_items[] = { { NULL, NULL, NULL, 0, ""}, + { NULL, NULL, ReadFromPhone, 0, NULL}, + { NULL, NULL, NULL, 0, ""}, { NULL, "S", NULL, 0, NULL}, { NULL, "M", SaveToMailbox, 0, NULL}, { NULL, NULL, NULL, 0, ""}, @@ -1506,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")); @@ -1533,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", @@ -1626,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), @@ -1650,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);