summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--gammu/emb/gammu/gammu.c47
-rw-r--r--libkcal/phoneformat.cpp6
2 files changed, 50 insertions, 3 deletions
diff --git a/gammu/emb/gammu/gammu.c b/gammu/emb/gammu/gammu.c
index 1d53fb0..5163d81 100644
--- a/gammu/emb/gammu/gammu.c
+++ b/gammu/emb/gammu/gammu.c
@@ -5177,3180 +5177,3225 @@ static void ClearAll(int argc, char *argv[])
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;
}
+ GSM_ReadConfig(NULL, &s.Config[0], 0);
+ s.ConfigNum = 1;
+ GSM_Config *con = &s.Config[0];
+
+ char* tempC;
+ tempC = argv[argc-1]+2;
+ if ( *tempC != 0 ) {
+ fprintf(stderr,"Using model %s \n",tempC);
+ strcpy(con->Model,tempC );
+ }
+ tempC = argv[argc-2]+2;
+ if ( *tempC != 0 ) {
+ fprintf(stderr,"Using device %s \n",tempC);
+ con->Device = strdup(tempC);
+ con->DefaultDevice = false;
+ }
+ tempC = argv[argc-3]+2;
+ if ( *tempC != 0 ) {
+ fprintf(stderr,"Using connection %s \n",tempC);
+ con->Connection = strdup(tempC);
+ con->DefaultConnection = false;
+ }
+ argc = argc-3;
+#if 0
+ if ( ! mConnection.isEmpty() ) {
+ cfg->Connection = strdup(mConnection.latin1());
+ cfg->DefaultConnection = false;
+ qDebug("Connection set %s ", cfg->Connection );
+
+ }
+ if ( ! mDevice.isEmpty() ) {
+ cfg->Device = strdup(mDevice.latin1());
+ cfg->DefaultDevice = false;
+ qDebug("Device set %s ", cfg->Device);
+
+ }
+ if ( ! mModel.isEmpty() ) {
+ strcpy(cfg->Model,mModel.latin1() );
+ cfg->DefaultModel = false;
+ qDebug("Model set %s ",cfg->Model );
+ }
+
+#endif
+
+#if 0
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;}
}
-
+#endif
/* 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:
*/
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp
index 0bc9125..2ad1b5a 100644
--- a/libkcal/phoneformat.cpp
+++ b/libkcal/phoneformat.cpp
@@ -1,581 +1,583 @@
/*
This file is part of libkcal.
Copyright (c) 2004 Lutz Rogowski <rogowski@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include <qdatetime.h>
#include <qstring.h>
#include <qapplication.h>
#include <qptrlist.h>
#include <qregexp.h>
#include <qmessagebox.h>
#include <qclipboard.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qtextcodec.h>
#include <qxml.h>
#include <qlabel.h>
#include <kdebug.h>
#include <klocale.h>
#include <kglobal.h>
#include "calendar.h"
#include "alarm.h"
#include "recurrence.h"
#include "calendarlocal.h"
#include "phoneformat.h"
#include "syncdefines.h"
using namespace KCal;
class PhoneParser : public QObject
{
public:
PhoneParser( ) {
;
}
static QString dtToString( const QDateTime& dti, bool useTZ = false )
{
QString datestr;
QString timestr;
int offset = KGlobal::locale()->localTimeOffset( dti );
QDateTime dt;
if (useTZ)
dt = dti.addSecs ( -(offset*60));
else
dt = dti;
if(dt.date().isValid()){
const QDate& date = dt.date();
datestr.sprintf("%04d%02d%02d",
date.year(), date.month(), date.day());
}
if(dt.time().isValid()){
const QTime& time = dt.time();
timestr.sprintf("T%02d%02d%02d",
time.hour(), time.minute(), time.second());
}
return datestr + timestr;
}
};
PhoneFormat::PhoneFormat(QString profileName, QString device,QString connection, QString model )
{
mProfileName = profileName;
mDevice = device;
mConnection = connection;
mModel = model;
}
PhoneFormat::~PhoneFormat()
{
}
#if 0
int PhoneFormat::initDevice(GSM_StateMachine *s)
{
GSM_ReadConfig(NULL, &s->Config[0], 0);
s->ConfigNum = 1;
GSM_Config *cfg = &s->Config[0];
if ( ! mConnection.isEmpty() ) {
cfg->Connection = strdup(mConnection.latin1());
cfg->DefaultConnection = false;
qDebug("Connection set %s ", cfg->Connection );
}
if ( ! mDevice.isEmpty() ) {
cfg->Device = strdup(mDevice.latin1());
cfg->DefaultDevice = false;
qDebug("Device set %s ", cfg->Device);
}
if ( ! mModel.isEmpty() ) {
strcpy(cfg->Model,mModel.latin1() );
cfg->DefaultModel = false;
qDebug("Model set %s ",cfg->Model );
}
int error=GSM_InitConnection(s,3);
return error;
}
#endif
ulong PhoneFormat::getCsumTodo( Todo* todo )
{
QStringList attList;
if ( todo->hasDueDate() )
attList << PhoneParser::dtToString ( todo->dtDue() );
attList << todo->summary();
QString completedString = "no";
if ( todo->isCompleted() )
completedString = "yes";
attList << completedString;
attList << QString::number( todo->priority() );
QString alarmString = "na";
Alarm *alarm;
if ( todo->alarms().count() > 0 ) {
alarm = todo->alarms().first();
if ( alarm->enabled() ) {
alarmString = QString::number(alarm->startOffset().asSeconds() );
}
}
attList << alarmString;
attList << todo->categoriesStr();
attList << todo->secrecyStr();
return PhoneFormat::getCsum(attList );
}
ulong PhoneFormat::getCsumEvent( Event* event )
{
QStringList attList;
attList << PhoneParser::dtToString ( event->dtStart() );
attList << PhoneParser::dtToString ( event->dtEnd() );
attList << event->summary();
attList << event->location();
QString alarmString = "na";
Alarm *alarm;
if ( event->alarms().count() > 0 ) {
alarm = event->alarms().first();
if ( alarm->enabled() ) {
alarmString = QString::number( alarm->startOffset().asSeconds() );
}
}
attList << alarmString;
Recurrence* rec = event->recurrence();
QStringList list;
bool writeEndDate = false;
switch ( rec->doesRecur() )
{
case Recurrence::rDaily: // 0
list.append( "0" );
list.append( QString::number( rec->frequency() ));//12
list.append( "0" );
list.append( "0" );
writeEndDate = true;
break;
case Recurrence::rWeekly:// 1
list.append( "1" );
list.append( QString::number( rec->frequency()) );//12
list.append( "0" );
{
int days = 0;
QBitArray weekDays = rec->days();
int i;
for( i = 1; i <= 7; ++i ) {
if ( weekDays[i-1] ) {
days += 1 << (i-1);
}
}
list.append( QString::number( days ) );
}
//pending weekdays
writeEndDate = true;
break;
case Recurrence::rMonthlyPos:// 2
list.append( "2" );
list.append( QString::number( rec->frequency()) );//12
writeEndDate = true;
{
int count = 1;
QPtrList<Recurrence::rMonthPos> rmp;
rmp = rec->monthPositions();
if ( rmp.first()->negative )
count = 5 - rmp.first()->rPos - 1;
else
count = rmp.first()->rPos - 1;
list.append( QString::number( count ) );
}
list.append( "0" );
break;
case Recurrence::rMonthlyDay:// 3
list.append( "3" );
list.append( QString::number( rec->frequency()) );//12
list.append( "0" );
list.append( "0" );
writeEndDate = true;
break;
case Recurrence::rYearlyMonth://4
list.append( "4" );
list.append( QString::number( rec->frequency()) );//12
list.append( "0" );
list.append( "0" );
writeEndDate = true;
break;
default:
list.append( "255" );
list.append( QString() );
list.append( "0" );
list.append( QString() );
list.append( "0" );
list.append( "20991231T000000" );
break;
}
if ( writeEndDate ) {
if ( rec->endDate().isValid() ) { // 15 + 16
list.append( "1" );
list.append( PhoneParser::dtToString( rec->endDate()) );
} else {
list.append( "0" );
list.append( "20991231T000000" );
}
}
attList << list.join("");
attList << event->categoriesStr();
attList << event->secrecyStr();
return PhoneFormat::getCsum(attList );
}
ulong PhoneFormat::getCsum( const QStringList & attList)
{
int max = attList.count() -1;
ulong cSum = 0;
int j,k,i;
int add;
for ( i = 1; i < max ; ++i ) {
QString s = attList[i];
if ( ! s.isEmpty() ){
j = s.length();
for ( k = 0; k < j; ++k ) {
int mul = k +1;
add = s[k].unicode ();
if ( k < 16 )
mul = mul * mul;
add = add * mul *i*i*i;
cSum += add;
}
}
}
return cSum;
}
//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum);
#include <stdlib.h>
#define DEBUGMODE false
bool PhoneFormat::load( Calendar *calendar, Calendar *existingCal)
{
QString fileName;
#ifdef _WIN32_
fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs";
#else
fileName = "/tmp/kdepimtemp.vcs";
#endif
- QString command ="./kammu --backup " + fileName + " -yes";
+ QString command ="./kammu --backup " + fileName + " -yes -C" +
+ mConnection +" -D" + mDevice +" -M" + mModel;
int ret = system ( command.latin1() );
if ( ret != 0 )
return false;
VCalFormat vfload;
vfload.setLocalTime ( true );
if ( ! vfload.load( calendar, fileName ) )
return false;
QPtrList<Event> er = calendar->rawEvents();
Event* ev = er.first();
while ( ev ) {
int id = ev->pilotId();
Event *event;
event = existingCal->event( mProfileName ,QString::number( id ) );
if ( event ) {
event = (Event*)event->clone();
copyEvent( event, ev );
calendar->deleteEvent( ev );
calendar->addEvent( event);
}
else
event = ev;
uint cSum;
cSum = PhoneFormat::getCsumEvent( event );
event->setCsum( mProfileName, QString::number( cSum ));
event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
event->setID( mProfileName,QString::number( id ) );
ev = er.next();
}
{
QPtrList<Todo> tr = calendar->rawTodos();
Todo* ev = tr.first();
while ( ev ) {
QStringList cat = ev->categories();
if ( cat.contains( "MeetingDEF" )) {
ev->setCategories( QStringList() );
}
int id = ev->pilotId();
Todo *event;
event = existingCal->todo( mProfileName ,QString::number( id ) );
if ( event ) {
event = (Todo*)event->clone();
copyTodo( event, ev );
calendar->deleteTodo( ev );
calendar->addTodo( event);
}
else
event = ev;
uint cSum;
cSum = PhoneFormat::getCsumTodo( event );
event->setCsum( mProfileName, QString::number( cSum ));
event->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
event->setID( mProfileName,QString::number( id ) );
ev = tr.next();
}
}
return true;
}
void PhoneFormat::copyEvent( Event* to, Event* from )
{
if ( from->dtStart().isValid() )
to->setDtStart( from->dtStart() );
if ( from->dtEnd().isValid() )
to->setDtEnd( from->dtEnd() );
if ( !from->location().isEmpty() )
to->setLocation( from->location() );
if ( !from->description().isEmpty() )
to->setDescription( from->description() );
if ( !from->summary().isEmpty() )
to->setSummary( from->summary() );
QPtrListIterator<Alarm> it( from->alarms() );
to->clearAlarms();
const Alarm *a;
while( (a = it.current()) ) {
Alarm *b = new Alarm( *a );
b->setParent( to );
to->addAlarm( b );
++it;
}
QStringList cat = to->categories();
QStringList catFrom = from->categories();
QString nCat;
int iii;
for ( iii = 0; iii < catFrom.count();++iii ) {
nCat = catFrom[iii];
if ( !nCat.isEmpty() )
if ( !cat.contains( nCat )) {
cat << nCat;
}
}
to->setCategories( cat );
Recurrence * r = new Recurrence( *from->recurrence(),to);
to->setRecurrence( r ) ;
}
void PhoneFormat::copyTodo( Todo* to, Todo* from )
{
if ( from->dtStart().isValid() )
to->setDtStart( from->dtStart() );
if ( from->dtDue().isValid() )
to->setDtDue( from->dtDue() );
if ( !from->location().isEmpty() )
to->setLocation( from->location() );
if ( !from->description().isEmpty() )
to->setDescription( from->description() );
if ( !from->summary().isEmpty() )
to->setSummary( from->summary() );
QPtrListIterator<Alarm> it( from->alarms() );
to->clearAlarms();
const Alarm *a;
while( (a = it.current()) ) {
Alarm *b = new Alarm( *a );
b->setParent( to );
to->addAlarm( b );
++it;
}
QStringList cat = to->categories();
QStringList catFrom = from->categories();
QString nCat;
int iii;
for ( iii = 0; iii < catFrom.count();++iii ) {
nCat = catFrom[iii];
if ( !nCat.isEmpty() )
if ( !cat.contains( nCat )) {
cat << nCat;
}
}
to->setCategories( cat );
if ( from->isCompleted() ) {
to->setCompleted( true );
if( from->completed().isValid() )
to->setCompleted( from->completed() );
} else {
// set percentcomplete only, if to->isCompleted()
if ( to->isCompleted() )
to->setPercentComplete(from->percentComplete());
}
to->setPriority(from->priority());
}
#include <qcstring.h>
void PhoneFormat::afterSave( Incidence* inc)
{
uint csum;
inc->removeID( mProfileName );
if ( inc->type() == "Event")
csum = PhoneFormat::getCsumEvent( (Event*) inc );
else
csum = PhoneFormat::getCsumTodo( (Todo*) inc );
inc->setCsum( mProfileName, QString::number( csum ));
inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
}
bool PhoneFormat::save( Calendar *calendar)
{
QLabel status ( i18n(" Opening device ..."), 0 );
int w = status.sizeHint().width()+20 ;
if ( w < 200 ) w = 230;
int h = status.sizeHint().height()+20 ;
int dw = QApplication::desktop()->width();
int dh = QApplication::desktop()->height();
status.setCaption(i18n("Writing to phone...") );
status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
status.show();
status.raise();
qApp->processEvents();
QString message;
#ifdef _WIN32_
QString fileName = locateLocal("data", "korganizer") + "\\tempfile.vcs";
#else
QString fileName = "/tmp/kdepimtemp.vcs";
#endif
// 1 remove events which should be deleted
QPtrList<Event> er = calendar->rawEvents();
Event* ev = er.first();
while ( ev ) {
if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) {
calendar->deleteEvent( ev );
} else {
}
ev = er.next();
}
// 2 remove todos which should be deleted
QPtrList<Todo> tl = calendar->rawTodos();
Todo* to = tl.first();
while ( to ) {
if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) {
calendar->deleteTodo( to );
}
to = tl.next();
}
// 3 save file
VCalFormat vfsave;
vfsave.setLocalTime ( true );
if ( ! vfsave.save( calendar, fileName ) )
return false;
// 4 call kammu
- QString command ="./kammu --restore " + fileName ;
+ QString command ="./kammu --restore " + fileName + " -C" +
+ mConnection +" -D" + mDevice +" -M" + mModel;;
int ret = system ( command.latin1() );
if ( ret != 0 )
return false;
// 5 reread data
message = i18n(" Rereading all data ... ");
status.setText ( message );
qApp->processEvents();
CalendarLocal* calendarTemp = new CalendarLocal();
calendarTemp->setTimeZoneId( calendar->timeZoneId());
if ( ! load( calendarTemp,calendar) ){
qDebug("error reloading calendar ");
delete calendarTemp;
return false;
}
// 6 compare data
//algo 6 compare event
er = calendar->rawEvents();
ev = er.first();
message = i18n(" Comparing event # ");
QPtrList<Event> er1 = calendarTemp->rawEvents();
Event* ev1;
int procCount = 0;
while ( ev ) {
qDebug("event new ID ");
status.setText ( message + QString::number ( ++procCount ) );
qApp->processEvents();
QString cSum = ev->getCsum(mProfileName);
ev1 = er1.first();
while ( ev1 ) {
if ( ev1->getCsum( mProfileName ) == cSum ) {
er1.remove( ev1 );
afterSave( ev );
ev->setID(mProfileName, ev1->getID(mProfileName) );
break;
}
ev1 = er1.next();
}
if ( ! ev1 ) {
ev->removeID(mProfileName);
qDebug("ERROR: No event found on phone for %s ", ev->summary().latin1());
}
ev = er.next();
}
//algo 6 compare todo
to = tl.first();
procCount = 0;
QPtrList<Todo> tl1 = calendarTemp->rawTodos();
Todo* to1 ;
message = i18n(" Comparing todo # ");
while ( to ) {
qDebug("todo2 %d ", procCount);
status.setText ( message + QString::number ( ++procCount ) );
qApp->processEvents();
QString cSum = to->getCsum(mProfileName);
Todo* to1 = tl1.first();
while ( to1 ) {
if ( to1->getCsum( mProfileName ) == cSum ) {
tl1.remove( to1 );
afterSave( to );
to->setID(mProfileName, to1->getID(mProfileName) );
break;
}
to1 = tl1.next();
}
if ( ! to1 ) {
to->removeID(mProfileName);
qDebug("ERROR: No todo found on phone for %s ", to->summary().latin1());
}
to = tl.next();
}
delete calendarTemp;
return true;
}
QString PhoneFormat::toString( Calendar * )
{
return QString::null;
}
bool PhoneFormat::fromString( Calendar *calendar, const QString & text)
{
return false;
}