summaryrefslogtreecommitdiffabout
path: root/gammu/emb/gammu/gammu.c
Side-by-side diff
Diffstat (limited to 'gammu/emb/gammu/gammu.c') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/gammu/gammu.c8356
1 files changed, 8356 insertions, 0 deletions
diff --git a/gammu/emb/gammu/gammu.c b/gammu/emb/gammu/gammu.c
new file mode 100644
index 0000000..1d53fb0
--- a/dev/null
+++ b/gammu/emb/gammu/gammu.c
@@ -0,0 +1,8356 @@
+/* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */
+/* FM stuff by Walek */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <locale.h>
+#include <signal.h>
+#include <ctype.h>
+#include <wchar.h>
+#undef HAVE_MYSQL_MYSQL_H
+#ifdef WIN32
+# include <windows.h>
+# include <process.h>
+# ifdef _MSC_VER
+# include <sys/utime.h>
+# else
+# include <utime.h>
+# endif
+#else
+# include <utime.h>
+#endif
+
+#include "../common/gammu.h"
+#include "gammu.h"
+#include "smsd/smsdcore.h"
+#ifdef DEBUG
+# include "sniff.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT3
+# include "depend/nokia/dct3.h"
+# include "depend/nokia/dct3trac/wmx.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+# include "depend/nokia/dct4.h"
+#endif
+#ifdef GSM_ENABLE_ATGEN
+# include "depend/siemens/dsiemens.h"
+#endif
+
+#ifdef HAVE_PTHREAD
+# include <pthread.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+
+
+//static GSM_StateMachine s;
+//static GSM_Phone_Functions *Phone;
+static INI_Section *cfg = NULL;
+
+//static GSM_Error error = ERR_NONE;
+ static int i;
+
+//static bool gshutdown = false;
+typedef struct {
+ unsigned char Connection[50];
+} OneConnectionInfo;
+
+typedef struct {
+ unsigned char Device[50];
+ OneConnectionInfo Connections[6];
+ //GSM_StateMachine s;
+} OneDeviceInfo;
+
+static int num;
+static OneDeviceInfo SearchDevices[100];
+static bool SearchOutput;
+void interrupt(int sign)
+{
+ signal(sign, SIG_IGN);
+ gshutdown = true;
+}
+
+#ifdef __GNUC__
+__attribute__((format(printf, 1, 2)))
+#endif
+int printmsg(char *format, ...)
+{
+ va_list argp;
+ int result;
+
+ va_start(argp, format);
+ result = vfprintf(stdout,GetMsg(s.msg,format),argp);
+ va_end(argp);
+ return result;
+}
+
+#ifdef __GNUC__
+__attribute__((format(printf, 1, 2)))
+#endif
+int printmsgerr(char *format, ...)
+{
+ va_list argp;
+ int result;
+
+ va_start(argp, format);
+ result = vfprintf(stderr,GetMsg(s.msg,format), argp);
+ va_end(argp);
+ return result;
+}
+
+static void PrintSecurityStatus()
+{
+ GSM_SecurityCodeType Status;
+
+ error=Phone->GetSecurityStatus(&s,&Status);
+ Print_Error(error);
+ switch(Status) {
+ case SEC_SecurityCode:
+ printmsg("Waiting for Security Code.\n");
+ break;
+ case SEC_Pin:
+ printmsg("Waiting for PIN.\n");
+ break;
+ case SEC_Pin2:
+ printmsg("Waiting for PIN2.\n");
+ break;
+ case SEC_Puk:
+ printmsg("Waiting for PUK.\n");
+ break;
+ case SEC_Puk2:
+ printmsg("Waiting for PUK2.\n");
+ break;
+ case SEC_None:
+ printmsg("Nothing to enter.\n");
+ break;
+ default:
+ printmsg("Unknown\n");
+ }
+}
+
+void Print_Error(GSM_Error error)
+{
+ if (error != ERR_NONE) {
+ printf("%s\n",print_error(error,s.di.df,s.msg));
+ if (error == ERR_SECURITYERROR) {
+ printmsg("Security status: ");
+ PrintSecurityStatus();
+ }
+ if (s.opened) GSM_TerminateConnection(&s);
+ exit (-1);
+ }
+}
+
+void GSM_Init(bool checkerror)
+{
+ error=GSM_InitConnection(&s,3);
+ if (checkerror) Print_Error(error);
+
+ Phone=s.Phone.Functions;
+}
+
+void GSM_Terminate(void)
+{
+ error=GSM_TerminateConnection(&s);
+ Print_Error(error);
+}
+
+static void GetStartStop(int *start, int *stop, int num, int argc, char *argv[])
+{
+ *start=atoi(argv[num]);
+ if (*start==0) {
+ printmsg("ERROR: enumerate locations from 1\n");
+ exit (-1);
+ }
+
+ if (stop!=NULL) {
+ *stop=*start;
+ if (argc>=num+2) *stop=atoi(argv[num+1]);
+ if (*stop==0) {
+ printmsg("ERROR: enumerate locations from 1\n");
+ exit (-1);
+ }
+ }
+}
+
+bool always_answer_yes = false;
+bool always_answer_no = false;
+
+static bool answer_yes(char *text)
+{
+ int len;
+ char ans[99];
+
+ while (1) {
+ printmsgerr("%s (yes/no/ALL/ONLY/NONE) ? ",text);
+ if (always_answer_yes) {
+ printmsgerr("YES (always)\n");
+ return true;
+ }
+ if (always_answer_no) {
+ printmsgerr("NO (always)\n");
+ return false;
+ }
+ len=GetLine(stdin, ans, 99);
+ if (len==-1) exit(-1);
+ if (!strcmp(ans, "NONE")) {
+ always_answer_no = true;
+ return false;
+ }
+ if (!strcmp(ans, "ONLY")) {
+ always_answer_no = true;
+ return true;
+ }
+ if (!strcmp(ans, "ALL")) {
+ always_answer_yes = true;
+ return true;
+ }
+ if (mystrncasecmp(ans, "yes",0)) return true;
+ if (mystrncasecmp(ans, "no" ,0)) return false;
+ }
+}
+
+#ifdef GSM_ENABLE_BEEP
+void GSM_PhoneBeep(void)
+{
+ error = PHONE_Beep(&s);
+ if (error != ERR_NOTSUPPORTED && error != ERR_NOTIMPLEMENTED) Print_Error(error);
+}
+#endif
+
+static GSM_Error GSM_PlayRingtone(GSM_Ringtone ringtone)
+{
+ int i;
+ bool first=true;
+ GSM_Error error;
+
+ signal(SIGINT, interrupt);
+ printmsg("Press Ctrl+C to break...\n");
+
+ for (i=0;i<ringtone.NoteTone.NrCommands;i++) {
+ if (gshutdown) break;
+ if (ringtone.NoteTone.Commands[i].Type != RING_NOTETONE) continue;
+ error=PHONE_RTTLPlayOneNote(&s,ringtone.NoteTone.Commands[i].Note,first);
+ if (error!=ERR_NONE) return error;
+ first = false;
+ }
+
+ /* Disables buzzer */
+ return s.Phone.Functions->PlayTone(&s,255*255,0,false);
+}
+static void PlayRingtone(int argc, char *argv[])
+{
+ GSM_Ringtone ringtone,ringtone2;
+
+ ringtone.Format = 0;
+ error=GSM_ReadRingtoneFile(argv[2],&ringtone);
+ Print_Error(error);
+
+ error=GSM_RingtoneConvert(&ringtone2,&ringtone,RING_NOTETONE);
+ Print_Error(error);
+
+ GSM_Init(true);
+
+ error=GSM_PlayRingtone(ringtone2);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void Identify(int argc, char *argv[])
+{
+ unsigned char buffer[100];
+
+ GSM_Init(true);
+
+ error=Phone->GetManufacturer(&s);
+ Print_Error(error);
+ printmsg("Manufacturer : %s\n", s.Phone.Data.Manufacturer);
+ error=Phone->GetModel(&s);
+ Print_Error(error);
+ printmsg("Model : %s (%s)\n",
+ s.Phone.Data.ModelInfo->model,
+ s.Phone.Data.Model);
+
+ error=Phone->GetFirmware(&s);
+ Print_Error(error);
+ printmsg("Firmware : %s",s.Phone.Data.Version);
+ error=Phone->GetPPM(&s, buffer);
+ if (error != ERR_NOTSUPPORTED) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printmsg(" %s",buffer);
+ }
+ if (s.Phone.Data.VerDate[0]!=0) printmsg(" (%s)",s.Phone.Data.VerDate);
+ printf("\n");
+
+ error=Phone->GetHardware(&s, buffer);
+ if (error != ERR_NOTSUPPORTED) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printmsg("Hardware : %s\n",buffer);
+ }
+
+ error=Phone->GetIMEI(&s);
+ if (error != ERR_NOTSUPPORTED) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printmsg("IMEI : %s\n",s.Phone.Data.IMEI);
+
+ error=Phone->GetOriginalIMEI(&s, buffer);
+ if (error != ERR_NOTSUPPORTED && error != ERR_SECURITYERROR) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printmsg("Original IMEI : %s\n",buffer);
+ }
+ }
+
+ error=Phone->GetManufactureMonth(&s, buffer);
+ if (error != ERR_NOTSUPPORTED && error != ERR_SECURITYERROR) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printmsg("Manufactured : %s\n",buffer);
+ }
+
+ error=Phone->GetProductCode(&s, buffer);
+ if (error != ERR_NOTSUPPORTED) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printmsg("Product code : %s\n",buffer);
+ }
+
+ error=Phone->GetSIMIMSI(&s, buffer);
+ switch (error) {
+ case ERR_SECURITYERROR:
+ case ERR_NOTSUPPORTED:
+ case ERR_NOTIMPLEMENTED:
+ break;
+ case ERR_NONE:
+ printmsg("SIM IMSI : %s\n",buffer);
+ break;
+ default:
+ Print_Error(error);
+ }
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3Info(argc, argv);
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ DCT4Info(argc, argv);
+#endif
+
+ GSM_Terminate();
+}
+
+//#if 0
+static void GetDateTime(int argc, char *argv[])
+{
+ GSM_DateTime date_time;
+ GSM_Locale locale;
+
+ GSM_Init(true);
+
+ error=Phone->GetDateTime(&s, &date_time);
+ switch (error) {
+ case ERR_EMPTY:
+ printmsg("Date and time not set in phone\n");
+ break;
+ case ERR_NONE:
+ printmsg("Phone time is %s\n",OSDateTime(date_time,false));
+ break;
+ default:
+ Print_Error(error);
+ }
+
+ error=Phone->GetLocale(&s, &locale);
+ switch (error) {
+ case ERR_NOTSUPPORTED:
+ case ERR_NOTIMPLEMENTED:
+ break;
+ default:
+ Print_Error(error);
+ printmsg("Time format is ");
+ if (locale.AMPMTime) printmsg("12 hours\n"); else printmsg("24 hours\n");
+ printmsg("Date format is ");
+ switch (locale.DateFormat) {
+ case GSM_Date_DDMMYYYY:printmsg("DD MM YYYY");break;
+ case GSM_Date_MMDDYYYY:printmsg("MM DD YYYY");break;
+ case GSM_Date_YYYYMMDD:printmsg("YYYY MM DD");
+ }
+ printmsg(", date separator is %c\n",locale.DateSeparator);
+ }
+
+ GSM_Terminate();
+}
+
+static void SetDateTime(int argc, char *argv[])
+{
+ GSM_DateTime date_time;
+
+ GSM_GetCurrentDateTime(&date_time);
+
+ GSM_Init(true);
+
+ error=Phone->SetDateTime(&s, &date_time);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void GetAlarm(int argc, char *argv[])
+{
+ GSM_Alarm alarm;
+
+ GSM_Init(true);
+
+ alarm.Location = 1;
+ error=Phone->GetAlarm(&s, &alarm);
+ switch (error) {
+ case ERR_EMPTY:
+ printmsg("Alarm not set in phone\n");
+ break;
+ case ERR_NONE:
+ if (alarm.Repeating) {
+ printmsg("Date: %s\n","Every day");
+ } else {
+ printmsg("Date: %s\n",OSDate(alarm.DateTime));
+ }
+ printmsg("Time: %02d:%02d\n",alarm.DateTime.Hour, alarm.DateTime.Minute);
+ if (alarm.Text[0] != 0 || alarm.Text[1] != 0) {
+ printmsg("Text: \"%s\"\n", DecodeUnicodeConsole(alarm.Text));
+ }
+ break;
+ default:
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+static void SetAlarm(int argc, char *argv[])
+{
+ GSM_Alarm alarm;
+
+ alarm.DateTime.Hour = atoi(argv[2]);
+ alarm.DateTime.Minute = atoi(argv[3]);
+ alarm.DateTime.Second = 0;
+ alarm.Location = 1;
+ alarm.Repeating = true;
+ alarm.Text[0] = 0;
+ alarm.Text[1] = 0;
+
+ GSM_Init(true);
+
+ error=Phone->SetAlarm(&s, &alarm);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+GSM_Bitmap caller[5];
+GSM_AllRingtonesInfo Info;
+bool callerinit[5] = {false, false, false, false, false};
+bool ringinit = false;
+
+static void PrintMemoryEntry(GSM_MemoryEntry *entry)
+{
+ GSM_Category Category;
+ bool unknown;
+ int z;
+
+ for (i=0;i<entry->EntriesNum;i++) {
+ unknown = false;
+ switch (entry->Entries[i].EntryType) {
+ case PBK_Date:
+ printmsg("Date and time : %s\n",OSDateTime(entry->Entries[i].Date,false));
+ continue;
+ case PBK_Category:
+ Category.Location = entry->Entries[i].Number;
+ Category.Type = Category_Phonebook;
+ error=Phone->GetCategory(&s, &Category);
+ if (error == ERR_NONE) {
+ printmsg("Category : \"%s\" (%i)\n", DecodeUnicodeConsole(Category.Name), entry->Entries[i].Number);
+ } else {
+ printmsg("Category : %i\n", entry->Entries[i].Number);
+ }
+ continue;
+ case PBK_Private:
+ printmsg("Private : %s\n", entry->Entries[i].Number == 1 ? "Yes" : "No");
+ continue;
+ case PBK_Number_General : printmsg("General number "); break;
+ case PBK_Number_Mobile : printmsg("Mobile number "); break;
+ case PBK_Number_Work : printmsg("Work number "); break;
+ case PBK_Number_Fax : printmsg("Fax number "); break;
+ case PBK_Number_Home : printmsg("Home number "); break;
+ case PBK_Number_Pager : printmsg("Pager number "); break;
+ case PBK_Number_Other : printmsg("Other number "); break;
+ case PBK_Text_Note : printmsg("Text "); break;
+ case PBK_Text_Postal : printmsg("Snail address "); break;
+ case PBK_Text_Email : printmsg("Email address 1 "); break;
+ case PBK_Text_Email2 : printmsg("Email address 2 "); break;
+ case PBK_Text_URL : printmsg("URL address "); break;
+ case PBK_Text_Name : printmsg("Name "); break;
+ case PBK_Text_LastName : printmsg("Last name "); break;
+ case PBK_Text_FirstName : printmsg("First name "); break;
+ case PBK_Text_Company : printmsg("Company "); break;
+ case PBK_Text_JobTitle : printmsg("Job title "); break;
+ case PBK_Text_StreetAddress : printmsg("Street address "); break;
+ case PBK_Text_City : printmsg("City "); break;
+ case PBK_Text_State : printmsg("State "); break;
+ case PBK_Text_Zip : printmsg("Zip code "); break;
+ case PBK_Text_Country : printmsg("Country "); break;
+ case PBK_Text_Custom1 : printmsg("Custom text 1 "); break;
+ case PBK_Text_Custom2 : printmsg("Custom text 2 "); break;
+ case PBK_Text_Custom3 : printmsg("Custom text 3 "); break;
+ case PBK_Text_Custom4 : printmsg("Custom text 4 "); break;
+ case PBK_Caller_Group :
+ unknown = true;
+ if (!callerinit[entry->Entries[i].Number]) {
+ caller[entry->Entries[i].Number].Type = GSM_CallerGroupLogo;
+ caller[entry->Entries[i].Number].Location = entry->Entries[i].Number;
+ error=Phone->GetBitmap(&s,&caller[entry->Entries[i].Number]);
+ Print_Error(error);
+ if (caller[entry->Entries[i].Number].DefaultName) {
+ NOKIA_GetDefaultCallerGroupName(&s,&caller[entry->Entries[i].Number]);
+ }
+ callerinit[entry->Entries[i].Number]=true;
+ }
+ printmsg("Caller group : \"%s\"\n",DecodeUnicodeConsole(caller[entry->Entries[i].Number].Text));
+ break;
+ case PBK_RingtoneID :
+ unknown = true;
+ if (!ringinit) {
+ error=Phone->GetRingtonesInfo(&s,&Info);
+ if (error != ERR_NOTSUPPORTED) Print_Error(error);
+ if (error == ERR_NONE) ringinit = true;
+ }
+ if (ringinit) {
+ for (z=0;z<Info.Number;z++) {
+ if (Info.Ringtone[z].ID == entry->Entries[i].Number) {
+ printmsg("Ringtone : \"%s\"\n",DecodeUnicodeConsole(Info.Ringtone[z].Name));
+ break;
+ }
+ }
+ } else {
+ printmsg("Ringtone ID : %i\n",entry->Entries[i].Number);
+ }
+ break;
+ case PBK_PictureID :
+ unknown = true;
+ printmsg("Picture ID : 0x%x\n",entry->Entries[i].Number);
+ break;
+ default :
+ printmsg("UNKNOWN\n");
+ unknown = true;
+ break;
+ }
+ if (!unknown) printmsg(" : \"%s\"\n", DecodeUnicodeConsole(entry->Entries[i].Text));
+ }
+ printf("\n");
+}
+
+static void GetAllMemory(int argc, char *argv[])
+{
+ GSM_MemoryEntry Entry;
+ bool start = true;
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ Entry.MemoryType = 0;
+
+ if (mystrncasecmp(argv[2],"DC",0)) Entry.MemoryType=MEM_DC;
+ if (mystrncasecmp(argv[2],"ON",0)) Entry.MemoryType=MEM_ON;
+ if (mystrncasecmp(argv[2],"RC",0)) Entry.MemoryType=MEM_RC;
+ if (mystrncasecmp(argv[2],"MC",0)) Entry.MemoryType=MEM_MC;
+ if (mystrncasecmp(argv[2],"ME",0)) Entry.MemoryType=MEM_ME;
+ if (mystrncasecmp(argv[2],"SM",0)) Entry.MemoryType=MEM_SM;
+ if (mystrncasecmp(argv[2],"VM",0)) Entry.MemoryType=MEM_VM;
+ if (mystrncasecmp(argv[2],"FD",0)) Entry.MemoryType=MEM_FD;
+ if (Entry.MemoryType==0) {
+ printmsg("ERROR: unknown memory type (\"%s\")\n",argv[2]);
+ exit (-1);
+ }
+
+ GSM_Init(true);
+
+ while (!gshutdown) {
+ error = Phone->GetNextMemory(&s, &Entry, start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ printmsg("Memory %s, Location %i\n",argv[2],Entry.Location);
+ PrintMemoryEntry(&Entry);
+ start = false;
+ }
+
+ GSM_Terminate();
+}
+
+static void GetMemory(int argc, char *argv[])
+{
+ int j, start, stop;
+ GSM_MemoryEntry entry;
+
+ entry.MemoryType=0;
+
+ if (mystrncasecmp(argv[2],"DC",0)) entry.MemoryType=MEM_DC;
+ if (mystrncasecmp(argv[2],"ON",0)) entry.MemoryType=MEM_ON;
+ if (mystrncasecmp(argv[2],"RC",0)) entry.MemoryType=MEM_RC;
+ if (mystrncasecmp(argv[2],"MC",0)) entry.MemoryType=MEM_MC;
+ if (mystrncasecmp(argv[2],"ME",0)) entry.MemoryType=MEM_ME;
+ if (mystrncasecmp(argv[2],"SM",0)) entry.MemoryType=MEM_SM;
+ if (mystrncasecmp(argv[2],"VM",0)) entry.MemoryType=MEM_VM;
+ if (mystrncasecmp(argv[2],"FD",0)) entry.MemoryType=MEM_FD;
+ if (entry.MemoryType==0) {
+ printmsg("ERROR: unknown memory type (\"%s\")\n",argv[2]);
+ exit (-1);
+ }
+
+ GetStartStop(&start, &stop, 3, argc, argv);
+
+ GSM_Init(true);
+
+ if (!strcmp(s.Phone.Data.ModelInfo->model,"3310")) {
+ if (s.Phone.Data.VerNum<=4.06) printmsg("WARNING: you will have null names in entries. Upgrade firmware in phone to higher than 4.06\n");
+ }
+
+ for (j=start;j<=stop;j++) {
+ printmsg("Memory %s, Location %i\n",argv[2],j);
+
+ entry.Location=j;
+
+ error=Phone->GetMemory(&s, &entry);
+ if (error != ERR_EMPTY) Print_Error(error);
+
+ if (error == ERR_EMPTY) {
+ printmsg("Entry is empty\n");
+ printf("\n");
+ } else {
+ PrintMemoryEntry(&entry);
+ }
+ }
+
+ GSM_Terminate();
+}
+
+#define MemoryLocationToString(x) ( \
+ x == MEM_ON ? "ON" : \
+ x == MEM_RC ? "RC" : \
+ x == MEM_MC ? "MC" : \
+ x == MEM_ME ? "ME" : \
+ x == MEM_SM ? "SM" : \
+ x == MEM_VM ? "VM" : \
+ x == MEM_FD ? "FD" : "XX")
+
+static void SearchOneEntry(GSM_MemoryEntry *Entry, unsigned char *Text)
+{
+ int i;
+
+ for (i=0;i<Entry->EntriesNum;i++) {
+ switch (Entry->Entries[i].EntryType) {
+ case PBK_Number_General :
+ case PBK_Number_Mobile :
+ case PBK_Number_Work :
+ case PBK_Number_Fax :
+ case PBK_Number_Home :
+ case PBK_Number_Pager :
+ case PBK_Number_Other :
+ case PBK_Text_Note :
+ case PBK_Text_Postal :
+ case PBK_Text_Email :
+ case PBK_Text_Email2 :
+ case PBK_Text_URL :
+ case PBK_Text_Name :
+ case PBK_Text_LastName :
+ case PBK_Text_FirstName :
+ case PBK_Text_Company :
+ case PBK_Text_JobTitle :
+ case PBK_Text_StreetAddress :
+ case PBK_Text_City :
+ case PBK_Text_State :
+ case PBK_Text_Zip :
+ case PBK_Text_Country :
+ case PBK_Text_Custom1 :
+ case PBK_Text_Custom2 :
+ case PBK_Text_Custom3 :
+ case PBK_Text_Custom4 :
+ case PBK_Caller_Group :
+ if (mystrstr(Entry->Entries[i].Text, Text) != NULL) {
+ fprintf(stderr,"\n");
+ printmsg("Memory %s, Location %i\n",MemoryLocationToString(Entry->MemoryType),Entry->Location);
+ PrintMemoryEntry(Entry);
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+static void SearchOneMemory(GSM_MemoryType MemoryType, char *Title, unsigned char *Text)
+{
+ GSM_MemoryEntry Entry;
+ GSM_MemoryStatus Status;
+ int i = 0, l = 1;
+ bool start = true;
+
+ Status.MemoryType = MemoryType;
+ Entry.MemoryType = MemoryType;
+
+ if (Phone->GetMemoryStatus(&s, &Status) == ERR_NONE) {
+ fprintf(stderr,"%c%s: %i%%", 13, Title, (i+1)*100/(Status.MemoryUsed+1));
+ if (Phone->GetNextMemory != NOTSUPPORTED && Phone->GetNextMemory != NOTIMPLEMENTED) {
+ while (i < Status.MemoryUsed) {
+ if (gshutdown) return;
+ i++;
+ fprintf(stderr,"\r%s: %i%%", Title, (i+1)*100/(Status.MemoryUsed+1));
+ error = Phone->GetNextMemory(&s, &Entry, start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ SearchOneEntry(&Entry, Text);
+ start = false;
+ }
+ } else {
+ while (i < Status.MemoryUsed) {
+ Entry.Location = l;
+ error = Phone->GetMemory(&s, &Entry);
+ if (error != ERR_EMPTY) {
+ Print_Error(error);
+ i++;
+ SearchOneEntry(&Entry, Text);
+ }
+ fprintf(stderr,"%c%s: %i%%", 13, Title, (i+1)*100/(Status.MemoryUsed+1));
+ l++;
+ }
+ }
+ fprintf(stderr,"\n");
+ }
+}
+
+static void SearchMemory(int argc, char *argv[])
+{
+ unsigned char Text[(GSM_PHONEBOOK_TEXT_LENGTH+1)*2];
+ int Length;
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ Length = strlen(argv[2]);
+ if (Length > GSM_PHONEBOOK_TEXT_LENGTH) {
+ printmsg("Search text too long, truncating to %d chars!\n", GSM_PHONEBOOK_TEXT_LENGTH);
+ Length = GSM_PHONEBOOK_TEXT_LENGTH;
+ }
+ EncodeUnicode(Text, argv[2], Length);
+
+ GSM_Init(true);
+
+ if (!gshutdown) SearchOneMemory(MEM_ME, "Phone phonebook", Text);
+ if (!gshutdown) SearchOneMemory(MEM_SM, "SIM phonebook", Text);
+ if (!gshutdown) SearchOneMemory(MEM_ON, "Own numbers", Text);
+ if (!gshutdown) SearchOneMemory(MEM_DC, "Dialled numbers", Text);
+ if (!gshutdown) SearchOneMemory(MEM_RC, "Received numbers", Text);
+ if (!gshutdown) SearchOneMemory(MEM_MC, "Missed numbers", Text);
+ if (!gshutdown) SearchOneMemory(MEM_FD, "Fix dialling", Text);
+ if (!gshutdown) SearchOneMemory(MEM_VM, "Voice mailbox", Text);
+
+ GSM_Terminate();
+}
+
+static void ListMemoryCategoryEntries(int Category)
+{
+ GSM_MemoryEntry Entry;
+ bool start = true;
+ int j;
+
+ /* Category can be only for ME stored entries */
+ Entry.MemoryType = MEM_ME;
+
+ while (!gshutdown) {
+ error = Phone->GetNextMemory(&s, &Entry, start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ for (j=0;j<Entry.EntriesNum;j++) {
+ if (Entry.Entries[j].EntryType == PBK_Category && Entry.Entries[j].Number == Category) {
+ printmsg("Memory %s, Location %i\n",MemoryLocationToString(Entry.MemoryType),Entry.Location);
+ PrintMemoryEntry(&Entry);
+ }
+ }
+ start = false;
+ }
+}
+
+static void ListMemoryCategory(int argc, char *argv[])
+{
+ GSM_Category Category;
+ GSM_CategoryStatus Status;
+ int j, count;
+
+ unsigned char Text[(GSM_MAX_CATEGORY_NAME_LENGTH+1)*2];
+ int Length;
+ bool Number = true;;
+
+ GSM_Init(true);
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ Length = strlen(argv[2]);
+ for (j = 0; j < Length; j++) {
+ if (!isdigit(argv[2][j])) {
+ Number = false;
+ break;
+ }
+ }
+
+ if (Number) {
+ j = atoi(argv[2]);
+ if (j > 0) {
+ ListMemoryCategoryEntries(j);
+ }
+ } else {
+ if (Length > GSM_MAX_CATEGORY_NAME_LENGTH) {
+ printmsg("Search text too long, truncating to %d chars!\n", GSM_MAX_CATEGORY_NAME_LENGTH);
+ Length = GSM_MAX_CATEGORY_NAME_LENGTH;
+ }
+ EncodeUnicode(Text, argv[2], Length);
+
+ Category.Type = Category_Phonebook;
+ Status.Type = Category_Phonebook;
+
+ if (Phone->GetCategoryStatus(&s, &Status) == ERR_NONE) {
+ for (count=0,j=1;count<Status.Used;j++) {
+ Category.Location=j;
+ error=Phone->GetCategory(&s, &Category);
+
+ if (error != ERR_EMPTY) {
+ count++;
+ if (mystrstr(Category.Name, Text) != NULL) {
+ ListMemoryCategoryEntries(j);
+ }
+ }
+ }
+ }
+ }
+ GSM_Terminate();
+}
+
+static void displaysinglesmsinfo(GSM_SMSMessage sms, bool displaytext, bool displayudh)
+{
+ switch (sms.PDU) {
+ case SMS_Status_Report:
+ printmsg("SMS status report\n");
+ printmsg("Status : ");
+ switch (sms.State) {
+ case SMS_Sent : printmsg("Sent"); break;
+ case SMS_Read : printmsg("Read"); break;
+ case SMS_UnRead : printmsg("UnRead"); break;
+ case SMS_UnSent : printmsg("UnSent"); break;
+ }
+ printmsg("\nRemote number : \"%s\"\n",DecodeUnicodeConsole(sms.Number));
+ printmsg("Reference number: 0x%02X\n",sms.MessageReference);
+ printmsg("Sent : %s\n",OSDateTime(sms.DateTime,true));
+ printmsg("SMSC number : \"%s\"\n",DecodeUnicodeConsole(sms.SMSC.Number));
+ printmsg("SMSC response : %s\n",OSDateTime(sms.SMSCTime,true));
+ printmsg("Delivery status : %s\n",DecodeUnicodeConsole(sms.Text));
+ printmsg("Details : ");
+ if (sms.DeliveryStatus & 0x40) {
+ if (sms.DeliveryStatus & 0x20) {
+ printmsg("Temporary error, ");
+ } else {
+ printmsg("Permanent error, ");
+ }
+ } else if (sms.DeliveryStatus & 0x20) {
+ printmsg("Temporary error, ");
+ }
+ switch (sms.DeliveryStatus) {
+ case 0x00: printmsg("SM received by the SME"); break;
+ case 0x01: printmsg("SM forwarded by the SC to the SME but the SC is unable to confirm delivery");break;
+ case 0x02: printmsg("SM replaced by the SC"); break;
+ case 0x20: printmsg("Congestion"); break;
+ case 0x21: printmsg("SME busy"); break;
+ case 0x22: printmsg("No response from SME"); break;
+ case 0x23: printmsg("Service rejected"); break;
+ case 0x24: printmsg("Quality of service not aviable"); break;
+ case 0x25: printmsg("Error in SME"); break;
+ case 0x40: printmsg("Remote procedure error"); break;
+ case 0x41: printmsg("Incompatibile destination"); break;
+ case 0x42: printmsg("Connection rejected by SME"); break;
+ case 0x43: printmsg("Not obtainable"); break;
+ case 0x44: printmsg("Quality of service not available"); break;
+ case 0x45: printmsg("No internetworking available"); break;
+ case 0x46: printmsg("SM Validity Period Expired"); break;
+ case 0x47: printmsg("SM deleted by originating SME"); break;
+ case 0x48: printmsg("SM Deleted by SC Administration"); break;
+ case 0x49: printmsg("SM does not exist"); break;
+ case 0x60: printmsg("Congestion"); break;
+ case 0x61: printmsg("SME busy"); break;
+ case 0x62: printmsg("No response from SME"); break;
+ case 0x63: printmsg("Service rejected"); break;
+ case 0x64: printmsg("Quality of service not available"); break;
+ case 0x65: printmsg("Error in SME"); break;
+ default : printmsg("Reserved/Specific to SC: %x",sms.DeliveryStatus); break;
+ }
+ printf("\n");
+ break;
+ case SMS_Deliver:
+ printmsg("SMS message\n");
+ printmsg("SMSC number : \"%s\"",DecodeUnicodeConsole(sms.SMSC.Number));
+ if (sms.ReplyViaSameSMSC) printmsg(" (set for reply)");
+ printmsg("\nSent : %s\n",OSDateTime(sms.DateTime,true));
+ /* No break. The only difference for SMS_Deliver and SMS_Submit is,
+ * that SMS_Deliver contains additional data. We wrote them and then go
+ * for data shared with SMS_Submit
+ */
+ case SMS_Submit:
+ if (sms.ReplaceMessage != 0) printmsg("SMS replacing ID : %i\n",sms.ReplaceMessage);
+ /* If we went here from "case SMS_Deliver", we don't write "SMS Message" */
+ if (sms.PDU==SMS_Submit) {
+ printmsg("SMS message\n");
+ printmsg("Reference number : 0x%02X\n",sms.MessageReference);
+ }
+ if (sms.Name[0] != 0x00 || sms.Name[1] != 0x00) {
+ printmsg("Name : \"%s\"\n",DecodeUnicodeConsole(sms.Name));
+ }
+ if (sms.Class != -1) {
+ printmsg("Class : %i\n",sms.Class);
+ }
+ printmsg("Coding : ");
+ switch (sms.Coding) {
+ case SMS_Coding_Unicode : printmsg("Unicode\n"); break;
+ case SMS_Coding_Default : printmsg("Default GSM alphabet\n"); break;
+ case SMS_Coding_8bit : printmsg("8 bit\n"); break;
+ }
+ printmsg("Status : ");
+ switch (sms.State) {
+ case SMS_Sent : printmsg("Sent"); break;
+ case SMS_Read : printmsg("Read"); break;
+ case SMS_UnRead : printmsg("UnRead"); break;
+ case SMS_UnSent : printmsg("UnSent"); break;
+ }
+ printmsg("\nRemote number : \"%s\"\n",DecodeUnicodeConsole(sms.Number));
+ if (sms.UDH.Type != UDH_NoUDH) {
+ printmsg("User Data Header : ");
+ switch (sms.UDH.Type) {
+ case UDH_ConcatenatedMessages : printmsg("Concatenated (linked) message"); break;
+ case UDH_ConcatenatedMessages16bit : printmsg("Concatenated (linked) message"); break;
+ case UDH_DisableVoice : printmsg("Disables voice indicator"); break;
+ case UDH_EnableVoice : printmsg("Enables voice indicator"); break;
+ case UDH_DisableFax : printmsg("Disables fax indicator"); break;
+ case UDH_EnableFax : printmsg("Enables fax indicator"); break;
+ case UDH_DisableEmail : printmsg("Disables email indicator"); break;
+ case UDH_EnableEmail : printmsg("Enables email indicator"); break;
+ case UDH_VoidSMS : printmsg("Void SMS"); break;
+ case UDH_NokiaWAP : printmsg("Nokia WAP bookmark"); break;
+ case UDH_NokiaOperatorLogoLong : printmsg("Nokia operator logo"); break;
+ case UDH_NokiaWAPLong : printmsg("Nokia WAP bookmark or WAP/MMS settings"); break;
+ case UDH_NokiaRingtone : printmsg("Nokia ringtone"); break;
+ case UDH_NokiaRingtoneLong : printmsg("Nokia ringtone"); break;
+ case UDH_NokiaOperatorLogo : printmsg("Nokia GSM operator logo"); break;
+ case UDH_NokiaCallerLogo : printmsg("Nokia caller logo"); break;
+ case UDH_NokiaProfileLong : printmsg("Nokia profile"); break;
+ case UDH_NokiaCalendarLong : printmsg("Nokia calendar note"); break;
+ case UDH_NokiaPhonebookLong : printmsg("Nokia phonebook entry"); break;
+ case UDH_UserUDH : printmsg("User UDH"); break;
+ case UDH_MMSIndicatorLong : printmsg("MMS indicator"); break;
+ case UDH_NoUDH: break;
+ }
+ if (sms.UDH.Type != UDH_NoUDH) {
+ if (sms.UDH.ID8bit != -1) printmsg(", ID (8 bit) %i",sms.UDH.ID8bit);
+ if (sms.UDH.ID16bit != -1) printmsg(", ID (16 bit) %i",sms.UDH.ID16bit);
+ if (sms.UDH.PartNumber != -1 && sms.UDH.AllParts != -1) {
+ if (displayudh) {
+ printmsg(", part %i of %i",sms.UDH.PartNumber,sms.UDH.AllParts);
+ } else {
+ printmsg(", %i parts",sms.UDH.AllParts);
+ }
+ }
+ }
+ printf("\n");
+ }
+ if (displaytext) {
+ printf("\n");
+ if (sms.Coding!=SMS_Coding_8bit) {
+ printmsg("%s\n",DecodeUnicodeConsole(sms.Text));
+ } else {
+ printmsg("8 bit SMS, cannot be displayed here\n");
+ }
+ }
+ break;
+ }
+}
+//#if 0
+static void displaymultismsinfo (GSM_MultiSMSMessage sms, bool eachsms, bool ems)
+{
+ GSM_MultiPartSMSInfo SMSInfo;
+ bool RetVal,udhinfo=true;
+ int j;
+
+ /* GSM_DecodeMultiPartSMS returns if decoded SMS contenst correctly */
+ RetVal = GSM_DecodeMultiPartSMS(&SMSInfo,&sms,ems);
+
+ if (eachsms) {
+ if (sms.SMS[0].UDH.Type != UDH_NoUDH && sms.SMS[0].UDH.AllParts == sms.Number) udhinfo = false;
+ if (RetVal && !udhinfo) {
+ displaysinglesmsinfo(sms.SMS[0],false,false);
+ printf("\n");
+ } else {
+ for (j=0;j<sms.Number;j++) {
+ displaysinglesmsinfo(sms.SMS[j],!RetVal,udhinfo);
+ printf("\n");
+ }
+ }
+ } else {
+ for (j=0;j<sms.Number;j++) {
+ displaysinglesmsinfo(sms.SMS[j],!RetVal,true);
+ printf("\n");
+ }
+ }
+ if (!RetVal) {
+ GSM_FreeMultiPartSMSInfo(&SMSInfo);
+ return;
+ }
+
+ if (SMSInfo.Unknown) printmsg("Some details were ignored (unknown or not implemented in decoding functions)\n\n");
+
+ for (i=0;i<SMSInfo.EntriesNum;i++) {
+ switch (SMSInfo.Entries[i].ID) {
+ case SMS_NokiaRingtone:
+ printmsg("Ringtone \"%s\"\n",DecodeUnicodeConsole(SMSInfo.Entries[i].Ringtone->Name));
+ saverttl(stdout,SMSInfo.Entries[i].Ringtone);
+ printf("\n");
+ if (s.Phone.Functions->PlayTone!=NOTSUPPORTED &&
+ s.Phone.Functions->PlayTone!=NOTIMPLEMENTED) {
+ if (answer_yes("Do you want to play it")) GSM_PlayRingtone(*SMSInfo.Entries[i].Ringtone);
+ }
+ break;
+ case SMS_NokiaCallerLogo:
+ printmsg("Caller logo\n\n");
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_NokiaOperatorLogo:
+ printmsg("Operator logo for %s network (%s, %s)\n\n",
+ SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode,
+ DecodeUnicodeConsole(GSM_GetNetworkName(SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode)),
+ DecodeUnicodeConsole(GSM_GetCountryName(SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode)));
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_NokiaScreenSaverLong:
+ printmsg("Screen saver\n");
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_NokiaPictureImageLong:
+ printmsg("Picture Image\n");
+ if (UnicodeLength(SMSInfo.Entries[i].Bitmap->Bitmap[0].Text)!=0) printmsg("Text: \"%s\"\n\n",DecodeUnicodeConsole(SMSInfo.Entries[i].Bitmap->Bitmap[0].Text));
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_NokiaProfileLong:
+ printmsg("Profile\n");
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_ConcatenatedTextLong:
+ case SMS_ConcatenatedAutoTextLong:
+ case SMS_ConcatenatedTextLong16bit:
+ case SMS_ConcatenatedAutoTextLong16bit:
+ printmsg("%s\n",DecodeUnicodeConsole(SMSInfo.Entries[i].Buffer));
+ break;
+ case SMS_EMSFixedBitmap:
+ case SMS_EMSVariableBitmap:
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_EMSAnimation:
+ /* Can't show animation, we show first frame */
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_EMSPredefinedSound:
+ printmsg("\nEMS sound ID: %i\n",SMSInfo.Entries[i].Number);
+ break;
+ case SMS_EMSPredefinedAnimation:
+ printmsg("\nEMS animation ID: %i\n",SMSInfo.Entries[i].Number);
+ break;
+ default:
+ printf("Error\n");
+ break;
+ }
+ }
+ printf("\n");
+ GSM_FreeMultiPartSMSInfo(&SMSInfo);
+}
+
+static void NetworkInfo(int argc, char *argv[])
+{
+ GSM_NetworkInfo NetInfo;
+
+ GSM_Init(true);
+
+ if (Phone->GetNetworkInfo(&s,&NetInfo)==ERR_NONE) {
+ printmsg("Network state : ");
+ switch (NetInfo.State) {
+ case GSM_HomeNetwork : printmsg("home network\n"); break;
+ case GSM_RoamingNetwork : printmsg("roaming network\n"); break;
+ case GSM_RequestingNetwork : printmsg("requesting network\n"); break;
+ case GSM_NoNetwork : printmsg("not logged into network\n"); break;
+ case GSM_RegistrationDenied : printmsg("registration to network denied\n"); break;
+ case GSM_NetworkStatusUnknown : printmsg("unknown\n"); break;
+ default : printmsg("unknown\n");
+ }
+ if (NetInfo.State == GSM_HomeNetwork || NetInfo.State == GSM_RoamingNetwork) {
+ printmsg("Network : %s (%s", NetInfo.NetworkCode,DecodeUnicodeConsole(GSM_GetNetworkName(NetInfo.NetworkCode)));
+ printmsg(", %s)", DecodeUnicodeConsole(GSM_GetCountryName(NetInfo.NetworkCode)));
+ printmsg(", LAC %s, CellID %s\n", NetInfo.LAC,NetInfo.CID);
+ if (NetInfo.NetworkName[0] != 0x00 || NetInfo.NetworkName[1] != 0x00) {
+ printmsg("Name in phone : \"%s\"\n",DecodeUnicodeConsole(NetInfo.NetworkName));
+ }
+ }
+ }
+ GSM_Terminate();
+}
+
+static void IncomingSMS(char *Device, GSM_SMSMessage sms)
+{
+ GSM_MultiSMSMessage SMS;
+
+ printmsg("SMS message received\n");
+ SMS.Number = 1;
+ memcpy(&SMS.SMS[0],&sms,sizeof(GSM_SMSMessage));
+ displaymultismsinfo(SMS,false,false);
+}
+
+static void IncomingCB(char *Device, GSM_CBMessage CB)
+{
+ printmsg("CB message received\n");
+ printmsg("Channel %i, text \"%s\"\n",CB.Channel,DecodeUnicodeConsole(CB.Text));
+}
+
+static void IncomingCall(char *Device, GSM_Call call)
+{
+ printmsg("Call info : ");
+ if (call.CallIDAvailable) printmsg("ID %i, ",call.CallID);
+ switch(call.Status) {
+ case GSM_CALL_IncomingCall : printmsg("incoming call from \"%s\"\n",DecodeUnicodeConsole(call.PhoneNumber)); break;
+ case GSM_CALL_OutgoingCall : printmsg("outgoing call to \"%s\"\n",DecodeUnicodeConsole(call.PhoneNumber)); break;
+ case GSM_CALL_CallStart : printmsg("call started\n"); break;
+ case GSM_CALL_CallEnd : printmsg("end of call (unknown side)\n"); break;
+ case GSM_CALL_CallLocalEnd : printmsg("call end from our side\n"); break;
+ case GSM_CALL_CallRemoteEnd : printmsg("call end from remote side (code %i)\n",call.StatusCode); break;
+ case GSM_CALL_CallEstablished : printmsg("call established. Waiting for answer\n"); break;
+ case GSM_CALL_CallHeld : printmsg("call held\n"); break;
+ case GSM_CALL_CallResumed : printmsg("call resumed\n"); break;
+ case GSM_CALL_CallSwitched : printmsg("call switched\n"); break;
+ }
+}
+
+static void IncomingUSSD(char *Device, char *Buffer)
+{
+ printmsg("Service reply: \"%s\"\n",DecodeUnicodeConsole(Buffer));
+}
+
+#define CHECKMEMORYSTATUS(x, m, a1, b1) { \
+ x.MemoryType=m; \
+ if (Phone->GetMemoryStatus(&s, &x) == ERR_NONE) \
+ printmsg("%s %03d, %s %03d\n", a1, x.MemoryUsed, b1, x.MemoryFree); \
+}
+
+static void Monitor(int argc, char *argv[])
+{
+ GSM_MemoryStatus MemStatus;
+ GSM_SMSMemoryStatus SMSStatus;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_CalendarStatus CalendarStatus;
+ GSM_NetworkInfo NetInfo;
+ GSM_BatteryCharge BatteryCharge;
+ GSM_SignalQuality SignalQuality;
+ int count = -1;
+
+ if (argc >= 3) {
+ count = atoi(argv[2]);
+ if (count <= 0) count = -1;
+ }
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+ printmsg("Entering monitor mode...\n\n");
+
+ GSM_Init(true);
+
+ s.User.IncomingSMS = IncomingSMS;
+ s.User.IncomingCB = IncomingCB;
+ s.User.IncomingCall = IncomingCall;
+ s.User.IncomingUSSD = IncomingUSSD;
+
+ error=Phone->SetIncomingSMS (&s,true);
+ printmsg("Enabling info about incoming SMS : %s\n",print_error(error,NULL,s.msg));
+ error=Phone->SetIncomingCB (&s,true);
+ printmsg("Enabling info about incoming CB : %s\n",print_error(error,NULL,s.msg));
+ error=Phone->SetIncomingCall (&s,true);
+ printmsg("Enabling info about calls : %s\n",print_error(error,NULL,s.msg));
+ error=Phone->SetIncomingUSSD (&s,true);
+ printmsg("Enabling info about USSD : %s\n\n",print_error(error,NULL,s.msg));
+
+ while (!gshutdown && count != 0) {
+ if (count > 0) count--;
+ CHECKMEMORYSTATUS(MemStatus,MEM_SM,"SIM phonebook : Used","Free");
+ if (gshutdown) break;
+ CHECKMEMORYSTATUS(MemStatus,MEM_DC,"Dialled numbers : Used","Free");
+ if (gshutdown) break;
+ CHECKMEMORYSTATUS(MemStatus,MEM_RC,"Received numbers : Used","Free");
+ if (gshutdown) break;
+ CHECKMEMORYSTATUS(MemStatus,MEM_MC,"Missed numbers : Used","Free");
+ if (gshutdown) break;
+ CHECKMEMORYSTATUS(MemStatus,MEM_ON,"Own numbers : Used","Free");
+ if (gshutdown) break;
+ CHECKMEMORYSTATUS(MemStatus,MEM_ME,"Phone phonebook : Used","Free");
+ if (gshutdown) break;
+ if (Phone->GetToDoStatus(&s, &ToDoStatus) == ERR_NONE) {
+ printmsg("ToDos : Used %d\n", ToDoStatus.Used);
+ }
+ if (gshutdown) break;
+ if (Phone->GetCalendarStatus(&s, &CalendarStatus) == ERR_NONE) {
+ printmsg("Calendar : Used %d\n", CalendarStatus.Used);
+ }
+ if (gshutdown) break;
+ if (Phone->GetBatteryCharge(&s,&BatteryCharge)==ERR_NONE) {
+ if (BatteryCharge.BatteryPercent != -1) printmsg("Battery level : %i percent\n", BatteryCharge.BatteryPercent);
+ if (BatteryCharge.ChargeState != 0) {
+ printmsg("Charge state : ");
+ switch (BatteryCharge.ChargeState) {
+ case GSM_BatteryPowered:
+ printmsg("powered from battery");
+ break;
+ case GSM_BatteryConnected:
+ printmsg("battery connected, but not powered from battery");
+ break;
+ case GSM_BatteryNotConnected:
+ printmsg("battery not connected");
+ break;
+ case GSM_PowerFault:
+ printmsg("detected power failure");
+ break;
+ default:
+ printmsg("unknown");
+ break;
+ }
+ printf("\n");
+ }
+ }
+ if (gshutdown) break;
+ if (Phone->GetSignalQuality(&s,&SignalQuality)==ERR_NONE) {
+ if (SignalQuality.SignalStrength != -1) printmsg("Signal strength : %i dBm\n", SignalQuality.SignalStrength);
+ if (SignalQuality.SignalPercent != -1) printmsg("Network level : %i percent\n", SignalQuality.SignalPercent);
+ if (SignalQuality.BitErrorRate != -1) printmsg("Bit error rate : %i percent\n", SignalQuality.BitErrorRate);
+ }
+ if (gshutdown) break;
+ if (Phone->GetSMSStatus(&s,&SMSStatus)==ERR_NONE) {
+ if (SMSStatus.SIMSize > 0) {
+ printmsg("SIM SMS status : %i used, %i unread, %i locations\n",
+ SMSStatus.SIMUsed,
+ SMSStatus.SIMUnRead,
+ SMSStatus.SIMSize);
+ }
+
+ if (SMSStatus.PhoneSize > 0) {
+ printmsg("Phone SMS status : %i used, %i unread, %i locations",
+ SMSStatus.PhoneUsed,
+ SMSStatus.PhoneUnRead,
+ SMSStatus.PhoneSize);
+ if (SMSStatus.TemplatesUsed!=0) printmsg(", %i templates", SMSStatus.TemplatesUsed);
+ printf("\n");
+ }
+ }
+ if (gshutdown) break;
+ if (Phone->GetNetworkInfo(&s,&NetInfo)==ERR_NONE) {
+ printmsg("Network state : ");
+ switch (NetInfo.State) {
+ case GSM_HomeNetwork : printmsg("home network\n"); break;
+ case GSM_RoamingNetwork : printmsg("roaming network\n"); break;
+ case GSM_RequestingNetwork : printmsg("requesting network\n"); break;
+ case GSM_NoNetwork : printmsg("not logged into network\n"); break;
+ case GSM_RegistrationDenied : printmsg("registration to network denied\n"); break;
+ case GSM_NetworkStatusUnknown : printmsg("unknown\n"); break;
+ default : printmsg("unknown\n");
+ }
+ if (NetInfo.State == GSM_HomeNetwork || NetInfo.State == GSM_RoamingNetwork) {
+ printmsg("Network : %s (%s", NetInfo.NetworkCode,DecodeUnicodeConsole(GSM_GetNetworkName(NetInfo.NetworkCode)));
+ printmsg(", %s)", DecodeUnicodeConsole(GSM_GetCountryName(NetInfo.NetworkCode)));
+ printmsg(", LAC %s, CID %s\n", NetInfo.LAC,NetInfo.CID);
+ if (NetInfo.NetworkName[0] != 0x00 || NetInfo.NetworkName[1] != 0x00) {
+ printmsg("Name in phone : \"%s\"\n",DecodeUnicodeConsole(NetInfo.NetworkName));
+ }
+ }
+ }
+ printf("\n");
+ }
+
+ printmsg("Leaving monitor mode...\n");
+
+ GSM_Terminate();
+}
+
+static void GetUSSD(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ s.User.IncomingUSSD = IncomingUSSD;
+
+ error=Phone->SetIncomingUSSD(&s,true);
+ Print_Error(error);
+
+ error=Phone->DialVoice(&s, argv[2], GSM_CALL_DefaultNumberPresence);
+ Print_Error(error);
+
+ while (!gshutdown) GSM_ReadDevice(&s,true);
+
+ GSM_Terminate();
+}
+
+static void GetSMSC(int argc, char *argv[])
+{
+ GSM_SMSC smsc;
+ int start, stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ smsc.Location=i;
+
+ error=Phone->GetSMSC(&s, &smsc);
+ Print_Error(error);
+
+ if (!strcmp(DecodeUnicodeConsole(smsc.Name),"")) {
+ printmsg("%i. Set %i\n",smsc.Location, smsc.Location);
+ } else {
+ printmsg("%i. \"%s\"\n",smsc.Location, DecodeUnicodeConsole(smsc.Name));
+ }
+ printmsg("Number : \"%s\"\n",DecodeUnicodeConsole(smsc.Number));
+ printmsg("Default number : \"%s\"\n",DecodeUnicodeConsole(smsc.DefaultNumber));
+
+ printmsg("Format : ");
+ switch (smsc.Format) {
+ case SMS_FORMAT_Text : printmsg("Text"); break;
+ case SMS_FORMAT_Fax : printmsg("Fax"); break;
+ case SMS_FORMAT_Email : printmsg("Email"); break;
+ case SMS_FORMAT_Pager : printmsg("Pager"); break;
+ }
+ printf("\n");
+
+ printmsg("Validity : ");
+ switch (smsc.Validity.Relative) {
+ case SMS_VALID_1_Hour : printmsg("1 hour"); break;
+ case SMS_VALID_6_Hours : printmsg("6 hours"); break;
+ case SMS_VALID_1_Day : printmsg("24 hours"); break;
+ case SMS_VALID_3_Days : printmsg("72 hours"); break;
+ case SMS_VALID_1_Week : printmsg("1 week"); break;
+ case SMS_VALID_Max_Time : printmsg("Maximum time"); break;
+ default : printmsg("Unknown");
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+static void GetSMS(int argc, char *argv[])
+{
+ GSM_MultiSMSMessage sms;
+ GSM_SMSFolders folders;
+ int start, stop;
+ int j;
+
+ GetStartStop(&start, &stop, 3, argc, argv);
+
+ GSM_Init(true);
+
+ error=Phone->GetSMSFolders(&s, &folders);
+ Print_Error(error);
+
+ for (j = start; j <= stop; j++) {
+ sms.SMS[0].Folder = atoi(argv[2]);
+ sms.SMS[0].Location = j;
+ error=Phone->GetSMS(&s, &sms);
+ switch (error) {
+ case ERR_EMPTY:
+ printmsg("Location %i\n",sms.SMS[0].Location);
+ printmsg("Empty\n");
+ break;
+ default:
+ Print_Error(error);
+ printmsg("Location %i, folder \"%s\"",sms.SMS[0].Location,DecodeUnicodeConsole(folders.Folder[sms.SMS[0].Folder-1].Name));
+ switch(sms.SMS[0].Memory) {
+ case MEM_SM: printmsg(", SIM memory"); break;
+ case MEM_ME: printmsg(", phone memory"); break;
+ case MEM_MT: printmsg(", phone or SIM memory"); break;
+ default : break;
+ }
+ if (sms.SMS[0].InboxFolder) printmsg(", Inbox folder");
+ printf("\n");
+ displaymultismsinfo(sms,false,false);
+ }
+ }
+
+ GSM_Terminate();
+}
+
+static void DeleteSMS(int argc, char *argv[])
+{
+ GSM_SMSMessage sms;
+ int start, stop;
+
+ sms.Folder=atoi(argv[2]);
+
+ GetStartStop(&start, &stop, 3, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ sms.Folder = 0;
+ sms.Location = i;
+ error=Phone->DeleteSMS(&s, &sms);
+ Print_Error(error);
+ }
+#ifdef GSM_ENABLE_BEEP
+ GSM_PhoneBeep();
+#endif
+ GSM_Terminate();
+}
+
+static void GetAllSMS(int argc, char *argv[])
+{
+ GSM_MultiSMSMessage sms;
+ GSM_SMSFolders folders;
+ bool start = true;
+
+ GSM_Init(true);
+
+ error=Phone->GetSMSFolders(&s, &folders);
+ Print_Error(error);
+
+ fprintf(stderr,"Reading: ");
+ while (error == ERR_NONE) {
+ sms.SMS[0].Folder=0x00;
+ error=Phone->GetNextSMS(&s, &sms, start);
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ default:
+ Print_Error(error);
+ printmsg("Location %i, folder \"%s\"",sms.SMS[0].Location,DecodeUnicodeConsole(folders.Folder[sms.SMS[0].Folder-1].Name));
+ switch(sms.SMS[0].Memory) {
+ case MEM_SM: printmsg(", SIM memory"); break;
+ case MEM_ME: printmsg(", phone memory"); break;
+ case MEM_MT: printmsg(", phone or SIM memory"); break;
+ default : break;
+ }
+ if (sms.SMS[0].InboxFolder) printmsg(", Inbox folder");
+ printf("\n");
+ displaymultismsinfo(sms,false,false);
+ }
+ fprintf(stderr,"*");
+ start=false;
+ }
+ fprintf(stderr,"\n");
+
+#ifdef GSM_ENABLE_BEEP
+ GSM_PhoneBeep();
+#endif
+ GSM_Terminate();
+}
+
+static void GetEachSMS(int argc, char *argv[])
+{
+ GSM_MultiSMSMessage *GetSMS[PHONE_MAXSMSINFOLDER],*SortedSMS[PHONE_MAXSMSINFOLDER],sms;
+ int GetSMSNumber = 0,i,j;
+ GSM_SMSFolders folders;
+ bool start = true, ems = true;
+
+ GetSMS[0] = NULL;
+
+ GSM_Init(true);
+
+ error=Phone->GetSMSFolders(&s, &folders);
+ Print_Error(error);
+
+ fprintf(stderr,"Reading: ");
+ while (error == ERR_NONE) {
+ sms.SMS[0].Folder=0x00;
+ error=Phone->GetNextSMS(&s, &sms, start);
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ default:
+ Print_Error(error);
+ GetSMS[GetSMSNumber] = malloc(sizeof(GSM_MultiSMSMessage));
+ if (GetSMS[GetSMSNumber] == NULL) Print_Error(ERR_MOREMEMORY);
+ GetSMS[GetSMSNumber+1] = NULL;
+ memcpy(GetSMS[GetSMSNumber],&sms,sizeof(GSM_MultiSMSMessage));
+ GetSMSNumber++;
+ if (GetSMSNumber==PHONE_MAXSMSINFOLDER) {
+ fprintf(stderr,"SMS counter overflow\n");
+ return;
+ }
+ }
+ fprintf(stderr,"*");
+ start=false;
+ }
+ fprintf(stderr,"\n");
+
+#ifdef GSM_ENABLE_BEEP
+ GSM_PhoneBeep();
+#endif
+
+ error = GSM_LinkSMS(GetSMS, SortedSMS, ems);
+ Print_Error(error);
+
+ i=0;
+ while(GetSMS[i] != NULL) {
+ free(GetSMS[i]);
+ GetSMS[i] = NULL;
+ i++;
+ }
+
+ i=0;
+ while(SortedSMS[i] != NULL) {
+ for (j=0;j<SortedSMS[i]->Number;j++) {
+ if ((j==0) || (j!=0 && SortedSMS[i]->SMS[j].Location != SortedSMS[i]->SMS[j-1].Location)) {
+ printmsg("Location %i, folder \"%s\"",SortedSMS[i]->SMS[j].Location,DecodeUnicodeConsole(folders.Folder[SortedSMS[i]->SMS[j].Folder-1].Name));
+ switch(SortedSMS[i]->SMS[j].Memory) {
+ case MEM_SM: printmsg(", SIM memory"); break;
+ case MEM_ME: printmsg(", phone memory"); break;
+ case MEM_MT: printmsg(", phone or SIM memory"); break;
+ default : break;
+ }
+ if (SortedSMS[i]->SMS[j].InboxFolder) printmsg(", Inbox folder");
+ printf("\n");
+ }
+ }
+ displaymultismsinfo(*SortedSMS[i],true,ems);
+
+ free(SortedSMS[i]);
+ SortedSMS[i] = NULL;
+ i++;
+ }
+
+ GSM_Terminate();
+}
+
+static void GetSMSFolders(int argc, char *argv[])
+{
+ GSM_SMSFolders folders;
+
+ GSM_Init(true);
+
+ error=Phone->GetSMSFolders(&s,&folders);
+ Print_Error(error);
+
+ for (i=0;i<folders.Number;i++) {
+ printmsg("%i. \"%30s\"",i+1,DecodeUnicodeConsole(folders.Folder[i].Name));
+ switch(folders.Folder[i].Memory) {
+ case MEM_SM: printmsg(", SIM memory"); break;
+ case MEM_ME: printmsg(", phone memory"); break;
+ case MEM_MT: printmsg(", phone or SIM memory"); break;
+ default : break;
+ }
+ if (folders.Folder[i].InboxFolder) printmsg(", Inbox folder");
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+static void GetRingtone(int argc, char *argv[])
+{
+ GSM_Ringtone ringtone;
+ bool PhoneRingtone = false;
+
+ if (mystrncasecmp(argv[1],"--getphoneringtone",0)) PhoneRingtone = true;
+
+ GetStartStop(&ringtone.Location, NULL, 2, argc, argv);
+
+ GSM_Init(true);
+
+ ringtone.Format=0;
+
+ error=Phone->GetRingtone(&s,&ringtone,PhoneRingtone);
+ Print_Error(error);
+
+ switch (ringtone.Format) {
+ case RING_NOTETONE : printmsg("Smart Messaging"); break;
+ case RING_NOKIABINARY : printmsg("Nokia binary"); break;
+ case RING_MIDI : printmsg("Midi format"); break;
+ }
+ printmsg(" format, ringtone \"%s\"\n",DecodeUnicodeConsole(ringtone.Name));
+
+ if (argc==4) {
+ error=GSM_SaveRingtoneFile(argv[3], &ringtone);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+static void GetRingtonesList(int argc, char *argv[])
+{
+ GSM_AllRingtonesInfo Info;
+ int i;
+
+ GSM_Init(true);
+
+ error=Phone->GetRingtonesInfo(&s,&Info);
+ Print_Error(error);
+
+ GSM_Terminate();
+
+ for (i=0;i<Info.Number;i++) printmsg("%i. \"%s\"\n",i,DecodeUnicodeConsole(Info.Ringtone[i].Name));
+}
+
+static void DialVoice(int argc, char *argv[])
+{
+ GSM_CallShowNumber ShowNumber = GSM_CALL_DefaultNumberPresence;
+
+ if (argc > 3) {
+ if (mystrncasecmp(argv[3],"show",0)) { ShowNumber = GSM_CALL_ShowNumber;
+ } else if (mystrncasecmp(argv[3],"hide",0)) { ShowNumber = GSM_CALL_HideNumber;
+ } else {
+ printmsg("Unknown parameter (\"%s\")\n",argv[3]);
+ exit(-1);
+ }
+ }
+
+ GSM_Init(true);
+
+ error=Phone->DialVoice(&s, argv[2], ShowNumber);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void CancelCall(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ if (argc>2) {
+ error=Phone->CancelCall(&s,atoi(argv[2]),false);
+ } else {
+ error=Phone->CancelCall(&s,0,true);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void AnswerCall(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ if (argc>2) {
+ error=Phone->AnswerCall(&s,atoi(argv[2]),false);
+ } else {
+ error=Phone->AnswerCall(&s,0,true);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void UnholdCall(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ error=Phone->UnholdCall(&s,atoi(argv[2]));
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void HoldCall(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ error=Phone->HoldCall(&s,atoi(argv[2]));
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void ConferenceCall(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ error=Phone->ConferenceCall(&s,atoi(argv[2]));
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void SplitCall(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ error=Phone->SplitCall(&s,atoi(argv[2]));
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void SwitchCall(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ if (argc > 2) {
+ error=Phone->SwitchCall(&s,atoi(argv[2]),false);
+ } else {
+ error=Phone->SwitchCall(&s,0,true);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void TransferCall(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ if (argc > 2) {
+ error=Phone->TransferCall(&s,atoi(argv[2]),false);
+ } else {
+ error=Phone->TransferCall(&s,0,true);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void AddSMSFolder(int argc, char *argv[])
+{
+ unsigned char buffer[200];
+
+ GSM_Init(true);
+
+ EncodeUnicode(buffer,argv[2],strlen(argv[2]));
+ error=Phone->AddSMSFolder(&s,buffer);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void Reset(int argc, char *argv[])
+{
+ bool hard;
+
+ if (mystrncasecmp(argv[2],"SOFT",0)) { hard=false;
+ } else if (mystrncasecmp(argv[2],"HARD",0)) { hard=true;
+ } else {
+ printmsg("What type of reset do you want (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ GSM_Init(true);
+
+ error=Phone->Reset(&s, hard);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void PrintCalendar(GSM_CalendarEntry *Note)
+{
+ int i_age = 0,i;
+ GSM_DateTime Alarm,DateTime;
+ GSM_MemoryEntry entry;
+ unsigned char *name;
+
+ bool repeating = false;
+ int repeat_dayofweek = -1;
+ int repeat_day = -1;
+ int repeat_weekofmonth = -1;
+ int repeat_month = -1;
+ int repeat_frequency = -1;
+ GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0};
+ GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0};
+
+ printmsg("Location : %d\n", Note->Location);
+ printmsg("Note type : ");
+ switch (Note->Type) {
+ case GSM_CAL_REMINDER : printmsg("Reminder (Date)\n"); break;
+ case GSM_CAL_CALL : printmsg("Call\n"); break;
+ case GSM_CAL_MEETING : printmsg("Meeting\n"); break;
+ case GSM_CAL_BIRTHDAY : printmsg("Birthday (Anniversary)\n"); break;
+ case GSM_CAL_MEMO : printmsg("Memo (Miscellaneous)\n"); break;
+ case GSM_CAL_TRAVEL : printmsg("Travel\n"); break;
+ case GSM_CAL_VACATION : printmsg("Vacation\n"); break;
+ case GSM_CAL_ALARM : printmsg("Alarm\n"); break;
+ case GSM_CAL_DAILY_ALARM : printmsg("Daily alarm\n"); break;
+ case GSM_CAL_T_ATHL : printmsg("Training/Athletism\n"); break;
+ case GSM_CAL_T_BALL : printmsg("Training/Ball Games\n"); break;
+ case GSM_CAL_T_CYCL : printmsg("Training/Cycling\n"); break;
+ case GSM_CAL_T_BUDO : printmsg("Training/Budo\n"); break;
+ case GSM_CAL_T_DANC : printmsg("Training/Dance\n"); break;
+ case GSM_CAL_T_EXTR : printmsg("Training/Extreme Sports\n"); break;
+ case GSM_CAL_T_FOOT : printmsg("Training/Football\n"); break;
+ case GSM_CAL_T_GOLF : printmsg("Training/Golf\n"); break;
+ case GSM_CAL_T_GYM : printmsg("Training/Gym\n"); break;
+ case GSM_CAL_T_HORS : printmsg("Training/Horse Races\n"); break;
+ case GSM_CAL_T_HOCK : printmsg("Training/Hockey\n"); break;
+ case GSM_CAL_T_RACE : printmsg("Training/Races\n"); break;
+ case GSM_CAL_T_RUGB : printmsg("Training/Rugby\n"); break;
+ case GSM_CAL_T_SAIL : printmsg("Training/Sailing\n"); break;
+ case GSM_CAL_T_STRE : printmsg("Training/Street Games\n"); break;
+ case GSM_CAL_T_SWIM : printmsg("Training/Swimming\n"); break;
+ case GSM_CAL_T_TENN : printmsg("Training/Tennis\n"); break;
+ case GSM_CAL_T_TRAV : printmsg("Training/Travels\n"); break;
+ case GSM_CAL_T_WINT : printmsg("Training/Winter Games\n"); break;
+ default : printmsg("UNKNOWN\n");
+ }
+ Alarm.Year = 0;
+
+ repeating = false;
+ repeat_dayofweek = -1;
+ repeat_day = -1;
+ repeat_weekofmonth = -1;
+ repeat_month = -1;
+ repeat_frequency = -1;
+ repeat_startdate.Day = 0;
+ repeat_stopdate.Day = 0;
+
+ for (i=0;i<Note->EntriesNum;i++) {
+ switch (Note->Entries[i].EntryType) {
+ case CAL_START_DATETIME:
+ printmsg("Start : %s\n",OSDateTime(Note->Entries[i].Date,false));
+ memcpy(&DateTime,&Note->Entries[i].Date,sizeof(GSM_DateTime));
+ break;
+ case CAL_END_DATETIME:
+ printmsg("Stop : %s\n",OSDateTime(Note->Entries[i].Date,false));
+ memcpy(&DateTime,&Note->Entries[i].Date,sizeof(GSM_DateTime));
+ break;
+ case CAL_ALARM_DATETIME:
+ printmsg("Tone alarm : %s\n",OSDateTime(Note->Entries[i].Date,false));
+ memcpy(&Alarm,&Note->Entries[i].Date,sizeof(GSM_DateTime));
+ break;
+ case CAL_SILENT_ALARM_DATETIME:
+ printmsg("Silent alarm : %s\n",OSDateTime(Note->Entries[i].Date,false));
+ memcpy(&Alarm,&Note->Entries[i].Date,sizeof(GSM_DateTime));
+ break;
+ case CAL_RECURRANCE:
+ printmsg("Repeat : %d day%s\n",Note->Entries[i].Number/24,
+ ((Note->Entries[i].Number/24)>1) ? "s":"" );
+ break;
+ case CAL_TEXT:
+ printmsg("Text : \"%s\"\n",DecodeUnicodeConsole(Note->Entries[i].Text));
+ break;
+ case CAL_LOCATION:
+ printmsg("Location : \"%s\"\n",DecodeUnicodeConsole(Note->Entries[i].Text));
+ break;
+ case CAL_PHONE:
+ printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(Note->Entries[i].Text));
+ break;
+ case CAL_PRIVATE:
+ printmsg("Private : %s\n",Note->Entries[i].Number == 1 ? "Yes" : "No");
+ break;
+ case CAL_CONTACTID:
+ entry.Location = Note->Entries[i].Number;
+ entry.MemoryType = MEM_ME;
+ error=Phone->GetMemory(&s, &entry);
+ if (error == ERR_NONE) {
+ name = GSM_PhonebookGetEntryName(&entry);
+ if (name != NULL) {
+ printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), Note->Entries[i].Number);
+ } else {
+ printmsg("Contact ID : %d\n",Note->Entries[i].Number);
+ }
+ } else {
+ printmsg("Contact ID : %d\n",Note->Entries[i].Number);
+ }
+ break;
+ case CAL_REPEAT_DAYOFWEEK:
+ repeat_dayofweek = Note->Entries[i].Number;
+ repeating = true;
+ break;
+ case CAL_REPEAT_DAY:
+ repeat_day = Note->Entries[i].Number;
+ repeating = true;
+ break;
+ case CAL_REPEAT_WEEKOFMONTH:
+ repeat_weekofmonth = Note->Entries[i].Number;
+ repeating = true;
+ break;
+ case CAL_REPEAT_MONTH:
+ repeat_month = Note->Entries[i].Number;
+ repeating = true;
+ break;
+ case CAL_REPEAT_FREQUENCY:
+ repeat_frequency = Note->Entries[i].Number;
+ repeating = true;
+ break;
+ case CAL_REPEAT_STARTDATE:
+ repeat_startdate = Note->Entries[i].Date;
+ repeating = true;
+ break;
+ case CAL_REPEAT_STOPDATE:
+ repeat_stopdate = Note->Entries[i].Date;
+ repeating = true;
+ break;
+ }
+ }
+ if (repeating) {
+ printmsg("Repeating : ");
+ if ((repeat_startdate.Day == 0) && (repeat_stopdate.Day == 0)) {
+ printmsg("Forever");
+ } else if (repeat_startdate.Day == 0) {
+ printmsg("Till %s", OSDate(repeat_stopdate));
+ } else if (repeat_stopdate.Day == 0) {
+ printmsg("Since %s", OSDate(repeat_startdate));
+ } else {
+ printmsg("Since %s till %s", OSDate(repeat_startdate), OSDate(repeat_stopdate));
+ }
+ if (repeat_frequency != -1) {
+ if (repeat_frequency == 1) {
+ printmsg (" on each ");
+ } else {
+ printmsg(" on each %d. ", repeat_frequency);
+ }
+ if (repeat_dayofweek > 0) {
+ switch (repeat_dayofweek) {
+ case 1 : printmsg("Monday"); break;
+ case 2 : printmsg("Tuesday"); break;
+ case 3 : printmsg("Wednesday"); break;
+ case 4 : printmsg("Thursday"); break;
+ case 5 : printmsg("Friday"); break;
+ case 6 : printmsg("Saturday"); break;
+ case 7 : printmsg("Sunday"); break;
+ default: printmsg("Bad day!"); break;
+ }
+ if (repeat_weekofmonth > 0) {
+ printmsg(" in %d. week of ", repeat_weekofmonth);
+ } else {
+ printmsg(" in ");
+ }
+ if (repeat_month > 0) {
+ switch(repeat_month) {
+ case 1 : printmsg("January"); break;
+ case 2 : printmsg("February"); break;
+ case 3 : printmsg("March"); break;
+ case 4 : printmsg("April"); break;
+ case 5 : printmsg("May"); break;
+ case 6 : printmsg("June"); break;
+ case 7 : printmsg("July"); break;
+ case 8 : printmsg("August"); break;
+ case 9 : printmsg("September"); break;
+ case 10: printmsg("October"); break;
+ case 11: printmsg("November"); break;
+ case 12: printmsg("December"); break;
+ default: printmsg("Bad month!"); break;
+ }
+ } else {
+ printmsg("each month");
+ }
+ } else if (repeat_day > 0) {
+ printmsg("%d. day of ", repeat_day);
+ if (repeat_month > 0) {
+ switch(repeat_month) {
+ case 1 : printmsg("January"); break;
+ case 2 : printmsg("February"); break;
+ case 3 : printmsg("March"); break;
+ case 4 : printmsg("April"); break;
+ case 5 : printmsg("May"); break;
+ case 6 : printmsg("June"); break;
+ case 7 : printmsg("July"); break;
+ case 8 : printmsg("August"); break;
+ case 9 : printmsg("September"); break;
+ case 10: printmsg("October"); break;
+ case 11: printmsg("November"); break;
+ case 12: printmsg("December"); break;
+ default: printmsg("Bad month!");break;
+ }
+ } else {
+ printmsg("each month");
+ }
+ } else {
+ printmsg("day");
+ }
+ }
+ printf("\n");
+ }
+ if (Note->Type == GSM_CAL_BIRTHDAY) {
+ if (Alarm.Year == 0x00) GSM_GetCurrentDateTime (&Alarm);
+ if (DateTime.Year != 0) {
+ i_age = Alarm.Year - DateTime.Year;
+ if (DateTime.Month < Alarm.Month) i_age++;
+ if (DateTime.Month == Alarm.Month &&
+ DateTime.Day < Alarm.Day) {
+ i_age++;
+ }
+ printmsg("Age : %d %s\n",i_age, (i_age==1)?"year":"years");
+ }
+ }
+ printf("\n");
+}
+
+static void GetCalendar(int argc, char *argv[])
+{
+ GSM_CalendarEntry Note;
+ int start,stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ Note.Location=i;
+ error = Phone->GetCalendar(&s, &Note);
+ if (error == ERR_EMPTY) continue;
+ Print_Error(error);
+ PrintCalendar(&Note);
+ }
+
+ GSM_Terminate();
+}
+
+static void DeleteCalendar(int argc, char *argv[])
+{
+ GSM_CalendarEntry Note;
+ int start,stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ Note.Location=i;
+ error = Phone->DeleteCalendar(&s, &Note);
+ if (error == ERR_EMPTY) continue;
+ Print_Error(error);
+ PrintCalendar(&Note);
+ }
+
+ GSM_Terminate();
+}
+
+
+static void GetAllCalendar(int argc, char *argv[])
+{
+ GSM_CalendarEntry Note;
+ bool refresh = true;
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ GSM_Init(true);
+
+ while (!gshutdown) {
+ error=Phone->GetNextCalendar(&s,&Note,refresh);
+ if (error == ERR_EMPTY) break;
+ PrintCalendar(&Note);
+ Print_Error(error);
+ refresh=false;
+ }
+
+ GSM_Terminate();
+}
+
+static void GetCalendarSettings(int argc, char *argv[])
+{
+ GSM_CalendarSettings settings;
+
+ GSM_Init(true);
+
+ error=Phone->GetCalendarSettings(&s,&settings);
+ Print_Error(error);
+
+ if (settings.AutoDelete == 0) {
+ printmsg("Auto deleting disabled");
+ } else {
+ printmsg("Auto deleting notes after %i day(s)",settings.AutoDelete);
+ }
+ printmsg("\nWeek start on ");
+ switch(settings.StartDay) {
+ case 1: printmsg("Monday"); break;
+ case 6: printmsg("Saturday"); break;
+ case 7: printmsg("Sunday"); break;
+ }
+ printf("\n");
+
+ GSM_Terminate();
+}
+
+static void GetWAPBookmark(int argc, char *argv[])
+{
+ GSM_WAPBookmark bookmark;
+ int start,stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ bookmark.Location=i;
+ error=Phone->GetWAPBookmark(&s,&bookmark);
+ Print_Error(error);
+ printmsg("Name : \"%s\"\n",DecodeUnicodeConsole(bookmark.Title));
+ printmsg("Address : \"%s\"\n",DecodeUnicodeConsole(bookmark.Address));
+ }
+
+ GSM_Terminate();
+}
+
+static void DeleteWAPBookmark(int argc, char *argv[])
+{
+ GSM_WAPBookmark bookmark;
+ int start, stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ bookmark.Location=i;
+ error=Phone->DeleteWAPBookmark(&s, &bookmark);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+static void GetGPRSPoint(int argc, char *argv[])
+{
+ GSM_GPRSAccessPoint point;
+ int start,stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ point.Location=i;
+ error=Phone->GetGPRSAccessPoint(&s,&point);
+ if (error != ERR_EMPTY) {
+ Print_Error(error);
+ printmsg("%i. \"%s\"",point.Location,DecodeUnicodeConsole(point.Name));
+ } else {
+ printmsg("%i. Access point %i",point.Location,point.Location);
+ }
+ if (point.Active) printmsg(" (active)");
+ if (error != ERR_EMPTY) {
+ printmsg("\nAddress : \"%s\"\n\n",DecodeUnicodeConsole(point.URL));
+ } else {
+ printmsg("\n\n");
+ }
+ }
+
+ GSM_Terminate();
+}
+
+static void GetBitmap(int argc, char *argv[])
+{
+ GSM_File File;
+ GSM_MultiBitmap MultiBitmap;
+ int location=0;
+ GSM_AllRingtonesInfo Info;
+
+ if (mystrncasecmp(argv[2],"STARTUP",0)) {
+ MultiBitmap.Bitmap[0].Type=GSM_StartupLogo;
+ } else if (mystrncasecmp(argv[2],"CALLER",0)) {
+ MultiBitmap.Bitmap[0].Type=GSM_CallerGroupLogo;
+ GetStartStop(&location, NULL, 3, argc, argv);
+ if (location>5) {
+ printmsg("Maximal location for caller logo can be 5\n");
+ exit (-1);
+ }
+ } else if (mystrncasecmp(argv[2],"PICTURE",0)) {
+ MultiBitmap.Bitmap[0].Type=GSM_PictureImage;
+ GetStartStop(&location, NULL, 3, argc, argv);
+ } else if (mystrncasecmp(argv[2],"TEXT",0)) {
+ MultiBitmap.Bitmap[0].Type=GSM_WelcomeNote_Text;
+ } else if (mystrncasecmp(argv[2],"DEALER",0)) {
+ MultiBitmap.Bitmap[0].Type=GSM_DealerNote_Text;
+ } else if (mystrncasecmp(argv[2],"OPERATOR",0)) {
+ MultiBitmap.Bitmap[0].Type=GSM_OperatorLogo;
+ } else {
+ printmsg("What type of logo do you want to get (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+ MultiBitmap.Bitmap[0].Location=location;
+
+ GSM_Init(true);
+
+ error=Phone->GetBitmap(&s,&MultiBitmap.Bitmap[0]);
+ Print_Error(error);
+
+ MultiBitmap.Number = 1;
+
+ error=ERR_NONE;
+ switch (MultiBitmap.Bitmap[0].Type) {
+ case GSM_CallerGroupLogo:
+ if (!MultiBitmap.Bitmap[0].DefaultBitmap) GSM_PrintBitmap(stdout,&MultiBitmap.Bitmap[0]);
+ printmsg("Group name : \"%s\"",DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Text));
+ if (MultiBitmap.Bitmap[0].DefaultName) printmsg(" (default)");
+ printf("\n");
+ if (MultiBitmap.Bitmap[0].DefaultRingtone) {
+ printmsg("Ringtone : default\n");
+ } else if (MultiBitmap.Bitmap[0].FileSystemRingtone) {
+ sprintf(File.ID_FullName,"%i",MultiBitmap.Bitmap[0].RingtoneID);
+
+ File.Buffer = NULL;
+ File.Used = 0;
+
+ error = ERR_NONE;
+// while (error == ERR_NONE) {
+ error = Phone->GetFilePart(&s,&File);
+// }
+ if (error != ERR_EMPTY && error != ERR_WRONGCRC) Print_Error(error);
+ error = ERR_NONE;
+
+ printmsg("Ringtone : \"%s\" (file with ID %i)\n",
+ DecodeUnicodeString(File.Name),
+ MultiBitmap.Bitmap[0].RingtoneID);
+ } else {
+ error = Phone->GetRingtonesInfo(&s,&Info);
+ if (error != ERR_NONE) Info.Number = 0;
+ error = ERR_NONE;
+
+ printmsg("Ringtone : ");
+ if (UnicodeLength(GSM_GetRingtoneName(&Info,MultiBitmap.Bitmap[0].RingtoneID))!=0) {
+ printmsg("\"%s\" (ID %i)\n",
+ DecodeUnicodeConsole(GSM_GetRingtoneName(&Info,MultiBitmap.Bitmap[0].RingtoneID)),
+ MultiBitmap.Bitmap[0].RingtoneID);
+ } else {
+ printmsg("ID %i\n",MultiBitmap.Bitmap[0].RingtoneID);
+ }
+ }
+ if (MultiBitmap.Bitmap[0].BitmapEnabled) {
+ printmsg("Bitmap : enabled\n");
+ } else {
+ printmsg("Bitmap : disabled\n");
+ }
+ if (argc>4 && !MultiBitmap.Bitmap[0].DefaultBitmap) error=GSM_SaveBitmapFile(argv[4],&MultiBitmap);
+ break;
+ case GSM_StartupLogo:
+ GSM_PrintBitmap(stdout,&MultiBitmap.Bitmap[0]);
+ if (argc>3) error=GSM_SaveBitmapFile(argv[3],&MultiBitmap);
+ break;
+ case GSM_OperatorLogo:
+ if (strcmp(MultiBitmap.Bitmap[0].NetworkCode,"000 00")!=0) {
+ GSM_PrintBitmap(stdout,&MultiBitmap.Bitmap[0]);
+ if (argc>3) error=GSM_SaveBitmapFile(argv[3],&MultiBitmap);
+ } else {
+ printmsg("No operator logo in phone\n");
+ }
+ break;
+ case GSM_PictureImage:
+ GSM_PrintBitmap(stdout,&MultiBitmap.Bitmap[0]);
+ printmsg("Text : \"%s\"\n",DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Text));
+ printmsg("Sender : \"%s\"\n",DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Sender));
+ if (argc>4) error=GSM_SaveBitmapFile(argv[4],&MultiBitmap);
+ break;
+ case GSM_WelcomeNote_Text:
+ printmsg("Welcome note text is \"%s\"\n",DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Text));
+ break;
+ case GSM_DealerNote_Text:
+ printmsg("Dealer note text is \"%s\"\n",DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Text));
+ break;
+ default:
+ break;
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void SetBitmap(int argc, char *argv[])
+{
+ GSM_Bitmap Bitmap, NewBitmap;
+ GSM_MultiBitmap MultiBitmap;
+ GSM_NetworkInfo NetInfo;
+ bool init = true;
+
+ if (mystrncasecmp(argv[2],"STARTUP",0)) {
+ if (argc<4) {
+ printmsg("More arguments required\n");
+ exit(-1);
+ }
+ MultiBitmap.Bitmap[0].Type=GSM_StartupLogo;
+ MultiBitmap.Bitmap[0].Location=1;
+ if (!strcmp(argv[3],"1")) MultiBitmap.Bitmap[0].Location = 2;
+ if (!strcmp(argv[3],"2")) MultiBitmap.Bitmap[0].Location = 3;
+ if (!strcmp(argv[3],"3")) MultiBitmap.Bitmap[0].Location = 4;
+ if (MultiBitmap.Bitmap[0].Location == 1) {
+ error=GSM_ReadBitmapFile(argv[3],&MultiBitmap);
+ Print_Error(error);
+ }
+ memcpy(&Bitmap,&MultiBitmap.Bitmap[0],sizeof(GSM_Bitmap));
+ } else if (mystrncasecmp(argv[2],"TEXT",0)) {
+ if (argc<4) {
+ printmsg("More arguments required\n");
+ exit(-1);
+ }
+ Bitmap.Type=GSM_WelcomeNote_Text;
+ EncodeUnicode(Bitmap.Text,argv[3],strlen(argv[3]));
+ } else if (mystrncasecmp(argv[2],"DEALER",0)) {
+ if (argc<4) {
+ printmsg("More arguments required\n");
+ exit(-1);
+ }
+ Bitmap.Type=GSM_DealerNote_Text;
+ EncodeUnicode(Bitmap.Text,argv[3],strlen(argv[3]));
+ } else if (mystrncasecmp(argv[2],"CALLER",0)) {
+ if (argc<4) {
+ printmsg("More arguments required\n");
+ exit(-1);
+ }
+ GetStartStop(&i, NULL, 3, argc, argv);
+ if (i>5 && i!=255) {
+ printmsg("Maximal location for caller logo can be 5\n");
+ exit (-1);
+ }
+ MultiBitmap.Bitmap[0].Type = GSM_CallerGroupLogo;
+ MultiBitmap.Bitmap[0].Location = i;
+ if (argc>4) {
+ error=GSM_ReadBitmapFile(argv[4],&MultiBitmap);
+ Print_Error(error);
+ }
+ memcpy(&Bitmap,&MultiBitmap.Bitmap[0],sizeof(GSM_Bitmap));
+ if (i!=255) {
+ GSM_Init(true);
+ init = false;
+ NewBitmap.Type = GSM_CallerGroupLogo;
+ NewBitmap.Location = i;
+ error=Phone->GetBitmap(&s,&NewBitmap);
+ Print_Error(error);
+ Bitmap.RingtoneID = NewBitmap.RingtoneID;
+ Bitmap.DefaultRingtone = NewBitmap.DefaultRingtone;
+ Bitmap.FileSystemRingtone = false;
+ CopyUnicodeString(Bitmap.Text, NewBitmap.Text);
+ Bitmap.DefaultName = NewBitmap.DefaultName;
+ }
+ } else if (mystrncasecmp(argv[2],"PICTURE",0)) {
+ if (argc<5) {
+ printmsg("More arguments required\n");
+ exit(-1);
+ }
+ MultiBitmap.Bitmap[0].Type = GSM_PictureImage;
+ MultiBitmap.Bitmap[0].Location = atoi(argv[4]);
+ error=GSM_ReadBitmapFile(argv[3],&MultiBitmap);
+ Print_Error(error);
+ memcpy(&Bitmap,&MultiBitmap.Bitmap[0],sizeof(GSM_Bitmap));
+ Bitmap.Text[0]=0;
+ Bitmap.Text[1]=0;
+ if (argc == 6) EncodeUnicode(Bitmap.Text,argv[5],strlen(argv[5]));
+ Bitmap.Sender[0]=0;
+ Bitmap.Sender[1]=0;
+ } else if (mystrncasecmp(argv[2],"COLOUROPERATOR",0)) {
+ Bitmap.Type = GSM_ColourOperatorLogo_ID;
+ strcpy(Bitmap.NetworkCode,"000 00");
+ if (argc > 3) {
+ Bitmap.ID = atoi(argv[3]);
+ if (argc>4) {
+ strncpy(Bitmap.NetworkCode,argv[4],6);
+ } else {
+ GSM_Init(true);
+ init = false;
+ error=Phone->GetNetworkInfo(&s,&NetInfo);
+ Print_Error(error);
+ strcpy(Bitmap.NetworkCode,NetInfo.NetworkCode);
+ }
+ }
+ } else if (mystrncasecmp(argv[2],"COLOURSTARTUP",0)) {
+ Bitmap.Type = GSM_ColourStartupLogo_ID;
+ Bitmap.Location = 0;
+ if (argc > 3) {
+ Bitmap.Location = 1;
+ Bitmap.ID = atoi(argv[3]);
+ }
+ } else if (mystrncasecmp(argv[2],"WALLPAPER",0)) {
+ Bitmap.Type = GSM_ColourWallPaper_ID;
+ Bitmap.ID = 0;
+ if (argc > 3) Bitmap.ID = atoi(argv[3]);
+ } else if (mystrncasecmp(argv[2],"OPERATOR",0)) {
+ MultiBitmap.Bitmap[0].Type = GSM_OperatorLogo;
+ MultiBitmap.Bitmap[0].Location = 1;
+ strcpy(MultiBitmap.Bitmap[0].NetworkCode,"000 00");
+ if (argc>3) {
+ error=GSM_ReadBitmapFile(argv[3],&MultiBitmap);
+ Print_Error(error);
+ if (argc>4) {
+ strncpy(MultiBitmap.Bitmap[0].NetworkCode,argv[4],6);
+ } else {
+ GSM_Init(true);
+ init = false;
+ error=Phone->GetNetworkInfo(&s,&NetInfo);
+ Print_Error(error);
+ strcpy(MultiBitmap.Bitmap[0].NetworkCode,NetInfo.NetworkCode);
+ }
+ }
+ memcpy(&Bitmap,&MultiBitmap.Bitmap[0],sizeof(GSM_Bitmap));
+ } else {
+ printmsg("What type of logo do you want to set (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ if (init) GSM_Init(true);
+
+ error=Phone->SetBitmap(&s,&Bitmap);
+ Print_Error(error);
+
+#ifdef GSM_ENABLE_BEEP
+ GSM_PhoneBeep();
+#endif
+
+ GSM_Terminate();
+}
+
+static void SetRingtone(int argc, char *argv[])
+{
+ GSM_Ringtone ringtone;
+ int i,nextlong=0;
+
+ ringtone.Format = 0;
+ error=GSM_ReadRingtoneFile(argv[2],&ringtone);
+ Print_Error(error);
+ ringtone.Location = 255;
+ for (i=3;i<argc;i++) {
+ switch (nextlong) {
+ case 0:
+ if (mystrncasecmp(argv[i],"-scale",0)) {
+ ringtone.NoteTone.AllNotesScale = true;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-location",0)) {
+ nextlong = 1;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-name",0)) {
+ nextlong = 2;
+ break;
+ }
+ printmsg("Unknown parameter \"%s\"",argv[i]);
+ exit(-1);
+ case 1:
+ ringtone.Location=atoi(argv[i]);
+ nextlong = 0;
+ break;
+ case 2:
+ EncodeUnicode(ringtone.Name,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong!=0) {
+ printmsg("Parameter missed...\n");
+ exit(-1);
+ }
+ if (ringtone.Location==0) {
+ printmsg("ERROR: enumerate locations from 1\n");
+ exit (-1);
+ }
+
+ GSM_Init(true);
+ error=Phone->SetRingtone(&s, &ringtone, &i);
+ Print_Error(error);
+#ifdef GSM_ENABLE_BEEP
+ GSM_PhoneBeep();
+#endif
+ GSM_Terminate();
+}
+
+static void DisplaySMSFrame(GSM_SMSMessage *SMS)
+{
+ GSM_Error error;
+ int i, length, current = 0;
+ unsigned char req[1000], buffer[1000], hexreq[1000];
+#ifdef OSCAR
+ unsigned char hexmsg[1000], hexudh[1000];
+#endif
+ error=PHONE_EncodeSMSFrame(&s,SMS,buffer,PHONE_SMSSubmit,&length,true);
+ if (error != ERR_NONE) {
+ printmsg("Error\n");
+ exit(-1);
+ }
+ length = length - PHONE_SMSSubmit.Text;
+#ifdef OSCAR
+ for(i=SMS->UDH.Length;i<length;i++) {
+ req[i-SMS->UDH.Length]=buffer[PHONE_SMSSubmit.Text+i];
+ }
+ EncodeHexBin(hexmsg, req, length-SMS->UDH.Length);
+
+ for(i=0;i<SMS->UDH.Length;i++) {
+ req[i]=buffer[PHONE_SMSSubmit.Text+i];
+ }
+ EncodeHexBin(hexudh, req, SMS->UDH.Length);
+
+ printf("msg:%s nb:%i udh:%s\n",
+ hexmsg,
+ (buffer[PHONE_SMSSubmit.TPUDL]-SMS->UDH.Length)*8,
+ hexudh);
+#else
+ for (i=0;i<buffer[PHONE_SMSSubmit.SMSCNumber]+1;i++) {
+ req[current++]=buffer[PHONE_SMSSubmit.SMSCNumber+i];
+ }
+ req[current++]=buffer[PHONE_SMSSubmit.firstbyte];
+ req[current++]=buffer[PHONE_SMSSubmit.TPMR];
+ for (i=0;i<((buffer[PHONE_SMSSubmit.Number]+1)/2+1)+1;i++) {
+ req[current++]=buffer[PHONE_SMSSubmit.Number+i];
+ }
+ req[current++]=buffer[PHONE_SMSSubmit.TPPID];
+ req[current++]=buffer[PHONE_SMSSubmit.TPDCS];
+ req[current++]=buffer[PHONE_SMSSubmit.TPVP];
+ req[current++]=buffer[PHONE_SMSSubmit.TPUDL];
+ for(i=0;i<length;i++) req[current++]=buffer[PHONE_SMSSubmit.Text+i];
+ EncodeHexBin(hexreq, req, current);
+ printmsg("%s\n\n",hexreq);
+#endif
+}
+
+#define SEND_SAVE_SMS_BUFFER_SIZE 10000
+
+static GSM_Error SMSStatus;
+//#if 0
+static void SendSMSStatus (char *Device, int status, int MessageReference)
+{
+ dbgprintf("Sent SMS on device: \"%s\"\n",Device);
+ if (status==0) {
+ printmsg("..OK");
+ SMSStatus = ERR_NONE;
+ } else {
+ printmsg("..error %i",status);
+ SMSStatus = ERR_UNKNOWN;
+ }
+ printmsg(", message reference=%02x\n",MessageReference);
+}
+
+static void SendSaveDisplaySMS(int argc, char *argv[])
+{
+#ifdef GSM_ENABLE_BACKUP
+ GSM_Backup Backup;
+#endif
+ int i,j,z,FramesNum = 0;
+ int Protected = 0;
+ GSM_SMSFolders folders;
+ GSM_MultiSMSMessage sms;
+ GSM_Ringtone ringtone[MAX_MULTI_SMS];
+ GSM_MultiBitmap bitmap[MAX_MULTI_SMS],bitmap2;
+ GSM_MultiPartSMSInfo SMSInfo;
+ GSM_NetworkInfo NetInfo;
+ GSM_MMSIndicator MMSInfo;
+ FILE *ReplaceFile,*f;
+ char ReplaceBuffer2 [200],ReplaceBuffer[200];
+ char InputBuffer [SEND_SAVE_SMS_BUFFER_SIZE/2+1];
+ char Buffer [MAX_MULTI_SMS][SEND_SAVE_SMS_BUFFER_SIZE];
+ char Sender [(GSM_MAX_NUMBER_LENGTH+1)*2];
+ char Name [(GSM_MAX_NUMBER_LENGTH+1)*2];
+ char SMSC [(GSM_MAX_NUMBER_LENGTH+1)*2];
+ int startarg = 0;
+ int chars_read = 0;
+ int nextlong = 0;
+ bool ReplyViaSameSMSC = false;
+ int SMSCSet = 1;
+ int MaxSMS = -1;
+ bool EMS16Bit = false;
+ bool SendSaved = false;
+
+ /* Parameters required only during saving */
+ int Folder = 1; /*Inbox by default */
+ GSM_SMS_State State = SMS_Sent;
+
+ /* Required only during sending */
+ GSM_SMSValidity Validity;
+ GSM_SMSC PhoneSMSC;
+ bool DeliveryReport = false;
+
+ ReplaceBuffer[0] = 0;
+ ReplaceBuffer[1] = 0;
+ GSM_ClearMultiPartSMSInfo(&SMSInfo);
+ SMSInfo.ReplaceMessage = 0;
+ SMSInfo.EntriesNum = 1;
+
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender,"Gammu",5);
+ Name[0] = 0;
+ Name[1] = 0;
+ startarg = 0;
+ } else {
+ EncodeUnicode(Sender,argv[3],strlen(argv[3]));
+ startarg = 1;
+ Validity.Format = 0;
+ }
+ if (mystrncasecmp(argv[1],"--sendsmsdsms",0)) startarg=startarg+2;
+
+ if (mystrncasecmp(argv[2],"TEXT",0)) {
+ chars_read = fread(InputBuffer, 1, SEND_SAVE_SMS_BUFFER_SIZE/2, stdin);
+ if (chars_read == 0) printmsg("Warning: 0 chars read !\n");
+ InputBuffer[chars_read] = 0x00;
+ InputBuffer[chars_read+1] = 0x00;
+ EncodeUnicode(Buffer[0],InputBuffer,strlen(InputBuffer));
+ SMSInfo.Entries[0].Buffer = Buffer[0];
+ SMSInfo.Entries[0].ID = SMS_Text;
+ SMSInfo.UnicodeCoding = false;
+ startarg += 3;
+ } else if (mystrncasecmp(argv[2],"SMSTEMPLATE",0)) {
+ SMSInfo.UnicodeCoding = false;
+ SMSInfo.EntriesNum = 1;
+ Buffer[0][0] = 0x00;
+ Buffer[0][1] = 0x00;
+ SMSInfo.Entries[0].Buffer = Buffer[0];
+ SMSInfo.Entries[0].ID = SMS_AlcatelSMSTemplateName;
+ startarg += 3;
+ } else if (mystrncasecmp(argv[2],"EMS",0)) {
+ SMSInfo.UnicodeCoding = false;
+ SMSInfo.EntriesNum = 0;
+ startarg += 3;
+ } else if (mystrncasecmp(argv[2],"MMSINDICATOR",0)) {
+ if (argc<6+startarg) {
+ printmsg("Where is ringtone filename ?\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_MMSIndicatorLong;
+ SMSInfo.Entries[0].MMSIndicator = &MMSInfo;
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender,"MMS Info",8);
+ }
+ strcpy(MMSInfo.Address, argv[3+startarg]);
+ strcpy(MMSInfo.Title, argv[4+startarg]);
+ strcpy(MMSInfo.Sender, argv[5+startarg]);
+ startarg += 6;
+ } else if (mystrncasecmp(argv[2],"RINGTONE",0)) {
+ if (argc<4+startarg) {
+ printmsg("Where is ringtone filename ?\n");
+ exit(-1);
+ }
+ ringtone[0].Format=RING_NOTETONE;
+ error=GSM_ReadRingtoneFile(argv[3+startarg],&ringtone[0]);
+ Print_Error(error);
+ SMSInfo.Entries[0].ID = SMS_NokiaRingtone;
+ SMSInfo.Entries[0].Ringtone = &ringtone[0];
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ CopyUnicodeString(Sender, ringtone[0].Name);
+ EncodeUnicode(Name,"Ringtone ",9);
+ CopyUnicodeString(Name+9*2, ringtone[0].Name);
+ }
+ startarg += 4;
+ } else if (mystrncasecmp(argv[2],"OPERATOR",0)) {
+ if (argc<4+startarg) {
+ printmsg("Where is logo filename ?\n");
+ exit(-1);
+ }
+ bitmap[0].Bitmap[0].Type=GSM_OperatorLogo;
+ error=GSM_ReadBitmapFile(argv[3+startarg],&bitmap[0]);
+ Print_Error(error);
+ strcpy(bitmap[0].Bitmap[0].NetworkCode,"000 00");
+ SMSInfo.Entries[0].ID = SMS_NokiaOperatorLogo;
+ SMSInfo.Entries[0].Bitmap = &bitmap[0];
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "OpLogo",6);
+ EncodeUnicode(Name,"OpLogo ",7);
+ }
+ startarg += 4;
+ } else if (mystrncasecmp(argv[2],"CALLER",0)) {
+ if (argc<4+startarg) {
+ printmsg("Where is logo filename ?\n");
+ exit(-1);
+ }
+ bitmap[0].Bitmap[0].Type=GSM_CallerGroupLogo;
+ error=GSM_ReadBitmapFile(argv[3+startarg],&bitmap[0]);
+ Print_Error(error);
+ SMSInfo.Entries[0].ID = SMS_NokiaCallerLogo;
+ SMSInfo.Entries[0].Bitmap = &bitmap[0];
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "Caller",6);
+ }
+ startarg += 4;
+ } else if (mystrncasecmp(argv[2],"ANIMATION",0)) {
+ SMSInfo.UnicodeCoding = false;
+ SMSInfo.EntriesNum = 1;
+ if (argc<4+startarg) {
+ printmsg("Where is number of frames ?\n");
+ exit(-1);
+ }
+ bitmap[0].Number = 0;
+ i = 1;
+ while (1) {
+ bitmap2.Bitmap[0].Type=GSM_StartupLogo;
+ error=GSM_ReadBitmapFile(argv[3+startarg+i],&bitmap2);
+ Print_Error(error);
+ for (j=0;j<bitmap2.Number;j++) {
+ if (bitmap[0].Number == atoi(argv[3+startarg])) break;
+ memcpy(&bitmap[0].Bitmap[bitmap[0].Number],&bitmap2.Bitmap[j],sizeof(GSM_Bitmap));
+ bitmap[0].Number++;
+ }
+ if (bitmap[0].Number == atoi(argv[3+startarg])) break;
+ i++;
+ }
+ SMSInfo.Entries[0].ID = SMS_AlcatelMonoAnimationLong;
+ SMSInfo.Entries[0].Bitmap = &bitmap[0];
+ bitmap[0].Bitmap[0].Text[0] = 0;
+ bitmap[0].Bitmap[0].Text[1] = 0;
+ startarg += 4 + atoi(argv[3+startarg]);
+ } else if (mystrncasecmp(argv[2],"PICTURE",0)) {
+ if (argc<4+startarg) {
+ printmsg("Where is logo filename ?\n");
+ exit(-1);
+ }
+ bitmap[0].Bitmap[0].Type=GSM_PictureImage;
+ error=GSM_ReadBitmapFile(argv[3+startarg],&bitmap[0]);
+ printmsg("File \"%s\"\n",argv[3+startarg]);
+ Print_Error(error);
+ SMSInfo.Entries[0].ID = SMS_NokiaPictureImageLong;
+ SMSInfo.Entries[0].Bitmap = &bitmap[0];
+ SMSInfo.UnicodeCoding = false;
+ bitmap[0].Bitmap[0].Text[0] = 0;
+ bitmap[0].Bitmap[0].Text[1] = 0;
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "Picture",7);
+ EncodeUnicode(Name,"Picture Image",13);
+ }
+ startarg += 4;
+#ifdef GSM_ENABLE_BACKUP
+ } else if (mystrncasecmp(argv[2],"BOOKMARK",0)) {
+ if (argc<5+startarg) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.WAPBookmark[i]!=NULL) {
+ if (i == atoi(argv[4+startarg])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[4+startarg])-1) {
+ printmsg("Bookmark not found in file\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaWAPBookmarkLong;
+ SMSInfo.Entries[0].Bookmark = Backup.WAPBookmark[i];
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "Bookmark",8);
+ EncodeUnicode(Name,"WAP Bookmark",12);
+ }
+ startarg += 5;
+ } else if (mystrncasecmp(argv[2],"WAPSETTINGS",0)) {
+ if (argc<6+startarg) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.WAPSettings[i]!=NULL) {
+ if (i == atoi(argv[4+startarg])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[4+startarg])-1) {
+ printmsg("WAP settings not found in file\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].Settings = NULL;
+ for (j=0;j<Backup.WAPSettings[i]->Number;j++) {
+ switch (Backup.WAPSettings[i]->Settings[j].Bearer) {
+ case WAPSETTINGS_BEARER_GPRS:
+ if (mystrncasecmp(argv[5+startarg],"GPRS",0)) {
+ SMSInfo.Entries[0].Settings = &Backup.WAPSettings[i]->Settings[j];
+ break;
+ }
+ case WAPSETTINGS_BEARER_DATA:
+ if (mystrncasecmp(argv[5+startarg],"DATA",0)) {
+ SMSInfo.Entries[0].Settings = &Backup.WAPSettings[i]->Settings[j];
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ if (SMSInfo.Entries[0].Settings == NULL) {
+ printmsg("Sorry. For now there is only support for GPRS or DATA bearers end\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaWAPSettingsLong;
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "Settings",8);
+ EncodeUnicode(Name,"WAP Settings",12);
+ }
+ startarg += 6;
+ } else if (mystrncasecmp(argv[2],"MMSSETTINGS",0)) {
+ if (argc<5+startarg) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.MMSSettings[i]!=NULL) {
+ if (i == atoi(argv[4+startarg])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[4+startarg])-1) {
+ printmsg("MMS settings not found in file\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].Settings = NULL;
+ for (j=0;j<Backup.MMSSettings[i]->Number;j++) {
+ switch (Backup.MMSSettings[i]->Settings[j].Bearer) {
+ case WAPSETTINGS_BEARER_GPRS:
+ SMSInfo.Entries[0].Settings = &Backup.MMSSettings[i]->Settings[j];
+ break;
+ default:
+ break;
+ }
+ }
+ if (SMSInfo.Entries[0].Settings == NULL) {
+ printmsg("Sorry. No GPRS bearer found in MMS settings\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaMMSSettingsLong;
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "Settings",8);
+ EncodeUnicode(Name,"MMS Settings",12);
+ }
+ startarg += 5;
+ } else if (mystrncasecmp(argv[2],"CALENDAR",0)) {
+ if (argc<5+startarg) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.Calendar[i]!=NULL) {
+ if (i == atoi(argv[4+startarg])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[4+startarg])-1) {
+ printmsg("Calendar note not found in file\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaVCALENDAR10Long;
+ SMSInfo.Entries[0].Calendar = Backup.Calendar[i];
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "Calendar",8);
+ }
+ startarg += 5;
+ } else if (mystrncasecmp(argv[2],"TODO",0)) {
+ if (argc<5+startarg) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.ToDo[i]!=NULL) {
+ if (i == atoi(argv[4+startarg])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[4+startarg])-1) {
+ printmsg("ToDo note not found in file\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaVTODOLong;
+ SMSInfo.Entries[0].ToDo = Backup.ToDo[i];
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "ToDo",8);
+ }
+ startarg += 5;
+ } else if (mystrncasecmp(argv[2],"VCARD10",0) || mystrncasecmp(argv[2],"VCARD21",0)) {
+ if (argc<6+startarg) {
+ printmsg("Where is backup filename and location and memory type ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
+ Print_Error(error);
+ i = 0;
+ if (mystrncasecmp(argv[4+startarg],"SM",0)) {
+ while (Backup.SIMPhonebook[i]!=NULL) {
+ if (i == atoi(argv[5+startarg])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[5+startarg])-1) {
+ printmsg("Phonebook entry not found in file\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].Phonebook = Backup.SIMPhonebook[i];
+ } else if (mystrncasecmp(argv[4+startarg],"ME",0)) {
+ while (Backup.PhonePhonebook[i]!=NULL) {
+ if (i == atoi(argv[5+startarg])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[5+startarg])-1) {
+ printmsg("Phonebook entry not found in file\n");
+ exit(-1);
+ }
+ SMSInfo.Entries[0].Phonebook = Backup.PhonePhonebook[i];
+ } else {
+ printmsg("Unknown memory type: \"%s\"\n",argv[4+startarg]);
+ exit(-1);
+ }
+ if (mystrncasecmp(argv[2],"VCARD10",0)) {
+ SMSInfo.Entries[0].ID = SMS_VCARD10Long;
+ } else {
+ SMSInfo.Entries[0].ID = SMS_VCARD21Long;
+ }
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "VCARD",5);
+ EncodeUnicode(Name, "Phonebook entry",15);
+ }
+ startarg += 6;
+#endif
+ } else if (mystrncasecmp(argv[2],"PROFILE",0)) {
+ SMSInfo.Entries[0].ID = SMS_NokiaProfileLong;
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "Profile",7);
+ }
+ startarg += 3;
+ } else {
+ printmsg("What format of sms (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ for (i=startarg;i<argc;i++) {
+ switch (nextlong) {
+ case 0:
+ if (mystrncasecmp(argv[1],"--savesms",0) || SendSaved) {
+ if (mystrncasecmp(argv[i],"-folder",0)) {
+ nextlong=1;
+ continue;
+ }
+ }
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ if (mystrncasecmp(argv[i],"-unread",0)) {
+ State = SMS_UnRead;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-read",0)) {
+ State = SMS_Read;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-unsent",0)) {
+ State = SMS_UnSent;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-sent",0)) {
+ State = SMS_Sent;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-sender",0)) {
+ nextlong=2;
+ continue;
+ }
+ } else {
+ if (mystrncasecmp(argv[i],"-save",0)) {
+ SendSaved=true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-report",0)) {
+ DeliveryReport=true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-validity",0)) {
+ nextlong=10;
+ continue;
+ }
+ }
+ if (mystrncasecmp(argv[i],"-smscset",0)) {
+ nextlong=3;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-smscnumber",0)) {
+ nextlong=4;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-protected",0)) {
+ nextlong=19;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-reply",0)) {
+ ReplyViaSameSMSC=true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-maxsms",0)) {
+ nextlong=21;
+ continue;
+ }
+ if (mystrncasecmp(argv[2],"RINGTONE",0)) {
+ if (mystrncasecmp(argv[i],"-long",0)) {
+ SMSInfo.Entries[0].ID = SMS_NokiaRingtoneLong;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-scale",0)) {
+ ringtone[0].NoteTone.AllNotesScale=true;
+ break;
+ }
+ }
+ if (mystrncasecmp(argv[2],"TEXT",0)) {
+ if (mystrncasecmp(argv[i],"-inputunicode",0)) {
+ ReadUnicodeFile(Buffer[0],InputBuffer);
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-16bit",0)) {
+ if (SMSInfo.Entries[0].ID == SMS_ConcatenatedTextLong) SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong16bit;
+ if (SMSInfo.Entries[0].ID == SMS_ConcatenatedAutoTextLong) SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong16bit;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-flash",0)) {
+ SMSInfo.Class = 0;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-len",0)) {
+ nextlong = 5;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-autolen",0)) {
+ nextlong = 5;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-unicode",0)) {
+ SMSInfo.UnicodeCoding = true;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-enablevoice",0)) {
+ SMSInfo.Entries[0].ID = SMS_EnableVoice;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-disablevoice",0)) {
+ SMSInfo.Entries[0].ID = SMS_DisableVoice;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-enablefax",0)) {
+ SMSInfo.Entries[0].ID = SMS_EnableFax;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-disablefax",0)) {
+ SMSInfo.Entries[0].ID = SMS_DisableFax;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-enableemail",0)) {
+ SMSInfo.Entries[0].ID = SMS_EnableEmail;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-disableemail",0)) {
+ SMSInfo.Entries[0].ID = SMS_DisableEmail;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-voidsms",0)) {
+ SMSInfo.Entries[0].ID = SMS_VoidSMS;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-replacemessages",0) &&
+ SMSInfo.Entries[0].ID != SMS_ConcatenatedTextLong) {
+ nextlong = 8;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-replacefile",0)) {
+ nextlong = 9;
+ continue;
+ }
+ }
+ if (mystrncasecmp(argv[2],"PICTURE",0)) {
+ if (mystrncasecmp(argv[i],"-text",0)) {
+ nextlong = 6;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-unicode",0)) {
+ SMSInfo.UnicodeCoding = true;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-alcatelbmmi",0)) {
+ bitmap[0].Bitmap[0].Type=GSM_StartupLogo;
+ error=GSM_ReadBitmapFile(argv[startarg-1],&bitmap[0]);
+ Print_Error(error);
+ SMSInfo.UnicodeCoding = true;
+ SMSInfo.Entries[0].ID = SMS_AlcatelMonoBitmapLong;
+ break;
+ }
+ break;
+ }
+ if (mystrncasecmp(argv[2],"VCARD10",0)) {
+ if (mystrncasecmp(argv[i],"-nokia",0)) {
+ SMSInfo.Entries[0].ID = SMS_NokiaVCARD10Long;
+ break;
+ }
+ break;
+ }
+ if (mystrncasecmp(argv[2],"VCARD21",0)) {
+ if (mystrncasecmp(argv[i],"-nokia",0)) {
+ SMSInfo.Entries[0].ID = SMS_NokiaVCARD21Long;
+ break;
+ }
+ break;
+ }
+ if (mystrncasecmp(argv[2],"PROFILE",0)) {
+ if (mystrncasecmp(argv[i],"-name",0)) {
+ nextlong = 22;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-ringtone",0)) {
+ nextlong = 23;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-bitmap",0)) {
+ nextlong = 24;
+ break;
+ }
+ }
+ if (mystrncasecmp(argv[2],"SMSTEMPLATE",0)) {
+ if (mystrncasecmp(argv[i],"-unicode",0)) {
+ SMSInfo.UnicodeCoding = true;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-text",0)) {
+ nextlong = 11;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-unicodefiletext",0)) {
+ nextlong = 18;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-defsound",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedSound;
+ nextlong = 12;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-defanimation",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedAnimation;
+ nextlong = 12;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-tone10",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-tone10long",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10Long;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-tone12",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-tone12long",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12Long;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-toneSE",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSound;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-toneSElong",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSoundLong;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-variablebitmap",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmap;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-variablebitmaplong",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmapLong;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-animation",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSAnimation;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ bitmap[SMSInfo.EntriesNum].Number = 0;
+ nextlong = 16;
+ break;
+ }
+ }
+ if (mystrncasecmp(argv[2],"EMS",0)) {
+ if (mystrncasecmp(argv[i],"-unicode",0)) {
+ SMSInfo.UnicodeCoding = true;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-16bit",0)) {
+ EMS16Bit = true;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-format",0)) {
+ nextlong = 20;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-text",0)) {
+ nextlong = 11;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-unicodefiletext",0)) {
+ nextlong = 18;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-defsound",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedSound;
+ nextlong = 12;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-defanimation",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedAnimation;
+ nextlong = 12;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-tone10",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-tone10long",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10Long;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-tone12",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-tone12long",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12Long;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-toneSE",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSound;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-toneSElong",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSoundLong;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-fixedbitmap",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSFixedBitmap;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-variablebitmap",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmap;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-variablebitmaplong",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmapLong;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-animation",0)) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSAnimation;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
+ Protected --;
+ }
+ bitmap[SMSInfo.EntriesNum].Number = 0;
+ nextlong = 16;
+ break;
+ }
+ }
+ if (mystrncasecmp(argv[2],"OPERATOR",0)) {
+ if (mystrncasecmp(argv[i],"-netcode",0)) {
+ nextlong = 7;
+ break;
+ }
+ if (mystrncasecmp(argv[i],"-biglogo",0)) {
+ SMSInfo.Entries[0].ID = SMS_NokiaOperatorLogoLong;
+ break;
+ }
+ break;
+ }
+ printmsg("Unknown parameter (\"%s\")\n",argv[i]);
+ exit(-1);
+ break;
+ case 1: /* SMS folder - only during saving SMS */
+ Folder = atoi(argv[i]);
+ nextlong = 0;
+ break;
+ case 2: /* Sender number - only during saving SMS */
+ EncodeUnicode(Sender,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ case 3: /* SMSC set number */
+ SMSCSet = atoi(argv[i]);
+ nextlong = 0;
+ break;
+ case 4: /* Number of SMSC */
+ EncodeUnicode(SMSC,argv[i],strlen(argv[i]));
+ SMSCSet = 0;
+ nextlong = 0;
+ break;
+ case 5: /* Length of text SMS */
+ if (atoi(argv[i])<chars_read)
+ {
+ Buffer[0][atoi(argv[i])*2] = 0x00;
+ Buffer[0][atoi(argv[i])*2+1] = 0x00;
+ }
+ SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong;
+ if (mystrncasecmp(argv[i-1],"-autolen",0)) SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong;
+ nextlong = 0;
+ break;
+ case 6: /* Picture Images - text */
+ EncodeUnicode(bitmap[0].Bitmap[0].Text,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ case 7: /* Operator Logo - network code */
+ strncpy(bitmap[0].Bitmap[0].NetworkCode,argv[i],7);
+ if (!strcmp(DecodeUnicodeConsole(GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode)),"unknown")) {
+ printmsg("Unknown GSM network code (\"%s\")\n",argv[i]);
+ exit(-1);
+ }
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "OpLogo",6);
+ EncodeUnicode(Sender+6*2,bitmap[0].Bitmap[0].NetworkCode,3);
+ EncodeUnicode(Sender+6*2+3*2,bitmap[0].Bitmap[0].NetworkCode+4,2);
+ if (UnicodeLength(GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode))<GSM_MAX_SMS_NAME_LENGTH-7) {
+ EncodeUnicode(Name,"OpLogo ",7);
+ CopyUnicodeString(Name+7*2,GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode));
+ } else {
+ CopyUnicodeString(Name,Sender);
+ }
+ }
+ nextlong = 0;
+ break;
+ case 8:/* Reject duplicates ID */
+ SMSInfo.ReplaceMessage = atoi(argv[i]);
+ if (SMSInfo.ReplaceMessage < 1 || SMSInfo.ReplaceMessage > 7) {
+ printmsg("You have to give number between 1 and 7 (\"%s\")\n",argv[i]);
+ exit(-1);
+ }
+ nextlong = 0;
+ break;
+ case 9:/* Replace file for text SMS */
+ ReplaceFile = fopen(argv[i], "rb");
+ if (ReplaceFile == NULL) Print_Error(ERR_CANTOPENFILE);
+ memset(ReplaceBuffer,0,sizeof(ReplaceBuffer));
+ fread(ReplaceBuffer,1,sizeof(ReplaceBuffer),ReplaceFile);
+ fclose(ReplaceFile);
+ ReadUnicodeFile(ReplaceBuffer2,ReplaceBuffer);
+ for(j=0;j<(int)(UnicodeLength(Buffer[0]));j++) {
+ for (z=0;z<(int)(UnicodeLength(ReplaceBuffer2)/2);z++) {
+ if (ReplaceBuffer2[z*4] == Buffer[0][j] &&
+ ReplaceBuffer2[z*4+1] == Buffer[0][j+1]) {
+ Buffer[0][j] = ReplaceBuffer2[z*4+2];
+ Buffer[0][j+1] = ReplaceBuffer2[z*4+3];
+ break;
+ }
+ }
+ }
+ nextlong = 0;
+ break;
+ case 10:
+ Validity.Format = SMS_Validity_RelativeFormat;
+ if (mystrncasecmp(argv[i],"HOUR",0)) Validity.Relative = SMS_VALID_1_Hour;
+ else if (mystrncasecmp(argv[i],"6HOURS",0)) Validity.Relative = SMS_VALID_6_Hours;
+ else if (mystrncasecmp(argv[i],"DAY",0)) Validity.Relative = SMS_VALID_1_Day;
+ else if (mystrncasecmp(argv[i],"3DAYS",0)) Validity.Relative = SMS_VALID_3_Days;
+ else if (mystrncasecmp(argv[i],"WEEK",0)) Validity.Relative = SMS_VALID_1_Week;
+ else if (mystrncasecmp(argv[i],"MAX",0)) Validity.Relative = SMS_VALID_Max_Time;
+ else {
+ printmsg("Unknown validity string (\"%s\")\n",argv[i]);
+ exit(-1);
+ }
+ nextlong = 0;
+ break;
+ case 11:/* EMS text from parameter */
+ EncodeUnicode(Buffer[SMSInfo.EntriesNum],argv[i],strlen(argv[i]));
+ dbgprintf("buffer is \"%s\"\n",DecodeUnicodeConsole(Buffer[SMSInfo.EntriesNum]));
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_ConcatenatedTextLong;
+ SMSInfo.Entries[SMSInfo.EntriesNum].Buffer = Buffer[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 12:/* EMS predefined sound/animation number */
+ SMSInfo.Entries[SMSInfo.EntriesNum].Number = atoi(argv[i]);
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 14: /* EMS ringtone - IMelody */
+ ringtone[SMSInfo.EntriesNum].Format=RING_NOTETONE;
+ error=GSM_ReadRingtoneFile(argv[i],&ringtone[SMSInfo.EntriesNum]);
+ Print_Error(error);
+ SMSInfo.Entries[SMSInfo.EntriesNum].Ringtone = &ringtone[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 15:/* EMS bitmap file */
+ bitmap[SMSInfo.EntriesNum].Bitmap[0].Type=GSM_StartupLogo;
+ error=GSM_ReadBitmapFile(argv[i],&bitmap[SMSInfo.EntriesNum]);
+ Print_Error(error);
+ SMSInfo.Entries[SMSInfo.EntriesNum].Bitmap = &bitmap[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 16:/* Number of frames for EMS animation */
+ FramesNum = atoi(argv[i]);
+ if (FramesNum < 1 || FramesNum > 4) {
+ printmsg("You have to give number of EMS frames between 1 and 4 (\"%s\")\n",argv[i]);
+ exit(-1);
+ }
+ bitmap[SMSInfo.EntriesNum].Number = 0;
+ nextlong = 17;
+ break;
+ case 17:/*File for EMS animation */
+ bitmap2.Bitmap[0].Type=GSM_StartupLogo;
+ error=GSM_ReadBitmapFile(argv[i],&bitmap2);
+ for (j=0;j<bitmap2.Number;j++) {
+ if (bitmap[SMSInfo.EntriesNum].Number == FramesNum) break;
+ memcpy(&bitmap[SMSInfo.EntriesNum].Bitmap[bitmap[SMSInfo.EntriesNum].Number],&bitmap2.Bitmap[j],sizeof(GSM_Bitmap));
+ bitmap[SMSInfo.EntriesNum].Number++;
+ }
+ if (bitmap[SMSInfo.EntriesNum].Number == FramesNum) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Bitmap = &bitmap[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ }
+ break;
+ case 18:/* EMS text from Unicode file */
+ f = fopen(argv[i],"rb");
+ if (f == NULL) {
+ printmsg("Can't open file \"%s\"\n",argv[i]);
+ exit(-1);
+ }
+ z=fread(InputBuffer,1,2000,f);
+ InputBuffer[z] = 0;
+ InputBuffer[z+1] = 0;
+ fclose(f);
+ ReadUnicodeFile(Buffer[SMSInfo.EntriesNum],InputBuffer);
+ dbgprintf("buffer is \"%s\"\n",DecodeUnicodeConsole(Buffer[SMSInfo.EntriesNum]));
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_ConcatenatedTextLong;
+ SMSInfo.Entries[SMSInfo.EntriesNum].Buffer = Buffer[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 19:/* Number of protected items */
+ Protected = atoi(argv[i]);
+ nextlong = 0;
+ break;
+ case 20:/* Formatting text for EMS */
+ if (SMSInfo.Entries[SMSInfo.EntriesNum-1].ID == SMS_ConcatenatedTextLong) {
+ for(j=0;j<(int)strlen(argv[i]);j++) {
+ switch(argv[i][j]) {
+ case 'l': case 'L':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Left = true;
+ break;
+ case 'c': case 'C':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Center = true;
+ break;
+ case 'r': case 'R':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Right = true;
+ break;
+ case 'a': case 'A':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Large = true;
+ break;
+ case 's': case 'S':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Small = true;
+ break;
+ case 'b': case 'B':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Bold = true;
+ break;
+ case 'i': case 'I':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Italic = true;
+ break;
+ case 'u': case 'U':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Underlined = true;
+ break;
+ case 't': case 'T':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Strikethrough = true;
+ break;
+ default:
+ printmsg("Unknown parameter \"%c\"\n",argv[i][j]);
+ exit(-1);
+ }
+ }
+ } else {
+ printmsg("Last parameter wasn't text\n");
+ exit(-1);
+ }
+ nextlong = 0;
+ break;
+ case 21:/*MaxSMS*/
+ MaxSMS = atoi(argv[i]);
+ nextlong = 0;
+ break;
+ case 22:/* profile name */
+ EncodeUnicode(Buffer[0],argv[i],strlen(argv[i]));
+ SMSInfo.Entries[0].Buffer = Buffer[0];
+ nextlong = 0;
+ break;
+ case 23:/* profile ringtone */
+ ringtone[0].Format = RING_NOTETONE;
+ error=GSM_ReadRingtoneFile(argv[i],&ringtone[0]);
+ Print_Error(error);
+ SMSInfo.Entries[0].Ringtone = &ringtone[0];
+ nextlong = 0;
+ break;
+ case 24:/* profile bitmap */
+ bitmap[0].Bitmap[0].Type = GSM_PictureImage;
+ error=GSM_ReadBitmapFile(argv[i],&bitmap[0]);
+ Print_Error(error);
+ bitmap[0].Bitmap[0].Text[0] = 0;
+ bitmap[0].Bitmap[0].Text[1] = 0;
+ SMSInfo.Entries[0].Bitmap = &bitmap[0];
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong!=0) {
+ printmsg("Parameter missed...\n");
+ exit(-1);
+ }
+
+ if (mystrncasecmp(argv[2],"EMS",0) && EMS16Bit) {
+ for (i=0;i<SMSInfo.EntriesNum;i++) {
+ switch (SMSInfo.Entries[i].ID) {
+ case SMS_ConcatenatedTextLong:
+ SMSInfo.Entries[i].ID = SMS_ConcatenatedTextLong16bit;
+ default:
+ break;
+
+ }
+ }
+
+ }
+ if (mystrncasecmp(argv[2],"TEXT",0)) {
+ chars_read = UnicodeLength(Buffer[0]);
+ if (chars_read != 0) {
+ /* Trim \n at the end of string */
+ if (Buffer[0][chars_read*2-1] == '\n' && Buffer[0][chars_read*2-2] == 0)
+ {
+ Buffer[0][chars_read*2-1] = 0;
+ }
+ }
+ }
+
+ if (mystrncasecmp(argv[1],"--displaysms",0) || mystrncasecmp(argv[1],"--sendsmsdsms",0)) {
+ if (mystrncasecmp(argv[2],"OPERATOR",0)) {
+ if (bitmap[0].Bitmap[0].Type==GSM_OperatorLogo && strcmp(bitmap[0].Bitmap[0].NetworkCode,"000 00")==0) {
+ printmsg("No network code\n");
+ exit(-1);
+ }
+ }
+ } else {
+ GSM_Init(true);
+
+ if (mystrncasecmp(argv[2],"OPERATOR",0)) {
+ if (bitmap[0].Bitmap[0].Type==GSM_OperatorLogo && strcmp(bitmap[0].Bitmap[0].NetworkCode,"000 00")==0) {
+ error=Phone->GetNetworkInfo(&s,&NetInfo);
+ Print_Error(error);
+ strcpy(bitmap[0].Bitmap[0].NetworkCode,NetInfo.NetworkCode);
+ if (mystrncasecmp(argv[1],"--savesms",0)) {
+ EncodeUnicode(Sender, "OpLogo",6);
+ EncodeUnicode(Sender+6*2,bitmap[0].Bitmap[0].NetworkCode,3);
+ EncodeUnicode(Sender+6*2+3*2,bitmap[0].Bitmap[0].NetworkCode+4,2);
+ if (UnicodeLength(GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode))<GSM_MAX_SMS_NAME_LENGTH-7) {
+ EncodeUnicode(Name,"OpLogo ",7);
+ CopyUnicodeString(Name+7*2,GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode));
+ } else {
+ CopyUnicodeString(Name,Sender);
+ }
+ }
+ }
+ }
+ }
+
+ error=GSM_EncodeMultiPartSMS(&SMSInfo,&sms);
+ Print_Error(error);
+
+ for (i=0;i<SMSInfo.EntriesNum;i++) {
+ switch (SMSInfo.Entries[i].ID) {
+ case SMS_NokiaRingtone:
+ case SMS_NokiaRingtoneLong:
+ case SMS_NokiaProfileLong:
+ case SMS_EMSSound10:
+ case SMS_EMSSound12:
+ case SMS_EMSSonyEricssonSound:
+ case SMS_EMSSound10Long:
+ case SMS_EMSSound12Long:
+ case SMS_EMSSonyEricssonSoundLong:
+ if (SMSInfo.Entries[i].RingtoneNotes!=SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands) {
+ printmsg("Warning: ringtone too long. %i percent part cut\n",
+ (SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands-SMSInfo.Entries[i].RingtoneNotes)*100/SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands);
+ }
+ default:
+ break;
+
+ }
+ }
+ if (MaxSMS != -1 && sms.Number > MaxSMS) {
+ printmsg("There is %i SMS packed and %i limit. Exiting\n",sms.Number,MaxSMS);
+ if (!mystrncasecmp(argv[1],"--displaysms",0) && !mystrncasecmp(argv[1],"--sendsmsdsms",0)) GSM_Terminate();
+ exit(-1);
+ }
+
+ if (mystrncasecmp(argv[1],"--displaysms",0)) {
+ if (SMSCSet != 0) {
+ printmsg("Use -smscnumber option to give SMSC number\n");
+ exit(-1);
+ }
+
+ for (i=0;i<sms.Number;i++) {
+ sms.SMS[i].Location = 0;
+ sms.SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
+ sms.SMS[i].SMSC.Location = 0;
+ sms.SMS[i].PDU = SMS_Submit;
+ if (DeliveryReport) sms.SMS[i].PDU = SMS_Status_Report;
+ CopyUnicodeString(sms.SMS[i].Number, Sender);
+ CopyUnicodeString(sms.SMS[i].SMSC.Number, SMSC);
+ if (Validity.Format != 0) memcpy(&sms.SMS[i].SMSC.Validity,&Validity,sizeof(GSM_SMSValidity));
+ DisplaySMSFrame(&sms.SMS[i]);
+ }
+
+ printmsg("\nNumber of SMS: %i\n",sms.Number);
+ exit(sms.Number);
+ }
+ if (mystrncasecmp(argv[1],"--sendsmsdsms",0)) {
+ if (SMSCSet != 0) {
+ printmsg("Use -smscnumber option to give SMSC number\n");
+ exit(-1);
+ }
+
+ for (i=0;i<sms.Number;i++) {
+ sms.SMS[i].Location = 0;
+ sms.SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
+ sms.SMS[i].SMSC.Location = 0;
+ sms.SMS[i].PDU = SMS_Submit;
+ if (DeliveryReport) sms.SMS[i].PDU = SMS_Status_Report;
+ CopyUnicodeString(sms.SMS[i].Number, Sender);
+ CopyUnicodeString(sms.SMS[i].SMSC.Number, SMSC);
+ if (Validity.Format != 0) memcpy(&sms.SMS[i].SMSC.Validity,&Validity,sizeof(GSM_SMSValidity));
+ }
+ SMSDaemonSendSMS(argv[4],argv[5],&sms);
+ exit(0);
+ }
+ if (mystrncasecmp(argv[1],"--savesms",0) || SendSaved) {
+ error=Phone->GetSMSFolders(&s, &folders);
+ Print_Error(error);
+
+ if (SendSaved) {
+ if (Validity.Format != 0 && SMSCSet != 0) {
+ PhoneSMSC.Location = SMSCSet;
+ error=Phone->GetSMSC(&s,&PhoneSMSC);
+ Print_Error(error);
+ CopyUnicodeString(SMSC,PhoneSMSC.Number);
+ SMSCSet = 0;
+ }
+
+ s.User.SendSMSStatus = SendSMSStatus;
+
+ signal(SIGINT, interrupt);
+ printmsgerr("If you want break, press Ctrl+C...\n");
+ }
+
+ for (i=0;i<sms.Number;i++) {
+ printmsg("Saving SMS %i/%i\n",i+1,sms.Number);
+// sms.SMS[i].Location = 0;
+ sms.SMS[i].Folder = Folder;
+ sms.SMS[i].State = State;
+ sms.SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
+ sms.SMS[i].SMSC.Location = SMSCSet;
+
+ if (SendSaved) {
+ sms.SMS[i].PDU = SMS_Submit;
+ if (DeliveryReport) sms.SMS[i].PDU = SMS_Status_Report;
+ if (Validity.Format != 0) sms.SMS[i].SMSC.Validity = Validity;
+ } else {
+ sms.SMS[i].PDU = SMS_Deliver;
+ }
+
+ CopyUnicodeString(sms.SMS[i].Number, Sender);
+ CopyUnicodeString(sms.SMS[i].Name, Name);
+ if (SMSCSet==0) CopyUnicodeString(sms.SMS[i].SMSC.Number, SMSC);
+ error=Phone->AddSMS(&s, &sms.SMS[i]);
+ Print_Error(error);
+ printmsg("Saved in folder \"%s\", location %i\n",
+ DecodeUnicodeConsole(folders.Folder[sms.SMS[i].Folder-1].Name),sms.SMS[i].Location);
+
+ if (SendSaved) {
+ printmsg("Sending sms from folder \"%s\", location %i\n",
+ DecodeUnicodeString(folders.Folder[sms.SMS[i].Folder-1].Name),sms.SMS[i].Location);
+ SMSStatus = ERR_TIMEOUT;
+ error=Phone->SendSavedSMS(&s, 0, sms.SMS[i].Location);
+ Print_Error(error);
+ printmsg("....waiting for network answer");
+ while (!gshutdown) {
+ GSM_ReadDevice(&s,true);
+ if (SMSStatus == ERR_UNKNOWN) {
+ GSM_Terminate();
+ exit(-1);
+ }
+ if (SMSStatus == ERR_NONE) break;
+ }
+ }
+ }
+ } else {
+ if (Validity.Format != 0 && SMSCSet != 0) {
+ PhoneSMSC.Location = SMSCSet;
+ error=Phone->GetSMSC(&s,&PhoneSMSC);
+ Print_Error(error);
+ CopyUnicodeString(SMSC,PhoneSMSC.Number);
+ SMSCSet = 0;
+ }
+
+ signal(SIGINT, interrupt);
+ printmsgerr("If you want break, press Ctrl+C...\n");
+
+ s.User.SendSMSStatus = SendSMSStatus;
+
+ for (i=0;i<sms.Number;i++) {
+ printmsg("Sending SMS %i/%i",i+1,sms.Number);
+ sms.SMS[i].Location = 0;
+ sms.SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
+ sms.SMS[i].SMSC.Location = SMSCSet;
+ sms.SMS[i].PDU = SMS_Submit;
+ if (DeliveryReport) sms.SMS[i].PDU = SMS_Status_Report;
+ CopyUnicodeString(sms.SMS[i].Number, Sender);
+ if (SMSCSet==0) CopyUnicodeString(sms.SMS[i].SMSC.Number, SMSC);
+ if (Validity.Format != 0) memcpy(&sms.SMS[i].SMSC.Validity,&Validity,sizeof(GSM_SMSValidity));
+ SMSStatus = ERR_TIMEOUT;
+ error=Phone->SendSMS(&s, &sms.SMS[i]);
+ Print_Error(error);
+ printmsg("....waiting for network answer");
+ while (!gshutdown) {
+ GSM_ReadDevice(&s,true);
+ if (SMSStatus == ERR_UNKNOWN) {
+ GSM_Terminate();
+ exit(-1);
+ }
+ if (SMSStatus == ERR_NONE) break;
+ }
+ }
+ }
+
+ GSM_Terminate();
+}
+
+#ifdef GSM_ENABLE_BACKUP
+static void SaveFile(int argc, char *argv[])
+{
+ GSM_Backup Backup;
+ int i,j;
+ FILE *file;
+ unsigned char Buffer[10000];
+ GSM_MemoryEntry *pbk;
+
+ if (mystrncasecmp(argv[2],"CALENDAR",0)) {
+ if (argc<5) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[4],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.Calendar[i]!=NULL) {
+ if (i == atoi(argv[5])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[5])-1) {
+ printmsg("Calendar note not found in file\n");
+ exit(-1);
+ }
+ j = 0;
+ GSM_EncodeVCALENDAR(Buffer, &j, Backup.Calendar[i],true,Nokia_VCalendar);
+ } else if (mystrncasecmp(argv[2],"BOOKMARK",0)) {
+ if (argc<5) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[4],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.WAPBookmark[i]!=NULL) {
+ if (i == atoi(argv[5])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[5])-1) {
+ printmsg("WAP bookmark not found in file\n");
+ exit(-1);
+ }
+ j = 0;
+ GSM_EncodeURLFile(Buffer, &j, Backup.WAPBookmark[i]);
+ } else if (mystrncasecmp(argv[2],"NOTE",0)) {
+ if (argc<5) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[4],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.Note[i]!=NULL) {
+ if (i == atoi(argv[5])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[5])-1) {
+ printmsg("Note not found in file\n");
+ exit(-1);
+ }
+ j = 0;
+ GSM_EncodeVNTFile(Buffer, &j, Backup.Note[i]);
+ } else if (mystrncasecmp(argv[2],"TODO",0)) {
+ if (argc<5) {
+ printmsg("Where is backup filename and location ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[4],&Backup);
+ Print_Error(error);
+ i = 0;
+ while (Backup.ToDo[i]!=NULL) {
+ if (i == atoi(argv[5])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[5])-1) {
+ printmsg("ToDo note not found in file\n");
+ exit(-1);
+ }
+ j = 0;
+ GSM_EncodeVTODO(Buffer, &j, Backup.ToDo[i], true, Nokia_VToDo);
+ } else if (mystrncasecmp(argv[2],"VCARD10",0) || mystrncasecmp(argv[2],"VCARD21",0)) {
+ if (argc<6) {
+ printmsg("Where is backup filename and location and memory type ?\n");
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[4],&Backup);
+ Print_Error(error);
+ i = 0;
+ if (mystrncasecmp(argv[5],"SM",0)) {
+ while (Backup.SIMPhonebook[i]!=NULL) {
+ if (i == atoi(argv[6])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[6])-1) {
+ printmsg("Phonebook entry not found in file\n");
+ exit(-1);
+ }
+ pbk = Backup.SIMPhonebook[i];
+ } else if (mystrncasecmp(argv[5],"ME",0)) {
+ while (Backup.PhonePhonebook[i]!=NULL) {
+ if (i == atoi(argv[6])-1) break;
+ i++;
+ }
+ if (i != atoi(argv[6])-1) {
+ printmsg("Phonebook entry not found in file\n");
+ exit(-1);
+ }
+ pbk = Backup.PhonePhonebook[i];
+ } else {
+ printmsg("Unknown memory type: \"%s\"\n",argv[5]);
+ exit(-1);
+ }
+ j = 0;
+ if (mystrncasecmp(argv[2],"VCARD10",0)) {
+ GSM_EncodeVCARD(Buffer,&j,pbk,true,Nokia_VCard10);
+ } else {
+ GSM_EncodeVCARD(Buffer,&j,pbk,true,Nokia_VCard21);
+ }
+ } else {
+ printmsg("What format of file (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ file = fopen(argv[3],"wb");
+ fwrite(Buffer,1,j,file);
+ fclose(file);
+}
+
+static void Backup(int argc, char *argv[])
+{
+ int i, used;
+ GSM_MemoryStatus MemStatus;
+ GSM_ToDoEntry ToDo;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_MemoryEntry Pbk;
+ GSM_CalendarEntry Note;
+ GSM_Bitmap Bitmap;
+ GSM_WAPBookmark Bookmark;
+ GSM_Profile Profile;
+ GSM_MultiWAPSettings Settings;
+ GSM_Ringtone Ringtone;
+ GSM_SMSC SMSC;
+ GSM_Backup Backup;
+ GSM_Backup_Info Info;
+ GSM_FMStation FMStation;
+ GSM_GPRSAccessPoint GPRSPoint;
+ bool DoBackup;
+
+ if (argc == 4 && mystrncasecmp(argv[3],"-yes",0)) always_answer_yes = true;
+
+ GSM_ClearBackup(&Backup);
+ GSM_GetBackupFormatFeatures(argv[2],&Info);
+
+ sprintf(Backup.Creator,"Gammu %s",VERSION);
+ if (strlen(GetOS()) != 0) {
+ strcat(Backup.Creator+strlen(Backup.Creator),", ");
+ strcat(Backup.Creator+strlen(Backup.Creator),GetOS());
+ }
+ if (strlen(GetCompiler()) != 0) {
+ strcat(Backup.Creator+strlen(Backup.Creator),", ");
+ strcat(Backup.Creator+strlen(Backup.Creator),GetCompiler());
+ }
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ GSM_Init(true);
+
+ if (Info.UseUnicode) {
+ Info.UseUnicode=answer_yes("Use Unicode subformat of backup file");
+ }
+ if (Info.DateTime) {
+ GSM_GetCurrentDateTime (&Backup.DateTime);
+ Backup.DateTimeAvailable=true;
+ }
+ if (Info.Model) {
+ error=Phone->GetManufacturer(&s);
+ Print_Error(error);
+ sprintf(Backup.Model,"%s ",s.Phone.Data.Manufacturer);
+ if (s.Phone.Data.ModelInfo->model[0]!=0) {
+ strcat(Backup.Model,s.Phone.Data.ModelInfo->model);
+ } else {
+ strcat(Backup.Model,s.Phone.Data.Model);
+ }
+ strcat(Backup.Model," ");
+ strcat(Backup.Model,s.Phone.Data.Version);
+ }
+ if (Info.IMEI) {
+ error=Phone->GetIMEI(&s);
+ if (error != ERR_NOTSUPPORTED) {
+ strcpy(Backup.IMEI, s.Phone.Data.IMEI);
+ Print_Error(error);
+ } else {
+ Backup.IMEI[0] = 0;
+ }
+ }
+ printf("\n");
+
+ DoBackup = false;
+ if (Info.PhonePhonebook) {
+ printmsg("Checking phone phonebook\n");
+ MemStatus.MemoryType = MEM_ME;
+ error=Phone->GetMemoryStatus(&s, &MemStatus);
+ if (error==ERR_NONE && MemStatus.MemoryUsed != 0) {
+ if (answer_yes(" Backup phone phonebook")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ Pbk.MemoryType = MEM_ME;
+ i = 1;
+ used = 0;
+ while (used != MemStatus.MemoryUsed) {
+ Pbk.Location = i;
+ error=Phone->GetMemory(&s, &Pbk);
+ if (error != ERR_EMPTY) {
+ Print_Error(error);
+ if (used < GSM_BACKUP_MAX_PHONEPHONEBOOK) {
+ Backup.PhonePhonebook[used] = malloc(sizeof(GSM_MemoryEntry));
+ if (Backup.PhonePhonebook[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.PhonePhonebook[used+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_PHONEPHONEBOOK");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.PhonePhonebook[used]=Pbk;
+ used++;
+ }
+ printmsgerr("%c Reading: %i percent",13,used*100/MemStatus.MemoryUsed);
+ i++;
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.SIMPhonebook) {
+ printmsg("Checking SIM phonebook\n");
+ MemStatus.MemoryType = MEM_SM;
+ error=Phone->GetMemoryStatus(&s, &MemStatus);
+ if (error==ERR_NONE && MemStatus.MemoryUsed != 0) {
+ if (answer_yes(" Backup SIM phonebook")) DoBackup=true;
+ }
+ }
+ if (DoBackup) {
+ Pbk.MemoryType = MEM_SM;
+ i = 1;
+ used = 0;
+ while (used != MemStatus.MemoryUsed) {
+ Pbk.Location = i;
+ error=Phone->GetMemory(&s, &Pbk);
+ if (error != ERR_EMPTY) {
+ Print_Error(error);
+ if (used < GSM_BACKUP_MAX_SIMPHONEBOOK) {
+ Backup.SIMPhonebook[used] = malloc(sizeof(GSM_MemoryEntry));
+ if (Backup.SIMPhonebook[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.SIMPhonebook[used + 1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_SIMPHONEBOOK");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.SIMPhonebook[used]=Pbk;
+ used++;
+ }
+ printmsgerr("%c Reading: %i percent",13,used*100/MemStatus.MemoryUsed);
+ i++;
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.Calendar) {
+ printmsg("Checking calendar\n");
+ error=Phone->GetNextCalendar(&s,&Note,true);
+ if (error==ERR_NONE) {
+ if (answer_yes(" Backup calendar notes")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ printmsgerr(" Reading : ");
+ while (error == ERR_NONE) {
+ if (used < GSM_MAXCALENDARTODONOTES) {
+ Backup.Calendar[used] = malloc(sizeof(GSM_CalendarEntry));
+ if (Backup.Calendar[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.Calendar[used+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_MAXCALENDARTODONOTES");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.Calendar[used]=Note;
+ used ++;
+ error=Phone->GetNextCalendar(&s,&Note,false);
+ printmsgerr("*");
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.ToDo) {
+ printmsg("Checking ToDo\n");
+ error=Phone->GetToDoStatus(&s,&ToDoStatus);
+ if (error == ERR_NONE && ToDoStatus.Used != 0) {
+ if (answer_yes(" Backup ToDo")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ error=Phone->GetNextToDo(&s,&ToDo,true);
+ while (error == ERR_NONE) {
+ if (used < GSM_MAXCALENDARTODONOTES) {
+ Backup.ToDo[used] = malloc(sizeof(GSM_ToDoEntry));
+ if (Backup.ToDo[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.ToDo[used+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_MAXCALENDARTODONOTES");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.ToDo[used]=ToDo;
+ used ++;
+ error=Phone->GetNextToDo(&s,&ToDo,false);
+ printmsgerr("%c Reading: %i percent",13,used*100/ToDoStatus.Used);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.CallerLogos) {
+ printmsg("Checking caller logos\n");
+ Bitmap.Type = GSM_CallerGroupLogo;
+ Bitmap.Location = 1;
+ error=Phone->GetBitmap(&s,&Bitmap);
+ if (error == ERR_NONE) {
+ if (answer_yes(" Backup caller groups and logos")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ printmsgerr(" Reading : ");
+ error = ERR_NONE;
+ used = 0;
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_CALLER) {
+ Backup.CallerLogos[used] = malloc(sizeof(GSM_Bitmap));
+ if (Backup.CallerLogos[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.CallerLogos[used+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_CALLER");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.CallerLogos[used] = Bitmap;
+ used ++;
+ Bitmap.Location = used + 1;
+ error=Phone->GetBitmap(&s,&Bitmap);
+ printmsgerr("*");
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.SMSC) {
+ printmsg("Checking SMS profiles\n");
+ if (answer_yes(" Backup SMS profiles")) DoBackup = true;
+ }
+ if (DoBackup) {
+ used = 0;
+ printmsgerr(" Reading: ");
+ while (true) {
+ SMSC.Location = used + 1;
+ error = Phone->GetSMSC(&s,&SMSC);
+ if (error != ERR_NONE) break;
+ if (used < GSM_BACKUP_MAX_SMSC) {
+ Backup.SMSC[used] = malloc(sizeof(GSM_SMSC));
+ if (Backup.SMSC[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.SMSC[used + 1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_SMSC");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.SMSC[used]=SMSC;
+ used++;
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.StartupLogo) {
+ printmsg("Checking startup text\n");
+ Bitmap.Type = GSM_WelcomeNote_Text;
+ error = Phone->GetBitmap(&s,&Bitmap);
+ if (error == ERR_NONE) {
+ if (answer_yes(" Backup startup logo/text")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ Backup.StartupLogo = malloc(sizeof(GSM_Bitmap));
+ if (Backup.StartupLogo == NULL) Print_Error(ERR_MOREMEMORY);
+ *Backup.StartupLogo = Bitmap;
+ if (Bitmap.Text[0]==0 && Bitmap.Text[1]==0) {
+ Bitmap.Type = GSM_StartupLogo;
+ error = Phone->GetBitmap(&s,&Bitmap);
+ if (error == ERR_NONE) *Backup.StartupLogo = Bitmap;
+ }
+ }
+ DoBackup = false;
+ if (Info.OperatorLogo) {
+ printmsg("Checking operator logo\n");
+ Bitmap.Type = GSM_OperatorLogo;
+ error=Phone->GetBitmap(&s,&Bitmap);
+ if (error == ERR_NONE) {
+ if (strcmp(Bitmap.NetworkCode,"000 00")!=0) {
+ if (answer_yes(" Backup operator logo")) DoBackup = true;
+ }
+ }
+ }
+ if (DoBackup) {
+ Backup.OperatorLogo = malloc(sizeof(GSM_Bitmap));
+ if (Backup.OperatorLogo == NULL) Print_Error(ERR_MOREMEMORY);
+ *Backup.OperatorLogo = Bitmap;
+ }
+ DoBackup = false;
+ if (Info.MMSSettings) {
+ printmsg("Checking MMS settings\n");
+ Settings.Location = 1;
+ error=Phone->GetMMSSettings(&s,&Settings);
+ if (error==ERR_NONE) {
+ if (answer_yes(" Backup MMS settings")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ printmsgerr(" Reading : ");
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_MMSSETTINGS) {
+ Backup.MMSSettings[used] = malloc(sizeof(GSM_MultiWAPSettings));
+ if (Backup.MMSSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.MMSSettings[used+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_MMSSETTINGS");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.MMSSettings[used]=Settings;
+ used ++;
+ Settings.Location = used+1;
+ error=Phone->GetMMSSettings(&s,&Settings);
+ printmsgerr("*");
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.WAPBookmark) {
+ printmsg("Checking WAP bookmarks\n");
+ Bookmark.Location = 1;
+ error=Phone->GetWAPBookmark(&s,&Bookmark);
+ if (error==ERR_NONE) {
+ if (answer_yes(" Backup WAP bookmarks")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ printmsgerr(" Reading : ");
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_WAPBOOKMARK) {
+ Backup.WAPBookmark[used] = malloc(sizeof(GSM_WAPBookmark));
+ if (Backup.WAPBookmark[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.WAPBookmark[used+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_WAPBOOKMARK");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.WAPBookmark[used]=Bookmark;
+ used ++;
+ Bookmark.Location = used+1;
+ error=Phone->GetWAPBookmark(&s,&Bookmark);
+ printmsgerr("*");
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.WAPSettings) {
+ printmsg("Checking WAP settings\n");
+ Settings.Location = 1;
+ error=Phone->GetWAPSettings(&s,&Settings);
+ if (error==ERR_NONE) {
+ if (answer_yes(" Backup WAP settings")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ printmsgerr(" Reading : ");
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_WAPSETTINGS) {
+ Backup.WAPSettings[used] = malloc(sizeof(GSM_MultiWAPSettings));
+ if (Backup.WAPSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.WAPSettings[used+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_WAPSETTINGS");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.WAPSettings[used]=Settings;
+ used ++;
+ Settings.Location = used+1;
+ error=Phone->GetWAPSettings(&s,&Settings);
+ printmsgerr("*");
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.Ringtone) {
+ printmsg("Checking user ringtones\n");
+ Ringtone.Location = 1;
+ Ringtone.Format = 0;
+ error=Phone->GetRingtone(&s,&Ringtone,false);
+ if (error==ERR_EMPTY || error == ERR_NONE) {
+ if (answer_yes(" Backup user ringtones")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ i = 1;
+ printmsgerr(" Reading : ");
+ while (error == ERR_NONE || error == ERR_EMPTY) {
+ if (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_RINGTONES) {
+ Backup.Ringtone[used] = malloc(sizeof(GSM_Ringtone));
+ if (Backup.Ringtone[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.Ringtone[used+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_RINGTONES");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.Ringtone[used]=Ringtone;
+ used ++;
+ }
+ i++;
+ Ringtone.Location = i;
+ Ringtone.Format = 0;
+ error=Phone->GetRingtone(&s,&Ringtone,false);
+ printmsgerr("*");
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.Profiles) {
+ printmsg("Checking phone profiles\n");
+ Profile.Location = 1;
+ error = Phone->GetProfile(&s,&Profile);
+ if (error == ERR_NONE) {
+ if (answer_yes(" Backup phone profiles")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ printmsgerr(" Reading: ");
+ while (true) {
+ Profile.Location = used + 1;
+ error = Phone->GetProfile(&s,&Profile);
+ if (error != ERR_NONE) break;
+ if (used < GSM_BACKUP_MAX_PROFILES) {
+ Backup.Profiles[used] = malloc(sizeof(GSM_Profile));
+ if (Backup.Profiles[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.Profiles[used + 1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_PROFILES");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.Profiles[used]=Profile;
+ used++;
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.FMStation) {
+ printmsg("Checking FM stations\n");
+ FMStation.Location = 1;
+ error = Phone->GetFMStation(&s,&FMStation);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes(" Backup phone FM stations")) DoBackup=true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ i = 1;
+ printmsgerr(" Reading: ");
+ while (error == ERR_NONE || error == ERR_EMPTY) {
+ error = Phone->GetFMStation(&s,&FMStation);
+ if (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_FMSTATIONS) {
+ Backup.FMStation[used] = malloc(sizeof(GSM_FMStation));
+ if (Backup.FMStation[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.FMStation[used + 1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_FMSTATIONS");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.FMStation[used]=FMStation;
+ used++;
+ }
+ i++;
+ FMStation.Location = i;
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ }
+ DoBackup = false;
+ if (Info.GPRSPoint) {
+ printmsg("Checking GPRS access points\n");
+ GPRSPoint.Location = 1;
+ error = Phone->GetGPRSAccessPoint(&s,&GPRSPoint);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes(" Backup GPRS access points")) DoBackup = true;
+ }
+ }
+ if (DoBackup) {
+ used = 0;
+ i = 1;
+ printmsgerr(" Reading: ");
+ while (error == ERR_NONE || error == ERR_EMPTY) {
+ error = Phone->GetGPRSAccessPoint(&s,&GPRSPoint);
+ if (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_GPRSPOINT) {
+ Backup.GPRSPoint[used] = malloc(sizeof(GSM_GPRSAccessPoint));
+ if (Backup.GPRSPoint[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.GPRSPoint[used + 1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_GPRSPOINT");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.GPRSPoint[used]=GPRSPoint;
+ used++;
+ }
+ i++;
+ GPRSPoint.Location = i;
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ }
+
+ GSM_Terminate();
+
+ GSM_SaveBackupFile(argv[2],&Backup, Info.UseUnicode);
+ GSM_FreeBackup(&Backup);
+}
+
+static void Restore(int argc, char *argv[])
+{
+ GSM_Backup Backup;
+ GSM_FMStation FMStation;
+ GSM_DateTime date_time;
+ GSM_CalendarEntry Calendar;
+ GSM_Bitmap Bitmap;
+ GSM_Ringtone Ringtone;
+ GSM_MemoryEntry Pbk;
+ GSM_MemoryStatus MemStatus;
+ GSM_ToDoEntry ToDo;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_Profile Profile;
+ GSM_MultiWAPSettings Settings;
+ GSM_GPRSAccessPoint GPRSPoint;
+ GSM_WAPBookmark Bookmark;
+ int i, used, max = 0;
+ bool Past = true;
+ bool Found, DoRestore;
+
+ error=GSM_ReadBackupFile(argv[2],&Backup);
+ Print_Error(error);
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ if (Backup.DateTimeAvailable) printmsgerr("Time of backup : %s\n",OSDateTime(Backup.DateTime,false));
+ if (Backup.Model[0]!=0) printmsgerr("Phone : %s\n",Backup.Model);
+ if (Backup.IMEI[0]!=0) printmsgerr("IMEI : %s\n",Backup.IMEI);
+
+ if (Backup.MD5Calculated[0]!=0) {
+ dbgprintf("\"%s\"\n",Backup.MD5Original);
+ dbgprintf("\"%s\"\n",Backup.MD5Calculated);
+ if (strcmp(Backup.MD5Original,Backup.MD5Calculated)) {
+ if (!answer_yes("Checksum in backup file do not match. Continue")) return;
+ }
+ }
+
+ GSM_Init(true);
+
+ DoRestore = false;
+ if (Backup.PhonePhonebook[0] != NULL) {
+ MemStatus.MemoryType = MEM_ME;
+ error=Phone->GetMemoryStatus(&s, &MemStatus);
+ if (error==ERR_NONE) {
+ max = 0;
+ while (Backup.PhonePhonebook[max]!=NULL) max++;
+ printmsgerr("%i entries in backup file\n",max);
+ if (answer_yes("Restore phone phonebook")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ used = 0;
+ for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
+ Pbk.MemoryType = MEM_ME;
+ Pbk.Location = i + 1;
+ Pbk.EntriesNum = 0;
+ if (used<max) {
+ if (Backup.PhonePhonebook[used]->Location == Pbk.Location) {
+ Pbk = *Backup.PhonePhonebook[used];
+ used++;
+ dbgprintf("Location %i\n",Pbk.Location);
+ if (Pbk.EntriesNum != 0) error=Phone->SetMemory(&s, &Pbk);
+ }
+ }
+ if (Pbk.EntriesNum == 0) error=Phone->DeleteMemory(&s, &Pbk);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/(MemStatus.MemoryUsed+MemStatus.MemoryFree));
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+
+ DoRestore = false;
+ if (Backup.SIMPhonebook[0] != NULL) {
+ MemStatus.MemoryType = MEM_SM;
+ error=Phone->GetMemoryStatus(&s, &MemStatus);
+ if (error==ERR_NONE) {
+ max = 0;
+ while (Backup.SIMPhonebook[max]!=NULL) max++;
+ printmsgerr("%i entries in backup file\n",max);
+ if (answer_yes("Restore SIM phonebook")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ used = 0;
+ for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
+ Pbk.MemoryType = MEM_SM;
+ Pbk.Location = i + 1;
+ Pbk.EntriesNum = 0;
+ if (used<max) {
+ if (Backup.SIMPhonebook[used]->Location == Pbk.Location) {
+ Pbk = *Backup.SIMPhonebook[used];
+ used++;
+ dbgprintf("Location %i\n",Pbk.Location);
+ if (Pbk.EntriesNum != 0) error=Phone->SetMemory(&s, &Pbk);
+ }
+ }
+ if (Pbk.EntriesNum == 0) error=Phone->DeleteMemory(&s, &Pbk);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/(MemStatus.MemoryUsed+MemStatus.MemoryFree));
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+
+ DoRestore = false;
+ if (Backup.CallerLogos[0] != NULL) {
+ Bitmap.Type = GSM_CallerGroupLogo;
+ Bitmap.Location = 1;
+ error=Phone->GetBitmap(&s,&Bitmap);
+ if (error == ERR_NONE) {
+ if (answer_yes("Restore caller groups and logos")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.CallerLogos[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=Phone->SetBitmap(&s,Backup.CallerLogos[i]);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+
+ if (!mystrncasecmp(s.CurrentConfig->SyncTime,"yes",0)) {
+ if (/*answer_yes("Do you want to set date/time in phone (NOTE: in some phones it's required to correctly restore calendar notes and other items)")*/ true ) {
+ GSM_GetCurrentDateTime(&date_time);
+
+ error=Phone->SetDateTime(&s, &date_time);
+ Print_Error(error);
+ }
+ }
+ DoRestore = false;
+ if (Backup.Calendar[0] != NULL) {
+ /* N6110 doesn't support getting calendar status */
+ error = Phone->GetNextCalendar(&s,&Calendar,true);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION || error == ERR_EMPTY) {
+ max = 0;
+ while (Backup.Calendar[max] != NULL) max++;
+ printmsgerr("%i entries in backup file\n",max);
+ DoRestore = true;
+ /*
+ if (answer_yes("Restore calendar notes")) {
+ Past = answer_yes("Restore notes from the past");
+ DoRestore = true;
+ }
+ */
+ }
+ }
+ if (DoRestore) {
+ printmsgerr("Deleting old notes: ");
+ error = Phone->DeleteAllCalendar(&s);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ while (1) {
+ error = Phone->GetNextCalendar(&s,&Calendar,true);
+ if (error != ERR_NONE) break;
+ error = Phone->DeleteCalendar(&s,&Calendar);
+ Print_Error(error);
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ } else {
+ printmsgerr("Done\n");
+ Print_Error(error);
+ }
+
+ for (i=0;i<max;i++) {
+ if (!Past && IsCalendarNoteFromThePast(Backup.Calendar[i])) continue;
+
+ Calendar = *Backup.Calendar[i];
+ error=Phone->AddCalendar(&s,&Calendar);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+
+ DoRestore = false;
+ if (Backup.ToDo[0] != NULL) {
+ error = Phone->GetToDoStatus(&s,&ToDoStatus);
+ if (error == ERR_NONE) {
+ max = 0;
+ while (Backup.ToDo[max]!=NULL) max++;
+ printmsgerr("%i entries in backup file\n",max);
+
+ /*if (answer_yes("Restore ToDo")) */DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ ToDo = *Backup.ToDo[0];
+ error = Phone->SetToDo(&s,&ToDo);
+ }
+ if (DoRestore && (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED)) {
+ printmsgerr("Deleting old ToDo: ");
+ error=Phone->DeleteAllToDo(&s);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ while (1) {
+ error = Phone->GetNextToDo(&s,&ToDo,true);
+ if (error != ERR_NONE) break;
+ error = Phone->DeleteToDo(&s,&ToDo);
+ Print_Error(error);
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ } else {
+ printmsgerr("Done\n");
+ Print_Error(error);
+ }
+
+ for (i=0;i<max;i++) {
+ ToDo = *Backup.ToDo[i];
+ ToDo.Location = 0;
+ error=Phone->AddToDo(&s,&ToDo);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ } else if (DoRestore) {
+ /* At first delete entries, that were deleted */
+ used = 0;
+ error = Phone->GetNextToDo(&s,&ToDo,true);
+ while (error == ERR_NONE) {
+ used++;
+ Found = false;
+ for (i=0;i<max;i++) {
+ if (Backup.ToDo[i]->Location == ToDo.Location) {
+ Found = true;
+ break;
+ }
+ }
+ if (!Found) {
+ error=Phone->DeleteToDo(&s,&ToDo);
+ Print_Error(error);
+ }
+ error = Phone->GetNextToDo(&s,&ToDo,false);
+ printmsgerr("%cCleaning: %i percent",13,used*100/ToDoStatus.Used);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+
+ /* Now write modified/new entries */
+ for (i=0;i<max;i++) {
+ ToDo = *Backup.ToDo[i];
+ error = Phone->SetToDo(&s,&ToDo);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+
+ if (Backup.SMSC[0] != NULL && answer_yes("Restore SMSC profiles")) {
+ max = 0;
+ while (Backup.SMSC[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=Phone->SetSMSC(&s,Backup.SMSC[i]);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ if (Backup.StartupLogo != NULL && answer_yes("Restore startup logo/text")) {
+ error=Phone->SetBitmap(&s,Backup.StartupLogo);
+ Print_Error(error);
+ }
+ if (Backup.OperatorLogo != NULL && answer_yes("Restore operator logo")) {
+ error=Phone->SetBitmap(&s,Backup.OperatorLogo);
+ Print_Error(error);
+ }
+ DoRestore = false;
+ if (Backup.WAPBookmark[0] != NULL) {
+ Bookmark.Location = 1;
+ error = Phone->GetWAPBookmark(&s,&Bookmark);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
+ if (answer_yes("Restore WAP bookmarks")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ printmsgerr("Deleting old bookmarks: ");
+ /* One thing to explain: DCT4 phones seems to have bug here.
+ * When delete for example first bookmark, phone change
+ * numeration for getting frame, not for deleting. So, we try to
+ * get 1'st bookmark. Inside frame is "correct" location. We use
+ * it later
+ */
+ while (error==ERR_NONE) {
+ error = Phone->DeleteWAPBookmark(&s,&Bookmark);
+ Bookmark.Location = 1;
+ error = Phone->GetWAPBookmark(&s,&Bookmark);
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ max = 0;
+ while (Backup.WAPBookmark[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Bookmark = *Backup.WAPBookmark[i];
+ Bookmark.Location = 0;
+ error=Phone->SetWAPBookmark(&s,&Bookmark);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoRestore = false;
+ if (Backup.WAPSettings[0] != NULL) {
+ Settings.Location = 1;
+ error = Phone->GetWAPSettings(&s,&Settings);
+ if (error == ERR_NONE) {
+ if (answer_yes("Restore WAP settings")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.WAPSettings[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=Phone->SetWAPSettings(&s,Backup.WAPSettings[i]);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoRestore = false;
+ if (Backup.MMSSettings[0] != NULL) {
+ Settings.Location = 1;
+ error = Phone->GetMMSSettings(&s,&Settings);
+ if (error == ERR_NONE) {
+ if (answer_yes("Restore MMS settings")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.MMSSettings[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=Phone->SetMMSSettings(&s,Backup.MMSSettings[i]);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoRestore = false;
+ if (Backup.Ringtone[0] != NULL) {
+ Ringtone.Location = 1;
+ Ringtone.Format = 0;
+ error = Phone->GetRingtone(&s,&Ringtone,false);
+ if (error == ERR_NONE || error ==ERR_EMPTY) {
+ if (Phone->DeleteUserRingtones != NOTSUPPORTED) {
+ if (answer_yes("Delete all user ringtones")) DoRestore = true;
+ }
+ }
+ }
+ if (DoRestore) {
+ printmsgerr("Deleting: ");
+ error=Phone->DeleteUserRingtones(&s);
+ Print_Error(error);
+ printmsgerr("Done\n");
+ DoRestore = false;
+ if (answer_yes("Restore user ringtones")) DoRestore = true;
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.Ringtone[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=GSM_RingtoneConvert(&Ringtone, Backup.Ringtone[i], Ringtone.Format);
+ Print_Error(error);
+ error=Phone->SetRingtone(&s,&Ringtone,&i);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoRestore = false;
+ if (Backup.Profiles[0] != NULL) {
+ Profile.Location = 1;
+ error = Phone->GetProfile(&s,&Profile);
+ if (error == ERR_NONE) {
+ if (answer_yes("Restore profiles")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ Profile.Location= 0;
+ max = 0;
+ while (Backup.Profiles[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Profile = *Backup.Profiles[i];
+ error=Phone->SetProfile(&s,&Profile);
+ Print_Error(error);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoRestore = false;
+ if (Backup.FMStation[0] != NULL) {
+ FMStation.Location = 1;
+ error = Phone->GetFMStation(&s,&FMStation);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes("Restore FM stations")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ printmsgerr("Deleting old FM stations: ");
+ error=Phone->ClearFMStations(&s);
+ Print_Error(error);
+ printmsgerr("Done\n");
+ max = 0;
+ while (Backup.FMStation[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ FMStation = *Backup.FMStation[i];
+ error=Phone->SetFMStation(&s,&FMStation);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ DoRestore = false;
+ if (Backup.GPRSPoint[0] != NULL) {
+ GPRSPoint.Location = 1;
+ error = Phone->GetGPRSAccessPoint(&s,&GPRSPoint);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes("Restore GPRS Points")) DoRestore = true;
+ }
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.GPRSPoint[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=Phone->SetGPRSAccessPoint(&s,Backup.GPRSPoint[i]);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+
+ GSM_Terminate();
+}
+
+static void AddNew(int argc, char *argv[])
+{
+ GSM_Backup Backup;
+ GSM_DateTime date_time;
+ GSM_MemoryEntry Pbk;
+ GSM_MemoryStatus MemStatus;
+ GSM_ToDoEntry ToDo;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_CalendarEntry Calendar;
+ GSM_WAPBookmark Bookmark;
+ int i, max, j;
+
+ error=GSM_ReadBackupFile(argv[2],&Backup);
+ Print_Error(error);
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ if (Backup.DateTimeAvailable) printmsgerr("Time of backup : %s\n",OSDateTime(Backup.DateTime,false));
+ if (Backup.Model[0]!=0) printmsgerr("Phone : %s\n",Backup.Model);
+ if (Backup.IMEI[0]!=0) printmsgerr("IMEI : %s\n",Backup.IMEI);
+
+ GSM_Init(true);
+
+ if (Backup.PhonePhonebook[0] != NULL) {
+ MemStatus.MemoryType = MEM_ME;
+ error=Phone->GetMemoryStatus(&s, &MemStatus);
+ if (error==ERR_NONE) {
+ max = 0;
+ while (Backup.PhonePhonebook[max]!=NULL) max++;
+ printmsgerr("%i entries in backup file\n",max);
+ if (MemStatus.MemoryFree < max) {
+ printmsgerr("Memory has only %i free locations.Exiting\n",MemStatus.MemoryFree);
+ } else if (answer_yes("Add phone phonebook entries")) {
+ for (i=0;i<max;i++) {
+ Pbk = *Backup.PhonePhonebook[i];
+ Pbk.MemoryType = MEM_ME;
+ error=Phone->AddMemory(&s, &Pbk);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ }
+ }
+ if (Backup.SIMPhonebook[0] != NULL) {
+ MemStatus.MemoryType = MEM_SM;
+ error=Phone->GetMemoryStatus(&s, &MemStatus);
+ if (error==ERR_NONE) {
+ max = 0;
+ while (Backup.SIMPhonebook[max]!=NULL) max++;
+ printmsgerr("%i entries in backup file\n",max);
+ if (MemStatus.MemoryFree < max) {
+ printmsgerr("Memory has only %i free locations.Exiting\n",MemStatus.MemoryFree);
+ } else if (answer_yes("Add SIM phonebook entries")) {
+ j = 1;
+ for (i=0;i<max;i++) {
+ Pbk = *Backup.SIMPhonebook[i];
+ Pbk.MemoryType = MEM_SM;
+ error=Phone->AddMemory(&s, &Pbk);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ }
+ }
+
+ if (!mystrncasecmp(s.CurrentConfig->SyncTime,"yes",0)) {
+ if (answer_yes("Do you want to set date/time in phone (NOTE: in some phones it's required to correctly restore calendar notes and other items)")) {
+ GSM_GetCurrentDateTime(&date_time);
+
+ error=Phone->SetDateTime(&s, &date_time);
+ Print_Error(error);
+ }
+ }
+ if (Backup.Calendar[0] != NULL) {
+ error = Phone->GetNextCalendar(&s,&Calendar,true);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION || error == ERR_EMPTY) {
+ if (answer_yes("Add calendar notes")) {
+ max = 0;
+ while (Backup.Calendar[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Calendar = *Backup.Calendar[i];
+ error=Phone->AddCalendar(&s,&Calendar);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ }
+ }
+ if (Backup.ToDo[0] != NULL) {
+ ToDo.Location = 1;
+ error=Phone->GetToDoStatus(&s,&ToDoStatus);
+ if (error == ERR_NONE) {
+ if (answer_yes("Add ToDo")) {
+ max = 0;
+ while (Backup.ToDo[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ ToDo = *Backup.ToDo[i];
+ error = Phone->AddToDo(&s,&ToDo);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ }
+ }
+ if (Backup.WAPBookmark[0] != NULL) {
+ Bookmark.Location = 1;
+ error = Phone->GetWAPBookmark(&s,&Bookmark);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
+ if (answer_yes("Add WAP bookmarks")) {
+ max = 0;
+ while (Backup.WAPBookmark[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Bookmark = *Backup.WAPBookmark[i];
+ Bookmark.Location = 0;
+ error=Phone->SetWAPBookmark(&s,&Bookmark);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ }
+ }
+ }
+
+ GSM_Terminate();
+}
+#endif
+
+static void ClearAll(int argc, char *argv[])
+{
+ GSM_MemoryStatus MemStatus;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_CalendarEntry Calendar;
+ GSM_ToDoEntry ToDo;
+ GSM_WAPBookmark Bookmark;
+ GSM_FMStation Station;
+ GSM_MemoryEntry Pbk;
+ bool DoClear;
+
+ GSM_Init(true);
+
+ DoClear = false;
+ MemStatus.MemoryType = MEM_ME;
+ error=Phone->GetMemoryStatus(&s, &MemStatus);
+ if (error==ERR_NONE && MemStatus.MemoryUsed !=0) {
+ if (answer_yes("Delete phone phonebook")) DoClear = true;
+ }
+ if (DoClear) {
+ error = Phone->DeleteAllMemory(&s,MEM_ME);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
+ Pbk.MemoryType = MEM_ME;
+ Pbk.Location = i + 1;
+ Pbk.EntriesNum = 0;
+ error=Phone->DeleteMemory(&s, &Pbk);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/(MemStatus.MemoryUsed+MemStatus.MemoryFree));
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ } else {
+ printmsgerr("Done\n");
+ Print_Error(error);
+ }
+ }
+
+ DoClear = false;
+ MemStatus.MemoryType = MEM_SM;
+ error=Phone->GetMemoryStatus(&s, &MemStatus);
+ if (error==ERR_NONE && MemStatus.MemoryUsed !=0) {
+ if (answer_yes("Delete SIM phonebook")) DoClear = true;
+ }
+ if (DoClear) {
+ error = Phone->DeleteAllMemory(&s,MEM_SM);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
+ Pbk.MemoryType = MEM_SM;
+ Pbk.Location = i + 1;
+ Pbk.EntriesNum = 0;
+ error=Phone->DeleteMemory(&s, &Pbk);
+ Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,(i+1)*100/(MemStatus.MemoryUsed+MemStatus.MemoryFree));
+ if (gshutdown) {
+ GSM_Terminate();
+ exit(0);
+ }
+ }
+ printmsgerr("\n");
+ } else {
+ printmsgerr("Done\n");
+ Print_Error(error);
+ }
+ }
+
+ DoClear = false;
+ error = Phone->GetNextCalendar(&s,&Calendar,true);
+ if (error == ERR_NONE) {
+ if (answer_yes("Delete calendar notes")) DoClear = true;
+ }
+ if (DoClear) {
+ printmsgerr("Deleting: ");
+ error=Phone->DeleteAllCalendar(&s);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ while (1) {
+ error = Phone->GetNextCalendar(&s,&Calendar,true);
+ if (error != ERR_NONE) break;
+ error = Phone->DeleteCalendar(&s,&Calendar);
+ Print_Error(error);
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ } else {
+ printmsgerr("Done\n");
+ Print_Error(error);
+ }
+ }
+
+ DoClear = false;
+ error = Phone->GetToDoStatus(&s,&ToDoStatus);
+ if (error == ERR_NONE && ToDoStatus.Used != 0) {
+ if (answer_yes("Delete ToDo")) DoClear = true;
+ }
+ if (DoClear) {
+ printmsgerr("Deleting: ");
+ error=Phone->DeleteAllToDo(&s);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ while (1) {
+ error = Phone->GetNextToDo(&s,&ToDo,true);
+ if (error != ERR_NONE) break;
+ error = Phone->DeleteToDo(&s,&ToDo);
+ Print_Error(error);
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ } else {
+ printmsgerr("Done\n");
+ Print_Error(error);
+ }
+ }
+
+ Bookmark.Location = 1;
+ error = Phone->GetWAPBookmark(&s,&Bookmark);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
+ if (answer_yes("Delete WAP bookmarks")) {
+ printmsgerr("Deleting: ");
+ /* One thing to explain: DCT4 phones seems to have bug here.
+ * When delete for example first bookmark, phone change
+ * numeration for getting frame, not for deleting. So, we try to
+ * get 1'st bookmark. Inside frame is "correct" location. We use
+ * it later
+ */
+ while (error==ERR_NONE) {
+ error = Phone->DeleteWAPBookmark(&s,&Bookmark);
+ Bookmark.Location = 1;
+ error = Phone->GetWAPBookmark(&s,&Bookmark);
+ printmsgerr("*");
+ }
+ printmsgerr("\n");
+ }
+ }
+ if (Phone->DeleteUserRingtones != NOTSUPPORTED) {
+ if (answer_yes("Delete all user ringtones")) {
+ printmsgerr("Deleting: ");
+ error=Phone->DeleteUserRingtones(&s);
+ Print_Error(error);
+ printmsgerr("Done\n");
+ }
+ }
+ Station.Location=i;
+ error=Phone->GetFMStation(&s,&Station);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes("Delete all FM station")) {
+ error=Phone->ClearFMStations(&s);
+ Print_Error(error);
+ }
+ }
+
+ GSM_Terminate();
+}
+
+static void DisplayConnectionSettings(GSM_MultiWAPSettings *settings,int j)
+{
+ if (settings->Settings[j].IsContinuous) {
+ printmsg("Connection type : Continuous\n");
+ } else {
+ printmsg("Connection type : Temporary\n");
+ }
+ if (settings->Settings[j].IsSecurity) {
+ printmsg("Connection security : On\n");
+ } else {
+ printmsg("Connection security : Off\n");
+ }
+ printmsg("Proxy : address \"%s\", port %i\n",DecodeUnicodeConsole(settings->Proxy),settings->ProxyPort);
+ printmsg("2'nd proxy : address \"%s\", port %i\n",DecodeUnicodeConsole(settings->Proxy2),settings->Proxy2Port);
+ switch (settings->Settings[j].Bearer) {
+ case WAPSETTINGS_BEARER_SMS:
+ printmsg("Bearer : SMS");
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_SMS) printf(" (active)");
+ printmsg("\nServer number : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Server));
+ printmsg("Service number : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Service));
+ break;
+ case WAPSETTINGS_BEARER_DATA:
+ printmsg("Bearer : Data (CSD)");
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_DATA) printf(" (active)");
+ printmsg("\nDial-up number : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].DialUp));
+ printmsg("IP address : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].IPAddress));
+ if (settings->Settings[j].ManualLogin) {
+ printmsg("Login Type : Manual\n");
+ } else {
+ printmsg("Login Type : Automatic\n");
+ }
+ if (settings->Settings[j].IsNormalAuthentication) {
+ printmsg("Authentication type : Normal\n");
+ } else {
+ printmsg("Authentication type : Secure\n");
+ }
+ if (settings->Settings[j].IsISDNCall) {
+ printmsg("Data call type : ISDN\n");
+ } else {
+ printmsg("Data call type : Analogue\n");
+ }
+ switch (settings->Settings[j].Speed) {
+ case WAPSETTINGS_SPEED_9600 : printmsg("Data call speed : 9600\n"); break;
+ case WAPSETTINGS_SPEED_14400 : printmsg("Data call speed : 14400\n"); break;
+ case WAPSETTINGS_SPEED_AUTO : printmsg("Data call speed : Auto\n"); break;
+ }
+ printmsg("User name : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].User));
+ printmsg("Password : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Password));
+ break;
+ case WAPSETTINGS_BEARER_USSD:
+ printmsg("Bearer : USSD");
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_USSD) printf(" (active)");
+ printmsg("\nService code : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Code));
+ if (settings->Settings[j].IsIP) {
+ printmsg("Address type : IP address\nIPaddress : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Service));
+ } else {
+ printmsg("Address type : Service number\nService number : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Service));
+ }
+ break;
+ case WAPSETTINGS_BEARER_GPRS:
+ printmsg("Bearer : GPRS");
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_GPRS) printf(" (active)");
+ if (settings->Settings[j].ManualLogin) {
+ printmsg("\nLogin Type : Manual\n");
+ } else {
+ printmsg("\nLogin Type : Automatic\n");
+ }
+ if (settings->Settings[j].IsNormalAuthentication) {
+ printmsg("Authentication type : Normal\n");
+ } else {
+ printmsg("Authentication type : Secure\n");
+ }
+ printmsg("Access point : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].DialUp));
+ printmsg("IP address : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].IPAddress));
+ printmsg("User name : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].User));
+ printmsg("Password : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Password));
+ }
+}
+
+static void GetSyncMLSettings(int argc, char *argv[])
+{
+ GSM_SyncMLSettings settings;
+ int start,stop,j;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ settings.Location=i;
+ error=Phone->GetSyncMLSettings(&s,&settings);
+ Print_Error(error);
+ printmsg("%i. ",i);
+ if (settings.Name[0]==0 && settings.Name[1]==0) {
+ printmsg("Set %i",i);
+ } else {
+ printmsg("%s",DecodeUnicodeConsole(settings.Name));
+ }
+ if (settings.Active) printmsg(" (active)");
+// if (settings.ReadOnly) printmsg("\nRead only : yes");
+ printmsg("\n");
+ printmsg("User : \"%s\"\n",DecodeUnicodeConsole(settings.User));
+ printmsg("Password : \"%s\"\n",DecodeUnicodeConsole(settings.Password));
+ printmsg("Phonebook database : \"%s\"\n",DecodeUnicodeConsole(settings.PhonebookDataBase));
+ printmsg("Calendar database : \"%s\"\n",DecodeUnicodeConsole(settings.CalendarDataBase));
+ printmsg("Server : \"%s\"\n",DecodeUnicodeConsole(settings.Server));
+ printmsg("Sync. phonebook : ");
+ if (settings.SyncPhonebook) printmsg("yes\n");
+ if (!settings.SyncPhonebook) printmsg("no\n");
+ printmsg("Sync. calendar : ");
+ if (settings.SyncCalendar) printmsg("yes\n");
+ if (!settings.SyncCalendar) printmsg("no\n");
+ printmsg("\n");
+ for (j=0;j<settings.Connection.Number;j++) {
+ if (settings.Connection.Settings[j].Title[0]==0 && settings.Connection.Settings[j].Title[1]==0) {
+ printmsg("Connection set name : Set %i\n",i);
+ } else {
+ printmsg("Connection set name : %s\n",DecodeUnicodeConsole(settings.Connection.Settings[j].Title));
+ }
+ DisplayConnectionSettings(&settings.Connection,j);
+ printf("\n");
+ }
+ }
+ GSM_Terminate();
+}
+
+static void GetChatSettings(int argc, char *argv[])
+{
+ GSM_ChatSettings settings;
+ int start,stop,j;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ settings.Location=i;
+ error=Phone->GetChatSettings(&s,&settings);
+ Print_Error(error);
+ printmsg("%i. ",i);
+ if (settings.Name[0]==0 && settings.Name[1]==0) {
+ printmsg("Set %i",i);
+ } else {
+ printmsg("%s",DecodeUnicodeConsole(settings.Name));
+ }
+ if (settings.Active) printmsg(" (active)");
+// if (settings.ReadOnly) printmsg("\nRead only : yes");
+ printmsg("\n");
+ printmsg("Homepage : \"%s\"\n",DecodeUnicodeConsole(settings.HomePage));
+ printmsg("User : \"%s\"\n",DecodeUnicodeConsole(settings.User));
+ printmsg("Password : \"%s\"\n",DecodeUnicodeConsole(settings.Password));
+ printmsg("\n");
+ for (j=0;j<settings.Connection.Number;j++) {
+ if (settings.Connection.Settings[j].Title[0]==0 && settings.Connection.Settings[j].Title[1]==0) {
+ printmsg("Connection set name : Set %i\n",i);
+ } else {
+ printmsg("Connection set name : %s\n",DecodeUnicodeConsole(settings.Connection.Settings[j].Title));
+ }
+ DisplayConnectionSettings(&settings.Connection,j);
+ printf("\n");
+ }
+ }
+ GSM_Terminate();
+}
+
+static void GetWAPMMSSettings(int argc, char *argv[])
+{
+ GSM_MultiWAPSettings settings;
+ int start,stop,j;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ settings.Location=i;
+ if (mystrncasecmp(argv[1],"--getwapsettings",0)) {
+ error=Phone->GetWAPSettings(&s,&settings);
+ } else {
+ error=Phone->GetMMSSettings(&s,&settings);
+ }
+ Print_Error(error);
+ for (j=0;j<settings.Number;j++) {
+ printmsg("%i. ",i);
+ if (settings.Settings[j].Title[0]==0 && settings.Settings[j].Title[1]==0) {
+ printmsg("Set %i",i);
+ } else {
+ printmsg("%s",DecodeUnicodeConsole(settings.Settings[j].Title));
+ }
+ if (settings.Active) printmsg(" (active)");
+ if (settings.ReadOnly) printmsg("\nRead only : yes");
+ printmsg("\nHomepage : \"%s\"\n",DecodeUnicodeConsole(settings.Settings[j].HomePage));
+ DisplayConnectionSettings(&settings,j);
+ printf("\n");
+ }
+ }
+ GSM_Terminate();
+}
+
+#ifdef GSM_ENABLE_BACKUP
+static void BackupSMS(int argc, char *argv[])
+{
+ GSM_SMS_Backup Backup;
+ GSM_MultiSMSMessage sms;
+ GSM_SMSFolders folders;
+ bool BackupFromFolder[GSM_MAX_SMS_FOLDERS];
+ bool start = true;
+ bool DeleteAfter;
+ int j, smsnum;
+ char buffer[200];
+
+ /* We ignore return code, because (when file doesn't exist) we
+ * will create new later
+ */
+ GSM_ReadSMSBackupFile(argv[2], &Backup);
+ smsnum = 0;
+ while (Backup.SMS[smsnum]!=NULL) smsnum++;
+
+ GSM_Init(true);
+
+ error=Phone->GetSMSFolders(&s, &folders);
+ Print_Error(error);
+
+ DeleteAfter=answer_yes("Delete each sms after backup");
+
+ for (j=0;j<folders.Number;j++) {
+ BackupFromFolder[j] = false;
+ sprintf(buffer,"Backup sms from folder \"%s\"",DecodeUnicodeConsole(folders.Folder[j].Name));
+ if (answer_yes(buffer)) BackupFromFolder[j] = true;
+ }
+
+ while (error == ERR_NONE) {
+ sms.SMS[0].Folder=0x00;
+ error=Phone->GetNextSMS(&s, &sms, start);
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ default:
+ Print_Error(error);
+ for (j=0;j<sms.Number;j++) {
+ if (BackupFromFolder[sms.SMS[j].Folder-1]) {
+ switch (sms.SMS[j].PDU) {
+ case SMS_Status_Report:
+ break;
+ case SMS_Submit:
+ case SMS_Deliver:
+ if (sms.SMS[j].Length == 0) break;
+ if (smsnum < GSM_BACKUP_MAX_SMS) {
+ Backup.SMS[smsnum] = malloc(sizeof(GSM_SMSMessage));
+ if (Backup.SMS[smsnum] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.SMS[smsnum+1] = NULL;
+ } else {
+ printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_SMS");
+ GSM_Terminate();
+ exit(-1);
+ }
+ *Backup.SMS[smsnum] = sms.SMS[j];
+ smsnum++;
+ break;
+ }
+ }
+ }
+ }
+ start=false;
+ }
+
+ error = GSM_SaveSMSBackupFile(argv[2],&Backup);
+ Print_Error(error);
+
+ if (DeleteAfter) {
+ for (j=0;j<smsnum;j++) {
+ Backup.SMS[j]->Folder = 0;
+ error=Phone->DeleteSMS(&s, Backup.SMS[j]);
+ Print_Error(error);
+ printmsgerr("%cDeleting: %i percent",13,(j+1)*100/smsnum);
+ }
+ }
+
+ GSM_Terminate();
+}
+
+static void AddSMS(int argc, char *argv[])
+{
+ GSM_MultiSMSMessage SMS;
+ GSM_SMS_Backup Backup;
+ int smsnum = 0;
+ int folder;
+
+ folder = atoi(argv[2]);
+
+ error = GSM_ReadSMSBackupFile(argv[3], &Backup);
+ Print_Error(error);
+
+ GSM_Init(true);
+
+ while (Backup.SMS[smsnum] != NULL) {
+ Backup.SMS[smsnum]->Folder = folder;
+ Backup.SMS[smsnum]->SMSC.Location = 1;
+ SMS.Number = 1;
+ SMS.SMS[0] = *Backup.SMS[smsnum];
+ displaymultismsinfo(SMS,false,false);
+ if (answer_yes("Restore sms")) {
+ error=Phone->AddSMS(&s, Backup.SMS[smsnum]);
+ Print_Error(error);
+ }
+ smsnum++;
+ }
+
+ GSM_Terminate();
+}
+
+static void RestoreSMS(int argc, char *argv[])
+{
+ GSM_MultiSMSMessage SMS;
+ GSM_SMS_Backup Backup;
+ GSM_SMSFolders folders;
+ int smsnum = 0;
+ char buffer[200];
+
+ error=GSM_ReadSMSBackupFile(argv[2], &Backup);
+ Print_Error(error);
+
+ GSM_Init(true);
+
+ error=Phone->GetSMSFolders(&s, &folders);
+ Print_Error(error);
+
+ while (Backup.SMS[smsnum] != NULL) {
+ SMS.Number = 1;
+ memcpy(&SMS.SMS[0],Backup.SMS[smsnum],sizeof(GSM_SMSMessage));
+ displaymultismsinfo(SMS,false,false);
+ sprintf(buffer,"Restore sms to folder \"%s\"",DecodeUnicodeConsole(folders.Folder[Backup.SMS[smsnum]->Folder-1].Name));
+ if (answer_yes(buffer)) {
+ Backup.SMS[smsnum]->Location = 0;
+ error=Phone->SetSMS(&s, Backup.SMS[smsnum]);
+ Print_Error(error);
+ }
+ smsnum++;
+ }
+
+ GSM_Terminate();
+}
+#endif
+
+static void CopyBitmap(int argc, char *argv[])
+{
+ GSM_MultiBitmap Bitmap;
+ int i;
+
+ Bitmap.Bitmap[0].Type = GSM_None;
+
+ error=GSM_ReadBitmapFile(argv[2],&Bitmap);
+ Print_Error(error);
+
+ if (argc==3) {
+ for (i=0;i<Bitmap.Number;i++) {
+ switch (Bitmap.Bitmap[i].Type) {
+ case GSM_StartupLogo : printmsg("Startup logo"); break;
+ case GSM_OperatorLogo: printmsg("Operator logo"); break;
+ case GSM_PictureImage: printmsg("Picture Image"); break;
+ case GSM_CallerGroupLogo : printmsg("Caller group logo"); break;
+ default : break;
+ }
+ printmsg(", width %i, height %i\n",Bitmap.Bitmap[i].BitmapWidth,Bitmap.Bitmap[i].BitmapHeight);
+ GSM_PrintBitmap(stdout,&Bitmap.Bitmap[i]);
+ }
+ } else {
+ if (argc == 5) {
+ for (i=0;i<Bitmap.Number;i++) {
+ if (mystrncasecmp(argv[4],"PICTURE",0)) {
+ Bitmap.Bitmap[i].Type = GSM_PictureImage;
+ } else if (mystrncasecmp(argv[4],"STARTUP",0)) {
+ Bitmap.Bitmap[i].Type = GSM_StartupLogo;
+ } else if (mystrncasecmp(argv[4],"CALLER",0)) {
+ Bitmap.Bitmap[i].Type = GSM_CallerGroupLogo;
+ } else if (mystrncasecmp(argv[4],"OPERATOR",0)) {
+ Bitmap.Bitmap[i].Type = GSM_OperatorLogo;
+ } else {
+ printmsg("What format of output file logo (\"%s\") ?\n",argv[4]);
+ exit(-1);
+ }
+ }
+ }
+ error=GSM_SaveBitmapFile(argv[3],&Bitmap);
+ Print_Error(error);
+ }
+}
+
+static void NokiaComposer(int argc, char *argv[])
+{
+ GSM_Ringtone ringtone;
+ bool started;
+ int i,j;
+ GSM_RingNote *Note;
+ GSM_RingNoteDuration Duration;
+ GSM_RingNoteDuration DefNoteDuration = 32; /* 32 = Duration_1_4 */
+ unsigned int DefNoteScale = Scale_880;
+
+ ringtone.Format = 0;
+ error=GSM_ReadRingtoneFile(argv[2],&ringtone);
+
+ if (ringtone.Format != RING_NOTETONE) {
+ printmsg("It can be RTTL ringtone only used with this option\n");
+ exit(-1);
+ }
+
+ started = false;
+ j = 0;
+ for (i=0;i<ringtone.NoteTone.NrCommands;i++) {
+ if (ringtone.NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone.NoteTone.Commands[i].Note;
+ if (!started) {
+ if (Note->Note != Note_Pause) {
+ printmsg("Ringtone \"%s\" (tempo = %i Beats Per Minute)\n\n",DecodeUnicodeConsole(ringtone.Name),GSM_RTTLGetTempo(Note->Tempo));
+ started = true;
+ }
+ }
+ if (started) j++;
+ }
+ }
+ if (j>50) printmsg("WARNING: LENGTH=%i NOTES, BUT YOU WILL ENTER ONLY FIRST 50 TONES.",j);
+
+ printmsg("\n\nThis ringtone in Nokia Composer in phone should look: ");
+ started = false;
+ for (i=0;i<ringtone.NoteTone.NrCommands;i++) {
+ if (ringtone.NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone.NoteTone.Commands[i].Note;
+ if (!started) {
+ if (Note->Note != Note_Pause) started = true;
+ }
+ if (started) {
+ switch (Note->Duration) {
+ case Duration_Full: printmsg("1"); break;
+ case Duration_1_2 : printmsg("2"); break;
+ case Duration_1_4 : printmsg("4"); break;
+ case Duration_1_8 : printmsg("8"); break;
+ case Duration_1_16: printmsg("16");break;
+ case Duration_1_32: printmsg("32");break;
+ }
+ if (Note->DurationSpec == DottedNote) printmsg(".");
+ switch (Note->Note) {
+ case Note_C : printmsg("c"); break;
+ case Note_Cis : printmsg("#c"); break;
+ case Note_D :printmsg("d"); break;
+ case Note_Dis : printmsg("#d"); break;
+ case Note_E : printmsg("e"); break;
+ case Note_F : printmsg("f"); break;
+ case Note_Fis : printmsg("#f"); break;
+ case Note_G : printmsg("g"); break;
+ case Note_Gis : printmsg("#g"); break;
+ case Note_A : printmsg("a"); break;
+ case Note_Ais : printmsg("#a"); break;
+ case Note_H : printmsg("h"); break;
+ case Note_Pause : printmsg("-"); break;
+ }
+ if (Note->Note != Note_Pause) printmsg("%i",Note->Scale - 4);
+ printmsg(" ");
+ }
+ }
+ }
+
+ printmsg("\n\nTo enter it please press: ");
+ started = false;
+ for (i=0;i<ringtone.NoteTone.NrCommands;i++) {
+ if (ringtone.NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone.NoteTone.Commands[i].Note;
+ if (!started) {
+ if (Note->Note != Note_Pause) started = true;
+ }
+ if (started) {
+ switch (Note->Note) {
+ case Note_C : case Note_Cis: printmsg("1");break;
+ case Note_D : case Note_Dis: printmsg("2");break;
+ case Note_E : printmsg("3");break;
+ case Note_F : case Note_Fis: printmsg("4");break;
+ case Note_G : case Note_Gis: printmsg("5");break;
+ case Note_A : case Note_Ais: printmsg("6");break;
+ case Note_H : printmsg("7");break;
+ default : printmsg("0");break;
+ }
+ if (Note->DurationSpec == DottedNote) printmsg("(longer)");
+ switch (Note->Note) {
+ case Note_Cis: case Note_Dis:
+ case Note_Fis: case Note_Gis:
+ case Note_Ais:
+ printmsg("#");
+ break;
+ default :
+ break;
+ }
+ if (Note->Note != Note_Pause) {
+ if ((unsigned int)Note->Scale != DefNoteScale) {
+ while (DefNoteScale != (unsigned int)Note->Scale) {
+ printmsg("*");
+ DefNoteScale++;
+ if (DefNoteScale==Scale_7040) DefNoteScale = Scale_880;
+ }
+ }
+ }
+ Duration = 0;
+ switch (Note->Duration) {
+ case Duration_Full : Duration = 128; break;
+ case Duration_1_2 : Duration = 64; break;
+ case Duration_1_4 : Duration = 32; break;
+ case Duration_1_8 : Duration = 16; break;
+ case Duration_1_16 : Duration = 8; break;
+ case Duration_1_32 : Duration = 4; break;
+ default : dbgprintf("error\n");break;
+ }
+ if (Duration > DefNoteDuration) {
+ while (DefNoteDuration != Duration) {
+ printmsg("9");
+ DefNoteDuration = DefNoteDuration * 2;
+ }
+ }
+ if (Duration < DefNoteDuration) {
+ while (DefNoteDuration != Duration) {
+ printmsg("8");
+ DefNoteDuration = DefNoteDuration / 2;
+ }
+ }
+ printmsg(" ");
+ }
+ }
+ }
+
+ printf("\n");
+}
+//#if 0
+static void CopyRingtone(int argc, char *argv[])
+{
+ GSM_Ringtone ringtone, ringtone2;
+ GSM_RingtoneFormat Format;
+
+ ringtone.Format = 0;
+ error=GSM_ReadRingtoneFile(argv[2],&ringtone);
+ Print_Error(error);
+
+ Format = ringtone.Format;
+ if (argc == 5) {
+ if (mystrncasecmp(argv[4],"RTTL",0)) { Format = RING_NOTETONE;
+ } else if (mystrncasecmp(argv[4],"BINARY",0)) { Format = RING_NOKIABINARY;
+ } else {
+ printmsg("What format of output ringtone file (\"%s\") ?\n",argv[4]);
+ exit(-1);
+ }
+ }
+
+ error=GSM_RingtoneConvert(&ringtone2,&ringtone,Format);
+ Print_Error(error);
+
+ error=GSM_SaveRingtoneFile(argv[3],&ringtone2);
+ Print_Error(error);
+}
+
+static void PressKeySequence(int argc, char *argv[])
+{
+ int i,Length;
+ GSM_KeyCode KeyCode[500];
+
+ error = MakeKeySequence(argv[2], KeyCode, &Length);
+ if (error == ERR_NOTSUPPORTED) {
+ printmsg("Unknown key/function name: \"%c\"\n",argv[2][Length]);
+ exit(-1);
+ }
+
+ GSM_Init(true);
+
+ for (i=0;i<Length;i++) {
+ error=Phone->PressKey(&s, KeyCode[i], true);
+ Print_Error(error);
+ error=Phone->PressKey(&s, KeyCode[i], false);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+static void GetAllCategories(int argc, char *argv[])
+{
+ GSM_Category Category;
+ GSM_CategoryStatus Status;
+ int j, count;
+
+ if (mystrncasecmp(argv[2],"TODO",0)) {
+ Category.Type = Category_ToDo;
+ Status.Type = Category_ToDo;
+ } else if (mystrncasecmp(argv[2],"PHONEBOOK",0)) {
+ Category.Type = Category_Phonebook;
+ Status.Type = Category_Phonebook;
+ } else {
+ printmsg("What type of categories do you want to get (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ GSM_Init(true);
+
+ error=Phone->GetCategoryStatus(&s, &Status);
+ Print_Error(error);
+
+ for (count=0,j=1;count<Status.Used;j++)
+ {
+ Category.Location=j;
+ error=Phone->GetCategory(&s, &Category);
+
+ if (error != ERR_EMPTY) {
+ printmsg("Location: %i\n",j);
+
+ Print_Error(error);
+
+ printmsg("Name : \"%s\"\n\n",DecodeUnicodeConsole(Category.Name));
+ count++;
+ }
+ }
+
+ GSM_Terminate();
+}
+
+static void GetCategory(int argc, char *argv[])
+{
+ GSM_Category Category;
+ int start,stop,j;
+
+ if (mystrncasecmp(argv[2],"TODO",0)) {
+ Category.Type = Category_ToDo;
+ } else if (mystrncasecmp(argv[2],"PHONEBOOK",0)) {
+ Category.Type = Category_Phonebook;
+ } else {
+ printmsg("What type of categories do you want to get (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ GetStartStop(&start, &stop, 2, argc - 1, argv + 1);
+
+ GSM_Init(true);
+
+ for (j=start;j<=stop;j++)
+ {
+ printmsg("Location: %i\n",j);
+
+ Category.Location=j;
+
+ error=Phone->GetCategory(&s, &Category);
+ if (error != ERR_EMPTY) Print_Error(error);
+
+ if (error == ERR_EMPTY) {
+ printmsg("Entry is empty\n\n");
+ } else {
+ printmsg("Name : \"%s\"\n\n",DecodeUnicodeConsole(Category.Name));
+ }
+ }
+
+ GSM_Terminate();
+}
+
+static void DeleteToDo(int argc, char *argv[])
+{
+ GSM_ToDoEntry ToDo;
+ int i;
+ int start,stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ ToDo.Location=i;
+ printmsg("Location : %i\n",i);
+ error=Phone->DeleteToDo(&s,&ToDo);
+ if (error != ERR_EMPTY) Print_Error(error);
+
+ if (error == ERR_EMPTY) {
+ printmsg("Entry was empty\n");
+ } else {
+ printmsg("Entry was deleted\n");
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+static void PrintToDo(GSM_ToDoEntry *ToDo)
+{
+ int j;
+ GSM_MemoryEntry entry;
+ unsigned char *name;
+ GSM_Category Category;
+
+ printmsg("Location : %i\n",ToDo->Location);
+ printmsg("Priority : ");
+ switch (ToDo->Priority) {
+ case GSM_Priority_Low : printmsg("Low\n"); break;
+ case GSM_Priority_Medium : printmsg("Medium\n"); break;
+ case GSM_Priority_High : printmsg("High\n"); break;
+ default : printmsg("Unknown\n"); break;
+ }
+ for (j=0;j<ToDo->EntriesNum;j++) {
+ switch (ToDo->Entries[j].EntryType) {
+ case TODO_END_DATETIME:
+ printmsg("DueTime : %s\n",OSDateTime(ToDo->Entries[j].Date,false));
+ break;
+ case TODO_COMPLETED:
+ printmsg("Completed : %s\n",ToDo->Entries[j].Number == 1 ? "Yes" : "No");
+ break;
+ case TODO_ALARM_DATETIME:
+ printmsg("Alarm : %s\n",OSDateTime(ToDo->Entries[j].Date,false));
+ break;
+ case TODO_SILENT_ALARM_DATETIME:
+ printmsg("Silent alarm : %s\n",OSDateTime(ToDo->Entries[j].Date,false));
+ break;
+ case TODO_TEXT:
+ printmsg("Text : \"%s\"\n",DecodeUnicodeConsole(ToDo->Entries[j].Text));
+ break;
+ case TODO_PRIVATE:
+ printmsg("Private : %s\n",ToDo->Entries[j].Number == 1 ? "Yes" : "No");
+ break;
+ case TODO_CATEGORY:
+ Category.Location = ToDo->Entries[j].Number;
+ Category.Type = Category_ToDo;
+ error=Phone->GetCategory(&s, &Category);
+ if (error == ERR_NONE) {
+ printmsg("Category : \"%s\" (%i)\n", DecodeUnicodeConsole(Category.Name), ToDo->Entries[j].Number);
+ } else {
+ printmsg("Category : %i\n", ToDo->Entries[j].Number);
+ }
+ break;
+ case TODO_CONTACTID:
+ entry.Location = ToDo->Entries[j].Number;
+ entry.MemoryType = MEM_ME;
+ error=Phone->GetMemory(&s, &entry);
+ if (error == ERR_NONE) {
+ name = GSM_PhonebookGetEntryName(&entry);
+ if (name != NULL) {
+ printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), ToDo->Entries[j].Number);
+ } else {
+ printmsg("Contact ID : %d\n",ToDo->Entries[j].Number);
+ }
+ } else {
+ printmsg("Contact : %d\n",ToDo->Entries[j].Number);
+ }
+ break;
+ case TODO_PHONE:
+ printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(ToDo->Entries[j].Text));
+ break;
+ }
+ }
+ printf("\n");
+}
+
+static void ListToDoCategoryEntries(int Category)
+{
+ GSM_ToDoEntry Entry;
+ bool start = true;
+ int j;
+
+ while (!gshutdown) {
+ error = Phone->GetNextToDo(&s, &Entry, start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ for (j=0;j<Entry.EntriesNum;j++) {
+ if (Entry.Entries[j].EntryType == TODO_CATEGORY && Entry.Entries[j].Number == (unsigned int)Category)
+ PrintToDo(&Entry);
+ }
+ start = false;
+ }
+}
+
+static void ListToDoCategory(int argc, char *argv[])
+{
+ GSM_Category Category;
+ GSM_CategoryStatus Status;
+ int j, count;
+
+ unsigned char Text[(GSM_MAX_CATEGORY_NAME_LENGTH+1)*2];
+ int Length;
+ bool Number = true;;
+
+ GSM_Init(true);
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ Length = strlen(argv[2]);
+ for (j = 0; j < Length; j++) {
+ if (!isdigit(argv[2][j])) {
+ Number = false;
+ break;
+ }
+ }
+
+ if (Number) {
+ j = atoi(argv[2]);
+ if (j > 0) {
+ ListToDoCategoryEntries(j);
+ }
+ } else {
+ if (Length > GSM_MAX_CATEGORY_NAME_LENGTH) {
+ printmsg("Search text too long, truncating to %d chars!\n", GSM_MAX_CATEGORY_NAME_LENGTH);
+ Length = GSM_MAX_CATEGORY_NAME_LENGTH;
+ }
+ EncodeUnicode(Text, argv[2], Length);
+
+ Category.Type = Category_ToDo;
+ Status.Type = Category_ToDo;
+
+ if (Phone->GetCategoryStatus(&s, &Status) == ERR_NONE) {
+ for (count=0,j=1;count<Status.Used;j++) {
+ Category.Location=j;
+ error=Phone->GetCategory(&s, &Category);
+
+ if (error != ERR_EMPTY) {
+ count++;
+ if (mystrstr(Category.Name, Text) != NULL) {
+ ListToDoCategoryEntries(j);
+ }
+ }
+ }
+ }
+ }
+ GSM_Terminate();
+}
+
+
+static void GetToDo(int argc, char *argv[])
+{
+ GSM_ToDoEntry ToDo;
+ int i;
+ int start,stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ ToDo.Location=i;
+ error = Phone->GetToDo(&s,&ToDo);
+ if (error == ERR_EMPTY) continue;
+ Print_Error(error);
+ PrintToDo(&ToDo);
+ }
+
+ GSM_Terminate();
+}
+
+static void GetAllToDo(int argc, char *argv[])
+{
+ GSM_ToDoEntry ToDo;
+ bool start = true;
+
+ signal(SIGINT, interrupt);
+ printmsgerr("Press Ctrl+C to break...\n");
+
+ GSM_Init(true);
+
+ while (!gshutdown) {
+ error = Phone->GetNextToDo(&s, &ToDo, start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ PrintToDo(&ToDo);
+ start = false;
+ }
+
+ GSM_Terminate();
+}
+
+static void GetNote(int argc, char *argv[])
+{
+ GSM_NoteEntry Note;
+ int start,stop;
+ bool refresh=true;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ Note.Location=i;
+ printmsg("Location : %i\n",i);
+ error=Phone->GetNote(&s,&Note,refresh);
+ if (error != ERR_EMPTY) Print_Error(error);
+
+ if (error == ERR_EMPTY) {
+ printmsg("Entry is empty\n\n");
+ } else {
+ printmsg("Text : \"%s\"\n",DecodeUnicodeConsole(Note.Text));
+ printf("\n");
+ refresh=false;
+ }
+ }
+
+ GSM_Terminate();
+}
+
+static void GetSecurityStatus(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ PrintSecurityStatus();
+
+ GSM_Terminate();
+}
+
+static void EnterSecurityCode(int argc, char *argv[])
+{
+ GSM_SecurityCode Code;
+
+ if (mystrncasecmp(argv[2],"PIN",0)) { Code.Type = SEC_Pin;
+ } else if (mystrncasecmp(argv[2],"PUK",0)) { Code.Type = SEC_Puk;
+ } else if (mystrncasecmp(argv[2],"PIN2",0)) { Code.Type = SEC_Pin2;
+ } else if (mystrncasecmp(argv[2],"PUK2",0)) { Code.Type = SEC_Puk2;
+ } else {
+ printmsg("What security code (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ strcpy(Code.Code,argv[3]);
+
+ GSM_Init(true);
+
+ error=Phone->EnterSecurityCode(&s,Code);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void GetProfile(int argc, char *argv[])
+{
+ GSM_Profile Profile;
+ int start,stop,j,k;
+ GSM_Bitmap caller[5];
+ bool callerinit[5],special;
+ GSM_AllRingtonesInfo Info;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ for (i=0;i<5;i++) callerinit[i] = false;
+
+ GSM_Init(true);
+
+ error=Phone->GetRingtonesInfo(&s,&Info);
+ if (error != ERR_NONE) Info.Number = 0;
+
+ for (i=start;i<=stop;i++) {
+ Profile.Location=i;
+ error=Phone->GetProfile(&s,&Profile);
+ Print_Error(error);
+
+ printmsg("%i. \"%s\"",i,DecodeUnicodeConsole(Profile.Name));
+ if (Profile.Active) printmsg(" (active)");
+ if (Profile.DefaultName) printmsg(" (default name)");
+ if (Profile.HeadSetProfile) printmsg(" (HeadSet profile)");
+ if (Profile.CarKitProfile) printmsg(" (CarKit profile)");
+ printf("\n");
+ for (j=0;j<Profile.FeaturesNumber;j++) {
+ special = false;
+ switch (Profile.FeatureID[j]) {
+ case Profile_MessageToneID:
+ case Profile_RingtoneID:
+ special = true;
+ if (Profile.FeatureID[j] == Profile_RingtoneID) {
+ printmsg("Ringtone ID : ");
+ } else {
+ printmsg("Message alert tone ID : ");
+ }
+ if (UnicodeLength(GSM_GetRingtoneName(&Info,Profile.FeatureValue[j]))!=0) {
+ printmsg("\"%s\"\n",DecodeUnicodeConsole(GSM_GetRingtoneName(&Info,Profile.FeatureValue[j])));
+ } else {
+ printmsg("%i\n",Profile.FeatureValue[j]);
+ }
+ break;
+ case Profile_CallerGroups:
+ special = true;
+ printmsg("Call alert for :");
+ for (k=0;k<5;k++) {
+ if (Profile.CallerGroups[k]) {
+ if (!callerinit[k]) {
+ caller[k].Type = GSM_CallerGroupLogo;
+ caller[k].Location = k + 1;
+ error=Phone->GetBitmap(&s,&caller[k]);
+ if (error == ERR_SECURITYERROR) {
+ NOKIA_GetDefaultCallerGroupName(&s,&caller[k]);
+ } else {
+ Print_Error(error);
+ }
+ callerinit[k] = true;
+ }
+ printmsg(" \"%s\"",DecodeUnicodeConsole(caller[k].Text));
+ }
+ }
+ printf("\n");
+ break;
+ case Profile_ScreenSaverNumber:
+ special = true;
+ printmsg("Screen saver number : ");
+ printmsg("%i\n",Profile.FeatureValue[j]);
+ break;
+ case Profile_CallAlert : printmsg("Incoming call alert : "); break;
+ case Profile_RingtoneVolume : printmsg("Ringtone volume : "); break;
+ case Profile_Vibration : printmsg("Vibrating alert : "); break;
+ case Profile_MessageTone : printmsg("Message alert tone : "); break;
+ case Profile_KeypadTone : printmsg("Keypad tones : "); break;
+ case Profile_WarningTone : printmsg("Warning (games) tones : "); break;
+ case Profile_ScreenSaver : printmsg("Screen saver : "); break;
+ case Profile_ScreenSaverTime : printmsg("Screen saver timeout : "); break;
+ case Profile_AutoAnswer : printmsg("Automatic answer : "); break;
+ case Profile_Lights : printmsg("Lights : "); break;
+ default:
+ printmsg("Unknown\n");
+ special = true;
+ }
+ if (!special) {
+ switch (Profile.FeatureValue[j]) {
+ case PROFILE_VOLUME_LEVEL1 :
+ case PROFILE_KEYPAD_LEVEL1 : printmsg("Level 1\n"); break;
+ case PROFILE_VOLUME_LEVEL2 :
+ case PROFILE_KEYPAD_LEVEL2 : printmsg("Level 2\n"); break;
+ case PROFILE_VOLUME_LEVEL3 :
+ case PROFILE_KEYPAD_LEVEL3 : printmsg("Level 3\n"); break;
+ case PROFILE_VOLUME_LEVEL4 : printmsg("Level 4\n"); break;
+ case PROFILE_VOLUME_LEVEL5 : printmsg("Level 5\n"); break;
+ case PROFILE_MESSAGE_NOTONE :
+ case PROFILE_AUTOANSWER_OFF :
+ case PROFILE_LIGHTS_OFF :
+ case PROFILE_SAVER_OFF :
+ case PROFILE_WARNING_OFF :
+ case PROFILE_CALLALERT_OFF :
+ case PROFILE_VIBRATION_OFF :
+ case PROFILE_KEYPAD_OFF : printmsg("Off\n"); break;
+ case PROFILE_CALLALERT_RINGING : printmsg("Ringing\n"); break;
+ case PROFILE_CALLALERT_BEEPONCE :
+ case PROFILE_MESSAGE_BEEPONCE : printmsg("Beep once\n"); break;
+ case PROFILE_CALLALERT_RINGONCE : printmsg("Ring once\n"); break;
+ case PROFILE_CALLALERT_ASCENDING : printmsg("Ascending\n"); break;
+ case PROFILE_CALLALERT_CALLERGROUPS : printmsg("Caller groups\n"); break;
+ case PROFILE_MESSAGE_STANDARD : printmsg("Standard\n"); break;
+ case PROFILE_MESSAGE_SPECIAL : printmsg("Special\n"); break;
+ case PROFILE_MESSAGE_ASCENDING : printmsg("Ascending\n"); break;
+ case PROFILE_MESSAGE_PERSONAL : printmsg("Personal\n"); break;
+ case PROFILE_AUTOANSWER_ON :
+ case PROFILE_WARNING_ON :
+ case PROFILE_SAVER_ON :
+ case PROFILE_VIBRATION_ON : printmsg("On\n"); break;
+ case PROFILE_VIBRATION_FIRST : printmsg("Vibrate first\n"); break;
+ case PROFILE_LIGHTS_AUTO : printmsg("Auto\n"); break;
+ case PROFILE_SAVER_TIMEOUT_5SEC : printmsg("5 seconds\n"); break;
+ case PROFILE_SAVER_TIMEOUT_20SEC : printmsg("20 seconds\n"); break;
+ case PROFILE_SAVER_TIMEOUT_1MIN : printmsg("1 minute\n"); break;
+ case PROFILE_SAVER_TIMEOUT_2MIN : printmsg("2 minutes\n"); break;
+ case PROFILE_SAVER_TIMEOUT_5MIN : printmsg("5 minutes\n"); break;
+ case PROFILE_SAVER_TIMEOUT_10MIN : printmsg("10 minutes\n"); break;
+ default : printmsg("UNKNOWN\n");
+ }
+ }
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+static void GetSpeedDial(int argc, char *argv[])
+{
+ GSM_SpeedDial SpeedDial;
+ GSM_MemoryEntry Phonebook;
+ int start,stop,Name,Number,Group;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ SpeedDial.Location=i;
+ error=Phone->GetSpeedDial(&s,&SpeedDial);
+ printmsg("%i.",i);
+ switch (error) {
+ case ERR_EMPTY:
+ printmsg(" speed dial not assigned\n");
+ break;
+ default:
+ Print_Error(error);
+
+ Phonebook.Location = SpeedDial.MemoryLocation;
+ Phonebook.MemoryType = SpeedDial.MemoryType;
+ error=Phone->GetMemory(&s,&Phonebook);
+
+ GSM_PhonebookFindDefaultNameNumberGroup(&Phonebook, &Name, &Number, &Group);
+
+ if (Name != -1) printmsg(" Name \"%s\",",DecodeUnicodeConsole(Phonebook.Entries[Name].Text));
+ printmsg(" Number \"%s\"",DecodeUnicodeConsole(Phonebook.Entries[SpeedDial.MemoryNumberID-1].Text));
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+static void ResetPhoneSettings(int argc, char *argv[])
+{
+ GSM_ResetSettingsType Type;
+
+ if (mystrncasecmp(argv[2],"PHONE",0)) { Type = GSM_RESET_PHONESETTINGS;
+ } else if (mystrncasecmp(argv[2],"UIF",0)) { Type = GSM_RESET_USERINTERFACE;
+ } else if (mystrncasecmp(argv[2],"ALL",0)) { Type = GSM_RESET_USERINTERFACE_PHONESETTINGS;
+ } else if (mystrncasecmp(argv[2],"DEV",0)) { Type = GSM_RESET_DEVICE;
+ } else if (mystrncasecmp(argv[2],"FACTORY",0)) { Type = GSM_RESET_FULLFACTORY;
+ } else {
+ printmsg("What type of reset phone settings (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ GSM_Init(true);
+
+ error=Phone->ResetPhoneSettings(&s,Type);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+static void NokiaSecurityCode(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3GetSecurityCode(argc,argv);
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+// DCT4ResetSecurityCode(argc, argv);
+ DCT4GetSecurityCode(argc,argv);
+#endif
+
+ GSM_Terminate();
+}
+
+static void NokiaSetPhoneMenus(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3SetPhoneMenus (argc, argv);
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ DCT4SetPhoneMenus (argc, argv);
+#endif
+
+ GSM_Terminate();
+}
+
+static void NokiaSelfTests(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3SelfTests(argc, argv);
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ DCT4SelfTests(argc, argv);
+#endif
+
+ GSM_Terminate();
+}
+#endif
+
+static void DeleteAllSMS(int argc, char *argv[])
+{
+ GSM_MultiSMSMessage sms;
+ GSM_SMSFolders folders;
+ int foldernum;
+ bool start = true;
+
+ GSM_Init(true);
+
+ error=Phone->GetSMSFolders(&s, &folders);
+ Print_Error(error);
+
+ GetStartStop(&foldernum, NULL, 2, argc, argv);
+ if (foldernum > folders.Number) {
+ printmsg("Too high folder number (max. %i)\n",folders.Number);
+ GSM_Terminate();
+ exit(-1);
+ }
+
+ printmsg("Deleting SMS from \"%s\" folder: ",DecodeUnicodeConsole(folders.Folder[foldernum-1].Name));
+
+ while (error == ERR_NONE) {
+ sms.SMS[0].Folder=0x00;
+ error=Phone->GetNextSMS(&s, &sms, start);
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ default:
+ Print_Error(error);
+ if (sms.SMS[0].Folder == foldernum) {
+ sms.SMS[0].Folder=0x00;
+ error=Phone->DeleteSMS(&s, &sms.SMS[0]);
+ Print_Error(error);
+ printmsg("*");
+ }
+ }
+ start=false;
+ }
+
+ printf("\n");
+
+ GSM_Terminate();
+}
+
+static void SendDTMF(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ error=Phone->SendDTMF(&s,argv[2]);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static void GetDisplayStatus(int argc, char *argv[])
+{
+ GSM_DisplayFeatures Features;
+ int i;
+
+ GSM_Init(true);
+
+ error=Phone->GetDisplayStatus(&s,&Features);
+ Print_Error(error);
+
+ printmsg("Current display features :\n");
+
+ for (i=0;i<Features.Number;i++) {
+ switch(Features.Feature[i]) {
+ case GSM_CallActive : printmsg("Call active\n"); break;
+ case GSM_UnreadSMS : printmsg("Unread SMS\n"); break;
+ case GSM_VoiceCall : printmsg("Voice call\n"); break;
+ case GSM_FaxCall : printmsg("Fax call\n"); break;
+ case GSM_DataCall : printmsg("Data call\n"); break;
+ case GSM_KeypadLocked : printmsg("Keypad locked\n"); break;
+ case GSM_SMSMemoryFull : printmsg("SMS memory full\n");
+ }
+ }
+
+ GSM_Terminate();
+}
+
+static void SetAutoNetworkLogin(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ error=Phone->SetAutoNetworkLogin(&s);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+#ifdef DEBUG
+static void MakeConvertTable(int argc, char *argv[])
+{
+ unsigned char InputBuffer[10000], Buffer[10000];
+ FILE *file;
+ int size,i,j=0;
+
+ file = fopen(argv[2], "rb");
+ if (file == NULL) Print_Error(ERR_CANTOPENFILE);
+ size=fread(InputBuffer, 1, 10000-1, file);
+ fclose(file);
+ InputBuffer[size] = 0;
+ InputBuffer[size+1] = 0;
+
+ ReadUnicodeFile(Buffer,InputBuffer);
+
+ for(i=0;i<((int)UnicodeLength(Buffer));i++) {
+ j++;
+ if (j==100) {
+ printf("\"\\\n\"");
+ j=0;
+ }
+ printf("\\x%02x\\x%02x",Buffer[i*2],Buffer[i*2+1]);
+ }
+ printf("\\x00\\x00");
+}
+#endif
+
+static void ListNetworks(int argc, char *argv[])
+{
+ extern unsigned char *GSM_Networks[];
+ int i=0;
+
+ printmsg("Network Name\n\n");
+ while (GSM_Networks[i*2]!=NULL) {
+ printmsg("%s %s\n", GSM_Networks[i*2], GSM_Networks[i*2+1]);
+ i++;
+ }
+}
+
+static void Version(int argc, char *argv[])
+{
+// unsigned char buff[10];
+// int len;
+
+ printmsg("[Gammu version %s built %s %s]\n\n",VERSION,__TIME__,__DATE__);
+
+#ifdef DEBUG
+ printf("GSM_SMSMessage - %i\n",sizeof(GSM_SMSMessage));
+ printf("GSM_SMSC - %i\n",sizeof(GSM_SMSC));
+ printf("GSM_SMS_State - %i\n",sizeof(GSM_SMS_State));
+ printf("GSM_UDHHeader - %i\n",sizeof(GSM_UDHHeader));
+ printf("bool - %i\n",sizeof(bool));
+ printf("GSM_DateTime - %i\n",sizeof(GSM_DateTime));
+ printf("int - %i\n",sizeof(int));
+ printf("GSM_NetworkInfo - %i\n",sizeof(GSM_NetworkInfo));
+#endif
+
+// len=DecodeBASE64("AXw", buff, 3);
+// DumpMessage(stdout, buff, len);
+}
+
+static void GetFMStation(int argc, char *argv[])
+{
+ GSM_FMStation Station;
+ int start,stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(true);
+
+ for (i=start;i<=stop;i++) {
+ Station.Location=i;
+ error=Phone->GetFMStation(&s,&Station);
+ switch (error) {
+ case ERR_EMPTY:
+ printmsg("Entry number %i is empty\n",i);
+ break;
+ case ERR_NONE:
+ printmsg("Entry number %i\nStation name : \"%s\"\nFrequency : %.1f MHz\n",
+ i,DecodeUnicodeConsole(Station.StationName),
+ Station.Frequency);
+ break;
+ default:
+ Print_Error(error);
+ }
+ }
+ GSM_Terminate();
+}
+
+static void GetFileSystemStatus(int argc, char *argv[])
+{
+ GSM_FileSystemStatus Status;
+
+ GSM_Init(true);
+
+ error = Phone->GetFileSystemStatus(&s,&Status);
+ if (error != ERR_NOTSUPPORTED && error != ERR_NOTIMPLEMENTED) {
+ Print_Error(error);
+ printmsg("\nFree memory: %i, total memory: %i\n",Status.Free,Status.Free+Status.Used);
+ }
+
+ GSM_Terminate();
+}
+
+static void GetFileSystem(int argc, char *argv[])
+{
+ bool Start = true;
+ GSM_File Files;
+ int j;
+ GSM_FileSystemStatus Status;
+ char FolderName[256];
+
+ GSM_Init(true);
+
+ while (1) {
+ error = Phone->GetNextFileFolder(&s,&Files,Start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+
+ if (argc <= 2 || !mystrncasecmp(argv[2],"-flatall",0)) {
+ if (strlen(Files.ID_FullName) < 5 && strlen(Files.ID_FullName) != 0) {
+ printf("%5s.",Files.ID_FullName);
+ }
+ if (Files.Protected) {
+ printf("P");
+ } else {
+ printf(" ");
+ }
+ if (Files.ReadOnly) {
+ printf("R");
+ } else {
+ printf(" ");
+ }
+ if (Files.Hidden) {
+ printf("H");
+ } else {
+ printf(" ");
+ }
+ if (Files.System) {
+ printf("S");
+ } else {
+ printf(" ");
+ }
+ if (argc > 2 && mystrncasecmp(argv[2],"-flat",0)) {
+ if (!Files.Folder) {
+ if (mystrncasecmp(argv[2],"-flatall",0)) {
+ if (!Files.ModifiedEmpty) {
+ printf(" %30s",OSDateTime(Files.Modified,false));
+ } else printf(" %30c",0x20);
+ printf(" %9i",Files.Used);
+ printf(" ");
+ } else printf("|-- ");
+ } else printf("Folder ");
+ } else {
+ if (Files.Level != 1) {
+ for (j=0;j<Files.Level-2;j++) printf(" | ");
+ printf(" |-- ");
+ }
+ if (Files.Folder) printf("Folder ");
+ }
+ printf("\"%s\"",DecodeUnicodeConsole(Files.Name));
+ printf("\n");
+
+ Start = false;
+ } else if (argc > 2 && mystrncasecmp(argv[2],"-flatall",0)) {
+ /* format for a folder ID;Folder;FOLDER_NAME;[FOLDER_PARAMETERS]
+ * format for a file ID;File;FOLDER_NAME;FILE_NAME;DATESTAMP;FILE_SIZE;[FILE_PARAMETERS] */
+ if (!Files.Folder) {
+ printf("%s;File;",Files.ID_FullName);
+ printf("\"%s\";",FolderName);
+ printf("\"%s\";",DecodeUnicodeConsole(Files.Name));
+ if (!Files.ModifiedEmpty) {
+ printf("\"%s\";",OSDateTime(Files.Modified,false));
+ } else printf("\"%c\";",0x20);
+ printf("%i;",Files.Used);
+ } else {
+ printf("%s;Folder;",Files.ID_FullName);
+ printf("\"%s\";",DecodeUnicodeConsole(Files.Name));
+ strcpy(FolderName,DecodeUnicodeConsole(Files.Name));
+ }
+
+ if (Files.Protected) printf("P");
+ if (Files.ReadOnly) printf("R");
+ if (Files.Hidden) printf("H");
+ if (Files.System) printf("S");
+
+ printf("\n");
+
+ Start = false;
+ }
+ }
+
+ error = Phone->GetFileSystemStatus(&s,&Status);
+ if (error != ERR_NOTSUPPORTED && error != ERR_NOTIMPLEMENTED) {
+ Print_Error(error);
+ printmsg("\nFree memory: %i, total memory: %i\n",Status.Free,Status.Free+Status.Used);
+ }
+
+ GSM_Terminate();
+}
+
+static void GetOneFile(GSM_File *File, bool newtime, int i)
+{
+ FILE *file;
+ bool start;
+ unsigned char buffer[5000];
+ struct utimbuf filedate;
+
+ if (File->Buffer != NULL) {
+ free(File->Buffer);
+ File->Buffer = NULL;
+ }
+ File->Used = 0;
+ start = true;
+
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ error = Phone->GetFilePart(&s,File);
+ if (error == ERR_NONE || error == ERR_EMPTY || error == ERR_WRONGCRC) {
+ if (start) {
+ printmsg("Getting \"%s\": ", DecodeUnicodeConsole(File->Name));
+ start = false;
+ }
+ if (File->Folder) {
+ free(File->Buffer);
+ GSM_Terminate();
+ printmsg("it's folder. Please give only file names\n");
+ exit(-1);
+ }
+ printmsg("*");
+ if (error == ERR_EMPTY) break;
+ if (error == ERR_WRONGCRC) {
+ printmsg("WARNING: File checksum calculated by phone doesn't match with value calculated by Gammu. File damaged or error in Gammu\n");
+ break;
+ }
+ }
+ Print_Error(error);
+ }
+ printf("\n");
+ if (File->Used != 0) {
+ sprintf(buffer,"%s",DecodeUnicodeConsole(File->Name));
+ file = fopen(buffer,"wb");
+ if (file == NULL) {
+ sprintf(buffer,"file%s",File->ID_FullName);
+ file = fopen(buffer,"wb");
+ }
+ if (file == NULL) {
+ sprintf(buffer,"file%i",i);
+ file = fopen(buffer,"wb");
+ }
+ printmsg(" Saving to %s\n",buffer);
+ if (!file) Print_Error(ERR_CANTOPENFILE);
+ fwrite(File->Buffer,1,File->Used,file);
+ fclose(file);
+ if (!newtime && !File->ModifiedEmpty) {
+ /* access time */
+ filedate.actime = Fill_Time_T(File->Modified, 8);
+ /* modification time */
+ filedate.modtime = Fill_Time_T(File->Modified, 8);
+ dbgprintf("Setting date of %s\n",buffer);
+ utime(buffer,&filedate);
+ }
+ }
+}
+
+static void GetFiles(int argc, char *argv[])
+{
+ GSM_File File;
+ int i;
+ bool newtime = false;
+
+ File.Buffer = NULL;
+
+ GSM_Init(true);
+
+ for (i=2;i<argc;i++) {
+ if (mystrncasecmp(argv[i],"-newtime",0)) {
+ newtime = true;
+ continue;
+ }
+
+ strcpy(File.ID_FullName,argv[i]);
+ GetOneFile(&File, newtime, i);
+ }
+
+ free(File.Buffer);
+ GSM_Terminate();
+}
+
+static void GetFileFolder(int argc, char *argv[])
+{
+ bool Start = true;
+ GSM_File File;
+ int level=0,allnum=0,num=0,filelevel=0;
+ bool newtime = false, found;
+
+ File.Buffer = NULL;
+
+ GSM_Init(true);
+
+ for (i=2;i<argc;i++) {
+ if (mystrncasecmp(argv[i],"-newtime",0)) {
+ newtime = true;
+ continue;
+ }
+ allnum++;
+ }
+
+ while (allnum != num) {
+ error = Phone->GetNextFileFolder(&s,&File,Start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+
+ if (level == 0) {
+ /* We search for file or folder */
+ found = false;
+ for (i=2;i<argc;i++) {
+ if (mystrncasecmp(argv[i],"-newtime",0)) {
+ continue;
+ }
+ if (!strcmp(File.ID_FullName,argv[i])) {
+ found = true;
+ if (File.Folder) {
+ level = 1;
+ filelevel = File.Level + 1;
+ Start = false;
+ } else {
+ level = 2;
+ }
+ break;
+ }
+ }
+ if (found && File.Folder) continue;
+ }
+ if (level == 1) {
+ /* We have folder */
+ dbgprintf("%i %i\n",File.Level,filelevel);
+ if (File.Level != filelevel) {
+ level = 0;
+ num++;
+ }
+ }
+
+ if (level != 0 && !File.Folder) GetOneFile(&File, newtime,num);
+
+ if (level == 2) {
+ level = 0;
+ num++;
+ }
+
+ Start = false;
+ }
+
+ free(File.Buffer);
+ GSM_Terminate();
+}
+
+static void AddFile(int argc, char *argv[])
+{
+ GSM_File File;
+ int Pos = 0,i,nextlong;
+
+ File.Buffer = NULL;
+ strcpy(File.ID_FullName,argv[2]);
+ error = GSM_ReadFile(argv[3], &File);
+ Print_Error(error);
+ EncodeUnicode(File.Name,argv[3],strlen(argv[3]));
+ GSM_IdentifyFileFormat(&File);
+
+ File.Protected = false;
+ File.ReadOnly = false;
+ File.Hidden = false;
+ File.System = false;
+
+ if (argc > 4) {
+ nextlong = 0;
+ for (i=4;i<argc;i++) {
+ switch(nextlong) {
+ case 0:
+ if (mystrncasecmp(argv[i],"-type",0)) {
+ nextlong = 1;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-protected",0)) {
+ File.Protected = true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-readonly",0)) {
+ File.ReadOnly = true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-hidden",0)) {
+ File.Hidden = true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-system",0)) {
+ File.System = true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-newtime",0)) {
+ File.ModifiedEmpty = true;
+ continue;
+ }
+ printmsg("Parameter \"%s\" unknown\n",argv[i]);
+ exit(-1);
+ case 1:
+ if (mystrncasecmp(argv[i],"JAR",0)) {
+ File.Type = GSM_File_Java_JAR;
+ } else if (mystrncasecmp(argv[i],"JPG",0)) {
+ File.Type = GSM_File_Image_JPG;
+ } else if (mystrncasecmp(argv[i],"BMP",0)) {
+ File.Type = GSM_File_Image_BMP;
+ } else if (mystrncasecmp(argv[i],"WBMP",0)) {
+ File.Type = GSM_File_Image_WBMP;
+ } else if (mystrncasecmp(argv[i],"GIF",0)) {
+ File.Type = GSM_File_Image_GIF;
+ } else if (mystrncasecmp(argv[i],"PNG",0)) {
+ File.Type = GSM_File_Image_PNG;
+ } else if (mystrncasecmp(argv[i],"MIDI",0)) {
+ File.Type = GSM_File_Sound_MIDI;
+ } else if (mystrncasecmp(argv[i],"AMR",0)) {
+ File.Type = GSM_File_Sound_AMR;
+ } else if (mystrncasecmp(argv[i],"NRT",0)) {
+ File.Type = GSM_File_Sound_NRT;
+ } else if (mystrncasecmp(argv[i],"3GP",0)) {
+ File.Type = GSM_File_Video_3GP;
+ } else {
+ printmsg("What file type (\"%s\") ?\n",argv[i]);
+ exit(-1);
+ }
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong!=0) {
+ printmsg("Parameter missed...\n");
+ exit(-1);
+ }
+ }
+
+ GSM_Init(true);
+
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ error = Phone->AddFilePart(&s,&File,&Pos);
+ if (error != ERR_EMPTY && error != ERR_WRONGCRC) Print_Error(error);
+ printmsgerr("%cWriting: %i percent",13,Pos*100/File.Used);
+ }
+ printmsgerr("\n");
+ if (error == ERR_WRONGCRC) {
+ printmsg("WARNING: File checksum calculated by phone doesn't match with value calculated by Gammu. File damaged or error in Gammu\n");
+ }
+
+ free(File.Buffer);
+ GSM_Terminate();
+}
+
+static void AddFolder(int argc, char *argv[])
+{
+ GSM_File File;
+
+ strcpy(File.ID_FullName,argv[2]);
+ EncodeUnicode(File.Name,argv[3],strlen(argv[3]));
+ File.ReadOnly = false;
+
+ GSM_Init(true);
+
+ error = Phone->AddFolder(&s,&File);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+struct NokiaFolderInfo {
+ char *model;
+ char *parameter;
+ char *folder;
+ char *level;
+};
+
+static struct NokiaFolderInfo Folder[] = {
+ /* Language indepedent in DCT4 */
+ {"", "MMSUnreadInbox", "INBOX", "3"},
+ {"", "MMSReadInbox", "INBOX", "3"},
+ {"", "MMSOutbox", "OUTBOX", "3"},
+ {"", "MMSSent", "SENT", "3"},
+ {"", "MMSDrafts", "DRAFTS", "3"},
+ {"", "Application", "applications", "3"},
+ {"", "Game", "games", "3"},
+ /* Language depedent in DCT4 */
+ {"", "Gallery", "Pictures", "2"}, /* 3510 */
+ {"", "Gallery", "Graphics", "3"}, /* 3510i */
+ {"", "Gallery", "Images", "3"}, /* 6610 */
+ {"3510", "Gallery", "", "8"},
+ {"3510i","Gallery", "", "3"},
+ {"5100", "Gallery", "", "3"},
+ {"6220", "Gallery", "", "5"},
+ {"", "Tones", "Tones", "3"},
+ {"3510i","Tones", "", "4"},
+ {"5100", "Tones", "", "4"},
+ {"6220", "Tones", "", "6"},
+ /* Language indepedent in OBEX */
+ {"obex", "MMSUnreadInbox", "", "predefMessages\\predefINBOX" },
+ {"obex", "MMSReadInbox", "", "predefMessages\\predefINBOX" },
+ {"obex", "MMSOutbox", "", "predefMessages\\predefOUTBOX" },
+ {"obex", "MMSSent", "", "predefMessages\\predefSENT" },
+ {"obex", "MMSDrafts", "", "predefMessages\\predefDRAFTS" },
+// {"obex", "Application, "", "predefjava\\predefapplications"},
+// {"obex", "Game", "", "predefjava\\predefgames" },
+ {"obex", "Gallery", "", "predefgallery\\predefgraphics" },
+ {"obex", "Tones", "", "predefgallery\\predeftones" },
+
+ /* End of list */
+ {"", "", "", ""}
+};
+
+static void NokiaAddFile(int argc, char *argv[])
+{
+ GSM_File File, Files;
+ FILE *file;
+ GSM_DateTime DT,DT2;
+ time_t t_time1,t_time2;
+ unsigned char buffer[10000],JAR[500],Vendor[500],Name[500],Version[500],FileID[400];
+ bool Start = true, Found = false, wasclr;
+ bool ModEmpty = false;
+ int i = 0, Pos, Size, Size2, nextlong;
+
+ while (Folder[i].level[0] != 0) {
+ if (mystrncasecmp(argv[2],Folder[i].parameter,0)) {
+ Found = true;
+ break;
+ }
+ i++;
+ }
+ if (!Found) {
+ printmsg("What folder type (\"%s\") ?\n",argv[2]);
+ exit(-1);
+ }
+
+ GSM_Init(true);
+
+ if (s.ConnectionType == GCT_IRDAOBEX || s.ConnectionType == GCT_BLUEOBEX) {
+ Found = false;
+ i = 0;
+ while (Folder[i].level[0] != 0) {
+ if (!strcmp("obex",Folder[i].model) &&
+ mystrncasecmp(argv[2],Folder[i].parameter,0)) {
+ strcpy(Files.ID_FullName,Folder[i].level);
+ Found = true;
+ break;
+ }
+ i++;
+ }
+ } else {
+ printmsgerr("Searching for phone folder: ");
+ while (1) {
+ error = Phone->GetNextFileFolder(&s,&Files,Start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+
+ if (Files.Folder) {
+ dbgprintf("folder %s level %i\n",DecodeUnicodeConsole(Files.Name),Files.Level);
+ Found = false;
+ i = 0;
+ while (Folder[i].level[0] != 0) {
+ EncodeUnicode(buffer,Folder[i].folder,strlen(Folder[i].folder));
+ dbgprintf("comparing \"%s\" \"%s\" \"%s\"\n",s.Phone.Data.ModelInfo->model,Files.ID_FullName,Folder[i].level);
+ if (mystrncasecmp(argv[2],Folder[i].parameter,0) &&
+ mywstrncasecmp(Files.Name,buffer,0) &&
+ Files.Level == atoi(Folder[i].level)) {
+ Found = true;
+ break;
+ }
+ if (!strcmp(s.Phone.Data.ModelInfo->model,Folder[i].model) &&
+ mystrncasecmp(argv[2],Folder[i].parameter,0) &&
+ !strcmp(Files.ID_FullName,Folder[i].level)) {
+ Found = true;
+ break;
+ }
+ i++;
+ }
+ if (Found) break;
+ }
+ printmsgerr("*");
+
+ Start = false;
+ }
+ printmsgerr("\n");
+ }
+ if (!Found) {
+ printmsg("Folder not found. Probably function not supported !\n");
+ GSM_Terminate();
+ exit(-1);
+ }
+ File.Buffer = NULL;
+ File.Protected = false;
+ File.ReadOnly = false;
+ File.Hidden = false;
+ File.System = false;
+
+ if (mystrncasecmp(argv[2],"Application",0) || mystrncasecmp(argv[2],"Game",0)) {
+ sprintf(buffer,"%s.jad",argv[3]);
+ file = fopen(buffer,"rb");
+ if (file == NULL) Print_Error(ERR_CANTOPENFILE);
+ fclose(file);
+ sprintf(buffer,"%s.jar",argv[3]);
+ file = fopen(buffer,"rb");
+ if (file == NULL) Print_Error(ERR_CANTOPENFILE);
+ fclose(file);
+
+ /* reading jar file */
+ sprintf(buffer,"%s.jar",argv[3]);
+ error = GSM_ReadFile(buffer, &File);
+ Print_Error(error);
+ Size2 = File.Used;
+
+ /* reading jad file */
+ sprintf(buffer,"%s.jad",argv[3]);
+ error = GSM_ReadFile(buffer, &File);
+ Print_Error(error);
+
+ /* Getting values from JAD file */
+ error = GSM_JADFindData(File, Vendor, Name, JAR, Version, &Size);
+ if (error == ERR_FILENOTSUPPORTED) {
+ if (Vendor[0] == 0x00) {
+ printmsgerr("No vendor info in JAD file\n");
+ GSM_Terminate();
+ return;
+ }
+ if (Name[0] == 0x00) {
+ printmsgerr("No name info in JAD file\n");
+ GSM_Terminate();
+ return;
+ }
+ if (JAR[0] == 0x00) {
+ printmsgerr("No JAR URL info in JAD file\n");
+ GSM_Terminate();
+ return;
+ }
+ if (Size == -1) {
+ printmsgerr("No JAR size info in JAD file\n");
+ GSM_Terminate();
+ return;
+ }
+ }
+ if (Size != Size2) {
+ printmsgerr("Declared JAR file size is different than real\n");
+ GSM_Terminate();
+ return;
+ }
+ printmsgerr("Adding \"%s\"",Name);
+ if (Version[0] != 0x00) printmsgerr(" version %s",Version);
+ printmsgerr(" created by %s\n",Vendor);
+
+ /* Bostjan Muller 3200 RH-30 3.08 */
+ if (strstr(JAR,"http://") != NULL) {
+ i = strlen(JAR)-1;
+ while (JAR[i] != '/') i--;
+ strcpy(buffer,JAR+i+1);
+ strcpy(JAR,buffer);
+ dbgprintf("New file name is \"%s\"\n",JAR);
+ }
+
+ /* Changing all #13 or #10 to #13#10 in JAD */
+ Pos = 0;
+ wasclr = false;
+ for (i=0;i<File.Used;i++) {
+ switch (File.Buffer[i]) {
+ case 0x0D:
+ case 0x0A:
+ if (!wasclr) {
+ buffer[Pos++] = 0x0D;
+ buffer[Pos++] = 0x0A;
+ wasclr = true;
+ } else wasclr = false;
+ break;
+ default:
+ buffer[Pos++] = File.Buffer[i];
+ wasclr = false;
+ }
+ }
+ File.Buffer = realloc(File.Buffer, Pos);
+ File.Used = Pos;
+ memcpy(File.Buffer,buffer,Pos);
+
+ /* adding folder */
+ strcpy(buffer,Vendor);
+ strcat(buffer,Name);
+ EncodeUnicode(File.Name,buffer,strlen(buffer));
+ strcpy(File.ID_FullName,Files.ID_FullName);
+ error = Phone->AddFolder(&s,&File);
+ Print_Error(error);
+ strcpy(FileID,File.ID_FullName);
+
+ /* adding jad file */
+ strcpy(buffer,JAR);
+ buffer[strlen(buffer) - 1] = 'd';
+ EncodeUnicode(File.Name,buffer,strlen(buffer));
+ File.Type = GSM_File_Other;
+ File.ModifiedEmpty = true;
+ error = ERR_NONE;
+ Pos = 0;
+ while (error == ERR_NONE) {
+ error = Phone->AddFilePart(&s,&File,&Pos);
+ if (error != ERR_EMPTY && error != ERR_WRONGCRC) Print_Error(error);
+ printmsgerr("%cWriting JAD file: %i percent",13,Pos*100/File.Used);
+ }
+ printmsgerr("\n");
+ if (error == ERR_WRONGCRC) {
+ printmsg("WARNING: File checksum calculated by phone doesn't match with value calculated by Gammu. File damaged or error in Gammu\n");
+ }
+
+ if (argc > 4) {
+ if (mystrncasecmp(argv[4],"-readonly",0)) File.ReadOnly = true;
+ }
+
+ /* reading jar file */
+ sprintf(buffer,"%s.jar",argv[3]);
+ error = GSM_ReadFile(buffer, &File);
+ Print_Error(error);
+
+ /* adding jar file */
+ strcpy(File.ID_FullName,FileID);
+ strcpy(buffer,JAR);
+ EncodeUnicode(File.Name,buffer,strlen(buffer));
+ File.Type = GSM_File_Java_JAR;
+ File.ModifiedEmpty = true;
+ error = ERR_NONE;
+ Pos = 0;
+ while (error == ERR_NONE) {
+ error = Phone->AddFilePart(&s,&File,&Pos);
+ if (error != ERR_EMPTY && error != ERR_WRONGCRC) Print_Error(error);
+ printmsgerr("%cWriting JAR file: %i percent",13,Pos*100/File.Used);
+ }
+ printmsgerr("\n");
+ if (error == ERR_WRONGCRC) {
+ printmsg("WARNING: File checksum calculated by phone doesn't match with value calculated by Gammu. File damaged or error in Gammu\n");
+ }
+
+ free(File.Buffer);
+ GSM_Terminate();
+ return;
+ }
+
+ if (mystrncasecmp(argv[2],"Gallery",0) || mystrncasecmp(argv[2],"Tones",0)) {
+ strcpy(buffer,argv[3]);
+ if (argc > 4) {
+ nextlong = 0;
+ for (i=4;i<argc;i++) {
+ switch(nextlong) {
+ case 0:
+ if (mystrncasecmp(argv[i],"-name",0)) {
+ nextlong = 1;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-protected",0)) {
+ File.Protected = true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-readonly",0)) {
+ File.ReadOnly = true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-hidden",0)) {
+ File.Hidden = true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-system",0)) {
+ File.System = true;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-newtime",0)) {
+ ModEmpty = true;
+ continue;
+ }
+ printmsg("Parameter \"%s\" unknown\n",argv[i]);
+ exit(-1);
+ case 1:
+ strcpy(buffer,argv[i]);
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong!=0) {
+ printmsg("Parameter missed...\n");
+ exit(-1);
+ }
+ }
+ } else { /* MMS things */
+ DT2.Year = 2001;
+ DT2.Month = 12;
+ DT2.Day = 31;
+ DT2.Hour = 14;
+ DT2.Minute = 00;
+ DT2.Second = 00;
+ t_time2 = Fill_Time_T(DT2,8);
+
+ GSM_GetCurrentDateTime(&DT);
+ t_time1 = Fill_Time_T(DT,8);
+
+ sprintf(buffer,"%07X %07X ",(int)(t_time1-t_time2-40),(int)(t_time1-t_time2-40));
+#ifdef DEVELOP
+ sprintf(buffer,"2A947BD 2A947DB ");
+#endif
+ /* 40 = inbox "multimedia message received" message */
+ /* 30 = outbox sending failed */
+ if (mystrncasecmp(argv[2],"MMSUnreadInbox",0)) strcat(buffer,"43 ");
+ else if (mystrncasecmp(argv[2],"MMSReadInbox",0)) strcat(buffer,"50 ");
+ else if (mystrncasecmp(argv[2],"MMSOutbox",0)) strcat(buffer,"10 ");
+ else if (mystrncasecmp(argv[2],"MMSSent",0)) strcat(buffer,"20 ");
+ else if (mystrncasecmp(argv[2],"MMSDrafts",0)) strcat(buffer,"61 ");
+ if (argc > 4) {
+ if (!mystrncasecmp(argv[2],"MMSOutbox",0) &&
+ !mystrncasecmp(argv[2],"MMSSent",0)) {
+ sprintf(Name,"%s",argv[4]);
+ strcat(buffer,Name);
+ }
+ if (argc > 5) {
+ sprintf(Name,"%zd%s/TYPE=PLMN",strlen(argv[5])+10,argv[5]);
+ strcat(buffer,Name);
+ }
+ }
+ ModEmpty = true;
+ }
+
+ error = GSM_ReadFile(argv[3], &File);
+ Print_Error(error);
+ if (ModEmpty) File.ModifiedEmpty = true;
+
+ strcpy(File.ID_FullName,Files.ID_FullName);
+ EncodeUnicode(File.Name,buffer,strlen(buffer));
+ GSM_IdentifyFileFormat(&File);
+#ifdef DEVELOP
+ if (mystrncasecmp(argv[2],"Gallery",0) || mystrncasecmp(argv[2],"Tones",0)) {
+ } else { /* MMS things */
+ File.Type = GSM_File_MMS;
+ }
+#endif
+
+ dbgprintf("Adding file to filesystem now\n");
+ error = ERR_NONE;
+ Pos = 0;
+ while (error == ERR_NONE) {
+ error = Phone->AddFilePart(&s,&File,&Pos);
+ if (error != ERR_EMPTY && error != ERR_WRONGCRC) Print_Error(error);
+ if (File.Used != 0) printmsgerr("%cWriting file: %i percent",13,Pos*100/File.Used);
+ }
+ printmsgerr("\n");
+ if (error == ERR_WRONGCRC) {
+ printmsg("WARNING: File checksum calculated by phone doesn't match with value calculated by Gammu. File damaged or error in Gammu\n");
+ }
+
+ free(File.Buffer);
+ GSM_Terminate();
+}
+
+static void DeleteFiles(int argc, char *argv[])
+{
+ int i;
+
+ GSM_Init(true);
+
+ for (i=2;i<argc;i++) {
+ error = Phone->DeleteFile(&s,argv[i]);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+static void SaveMMSFile(int argc, char *argv[])
+{
+ FILE *file;
+ unsigned char Buffer[50000],Buffer2[20][2010];
+ int i,nextlong = 0,len = 0;
+ GSM_EncodeMultiPartMMSInfo Info;
+
+ GSM_ClearMultiPartMMSInfo(&Info);
+
+ for (i=3;i<argc;i++) {
+ switch (nextlong) {
+ case 0:
+ if (mystrncasecmp(argv[i],"-subject",0)) {
+ nextlong=1;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-text",0)) {
+ nextlong=2;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-from",0)) {
+ nextlong=3;
+ continue;
+ }
+ if (mystrncasecmp(argv[i],"-to",0)) {
+ nextlong=4;
+ continue;
+ }
+ printmsg("Unknown parameter (\"%s\")\n",argv[i]);
+ exit(-1);
+ break;
+ case 1: /* Subject */
+ EncodeUnicode(Info.Subject,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ case 2: /* Text */
+ EncodeUnicode(Buffer2[Info.EntriesNum],argv[i],strlen(argv[i]));
+ Info.Entries[Info.EntriesNum].ID = MMS_Text;
+ Info.Entries[Info.EntriesNum].Buffer = Buffer2[Info.EntriesNum];
+ Info.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 3: /* From */
+ EncodeUnicode(Info.Source,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ case 4: /* To */
+ EncodeUnicode(Info.Destination,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong!=0) {
+ printmsg("Parameter missed...\n");
+ exit(-1);
+ }
+
+ GSM_EncodeMMSFile(&Info,Buffer,&len);
+
+ file = fopen(argv[2],"wb");
+ if (file == NULL) Print_Error(ERR_CANTOPENFILE);
+ fwrite(Buffer,1,len,file);
+ fclose(file);
+}
+
+static void CallDivert(int argc, char *argv[])
+{
+ GSM_MultiCallDivert cd;
+
+ if (mystrncasecmp("get", argv[2],0)) {}
+ else if (mystrncasecmp("set", argv[2],0)) {}
+ else {
+ printmsg("Unknown divert action (\"%s\")\n",argv[2]);
+ exit(-1);
+ }
+
+ if (mystrncasecmp("all" , argv[3],0)) {cd.Request.DivertType = GSM_DIVERT_AllTypes ;}
+ else if (mystrncasecmp("busy" , argv[3],0)) {cd.Request.DivertType = GSM_DIVERT_Busy ;}
+ else if (mystrncasecmp("noans" , argv[3],0)) {cd.Request.DivertType = GSM_DIVERT_NoAnswer ;}
+ else if (mystrncasecmp("outofreach", argv[3],0)) {cd.Request.DivertType = GSM_DIVERT_OutOfReach;}
+ else {
+ printmsg("Unknown divert type (\"%s\")\n",argv[3]);
+ exit(-1);
+ }
+
+ if (mystrncasecmp("all" , argv[4],0)) {cd.Request.CallType = GSM_DIVERT_AllCalls ;}
+ else if (mystrncasecmp("voice", argv[4],0)) {cd.Request.CallType = GSM_DIVERT_VoiceCalls;}
+ else if (mystrncasecmp("fax" , argv[4],0)) {cd.Request.CallType = GSM_DIVERT_FaxCalls ;}
+ else if (mystrncasecmp("data" , argv[4],0)) {cd.Request.CallType = GSM_DIVERT_DataCalls ;}
+ else {
+ printmsg("Unknown call type (\"%s\")\n",argv[4]);
+ exit(-1);
+ }
+
+ GSM_Init(true);
+
+ if (mystrncasecmp("get", argv[2],0)) {
+ error = Phone->GetCallDivert(&s,&cd);
+ Print_Error(error);
+ printmsg("Query:\n Divert type: ");
+ } else {
+ cd.Request.Number[0] = 0;
+ cd.Request.Number[1] = 0;
+ if (argc > 5) EncodeUnicode(cd.Request.Number,argv[5],strlen(argv[5]));
+
+ cd.Request.Timeout = 0;
+ if (argc > 6) cd.Request.Timeout = atoi(argv[6]);
+
+ error = Phone->SetCallDivert(&s,&cd);
+ Print_Error(error);
+ printmsg("Changed:\n Divert type: ");
+ }
+
+ switch (cd.Request.DivertType) {
+ case GSM_DIVERT_Busy : printmsg("when busy"); break;
+ case GSM_DIVERT_NoAnswer : printmsg("when not answered"); break;
+ case GSM_DIVERT_OutOfReach: printmsg("when phone off or no coverage"); break;
+ case GSM_DIVERT_AllTypes : printmsg("all types of diverts"); break;
+ default : printmsg("unknown %i",cd.Request.DivertType); break;
+ }
+ printmsg("\n Calls type : ");
+ switch (cd.Request.CallType) {
+ case GSM_DIVERT_VoiceCalls: printmsg("voice"); break;
+ case GSM_DIVERT_FaxCalls : printmsg("fax"); break;
+ case GSM_DIVERT_DataCalls : printmsg("data"); break;
+ case GSM_DIVERT_AllCalls : printmsg("data & fax & voice"); break;
+ default : printmsg("unknown %i",cd.Request.CallType); break;
+ }
+ printmsg("\nResponse:");
+
+ for (i=0;i<cd.Response.EntriesNum;i++) {
+ printmsg("\n Calls type : ");
+ switch (cd.Response.Entries[i].CallType) {
+ case GSM_DIVERT_VoiceCalls: printmsg("voice"); break;
+ case GSM_DIVERT_FaxCalls : printmsg("fax"); break;
+ case GSM_DIVERT_DataCalls : printmsg("data"); break;
+ default : printmsg("unknown %i",cd.Response.Entries[i].CallType);break;
+ }
+ printf("\n");
+ printmsg(" Timeout : %i seconds\n",cd.Response.Entries[i].Timeout);
+ printmsg(" Number : %s\n",DecodeUnicodeString(cd.Response.Entries[i].Number));
+ }
+ printf("\n");
+
+ GSM_Terminate();
+}
+
+
+//#if 0
+static void CancelAllDiverts(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+ error = Phone->CancelAllDiverts(&s);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+
+
+void SearchPhoneThread(OneDeviceInfo *Info)
+{
+ int j;
+ GSM_Error error;
+ fprintf(stderr,"*********************************** \n");
+ fprintf(stderr,"*********************************** \n");
+ fprintf(stderr,"*********************************** \n");
+ fprintf(stderr,"*********************************** \n");
+ fprintf(stderr,"*********************************** \n");
+#if 0
+ j = 0;
+ while(strlen(Info->Connections[j].Connection) != 0) {
+ memcpy(&Info->s.di,&s.di,sizeof(Debug_Info));
+ Info->s.msg = s.msg;
+ Info->s.ConfigNum = 1;
+ Info->s.opened = false;
+ Info->s.Config[0].UseGlobalDebugFile = s.Config[0].UseGlobalDebugFile;
+ Info->s.Config[0].Localize = s.Config[0].Localize;
+ Info->s.Config[0].Device = Info->Device;
+ Info->s.Config[0].Connection = Info->Connections[j].Connection;
+ Info->s.Config[0].SyncTime = "no";
+ Info->s.Config[0].DebugFile = s.Config[0].DebugFile;
+ Info->s.Config[0].Model[0] = 0;
+ strcpy(Info->s.Config[0].DebugLevel,s.Config[0].DebugLevel);
+ Info->s.Config[0].LockDevice = "no";
+ Info->s.Config[0].StartInfo = "no";
+
+ error = GSM_InitConnection(&Info->s,1);
+ if (SearchOutput) printf("Connection \"%s\" on device \"%s\"\n",Info->Connections[j].Connection,Info->Device);
+ if (error == ERR_NONE) {
+ error=Info->s.Phone.Functions->GetManufacturer(&Info->s);
+ if (error == ERR_NONE) {
+ error=Info->s.Phone.Functions->GetModel(&Info->s);
+ if (error == ERR_NONE) {
+ if (!SearchOutput) printf("Connection \"%s\" on device \"%s\"\n",Info->Connections[j].Connection,Info->Device);
+ printmsg(" Manufacturer : %s\n",
+ Info->s.Phone.Data.Manufacturer);
+ printmsg(" Model : %s (%s)\n",
+ Info->s.Phone.Data.ModelInfo->model,
+ Info->s.Phone.Data.Model);
+ } else {
+ if (SearchOutput) printf(" %s\n",print_error(error,Info->s.di.df,Info->s.msg));
+ }
+ } else {
+ if (SearchOutput) printf(" %s\n",print_error(error,Info->s.di.df,Info->s.msg));
+ }
+ } else {
+ if (SearchOutput) printf(" %s\n",print_error(error,Info->s.di.df,Info->s.msg));
+ }
+ if (error != ERR_DEVICEOPENERROR) {
+ GSM_TerminateConnection(&Info->s);
+ dbgprintf("Closing done\n");
+ }
+ if (error == ERR_DEVICEOPENERROR || error == ERR_NONE) break;
+ j++;
+ }
+ num--;
+#endif
+}
+
+//#undef HAVE_PTHREAD
+//#if 0
+#if defined(WIN32) || defined(HAVE_PTHREAD)
+#ifdef HAVE_PTHREAD
+ pthread_t Thread[100];
+#endif
+
+void MakeSearchThread(int i)
+{
+ num++;
+#ifdef HAVE_PTHREAD
+ if (pthread_create(&Thread[i],NULL,(void *)SearchPhoneThread,&SearchDevices[i])!=0) {
+ dbgprintf("Error creating thread\n");
+ }
+#else
+ if (CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,
+ (LPTHREAD_START_ROUTINE)SearchPhoneThread,&SearchDevices[i],
+ 0,NULL)==NULL) {
+ dbgprintf("Error creating thread\n");
+ }
+#endif
+}
+
+static void SearchPhone(int argc, char *argv[])
+{
+ int i,dev = 0, dev2 = 0;
+
+ SearchOutput = false;
+ if (argc == 3 && mystrncasecmp(argv[2], "-debug",0)) SearchOutput = true;
+
+ num = 0;
+#ifdef WIN32
+# ifdef GSM_ENABLE_IRDADEVICE
+ sprintf(SearchDevices[dev].Device,"");
+ sprintf(SearchDevices[dev].Connections[0].Connection,"irdaphonet");
+ SearchDevices[dev].Connections[1].Connection[0] = 0;
+ dev++;
+# endif
+# ifdef GSM_ENABLE_SERIALDEVICE
+ dev2 = dev;
+ for(i=0;i<10;i++) {
+ sprintf(SearchDevices[dev2].Device,"com%i:",i+1);
+ sprintf(SearchDevices[dev2].Connections[0].Connection,"fbusdlr3");
+ sprintf(SearchDevices[dev2].Connections[1].Connection,"fbus");
+ sprintf(SearchDevices[dev2].Connections[2].Connection,"at19200");
+ sprintf(SearchDevices[dev2].Connections[3].Connection,"mbus");
+ SearchDevices[dev2].Connections[4].Connection[0] = 0;
+ dev2++;
+ }
+# endif
+#endif
+#ifdef __linux__
+# ifdef GSM_ENABLE_IRDADEVICE
+ for(i=0;i<6;i++) {
+ sprintf(SearchDevices[dev].Device,"/dev/ircomm%i",i);
+ sprintf(SearchDevices[dev].Connections[0].Connection,"irdaphonet");
+ sprintf(SearchDevices[dev].Connections[1].Connection,"at19200");
+ SearchDevices[dev].Connections[2].Connection[0] = 0;
+ dev++;
+ }
+# endif
+# ifdef GSM_ENABLE_SERIALDEVICE
+ dev2 = dev;
+ for(i=0;i<10;i++) {
+ sprintf(SearchDevices[dev2].Device,"/dev/ttyS%i",i);
+ sprintf(SearchDevices[dev2].Connections[0].Connection,"fbusdlr3");
+ sprintf(SearchDevices[dev2].Connections[1].Connection,"fbus");
+ sprintf(SearchDevices[dev2].Connections[2].Connection,"at19200");
+ sprintf(SearchDevices[dev2].Connections[3].Connection,"mbus");
+ SearchDevices[dev2].Connections[4].Connection[0] = 0;
+ dev2++;
+ }
+ for(i=0;i<8;i++) {
+ sprintf(SearchDevices[dev2].Device,"/dev/ttyD00%i",i);
+ sprintf(SearchDevices[dev2].Connections[0].Connection,"fbusdlr3");
+ sprintf(SearchDevices[dev2].Connections[1].Connection,"fbus");
+ sprintf(SearchDevices[dev2].Connections[2].Connection,"at19200");
+ sprintf(SearchDevices[dev2].Connections[3].Connection,"mbus");
+ SearchDevices[dev2].Connections[4].Connection[0] = 0;
+ dev2++;
+ }
+ for(i=0;i<4;i++) {
+ sprintf(SearchDevices[dev2].Device,"/dev/usb/tts/%i",i);
+ sprintf(SearchDevices[dev2].Connections[0].Connection,"fbusdlr3");
+ sprintf(SearchDevices[dev2].Connections[1].Connection,"fbus");
+ sprintf(SearchDevices[dev2].Connections[2].Connection,"at19200");
+ sprintf(SearchDevices[dev2].Connections[3].Connection,"mbus");
+ SearchDevices[dev2].Connections[4].Connection[0] = 0;
+ dev2++;
+ }
+# endif
+#endif
+ for(i=0;i<dev;i++) MakeSearchThread(i);
+ while (num != 0) my_sleep(5);
+ for(i=dev;i<dev2;i++) MakeSearchThread(i);
+ while (num != 0) my_sleep(5);
+}
+#endif /*Support for threads */
+// #if 0
+static void NokiaGetADC(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3GetADC(argc,argv);
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ DCT4GetADC(argc, argv);
+#endif
+
+ GSM_Terminate();
+}
+
+static void NokiaDisplayTest(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3DisplayTest(argc,argv);
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ DCT4DisplayTest(argc, argv);
+#endif
+
+ GSM_Terminate();
+}
+
+static void NokiaGetT9(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3GetT9(argc,argv);
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ DCT4GetT9(argc, argv);
+#endif
+
+ GSM_Terminate();
+}
+
+static void NokiaVibraTest(int argc, char *argv[])
+{
+ GSM_Init(true);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3VibraTest(argc,argv);
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ DCT4VibraTest(argc, argv);
+#endif
+
+ GSM_Terminate();
+}
+
+static GSM_Parameters Parameters[] = {
+ {"--identify", 0, 0, Identify, {H_Info,0}, ""},
+ {"--version", 0, 0, Version, {H_Other,0}, ""},
+ {"--getdisplaystatus", 0, 0, GetDisplayStatus, {H_Info,0}, ""},
+ {"--monitor", 0, 1, Monitor, {H_Info,H_Network,H_Call,0}, "[times]"},
+ {"--setautonetworklogin", 0, 0, SetAutoNetworkLogin, {H_Network,0}, ""},
+ {"--listnetworks", 0, 0, ListNetworks, {H_Network,0}, ""},
+ {"--getgprspoint", 1, 2, GetGPRSPoint, {H_Nokia,H_Network,0}, "start [stop]"},
+ {"--addfolder", 2, 2, AddFolder, {H_Filesystem,0}, "parentfolderID name"},
+ {"--getfilesystem", 0, 1, GetFileSystem, {H_Filesystem,0}, "[-flatall|-flat]"},
+ {"--getfilesystemstatus", 0, 0, GetFileSystemStatus, {H_Filesystem,0}, ""},
+ {"--getfiles", 1,40, GetFiles, {H_Filesystem,0}, "ID1, ID2, ..."},
+ {"--getfilefolder", 1,40, GetFileFolder, {H_Filesystem,0}, "ID1, ID2, ..."},
+ {"--addfile", 2, 6, AddFile, {H_Filesystem,0}, "folderID name [-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|NRT][-readonly][-protected][-system][-hidden][-newtime]"},
+ {"--nokiaaddfile", 2, 5, NokiaAddFile, {H_Filesystem,H_Nokia,0}, "MMSUnreadInbox|MMSReadInbox|MMSOutbox|MMSDrafts|MMSSent file sender title"},
+ {"--nokiaaddfile", 2, 5, NokiaAddFile, {H_Filesystem,H_Nokia,0}, "Application|Game file [-readonly]"},
+ {"--nokiaaddfile", 2, 5, NokiaAddFile, {H_Filesystem,H_Nokia,0}, "Gallery|Tones file [-name name][-protected][-readonly][-system][-hidden][-newtime]"},
+ {"--deletefiles", 1,20, DeleteFiles, {H_Filesystem,0}, "fileID"},
+ {"--playringtone", 1, 1, PlayRingtone, {H_Ringtone,0}, "file"},
+ {"--playsavedringtone", 1, 1, DCT4PlaySavedRingtone, {H_Ringtone,0}, ""},
+ {"--getdatetime", 0, 0, GetDateTime, {H_DateTime,0}, ""},
+ {"--setdatetime", 0, 0, SetDateTime, {H_DateTime,0}, ""},
+ {"--getalarm", 0, 0, GetAlarm, {H_DateTime,0}, ""},
+ {"--setalarm", 2, 2, SetAlarm, {H_DateTime,0}, "hour minute"},
+ {"--resetphonesettings", 1, 1, ResetPhoneSettings, {H_Settings,0}, "PHONE|DEV|UIF|ALL|FACTORY"},
+ {"--getmemory", 2, 3, GetMemory, {H_Memory,0}, "DC|MC|RC|ON|VM|SM|ME|FD start [stop]"},
+ {"--getallmemory", 1, 1, GetAllMemory, {H_Memory,0}, "DC|MC|RC|ON|VM|SM|ME|FD"},
+ {"--searchmemory", 1, 1, SearchMemory, {H_Memory,0}, "text"},
+ {"--listmemorycategory", 1, 1, ListMemoryCategory, {H_Memory, H_Category,0}, "text|number"},
+ {"--getfmstation", 1, 2, GetFMStation, {H_FM,0}, "start [stop]"},
+ {"--getsmsc", 1, 2, GetSMSC, {H_SMS,0}, "start [stop]"},
+ {"--getsms", 2, 3, GetSMS, {H_SMS,0}, "folder start [stop]"},
+ {"--deletesms", 2, 3, DeleteSMS, {H_SMS,0}, "folder start [stop]"},
+ {"--deleteallsms", 1, 1, DeleteAllSMS, {H_SMS,0}, "folder"},
+ {"--getsmsfolders", 0, 0, GetSMSFolders, {H_SMS,0}, ""},
+ {"--getallsms", 0, 0, GetAllSMS, {H_SMS,0}, ""},
+ {"--geteachsms", 0, 0, GetEachSMS, {H_SMS,0}, ""},
+
+#define SMS_TEXT_OPTIONS "[-inputunicode][-16bit][-flash][-len len][-autolen len][-unicode][-enablevoice][-disablevoice][-enablefax][-disablefax][-enableemail][-disableemail][-voidsms][-replacemessages ID][-replacefile file]"
+#define SMS_PICTURE_OPTIONS "[-text text][-unicode][-alcatelbmmi]"
+#define SMS_PROFILE_OPTIONS "[-name name][-bitmap bitmap][-ringtone ringtone]"
+#define SMS_EMS_OPTIONS "[-unicode][-16bit][-format lcrasbiut][-text text][-unicodefiletext file][-defsound ID][-defanimation ID][-tone10 file][-tone10long file][-tone12 file][-tone12long file][-toneSE file][-toneSElong file][-fixedbitmap file][-variablebitmap file][-variablebitmaplong file][-animation frames file1 ...][-protected number]"
+#define SMS_SMSTEMPLATE_OPTIONS "[-unicode][-text text][-unicodefiletext file][-defsound ID][-defanimation ID][-tone10 file][-tone10long file][-tone12 file][-tone12long file][-toneSE file][-toneSElong file][-variablebitmap file][-variablebitmaplong file][-animation frames file1 ...]"
+#define SMS_ANIMATION_OPTIONS ""
+#define SMS_OPERATOR_OPTIONS "[-netcode netcode][-biglogo]"
+#define SMS_SAVE_OPTIONS "[-folder id][-unread][-read][-unsent][-sent][-sender number]"
+#define SMS_SEND_OPTIONS "[-report][-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX][-save [-folder number]]"
+#define SMS_COMMON_OPTIONS "[-smscset number][-smscnumber number][-reply][-maxsms num]"
+
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,0}, "TEXT " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_TEXT_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Ringtone,0}, "RINGTONE file " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "OPERATOR file " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_OPERATOR_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "CALLER file " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "PICTURE file " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_PICTURE_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "ANIMATION frames file1 file2... " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_ANIMATION_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_MMS,0}, "MMSINDICATOR URL Title Sender " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+#ifdef GSM_ENABLE_BACKUP
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "BOOKMARK file location " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "WAPSETTINGS file location DATA|GPRS " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_MMS,0}, "MMSSETTINGS file location " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Calendar,0}, "CALENDAR file location " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_ToDo,0}, "TODO file location " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Memory,0}, "VCARD10|VCARD21 file SM|ME location [-nokia]" SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+#endif
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Settings,0}, "PROFILE " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_PROFILE_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,0}, "EMS " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_EMS_OPTIONS},
+ {"--savesms", 1,30, SendSaveDisplaySMS, {H_SMS,0}, "SMSTEMPLATE " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_SMSTEMPLATE_OPTIONS},
+
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,0}, "TEXT destination " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_TEXT_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Ringtone,0}, "RINGTONE destination file " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "OPERATOR destination file " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_OPERATOR_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "CALLER destination file " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "PICTURE destination file " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_PICTURE_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "ANIMATION destination frames file1 file2... " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_ANIMATION_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_MMS,0}, "MMSINDICATOR destination URL Title Sender " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+#ifdef GSM_ENABLE_BACKUP
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "BOOKMARK destination file location " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "WAPSETTINGS destination file location DATA|GPRS " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_MMS,0}, "MMSSETTINGS destination file location " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Calendar,0}, "CALENDAR destination file location " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_ToDo,0}, "TODO destination file location " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Memory,0}, "VCARD10|VCARD21 destination file SM|ME location [-nokia]" SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+#endif
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Settings,0}, "PROFILE destination " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS ""SMS_PROFILE_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,0}, "EMS destination " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_EMS_OPTIONS},
+ {"--sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,0}, "SMSTEMPLATE destination " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_SMSTEMPLATE_OPTIONS},
+
+ {"--displaysms", 2,30, SendSaveDisplaySMS, {H_SMS,0}, "... (options like in sendsms)"},
+
+ {"--addsmsfolder", 1, 1, AddSMSFolder, {H_SMS,0}, "name"},
+#ifdef HAVE_MYSQL_MYSQL_H
+ {"--smsd", 2, 2, SMSDaemon, {H_SMS,H_Other,0}, "MYSQL configfile"},
+#endif
+ {"--smsd", 2, 2, SMSDaemon, {H_SMS,H_Other,0}, "FILES configfile"},
+ {"--sendsmsdsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Other,0}, "TEXT|WAPSETTINGS|... destination FILES|MYSQL configfile ... (options like in sendsms)"},
+ {"--getringtone", 1, 2, GetRingtone, {H_Ringtone,0}, "location [file]"},
+ {"--getphoneringtone", 1, 2, GetRingtone, {H_Ringtone,0}, "location [file]"},
+ {"--getringtoneslist", 0, 0, GetRingtonesList, {H_Ringtone,0}, ""},
+ {"--setringtone", 1, 6, SetRingtone, {H_Ringtone,0}, "file [-location location][-scale][-name name]"},
+ {"--nokiacomposer", 1, 1, NokiaComposer, {H_Ringtone,H_Nokia,0}, "file"},
+ {"--copyringtone", 2, 3, CopyRingtone, {H_Ringtone,0}, "source destination [RTTL|BINARY]"},
+ {"--getussd", 1, 1, GetUSSD, {H_Call,0}, "code"},
+ {"--dialvoice", 1, 2, DialVoice, {H_Call,0}, "number [show|hide]"},
+ {"--getspeeddial", 1, 2, GetSpeedDial, {H_Call,H_Memory,0}, "start [stop]"},
+ {"--cancelcall", 0, 1, CancelCall, {H_Call,0}, "[ID]"},
+ {"--answercall", 0, 1, AnswerCall, {H_Call,0}, "[ID]"},
+ {"--unholdcall", 1, 1, UnholdCall, {H_Call,0}, "ID"},
+ {"--holdcall", 1, 1, HoldCall, {H_Call,0}, "ID"},
+ {"--conferencecall", 1, 1, ConferenceCall, {H_Call,0}, "ID"},
+ {"--splitcall", 1, 1, SplitCall, {H_Call,0}, "ID"},
+ {"--switchcall", 0, 1, SwitchCall, {H_Call,0}, "[ID]"},
+ {"--transfercall", 0, 1, TransferCall, {H_Call,0}, "[ID]"},
+ {"--divert", 3, 5, CallDivert, {H_Call,0}, "get|set all|busy|noans|outofreach all|voice|fax|data [number timeout]"},
+ {"--canceldiverts", 0, 0, CancelAllDiverts, {H_Call,0}, ""},
+ {"--senddtmf", 1, 1, SendDTMF, {H_Call,0}, "sequence"},
+ {"--getcalendarsettings", 0, 0, GetCalendarSettings, {H_Calendar,H_Settings,0}, ""},
+ {"--getalltodo", 0, 0, GetAllToDo, {H_ToDo,0}, ""},
+ {"--listtodocategory", 1, 1, ListToDoCategory, {H_ToDo, H_Category,0}, "text|number"},
+ {"--gettodo", 1, 2, GetToDo, {H_ToDo,0}, "start [stop]"},
+ {"--deletetodo", 1, 2, DeleteToDo, {H_ToDo,0}, "start [stop]"},
+ {"--getnote", 1, 2, GetNote, {H_Note,0}, "start [stop]"},
+ {"--deletecalendar", 1, 2, DeleteCalendar, {H_Calendar,0}, "start [stop]"},
+ {"--getallcalendar", 0, 0, GetAllCalendar, {H_Calendar,0}, ""},
+ {"--getcalendar", 1, 2, GetCalendar, {H_Calendar,0}, "start [stop]"},
+ {"--getcategory", 2, 3, GetCategory, {H_Category,H_ToDo,H_Memory,0}, "TODO|PHONEBOOK start [stop]"},
+ {"--getallcategory", 1, 1, GetAllCategories, {H_Category,H_ToDo,H_Memory,0}, "TODO|PHONEBOOK"},
+ {"--reset", 1, 1, Reset, {H_Other,0}, "SOFT|HARD"},
+ {"--getprofile", 1, 2, GetProfile, {H_Settings,0}, "start [stop]"},
+ {"--getsecuritystatus", 0, 0, GetSecurityStatus, {H_Info,0}, ""},
+ {"--entersecuritycode", 2, 2, EnterSecurityCode, {H_Other,0}, "PIN|PUK|PIN2|PUK2 code"},
+ {"--deletewapbookmark", 1, 2, DeleteWAPBookmark, {H_WAP,0}, "start [stop]"},
+ {"--getwapbookmark", 1, 2, GetWAPBookmark, {H_WAP,0}, "start [stop]"},
+ {"--getwapsettings", 1, 2, GetWAPMMSSettings, {H_WAP,0}, "start [stop]"},
+ {"--getmmssettings", 1, 2, GetWAPMMSSettings, {H_MMS,0}, "start [stop]"},
+ {"--getsyncmlsettings", 1, 2, GetSyncMLSettings, {H_WAP,0}, "start [stop]"},
+ {"--getchatsettings", 1, 2, GetChatSettings, {H_WAP,0}, "start [stop]"},
+ {"--savemmsfile", 3, 15,SaveMMSFile, {H_MMS,0}, "file [-subject text][-text text]"},
+ {"--getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "STARTUP [file]"},
+ {"--getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "CALLER location [file]"},
+ {"--getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "OPERATOR [file]"},
+ {"--getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "PICTURE location [file]"},
+ {"--getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "TEXT"},
+ {"--getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "DEALER"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "STARTUP file|1|2|3"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "COLOURSTARTUP [fileID]"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "WALLPAPER fileID"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "CALLER location [file]"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "OPERATOR [file [netcode]]"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "COLOUROPERATOR [fileID [netcode]]"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "PICTURE file location [text]"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "TEXT text"},
+ {"--setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "DEALER text"},
+ {"--copybitmap", 1, 3, CopyBitmap, {H_Logo,0}, "inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]"},
+ {"--presskeysequence", 1, 1, PressKeySequence, {H_Other,0}, "mMnNpPuUdD+-123456789*0#gGrRwW"},
+#if defined(WIN32) || defined(HAVE_PTHREAD)
+ {"--searchphone", 0, 1, SearchPhone, {H_Other,0}, "[-debug]"},
+#endif
+#ifdef GSM_ENABLE_BACKUP
+ {"--savefile", 4, 5, SaveFile, {H_Backup,H_Calendar,0}, "CALENDAR target.vcs file location"},
+ {"--savefile", 4, 5, SaveFile, {H_Backup,H_ToDo,0}, "TODO target.vcs file location"},
+ {"--savefile", 4, 5, SaveFile, {H_Backup,H_Memory,0}, "VCARD10|VCARD21 target.vcf file SM|ME location"},
+ {"--savefile", 4, 5, SaveFile, {H_Backup,H_WAP,0}, "BOOKMARK target.url file location"},
+ {"--backup", 1, 2, Backup, {H_Backup,H_Memory,H_Calendar,H_ToDo,H_Category,H_Ringtone,H_WAP,H_FM,0}, "file [-yes]"},
+ {"--backupsms", 1, 1, BackupSMS, {H_Backup,H_SMS,0}, "file"},
+ {"--restore", 1, 1, Restore, {H_Backup,H_Memory,H_Calendar,H_ToDo,H_Category,H_Ringtone,H_WAP,H_FM,0}, "file"},
+ {"--addnew", 1, 1, AddNew, {H_Backup,H_Memory,H_Calendar,H_ToDo,H_Category,H_Ringtone,H_WAP,H_FM,0}, "file"},
+ {"--restoresms", 1, 1, RestoreSMS, {H_Backup,H_SMS,0}, "file"},
+ {"--addsms", 2, 2, AddSMS, {H_Backup,H_SMS,0}, "folder file"},
+#endif
+ {"--clearall", 0, 0, ClearAll, {H_Memory,H_Calendar,H_ToDo,H_Category,H_Ringtone,H_WAP,H_FM,0}, ""},
+ {"--networkinfo", 0, 0, NetworkInfo, {H_Network,0}, ""},
+#ifdef GSM_ENABLE_AT
+ {"--siemenssatnetmon", 0, 0, ATSIEMENSSATNetmon, {H_Siemens,H_Network,0}, ""},
+ {"--siemensnetmonact", 1, 1, ATSIEMENSActivateNetmon, {H_Siemens,H_Network,0}, "netmon_type (1-full, 2-simple)"},
+ {"--siemensnetmonitor", 1, 1, ATSIEMENSNetmonitor, {H_Siemens,H_Network,0}, "test"},
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ {"--nokiagetoperatorname", 0, 0, DCT3GetOperatorName, {H_Nokia,H_Network,0}, ""},
+ {"--nokiasetoperatorname", 0, 2, DCT3SetOperatorName, {H_Nokia,H_Network,0}, "[networkcode name]"},
+ {"--nokiadisplayoutput", 0, 0, DCT3DisplayOutput, {H_Nokia,0}, ""},
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ {"--nokianetmonitor", 1, 1, DCT3netmonitor, {H_Nokia,H_Network,0}, "test"},
+ {"--nokianetmonitor36", 0, 0, DCT3ResetTest36, {H_Nokia,0}, ""},
+ {"--nokiadebug", 1, 2, DCT3SetDebug, {H_Nokia,H_Network,0}, "filename [[v11-22][,v33-44]...]"},
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ {"--nokiasetvibralevel", 1, 1, DCT4SetVibraLevel, {H_Nokia,H_Other,0}, "level"},
+ {"--nokiagetvoicerecord", 1, 1, DCT4GetVoiceRecord, {H_Nokia,H_Other,0}, "location"},
+ {"--nokiasetlights", 2, 2, DCT4SetLight, {H_Nokia,H_Tests,0}, "keypad|display|torch on|off"},
+ {"--nokiatuneradio", 0, 0, DCT4TuneRadio, {H_Nokia,H_FM,0}, ""},
+ {"--nokiamakecamerashoot", 0, 0, DCT4MakeCameraShoot, {H_Nokia,H_Other,0}, ""},
+ {"--nokiagetscreendump", 0, 0, DCT4GetScreenDump, {H_Nokia,H_Other,0}, ""},
+#endif
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+ {"--nokiavibratest", 0, 0, NokiaVibraTest, {H_Nokia,H_Tests,0}, ""},
+ {"--nokiagett9", 0, 0, NokiaGetT9, {H_Nokia,H_SMS,0}, ""},
+ {"--nokiadisplaytest", 1, 1, NokiaDisplayTest, {H_Nokia,H_Tests,0}, "number"},
+ {"--nokiagetadc", 0, 0, NokiaGetADC, {H_Nokia,H_Tests,0}, ""},
+ {"--nokiasecuritycode", 0, 0, NokiaSecurityCode, {H_Nokia,H_Info,0}, ""},
+ {"--nokiaselftests", 0, 0, NokiaSelfTests, {H_Nokia,H_Tests,0}, ""},
+ {"--nokiasetphonemenus", 0, 0, NokiaSetPhoneMenus, {H_Nokia,H_Other,0}, ""},
+#endif
+#ifdef DEBUG
+ {"--decodesniff", 2, 3, decodesniff, {H_Decode,0}, "MBUS2|IRDA file [phonemodel]"},
+ {"--decodebinarydump", 1, 2, decodebinarydump, {H_Decode,0}, "file [phonemodel]"},
+ {"--makeconverttable", 1, 1, MakeConvertTable, {H_Decode,0}, "file"},
+#endif
+ {"", 0, 0, NULL }
+};
+
+static HelpCategoryDescriptions HelpDescriptions[] = {
+ {H_Call, "call", "Calls",},
+ {H_SMS, "sms", "SMS and EMS"},
+ {H_Memory, "memory", "Memory (phonebooks and calls)"},
+ {H_Filesystem, "filesystem", "Filesystem"},
+ {H_Logo, "logo", "Logo and pictures"},
+ {H_Ringtone, "ringtone", "Ringtones"},
+ {H_Calendar, "calendar", "Calendar notes"},
+ {H_ToDo, "todo", "To do lists"},
+ {H_Note, "note", "Notes"},
+ {H_DateTime, "datetime", "Date, time and alarms"},
+ {H_Category, "category", "Categories"},
+#ifdef GSM_ENABLE_BACKUP
+ {H_Backup, "backup", "Backing up and restoring"},
+#endif
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+ {H_Nokia, "nokia", "Nokia specific"},
+#endif
+#ifdef GSM_ENABLE_AT
+ {H_Siemens, "siemens", "Siemens specific"},
+#endif
+ {H_Network, "network", "Network"},
+ {H_WAP, "wap", "WAP settings and bookmarks"},
+ {H_MMS, "mms", "MMS and MMS settings"},
+ {H_Tests, "tests", "Phone tests"},
+ {H_FM, "fm", "FM radio"},
+ {H_Info, "info", "Phone information"},
+ {H_Settings, "settings", "Phone settings"},
+#ifdef DEBUG
+ {H_Decode, "decode", "Dumps decoding"},
+#endif
+ {H_Other, "other", "Functions that don't fit elsewhere"},
+ {0, NULL, NULL}
+};
+
+
+void HelpHeader(void)
+{
+ printmsg("[Gammu version %s built %s %s]\n\n",VERSION,__TIME__,__DATE__);
+}
+
+static void HelpGeneral(void)
+{
+ int i=0;
+
+ HelpHeader();
+
+ printmsg("Usage: gammu [confign] [nothing|text|textall|binary|errors] [options]\n\n");
+ printmsg("First parameter optionally specifies which config section to use (by default are probed all).\n");
+ printmsg("Second parameter optionally controls debug level, next specify actions.\n\n");
+
+ /* We might want to put here some most used commands */
+ printmsg("For more details call help on specific topic (gammu --help topic), topics are:\n\n");
+
+ while (HelpDescriptions[i].category != 0) {
+ printf("%11s - %s\n", HelpDescriptions[i].option, HelpDescriptions[i].description);
+ i++;
+ }
+ printf("\n");
+}
+
+static void HelpSplit(int cols, int len, unsigned char *buff)
+{
+ int l, len2, pos, split;
+ bool in_opt,first=true;
+ char *remain, spaces[50], buffer[500];
+
+ if (cols == 0) {
+ printf(" %s\n", buff);
+ } else {
+ printf(" ");
+ spaces[0] = 0;
+ len2 = strlen(buff);
+ if (len + len2 < cols) {
+ printf("%s\n", buff);
+ } else {
+ for(l = 0; l < len; l++) strcat(spaces, " ");
+
+ remain = buff;
+
+ while (strlen(remain) > 0) {
+ split = 0;
+ pos = 0;
+ in_opt = false;
+ if (!first) printf(spaces);
+ while (pos < cols - len && remain[pos] != 0) {
+ if (in_opt && remain[pos] == ']') {
+ in_opt = false;
+ split = pos;
+ } else if (remain[pos] == '[') {
+ in_opt = true;
+ } else if (!in_opt && remain[pos] == ' ') {
+ split = pos - 1;
+ }
+ pos++;
+ }
+ /* Can not be split */
+ if (split == 0) {
+ printf("%s\n", remain);
+ remain += strlen(remain);
+ } else {
+ first = false;
+ split++;
+ strncpy(buffer, remain, split);
+ buffer[split] = 0;
+ printf("%s\n", buffer);
+ remain += split;
+ if (remain[0] == ' ') remain++;
+ }
+ }
+ }
+ }
+}
+
+static void Help(int argc, char *argv[])
+{
+ int i = 0, j = 0, k, cols;
+ bool disp;
+#ifdef TIOCGWINSZ
+ struct winsize w;
+#endif
+#if defined(WIN32) || defined(DJGPP)
+#else
+ char *columns;
+#endif
+
+ /* Just --help */
+ if (argc == 2) {
+ HelpGeneral();
+ return;
+ }
+
+ if (!strcmp(argv[2],"all")) {
+ HelpHeader();
+ } else {
+ while (HelpDescriptions[i].category != 0) {
+ if (strcmp(argv[2], HelpDescriptions[i].option) == 0) break;
+ i++;
+ }
+ if (HelpDescriptions[i].category == 0) {
+ HelpGeneral();
+ printmsg("Unknown help topic specified!\n");
+ return;
+ }
+ HelpHeader();
+ printmsg("Gammu parameters, topic: %s\n\n", HelpDescriptions[i].description);
+ }
+
+#if defined(WIN32) || defined(DJGPP)
+ cols = 80;
+#else
+ cols = 0;
+ /* If stdout is a tty, we will wrap to columns it has */
+ if (isatty(1)) {
+#ifdef TIOCGWINSZ
+ if (ioctl(2, TIOCGWINSZ, &w) == 0) {
+ if (w.ws_col > 0) cols = w.ws_col;
+ }
+#endif
+ if (cols == 0) {
+ columns = getenv("COLUMNS");
+ if (columns != NULL) {
+ cols = atoi(columns);
+ if (cols <= 0) cols = 0;
+ }
+ }
+
+ if (cols == 0) {
+ /* Fallback */
+ cols = 80;
+ }
+ }
+#endif
+
+ while (Parameters[j].Function != NULL) {
+ k = 0;
+ disp = false;
+ if (!strcmp(argv[2],"all")) {
+ if (j==0) disp = true;
+ if (j!=0) {
+ if (strcmp(Parameters[j].help,Parameters[j-1].help)) {
+ disp = true;
+ } else {
+ if (strcmp(Parameters[j].parameter,Parameters[j-1].parameter)) {
+ disp = true;
+ }
+ }
+ }
+ } else {
+ while (Parameters[j].help_cat[k] != 0) {
+ if (Parameters[j].help_cat[k] == HelpDescriptions[i].category) {
+ disp = true;
+ break;
+ }
+ k++;
+ }
+ }
+ if (disp) {
+ printf("%s", Parameters[j].parameter);
+ if (Parameters[j].help[0] == 0) {
+ printf("\n");
+ } else {
+ HelpSplit(cols - 1, strlen(Parameters[j].parameter) + 1, Parameters[j].help);
+ }
+ }
+ j++;
+ }
+}
+#if 0
+#endif // 0
+int main(int argc, char *argv[])
+{
+
+ //fprintf(stderr,"HIIIIIIIIIIIII \n");
+ //#if 0
+ static int z ,start,i;
+ static int only_config ;
+#if !defined(WIN32) && defined(LOCALE_PATH)
+ static char *locale, locale_file[201];
+#endif
+ static char *cp;
+ static bool count_failed;
+ z = 0;
+ start=0;only_config = -1;count_failed = false;
+ s.opened = false;
+ s.msg = NULL;
+ s.ConfigNum = 0;
+
+ setlocale(LC_ALL, "");
+#ifdef DEBUG
+ di.dl = DL_TEXTALL;
+ di.df = stdout;
+#endif
+ //#if 0
+ /* Any parameters? */
+ if (argc == 1) {
+ HelpGeneral();
+ printmsg("Too few parameters!\n");
+ exit(1);
+ }
+
+ /* Help? */
+ if (strncmp(argv[1 + start], "--help", 6) == 0) {
+ Help(argc - start, argv + start);
+ exit(1);
+ }
+
+ /* Is first parameter numeric? If so treat it as config that should be loaded. */
+ if (isdigit(argv[1][0])) {
+ only_config = atoi(argv[1]);
+ if (only_config >= 0) start++; else only_config = -1;
+ }
+
+ cfg=GSM_FindGammuRC();
+ for (i = 0; i <= MAX_CONFIG_NUM; i++) {
+ if (cfg!=NULL) {
+ cp = INI_GetValue(cfg, "gammu", "gammucoding", false);
+ if (cp) di.coding = cp;
+
+ s.Config[i].Localize = INI_GetValue(cfg, "gammu", "gammuloc", false);
+ if (s.Config[i].Localize) {
+ s.msg=INI_ReadFile(s.Config[i].Localize, true);
+ } else {
+#if !defined(WIN32) && defined(LOCALE_PATH)
+ locale = setlocale(LC_MESSAGES, NULL);
+ if (locale != NULL) {
+ snprintf(locale_file, 200, "%s/gammu_%c%c.txt",
+ LOCALE_PATH,
+ tolower(locale[0]),
+ tolower(locale[1]));
+ s.msg = INI_ReadFile(locale_file, true);
+ }
+#endif
+ }
+ }
+
+ /* Wanted user specific configuration? */
+ if (only_config != -1) {
+ /* Here we get only in first for loop */
+ if (!GSM_ReadConfig(cfg, &s.Config[0], only_config)) break;
+ } else {
+ if (!GSM_ReadConfig(cfg, &s.Config[i], i) && i != 0) break;
+ }
+ s.ConfigNum++;
+
+ /* We want to use only one file descriptor for global and state machine debug output */
+ s.Config[i].UseGlobalDebugFile = true;
+
+ /* It makes no sense to open several debug logs... */
+ if (i != 0) {
+ strcpy(s.Config[i].DebugLevel, s.Config[0].DebugLevel);
+ free(s.Config[i].DebugFile);
+ s.Config[i].DebugFile = strdup(s.Config[0].DebugFile);
+ } else {
+ /* Just for first config */
+ /* When user gave debug level on command line */
+ if (argc > 1 + start && GSM_SetDebugLevel(argv[1 + start], &di)) {
+ /* Debug level from command line will be used with phone too */
+ strcpy(s.Config[i].DebugLevel,argv[1 + start]);
+ start++;
+ } else {
+ /* Try to set debug level from config file */
+ GSM_SetDebugLevel(s.Config[i].DebugLevel, &di);
+ }
+ /* If user gave debug file in gammurc, we will use it */
+ error=GSM_SetDebugFile(s.Config[i].DebugFile, &di);
+ Print_Error(error);
+ }
+
+ /* We wanted to read just user specified configuration. */
+ if (only_config != -1) {break;}
+ }
+
+ /* Do we have enough parameters? */
+ if (argc == 1 + start) {
+ HelpGeneral();
+ printmsg("Too few parameters!\n");
+ exit(-2);
+ }
+
+ /* Check used version vs. compiled */
+ if (!mystrncasecmp(GetGammuVersion(),VERSION,0)) {
+ printmsg("ERROR: version of installed libGammu.so (%s) is different to version of Gammu (%s)\n",
+ GetGammuVersion(),VERSION);
+ exit(-1);
+ }
+
+ /* Check parameters */
+ while (Parameters[z].Function != NULL) {
+ if (mystrncasecmp(Parameters[z].parameter,argv[1+start], 0)) {
+ if (argc-2-start >= Parameters[z].min_arg && argc-2-start <= Parameters[z].max_arg) {
+ Parameters[z].Function(argc - start, argv + start);
+ break;
+ } else {
+ count_failed = true;
+ }
+ }
+ z++;
+ }
+
+ /* Tell user when we did nothing */
+ if (Parameters[z].Function == NULL) {
+ HelpGeneral();
+ if (count_failed) {
+ printmsg("Bad parameter count!\n");
+ } else {
+ printmsg("Bad option!\n");
+ }
+ }
+
+ /* Close debug output if opened */
+ if (di.df!=stdout) fclose(di.df);
+ //#endif // 0
+ fprintf(stderr,"kammu: Success. End. \n");
+ exit(0);
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+