GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup, GSM_BackupFormat Format) { GSM_ClearBackup(backup); if (Format == GSM_Backup_Auto || Format == GSM_Backup_AutoUnicode) { Format = GSM_GuessBackupFormat(FileName, Format == GSM_Backup_AutoUnicode); } switch (Format) { case GSM_Backup_LMB: return LoadLMB(FileName,backup); case GSM_Backup_VCalendar: return LoadVCalendar(FileName,backup); case GSM_Backup_VCard: return LoadVCard(FileName,backup); case GSM_Backup_VNote: return LoadVNT(FileName,backup); case GSM_Backup_LDIF: return LoadLDIF(FileName,backup); case GSM_Backup_ICS: return LoadICS(FileName,backup); case GSM_Backup_Gammu: return LoadBackup(FileName,backup); case GSM_Backup_GammuUCS2: return LoadBackup(FileName,backup); default: return ERR_FILENOTSUPPORTED; } }
GSM_Error DUMMY_SetAlarm(GSM_StateMachine *s, GSM_Alarm *entry) { char *filename=NULL; GSM_Error error; GSM_Backup backup; GSM_CalendarEntry cal; GSM_ClearBackup(&backup); error = DUMMY_DeleteAlarm(s, entry); if (error != ERR_EMPTY && error != ERR_NONE) return error; filename = DUMMY_AlarmPath(s, entry); cal.EntriesNum = 3; cal.Type = GSM_CAL_ALARM; cal.Location = entry->Location; cal.Entries[0].EntryType = CAL_TONE_ALARM_DATETIME; cal.Entries[0].Date = entry->DateTime; cal.Entries[0].Date.Year = 1970; cal.Entries[0].Date.Month = 1; cal.Entries[0].Date.Day = 1; cal.Entries[0].Date.Timezone = 0; cal.Entries[1].EntryType = CAL_START_DATETIME; cal.Entries[1].Date = entry->DateTime; cal.Entries[1].Date.Year = 1970; cal.Entries[1].Date.Month = 1; cal.Entries[1].Date.Day = 1; cal.Entries[1].Date.Timezone = 0; cal.Entries[2].EntryType = CAL_TEXT; CopyUnicodeString(cal.Entries[2].Text, entry->Text); if (entry->Repeating) { cal.Entries[3].EntryType = CAL_REPEAT_FREQUENCY; cal.Entries[3].Number = 1; } backup.Calendar[0] = &cal; backup.Calendar[1] = NULL; error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VCalendar); free(filename); filename=NULL; return error; }
GSM_Error DUMMY_SetNote(GSM_StateMachine *s, GSM_NoteEntry *entry) { char *filename=NULL; GSM_Error error; GSM_Backup backup; GSM_ClearBackup(&backup); error = DUMMY_DeleteNote(s, entry); if (error != ERR_EMPTY && error != ERR_NONE) return error; filename = DUMMY_NotePath(s, entry); backup.Note[0] = entry; backup.Note[1] = NULL; error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VNote); free(filename); filename=NULL; return error; }
GSM_Error DUMMY_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *entry) { char *filename=NULL; GSM_Error error; GSM_Backup backup; GSM_ClearBackup(&backup); error = DUMMY_DeleteCalendar(s, entry); if (error != ERR_EMPTY && error != ERR_NONE) return error; filename = DUMMY_CalendarPath(s, entry); backup.Calendar[0] = entry; backup.Calendar[1] = NULL; error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VCalendar); free(filename); filename=NULL; return error; }
GSM_Error DUMMY_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry) { char *filename=NULL; GSM_Error error; GSM_Backup backup; GSM_ClearBackup(&backup); error = DUMMY_DeleteMemory(s, entry); if (error != ERR_EMPTY && error != ERR_NONE) return error; filename = DUMMY_MemoryPath(s, entry); backup.PhonePhonebook[0] = entry; backup.PhonePhonebook[1] = NULL; error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VCard); free(filename); filename=NULL; return error; }
int main(int argc, char **argv) { size_t pos = 0; GSM_MemoryEntry pbk; GSM_Error error; FILE *f; size_t len; gboolean generate = FALSE; GSM_Backup backup; int i; GSM_Debug_Info *debug_info; /* Configure debugging */ debug_info = GSM_GetGlobalDebug(); GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info); GSM_SetDebugLevel("textall", debug_info); /* Check parameters */ if (argc != 3 && argc != 4) { printf("Not enough parameters!\nUsage: vcard-read file.vcf file.backup\n"); return 1; } /* Check for generating option */ if (argc == 4 && strcmp(argv[3], "generate") == 0) { generate = TRUE; } /* Open file */ f = fopen(argv[1], "r"); test_result(f != NULL); /* Read data */ len = fread(buffer, 1, sizeof(buffer) - 1, f); test_result(feof(f)); /* Zero terminate string */ buffer[len] = 0; /* We don't need file any more */ fclose(f); /* Parse vCard */ error = GSM_DecodeVCARD(NULL, buffer, &pos, &pbk, SonyEricsson_VCard21); gammu_test_result(error, "GSM_DecodeVCARD"); /* Encode vCard back */ pos = 0; error = GSM_EncodeVCARD(NULL, vcard_buffer, sizeof(vcard_buffer), &pos, &pbk, TRUE, SonyEricsson_VCard21); gammu_test_result(error, "GSM_EncodeVCARD"); /* * Best would be to compare here, but we never can get * absolutely same as original. */ printf("ORIGINAL:\n%s\n----\nENCODED:\n%s\n", buffer, vcard_buffer); /* Generate file if we should */ if (generate) { GSM_ClearBackup(&backup); strcpy(backup.Creator, "vCard tester"); pbk.Location = 0; backup.PhonePhonebook[0] = &pbk; backup.PhonePhonebook[1] = NULL; error = GSM_SaveBackupFile(argv[2], &backup, TRUE); gammu_test_result(error, "GSM_SaveBackupFile"); } /* Read file content */ GSM_ClearBackup(&backup); error = GSM_ReadBackupFile(argv[2], &backup, GSM_Backup_GammuUCS2); gammu_test_result(error, "GSM_ReadBackupFile"); /* Compare size */ test_result(pbk.EntriesNum == backup.PhonePhonebook[0]->EntriesNum); /* Compare content */ for (i = 0; i < pbk.EntriesNum; i++) { test_result(pbk.Entries[i].EntryType == backup.PhonePhonebook[0]->Entries[i].EntryType); printf("Entry type: %d\n", pbk.Entries[i].EntryType); switch (pbk.Entries[i].EntryType) { case PBK_Number_General: case PBK_Number_Mobile: case PBK_Number_Fax: case PBK_Number_Pager: case PBK_Number_Other: case PBK_Number_Messaging: case PBK_Number_Video: case PBK_Text_Note: case PBK_Text_Postal: case PBK_Text_Email: case PBK_Text_Email2: case PBK_Text_URL: case PBK_Text_LUID: case PBK_Text_Name: case PBK_Text_LastName: case PBK_Text_FirstName: case PBK_Text_SecondName: case PBK_Text_FormalName: case PBK_Text_NamePrefix: case PBK_Text_NameSuffix: case PBK_Text_NickName: case PBK_Text_Company: case PBK_Text_JobTitle: case PBK_Text_StreetAddress: case PBK_Text_City: case PBK_Text_State: case PBK_Text_Zip: case PBK_Text_Country: case PBK_Text_Custom1: case PBK_Text_Custom2: case PBK_Text_Custom3: case PBK_Text_Custom4: case PBK_Text_UserID: case PBK_Text_PictureName: case PBK_PushToTalkID: case PBK_Text_VOIP: case PBK_Text_SWIS: case PBK_Text_WVID: case PBK_Text_SIP: case PBK_Text_DTMF: test_result(mywstrncmp(pbk.Entries[i].Text, backup.PhonePhonebook[0]->Entries[i].Text, 0) == TRUE); break; case PBK_Photo: test_result((pbk.Entries[i].Picture.Length == backup.PhonePhonebook[0]->Entries[i].Picture.Length) && memcmp(pbk.Entries[i].Picture.Buffer, backup.PhonePhonebook[0]->Entries[i].Picture.Buffer, pbk.Entries[i].Picture.Length) == 0); free(pbk.Entries[i].Picture.Buffer); break; case PBK_Date: case PBK_LastModified: break; case PBK_Category: case PBK_Private: case PBK_RingtoneID: case PBK_PictureID: case PBK_CallLength: case PBK_Caller_Group: test_result(pbk.Entries[i].Number == backup.PhonePhonebook[0]->Entries[i].Number); break; } } error = PrintMemoryEntry(&pbk, NULL); gammu_test_result(error, "PrintMemoryEntry"); /* Free data */ GSM_FreeBackup(&backup); /* We're done */ return 0; }
void DoBackup(int argc, char *argv[]) { GSM_Error error = ERR_NONE; int i, used; GSM_ToDoEntry ToDo; GSM_ToDoStatus ToDoStatus; 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; gboolean DoBackupPart; char buffer[GSM_MAX_INFO_LENGTH]; if (argc == 4 && strcasecmp(argv[3],"-yes") == 0) always_answer_yes = TRUE; GSM_ClearBackup(&Backup); GSM_GetBackupFormatFeatures(GSM_GuessBackupFormat(argv[2], FALSE),&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); fprintf(stderr, "%s\n", _("Press Ctrl+C to break...")); GSM_Init(TRUE); if (Info.UseUnicode) { Info.UseUnicode=answer_yes("%s", _("Use Unicode subformat of backup file?")); } if (Info.DateTime) { GSM_GetCurrentDateTime (&Backup.DateTime); Backup.DateTimeAvailable=TRUE; } if (Info.Model) { error=GSM_GetManufacturer(gsm, Backup.Model); Print_Error(error); strcat(Backup.Model," "); error=GSM_GetModel(gsm, buffer); strcat(Backup.Model, buffer); if (GSM_GetModelInfo(gsm)->model[0]!=0) { strcat(Backup.Model," ("); strcat(Backup.Model,GSM_GetModelInfo(gsm)->model); strcat(Backup.Model,")"); } strcat(Backup.Model," "); error=GSM_GetFirmware(gsm, buffer, NULL, NULL); strcat(Backup.Model,buffer); } if (Info.IMEI) { error=GSM_GetIMEI(gsm, Backup.IMEI); if (error != ERR_NOTSUPPORTED) { Print_Error(error); } else { Backup.IMEI[0] = 0; } } printf("\n"); if (Info.PhonePhonebook) { printf("%s\n", _("Checking phone phonebook")); ReadPhonebook(Backup.PhonePhonebook, MEM_ME, _("Backup phone phonebook?"), GSM_BACKUP_MAX_PHONEPHONEBOOK); } if (Info.SIMPhonebook) { printf("%s\n", _("Checking SIM phonebook")); ReadPhonebook(Backup.SIMPhonebook, MEM_SM, _("Backup SIM phonebook?"), GSM_BACKUP_MAX_SIMPHONEBOOK); } DoBackupPart = FALSE; if (Info.Calendar) { printf("%s\n", _("Checking phone calendar")); Calendar.Location = 0; error=GSM_GetNextCalendar(gsm,&Calendar,TRUE); if (error==ERR_NONE) { if (answer_yes(" %s", _("Backup phone calendar notes?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_MAXCALENDARTODONOTES"); printf("\n"); break; } *Backup.Calendar[used]=Calendar; used ++; error=GSM_GetNextCalendar(gsm,&Calendar,FALSE); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.ToDo) { printf("%s\n", _("Checking phone todos")); error=GSM_GetToDoStatus(gsm,&ToDoStatus); if (error == ERR_NONE && ToDoStatus.Used != 0) { if (answer_yes(" %s", _("Backup phone todos?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; ToDo.Location = 0; error=GSM_GetNextToDo(gsm,&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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_MAXCALENDARTODONOTES"); printf("\n"); break; } *Backup.ToDo[used]=ToDo; used ++; error=GSM_GetNextToDo(gsm,&ToDo,FALSE); fprintf(stderr, "\r "); fprintf(stderr, "%s ", _("Reading:")); fprintf(stderr, _("%i percent"), used * 100 / ToDoStatus.Used); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); } DoBackupPart = FALSE; if (Info.Note) { printf("%s\n", _("Checking phone notes")); Note.Location = 0; error=GSM_GetNextNote(gsm,&Note,TRUE); if (error==ERR_NONE) { if (answer_yes(" %s", _("Backup phone notes?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_NOTE"); printf("\n"); break; } *Backup.Note[used]=Note; used ++; error=GSM_GetNextNote(gsm,&Note,FALSE); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.CallerLogos) { printf("%s\n", _("Checking phone caller logos")); Bitmap.Type = GSM_CallerGroupLogo; Bitmap.Location = 1; error=GSM_GetBitmap(gsm,&Bitmap); if (error == ERR_NONE) { if (answer_yes(" %s", _("Backup phone caller groups and logos?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { fprintf(stderr, LISTFORMAT, _("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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_CALLER"); printf("\n"); break; } *Backup.CallerLogos[used] = Bitmap; used ++; Bitmap.Location = used + 1; error=GSM_GetBitmap(gsm,&Bitmap); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.SMSC) { printf("%s\n", _("Checking SIM SMS profiles")); if (answer_yes(" %s", _("Backup SIM SMS profiles?"))) DoBackupPart = TRUE; } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("Reading")); while (TRUE) { SMSC.Location = used + 1; error = GSM_GetSMSC(gsm,&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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_SMSC"); printf("\n"); break; } *Backup.SMSC[used]=SMSC; used++; fprintf(stderr, "*"); } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.StartupLogo) { printf("%s\n", _("Checking phone startup text")); Bitmap.Type = GSM_WelcomeNote_Text; error = GSM_GetBitmap(gsm,&Bitmap); if (error == ERR_NONE) { if (answer_yes(" %s", _("Backup phone startup logo/text?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { 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 = GSM_GetBitmap(gsm,&Bitmap); if (error == ERR_NONE) *Backup.StartupLogo = Bitmap; } } DoBackupPart = FALSE; if (Info.OperatorLogo) { printf("%s\n", _("Checking phone operator logo")); Bitmap.Type = GSM_OperatorLogo; error=GSM_GetBitmap(gsm,&Bitmap); if (error == ERR_NONE) { if (strcmp(Bitmap.NetworkCode,"000 00")!=0) { if (answer_yes(" %s", _("Backup phone operator logo?"))) DoBackupPart = TRUE; } } } if (DoBackupPart) { Backup.OperatorLogo = malloc(sizeof(GSM_Bitmap)); if (Backup.OperatorLogo == NULL) Print_Error(ERR_MOREMEMORY); *Backup.OperatorLogo = Bitmap; } DoBackupPart = FALSE; if (Info.WAPBookmark) { printf("%s\n", _("Checking phone WAP bookmarks")); Bookmark.Location = 1; error=GSM_GetWAPBookmark(gsm,&Bookmark); if (error==ERR_NONE) { if (answer_yes(" %s", _("Backup phone WAP bookmarks?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("Reading")); error = ERR_NONE; 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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_WAPBOOKMARK"); printf("\n"); break; } *Backup.WAPBookmark[used]=Bookmark; used ++; Bookmark.Location = used+1; error=GSM_GetWAPBookmark(gsm,&Bookmark); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.WAPSettings) { printf("%s\n", _("Checking phone WAP settings")); Settings.Location = 1; error=GSM_GetWAPSettings(gsm,&Settings); if (error==ERR_NONE) { if (answer_yes(" %s", _("Backup phone WAP settings?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("Reading")); error = ERR_NONE; 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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_WAPSETTINGS"); printf("\n"); break; } *Backup.WAPSettings[used]=Settings; used ++; Settings.Location = used+1; error=GSM_GetWAPSettings(gsm,&Settings); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.MMSSettings) { printf("%s\n", _("Checking phone MMS settings")); Settings.Location = 1; error=GSM_GetMMSSettings(gsm,&Settings); if (error==ERR_NONE) { if (answer_yes(" %s", _("Backup phone MMS settings?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("Reading")); error = ERR_NONE; 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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_MMSSETTINGS"); printf("\n"); break; } *Backup.MMSSettings[used]=Settings; used ++; Settings.Location = used+1; error=GSM_GetMMSSettings(gsm,&Settings); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.ChatSettings) { printf("%s\n", _("Checking phone Chat settings")); Chat.Location = 1; error=GSM_GetChatSettings(gsm,&Chat); if (error==ERR_NONE) { if (answer_yes(" %s", _("Backup phone Chat settings?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("Reading")); error = ERR_NONE; 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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_CHATSETTINGS"); printf("\n"); break; } *Backup.ChatSettings[used]=Chat; used ++; Chat.Location = used+1; error=GSM_GetChatSettings(gsm,&Chat); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.SyncMLSettings) { printf("%s\n", _("Checking phone SyncML settings")); SyncML.Location = 1; error=GSM_GetSyncMLSettings(gsm,&SyncML); if (error==ERR_NONE) { if (answer_yes(" %s", _("Backup phone SyncML settings?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_SYNCMLSETTINGS"); printf("\n"); break; } *Backup.SyncMLSettings[used]=SyncML; used ++; SyncML.Location = used+1; error=GSM_GetSyncMLSettings(gsm,&SyncML); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.Ringtone) { printf("%s\n", _("Checking phone user ringtones")); Ringtone.Location = 1; Ringtone.Format = 0; error=GSM_GetRingtone(gsm,&Ringtone,FALSE); if (error==ERR_EMPTY || error == ERR_NONE) { if (answer_yes(" %s", _("Backup phone user ringtones?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; i = 1; fprintf(stderr, LISTFORMAT, _("Reading")); error = ERR_NONE; 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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_RINGTONES"); printf("\n"); break; } *Backup.Ringtone[used]=Ringtone; used ++; } i++; Ringtone.Location = i; Ringtone.Format = 0; error=GSM_GetRingtone(gsm,&Ringtone,FALSE); fprintf(stderr, "*"); if (gshutdown) { GSM_Terminate(); Terminate(4); } } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.Profiles) { printf("%s\n", _("Checking phone profiles")); Profile.Location = 1; error = GSM_GetProfile(gsm,&Profile); if (error == ERR_NONE) { if (answer_yes(" %s", _("Backup phone profiles?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; fprintf(stderr, LISTFORMAT, _("Reading")); while (TRUE) { Profile.Location = used + 1; error = GSM_GetProfile(gsm,&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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_PROFILES"); printf("\n"); break; } *Backup.Profiles[used]=Profile; used++; fprintf(stderr, "*"); } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.FMStation) { printf("%s\n", _("Checking phone FM radio stations")); FMStation.Location = 1; error = GSM_GetFMStation(gsm,&FMStation); if (error == ERR_NONE || error == ERR_EMPTY) { if (answer_yes(" %s", _("Backup phone FM radio stations?"))) DoBackupPart=TRUE; } } if (DoBackupPart) { used = 0; i = 1; fprintf(stderr, LISTFORMAT, _("Reading")); error = ERR_NONE; while (error == ERR_NONE || error == ERR_EMPTY) { error = GSM_GetFMStation(gsm,&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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_FMSTATIONS"); printf("\n"); break; } *Backup.FMStation[used]=FMStation; used++; } i++; FMStation.Location = i; fprintf(stderr, "*"); } fprintf(stderr, "\n"); fflush(stderr); } DoBackupPart = FALSE; if (Info.GPRSPoint) { printf("%s\n", _("Checking phone GPRS access points")); GPRSPoint.Location = 1; error = GSM_GetGPRSAccessPoint(gsm,&GPRSPoint); if (error == ERR_NONE || error == ERR_EMPTY) { if (answer_yes(" %s", _("Backup phone GPRS access points?"))) DoBackupPart = TRUE; } } if (DoBackupPart) { used = 0; i = 1; fprintf(stderr, LISTFORMAT, _("Reading")); error = ERR_NONE; while (error == ERR_NONE || error == ERR_EMPTY) { error = GSM_GetGPRSAccessPoint(gsm,&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 { printf("\n "); printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_GPRSPOINT"); printf("\n"); break; } *Backup.GPRSPoint[used]=GPRSPoint; used++; } i++; GPRSPoint.Location = i; fprintf(stderr, "*"); } fprintf(stderr, "\n"); fflush(stderr); } GSM_Terminate(); GSM_SaveBackupFile(argv[2], &Backup, GSM_GuessBackupFormat(argv[2], Info.UseUnicode)); GSM_FreeBackup(&Backup); }
int BackupFromPython(PyObject * dict, GSM_Backup * backup) { PyObject *o; PyObject *x; Py_ssize_t len; Py_ssize_t i; char *s; if (!PyDict_Check(dict)) { PyErr_SetString(PyExc_ValueError, "Backup is not a dictionary!"); return 0; } GSM_ClearBackup(backup); backup->IMEI[0] = 0; s = GetCharFromDict(dict, "IMEI"); if (s == 0) { PyErr_Clear(); } else { len = strlen(s); if (len > GSM_MAX_IMEI_LENGTH - 1) { len = GSM_MAX_IMEI_LENGTH - 1; } strncat(backup->IMEI, s, len); free(s); } backup->Model[0] = 0; s = GetCharFromDict(dict, "Model"); if (s == 0) { PyErr_Clear(); } else { len = strlen(s); if (len > GSM_MAX_MODEL_LENGTH + GSM_MAX_VERSION_LENGTH - 1) { len = GSM_MAX_MODEL_LENGTH + GSM_MAX_VERSION_LENGTH - 1; } strncat(backup->Model, s, len); free(s); } backup->Creator[0] = 0; s = GetCharFromDict(dict, "Creator"); if (s == 0) { PyErr_Clear(); strcpy(backup->Creator, "python-gammu " GAMMU_VERSION); } else { len = strlen(s); if (len > 50 - 1) len = 50 - 1; mystrncpy(backup->Creator, s, len); free(s); } GET_ONE("PhonePhonebook", PhonePhonebook, GSM_BACKUP_MAX_PHONEPHONEBOOK, GSM_MemoryEntry, MemoryEntryFromPython(x, backup->PhonePhonebook[i], 1)); GET_ONE("SIMPhonebook", SIMPhonebook, GSM_BACKUP_MAX_SIMPHONEBOOK, GSM_MemoryEntry, MemoryEntryFromPython(x, backup->SIMPhonebook[i], 1)); GET_ONE("ToDo", ToDo, GSM_MAXCALENDARTODONOTES, GSM_ToDoEntry, TodoFromPython(x, backup->ToDo[i], 1)); GET_ONE("Calendar", Calendar, GSM_MAXCALENDARTODONOTES, GSM_CalendarEntry, CalendarFromPython(x, backup->Calendar[i], 1)); return 1; }