summaryrefslogtreecommitdiffabout
path: root/gammu/emb
Side-by-side diff
Diffstat (limited to 'gammu/emb') (more/less context) (show whitespace changes)
-rw-r--r--gammu/emb/gammu/gammu.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/gammu/emb/gammu/gammu.c b/gammu/emb/gammu/gammu.c
index f49ae36..c436b90 100644
--- a/gammu/emb/gammu/gammu.c
+++ b/gammu/emb/gammu/gammu.c
@@ -2730,4528 +2730,4528 @@ static void SendSaveDisplaySMS(int argc, char *argv[])
}
SMSInfo.Entries[0].ID = SMS_AlcatelMonoAnimationLong;
SMSInfo.Entries[0].Bitmap = &bitmap[0];
bitmap[0].Bitmap[0].Text[0] = 0;
bitmap[0].Bitmap[0].Text[1] = 0;
startarg += 4 + atoi(argv[3+startarg]);
} else if (mystrncasecmp(argv[2],"PICTURE",0)) {
if (argc<4+startarg) {
printmsg("Where is logo filename ?\n");
exit(-1);
}
bitmap[0].Bitmap[0].Type=GSM_PictureImage;
error=GSM_ReadBitmapFile(argv[3+startarg],&bitmap[0]);
printmsg("File \"%s\"\n",argv[3+startarg]);
Print_Error(error);
SMSInfo.Entries[0].ID = SMS_NokiaPictureImageLong;
SMSInfo.Entries[0].Bitmap = &bitmap[0];
SMSInfo.UnicodeCoding = false;
bitmap[0].Bitmap[0].Text[0] = 0;
bitmap[0].Bitmap[0].Text[1] = 0;
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "Picture",7);
EncodeUnicode(Name,"Picture Image",13);
}
startarg += 4;
#ifdef GSM_ENABLE_BACKUP
} else if (mystrncasecmp(argv[2],"BOOKMARK",0)) {
if (argc<5+startarg) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.WAPBookmark[i]!=NULL) {
if (i == atoi(argv[4+startarg])-1) break;
i++;
}
if (i != atoi(argv[4+startarg])-1) {
printmsg("Bookmark not found in file\n");
exit(-1);
}
SMSInfo.Entries[0].ID = SMS_NokiaWAPBookmarkLong;
SMSInfo.Entries[0].Bookmark = Backup.WAPBookmark[i];
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "Bookmark",8);
EncodeUnicode(Name,"WAP Bookmark",12);
}
startarg += 5;
} else if (mystrncasecmp(argv[2],"WAPSETTINGS",0)) {
if (argc<6+startarg) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.WAPSettings[i]!=NULL) {
if (i == atoi(argv[4+startarg])-1) break;
i++;
}
if (i != atoi(argv[4+startarg])-1) {
printmsg("WAP settings not found in file\n");
exit(-1);
}
SMSInfo.Entries[0].Settings = NULL;
for (j=0;j<Backup.WAPSettings[i]->Number;j++) {
switch (Backup.WAPSettings[i]->Settings[j].Bearer) {
case WAPSETTINGS_BEARER_GPRS:
if (mystrncasecmp(argv[5+startarg],"GPRS",0)) {
SMSInfo.Entries[0].Settings = &Backup.WAPSettings[i]->Settings[j];
break;
}
case WAPSETTINGS_BEARER_DATA:
if (mystrncasecmp(argv[5+startarg],"DATA",0)) {
SMSInfo.Entries[0].Settings = &Backup.WAPSettings[i]->Settings[j];
break;
}
default:
break;
}
}
if (SMSInfo.Entries[0].Settings == NULL) {
printmsg("Sorry. For now there is only support for GPRS or DATA bearers end\n");
exit(-1);
}
SMSInfo.Entries[0].ID = SMS_NokiaWAPSettingsLong;
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "Settings",8);
EncodeUnicode(Name,"WAP Settings",12);
}
startarg += 6;
} else if (mystrncasecmp(argv[2],"MMSSETTINGS",0)) {
if (argc<5+startarg) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.MMSSettings[i]!=NULL) {
if (i == atoi(argv[4+startarg])-1) break;
i++;
}
if (i != atoi(argv[4+startarg])-1) {
printmsg("MMS settings not found in file\n");
exit(-1);
}
SMSInfo.Entries[0].Settings = NULL;
for (j=0;j<Backup.MMSSettings[i]->Number;j++) {
switch (Backup.MMSSettings[i]->Settings[j].Bearer) {
case WAPSETTINGS_BEARER_GPRS:
SMSInfo.Entries[0].Settings = &Backup.MMSSettings[i]->Settings[j];
break;
default:
break;
}
}
if (SMSInfo.Entries[0].Settings == NULL) {
printmsg("Sorry. No GPRS bearer found in MMS settings\n");
exit(-1);
}
SMSInfo.Entries[0].ID = SMS_NokiaMMSSettingsLong;
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "Settings",8);
EncodeUnicode(Name,"MMS Settings",12);
}
startarg += 5;
} else if (mystrncasecmp(argv[2],"CALENDAR",0)) {
if (argc<5+startarg) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.Calendar[i]!=NULL) {
if (i == atoi(argv[4+startarg])-1) break;
i++;
}
if (i != atoi(argv[4+startarg])-1) {
printmsg("Calendar note not found in file\n");
exit(-1);
}
SMSInfo.Entries[0].ID = SMS_NokiaVCALENDAR10Long;
SMSInfo.Entries[0].Calendar = Backup.Calendar[i];
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "Calendar",8);
}
startarg += 5;
} else if (mystrncasecmp(argv[2],"TODO",0)) {
if (argc<5+startarg) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.ToDo[i]!=NULL) {
if (i == atoi(argv[4+startarg])-1) break;
i++;
}
if (i != atoi(argv[4+startarg])-1) {
printmsg("ToDo note not found in file\n");
exit(-1);
}
SMSInfo.Entries[0].ID = SMS_NokiaVTODOLong;
SMSInfo.Entries[0].ToDo = Backup.ToDo[i];
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "ToDo",8);
}
startarg += 5;
} else if (mystrncasecmp(argv[2],"VCARD10",0) || mystrncasecmp(argv[2],"VCARD21",0)) {
if (argc<6+startarg) {
printmsg("Where is backup filename and location and memory type ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[3+startarg],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
if (mystrncasecmp(argv[4+startarg],"SM",0)) {
while (Backup.SIMPhonebook[i]!=NULL) {
if (i == atoi(argv[5+startarg])-1) break;
i++;
}
if (i != atoi(argv[5+startarg])-1) {
printmsg("Phonebook entry not found in file\n");
exit(-1);
}
SMSInfo.Entries[0].Phonebook = Backup.SIMPhonebook[i];
} else if (mystrncasecmp(argv[4+startarg],"ME",0)) {
while (Backup.PhonePhonebook[i]!=NULL) {
if (i == atoi(argv[5+startarg])-1) break;
i++;
}
if (i != atoi(argv[5+startarg])-1) {
printmsg("Phonebook entry not found in file\n");
exit(-1);
}
SMSInfo.Entries[0].Phonebook = Backup.PhonePhonebook[i];
} else {
printmsg("Unknown memory type: \"%s\"\n",argv[4+startarg]);
exit(-1);
}
if (mystrncasecmp(argv[2],"VCARD10",0)) {
SMSInfo.Entries[0].ID = SMS_VCARD10Long;
} else {
SMSInfo.Entries[0].ID = SMS_VCARD21Long;
}
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "VCARD",5);
EncodeUnicode(Name, "Phonebook entry",15);
}
startarg += 6;
#endif
} else if (mystrncasecmp(argv[2],"PROFILE",0)) {
SMSInfo.Entries[0].ID = SMS_NokiaProfileLong;
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "Profile",7);
}
startarg += 3;
} else {
printmsg("What format of sms (\"%s\") ?\n",argv[2]);
exit(-1);
}
for (i=startarg;i<argc;i++) {
switch (nextlong) {
case 0:
if (mystrncasecmp(argv[1],"--savesms",0) || SendSaved) {
if (mystrncasecmp(argv[i],"-folder",0)) {
nextlong=1;
continue;
}
}
if (mystrncasecmp(argv[1],"--savesms",0)) {
if (mystrncasecmp(argv[i],"-unread",0)) {
State = SMS_UnRead;
continue;
}
if (mystrncasecmp(argv[i],"-read",0)) {
State = SMS_Read;
continue;
}
if (mystrncasecmp(argv[i],"-unsent",0)) {
State = SMS_UnSent;
continue;
}
if (mystrncasecmp(argv[i],"-sent",0)) {
State = SMS_Sent;
continue;
}
if (mystrncasecmp(argv[i],"-sender",0)) {
nextlong=2;
continue;
}
} else {
if (mystrncasecmp(argv[i],"-save",0)) {
SendSaved=true;
continue;
}
if (mystrncasecmp(argv[i],"-report",0)) {
DeliveryReport=true;
continue;
}
if (mystrncasecmp(argv[i],"-validity",0)) {
nextlong=10;
continue;
}
}
if (mystrncasecmp(argv[i],"-smscset",0)) {
nextlong=3;
continue;
}
if (mystrncasecmp(argv[i],"-smscnumber",0)) {
nextlong=4;
continue;
}
if (mystrncasecmp(argv[i],"-protected",0)) {
nextlong=19;
continue;
}
if (mystrncasecmp(argv[i],"-reply",0)) {
ReplyViaSameSMSC=true;
continue;
}
if (mystrncasecmp(argv[i],"-maxsms",0)) {
nextlong=21;
continue;
}
if (mystrncasecmp(argv[2],"RINGTONE",0)) {
if (mystrncasecmp(argv[i],"-long",0)) {
SMSInfo.Entries[0].ID = SMS_NokiaRingtoneLong;
break;
}
if (mystrncasecmp(argv[i],"-scale",0)) {
ringtone[0].NoteTone.AllNotesScale=true;
break;
}
}
if (mystrncasecmp(argv[2],"TEXT",0)) {
if (mystrncasecmp(argv[i],"-inputunicode",0)) {
ReadUnicodeFile(Buffer[0],InputBuffer);
break;
}
if (mystrncasecmp(argv[i],"-16bit",0)) {
if (SMSInfo.Entries[0].ID == SMS_ConcatenatedTextLong) SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong16bit;
if (SMSInfo.Entries[0].ID == SMS_ConcatenatedAutoTextLong) SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong16bit;
break;
}
if (mystrncasecmp(argv[i],"-flash",0)) {
SMSInfo.Class = 0;
break;
}
if (mystrncasecmp(argv[i],"-len",0)) {
nextlong = 5;
break;
}
if (mystrncasecmp(argv[i],"-autolen",0)) {
nextlong = 5;
break;
}
if (mystrncasecmp(argv[i],"-unicode",0)) {
SMSInfo.UnicodeCoding = true;
break;
}
if (mystrncasecmp(argv[i],"-enablevoice",0)) {
SMSInfo.Entries[0].ID = SMS_EnableVoice;
break;
}
if (mystrncasecmp(argv[i],"-disablevoice",0)) {
SMSInfo.Entries[0].ID = SMS_DisableVoice;
break;
}
if (mystrncasecmp(argv[i],"-enablefax",0)) {
SMSInfo.Entries[0].ID = SMS_EnableFax;
break;
}
if (mystrncasecmp(argv[i],"-disablefax",0)) {
SMSInfo.Entries[0].ID = SMS_DisableFax;
break;
}
if (mystrncasecmp(argv[i],"-enableemail",0)) {
SMSInfo.Entries[0].ID = SMS_EnableEmail;
break;
}
if (mystrncasecmp(argv[i],"-disableemail",0)) {
SMSInfo.Entries[0].ID = SMS_DisableEmail;
break;
}
if (mystrncasecmp(argv[i],"-voidsms",0)) {
SMSInfo.Entries[0].ID = SMS_VoidSMS;
break;
}
if (mystrncasecmp(argv[i],"-replacemessages",0) &&
SMSInfo.Entries[0].ID != SMS_ConcatenatedTextLong) {
nextlong = 8;
break;
}
if (mystrncasecmp(argv[i],"-replacefile",0)) {
nextlong = 9;
continue;
}
}
if (mystrncasecmp(argv[2],"PICTURE",0)) {
if (mystrncasecmp(argv[i],"-text",0)) {
nextlong = 6;
break;
}
if (mystrncasecmp(argv[i],"-unicode",0)) {
SMSInfo.UnicodeCoding = true;
break;
}
if (mystrncasecmp(argv[i],"-alcatelbmmi",0)) {
bitmap[0].Bitmap[0].Type=GSM_StartupLogo;
error=GSM_ReadBitmapFile(argv[startarg-1],&bitmap[0]);
Print_Error(error);
SMSInfo.UnicodeCoding = true;
SMSInfo.Entries[0].ID = SMS_AlcatelMonoBitmapLong;
break;
}
break;
}
if (mystrncasecmp(argv[2],"VCARD10",0)) {
if (mystrncasecmp(argv[i],"-nokia",0)) {
SMSInfo.Entries[0].ID = SMS_NokiaVCARD10Long;
break;
}
break;
}
if (mystrncasecmp(argv[2],"VCARD21",0)) {
if (mystrncasecmp(argv[i],"-nokia",0)) {
SMSInfo.Entries[0].ID = SMS_NokiaVCARD21Long;
break;
}
break;
}
if (mystrncasecmp(argv[2],"PROFILE",0)) {
if (mystrncasecmp(argv[i],"-name",0)) {
nextlong = 22;
break;
}
if (mystrncasecmp(argv[i],"-ringtone",0)) {
nextlong = 23;
break;
}
if (mystrncasecmp(argv[i],"-bitmap",0)) {
nextlong = 24;
break;
}
}
if (mystrncasecmp(argv[2],"SMSTEMPLATE",0)) {
if (mystrncasecmp(argv[i],"-unicode",0)) {
SMSInfo.UnicodeCoding = true;
break;
}
if (mystrncasecmp(argv[i],"-text",0)) {
nextlong = 11;
break;
}
if (mystrncasecmp(argv[i],"-unicodefiletext",0)) {
nextlong = 18;
break;
}
if (mystrncasecmp(argv[i],"-defsound",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedSound;
nextlong = 12;
break;
}
if (mystrncasecmp(argv[i],"-defanimation",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedAnimation;
nextlong = 12;
break;
}
if (mystrncasecmp(argv[i],"-tone10",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-tone10long",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10Long;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-tone12",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-tone12long",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12Long;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-toneSE",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSound;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-toneSElong",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSoundLong;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-variablebitmap",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmap;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 15;
break;
}
if (mystrncasecmp(argv[i],"-variablebitmaplong",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmapLong;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 15;
break;
}
if (mystrncasecmp(argv[i],"-animation",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSAnimation;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
bitmap[SMSInfo.EntriesNum].Number = 0;
nextlong = 16;
break;
}
}
if (mystrncasecmp(argv[2],"EMS",0)) {
if (mystrncasecmp(argv[i],"-unicode",0)) {
SMSInfo.UnicodeCoding = true;
break;
}
if (mystrncasecmp(argv[i],"-16bit",0)) {
EMS16Bit = true;
break;
}
if (mystrncasecmp(argv[i],"-format",0)) {
nextlong = 20;
break;
}
if (mystrncasecmp(argv[i],"-text",0)) {
nextlong = 11;
break;
}
if (mystrncasecmp(argv[i],"-unicodefiletext",0)) {
nextlong = 18;
break;
}
if (mystrncasecmp(argv[i],"-defsound",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedSound;
nextlong = 12;
break;
}
if (mystrncasecmp(argv[i],"-defanimation",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedAnimation;
nextlong = 12;
break;
}
if (mystrncasecmp(argv[i],"-tone10",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-tone10long",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10Long;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-tone12",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-tone12long",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12Long;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-toneSE",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSound;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-toneSElong",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSoundLong;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 14;
break;
}
if (mystrncasecmp(argv[i],"-fixedbitmap",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSFixedBitmap;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 15;
break;
}
if (mystrncasecmp(argv[i],"-variablebitmap",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmap;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 15;
break;
}
if (mystrncasecmp(argv[i],"-variablebitmaplong",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmapLong;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
nextlong = 15;
break;
}
if (mystrncasecmp(argv[i],"-animation",0)) {
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSAnimation;
if (Protected != 0) {
SMSInfo.Entries[SMSInfo.EntriesNum].Protected = true;
Protected --;
}
bitmap[SMSInfo.EntriesNum].Number = 0;
nextlong = 16;
break;
}
}
if (mystrncasecmp(argv[2],"OPERATOR",0)) {
if (mystrncasecmp(argv[i],"-netcode",0)) {
nextlong = 7;
break;
}
if (mystrncasecmp(argv[i],"-biglogo",0)) {
SMSInfo.Entries[0].ID = SMS_NokiaOperatorLogoLong;
break;
}
break;
}
printmsg("Unknown parameter (\"%s\")\n",argv[i]);
exit(-1);
break;
case 1: /* SMS folder - only during saving SMS */
Folder = atoi(argv[i]);
nextlong = 0;
break;
case 2: /* Sender number - only during saving SMS */
EncodeUnicode(Sender,argv[i],strlen(argv[i]));
nextlong = 0;
break;
case 3: /* SMSC set number */
SMSCSet = atoi(argv[i]);
nextlong = 0;
break;
case 4: /* Number of SMSC */
EncodeUnicode(SMSC,argv[i],strlen(argv[i]));
SMSCSet = 0;
nextlong = 0;
break;
case 5: /* Length of text SMS */
if (atoi(argv[i])<chars_read)
{
Buffer[0][atoi(argv[i])*2] = 0x00;
Buffer[0][atoi(argv[i])*2+1] = 0x00;
}
SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong;
if (mystrncasecmp(argv[i-1],"-autolen",0)) SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong;
nextlong = 0;
break;
case 6: /* Picture Images - text */
EncodeUnicode(bitmap[0].Bitmap[0].Text,argv[i],strlen(argv[i]));
nextlong = 0;
break;
case 7: /* Operator Logo - network code */
strncpy(bitmap[0].Bitmap[0].NetworkCode,argv[i],7);
if (!strcmp(DecodeUnicodeConsole(GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode)),"unknown")) {
printmsg("Unknown GSM network code (\"%s\")\n",argv[i]);
exit(-1);
}
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "OpLogo",6);
EncodeUnicode(Sender+6*2,bitmap[0].Bitmap[0].NetworkCode,3);
EncodeUnicode(Sender+6*2+3*2,bitmap[0].Bitmap[0].NetworkCode+4,2);
if (UnicodeLength(GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode))<GSM_MAX_SMS_NAME_LENGTH-7) {
EncodeUnicode(Name,"OpLogo ",7);
CopyUnicodeString(Name+7*2,GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode));
} else {
CopyUnicodeString(Name,Sender);
}
}
nextlong = 0;
break;
case 8:/* Reject duplicates ID */
SMSInfo.ReplaceMessage = atoi(argv[i]);
if (SMSInfo.ReplaceMessage < 1 || SMSInfo.ReplaceMessage > 7) {
printmsg("You have to give number between 1 and 7 (\"%s\")\n",argv[i]);
exit(-1);
}
nextlong = 0;
break;
case 9:/* Replace file for text SMS */
ReplaceFile = fopen(argv[i], "rb");
if (ReplaceFile == NULL) Print_Error(ERR_CANTOPENFILE);
memset(ReplaceBuffer,0,sizeof(ReplaceBuffer));
fread(ReplaceBuffer,1,sizeof(ReplaceBuffer),ReplaceFile);
fclose(ReplaceFile);
ReadUnicodeFile(ReplaceBuffer2,ReplaceBuffer);
for(j=0;j<(int)(UnicodeLength(Buffer[0]));j++) {
for (z=0;z<(int)(UnicodeLength(ReplaceBuffer2)/2);z++) {
if (ReplaceBuffer2[z*4] == Buffer[0][j] &&
ReplaceBuffer2[z*4+1] == Buffer[0][j+1]) {
Buffer[0][j] = ReplaceBuffer2[z*4+2];
Buffer[0][j+1] = ReplaceBuffer2[z*4+3];
break;
}
}
}
nextlong = 0;
break;
case 10:
Validity.Format = SMS_Validity_RelativeFormat;
if (mystrncasecmp(argv[i],"HOUR",0)) Validity.Relative = SMS_VALID_1_Hour;
else if (mystrncasecmp(argv[i],"6HOURS",0)) Validity.Relative = SMS_VALID_6_Hours;
else if (mystrncasecmp(argv[i],"DAY",0)) Validity.Relative = SMS_VALID_1_Day;
else if (mystrncasecmp(argv[i],"3DAYS",0)) Validity.Relative = SMS_VALID_3_Days;
else if (mystrncasecmp(argv[i],"WEEK",0)) Validity.Relative = SMS_VALID_1_Week;
else if (mystrncasecmp(argv[i],"MAX",0)) Validity.Relative = SMS_VALID_Max_Time;
else {
printmsg("Unknown validity string (\"%s\")\n",argv[i]);
exit(-1);
}
nextlong = 0;
break;
case 11:/* EMS text from parameter */
EncodeUnicode(Buffer[SMSInfo.EntriesNum],argv[i],strlen(argv[i]));
dbgprintf("buffer is \"%s\"\n",DecodeUnicodeConsole(Buffer[SMSInfo.EntriesNum]));
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_ConcatenatedTextLong;
SMSInfo.Entries[SMSInfo.EntriesNum].Buffer = Buffer[SMSInfo.EntriesNum];
SMSInfo.EntriesNum++;
nextlong = 0;
break;
case 12:/* EMS predefined sound/animation number */
SMSInfo.Entries[SMSInfo.EntriesNum].Number = atoi(argv[i]);
SMSInfo.EntriesNum++;
nextlong = 0;
break;
case 14: /* EMS ringtone - IMelody */
ringtone[SMSInfo.EntriesNum].Format=RING_NOTETONE;
error=GSM_ReadRingtoneFile(argv[i],&ringtone[SMSInfo.EntriesNum]);
Print_Error(error);
SMSInfo.Entries[SMSInfo.EntriesNum].Ringtone = &ringtone[SMSInfo.EntriesNum];
SMSInfo.EntriesNum++;
nextlong = 0;
break;
case 15:/* EMS bitmap file */
bitmap[SMSInfo.EntriesNum].Bitmap[0].Type=GSM_StartupLogo;
error=GSM_ReadBitmapFile(argv[i],&bitmap[SMSInfo.EntriesNum]);
Print_Error(error);
SMSInfo.Entries[SMSInfo.EntriesNum].Bitmap = &bitmap[SMSInfo.EntriesNum];
SMSInfo.EntriesNum++;
nextlong = 0;
break;
case 16:/* Number of frames for EMS animation */
FramesNum = atoi(argv[i]);
if (FramesNum < 1 || FramesNum > 4) {
printmsg("You have to give number of EMS frames between 1 and 4 (\"%s\")\n",argv[i]);
exit(-1);
}
bitmap[SMSInfo.EntriesNum].Number = 0;
nextlong = 17;
break;
case 17:/*File for EMS animation */
bitmap2.Bitmap[0].Type=GSM_StartupLogo;
error=GSM_ReadBitmapFile(argv[i],&bitmap2);
for (j=0;j<bitmap2.Number;j++) {
if (bitmap[SMSInfo.EntriesNum].Number == FramesNum) break;
memcpy(&bitmap[SMSInfo.EntriesNum].Bitmap[bitmap[SMSInfo.EntriesNum].Number],&bitmap2.Bitmap[j],sizeof(GSM_Bitmap));
bitmap[SMSInfo.EntriesNum].Number++;
}
if (bitmap[SMSInfo.EntriesNum].Number == FramesNum) {
SMSInfo.Entries[SMSInfo.EntriesNum].Bitmap = &bitmap[SMSInfo.EntriesNum];
SMSInfo.EntriesNum++;
nextlong = 0;
}
break;
case 18:/* EMS text from Unicode file */
f = fopen(argv[i],"rb");
if (f == NULL) {
printmsg("Can't open file \"%s\"\n",argv[i]);
exit(-1);
}
z=fread(InputBuffer,1,2000,f);
InputBuffer[z] = 0;
InputBuffer[z+1] = 0;
fclose(f);
ReadUnicodeFile(Buffer[SMSInfo.EntriesNum],InputBuffer);
dbgprintf("buffer is \"%s\"\n",DecodeUnicodeConsole(Buffer[SMSInfo.EntriesNum]));
SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_ConcatenatedTextLong;
SMSInfo.Entries[SMSInfo.EntriesNum].Buffer = Buffer[SMSInfo.EntriesNum];
SMSInfo.EntriesNum++;
nextlong = 0;
break;
case 19:/* Number of protected items */
Protected = atoi(argv[i]);
nextlong = 0;
break;
case 20:/* Formatting text for EMS */
if (SMSInfo.Entries[SMSInfo.EntriesNum-1].ID == SMS_ConcatenatedTextLong) {
for(j=0;j<(int)strlen(argv[i]);j++) {
switch(argv[i][j]) {
case 'l': case 'L':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Left = true;
break;
case 'c': case 'C':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Center = true;
break;
case 'r': case 'R':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Right = true;
break;
case 'a': case 'A':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Large = true;
break;
case 's': case 'S':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Small = true;
break;
case 'b': case 'B':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Bold = true;
break;
case 'i': case 'I':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Italic = true;
break;
case 'u': case 'U':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Underlined = true;
break;
case 't': case 'T':
SMSInfo.Entries[SMSInfo.EntriesNum-1].Strikethrough = true;
break;
default:
printmsg("Unknown parameter \"%c\"\n",argv[i][j]);
exit(-1);
}
}
} else {
printmsg("Last parameter wasn't text\n");
exit(-1);
}
nextlong = 0;
break;
case 21:/*MaxSMS*/
MaxSMS = atoi(argv[i]);
nextlong = 0;
break;
case 22:/* profile name */
EncodeUnicode(Buffer[0],argv[i],strlen(argv[i]));
SMSInfo.Entries[0].Buffer = Buffer[0];
nextlong = 0;
break;
case 23:/* profile ringtone */
ringtone[0].Format = RING_NOTETONE;
error=GSM_ReadRingtoneFile(argv[i],&ringtone[0]);
Print_Error(error);
SMSInfo.Entries[0].Ringtone = &ringtone[0];
nextlong = 0;
break;
case 24:/* profile bitmap */
bitmap[0].Bitmap[0].Type = GSM_PictureImage;
error=GSM_ReadBitmapFile(argv[i],&bitmap[0]);
Print_Error(error);
bitmap[0].Bitmap[0].Text[0] = 0;
bitmap[0].Bitmap[0].Text[1] = 0;
SMSInfo.Entries[0].Bitmap = &bitmap[0];
nextlong = 0;
break;
}
}
if (nextlong!=0) {
printmsg("Parameter missed...\n");
exit(-1);
}
if (mystrncasecmp(argv[2],"EMS",0) && EMS16Bit) {
for (i=0;i<SMSInfo.EntriesNum;i++) {
switch (SMSInfo.Entries[i].ID) {
case SMS_ConcatenatedTextLong:
SMSInfo.Entries[i].ID = SMS_ConcatenatedTextLong16bit;
default:
break;
}
}
}
if (mystrncasecmp(argv[2],"TEXT",0)) {
chars_read = UnicodeLength(Buffer[0]);
if (chars_read != 0) {
/* Trim \n at the end of string */
if (Buffer[0][chars_read*2-1] == '\n' && Buffer[0][chars_read*2-2] == 0)
{
Buffer[0][chars_read*2-1] = 0;
}
}
}
if (mystrncasecmp(argv[1],"--displaysms",0) || mystrncasecmp(argv[1],"--sendsmsdsms",0)) {
if (mystrncasecmp(argv[2],"OPERATOR",0)) {
if (bitmap[0].Bitmap[0].Type==GSM_OperatorLogo && strcmp(bitmap[0].Bitmap[0].NetworkCode,"000 00")==0) {
printmsg("No network code\n");
exit(-1);
}
}
} else {
GSM_Init(true);
if (mystrncasecmp(argv[2],"OPERATOR",0)) {
if (bitmap[0].Bitmap[0].Type==GSM_OperatorLogo && strcmp(bitmap[0].Bitmap[0].NetworkCode,"000 00")==0) {
error=Phone->GetNetworkInfo(&s,&NetInfo);
Print_Error(error);
strcpy(bitmap[0].Bitmap[0].NetworkCode,NetInfo.NetworkCode);
if (mystrncasecmp(argv[1],"--savesms",0)) {
EncodeUnicode(Sender, "OpLogo",6);
EncodeUnicode(Sender+6*2,bitmap[0].Bitmap[0].NetworkCode,3);
EncodeUnicode(Sender+6*2+3*2,bitmap[0].Bitmap[0].NetworkCode+4,2);
if (UnicodeLength(GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode))<GSM_MAX_SMS_NAME_LENGTH-7) {
EncodeUnicode(Name,"OpLogo ",7);
CopyUnicodeString(Name+7*2,GSM_GetNetworkName(bitmap[0].Bitmap[0].NetworkCode));
} else {
CopyUnicodeString(Name,Sender);
}
}
}
}
}
error=GSM_EncodeMultiPartSMS(&SMSInfo,&sms);
Print_Error(error);
for (i=0;i<SMSInfo.EntriesNum;i++) {
switch (SMSInfo.Entries[i].ID) {
case SMS_NokiaRingtone:
case SMS_NokiaRingtoneLong:
case SMS_NokiaProfileLong:
case SMS_EMSSound10:
case SMS_EMSSound12:
case SMS_EMSSonyEricssonSound:
case SMS_EMSSound10Long:
case SMS_EMSSound12Long:
case SMS_EMSSonyEricssonSoundLong:
if (SMSInfo.Entries[i].RingtoneNotes!=SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands) {
printmsg("Warning: ringtone too long. %i percent part cut\n",
(SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands-SMSInfo.Entries[i].RingtoneNotes)*100/SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands);
}
default:
break;
}
}
if (MaxSMS != -1 && sms.Number > MaxSMS) {
printmsg("There is %i SMS packed and %i limit. Exiting\n",sms.Number,MaxSMS);
if (!mystrncasecmp(argv[1],"--displaysms",0) && !mystrncasecmp(argv[1],"--sendsmsdsms",0)) GSM_Terminate();
exit(-1);
}
if (mystrncasecmp(argv[1],"--displaysms",0)) {
if (SMSCSet != 0) {
printmsg("Use -smscnumber option to give SMSC number\n");
exit(-1);
}
for (i=0;i<sms.Number;i++) {
sms.SMS[i].Location = 0;
sms.SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
sms.SMS[i].SMSC.Location = 0;
sms.SMS[i].PDU = SMS_Submit;
if (DeliveryReport) sms.SMS[i].PDU = SMS_Status_Report;
CopyUnicodeString(sms.SMS[i].Number, Sender);
CopyUnicodeString(sms.SMS[i].SMSC.Number, SMSC);
if (Validity.Format != 0) memcpy(&sms.SMS[i].SMSC.Validity,&Validity,sizeof(GSM_SMSValidity));
DisplaySMSFrame(&sms.SMS[i]);
}
printmsg("\nNumber of SMS: %i\n",sms.Number);
exit(sms.Number);
}
if (mystrncasecmp(argv[1],"--sendsmsdsms",0)) {
if (SMSCSet != 0) {
printmsg("Use -smscnumber option to give SMSC number\n");
exit(-1);
}
for (i=0;i<sms.Number;i++) {
sms.SMS[i].Location = 0;
sms.SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
sms.SMS[i].SMSC.Location = 0;
sms.SMS[i].PDU = SMS_Submit;
if (DeliveryReport) sms.SMS[i].PDU = SMS_Status_Report;
CopyUnicodeString(sms.SMS[i].Number, Sender);
CopyUnicodeString(sms.SMS[i].SMSC.Number, SMSC);
if (Validity.Format != 0) memcpy(&sms.SMS[i].SMSC.Validity,&Validity,sizeof(GSM_SMSValidity));
}
SMSDaemonSendSMS(argv[4],argv[5],&sms);
exit(0);
}
if (mystrncasecmp(argv[1],"--savesms",0) || SendSaved) {
error=Phone->GetSMSFolders(&s, &folders);
Print_Error(error);
if (SendSaved) {
if (Validity.Format != 0 && SMSCSet != 0) {
PhoneSMSC.Location = SMSCSet;
error=Phone->GetSMSC(&s,&PhoneSMSC);
Print_Error(error);
CopyUnicodeString(SMSC,PhoneSMSC.Number);
SMSCSet = 0;
}
s.User.SendSMSStatus = SendSMSStatus;
signal(SIGINT, interrupt);
printmsgerr("If you want break, press Ctrl+C...\n");
}
for (i=0;i<sms.Number;i++) {
printmsg("Saving SMS %i/%i\n",i+1,sms.Number);
// sms.SMS[i].Location = 0;
sms.SMS[i].Folder = Folder;
sms.SMS[i].State = State;
sms.SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
sms.SMS[i].SMSC.Location = SMSCSet;
if (SendSaved) {
sms.SMS[i].PDU = SMS_Submit;
if (DeliveryReport) sms.SMS[i].PDU = SMS_Status_Report;
if (Validity.Format != 0) sms.SMS[i].SMSC.Validity = Validity;
} else {
sms.SMS[i].PDU = SMS_Deliver;
}
CopyUnicodeString(sms.SMS[i].Number, Sender);
CopyUnicodeString(sms.SMS[i].Name, Name);
if (SMSCSet==0) CopyUnicodeString(sms.SMS[i].SMSC.Number, SMSC);
error=Phone->AddSMS(&s, &sms.SMS[i]);
Print_Error(error);
printmsg("Saved in folder \"%s\", location %i\n",
DecodeUnicodeConsole(folders.Folder[sms.SMS[i].Folder-1].Name),sms.SMS[i].Location);
if (SendSaved) {
printmsg("Sending sms from folder \"%s\", location %i\n",
DecodeUnicodeString(folders.Folder[sms.SMS[i].Folder-1].Name),sms.SMS[i].Location);
SMSStatus = ERR_TIMEOUT;
error=Phone->SendSavedSMS(&s, 0, sms.SMS[i].Location);
Print_Error(error);
printmsg("....waiting for network answer");
while (!gshutdown) {
GSM_ReadDevice(&s,true);
if (SMSStatus == ERR_UNKNOWN) {
GSM_Terminate();
exit(-1);
}
if (SMSStatus == ERR_NONE) break;
}
}
}
} else {
if (Validity.Format != 0 && SMSCSet != 0) {
PhoneSMSC.Location = SMSCSet;
error=Phone->GetSMSC(&s,&PhoneSMSC);
Print_Error(error);
CopyUnicodeString(SMSC,PhoneSMSC.Number);
SMSCSet = 0;
}
signal(SIGINT, interrupt);
printmsgerr("If you want break, press Ctrl+C...\n");
s.User.SendSMSStatus = SendSMSStatus;
for (i=0;i<sms.Number;i++) {
printmsg("Sending SMS %i/%i",i+1,sms.Number);
sms.SMS[i].Location = 0;
sms.SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
sms.SMS[i].SMSC.Location = SMSCSet;
sms.SMS[i].PDU = SMS_Submit;
if (DeliveryReport) sms.SMS[i].PDU = SMS_Status_Report;
CopyUnicodeString(sms.SMS[i].Number, Sender);
if (SMSCSet==0) CopyUnicodeString(sms.SMS[i].SMSC.Number, SMSC);
if (Validity.Format != 0) memcpy(&sms.SMS[i].SMSC.Validity,&Validity,sizeof(GSM_SMSValidity));
SMSStatus = ERR_TIMEOUT;
error=Phone->SendSMS(&s, &sms.SMS[i]);
Print_Error(error);
printmsg("....waiting for network answer");
while (!gshutdown) {
GSM_ReadDevice(&s,true);
if (SMSStatus == ERR_UNKNOWN) {
GSM_Terminate();
exit(-1);
}
if (SMSStatus == ERR_NONE) break;
}
}
}
GSM_Terminate();
}
#ifdef GSM_ENABLE_BACKUP
static void SaveFile(int argc, char *argv[])
{
GSM_Backup Backup;
int i,j;
FILE *file;
unsigned char Buffer[10000];
GSM_MemoryEntry *pbk;
if (mystrncasecmp(argv[2],"CALENDAR",0)) {
if (argc<5) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[4],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.Calendar[i]!=NULL) {
if (i == atoi(argv[5])-1) break;
i++;
}
if (i != atoi(argv[5])-1) {
printmsg("Calendar note not found in file\n");
exit(-1);
}
j = 0;
GSM_EncodeVCALENDAR(Buffer, &j, Backup.Calendar[i],true,Nokia_VCalendar);
} else if (mystrncasecmp(argv[2],"BOOKMARK",0)) {
if (argc<5) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[4],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.WAPBookmark[i]!=NULL) {
if (i == atoi(argv[5])-1) break;
i++;
}
if (i != atoi(argv[5])-1) {
printmsg("WAP bookmark not found in file\n");
exit(-1);
}
j = 0;
GSM_EncodeURLFile(Buffer, &j, Backup.WAPBookmark[i]);
} else if (mystrncasecmp(argv[2],"NOTE",0)) {
if (argc<5) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[4],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.Note[i]!=NULL) {
if (i == atoi(argv[5])-1) break;
i++;
}
if (i != atoi(argv[5])-1) {
printmsg("Note not found in file\n");
exit(-1);
}
j = 0;
GSM_EncodeVNTFile(Buffer, &j, Backup.Note[i]);
} else if (mystrncasecmp(argv[2],"TODO",0)) {
if (argc<5) {
printmsg("Where is backup filename and location ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[4],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
while (Backup.ToDo[i]!=NULL) {
if (i == atoi(argv[5])-1) break;
i++;
}
if (i != atoi(argv[5])-1) {
printmsg("ToDo note not found in file\n");
exit(-1);
}
j = 0;
GSM_EncodeVTODO(Buffer, &j, Backup.ToDo[i], true, Nokia_VToDo);
} else if (mystrncasecmp(argv[2],"VCARD10",0) || mystrncasecmp(argv[2],"VCARD21",0)) {
if (argc<6) {
printmsg("Where is backup filename and location and memory type ?\n");
exit(-1);
}
error=GSM_ReadBackupFile(argv[4],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
i = 0;
if (mystrncasecmp(argv[5],"SM",0)) {
while (Backup.SIMPhonebook[i]!=NULL) {
if (i == atoi(argv[6])-1) break;
i++;
}
if (i != atoi(argv[6])-1) {
printmsg("Phonebook entry not found in file\n");
exit(-1);
}
pbk = Backup.SIMPhonebook[i];
} else if (mystrncasecmp(argv[5],"ME",0)) {
while (Backup.PhonePhonebook[i]!=NULL) {
if (i == atoi(argv[6])-1) break;
i++;
}
if (i != atoi(argv[6])-1) {
printmsg("Phonebook entry not found in file\n");
exit(-1);
}
pbk = Backup.PhonePhonebook[i];
} else {
printmsg("Unknown memory type: \"%s\"\n",argv[5]);
exit(-1);
}
j = 0;
if (mystrncasecmp(argv[2],"VCARD10",0)) {
GSM_EncodeVCARD(Buffer,&j,pbk,true,Nokia_VCard10);
} else {
GSM_EncodeVCARD(Buffer,&j,pbk,true,Nokia_VCard21);
}
} else {
printmsg("What format of file (\"%s\") ?\n",argv[2]);
exit(-1);
}
file = fopen(argv[3],"wb");
fwrite(Buffer,1,j,file);
fclose(file);
}
static void Backup(int argc, char *argv[])
{
int i, used;
GSM_MemoryStatus MemStatus;
GSM_ToDoEntry ToDo;
GSM_ToDoStatus ToDoStatus;
GSM_MemoryEntry Pbk;
GSM_CalendarEntry Calendar;
GSM_Bitmap Bitmap;
GSM_WAPBookmark Bookmark;
GSM_Profile Profile;
GSM_MultiWAPSettings Settings;
GSM_SyncMLSettings SyncML;
GSM_ChatSettings Chat;
GSM_Ringtone Ringtone;
GSM_SMSC SMSC;
GSM_Backup Backup;
GSM_NoteEntry Note;
GSM_Backup_Info Info;
GSM_FMStation FMStation;
GSM_GPRSAccessPoint GPRSPoint;
bool DoBackup;
if (argc == 4 && mystrncasecmp(argv[3],"-yes",0)) always_answer_yes = true;
GSM_ClearBackup(&Backup);
GSM_GetBackupFormatFeatures(argv[2],&Info);
sprintf(Backup.Creator,"Gammu %s",VERSION);
if (strlen(GetOS()) != 0) {
strcat(Backup.Creator+strlen(Backup.Creator),", ");
strcat(Backup.Creator+strlen(Backup.Creator),GetOS());
}
if (strlen(GetCompiler()) != 0) {
strcat(Backup.Creator+strlen(Backup.Creator),", ");
strcat(Backup.Creator+strlen(Backup.Creator),GetCompiler());
}
signal(SIGINT, interrupt);
printmsgerr("Press Ctrl+C to break...\n");
GSM_Init(true);
if (Info.UseUnicode) {
Info.UseUnicode=answer_yes("Use Unicode subformat of backup file");
}
if (Info.DateTime) {
GSM_GetCurrentDateTime (&Backup.DateTime);
Backup.DateTimeAvailable=true;
}
if (Info.Model) {
error=Phone->GetManufacturer(&s);
Print_Error(error);
sprintf(Backup.Model,"%s ",s.Phone.Data.Manufacturer);
if (s.Phone.Data.ModelInfo->model[0]!=0) {
strcat(Backup.Model,s.Phone.Data.ModelInfo->model);
} else {
strcat(Backup.Model,s.Phone.Data.Model);
}
strcat(Backup.Model," ");
strcat(Backup.Model,s.Phone.Data.Version);
}
if (Info.IMEI) {
error=Phone->GetIMEI(&s);
if (error != ERR_NOTSUPPORTED) {
strcpy(Backup.IMEI, s.Phone.Data.IMEI);
Print_Error(error);
} else {
Backup.IMEI[0] = 0;
}
}
printf("\n");
DoBackup = false;
if (Info.PhonePhonebook) {
printmsg("Checking phone phonebook\n");
MemStatus.MemoryType = MEM_ME;
error=Phone->GetMemoryStatus(&s, &MemStatus);
if (error==ERR_NONE && MemStatus.MemoryUsed != 0) {
if (answer_yes(" Backup phone phonebook")) DoBackup = true;
}
}
if (DoBackup) {
Pbk.MemoryType = MEM_ME;
i = 1;
used = 0;
while (used != MemStatus.MemoryUsed) {
Pbk.Location = i;
error=Phone->GetMemory(&s, &Pbk);
if (error != ERR_EMPTY) {
Print_Error(error);
if (used < GSM_BACKUP_MAX_PHONEPHONEBOOK) {
Backup.PhonePhonebook[used] = malloc(sizeof(GSM_MemoryEntry));
if (Backup.PhonePhonebook[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.PhonePhonebook[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_PHONEPHONEBOOK");
GSM_Terminate();
exit(-1);
}
*Backup.PhonePhonebook[used]=Pbk;
used++;
}
printmsgerr("%c Reading: %i percent",13,used*100/MemStatus.MemoryUsed);
i++;
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.SIMPhonebook) {
printmsg("Checking SIM phonebook\n");
MemStatus.MemoryType = MEM_SM;
error=Phone->GetMemoryStatus(&s, &MemStatus);
if (error==ERR_NONE && MemStatus.MemoryUsed != 0) {
if (answer_yes(" Backup SIM phonebook")) DoBackup=true;
}
}
if (DoBackup) {
Pbk.MemoryType = MEM_SM;
i = 1;
used = 0;
while (used != MemStatus.MemoryUsed) {
Pbk.Location = i;
error=Phone->GetMemory(&s, &Pbk);
if (error != ERR_EMPTY) {
Print_Error(error);
if (used < GSM_BACKUP_MAX_SIMPHONEBOOK) {
Backup.SIMPhonebook[used] = malloc(sizeof(GSM_MemoryEntry));
if (Backup.SIMPhonebook[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.SIMPhonebook[used + 1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_SIMPHONEBOOK");
GSM_Terminate();
exit(-1);
}
*Backup.SIMPhonebook[used]=Pbk;
used++;
}
printmsgerr("%c Reading: %i percent",13,used*100/MemStatus.MemoryUsed);
i++;
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.Calendar) {
printmsg("Checking calendar\n");
error=Phone->GetNextCalendar(&s,&Calendar,true);
if (error==ERR_NONE) {
if (answer_yes(" Backup calendar notes")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading : ");
while (error == ERR_NONE) {
if (used < GSM_MAXCALENDARTODONOTES) {
Backup.Calendar[used] = malloc(sizeof(GSM_CalendarEntry));
if (Backup.Calendar[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.Calendar[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_MAXCALENDARTODONOTES");
GSM_Terminate();
exit(-1);
}
*Backup.Calendar[used]=Calendar;
used ++;
error=Phone->GetNextCalendar(&s,&Calendar,false);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.ToDo) {
printmsg("Checking ToDo\n");
error=Phone->GetToDoStatus(&s,&ToDoStatus);
if (error == ERR_NONE && ToDoStatus.Used != 0) {
if (answer_yes(" Backup ToDo")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
error=Phone->GetNextToDo(&s,&ToDo,true);
while (error == ERR_NONE) {
if (used < GSM_MAXCALENDARTODONOTES) {
Backup.ToDo[used] = malloc(sizeof(GSM_ToDoEntry));
if (Backup.ToDo[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.ToDo[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_MAXCALENDARTODONOTES");
GSM_Terminate();
exit(-1);
}
*Backup.ToDo[used]=ToDo;
used ++;
error=Phone->GetNextToDo(&s,&ToDo,false);
printmsgerr("%c Reading: %i percent",13,used*100/ToDoStatus.Used);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.Note) {
printmsg("Checking notes\n");
error=Phone->GetNextNote(&s,&Note,true);
if (error==ERR_NONE) {
if (answer_yes(" Backup notes")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading : ");
while (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_NOTE) {
Backup.Note[used] = malloc(sizeof(GSM_NoteEntry));
if (Backup.Note[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.Note[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_NOTE");
GSM_Terminate();
exit(-1);
}
*Backup.Note[used]=Note;
used ++;
error=Phone->GetNextNote(&s,&Note,false);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.CallerLogos) {
printmsg("Checking caller logos\n");
Bitmap.Type = GSM_CallerGroupLogo;
Bitmap.Location = 1;
error=Phone->GetBitmap(&s,&Bitmap);
if (error == ERR_NONE) {
if (answer_yes(" Backup caller groups and logos")) DoBackup = true;
}
}
if (DoBackup) {
printmsgerr(" Reading : ");
error = ERR_NONE;
used = 0;
while (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_CALLER) {
Backup.CallerLogos[used] = malloc(sizeof(GSM_Bitmap));
if (Backup.CallerLogos[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.CallerLogos[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_CALLER");
GSM_Terminate();
exit(-1);
}
*Backup.CallerLogos[used] = Bitmap;
used ++;
Bitmap.Location = used + 1;
error=Phone->GetBitmap(&s,&Bitmap);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.SMSC) {
printmsg("Checking SMS profiles\n");
if (answer_yes(" Backup SMS profiles")) DoBackup = true;
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading: ");
while (true) {
SMSC.Location = used + 1;
error = Phone->GetSMSC(&s,&SMSC);
if (error != ERR_NONE) break;
if (used < GSM_BACKUP_MAX_SMSC) {
Backup.SMSC[used] = malloc(sizeof(GSM_SMSC));
if (Backup.SMSC[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.SMSC[used + 1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_SMSC");
GSM_Terminate();
exit(-1);
}
*Backup.SMSC[used]=SMSC;
used++;
printmsgerr("*");
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.StartupLogo) {
printmsg("Checking startup text\n");
Bitmap.Type = GSM_WelcomeNote_Text;
error = Phone->GetBitmap(&s,&Bitmap);
if (error == ERR_NONE) {
if (answer_yes(" Backup startup logo/text")) DoBackup = true;
}
}
if (DoBackup) {
Backup.StartupLogo = malloc(sizeof(GSM_Bitmap));
if (Backup.StartupLogo == NULL) Print_Error(ERR_MOREMEMORY);
*Backup.StartupLogo = Bitmap;
if (Bitmap.Text[0]==0 && Bitmap.Text[1]==0) {
Bitmap.Type = GSM_StartupLogo;
error = Phone->GetBitmap(&s,&Bitmap);
if (error == ERR_NONE) *Backup.StartupLogo = Bitmap;
}
}
DoBackup = false;
if (Info.OperatorLogo) {
printmsg("Checking operator logo\n");
Bitmap.Type = GSM_OperatorLogo;
error=Phone->GetBitmap(&s,&Bitmap);
if (error == ERR_NONE) {
if (strcmp(Bitmap.NetworkCode,"000 00")!=0) {
if (answer_yes(" Backup operator logo")) DoBackup = true;
}
}
}
if (DoBackup) {
Backup.OperatorLogo = malloc(sizeof(GSM_Bitmap));
if (Backup.OperatorLogo == NULL) Print_Error(ERR_MOREMEMORY);
*Backup.OperatorLogo = Bitmap;
}
DoBackup = false;
if (Info.WAPBookmark) {
printmsg("Checking WAP bookmarks\n");
Bookmark.Location = 1;
error=Phone->GetWAPBookmark(&s,&Bookmark);
if (error==ERR_NONE) {
if (answer_yes(" Backup WAP bookmarks")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading : ");
while (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_WAPBOOKMARK) {
Backup.WAPBookmark[used] = malloc(sizeof(GSM_WAPBookmark));
if (Backup.WAPBookmark[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.WAPBookmark[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_WAPBOOKMARK");
GSM_Terminate();
exit(-1);
}
*Backup.WAPBookmark[used]=Bookmark;
used ++;
Bookmark.Location = used+1;
error=Phone->GetWAPBookmark(&s,&Bookmark);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.WAPSettings) {
printmsg("Checking WAP settings\n");
Settings.Location = 1;
error=Phone->GetWAPSettings(&s,&Settings);
if (error==ERR_NONE) {
if (answer_yes(" Backup WAP settings")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading : ");
while (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_WAPSETTINGS) {
Backup.WAPSettings[used] = malloc(sizeof(GSM_MultiWAPSettings));
if (Backup.WAPSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.WAPSettings[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_WAPSETTINGS");
GSM_Terminate();
exit(-1);
}
*Backup.WAPSettings[used]=Settings;
used ++;
Settings.Location = used+1;
error=Phone->GetWAPSettings(&s,&Settings);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.MMSSettings) {
printmsg("Checking MMS settings\n");
Settings.Location = 1;
error=Phone->GetMMSSettings(&s,&Settings);
if (error==ERR_NONE) {
if (answer_yes(" Backup MMS settings")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading : ");
while (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_MMSSETTINGS) {
Backup.MMSSettings[used] = malloc(sizeof(GSM_MultiWAPSettings));
if (Backup.MMSSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.MMSSettings[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_MMSSETTINGS");
GSM_Terminate();
exit(-1);
}
*Backup.MMSSettings[used]=Settings;
used ++;
Settings.Location = used+1;
error=Phone->GetMMSSettings(&s,&Settings);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.ChatSettings) {
printmsg("Checking Chat settings\n");
Chat.Location = 1;
error=Phone->GetChatSettings(&s,&Chat);
if (error==ERR_NONE) {
if (answer_yes(" Backup Chat settings")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading : ");
while (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_CHATSETTINGS) {
Backup.ChatSettings[used] = malloc(sizeof(GSM_ChatSettings));
if (Backup.ChatSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.ChatSettings[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_CHATSETTINGS");
GSM_Terminate();
exit(-1);
}
*Backup.ChatSettings[used]=Chat;
used ++;
Chat.Location = used+1;
error=Phone->GetChatSettings(&s,&Chat);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.SyncMLSettings) {
printmsg("Checking SyncML settings\n");
SyncML.Location = 1;
error=Phone->GetSyncMLSettings(&s,&SyncML);
if (error==ERR_NONE) {
if (answer_yes(" Backup SyncML settings")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading : ");
while (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_SYNCMLSETTINGS) {
Backup.SyncMLSettings[used] = malloc(sizeof(GSM_SyncMLSettings));
if (Backup.SyncMLSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.SyncMLSettings[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_SYNCMLSETTINGS");
GSM_Terminate();
exit(-1);
}
*Backup.SyncMLSettings[used]=SyncML;
used ++;
SyncML.Location = used+1;
error=Phone->GetSyncMLSettings(&s,&SyncML);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.Ringtone) {
printmsg("Checking user ringtones\n");
Ringtone.Location = 1;
Ringtone.Format = 0;
error=Phone->GetRingtone(&s,&Ringtone,false);
if (error==ERR_EMPTY || error == ERR_NONE) {
if (answer_yes(" Backup user ringtones")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
i = 1;
printmsgerr(" Reading : ");
while (error == ERR_NONE || error == ERR_EMPTY) {
if (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_RINGTONES) {
Backup.Ringtone[used] = malloc(sizeof(GSM_Ringtone));
if (Backup.Ringtone[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.Ringtone[used+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_RINGTONES");
GSM_Terminate();
exit(-1);
}
*Backup.Ringtone[used]=Ringtone;
used ++;
}
i++;
Ringtone.Location = i;
Ringtone.Format = 0;
error=Phone->GetRingtone(&s,&Ringtone,false);
printmsgerr("*");
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.Profiles) {
printmsg("Checking phone profiles\n");
Profile.Location = 1;
error = Phone->GetProfile(&s,&Profile);
if (error == ERR_NONE) {
if (answer_yes(" Backup phone profiles")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
printmsgerr(" Reading: ");
while (true) {
Profile.Location = used + 1;
error = Phone->GetProfile(&s,&Profile);
if (error != ERR_NONE) break;
if (used < GSM_BACKUP_MAX_PROFILES) {
Backup.Profiles[used] = malloc(sizeof(GSM_Profile));
if (Backup.Profiles[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.Profiles[used + 1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_PROFILES");
GSM_Terminate();
exit(-1);
}
*Backup.Profiles[used]=Profile;
used++;
printmsgerr("*");
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.FMStation) {
printmsg("Checking FM stations\n");
FMStation.Location = 1;
error = Phone->GetFMStation(&s,&FMStation);
if (error == ERR_NONE || error == ERR_EMPTY) {
if (answer_yes(" Backup phone FM stations")) DoBackup=true;
}
}
if (DoBackup) {
used = 0;
i = 1;
printmsgerr(" Reading: ");
while (error == ERR_NONE || error == ERR_EMPTY) {
error = Phone->GetFMStation(&s,&FMStation);
if (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_FMSTATIONS) {
Backup.FMStation[used] = malloc(sizeof(GSM_FMStation));
if (Backup.FMStation[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.FMStation[used + 1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_FMSTATIONS");
GSM_Terminate();
exit(-1);
}
*Backup.FMStation[used]=FMStation;
used++;
}
i++;
FMStation.Location = i;
printmsgerr("*");
}
printmsgerr("\n");
}
DoBackup = false;
if (Info.GPRSPoint) {
printmsg("Checking GPRS access points\n");
GPRSPoint.Location = 1;
error = Phone->GetGPRSAccessPoint(&s,&GPRSPoint);
if (error == ERR_NONE || error == ERR_EMPTY) {
if (answer_yes(" Backup GPRS access points")) DoBackup = true;
}
}
if (DoBackup) {
used = 0;
i = 1;
printmsgerr(" Reading: ");
while (error == ERR_NONE || error == ERR_EMPTY) {
error = Phone->GetGPRSAccessPoint(&s,&GPRSPoint);
if (error == ERR_NONE) {
if (used < GSM_BACKUP_MAX_GPRSPOINT) {
Backup.GPRSPoint[used] = malloc(sizeof(GSM_GPRSAccessPoint));
if (Backup.GPRSPoint[used] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.GPRSPoint[used + 1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_GPRSPOINT");
GSM_Terminate();
exit(-1);
}
*Backup.GPRSPoint[used]=GPRSPoint;
used++;
}
i++;
GPRSPoint.Location = i;
printmsgerr("*");
}
printmsgerr("\n");
}
GSM_Terminate();
GSM_SaveBackupFile(argv[2],&Backup, Info.UseUnicode);
GSM_FreeBackup(&Backup);
}
static void Restore(int argc, char *argv[])
{
GSM_Backup Backup;
GSM_FMStation FMStation;
GSM_DateTime date_time;
GSM_CalendarEntry Calendar;
GSM_Bitmap Bitmap;
GSM_Ringtone Ringtone;
GSM_MemoryEntry Pbk;
GSM_MemoryStatus MemStatus;
GSM_ToDoEntry ToDo;
GSM_ToDoStatus ToDoStatus;
GSM_Profile Profile;
GSM_MultiWAPSettings Settings;
GSM_GPRSAccessPoint GPRSPoint;
GSM_WAPBookmark Bookmark;
int i, used, max = 0;
bool Past = true;
bool Found, DoRestore;
error=GSM_ReadBackupFile(argv[2],&Backup);
if (error!=ERR_NOTIMPLEMENTED) {
Print_Error(error);
} else {
printmsgerr("WARNING: Some data not read from file. It can be damaged or restoring some settings from this file format not implemented (maybe higher Gammu required ?)\n");
}
signal(SIGINT, interrupt);
printmsgerr("Press Ctrl+C to break...\n");
if (Backup.DateTimeAvailable) printmsgerr("Time of backup : %s\n",OSDateTime(Backup.DateTime,false));
if (Backup.Model[0]!=0) printmsgerr("Phone : %s\n",Backup.Model);
if (Backup.IMEI[0]!=0) printmsgerr("IMEI : %s\n",Backup.IMEI);
if (Backup.Creator[0]!=0) printmsgerr("File created by : %s\n",Backup.Creator);
if (Backup.MD5Calculated[0]!=0) {
dbgprintf("\"%s\"\n",Backup.MD5Original);
dbgprintf("\"%s\"\n",Backup.MD5Calculated);
if (strcmp(Backup.MD5Original,Backup.MD5Calculated)) {
if (!answer_yes("Checksum in backup file do not match. Continue")) return;
}
}
GSM_Init(true);
DoRestore = false;
if (Backup.PhonePhonebook[0] != NULL) {
MemStatus.MemoryType = MEM_ME;
error=Phone->GetMemoryStatus(&s, &MemStatus);
if (error==ERR_NONE) {
max = 0;
while (Backup.PhonePhonebook[max]!=NULL) max++;
printmsgerr("%i entries in backup file\n",max);
if (answer_yes("Restore phone phonebook")) DoRestore = true;
}
}
if (DoRestore) {
used = 0;
for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
Pbk.MemoryType = MEM_ME;
Pbk.Location = i + 1;
Pbk.EntriesNum = 0;
if (used<max) {
if (Backup.PhonePhonebook[used]->Location == Pbk.Location) {
Pbk = *Backup.PhonePhonebook[used];
used++;
dbgprintf("Location %i\n",Pbk.Location);
if (Pbk.EntriesNum != 0) error=Phone->SetMemory(&s, &Pbk);
}
}
if (Pbk.EntriesNum == 0) error=Phone->DeleteMemory(&s, &Pbk);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/(MemStatus.MemoryUsed+MemStatus.MemoryFree));
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.SIMPhonebook[0] != NULL) {
MemStatus.MemoryType = MEM_SM;
error=Phone->GetMemoryStatus(&s, &MemStatus);
if (error==ERR_NONE) {
max = 0;
while (Backup.SIMPhonebook[max]!=NULL) max++;
printmsgerr("%i entries in backup file\n",max);
if (answer_yes("Restore SIM phonebook")) DoRestore = true;
}
}
if (DoRestore) {
used = 0;
for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
Pbk.MemoryType = MEM_SM;
Pbk.Location = i + 1;
Pbk.EntriesNum = 0;
if (used<max) {
if (Backup.SIMPhonebook[used]->Location == Pbk.Location) {
Pbk = *Backup.SIMPhonebook[used];
used++;
dbgprintf("Location %i\n",Pbk.Location);
if (Pbk.EntriesNum != 0) error=Phone->SetMemory(&s, &Pbk);
}
}
if (Pbk.EntriesNum == 0) error=Phone->DeleteMemory(&s, &Pbk);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/(MemStatus.MemoryUsed+MemStatus.MemoryFree));
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.CallerLogos[0] != NULL) {
Bitmap.Type = GSM_CallerGroupLogo;
Bitmap.Location = 1;
error=Phone->GetBitmap(&s,&Bitmap);
if (error == ERR_NONE) {
if (answer_yes("Restore caller groups and logos")) DoRestore = true;
}
}
if (DoRestore) {
max = 0;
while (Backup.CallerLogos[max]!=NULL) max++;
for (i=0;i<max;i++) {
error=Phone->SetBitmap(&s,Backup.CallerLogos[i]);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
if (!mystrncasecmp(s.CurrentConfig->SyncTime,"yes",0)) {
- if (answer_yes("Do you want to set date/time in phone (NOTE: in some phones it's required to correctly restore calendar notes and other items)")) {
+ if ( true /*LRanswer_yes("Do you want to set date/time in phone (NOTE: in some phones it's required to correctly restore calendar notes and other items)")*/) {
GSM_GetCurrentDateTime(&date_time);
error=Phone->SetDateTime(&s, &date_time);
Print_Error(error);
}
}
DoRestore = false;
if (Backup.Calendar[0] != NULL) {
/* N6110 doesn't support getting calendar status */
error = Phone->GetNextCalendar(&s,&Calendar,true);
if (error == ERR_NONE || error == ERR_INVALIDLOCATION || error == ERR_EMPTY) {
max = 0;
while (Backup.Calendar[max] != NULL) max++;
printmsgerr("%i entries in backup file\n",max);
// LR
//if (answer_yes("Restore calendar notes")) {
//Past = answer_yes("Restore notes from the past");
DoRestore = true;
//}
}
}
if (DoRestore) {
printmsgerr("Deleting old notes: ");
error = Phone->DeleteAllCalendar(&s);
if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
while (1) {
error = Phone->GetNextCalendar(&s,&Calendar,true);
if (error != ERR_NONE) break;
error = Phone->DeleteCalendar(&s,&Calendar);
Print_Error(error);
printmsgerr("*");
}
printmsgerr("\n");
} else {
printmsgerr("Done\n");
Print_Error(error);
}
for (i=0;i<max;i++) {
if (!Past && IsCalendarNoteFromThePast(Backup.Calendar[i])) continue;
Calendar = *Backup.Calendar[i];
error=Phone->AddCalendar(&s,&Calendar);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.ToDo[0] != NULL) {
error = Phone->GetToDoStatus(&s,&ToDoStatus);
if (error == ERR_NONE) {
max = 0;
while (Backup.ToDo[max]!=NULL) max++;
printmsgerr("%i entries in backup file\n",max);
//LR if (answer_yes("Restore ToDo"))
DoRestore = true;
}
}
if (DoRestore) {
ToDo = *Backup.ToDo[0];
error = Phone->SetToDo(&s,&ToDo);
}
if (DoRestore && (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED)) {
printmsgerr("Deleting old ToDo: ");
error=Phone->DeleteAllToDo(&s);
if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
while (1) {
error = Phone->GetNextToDo(&s,&ToDo,true);
if (error != ERR_NONE) break;
error = Phone->DeleteToDo(&s,&ToDo);
Print_Error(error);
printmsgerr("*");
}
printmsgerr("\n");
} else {
printmsgerr("Done\n");
Print_Error(error);
}
for (i=0;i<max;i++) {
ToDo = *Backup.ToDo[i];
ToDo.Location = 0;
error=Phone->AddToDo(&s,&ToDo);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
} else if (DoRestore) {
/* At first delete entries, that were deleted */
used = 0;
error = Phone->GetNextToDo(&s,&ToDo,true);
while (error == ERR_NONE) {
used++;
Found = false;
for (i=0;i<max;i++) {
if (Backup.ToDo[i]->Location == ToDo.Location) {
Found = true;
break;
}
}
if (!Found) {
error=Phone->DeleteToDo(&s,&ToDo);
Print_Error(error);
}
error = Phone->GetNextToDo(&s,&ToDo,false);
printmsgerr("%cCleaning: %i percent",13,used*100/ToDoStatus.Used);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
/* Now write modified/new entries */
for (i=0;i<max;i++) {
ToDo = *Backup.ToDo[i];
error = Phone->SetToDo(&s,&ToDo);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
if (Backup.SMSC[0] != NULL && answer_yes("Restore SMSC profiles")) {
max = 0;
while (Backup.SMSC[max]!=NULL) max++;
for (i=0;i<max;i++) {
error=Phone->SetSMSC(&s,Backup.SMSC[i]);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
if (Backup.StartupLogo != NULL && answer_yes("Restore startup logo/text")) {
error=Phone->SetBitmap(&s,Backup.StartupLogo);
Print_Error(error);
}
if (Backup.OperatorLogo != NULL && answer_yes("Restore operator logo")) {
error=Phone->SetBitmap(&s,Backup.OperatorLogo);
Print_Error(error);
}
DoRestore = false;
if (Backup.WAPBookmark[0] != NULL) {
Bookmark.Location = 1;
error = Phone->GetWAPBookmark(&s,&Bookmark);
if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
if (answer_yes("Restore WAP bookmarks")) DoRestore = true;
}
}
if (DoRestore) {
printmsgerr("Deleting old bookmarks: ");
/* One thing to explain: DCT4 phones seems to have bug here.
* When delete for example first bookmark, phone change
* numeration for getting frame, not for deleting. So, we try to
* get 1'st bookmark. Inside frame is "correct" location. We use
* it later
*/
while (error==ERR_NONE) {
error = Phone->DeleteWAPBookmark(&s,&Bookmark);
Bookmark.Location = 1;
error = Phone->GetWAPBookmark(&s,&Bookmark);
printmsgerr("*");
}
printmsgerr("\n");
max = 0;
while (Backup.WAPBookmark[max]!=NULL) max++;
for (i=0;i<max;i++) {
Bookmark = *Backup.WAPBookmark[i];
Bookmark.Location = 0;
error=Phone->SetWAPBookmark(&s,&Bookmark);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.WAPSettings[0] != NULL) {
Settings.Location = 1;
error = Phone->GetWAPSettings(&s,&Settings);
if (error == ERR_NONE) {
if (answer_yes("Restore WAP settings")) DoRestore = true;
}
}
if (DoRestore) {
max = 0;
while (Backup.WAPSettings[max]!=NULL) max++;
for (i=0;i<max;i++) {
error=Phone->SetWAPSettings(&s,Backup.WAPSettings[i]);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.MMSSettings[0] != NULL) {
Settings.Location = 1;
error = Phone->GetMMSSettings(&s,&Settings);
if (error == ERR_NONE) {
if (answer_yes("Restore MMS settings")) DoRestore = true;
}
}
if (DoRestore) {
max = 0;
while (Backup.MMSSettings[max]!=NULL) max++;
for (i=0;i<max;i++) {
error=Phone->SetMMSSettings(&s,Backup.MMSSettings[i]);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.Ringtone[0] != NULL) {
Ringtone.Location = 1;
Ringtone.Format = 0;
error = Phone->GetRingtone(&s,&Ringtone,false);
if (error == ERR_NONE || error ==ERR_EMPTY) {
if (Phone->DeleteUserRingtones != NOTSUPPORTED) {
if (answer_yes("Delete all user ringtones")) DoRestore = true;
}
}
}
if (DoRestore) {
printmsgerr("Deleting: ");
error=Phone->DeleteUserRingtones(&s);
Print_Error(error);
printmsgerr("Done\n");
DoRestore = false;
if (answer_yes("Restore user ringtones")) DoRestore = true;
}
if (DoRestore) {
max = 0;
while (Backup.Ringtone[max]!=NULL) max++;
for (i=0;i<max;i++) {
error=GSM_RingtoneConvert(&Ringtone, Backup.Ringtone[i], Ringtone.Format);
Print_Error(error);
error=Phone->SetRingtone(&s,&Ringtone,&i);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.Profiles[0] != NULL) {
Profile.Location = 1;
error = Phone->GetProfile(&s,&Profile);
if (error == ERR_NONE) {
if (answer_yes("Restore profiles")) DoRestore = true;
}
}
if (DoRestore) {
Profile.Location= 0;
max = 0;
while (Backup.Profiles[max]!=NULL) max++;
for (i=0;i<max;i++) {
Profile = *Backup.Profiles[i];
error=Phone->SetProfile(&s,&Profile);
Print_Error(error);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.FMStation[0] != NULL) {
FMStation.Location = 1;
error = Phone->GetFMStation(&s,&FMStation);
if (error == ERR_NONE || error == ERR_EMPTY) {
if (answer_yes("Restore FM stations")) DoRestore = true;
}
}
if (DoRestore) {
printmsgerr("Deleting old FM stations: ");
error=Phone->ClearFMStations(&s);
Print_Error(error);
printmsgerr("Done\n");
max = 0;
while (Backup.FMStation[max]!=NULL) max++;
for (i=0;i<max;i++) {
FMStation = *Backup.FMStation[i];
error=Phone->SetFMStation(&s,&FMStation);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
DoRestore = false;
if (Backup.GPRSPoint[0] != NULL) {
GPRSPoint.Location = 1;
error = Phone->GetGPRSAccessPoint(&s,&GPRSPoint);
if (error == ERR_NONE || error == ERR_EMPTY) {
if (answer_yes("Restore GPRS Points")) DoRestore = true;
}
}
if (DoRestore) {
max = 0;
while (Backup.GPRSPoint[max]!=NULL) max++;
for (i=0;i<max;i++) {
error=Phone->SetGPRSAccessPoint(&s,Backup.GPRSPoint[i]);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
GSM_Terminate();
}
static void AddNew(int argc, char *argv[])
{
GSM_Backup Backup;
GSM_DateTime date_time;
GSM_MemoryEntry Pbk;
GSM_MemoryStatus MemStatus;
GSM_ToDoEntry ToDo;
GSM_ToDoStatus ToDoStatus;
GSM_CalendarEntry Calendar;
GSM_WAPBookmark Bookmark;
int i, max, j;
error=GSM_ReadBackupFile(argv[2],&Backup);
if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
signal(SIGINT, interrupt);
printmsgerr("Press Ctrl+C to break...\n");
if (Backup.DateTimeAvailable) printmsgerr("Time of backup : %s\n",OSDateTime(Backup.DateTime,false));
if (Backup.Model[0]!=0) printmsgerr("Phone : %s\n",Backup.Model);
if (Backup.IMEI[0]!=0) printmsgerr("IMEI : %s\n",Backup.IMEI);
GSM_Init(true);
if (Backup.PhonePhonebook[0] != NULL) {
MemStatus.MemoryType = MEM_ME;
error=Phone->GetMemoryStatus(&s, &MemStatus);
if (error==ERR_NONE) {
max = 0;
while (Backup.PhonePhonebook[max]!=NULL) max++;
printmsgerr("%i entries in backup file\n",max);
if (MemStatus.MemoryFree < max) {
printmsgerr("Memory has only %i free locations.Exiting\n",MemStatus.MemoryFree);
} else if (answer_yes("Add phone phonebook entries")) {
for (i=0;i<max;i++) {
Pbk = *Backup.PhonePhonebook[i];
Pbk.MemoryType = MEM_ME;
error=Phone->AddMemory(&s, &Pbk);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
}
}
if (Backup.SIMPhonebook[0] != NULL) {
MemStatus.MemoryType = MEM_SM;
error=Phone->GetMemoryStatus(&s, &MemStatus);
if (error==ERR_NONE) {
max = 0;
while (Backup.SIMPhonebook[max]!=NULL) max++;
printmsgerr("%i entries in backup file\n",max);
if (MemStatus.MemoryFree < max) {
printmsgerr("Memory has only %i free locations.Exiting\n",MemStatus.MemoryFree);
} else if (answer_yes("Add SIM phonebook entries")) {
j = 1;
for (i=0;i<max;i++) {
Pbk = *Backup.SIMPhonebook[i];
Pbk.MemoryType = MEM_SM;
error=Phone->AddMemory(&s, &Pbk);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
}
}
if (!mystrncasecmp(s.CurrentConfig->SyncTime,"yes",0)) {
- if (answer_yes("Do you want to set date/time in phone (NOTE: in some phones it's required to correctly restore calendar notes and other items)")) {
+ if (true /*LRanswer_yes("Do you want to set date/time in phone (NOTE: in some phones it's required to correctly restore calendar notes and other items)")*/) {
GSM_GetCurrentDateTime(&date_time);
error=Phone->SetDateTime(&s, &date_time);
Print_Error(error);
}
}
if (Backup.Calendar[0] != NULL) {
error = Phone->GetNextCalendar(&s,&Calendar,true);
if (error == ERR_NONE || error == ERR_INVALIDLOCATION || error == ERR_EMPTY) {
if (answer_yes("Add calendar notes")) {
max = 0;
while (Backup.Calendar[max]!=NULL) max++;
for (i=0;i<max;i++) {
Calendar = *Backup.Calendar[i];
error=Phone->AddCalendar(&s,&Calendar);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
}
}
if (Backup.ToDo[0] != NULL) {
ToDo.Location = 1;
error=Phone->GetToDoStatus(&s,&ToDoStatus);
if (error == ERR_NONE) {
if (answer_yes("Add ToDo")) {
max = 0;
while (Backup.ToDo[max]!=NULL) max++;
for (i=0;i<max;i++) {
ToDo = *Backup.ToDo[i];
error = Phone->AddToDo(&s,&ToDo);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
}
}
if (Backup.WAPBookmark[0] != NULL) {
Bookmark.Location = 1;
error = Phone->GetWAPBookmark(&s,&Bookmark);
if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
if (answer_yes("Add WAP bookmarks")) {
max = 0;
while (Backup.WAPBookmark[max]!=NULL) max++;
for (i=0;i<max;i++) {
Bookmark = *Backup.WAPBookmark[i];
Bookmark.Location = 0;
error=Phone->SetWAPBookmark(&s,&Bookmark);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/max);
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
}
}
}
GSM_Terminate();
}
#endif
static void ClearAll(int argc, char *argv[])
{
GSM_MemoryStatus MemStatus;
GSM_ToDoStatus ToDoStatus;
GSM_CalendarEntry Calendar;
GSM_ToDoEntry ToDo;
GSM_WAPBookmark Bookmark;
GSM_FMStation Station;
GSM_MemoryEntry Pbk;
bool DoClear;
GSM_Init(true);
DoClear = false;
MemStatus.MemoryType = MEM_ME;
error=Phone->GetMemoryStatus(&s, &MemStatus);
if (error==ERR_NONE && MemStatus.MemoryUsed !=0) {
if (answer_yes("Delete phone phonebook")) DoClear = true;
}
if (DoClear) {
error = Phone->DeleteAllMemory(&s,MEM_ME);
if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
Pbk.MemoryType = MEM_ME;
Pbk.Location = i + 1;
Pbk.EntriesNum = 0;
error=Phone->DeleteMemory(&s, &Pbk);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/(MemStatus.MemoryUsed+MemStatus.MemoryFree));
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
} else {
printmsgerr("Done\n");
Print_Error(error);
}
}
DoClear = false;
MemStatus.MemoryType = MEM_SM;
error=Phone->GetMemoryStatus(&s, &MemStatus);
if (error==ERR_NONE && MemStatus.MemoryUsed !=0) {
if (answer_yes("Delete SIM phonebook")) DoClear = true;
}
if (DoClear) {
error = Phone->DeleteAllMemory(&s,MEM_SM);
if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
Pbk.MemoryType = MEM_SM;
Pbk.Location = i + 1;
Pbk.EntriesNum = 0;
error=Phone->DeleteMemory(&s, &Pbk);
Print_Error(error);
printmsgerr("%cWriting: %i percent",13,(i+1)*100/(MemStatus.MemoryUsed+MemStatus.MemoryFree));
if (gshutdown) {
GSM_Terminate();
exit(0);
}
}
printmsgerr("\n");
} else {
printmsgerr("Done\n");
Print_Error(error);
}
}
DoClear = false;
error = Phone->GetNextCalendar(&s,&Calendar,true);
if (error == ERR_NONE) {
if (answer_yes("Delete calendar notes")) DoClear = true;
}
if (DoClear) {
printmsgerr("Deleting: ");
error=Phone->DeleteAllCalendar(&s);
if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
while (1) {
error = Phone->GetNextCalendar(&s,&Calendar,true);
if (error != ERR_NONE) break;
error = Phone->DeleteCalendar(&s,&Calendar);
Print_Error(error);
printmsgerr("*");
}
printmsgerr("\n");
} else {
printmsgerr("Done\n");
Print_Error(error);
}
}
DoClear = false;
error = Phone->GetToDoStatus(&s,&ToDoStatus);
if (error == ERR_NONE && ToDoStatus.Used != 0) {
if (answer_yes("Delete ToDo")) DoClear = true;
}
if (DoClear) {
printmsgerr("Deleting: ");
error=Phone->DeleteAllToDo(&s);
if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
while (1) {
error = Phone->GetNextToDo(&s,&ToDo,true);
if (error != ERR_NONE) break;
error = Phone->DeleteToDo(&s,&ToDo);
Print_Error(error);
printmsgerr("*");
}
printmsgerr("\n");
} else {
printmsgerr("Done\n");
Print_Error(error);
}
}
Bookmark.Location = 1;
error = Phone->GetWAPBookmark(&s,&Bookmark);
if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
if (answer_yes("Delete WAP bookmarks")) {
printmsgerr("Deleting: ");
/* One thing to explain: DCT4 phones seems to have bug here.
* When delete for example first bookmark, phone change
* numeration for getting frame, not for deleting. So, we try to
* get 1'st bookmark. Inside frame is "correct" location. We use
* it later
*/
while (error==ERR_NONE) {
error = Phone->DeleteWAPBookmark(&s,&Bookmark);
Bookmark.Location = 1;
error = Phone->GetWAPBookmark(&s,&Bookmark);
printmsgerr("*");
}
printmsgerr("\n");
}
}
if (Phone->DeleteUserRingtones != NOTSUPPORTED) {
if (answer_yes("Delete all user ringtones")) {
printmsgerr("Deleting: ");
error=Phone->DeleteUserRingtones(&s);
Print_Error(error);
printmsgerr("Done\n");
}
}
Station.Location=i;
error=Phone->GetFMStation(&s,&Station);
if (error == ERR_NONE || error == ERR_EMPTY) {
if (answer_yes("Delete all FM station")) {
error=Phone->ClearFMStations(&s);
Print_Error(error);
}
}
GSM_Terminate();
}
static void DisplayConnectionSettings(GSM_MultiWAPSettings *settings,int j)
{
if (settings->Settings[j].IsContinuous) {
printmsg("Connection type : Continuous\n");
} else {
printmsg("Connection type : Temporary\n");
}
if (settings->Settings[j].IsSecurity) {
printmsg("Connection security : On\n");
} else {
printmsg("Connection security : Off\n");
}
printmsg("Proxy : address \"%s\", port %i\n",DecodeUnicodeConsole(settings->Proxy),settings->ProxyPort);
printmsg("2'nd proxy : address \"%s\", port %i\n",DecodeUnicodeConsole(settings->Proxy2),settings->Proxy2Port);
switch (settings->Settings[j].Bearer) {
case WAPSETTINGS_BEARER_SMS:
printmsg("Bearer : SMS");
if (settings->ActiveBearer == WAPSETTINGS_BEARER_SMS) printf(" (active)");
printmsg("\nServer number : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Server));
printmsg("Service number : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Service));
break;
case WAPSETTINGS_BEARER_DATA:
printmsg("Bearer : Data (CSD)");
if (settings->ActiveBearer == WAPSETTINGS_BEARER_DATA) printf(" (active)");
printmsg("\nDial-up number : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].DialUp));
printmsg("IP address : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].IPAddress));
if (settings->Settings[j].ManualLogin) {
printmsg("Login Type : Manual\n");
} else {
printmsg("Login Type : Automatic\n");
}
if (settings->Settings[j].IsNormalAuthentication) {
printmsg("Authentication type : Normal\n");
} else {
printmsg("Authentication type : Secure\n");
}
if (settings->Settings[j].IsISDNCall) {
printmsg("Data call type : ISDN\n");
} else {
printmsg("Data call type : Analogue\n");
}
switch (settings->Settings[j].Speed) {
case WAPSETTINGS_SPEED_9600 : printmsg("Data call speed : 9600\n"); break;
case WAPSETTINGS_SPEED_14400 : printmsg("Data call speed : 14400\n"); break;
case WAPSETTINGS_SPEED_AUTO : printmsg("Data call speed : Auto\n"); break;
}
printmsg("User name : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].User));
printmsg("Password : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Password));
break;
case WAPSETTINGS_BEARER_USSD:
printmsg("Bearer : USSD");
if (settings->ActiveBearer == WAPSETTINGS_BEARER_USSD) printf(" (active)");
printmsg("\nService code : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Code));
if (settings->Settings[j].IsIP) {
printmsg("Address type : IP address\nIPaddress : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Service));
} else {
printmsg("Address type : Service number\nService number : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Service));
}
break;
case WAPSETTINGS_BEARER_GPRS:
printmsg("Bearer : GPRS");
if (settings->ActiveBearer == WAPSETTINGS_BEARER_GPRS) printf(" (active)");
if (settings->Settings[j].ManualLogin) {
printmsg("\nLogin Type : Manual\n");
} else {
printmsg("\nLogin Type : Automatic\n");
}
if (settings->Settings[j].IsNormalAuthentication) {
printmsg("Authentication type : Normal\n");
} else {
printmsg("Authentication type : Secure\n");
}
printmsg("Access point : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].DialUp));
printmsg("IP address : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].IPAddress));
printmsg("User name : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].User));
printmsg("Password : \"%s\"\n",DecodeUnicodeConsole(settings->Settings[j].Password));
}
}
static void GetSyncMLSettings(int argc, char *argv[])
{
GSM_SyncMLSettings settings;
int start,stop,j;
GetStartStop(&start, &stop, 2, argc, argv);
GSM_Init(true);
for (i=start;i<=stop;i++) {
settings.Location=i;
error=Phone->GetSyncMLSettings(&s,&settings);
Print_Error(error);
printmsg("%i. ",i);
if (settings.Name[0]==0 && settings.Name[1]==0) {
printmsg("Set %i",i);
} else {
printmsg("%s",DecodeUnicodeConsole(settings.Name));
}
if (settings.Active) printmsg(" (active)");
// if (settings.ReadOnly) printmsg("\nRead only : yes");
printmsg("\n");
printmsg("User : \"%s\"\n",DecodeUnicodeConsole(settings.User));
printmsg("Password : \"%s\"\n",DecodeUnicodeConsole(settings.Password));
printmsg("Phonebook database : \"%s\"\n",DecodeUnicodeConsole(settings.PhonebookDataBase));
printmsg("Calendar database : \"%s\"\n",DecodeUnicodeConsole(settings.CalendarDataBase));
printmsg("Server : \"%s\"\n",DecodeUnicodeConsole(settings.Server));
printmsg("Sync. phonebook : ");
if (settings.SyncPhonebook) printmsg("yes\n");
if (!settings.SyncPhonebook) printmsg("no\n");
printmsg("Sync. calendar : ");
if (settings.SyncCalendar) printmsg("yes\n");
if (!settings.SyncCalendar) printmsg("no\n");
printmsg("\n");
for (j=0;j<settings.Connection.Number;j++) {
if (settings.Connection.Settings[j].Title[0]==0 && settings.Connection.Settings[j].Title[1]==0) {
printmsg("Connection set name : Set %i\n",i);
} else {
printmsg("Connection set name : %s\n",DecodeUnicodeConsole(settings.Connection.Settings[j].Title));
}
DisplayConnectionSettings(&settings.Connection,j);
printf("\n");
}
}
GSM_Terminate();
}
static void GetChatSettings(int argc, char *argv[])
{
GSM_ChatSettings settings;
int start,stop,j;
GetStartStop(&start, &stop, 2, argc, argv);
GSM_Init(true);
for (i=start;i<=stop;i++) {
settings.Location=i;
error=Phone->GetChatSettings(&s,&settings);
Print_Error(error);
printmsg("%i. ",i);
if (settings.Name[0]==0 && settings.Name[1]==0) {
printmsg("Set %i",i);
} else {
printmsg("%s",DecodeUnicodeConsole(settings.Name));
}
if (settings.Active) printmsg(" (active)");
// if (settings.ReadOnly) printmsg("\nRead only : yes");
printmsg("\n");
printmsg("Homepage : \"%s\"\n",DecodeUnicodeConsole(settings.HomePage));
printmsg("User : \"%s\"\n",DecodeUnicodeConsole(settings.User));
printmsg("Password : \"%s\"\n",DecodeUnicodeConsole(settings.Password));
printmsg("\n");
for (j=0;j<settings.Connection.Number;j++) {
if (settings.Connection.Settings[j].Title[0]==0 && settings.Connection.Settings[j].Title[1]==0) {
printmsg("Connection set name : Set %i\n",i);
} else {
printmsg("Connection set name : %s\n",DecodeUnicodeConsole(settings.Connection.Settings[j].Title));
}
DisplayConnectionSettings(&settings.Connection,j);
printf("\n");
}
}
GSM_Terminate();
}
static void GetWAPMMSSettings(int argc, char *argv[])
{
GSM_MultiWAPSettings settings;
int start,stop,j;
GetStartStop(&start, &stop, 2, argc, argv);
GSM_Init(true);
for (i=start;i<=stop;i++) {
settings.Location=i;
if (mystrncasecmp(argv[1],"--getwapsettings",0)) {
error=Phone->GetWAPSettings(&s,&settings);
} else {
error=Phone->GetMMSSettings(&s,&settings);
}
Print_Error(error);
for (j=0;j<settings.Number;j++) {
printmsg("%i. ",i);
if (settings.Settings[j].Title[0]==0 && settings.Settings[j].Title[1]==0) {
printmsg("Set %i",i);
} else {
printmsg("%s",DecodeUnicodeConsole(settings.Settings[j].Title));
}
if (settings.Active) printmsg(" (active)");
if (settings.ReadOnly) printmsg("\nRead only : yes");
printmsg("\nHomepage : \"%s\"\n",DecodeUnicodeConsole(settings.Settings[j].HomePage));
DisplayConnectionSettings(&settings,j);
printf("\n");
}
}
GSM_Terminate();
}
#ifdef GSM_ENABLE_BACKUP
static void BackupSMS(int argc, char *argv[])
{
GSM_SMS_Backup Backup;
GSM_MultiSMSMessage sms;
GSM_SMSFolders folders;
bool BackupFromFolder[GSM_MAX_SMS_FOLDERS];
bool start = true;
bool DeleteAfter;
int j, smsnum;
char buffer[200];
/* We ignore return code, because (when file doesn't exist) we
* will create new later
*/
GSM_ReadSMSBackupFile(argv[2], &Backup);
smsnum = 0;
while (Backup.SMS[smsnum]!=NULL) smsnum++;
GSM_Init(true);
error=Phone->GetSMSFolders(&s, &folders);
Print_Error(error);
DeleteAfter=answer_yes("Delete each sms after backup");
for (j=0;j<folders.Number;j++) {
BackupFromFolder[j] = false;
sprintf(buffer,"Backup sms from folder \"%s\"",DecodeUnicodeConsole(folders.Folder[j].Name));
if (answer_yes(buffer)) BackupFromFolder[j] = true;
}
while (error == ERR_NONE) {
sms.SMS[0].Folder=0x00;
error=Phone->GetNextSMS(&s, &sms, start);
switch (error) {
case ERR_EMPTY:
break;
default:
Print_Error(error);
for (j=0;j<sms.Number;j++) {
if (BackupFromFolder[sms.SMS[j].Folder-1]) {
switch (sms.SMS[j].PDU) {
case SMS_Status_Report:
break;
case SMS_Submit:
case SMS_Deliver:
if (sms.SMS[j].Length == 0) break;
if (smsnum < GSM_BACKUP_MAX_SMS) {
Backup.SMS[smsnum] = malloc(sizeof(GSM_SMSMessage));
if (Backup.SMS[smsnum] == NULL) Print_Error(ERR_MOREMEMORY);
Backup.SMS[smsnum+1] = NULL;
} else {
printmsg(" Increase %s\n" , "GSM_BACKUP_MAX_SMS");
GSM_Terminate();
exit(-1);
}
*Backup.SMS[smsnum] = sms.SMS[j];
smsnum++;
break;
}
}
}
}
start=false;
}
error = GSM_SaveSMSBackupFile(argv[2],&Backup);
Print_Error(error);
if (DeleteAfter) {
for (j=0;j<smsnum;j++) {
Backup.SMS[j]->Folder = 0;
error=Phone->DeleteSMS(&s, Backup.SMS[j]);
Print_Error(error);
printmsgerr("%cDeleting: %i percent",13,(j+1)*100/smsnum);
}
}
GSM_Terminate();
}
static void AddSMS(int argc, char *argv[])
{
GSM_MultiSMSMessage SMS;
GSM_SMS_Backup Backup;
int smsnum = 0;
int folder;
folder = atoi(argv[2]);
error = GSM_ReadSMSBackupFile(argv[3], &Backup);
Print_Error(error);
GSM_Init(true);
while (Backup.SMS[smsnum] != NULL) {
Backup.SMS[smsnum]->Folder = folder;
Backup.SMS[smsnum]->SMSC.Location = 1;
SMS.Number = 1;
SMS.SMS[0] = *Backup.SMS[smsnum];
displaymultismsinfo(SMS,false,false);
if (answer_yes("Restore sms")) {
error=Phone->AddSMS(&s, Backup.SMS[smsnum]);
Print_Error(error);
}
smsnum++;
}
GSM_Terminate();
}
static void RestoreSMS(int argc, char *argv[])
{
GSM_MultiSMSMessage SMS;
GSM_SMS_Backup Backup;
GSM_SMSFolders folders;
int smsnum = 0;
char buffer[200];
error=GSM_ReadSMSBackupFile(argv[2], &Backup);
Print_Error(error);
GSM_Init(true);
error=Phone->GetSMSFolders(&s, &folders);
Print_Error(error);
while (Backup.SMS[smsnum] != NULL) {
SMS.Number = 1;
memcpy(&SMS.SMS[0],Backup.SMS[smsnum],sizeof(GSM_SMSMessage));
displaymultismsinfo(SMS,false,false);
sprintf(buffer,"Restore sms to folder \"%s\"",DecodeUnicodeConsole(folders.Folder[Backup.SMS[smsnum]->Folder-1].Name));
if (answer_yes(buffer)) {
error=Phone->AddSMS(&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");
}
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 (mywstrstr(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 GetAllNotes(int argc, char *argv[])
{
GSM_NoteEntry Note;
bool start = true;
signal(SIGINT, interrupt);
printmsgerr("Press Ctrl+C to break...\n");
GSM_Init(true);
while (!gshutdown) {
error = Phone->GetNextNote(&s, &Note, start);
if (error == ERR_EMPTY) break;
Print_Error(error);
printmsg("Text : \"%s\"\n",DecodeUnicodeConsole(Note.Text));
printf("\n");
start = 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[];
extern unsigned char *GSM_Countries[];
int i=0;
char country[4]="";
if (argc>2) {
while (GSM_Countries[i*2]!=NULL) {
if (!strncmp(GSM_Countries[i*2+1],argv[2],strlen(argv[2]))) {
strcpy(country,GSM_Countries[i*2]);
printmsg("Networks for %s:\n\n",GSM_Countries[i*2+1]);
break;
}
i++;
}
if (!*country) {
printmsg("Unknown country name.");
exit(-1);
}
}
printmsg("Network Name\n");
i=0;
while (GSM_Networks[i*2]!=NULL) {
if (argc>2) {
if (!strncmp(GSM_Networks[i*2],country,strlen(country))) {
printmsg("%s %s\n", GSM_Networks[i*2], GSM_Networks[i*2+1]);
}
} else {
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",VERSION,__TIME__,__DATE__);
if (strlen(GetCompiler()) != 0) printmsg(" in %s",GetCompiler());
printmsg("]\n\n");
#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));
} 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");
}
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"},
{"6610", "Gallery", "", "2"},
{"7210", "Gallery", "", "2"},
{"", "Tones", "Tones", "3"},
{"3510i","Tones", "", "4"},
{"5100", "Tones", "", "4"},
{"6220", "Tones", "", "6"},
{"6610", "Tones", "", "4"},
{"7210", "Tones", "", "4"},
/* 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);