Diffstat (limited to 'gammu/emb/common/service/backup') (more/less context) (show whitespace changes)
-rw-r--r-- | gammu/emb/common/service/backup/backgen.h | 4 | ||||
-rw-r--r-- | gammu/emb/common/service/backup/backtext.c | 221 | ||||
-rw-r--r-- | gammu/emb/common/service/backup/gsmback.c | 36 | ||||
-rw-r--r-- | gammu/emb/common/service/backup/gsmback.h | 2 |
4 files changed, 244 insertions, 19 deletions
diff --git a/gammu/emb/common/service/backup/backgen.h b/gammu/emb/common/service/backup/backgen.h index 9d7d973..9a930fc 100644 --- a/gammu/emb/common/service/backup/backgen.h +++ b/gammu/emb/common/service/backup/backgen.h @@ -1,69 +1,73 @@ /* (c) 2002-2004 by Marcin Wiacek */ #ifndef __gsm_backgen_h #define __gsm_backgen_h #include "../../config.h" #include "../../misc/misc.h" #include "../gsmpbk.h" #include "../gsmcal.h" #include "../gsmlogo.h" #include "../gsmring.h" #include "../gsmdata.h" #include "../gsmprof.h" #include "../gsmmisc.h" #include "../sms/gsmsms.h" #define GSM_BACKUP_MAX_PHONEPHONEBOOK 501 #define GSM_BACKUP_MAX_SIMPHONEBOOK 251 #define GSM_BACKUP_MAX_CALLER 6 #define GSM_BACKUP_MAX_SMSC 10 #define GSM_BACKUP_MAX_WAPBOOKMARK 40 #define GSM_BACKUP_MAX_WAPSETTINGS 30 #define GSM_BACKUP_MAX_MMSSETTINGS 30 +#define GSM_BACKUP_MAX_SYNCMLSETTINGS 10 +#define GSM_BACKUP_MAX_CHATSETTINGS 10 #define GSM_BACKUP_MAX_RINGTONES 30 #define GSM_BACKUP_MAX_PROFILES 10 #define GSM_BACKUP_MAX_FMSTATIONS 20 #define GSM_BACKUP_MAX_GPRSPOINT 10 #define GSM_BACKUP_MAX_NOTE 10 /* FIXME */ typedef struct { char IMEI [MAX_IMEI_LENGTH]; char Model [MAX_MODEL_LENGTH+MAX_VERSION_LENGTH]; char Creator [80]; GSM_DateTime DateTime; bool DateTimeAvailable; char MD5Original [100]; char MD5Calculated [100]; GSM_MemoryEntry *PhonePhonebook [GSM_BACKUP_MAX_PHONEPHONEBOOK + 1]; GSM_MemoryEntry *SIMPhonebook [GSM_BACKUP_MAX_SIMPHONEBOOK + 1]; GSM_CalendarEntry *Calendar [GSM_MAXCALENDARTODONOTES + 1]; GSM_Bitmap *CallerLogos [GSM_BACKUP_MAX_CALLER + 1]; GSM_SMSC *SMSC [GSM_BACKUP_MAX_SMSC + 1]; GSM_WAPBookmark *WAPBookmark [GSM_BACKUP_MAX_WAPBOOKMARK + 1]; GSM_MultiWAPSettings *WAPSettings [GSM_BACKUP_MAX_WAPSETTINGS + 1]; GSM_MultiWAPSettings *MMSSettings [GSM_BACKUP_MAX_MMSSETTINGS + 1]; + GSM_SyncMLSettings *SyncMLSettings [GSM_BACKUP_MAX_SYNCMLSETTINGS + 1]; + GSM_ChatSettings *ChatSettings [GSM_BACKUP_MAX_CHATSETTINGS + 1]; GSM_Ringtone *Ringtone [GSM_BACKUP_MAX_RINGTONES + 1]; GSM_ToDoEntry *ToDo [GSM_MAXCALENDARTODONOTES + 1]; GSM_Profile *Profiles [GSM_BACKUP_MAX_PROFILES + 1]; GSM_FMStation *FMStation [GSM_BACKUP_MAX_FMSTATIONS +1]; GSM_GPRSAccessPoint *GPRSPoint [GSM_BACKUP_MAX_GPRSPOINT + 1]; GSM_NoteEntry *Note [GSM_BACKUP_MAX_NOTE + 1]; GSM_Bitmap *StartupLogo; GSM_Bitmap *OperatorLogo; } GSM_Backup; #define GSM_BACKUP_MAX_SMS 500 typedef struct { GSM_SMSMessage *SMS[GSM_BACKUP_MAX_SMS]; } GSM_SMS_Backup; extern GSM_Error GSM_ReadSMSBackupFile(char *FileName, GSM_SMS_Backup *backup); extern GSM_Error GSM_SaveSMSBackupFile(char *FileName, GSM_SMS_Backup *backup); #endif /* How should editor hadle tabs in this file? Add editor commands here. * vim: noexpandtab sw=8 ts=8 sts=8: */ diff --git a/gammu/emb/common/service/backup/backtext.c b/gammu/emb/common/service/backup/backtext.c index fee0f73..4cb1bb7 100644 --- a/gammu/emb/common/service/backup/backtext.c +++ b/gammu/emb/common/service/backup/backtext.c @@ -1,1304 +1,1380 @@ /* (c) 2002-2004 by Marcin Wiacek, Walek and Michal Cihar */ #include <string.h> #include <ctype.h> #include "../../phone/nokia/nfunc.h" #include "../../phone/nokia/dct3/n7110.h" #include "../../misc/cfg.h" #include "../../misc/coding/coding.h" #include "../../misc/coding/md5.h" #include "../gsmlogo.h" #include "../gsmmisc.h" #include "backtext.h" #ifdef GSM_ENABLE_BACKUP GSM_Error FindBackupChecksum(char *FileName, bool UseUnicode, char *checksum) { INI_Section *file_info, *h; INI_Entry *e; char *buffer = NULL,buff[100]; int len=0; //int i; file_info = INI_ReadFile(FileName, UseUnicode); if (UseUnicode) { for (h = file_info; h != NULL; h = h->Next) { EncodeUnicode(buff,"Checksum",8); if (mywstrncasecmp(buff, h->SectionName, 8)) continue; buffer = (unsigned char *)realloc(buffer,len+UnicodeLength(h->SectionName)*2+2); CopyUnicodeString(buffer+len,h->SectionName); len+=UnicodeLength(h->SectionName)*2; // dbgprintf("[%s]\n",DecodeUnicodeConsole(h->SectionName)); for (e = h->SubEntries; e != NULL; e = e->Next) { buffer = (unsigned char *)realloc(buffer,len+UnicodeLength(e->EntryName)*2+2); CopyUnicodeString(buffer+len,e->EntryName); len+=UnicodeLength(e->EntryName)*2; buffer = (unsigned char *)realloc(buffer,len+UnicodeLength(e->EntryValue)*2+2); CopyUnicodeString(buffer+len,e->EntryValue); len+=UnicodeLength(e->EntryValue)*2; // dbgprintf("\"%s\"",DecodeUnicodeConsole(e->EntryName)); // dbgprintf("=\"%s\"\n",DecodeUnicodeConsole(e->EntryValue)); } } } else { for (h = file_info; h != NULL; h = h->Next) { if (mystrncasecmp("Checksum", h->SectionName, 8)) continue; buffer = (unsigned char *)realloc(buffer,len+strlen(h->SectionName)+1); strcpy(buffer+len,h->SectionName); len+=strlen(h->SectionName); for (e = h->SubEntries; e != NULL; e = e->Next) { // dbgprintf("%s=%s\n",e->EntryName,e->EntryValue); buffer = (unsigned char *)realloc(buffer,len+strlen(e->EntryName)+1); strcpy(buffer+len,e->EntryName); len+=strlen(e->EntryName); buffer = (unsigned char *)realloc(buffer,len+strlen(e->EntryValue)+1); strcpy(buffer+len,e->EntryValue); len+=strlen(e->EntryValue); } } } //for (i=0;i<len;i++) printf("%02x",buffer[i]); CalculateMD5(buffer, len, checksum); free(buffer); return ERR_NONE; } static unsigned char *ReadCFGText(INI_Section *cfg, unsigned char *section, unsigned char *key, bool Unicode) { unsigned char Buffer[500],Buffer2[500],*retval; if (Unicode) { EncodeUnicode(Buffer2,key,strlen(key)); retval = INI_GetValue(cfg,section,Buffer2,Unicode); if (retval != NULL) return DecodeUnicodeString(retval); return NULL; } else { strcpy(Buffer,section); strcpy(Buffer2,key); return INI_GetValue(cfg,section,key,Unicode); } } static void SaveLinkedBackupText(FILE *file, char *myname, char *myvalue, bool UseUnicode) { int w,current; unsigned char buffer2[1000],buffer3[1000]; current = strlen(myvalue); w = 0; while (true) { if (current > 200) { memcpy(buffer2,myvalue+(strlen(myvalue)-current),200); buffer2[200] = 0; current = current - 200; } else { memcpy(buffer2,myvalue+(strlen(myvalue)-current),current); buffer2[current] = 0; current = 0; } if (UseUnicode) { sprintf(buffer3,"%s%02i = %s%c%c",myname,w,buffer2,13,10); EncodeUnicode(buffer2,buffer3,strlen(buffer3)); fwrite(buffer2,1,strlen(buffer3)*2,file); } else { fprintf(file,"%s%02i = %s%c%c",myname,w,buffer2,13,10); } if (current == 0) break; w++; } } static void ReadLinkedBackupText(INI_Section *file_info, char *section, char *myname, char *myvalue, bool UseUnicode) { unsigned char buffer2[300]; char *readvalue; int i; i=0; myvalue[0] = 0; while (true) { sprintf(buffer2,"%s%02i",myname,i); readvalue = ReadCFGText(file_info, section, buffer2, UseUnicode); if (readvalue!=NULL) { myvalue[strlen(myvalue)+strlen(readvalue)]=0; memcpy(myvalue+strlen(myvalue),readvalue,strlen(readvalue)); } else break; i++; } } static void SaveBackupText(FILE *file, char *myname, char *myvalue, bool UseUnicode) { unsigned char buffer[10000], buffer2[10000]; if (myname[0] == 0x00) { if (UseUnicode) { EncodeUnicode(buffer,myvalue,strlen(myvalue)); fwrite(buffer,1,strlen(myvalue)*2,file); } else fprintf(file,"%s",myvalue); } else { if (UseUnicode) { sprintf(buffer,"%s = \"",myname); EncodeUnicode(buffer2,buffer,strlen(buffer)); fwrite(buffer2,1,strlen(buffer)*2,file); - fwrite(myvalue,1,UnicodeLength(myvalue)*2,file); + fwrite(EncodeUnicodeSpecialChars(myvalue),1,UnicodeLength(EncodeUnicodeSpecialChars(myvalue))*2,file); sprintf(buffer,"\"%c%c",13,10); EncodeUnicode(buffer2,buffer,strlen(buffer)); fwrite(buffer2,1,strlen(buffer)*2,file); } else { - sprintf(buffer,"%s = \"%s\"%c%c",myname,DecodeUnicodeString(myvalue),13,10); + sprintf(buffer,"%s = \"%s\"%c%c",myname,EncodeSpecialChars(DecodeUnicodeString(myvalue)),13,10); fprintf(file,"%s",buffer); EncodeHexBin(buffer,myvalue,UnicodeLength(myvalue)*2); fprintf(file,"%sUnicode = %s%c%c",myname,buffer,13,10); } } } static bool ReadBackupText(INI_Section *file_info, char *section, char *myname, char *myvalue, bool UseUnicode) { unsigned char paramname[10000],*readvalue; if (UseUnicode) { EncodeUnicode(paramname,myname,strlen(myname)); readvalue = INI_GetValue(file_info, section, paramname, UseUnicode); if (readvalue!=NULL) { - CopyUnicodeString(myvalue,readvalue+2); - myvalue[UnicodeLength(readvalue)*2-4]=0; - myvalue[UnicodeLength(readvalue)*2-3]=0; + CopyUnicodeString(myvalue,DecodeUnicodeSpecialChars(readvalue+2)); + myvalue[UnicodeLength(myvalue)*2-2]=0; + myvalue[UnicodeLength(myvalue)*2-1]=0; + dbgprintf("%s\n",DecodeUnicodeString(readvalue)); } else { myvalue[0]=0; myvalue[1]=0; return false; } } else { strcpy(paramname,myname); strcat(paramname,"Unicode"); readvalue = ReadCFGText(file_info, section, paramname, UseUnicode); if (readvalue!=NULL) { dbgprintf("%s %i\n",readvalue,strlen(readvalue)); DecodeHexBin (myvalue, readvalue, strlen(readvalue)); myvalue[strlen(readvalue)/2]=0; myvalue[strlen(readvalue)/2+1]=0; dbgprintf("%s\n",DecodeUnicodeString(myvalue)); } else { strcpy(paramname,myname); readvalue = ReadCFGText(file_info, section, paramname, UseUnicode); if (readvalue!=NULL) { - EncodeUnicode(myvalue,readvalue+1,strlen(readvalue)-2); + EncodeUnicode(myvalue,DecodeSpecialChars(readvalue+1),strlen(DecodeSpecialChars(readvalue+1))-1); } else { myvalue[0]=0; myvalue[1]=0; return false; } } } return true; } static void SaveVCalDateTime(FILE *file, GSM_DateTime *dt, bool UseUnicode) { unsigned char buffer[100]; int Length = 3; sprintf(buffer, " = "); SaveVCALDateTime(buffer, &Length, dt, NULL); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveVCalDate(FILE *file, GSM_DateTime *dt, bool UseUnicode) { unsigned char buffer[100]; sprintf(buffer, " = %04d%02d%02d%c%c", dt->Year, dt->Month, dt->Day,13,10); SaveBackupText(file, "", buffer, UseUnicode); } /* ---------------------- backup files ------------------------------------- */ static void SavePbkEntry(FILE *file, GSM_MemoryEntry *Pbk, bool UseUnicode) { bool text; char buffer[1000]; int j, i; sprintf(buffer,"Location = %03i%c%c",Pbk->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); for (j=0;j<Pbk->EntriesNum;j++) { text = true; switch (Pbk->Entries[j].EntryType) { case PBK_Number_General: sprintf(buffer,"Entry%02iType = NumberGeneral%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Number_Mobile: sprintf(buffer,"Entry%02iType = NumberMobile%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Number_Work: sprintf(buffer,"Entry%02iType = NumberWork%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Number_Fax: sprintf(buffer,"Entry%02iType = NumberFax%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Number_Home: sprintf(buffer,"Entry%02iType = NumberHome%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Number_Pager: sprintf(buffer,"Entry%02iType = NumberPager%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Number_Other: sprintf(buffer,"Entry%02iType = NumberOther%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Note: sprintf(buffer,"Entry%02iType = Note%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Postal: sprintf(buffer,"Entry%02iType = Postal%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Email: sprintf(buffer,"Entry%02iType = Email%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Email2: sprintf(buffer,"Entry%02iType = Email2%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_URL: sprintf(buffer,"Entry%02iType = URL%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Name: sprintf(buffer,"Entry%02iType = Name%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Caller_Group: sprintf(buffer,"Entry%02iType = CallerGroup%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); text = false; break; case PBK_RingtoneID: sprintf(buffer,"Entry%02iType = RingtoneID%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); text = false; break; case PBK_PictureID: sprintf(buffer,"Entry%02iType = PictureID%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); text = false; break; case PBK_Text_UserID: sprintf(buffer,"Entry%02iType = UserID%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Category: sprintf(buffer,"Entry%02iType = Category%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); text = false; break; case PBK_Private: sprintf(buffer,"Entry%02iType = Private%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); text = false; break; case PBK_Text_LastName: sprintf(buffer,"Entry%02iType = LastName%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_FirstName: sprintf(buffer,"Entry%02iType = FirstName%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Company: sprintf(buffer,"Entry%02iType = Company%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_JobTitle: sprintf(buffer,"Entry%02iType = JobTitle%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_StreetAddress: sprintf(buffer,"Entry%02iType = Address%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_City: sprintf(buffer,"Entry%02iType = City%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_State: sprintf(buffer,"Entry%02iType = State%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Zip: sprintf(buffer,"Entry%02iType = Zip%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Country: sprintf(buffer,"Entry%02iType = Country%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Custom1: sprintf(buffer,"Entry%02iType = Custom1%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Custom2: sprintf(buffer,"Entry%02iType = Custom2%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Custom3: sprintf(buffer,"Entry%02iType = Custom3%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_Text_Custom4: sprintf(buffer,"Entry%02iType = Custom4%c%c",j,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case PBK_SMSListID: case PBK_RingtoneFileSystemID: case PBK_Date: break; } if (text) { sprintf(buffer,"Entry%02iText",j); SaveBackupText(file,buffer,Pbk->Entries[j].Text, UseUnicode); } switch (Pbk->Entries[j].EntryType) { case PBK_Number_General: case PBK_Number_Mobile: case PBK_Number_Work: case PBK_Number_Fax: case PBK_Number_Home: case PBK_Number_Other: case PBK_Number_Pager: if (Pbk->Entries[j].VoiceTag!=0) { sprintf(buffer,"Entry%02iVoiceTag = %i%c%c",j,Pbk->Entries[j].VoiceTag,13,10); SaveBackupText(file, "", buffer, UseUnicode); } i = 0; while (Pbk->Entries[j].SMSList[i]!=0) { sprintf(buffer,"Entry%02iSMSList%02i = %i%c%c",j,i,Pbk->Entries[j].SMSList[i],13,10); SaveBackupText(file, "", buffer, UseUnicode); i++; } break; default: break; } } sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } +static void SaveNoteEntry(FILE *file, GSM_NoteEntry *Note, bool UseUnicode) +{ + char buffer[1000]; + + sprintf(buffer,"Location = %d%c%c", Note->Location,13,10); + SaveBackupText(file, "", buffer, UseUnicode); + SaveBackupText(file, "Text", Note->Text, UseUnicode); + sprintf(buffer, "%c%c",13,10); + SaveBackupText(file, "", buffer, UseUnicode); +} + static void SaveCalendarEntry(FILE *file, GSM_CalendarEntry *Note, bool UseUnicode) { int i; char buffer[1000]; sprintf(buffer,"Location = %d%c%c", Note->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveBackupText(file, "", "Type = ", UseUnicode); switch (Note->Type) { case GSM_CAL_REMINDER : sprintf(buffer,"Reminder%c%c", 13,10); break; case GSM_CAL_CALL : sprintf(buffer,"Call%c%c", 13,10); break; case GSM_CAL_MEETING : sprintf(buffer,"Meeting%c%c", 13,10); break; case GSM_CAL_BIRTHDAY : sprintf(buffer,"Birthday%c%c", 13,10); break; case GSM_CAL_TRAVEL : sprintf(buffer,"Travel%c%c", 13,10); break; case GSM_CAL_VACATION : sprintf(buffer,"Vacation%c%c", 13,10); break; case GSM_CAL_MEMO : sprintf(buffer,"Memo%c%c", 13,10); break; case GSM_CAL_ALARM : sprintf(buffer,"Alarm%c%c", 13,10); break; case GSM_CAL_DAILY_ALARM : sprintf(buffer,"DailyAlarm%c%c", 13,10); break; case GSM_CAL_T_ATHL : sprintf(buffer,"Training/Athletism%c%c", 13,10); break; case GSM_CAL_T_BALL : sprintf(buffer,"Training/BallGames%c%c", 13,10); break; case GSM_CAL_T_CYCL : sprintf(buffer,"Training/Cycling%c%c", 13,10); break; case GSM_CAL_T_BUDO : sprintf(buffer,"Training/Budo%c%c", 13,10); break; case GSM_CAL_T_DANC : sprintf(buffer,"Training/Dance%c%c", 13,10); break; case GSM_CAL_T_EXTR : sprintf(buffer,"Training/ExtremeSports%c%c", 13,10); break; case GSM_CAL_T_FOOT : sprintf(buffer,"Training/Football%c%c", 13,10); break; case GSM_CAL_T_GOLF : sprintf(buffer,"Training/Golf%c%c", 13,10); break; case GSM_CAL_T_GYM : sprintf(buffer,"Training/Gym%c%c", 13,10); break; case GSM_CAL_T_HORS : sprintf(buffer,"Training/HorseRaces%c%c", 13,10); break; case GSM_CAL_T_HOCK : sprintf(buffer,"Training/Hockey%c%c", 13,10); break; case GSM_CAL_T_RACE : sprintf(buffer,"Training/Races%c%c", 13,10); break; case GSM_CAL_T_RUGB : sprintf(buffer,"Training/Rugby%c%c", 13,10); break; case GSM_CAL_T_SAIL : sprintf(buffer,"Training/Sailing%c%c", 13,10); break; case GSM_CAL_T_STRE : sprintf(buffer,"Training/StreetGames%c%c", 13,10); break; case GSM_CAL_T_SWIM : sprintf(buffer,"Training/Swimming%c%c", 13,10); break; case GSM_CAL_T_TENN : sprintf(buffer,"Training/Tennis%c%c", 13,10); break; case GSM_CAL_T_TRAV : sprintf(buffer,"Training/Travels%c%c", 13,10); break; case GSM_CAL_T_WINT : sprintf(buffer,"Training/WinterGames%c%c", 13,10); break; } SaveBackupText(file, "", buffer, UseUnicode); for (i=0;i<Note->EntriesNum;i++) { switch (Note->Entries[i].EntryType) { case CAL_START_DATETIME: SaveBackupText(file, "", "StartTime", UseUnicode); SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode); break; case CAL_END_DATETIME: SaveBackupText(file, "", "StopTime", UseUnicode); SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode); break; case CAL_ALARM_DATETIME: SaveBackupText(file, "", "Alarm", UseUnicode); SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode); sprintf(buffer,"AlarmType = Tone%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_SILENT_ALARM_DATETIME: SaveBackupText(file, "", "Alarm", UseUnicode); SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode); sprintf(buffer,"AlarmType = Silent%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_PRIVATE: sprintf(buffer, "Private = %d%c%c",Note->Entries[i].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_LOCATION: SaveBackupText(file, "EventLocation", Note->Entries[i].Text, UseUnicode); break; case CAL_CONTACTID: sprintf(buffer, "ContactID = %d%c%c",Note->Entries[i].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_RECURRANCE: sprintf(buffer, "Recurrance = %d%c%c",Note->Entries[i].Number/24,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_TEXT: SaveBackupText(file, "Text", Note->Entries[i].Text, UseUnicode); break; case CAL_PHONE: SaveBackupText(file, "Phone", Note->Entries[i].Text, UseUnicode); break; case CAL_REPEAT_STOPDATE: SaveBackupText(file, "", "RepeatStopDate", UseUnicode); SaveVCalDate(file, &Note->Entries[i].Date, UseUnicode); break; case CAL_REPEAT_STARTDATE: SaveBackupText(file, "", "RepeatStartDate", UseUnicode); SaveVCalDate(file, &Note->Entries[i].Date, UseUnicode); break; case CAL_REPEAT_DAYOFWEEK: sprintf(buffer, "RepeatDayOfWeek = %d%c%c",Note->Entries[i].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_REPEAT_DAY: sprintf(buffer, "RepeatDay = %d%c%c",Note->Entries[i].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_REPEAT_WEEKOFMONTH: sprintf(buffer, "RepeatWeekOfMonth = %d%c%c",Note->Entries[i].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_REPEAT_MONTH: sprintf(buffer, "RepeatMonth = %d%c%c",Note->Entries[i].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case CAL_REPEAT_FREQUENCY: sprintf(buffer, "RepeatFrequency = %d%c%c",Note->Entries[i].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; } } sprintf(buffer, "%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveWAPSettingsEntry(FILE *file, GSM_MultiWAPSettings *settings, bool UseUnicode) { int i; char buffer[10000]; if (settings->Active) { sprintf(buffer,"Active = Yes%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } switch (settings->ActiveBearer) { case WAPSETTINGS_BEARER_SMS : sprintf(buffer,"Bearer = SMS%c%c",13,10); break; case WAPSETTINGS_BEARER_GPRS: sprintf(buffer,"Bearer = GPRS%c%c",13,10); break; case WAPSETTINGS_BEARER_DATA: sprintf(buffer,"Bearer = Data%c%c",13,10); break; case WAPSETTINGS_BEARER_USSD: sprintf(buffer,"Bearer = USSD%c%c",13,10); } SaveBackupText(file, "", buffer, UseUnicode); if (settings->ReadOnly) { sprintf(buffer,"ReadOnly = Yes%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } sprintf(buffer,"Proxy"); SaveBackupText(file, buffer, settings->Proxy, UseUnicode); sprintf(buffer,"ProxyPort = %i%c%c",settings->ProxyPort,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Proxy2"); SaveBackupText(file, buffer, settings->Proxy2, UseUnicode); sprintf(buffer,"Proxy2Port = %i%c%c",settings->Proxy2Port,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); for (i=0;i<settings->Number;i++) { sprintf(buffer,"Title%02i",i); SaveBackupText(file, buffer, settings->Settings[i].Title, UseUnicode); sprintf(buffer,"HomePage%02i",i); SaveBackupText(file, buffer, settings->Settings[i].HomePage, UseUnicode); if (settings->Settings[i].IsContinuous) { sprintf(buffer,"Type%02i = Continuous%c%c",i,13,10); } else { sprintf(buffer,"Type%02i = Temporary%c%c",i,13,10); } SaveBackupText(file, "", buffer, UseUnicode); if (settings->Settings[i].IsSecurity) { sprintf(buffer,"Security%02i = On%c%c",i,13,10); } else { sprintf(buffer,"Security%02i = Off%c%c",i,13,10); } SaveBackupText(file, "", buffer, UseUnicode); switch (settings->Settings[i].Bearer) { case WAPSETTINGS_BEARER_SMS: sprintf(buffer,"Bearer%02i = SMS%c%c",i,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Server%02i",i); SaveBackupText(file, buffer, settings->Settings[i].Server, UseUnicode); sprintf(buffer,"Service%02i",i); SaveBackupText(file, buffer, settings->Settings[i].Service, UseUnicode); break; case WAPSETTINGS_BEARER_GPRS: sprintf(buffer,"Bearer%02i = GPRS%c%c",i,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"IP%02i",i); SaveBackupText(file, buffer, settings->Settings[i].IPAddress, UseUnicode); case WAPSETTINGS_BEARER_DATA: if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_DATA) { sprintf(buffer,"Bearer%02i = Data%c%c",i,13,10); SaveBackupText(file, "", buffer, UseUnicode); if (settings->Settings[i].IsISDNCall) { sprintf(buffer,"CallType%02i = ISDN%c%c",i,13,10); } else { sprintf(buffer,"CallType%02i = Analogue%c%c",i,13,10); } SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"IP%02i",i); SaveBackupText(file, buffer, settings->Settings[i].IPAddress, UseUnicode); } sprintf(buffer,"Number%02i",i); SaveBackupText(file, buffer, settings->Settings[i].DialUp, UseUnicode); if (settings->Settings[i].ManualLogin) { sprintf(buffer,"Login%02i = Manual%c%c",i,13,10); } else { sprintf(buffer,"Login%02i = Automatic%c%c",i,13,10); } SaveBackupText(file, "", buffer, UseUnicode); if (settings->Settings[i].IsNormalAuthentication) { sprintf(buffer,"Authentication%02i = Normal%c%c",i,13,10); } else { sprintf(buffer,"Authentication%02i = Secure%c%c",i,13,10); } SaveBackupText(file, "", buffer, UseUnicode); switch (settings->Settings[i].Speed) { case WAPSETTINGS_SPEED_9600 : sprintf(buffer,"CallSpeed%02i = 9600%c%c" ,i,13,10); break; case WAPSETTINGS_SPEED_14400: sprintf(buffer,"CallSpeed%02i = 14400%c%c",i,13,10); break; case WAPSETTINGS_SPEED_AUTO : sprintf(buffer,"CallSpeed%02i = auto%c%c" ,i,13,10); break; } switch (settings->Settings[i].Speed) { case WAPSETTINGS_SPEED_9600 : case WAPSETTINGS_SPEED_14400: case WAPSETTINGS_SPEED_AUTO : SaveBackupText(file, "", buffer, UseUnicode); default: break; } sprintf(buffer,"User%02i",i); SaveBackupText(file, buffer, settings->Settings[i].User, UseUnicode); sprintf(buffer,"Password%02i",i); SaveBackupText(file, buffer, settings->Settings[i].Password, UseUnicode); break; case WAPSETTINGS_BEARER_USSD: sprintf(buffer,"Bearer%02i = USSD%c%c",i,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"ServiceCode%02i",i); SaveBackupText(file, buffer, settings->Settings[i].Code, UseUnicode); if (settings->Settings[i].IsIP) { sprintf(buffer,"IP%02i",i); } else { sprintf(buffer,"Number%02i",i); } SaveBackupText(file, buffer, settings->Settings[i].Service, UseUnicode); } sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } } +static void SaveChatSettingsEntry(FILE *file, GSM_ChatSettings *settings, bool UseUnicode) +{ + char buffer[10000]; + + sprintf(buffer,"HomePage"); + SaveBackupText(file, buffer, settings->HomePage, UseUnicode); + sprintf(buffer,"User"); + SaveBackupText(file, buffer, settings->User, UseUnicode); + sprintf(buffer,"Password"); + SaveBackupText(file, buffer, settings->Password, UseUnicode); + SaveWAPSettingsEntry(file, &settings->Connection, UseUnicode); +} + +static void SaveSyncMLSettingsEntry(FILE *file, GSM_SyncMLSettings *settings, bool UseUnicode) +{ + char buffer[10000]; + + sprintf(buffer,"User"); + SaveBackupText(file, buffer, settings->User, UseUnicode); + sprintf(buffer,"Password"); + SaveBackupText(file, buffer, settings->Password, UseUnicode); + sprintf(buffer,"PhonebookDB"); + SaveBackupText(file, buffer, settings->PhonebookDataBase, UseUnicode); + sprintf(buffer,"CalendarDB"); + SaveBackupText(file, buffer, settings->CalendarDataBase, UseUnicode); + sprintf(buffer,"Server"); + SaveBackupText(file, buffer, settings->Server, UseUnicode); + if (settings->SyncPhonebook) { + sprintf(buffer,"SyncPhonebook = True%c%c",13,10); + } else { + sprintf(buffer,"SyncPhonebook = False%c%c",13,10); + } + SaveBackupText(file, "", buffer, UseUnicode); + if (settings->SyncCalendar) { + sprintf(buffer,"SyncCalendar = True%c%c",13,10); + } else { + sprintf(buffer,"SyncCalendar = False%c%c",13,10); + } + SaveBackupText(file, "", buffer, UseUnicode); + SaveWAPSettingsEntry(file, &settings->Connection, UseUnicode); +} + static void SaveBitmapEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode) { unsigned char buffer[10000],buffer2[10000]; int x,y; sprintf(buffer,"Width = %i%c%c",bitmap->BitmapWidth,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Height = %i%c%c",bitmap->BitmapHeight,13,10); SaveBackupText(file, "", buffer, UseUnicode); for (y=0;y<bitmap->BitmapHeight;y++) { for (x=0;x<bitmap->BitmapWidth;x++) { buffer[x] = ' '; if (GSM_IsPointBitmap(bitmap,x,y)) buffer[x]='#'; } buffer[bitmap->BitmapWidth] = 0; sprintf(buffer2,"Bitmap%02i = \"%s\"%c%c",y,buffer,13,10); SaveBackupText(file, "", buffer2, UseUnicode); } } static void SaveCallerEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode) { unsigned char buffer[1000]; sprintf(buffer,"Location = %03i%c%c",bitmap->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); if (!bitmap->DefaultName) SaveBackupText(file, "Name", bitmap->Text, UseUnicode); if (!bitmap->DefaultRingtone) { if (bitmap->FileSystemRingtone) { sprintf(buffer,"FileRingtone = %02x%c%c",bitmap->RingtoneID,13,10); } else { sprintf(buffer,"Ringtone = %02x%c%c",bitmap->RingtoneID,13,10); } SaveBackupText(file, "", buffer, UseUnicode); } if (bitmap->BitmapEnabled) { sprintf(buffer,"Enabled = True%c%c",13,10); } else { sprintf(buffer,"Enabled = False%c%c",13,10); } SaveBackupText(file, "", buffer, UseUnicode); if (!bitmap->DefaultBitmap) SaveBitmapEntry(file, bitmap, UseUnicode); sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveWAPBookmarkEntry(FILE *file, GSM_WAPBookmark *bookmark, bool UseUnicode) { unsigned char buffer[1000]; SaveBackupText(file, "URL", bookmark->Address, UseUnicode); SaveBackupText(file, "Title", bookmark->Title, UseUnicode); sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveStartupEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode) { unsigned char buffer[1000]; sprintf(buffer,"[Startup]%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); if (bitmap->Type == GSM_WelcomeNote_Text) { SaveBackupText(file, "Text", bitmap->Text, UseUnicode); } if (bitmap->Type == GSM_StartupLogo) { SaveBitmapEntry(file, bitmap, UseUnicode); } sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveSMSCEntry(FILE *file, GSM_SMSC *SMSC, bool UseUnicode) { unsigned char buffer[1000]; sprintf(buffer,"Location = %03i%c%c",SMSC->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveBackupText(file, "Name", SMSC->Name, UseUnicode); SaveBackupText(file, "Number", SMSC->Number, UseUnicode); SaveBackupText(file, "DefaultNumber", SMSC->DefaultNumber, UseUnicode); SaveBackupText(file, "", "Format = ", UseUnicode); switch (SMSC->Format) { case SMS_FORMAT_Text : sprintf(buffer,"Text"); break; case SMS_FORMAT_Fax : sprintf(buffer,"Fax"); break; case SMS_FORMAT_Email : sprintf(buffer,"Email"); break; case SMS_FORMAT_Pager : sprintf(buffer,"Pager"); break; } SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"%c%cValidity = ",13,10); SaveBackupText(file, "", buffer, UseUnicode); switch (SMSC->Validity.Relative) { case SMS_VALID_1_Hour : sprintf(buffer, "1hour" ); break; case SMS_VALID_6_Hours : sprintf(buffer, "6hours" ); break; case SMS_VALID_1_Day : sprintf(buffer, "24hours" ); break; case SMS_VALID_3_Days : sprintf(buffer, "72hours" ); break; case SMS_VALID_1_Week : sprintf(buffer, "1week" ); break; case SMS_VALID_Max_Time : default : sprintf(buffer,"MaximumTime" ); break; } SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"%c%c%c%c",13,10,13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveRingtoneEntry(FILE *file, GSM_Ringtone *ringtone, bool UseUnicode) { unsigned char buffer[45000]; - int i,j; sprintf(buffer,"Location = %i%c%c",ringtone->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveBackupText(file, "Name", ringtone->Name, UseUnicode); switch (ringtone->Format) { case RING_NOKIABINARY: - j = 0; i = 0; EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length); SaveLinkedBackupText(file, "NokiaBinary", buffer, UseUnicode); break; case RING_MIDI: - j = 0; i = 0; EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length); SaveLinkedBackupText(file, "Pure Midi", buffer, UseUnicode); break; + case RING_MMF: + EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length); + SaveLinkedBackupText(file, "SMAF", buffer, UseUnicode); + break; case RING_NOTETONE: break; } sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveOperatorEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode) { unsigned char buffer[1000]; sprintf(buffer,"[Operator]%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Network = \"%s\"%c%c", bitmap->NetworkCode,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveBitmapEntry(file, bitmap, UseUnicode); sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveToDoEntry(FILE *file, GSM_ToDoEntry *ToDo, bool UseUnicode) { unsigned char buffer[1000]; int j; sprintf(buffer,"Location = %i%c%c",ToDo->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); switch (ToDo->Priority) { case GSM_Priority_High: sprintf(buffer,"Priority = High%c%c",13,10); break; case GSM_Priority_Medium: sprintf(buffer,"Priority = Medium%c%c",13,10); break; case GSM_Priority_Low: sprintf(buffer,"Priority = Low%c%c",13,10); break; } SaveBackupText(file, "", buffer, UseUnicode); for (j=0;j<ToDo->EntriesNum;j++) { switch (ToDo->Entries[j].EntryType) { case TODO_END_DATETIME: SaveBackupText(file, "", "DueTime", UseUnicode); SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode); break; case TODO_COMPLETED: sprintf(buffer,"Completed = %s%c%c",ToDo->Entries[j].Number == 1 ? "yes" : "no" ,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case TODO_ALARM_DATETIME: SaveBackupText(file, "", "Alarm", UseUnicode); SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode); break; case TODO_SILENT_ALARM_DATETIME: SaveBackupText(file, "", "SilentAlarm", UseUnicode); SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode); break; case TODO_TEXT: SaveBackupText(file, "Text", ToDo->Entries[j].Text, UseUnicode); break; case TODO_PRIVATE: sprintf(buffer,"Private = %i%c%c",ToDo->Entries[j].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case TODO_CATEGORY: sprintf(buffer,"Category = %i%c%c",ToDo->Entries[j].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case TODO_CONTACTID: sprintf(buffer,"ContactID = %i%c%c",ToDo->Entries[j].Number,13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case TODO_PHONE: SaveBackupText(file, "Phone", ToDo->Entries[j].Text, UseUnicode); break; } } sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveProfileEntry(FILE *file, GSM_Profile *Profile, bool UseUnicode) { int j,k; bool special; unsigned char buffer[1000]; sprintf(buffer,"Location = %i%c%c",Profile->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveBackupText(file, "Name",Profile->Name, UseUnicode); if (Profile->DefaultName) { sprintf(buffer,"DefaultName = true%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } if (Profile->HeadSetProfile) { sprintf(buffer,"HeadSetProfile = true%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } if (Profile->CarKitProfile) { sprintf(buffer,"CarKitProfile = true%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } for (j=0;j<Profile->FeaturesNumber;j++) { sprintf(buffer,"Feature%02i = ",j); SaveBackupText(file, "", buffer, UseUnicode); special = false; switch (Profile->FeatureID[j]) { case Profile_MessageToneID: case Profile_RingtoneID: special = true; if (Profile->FeatureID[j] == Profile_RingtoneID) { sprintf(buffer,"RingtoneID%c%c",13,10); } else { sprintf(buffer,"MessageToneID%c%c",13,10); } SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Value%02i = %i%c%c",j,Profile->FeatureValue[j],13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case Profile_CallerGroups: special = true; sprintf(buffer,"CallerGroups%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Value%02i = ",j); SaveBackupText(file, "", buffer, UseUnicode); for (k=0;k<5;k++) { if (Profile->CallerGroups[k]) { sprintf(buffer,"%i",k); SaveBackupText(file, "", buffer, UseUnicode); } } sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case Profile_ScreenSaverNumber: special = true; sprintf(buffer,"ScreenSaverNumber%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Value%02i = %i%c%c",j,Profile->FeatureValue[j],13,10); SaveBackupText(file, "", buffer, UseUnicode); break; case Profile_CallAlert : sprintf(buffer,"IncomingCallAlert%c%c",13,10); break; case Profile_RingtoneVolume : sprintf(buffer,"RingtoneVolume%c%c",13,10); break; case Profile_Vibration : sprintf(buffer,"Vibrating%c%c",13,10); break; case Profile_MessageTone : sprintf(buffer,"MessageTone%c%c",13,10); break; case Profile_KeypadTone : sprintf(buffer,"KeypadTones%c%c",13,10); break; case Profile_WarningTone : sprintf(buffer,"WarningTones%c%c",13,10); break; case Profile_ScreenSaver : sprintf(buffer,"ScreenSaver%c%c",13,10); break; case Profile_ScreenSaverTime : sprintf(buffer,"ScreenSaverTimeout%c%c",13,10); break; case Profile_AutoAnswer : sprintf(buffer,"AutomaticAnswer%c%c",13,10); break; case Profile_Lights : sprintf(buffer,"Lights%c%c",13,10); break; default : special = true; } if (!special) { SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Value%02i = ",j); SaveBackupText(file, "", buffer, UseUnicode); switch (Profile->FeatureValue[j]) { case PROFILE_VOLUME_LEVEL1 : case PROFILE_KEYPAD_LEVEL1 : sprintf(buffer,"Level1%c%c",13,10); break; case PROFILE_VOLUME_LEVEL2 : case PROFILE_KEYPAD_LEVEL2 : sprintf(buffer,"Level2%c%c",13,10); break; case PROFILE_VOLUME_LEVEL3 : case PROFILE_KEYPAD_LEVEL3 : sprintf(buffer,"Level3%c%c",13,10); break; case PROFILE_VOLUME_LEVEL4 : sprintf(buffer,"Level4%c%c",13,10); break; case PROFILE_VOLUME_LEVEL5 : sprintf(buffer,"Level5%c%c",13,10); 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 : sprintf(buffer,"Off%c%c",13,10); break; case PROFILE_CALLALERT_RINGING : sprintf(buffer,"Ringing%c%c",13,10); break; case PROFILE_CALLALERT_RINGONCE : sprintf(buffer,"RingOnce%c%c",13,10); break; case PROFILE_CALLALERT_ASCENDING : sprintf(buffer,"Ascending%c%c",13,10); break; case PROFILE_CALLALERT_CALLERGROUPS : sprintf(buffer,"CallerGroups%c%c",13,10); break; case PROFILE_MESSAGE_STANDARD : sprintf(buffer,"Standard%c%c",13,10); break; case PROFILE_MESSAGE_SPECIAL : sprintf(buffer,"Special%c%c",13,10); break; case PROFILE_MESSAGE_BEEPONCE : case PROFILE_CALLALERT_BEEPONCE : sprintf(buffer,"BeepOnce%c%c",13,10); break; case PROFILE_MESSAGE_ASCENDING : sprintf(buffer,"Ascending%c%c",13,10); break; case PROFILE_MESSAGE_PERSONAL : sprintf(buffer,"Personal%c%c",13,10); break; case PROFILE_AUTOANSWER_ON : case PROFILE_WARNING_ON : case PROFILE_SAVER_ON : case PROFILE_VIBRATION_ON : sprintf(buffer,"On%c%c",13,10); break; case PROFILE_VIBRATION_FIRST : sprintf(buffer,"VibrateFirst%c%c",13,10); break; case PROFILE_LIGHTS_AUTO : sprintf(buffer,"Auto%c%c",13,10); break; case PROFILE_SAVER_TIMEOUT_5SEC : sprintf(buffer,"5Seconds%c%c",13,10); break; case PROFILE_SAVER_TIMEOUT_20SEC : sprintf(buffer,"20Seconds%c%c",13,10); break; case PROFILE_SAVER_TIMEOUT_1MIN : sprintf(buffer,"1Minute%c%c",13,10); break; case PROFILE_SAVER_TIMEOUT_2MIN : sprintf(buffer,"2Minutes%c%c",13,10); break; case PROFILE_SAVER_TIMEOUT_5MIN : sprintf(buffer,"5Minutes%c%c",13,10); break; case PROFILE_SAVER_TIMEOUT_10MIN : sprintf(buffer,"10Minutes%c%c",13,10); break; default : sprintf(buffer,"UNKNOWN%c%c",13,10); } SaveBackupText(file, "", buffer, UseUnicode); } } sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveFMStationEntry(FILE *file, GSM_FMStation *FMStation, bool UseUnicode) { unsigned char buffer[1000]; sprintf(buffer,"Location = %i%c%c",FMStation->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveBackupText(file, "StationName", FMStation->StationName, UseUnicode); sprintf(buffer,"Frequency = %f%c%c",FMStation->Frequency,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } static void SaveGPRSPointEntry(FILE *file, GSM_GPRSAccessPoint *GPRSPoint, bool UseUnicode) { unsigned char buffer[1000]; sprintf(buffer,"Location = %i%c%c",GPRSPoint->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveBackupText(file, "Name", GPRSPoint->Name, UseUnicode); SaveBackupText(file, "URL", GPRSPoint->URL, UseUnicode); if (GPRSPoint->Active) { sprintf(buffer,"Active = Yes%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); } GSM_Error SaveBackup(char *FileName, GSM_Backup *backup, bool UseUnicode) { int i; unsigned char buffer[1000],checksum[200]; FILE *file; file = fopen(FileName, "wb"); if (file == NULL) return ERR_CANTOPENFILE; if (UseUnicode) { sprintf(buffer,"%c%c", 0xFE, 0xFF); SaveBackupText(file, "", buffer, false); } sprintf(buffer,"# Format of this file was designed for Gammu (see www.mwiacek.com)%c%c%c%c",13,10,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"[Backup]%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"IMEI = \"%s\"%c%c",backup->IMEI,13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"Phone = \"%s\"%c%c",backup->Model,13,10); SaveBackupText(file, "", buffer, UseUnicode); if (backup->Creator[0] != 0) { sprintf(buffer,"Creator = \"%s\"%c%c",backup->Creator,13,10); SaveBackupText(file, "", buffer, UseUnicode); } if (backup->DateTimeAvailable) { SaveBackupText(file, "", "DateTime", UseUnicode); SaveVCalDateTime(file, &backup->DateTime, UseUnicode); } sprintf(buffer,"Format = 1.03%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); i=0; while (backup->PhonePhonebook[i]!=NULL) { sprintf(buffer,"[PhonePBK%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SavePbkEntry(file, backup->PhonePhonebook[i], UseUnicode); i++; } i=0; while (backup->SIMPhonebook[i]!=NULL) { sprintf(buffer,"[SIMPBK%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SavePbkEntry(file, backup->SIMPhonebook[i], UseUnicode); i++; } i=0; while (backup->Calendar[i]!=NULL) { sprintf(buffer,"[Calendar%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveCalendarEntry(file, backup->Calendar[i], UseUnicode); i++; } i=0; + while (backup->Note[i]!=NULL) { + sprintf(buffer,"[Note%03i]%c%c",i+1,13,10); + SaveBackupText(file, "", buffer, UseUnicode); + SaveNoteEntry(file, backup->Note[i], UseUnicode); + i++; + } + i=0; while (backup->CallerLogos[i]!=NULL) { sprintf(buffer,"[Caller%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveCallerEntry(file, backup->CallerLogos[i], UseUnicode); i++; } i=0; while (backup->SMSC[i]!=NULL) { sprintf(buffer,"[SMSC%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveSMSCEntry(file, backup->SMSC[i], UseUnicode); i++; } i=0; while (backup->WAPBookmark[i]!=NULL) { sprintf(buffer,"[WAPBookmark%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveWAPBookmarkEntry(file, backup->WAPBookmark[i], UseUnicode); i++; } i=0; while (backup->WAPSettings[i]!=NULL) { sprintf(buffer,"[WAPSettings%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveWAPSettingsEntry(file, backup->WAPSettings[i], UseUnicode); i++; } i=0; while (backup->MMSSettings[i]!=NULL) { sprintf(buffer,"[MMSSettings%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveWAPSettingsEntry(file, backup->MMSSettings[i], UseUnicode); i++; } i=0; + while (backup->SyncMLSettings[i]!=NULL) { + sprintf(buffer,"[SyncMLSettings%03i]%c%c",i+1,13,10); + SaveBackupText(file, "", buffer, UseUnicode); + SaveSyncMLSettingsEntry(file, backup->SyncMLSettings[i], UseUnicode); + i++; + } + i=0; + while (backup->ChatSettings[i]!=NULL) { + sprintf(buffer,"[ChatSettings%03i]%c%c",i+1,13,10); + SaveBackupText(file, "", buffer, UseUnicode); + SaveChatSettingsEntry(file, backup->ChatSettings[i], UseUnicode); + i++; + } + i=0; while (backup->Ringtone[i]!=NULL) { sprintf(buffer,"[Ringtone%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveRingtoneEntry(file, backup->Ringtone[i], UseUnicode); i++; } i=0; while (backup->ToDo[i]!=NULL) { sprintf(buffer,"[TODO%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveToDoEntry(file, backup->ToDo[i], UseUnicode); i++; } i=0; while (backup->Profiles[i]!=NULL) { sprintf(buffer,"[Profile%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveProfileEntry(file, backup->Profiles[i], UseUnicode); i++; } i=0; while (backup->FMStation[i]!=NULL) { sprintf(buffer,"[FMStation%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveFMStationEntry(file, backup->FMStation[i], UseUnicode); i++; } i=0; while (backup->GPRSPoint[i]!=NULL) { sprintf(buffer,"[GPRSPoint%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveGPRSPointEntry(file, backup->GPRSPoint[i], UseUnicode); i++; } if (backup->StartupLogo!=NULL) { SaveStartupEntry(file, backup->StartupLogo, UseUnicode); } if (backup->OperatorLogo!=NULL) { SaveOperatorEntry(file, backup->OperatorLogo, UseUnicode); } fclose(file); FindBackupChecksum(FileName, UseUnicode, checksum); file = fopen(FileName, "ab"); if (file == NULL) return ERR_CANTOPENFILE; sprintf(buffer,"[Checksum]%c%c",13,10); SaveBackupText(file, "", buffer, UseUnicode); sprintf(buffer,"MD5=%s%c%c",checksum,13,10); SaveBackupText(file, "", buffer, UseUnicode); fclose(file); return ERR_NONE; } static void ReadPbkEntry(INI_Section *file_info, char *section, GSM_MemoryEntry *Pbk, bool UseUnicode) { unsigned char buffer[10000]; char *readvalue; int num,i; INI_Entry *e; Pbk->EntriesNum = 0; e = INI_FindLastSectionEntry(file_info, section, UseUnicode); while (e != NULL) { num = -1; if (UseUnicode) { sprintf(buffer,"%s",DecodeUnicodeString(e->EntryName)); } else { sprintf(buffer,"%s",e->EntryName); } if (strlen(buffer) == 11) { if (mystrncasecmp("Entry", buffer, 5) && mystrncasecmp("Type", buffer+7, 4)) { num = atoi(buffer+5); } } e = e->Prev; if (num != -1) { sprintf(buffer,"Entry%02iType",num); readvalue = ReadCFGText(file_info, section, buffer, UseUnicode); if (mystrncasecmp(readvalue,"NumberGeneral",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General; } else if (mystrncasecmp(readvalue,"NumberMobile",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Mobile; } else if (mystrncasecmp(readvalue,"NumberWork",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Work; } else if (mystrncasecmp(readvalue,"NumberFax",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Fax; } else if (mystrncasecmp(readvalue,"NumberHome",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Home; } else if (mystrncasecmp(readvalue,"NumberOther",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Other; } else if (mystrncasecmp(readvalue,"NumberPager",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Pager; } else if (mystrncasecmp(readvalue,"Note",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Note; } else if (mystrncasecmp(readvalue,"Postal",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Postal; } else if (mystrncasecmp(readvalue,"Email",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email; } else if (mystrncasecmp(readvalue,"Email2",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email2; } else if (mystrncasecmp(readvalue,"URL",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_URL; } else if (mystrncasecmp(readvalue,"FirstName",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_FirstName; } else if (mystrncasecmp(readvalue,"LastName",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_LastName; } else if (mystrncasecmp(readvalue,"Company",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Company; } else if (mystrncasecmp(readvalue,"JobTitle",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_JobTitle; } else if (mystrncasecmp(readvalue,"Address",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_StreetAddress; } else if (mystrncasecmp(readvalue,"City",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_City; } else if (mystrncasecmp(readvalue,"State",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_State; } else if (mystrncasecmp(readvalue,"Zip",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Zip; } else if (mystrncasecmp(readvalue,"Country",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Country; } else if (mystrncasecmp(readvalue,"Custom1",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom1; } else if (mystrncasecmp(readvalue,"Custom2",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom2; } else if (mystrncasecmp(readvalue,"Custom3",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom3; } else if (mystrncasecmp(readvalue,"Custom4",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom4; } else if (mystrncasecmp(readvalue,"Name",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Name; } else if (mystrncasecmp(readvalue,"Category",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Category; Pbk->Entries[Pbk->EntriesNum].Number = 0; sprintf(buffer,"Entry%02iNumber",num); readvalue = ReadCFGText(file_info, section, buffer, UseUnicode); if (readvalue!=NULL) { Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue); } Pbk->EntriesNum ++; continue; } else if (mystrncasecmp(readvalue,"Private",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Private; Pbk->Entries[Pbk->EntriesNum].Number = 0; sprintf(buffer,"Entry%02iNumber",num); readvalue = ReadCFGText(file_info, section, buffer, UseUnicode); if (readvalue!=NULL) { Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue); } Pbk->EntriesNum ++; continue; } else if (mystrncasecmp(readvalue,"CallerGroup",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Caller_Group; Pbk->Entries[Pbk->EntriesNum].Number = 0; sprintf(buffer,"Entry%02iNumber",num); readvalue = ReadCFGText(file_info, section, buffer, UseUnicode); if (readvalue!=NULL) { Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue); } Pbk->EntriesNum ++; continue; } else if (mystrncasecmp(readvalue,"RingtoneID",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_RingtoneID; Pbk->Entries[Pbk->EntriesNum].Number = 0; sprintf(buffer,"Entry%02iNumber",num); readvalue = ReadCFGText(file_info, section, buffer, UseUnicode); if (readvalue!=NULL) { Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue); } Pbk->EntriesNum ++; continue; } else if (mystrncasecmp(readvalue,"PictureID",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_PictureID; Pbk->Entries[Pbk->EntriesNum].Number = 0; sprintf(buffer,"Entry%02iNumber",num); readvalue = ReadCFGText(file_info, section, buffer, UseUnicode); if (readvalue!=NULL) { Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue); } Pbk->EntriesNum ++; continue; } else if (mystrncasecmp(readvalue,"UserID",0)) { Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_UserID; } sprintf(buffer,"Entry%02iText",num); ReadBackupText(file_info, section, buffer, Pbk->Entries[Pbk->EntriesNum].Text,UseUnicode); dbgprintf("text \"%s\", type %i\n",DecodeUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text),Pbk->Entries[Pbk->EntriesNum].EntryType); @@ -2467,385 +2543,510 @@ GSM_Error LoadBackup(char *FileName, GSM_Backup *backup, bool UseUnicode) } else { if (mystrncasecmp("WAPSettings", h->SectionName, 11)) found = true; if (!found) { if (mystrncasecmp("Settings", h->SectionName, 8)) found = true; } } if (found) { readvalue = ReadCFGText(file_info, h->SectionName, "Title00", UseUnicode); if (readvalue==NULL) break; if (num < GSM_BACKUP_MAX_WAPSETTINGS) { backup->WAPSettings[num] = malloc(sizeof(GSM_MultiWAPSettings)); if (backup->WAPSettings[num] == NULL) return ERR_MOREMEMORY; backup->WAPSettings[num + 1] = NULL; } else { dbgprintf("Increase GSM_BACKUP_MAX_WAPSETTINGS\n"); return ERR_MOREMEMORY; } backup->WAPSettings[num]->Location = num + 1; dbgprintf("reading wap settings\n"); ReadWAPSettingsEntry(file_info, h->SectionName, backup->WAPSettings[num],UseUnicode); num++; } } num = 0; for (h = file_info; h != NULL; h = h->Next) { found = false; if (UseUnicode) { EncodeUnicode(buffer,"MMSSettings",8); if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; } else { if (mystrncasecmp("MMSSettings", h->SectionName, 8)) found = true; } if (found) { readvalue = ReadCFGText(file_info, h->SectionName, "Title00", UseUnicode); if (readvalue==NULL) break; if (num < GSM_BACKUP_MAX_MMSSETTINGS) { backup->MMSSettings[num] = malloc(sizeof(GSM_MultiWAPSettings)); if (backup->MMSSettings[num] == NULL) return ERR_MOREMEMORY; backup->MMSSettings[num + 1] = NULL; } else { dbgprintf("Increase GSM_BACKUP_MAX_MMSSETTINGS\n"); return ERR_MOREMEMORY; } backup->MMSSettings[num]->Location = num + 1; dbgprintf("reading mms settings\n"); ReadWAPSettingsEntry(file_info, h->SectionName, backup->MMSSettings[num],UseUnicode); num++; } } num = 0; for (h = file_info; h != NULL; h = h->Next) { found = false; if (UseUnicode) { EncodeUnicode(buffer,"Ringtone",8); if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; } else { if (mystrncasecmp("Ringtone", h->SectionName, 8)) found = true; } if (found) { readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode); if (readvalue==NULL) break; if (num < GSM_BACKUP_MAX_RINGTONES) { backup->Ringtone[num] = malloc(sizeof(GSM_Ringtone)); if (backup->Ringtone[num] == NULL) return ERR_MOREMEMORY; backup->Ringtone[num + 1] = NULL; } else { dbgprintf("Increase GSM_BACKUP_MAX_RINGTONES\n"); return ERR_MOREMEMORY; } ReadRingtoneEntry(file_info, h->SectionName, backup->Ringtone[num],UseUnicode); num++; } } num = 0; for (h = file_info; h != NULL; h = h->Next) { found = false; if (UseUnicode) { EncodeUnicode(buffer,"TODO",4); if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; } else { if (mystrncasecmp("TODO", h->SectionName, 4)) found = true; } if (found) { readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode); if (readvalue==NULL) break; if (num < GSM_MAXCALENDARTODONOTES) { backup->ToDo[num] = malloc(sizeof(GSM_ToDoEntry)); if (backup->ToDo[num] == NULL) return ERR_MOREMEMORY; backup->ToDo[num + 1] = NULL; } else { dbgprintf("Increase GSM_MAXCALENDARTODONOTES\n"); return ERR_MOREMEMORY; } backup->ToDo[num]->Location = num + 1; ReadToDoEntry(file_info, h->SectionName, backup->ToDo[num],UseUnicode); num++; } } sprintf(buffer,"Startup"); readvalue = ReadCFGText(file_info, buffer, "Text", UseUnicode); if (readvalue==NULL) { readvalue = ReadCFGText(file_info, buffer, "Width", UseUnicode); } if (readvalue!=NULL) { backup->StartupLogo = malloc(sizeof(GSM_Bitmap)); if (backup->StartupLogo == NULL) return ERR_MOREMEMORY; ReadStartupEntry(file_info, buffer, backup->StartupLogo,UseUnicode); } sprintf(buffer,"Operator"); readvalue = ReadCFGText(file_info, buffer, "Network", UseUnicode); if (readvalue!=NULL) { backup->OperatorLogo = malloc(sizeof(GSM_Bitmap)); if (backup->OperatorLogo == NULL) return ERR_MOREMEMORY; ReadOperatorEntry(file_info, buffer, backup->OperatorLogo,UseUnicode); } num = 0; for (h = file_info; h != NULL; h = h->Next) { found = false; if (UseUnicode) { EncodeUnicode(buffer,"FMStation",9); if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true; } else { if (mystrncasecmp("FMStation", h->SectionName, 9)) found = true; } if (found) { readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode); if (readvalue==NULL) break; if (num < GSM_BACKUP_MAX_FMSTATIONS) { backup->FMStation[num] = malloc(sizeof(GSM_FMStation)); if (backup->FMStation[num] == NULL) return ERR_MOREMEMORY; backup->FMStation[num + 1] = NULL; } else { dbgprintf("Increase GSM_BACKUP_MAX_FMSTATIONS\n"); return ERR_MOREMEMORY; } backup->FMStation[num]->Location = num + 1; ReadFMStationEntry(file_info, h->SectionName, backup->FMStation[num],UseUnicode); num++; } } num = 0; for (h = file_info; h != NULL; h = h->Next) { found = false; if (UseUnicode) { EncodeUnicode(buffer,"GPRSPoint",9); if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true; } else { if (mystrncasecmp("GPRSPoint", h->SectionName, 9)) found = true; } if (found) { readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode); if (readvalue==NULL) break; if (num < GSM_BACKUP_MAX_GPRSPOINT) { backup->GPRSPoint[num] = malloc(sizeof(GSM_GPRSAccessPoint)); if (backup->GPRSPoint[num] == NULL) return ERR_MOREMEMORY; backup->GPRSPoint[num + 1] = NULL; } else { dbgprintf("Increase GSM_BACKUP_MAX_GPRSPOINT\n"); return ERR_MOREMEMORY; } backup->GPRSPoint[num]->Location = num + 1; ReadGPRSPointEntry(file_info, h->SectionName, backup->GPRSPoint[num],UseUnicode); num++; } } num = 0; for (h = file_info; h != NULL; h = h->Next) { found = false; if (UseUnicode) { EncodeUnicode(buffer,"Note",4); if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; } else { if (mystrncasecmp("Note", h->SectionName, 4)) found = true; } if (found) { readvalue = ReadCFGText(file_info, h->SectionName, "Text", UseUnicode); if (readvalue==NULL) break; if (num < GSM_BACKUP_MAX_NOTE) { backup->Note[num] = malloc(sizeof(GSM_NoteEntry)); if (backup->Note[num] == NULL) return ERR_MOREMEMORY; backup->Note[num + 1] = NULL; } else { dbgprintf("Increase GSM_BACKUP_MAX_NOTE\n"); return ERR_MOREMEMORY; } ReadNoteEntry(file_info, h->SectionName, backup->Note[num],UseUnicode); num++; } } if (backup->MD5Original[0]!=0) { FindBackupChecksum(FileName, UseUnicode, backup->MD5Calculated); } - + for (h = file_info; h != NULL; h = h->Next) { + found = false; + if (UseUnicode) { + EncodeUnicode(buffer,"Backup",4); + if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true; + } else { + if (mystrncasecmp("Backup", h->SectionName, 6)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Checksum",4); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("Checksum", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Profile",7); + if (mywstrncasecmp(buffer, h->SectionName, 7)) found = true; + } else { + if (mystrncasecmp("Profile", h->SectionName, 7)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"PhonePBK",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("PhonePBK", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"SIMPBK",6); + if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true; + } else { + if (mystrncasecmp("SIMPBK", h->SectionName, 6)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Calendar",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("Calendar", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Caller",6); + if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true; + } else { + if (mystrncasecmp("Caller", h->SectionName, 6)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"SMSC",4); + if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; + } else { + if (mystrncasecmp("SMSC", h->SectionName, 4)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"WAPBookmark",11); + if (mywstrncasecmp(buffer, h->SectionName, 11)) found = true; + if (!found) { + EncodeUnicode(buffer,"Bookmark",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } + } else { + if (mystrncasecmp("WAPBookmark", h->SectionName, 11)) found = true; + if (!found) { + if (mystrncasecmp("Bookmark", h->SectionName, 8)) found = true; + } + } + if (UseUnicode) { + EncodeUnicode(buffer,"WAPSettings",11); + if (mywstrncasecmp(buffer, h->SectionName, 11)) found = true; + if (!found) { + EncodeUnicode(buffer,"Settings",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } + } else { + if (mystrncasecmp("WAPSettings", h->SectionName, 11)) found = true; + if (!found) { + if (mystrncasecmp("Settings", h->SectionName, 8)) found = true; + } + } + if (UseUnicode) { + EncodeUnicode(buffer,"MMSSettings",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("MMSSettings", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Ringtone",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("Ringtone", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"TODO",4); + if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; + } else { + if (mystrncasecmp("TODO", h->SectionName, 4)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Startup",7); + if (mywstrncasecmp(buffer, h->SectionName, 7)) found = true; + } else { + if (mystrncasecmp("Startup", h->SectionName, 7)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Operator",7); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("Operator", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"FMStation",9); + if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true; + } else { + if (mystrncasecmp("FMStation", h->SectionName, 9)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"GPRSPoint",9); + if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true; + } else { + if (mystrncasecmp("GPRSPoint", h->SectionName, 9)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Note",4); + if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; + } else { + if (mystrncasecmp("Note", h->SectionName, 4)) found = true; + } + if (!found) return ERR_NOTIMPLEMENTED; + } return ERR_NONE; } /* ---------------------- backup files for SMS ----------------------------- */ static void ReadSMSBackupEntry(INI_Section *file_info, char *section, GSM_SMSMessage *SMS) { unsigned char buffer[10000], *readvalue; GSM_SetDefaultSMSData(SMS); SMS->PDU = SMS_Submit; SMS->SMSC.Location = 0; sprintf(buffer,"SMSC"); ReadBackupText(file_info, section, buffer, SMS->SMSC.Number, false); sprintf(buffer,"ReplySMSC"); SMS->ReplyViaSameSMSC = false; readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) { if (mystrncasecmp(readvalue,"True",0)) SMS->ReplyViaSameSMSC = true; } sprintf(buffer,"Class"); SMS->Class = -1; readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) SMS->Class = atoi(readvalue); sprintf(buffer,"Sent"); readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) { ReadVCALDateTime(readvalue, &SMS->DateTime); SMS->PDU = SMS_Deliver; } sprintf(buffer,"RejectDuplicates"); SMS->RejectDuplicates = false; readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) { if (mystrncasecmp(readvalue,"True",0)) SMS->RejectDuplicates = true; } sprintf(buffer,"ReplaceMessage"); SMS->ReplaceMessage = 0; readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) SMS->ReplaceMessage = atoi(readvalue); sprintf(buffer,"MessageReference"); SMS->MessageReference = 0; readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) SMS->MessageReference = atoi(readvalue); sprintf(buffer,"State"); SMS->State = SMS_UnRead; readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) { if (mystrncasecmp(readvalue,"Read",0)) SMS->State = SMS_Read; else if (mystrncasecmp(readvalue,"Sent",0)) SMS->State = SMS_Sent; else if (mystrncasecmp(readvalue,"UnSent",0)) SMS->State = SMS_UnSent; } sprintf(buffer,"Number"); ReadBackupText(file_info, section, buffer, SMS->Number, false); sprintf(buffer,"Name"); ReadBackupText(file_info, section, buffer, SMS->Name, false); sprintf(buffer,"Length"); SMS->Length = 0; readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) SMS->Length = atoi(readvalue); sprintf(buffer,"Coding"); SMS->Coding = SMS_Coding_Default; readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) { if (mystrncasecmp(readvalue,"Unicode",0)) { SMS->Coding = SMS_Coding_Unicode; } else if (mystrncasecmp(readvalue,"8bit",0)) { SMS->Coding = SMS_Coding_8bit; } } ReadLinkedBackupText(file_info, section, "Text", buffer, false); DecodeHexBin (SMS->Text, buffer, strlen(buffer)); SMS->Text[strlen(buffer)/2] = 0; SMS->Text[strlen(buffer)/2+1] = 0; sprintf(buffer,"Folder"); readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) SMS->Folder = atoi(readvalue); SMS->UDH.Type = UDH_NoUDH; SMS->UDH.Length = 0; SMS->UDH.ID8bit = -1; SMS->UDH.ID16bit = -1; SMS->UDH.PartNumber = -1; SMS->UDH.AllParts = -1; sprintf(buffer,"UDH"); readvalue = ReadCFGText(file_info, section, buffer, false); if (readvalue!=NULL) { DecodeHexBin (SMS->UDH.Text, readvalue, strlen(readvalue)); SMS->UDH.Length = strlen(readvalue)/2; GSM_DecodeUDHHeader(&SMS->UDH); } } static GSM_Error GSM_ReadSMSBackupTextFile(char *FileName, GSM_SMS_Backup *backup) { INI_Section *file_info, *h; char *readvalue; int num; backup->SMS[0] = NULL; file_info = INI_ReadFile(FileName, false); num = 0; for (h = file_info; h != NULL; h = h->Next) { if (mystrncasecmp("SMSBackup", h->SectionName, 9)) { readvalue = ReadCFGText(file_info, h->SectionName, "Number", false); if (readvalue==NULL) break; if (num < GSM_BACKUP_MAX_SMS) { backup->SMS[num] = malloc(sizeof(GSM_SMSMessage)); if (backup->SMS[num] == NULL) return ERR_MOREMEMORY; backup->SMS[num + 1] = NULL; } else { dbgprintf("Increase GSM_BACKUP_MAX_SMS\n"); return ERR_MOREMEMORY; } backup->SMS[num]->Location = num + 1; ReadSMSBackupEntry(file_info, h->SectionName, backup->SMS[num]); num++; } } return ERR_NONE; } GSM_Error GSM_ReadSMSBackupFile(char *FileName, GSM_SMS_Backup *backup) { FILE *file; backup->SMS[0] = NULL; file = fopen(FileName, "rb"); if (file == NULL) return(ERR_CANTOPENFILE); fclose(file); return GSM_ReadSMSBackupTextFile(FileName, backup); } GSM_Error SaveSMSBackupTextFile(FILE *file, GSM_SMS_Backup *backup) { int i,w,current; unsigned char buffer[10000]; GSM_DateTime DT; fprintf(file,"\n# File created by Gammu (www.mwiacek.com) version %s\n",VERSION); GSM_GetCurrentDateTime (&DT); fprintf(file,"# Saved %s\n\n",OSDateTime(DT,false)); i=0; while (backup->SMS[i]!=NULL) { fprintf(file,"[SMSBackup%03i]\n",i); switch (backup->SMS[i]->Coding) { case SMS_Coding_Unicode: case SMS_Coding_Default: sprintf(buffer,"%s",DecodeUnicodeString(backup->SMS[i]->Text)); fprintf(file,"#"); current = 0; for (w=0;w<(int)(strlen(buffer));w++) { switch (buffer[w]) { case 10: fprintf(file,"\n#"); current = 0; break; case 13: break; default: if (isprint(buffer[w])) { fprintf(file,"%c",buffer[w]); current ++; } if (current == 75) { fprintf(file,"\n#"); current = 0; } } } fprintf(file,"\n"); break; default: break; } if (backup->SMS[i]->PDU == SMS_Deliver) { SaveBackupText(file, "SMSC", backup->SMS[i]->SMSC.Number, false); if (backup->SMS[i]->ReplyViaSameSMSC) fprintf(file,"SMSCReply = true\n"); fprintf(file,"Sent"); SaveVCalDateTime(file,&backup->SMS[i]->DateTime, false); } fprintf(file,"State = "); switch (backup->SMS[i]->State) { case SMS_UnRead : fprintf(file,"UnRead\n"); break; case SMS_Read : fprintf(file,"Read\n"); break; case SMS_Sent : fprintf(file,"Sent\n"); break; diff --git a/gammu/emb/common/service/backup/gsmback.c b/gammu/emb/common/service/backup/gsmback.c index 91ac745..c94a4d2 100644 --- a/gammu/emb/common/service/backup/gsmback.c +++ b/gammu/emb/common/service/backup/gsmback.c @@ -1,280 +1,298 @@ /* (c) 2002-2004 by Marcin Wiacek & Michal Cihar */ #include <string.h> #include <ctype.h> #include "../../phone/nokia/nfunc.h" #include "../../phone/nokia/dct3/n7110.h" #include "../../misc/coding/coding.h" #include "../../misc/cfg.h" #include "../gsmlogo.h" #include "../gsmmisc.h" #include "../gsmcal.h" #include "gsmback.h" #include "backtext.h" #include "backldif.h" #include "backlmb.h" #include "backvcs.h" #include "backvcf.h" #include "backics.h" #ifdef GSM_ENABLE_BACKUP void GSM_FreeBackup(GSM_Backup *backup) { int i; i=0; while (backup->PhonePhonebook[i]!=NULL) { free(backup->PhonePhonebook[i]); backup->PhonePhonebook[i] = NULL; i++; } i=0; while (backup->SIMPhonebook[i]!=NULL) { free(backup->SIMPhonebook[i]); backup->SIMPhonebook[i] = NULL; i++; } i=0; while (backup->Calendar[i]!=NULL) { free(backup->Calendar[i]); backup->Calendar[i] = NULL; i++; } i=0; while (backup->CallerLogos[i]!=NULL) { free(backup->CallerLogos[i]); backup->CallerLogos[i] = NULL; i++; } i=0; while (backup->SMSC[i]!=NULL) { free(backup->SMSC[i]); backup->SMSC[i] = NULL; i++; } i=0; while (backup->WAPBookmark[i]!=NULL) { free(backup->WAPBookmark[i]); backup->WAPBookmark[i] = NULL; i++; } i=0; while (backup->WAPSettings[i]!=NULL) { free(backup->WAPSettings[i]); backup->WAPSettings[i] = NULL; i++; } i=0; while (backup->MMSSettings[i]!=NULL) { free(backup->MMSSettings[i]); backup->MMSSettings[i] = NULL; i++; } i=0; + while (backup->SyncMLSettings[i]!=NULL) { + free(backup->SyncMLSettings[i]); + backup->SyncMLSettings[i] = NULL; + i++; + } + i=0; + while (backup->ChatSettings[i]!=NULL) { + free(backup->ChatSettings[i]); + backup->ChatSettings[i] = NULL; + i++; + } + i=0; while (backup->Ringtone[i]!=NULL) { free(backup->Ringtone[i]); backup->Ringtone[i] = NULL; i++; } i=0; while (backup->ToDo[i]!=NULL) { free(backup->ToDo[i]); backup->ToDo[i] = NULL; i++; } i=0; while (backup->Profiles[i]!=NULL) { free(backup->Profiles[i]); backup->Profiles[i] = NULL; i++; } i=0; while (backup->FMStation[i]!=NULL) { free(backup->FMStation[i]); backup->FMStation[i] = NULL; i++; } if (backup->StartupLogo!=NULL) { free(backup->StartupLogo); backup->StartupLogo = NULL; } if (backup->OperatorLogo!=NULL) { free(backup->OperatorLogo); backup->OperatorLogo = NULL; } i=0; while (backup->GPRSPoint[i]!=NULL) { free(backup->GPRSPoint[i]); backup->GPRSPoint[i] = NULL; i++; } i=0; while (backup->Note[i]!=NULL) { free(backup->Note[i]); backup->Note[i] = NULL; i++; } } GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup, bool UseUnicode) { - if (strstr(FileName,".lmb")) { + if (mystrcasestr(FileName,".lmb")) { return SaveLMB(FileName,backup); - } else if (strstr(FileName,".vcs")) { + } else if (mystrcasestr(FileName,".vcs")) { return SaveVCalendar(FileName,backup); - } else if (strstr(FileName,".vcf")) { + } else if (mystrcasestr(FileName,".vcf")) { return SaveVCard(FileName,backup); - } else if (strstr(FileName,".ldif")) { + } else if (mystrcasestr(FileName,".ldif")) { return SaveLDIF(FileName,backup); - } else if (strstr(FileName,".ics")) { + } else if (mystrcasestr(FileName,".ics")) { return SaveICS(FileName,backup); } else { return SaveBackup(FileName,backup, UseUnicode); } } GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup) { FILE *file; unsigned char buffer[300]; file = fopen(FileName, "rb"); if (file == NULL) return ERR_CANTOPENFILE; fread(buffer, 1, 9, file); /* Read the header of the file. */ fclose(file); GSM_ClearBackup(backup); /* Attempt to identify filetype */ - if (strstr(FileName,".vcs")) { + if (mystrcasestr(FileName,".vcs")) { return LoadVCalendar(FileName,backup); - } else if (strstr(FileName,".vcf")) { + } else if (mystrcasestr(FileName,".vcf")) { return LoadVCard(FileName,backup); - } else if (strstr(FileName,".ldif")) { + } else if (mystrcasestr(FileName,".ldif")) { return LoadLDIF(FileName,backup); - } else if (strstr(FileName,".ics")) { + } else if (mystrcasestr(FileName,".ics")) { return LoadICS(FileName,backup); } else if (memcmp(buffer, "LMB ",4)==0) { return LoadLMB(FileName,backup); } else if (buffer[0] == 0xFE && buffer[1] == 0xFF) { return LoadBackup(FileName,backup,true); } else if (buffer[0] == 0xFF && buffer[1] == 0xFE) { return LoadBackup(FileName,backup,true); } else { return LoadBackup(FileName,backup,false); } } void GSM_ClearBackup(GSM_Backup *backup) { backup->PhonePhonebook [0] = NULL; backup->SIMPhonebook [0] = NULL; backup->Calendar [0] = NULL; backup->CallerLogos [0] = NULL; backup->SMSC [0] = NULL; backup->WAPBookmark [0] = NULL; backup->WAPSettings [0] = NULL; backup->MMSSettings [0] = NULL; + backup->SyncMLSettings [0] = NULL; + backup->ChatSettings [0] = NULL; backup->Ringtone [0] = NULL; backup->Profiles [0] = NULL; backup->ToDo [0] = NULL; backup->GPRSPoint [0] = NULL; backup->FMStation [0] = NULL; backup->Note [0] = NULL; backup->StartupLogo = NULL; backup->OperatorLogo = NULL; backup->Creator [0] = 0; backup->IMEI [0] = 0; backup->Model [0] = 0; backup->DateTimeAvailable = false; backup->MD5Original [0] = 0; backup->MD5Calculated [0] = 0; } void GSM_GetBackupFormatFeatures(char *FileName, GSM_Backup_Info *info) { info->UseUnicode = false; info->IMEI = false; info->Model = false; info->DateTime = false; info->PhonePhonebook = false; info->SIMPhonebook = false; info->ToDo = false; info->Calendar = false; info->CallerLogos = false; info->SMSC = false; info->WAPBookmark = false; info->WAPSettings = false; info->MMSSettings = false; + info->SyncMLSettings = false; + info->ChatSettings = false; info->Ringtone = false; info->StartupLogo = false; info->OperatorLogo = false; info->Profiles = false; info->FMStation = false; info->GPRSPoint = false; info->Note = false; if (strstr(FileName,".lmb")) { info->PhonePhonebook = true; info->SIMPhonebook = true; info->CallerLogos = true; info->StartupLogo = true; } else if (strstr(FileName,".vcs")) { info->ToDo = true; info->Calendar = true; } else if (strstr(FileName,".vcf")) { info->PhonePhonebook = true; } else if (strstr(FileName,".ics")) { info->ToDo = true; info->Calendar = true; } else if (strstr(FileName,".ldif")) { info->PhonePhonebook = true; } else { info->UseUnicode = true; info->IMEI = true; info->Model = true; info->DateTime = true; info->PhonePhonebook = true; info->SIMPhonebook = true; info->ToDo = true; info->Calendar = true; info->CallerLogos = true; info->SMSC = true; info->WAPBookmark = true; info->WAPSettings = true; info->MMSSettings = true; + info->SyncMLSettings = true; + info->ChatSettings = true; info->Ringtone = true; info->StartupLogo = true; info->OperatorLogo = true; info->Profiles = true; info->FMStation = true; info->GPRSPoint = true; info->Note = true; } } void GSM_GetBackupFileFeatures(char *FileName, GSM_Backup_Info *info, GSM_Backup *backup) { GSM_GetBackupFormatFeatures(FileName, info); if (info->PhonePhonebook && backup->PhonePhonebook[0] == NULL) info->PhonePhonebook = false; if (info->SIMPhonebook && backup->SIMPhonebook[0] == NULL) info->SIMPhonebook = false; if (info->Calendar && backup->Calendar[0] == NULL) info->Calendar = false; if (info->ToDo && backup->ToDo[0] == NULL) info->ToDo = false; if (info->WAPBookmark && backup->WAPBookmark[0] == NULL) info->WAPBookmark = false; if (info->WAPSettings && backup->WAPSettings[0] == NULL) info->WAPSettings = false; if (info->MMSSettings && backup->MMSSettings[0] == NULL) info->MMSSettings = false; if (info->FMStation && backup->FMStation[0] == NULL) info->FMStation = false; if (info->GPRSPoint && backup->GPRSPoint[0] == NULL) info->GPRSPoint = false; if (info->Profiles && backup->Profiles[0] == NULL) info->Profiles = false; /* .... */ } #endif /* How should editor hadle tabs in this file? Add editor commands here. * vim: noexpandtab sw=8 ts=8 sts=8: */ diff --git a/gammu/emb/common/service/backup/gsmback.h b/gammu/emb/common/service/backup/gsmback.h index 1fd99b0..791e81d 100644 --- a/gammu/emb/common/service/backup/gsmback.h +++ b/gammu/emb/common/service/backup/gsmback.h @@ -1,48 +1,50 @@ /* (c) 2003-2004 by Marcin Wiacek */ #ifndef __gsm_back_h #define __gsm_back_h #include "backgen.h" #ifdef GSM_ENABLE_BACKUP GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup, bool UseUnicode); GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup); void GSM_ClearBackup (GSM_Backup *backup); void GSM_FreeBackup (GSM_Backup *backup); typedef struct { bool UseUnicode; bool IMEI; bool Model; bool DateTime; bool ToDo; bool PhonePhonebook; bool SIMPhonebook; bool Calendar; bool CallerLogos; bool SMSC; bool WAPBookmark; bool Profiles; bool WAPSettings; bool MMSSettings; + bool SyncMLSettings; + bool ChatSettings; bool Ringtone; bool StartupLogo; bool OperatorLogo; bool FMStation; bool GPRSPoint; bool Note; } GSM_Backup_Info; void GSM_GetBackupFormatFeatures(char *FileName, GSM_Backup_Info *info); void GSM_GetBackupFileFeatures (char *FileName, GSM_Backup_Info *info, GSM_Backup *backup); #endif #endif /* How should editor hadle tabs in this file? Add editor commands here. * vim: noexpandtab sw=8 ts=8 sts=8: */ |