/** * @name for_each_message: */ boolean_t for_each_message(gammu_state_t *s, message_iterate_fn_t fn, void *x) { boolean_t rv = FALSE; boolean_t start = TRUE; multimessage_t *sms = allocate(sizeof(*sms)); for (;;) { int err = GSM_GetNextSMS(s->sm, sms, start); if (err == ERR_EMPTY) { rv = TRUE; break; } if (err != ERR_NONE) { break; } rv = TRUE; if (!fn(s, sms, start, x)) { break; } start = FALSE; } free(sms); return rv; }
void BackupSMS(int argc UNUSED, char *argv[]) { GSM_Error error; GSM_SMS_Backup *Backup; GSM_MultiSMSMessage *sms; GSM_SMSFolders folders; gboolean BackupFromFolder[GSM_MAX_SMS_FOLDERS]; gboolean start = TRUE; gboolean DeleteAfter = FALSE, askdelete = TRUE; int j, smsnum = 0; sms = malloc(sizeof(GSM_MultiSMSMessage)); if (sms == NULL) { return; } Backup = malloc(sizeof(GSM_SMS_Backup)); if (Backup == NULL) { free(sms); return; } if (argc == 4) { if (strcasecmp(argv[3],"-yes") == 0) { always_answer_yes = TRUE; } if (strcasecmp(argv[3],"-all") == 0) { always_answer_yes = TRUE; askdelete = FALSE; DeleteAfter = FALSE; } } GSM_Init(TRUE); Backup->SMS[0] = NULL; sms->SMS[0].Location = 0; sms->Number = 0; error=GSM_GetSMSFolders(gsm, &folders); Print_Error(error); if (askdelete) { DeleteAfter = answer_yes("%s", _("Delete each sms after backup?")); } for (j=0;j<folders.Number;j++) { BackupFromFolder[j] = FALSE; if (answer_yes(_("Backup sms from folder \"%s\"%s?"), DecodeUnicodeConsole(folders.Folder[j].Name), folders.Folder[j].Memory == MEM_SM ? _(" (SIM)") : "" )) BackupFromFolder[j] = TRUE; } while (error == ERR_NONE) { sms->SMS[0].Folder=0x00; error=GSM_GetNextSMS(gsm, sms, start); switch (error) { case ERR_EMPTY: break; default: Print_Error(error); for (j=0;j<sms->Number;j++) { if (BackupFromFolder[sms->SMS[j].Folder-1]) { switch (sms->SMS[j].PDU) { case SMS_Status_Report: break; case SMS_Submit: case SMS_Deliver: if (sms->SMS[j].Length == 0) break; if (smsnum < GSM_BACKUP_MAX_SMS) { Backup->SMS[smsnum] = malloc(sizeof(GSM_SMSMessage)); if (Backup->SMS[smsnum] == NULL) Print_Error(ERR_MOREMEMORY); Backup->SMS[smsnum + 1] = NULL; } else { printf(_(" Increase %s\n") , "GSM_BACKUP_MAX_SMS"); GSM_Terminate(); Terminate(1); } *(Backup->SMS[smsnum]) = sms->SMS[j]; smsnum++; break; } } } } start=FALSE; } error = GSM_AddSMSBackupFile(argv[2], Backup); Print_Error(error); if (DeleteAfter) { for (j=0;j<smsnum;j++) { Backup->SMS[j]->Folder = 0; error=GSM_DeleteSMS(gsm, Backup->SMS[j]); Print_Error(error); fprintf(stderr, "\r"); fprintf(stderr, "%s ", _("Deleting:")); fprintf(stderr, _("%i percent"), (j + 1) * 100 / smsnum); } } GSM_FreeSMSBackup(Backup); free(Backup); free(sms); GSM_Terminate(); }