GSM_Error DUMMY_SetSMS(GSM_StateMachine *s, GSM_SMSMessage *sms) { char *filename=NULL; GSM_Error error; GSM_SMS_Backup *Backup; Backup = malloc(sizeof(GSM_SMS_Backup)); if (Backup == NULL) { return ERR_MOREMEMORY; } error = DUMMY_DeleteSMS(s, sms); if (error != ERR_EMPTY && error != ERR_NONE) { free(Backup); return error; } filename = DUMMY_GetSMSPath(s, sms); Backup->SMS[0] = sms; Backup->SMS[1] = NULL; error = GSM_AddSMSBackupFile(filename, Backup); free(filename); free(Backup); filename=NULL; return error; }
/* Save SMS from phone (called Inbox sms - it's in phone Inbox) somewhere */ static GSM_Error SMSDFiles_SaveInboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char **Locations) { GSM_Error error = ERR_NONE; int i, j; unsigned char FileName[100], FullName[400], ext[4], buffer[64], buffer2[400]; gboolean done; FILE *file; size_t locations_size = 0, locations_pos = 0; #ifdef GSM_ENABLE_BACKUP GSM_SMS_Backup backup; #endif *Locations = NULL; j = 0; done = FALSE; for (i = 0; i < sms->Number && !done; i++) { strcpy(ext, "txt"); if (sms->SMS[i].Coding == SMS_Coding_8bit) strcpy(ext, "bin"); DecodeUnicode(sms->SMS[i].Number, buffer2); /* we loop on yy for the first SMS assuming that if xxxx_yy_00.ext is absent, any xxxx_yy_01,02, must be garbage, that can be overwritten */ file = NULL; do { sprintf(FileName, "IN%02d%02d%02d_%02d%02d%02d_%02i_%s_%02i.%s", sms->SMS[i].DateTime.Year, sms->SMS[i].DateTime.Month, sms->SMS[i].DateTime.Day, sms->SMS[i].DateTime.Hour, sms->SMS[i].DateTime.Minute, sms->SMS[i].DateTime.Second, j, buffer2, i, ext); strcpy(FullName, Config->inboxpath); strcat(FullName, FileName); if (file) fclose(file); file = fopen(FullName, "r"); } while ((i == 0) && file != NULL && (++j < 100)); if (file) { fclose(file); if (i == 0) { SMSD_Log(DEBUG_ERROR, Config, "Cannot save %s. No available file names", FileName); return ERR_CANTOPENFILE; } } errno = 0; if ((sms->SMS[i].PDU == SMS_Status_Report) && strcasecmp(Config->deliveryreport, "log") == 0) { strcpy(buffer, DecodeUnicodeString(sms->SMS[i].Number)); SMSD_Log(DEBUG_NOTICE, Config, "Delivery report: %s to %s, message reference 0x%02x", DecodeUnicodeString(sms->SMS[i].Text), buffer, sms->SMS[i].MessageReference); } else { if (locations_pos + strlen(FileName) + 2 >= locations_size) { locations_size += strlen(FileName) + 30; *Locations = (char *)realloc(*Locations, locations_size); assert(*Locations != NULL); if (locations_pos == 0) { *Locations[0] = 0; } } strcat(*Locations, FileName); strcat(*Locations, " "); locations_pos += strlen(FileName) + 1; if (strcasecmp(Config->inboxformat, "detail") == 0) { #ifndef GSM_ENABLE_BACKUP SMSD_Log(DEBUG_ERROR, Config, "Saving in detail format not compiled in!"); #else for (j = 0; j < sms->Number; j++) { backup.SMS[j] = &sms->SMS[j]; } backup.SMS[sms->Number] = NULL; error = GSM_AddSMSBackupFile(FullName, &backup); done = TRUE; #endif } else { file = fopen(FullName, "wb"); if (file == NULL) { SMSD_LogErrno(Config, "Cannot save file!"); return ERR_CANTOPENFILE; } switch (sms->SMS[i].Coding) { case SMS_Coding_Unicode_No_Compression: case SMS_Coding_Default_No_Compression: DecodeUnicode(sms->SMS[i].Text, buffer2); if (strcasecmp(Config->inboxformat, "unicode") == 0) { buffer[0] = 0xFE; buffer[1] = 0xFF; chk_fwrite(buffer, 1, 2, file); chk_fwrite(sms->SMS[i].Text, 1, strlen(buffer2) * 2, file); } else { chk_fwrite(buffer2, 1, strlen(buffer2), file); } break; case SMS_Coding_8bit: chk_fwrite(sms->SMS[i].Text, 1, (size_t) sms->SMS[i].Length, file); default: break; } fclose(file); } if (error != ERR_NONE) { return error; } SMSD_Log(DEBUG_INFO, Config, "%s %s", (sms->SMS[i].PDU == SMS_Status_Report ? "Delivery report" : "Received"), FileName); } } return ERR_NONE; fail: return ERR_WRITING_FILE; }
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(); }
int main(int argc, char **argv) { GSM_Debug_Info *debug_info; GSM_Phone_ATGENData *Priv; GSM_Phone_Data *Data; unsigned char buffer[BUFFER_SIZE]; FILE *f; size_t len; GSM_StateMachine *s; GSM_Protocol_Message msg; GSM_Error error; GSM_MultiSMSMessage sms; GSM_SMSDConfig *smsd; #if 0 GSM_SMS_Backup bkp; #endif /* Check parameters */ if (argc != 2 && argc != 3) { printf("Not enough parameters!\nUsage: sms-at-parse comm.dump [PDU|TXT|TXTDETAIL]\n"); return 1; } /* Open file */ f = fopen(argv[1], "r"); if (f == NULL) { printf("Could not open %s\n", argv[1]); return 1; } /* Read data */ len = fread(buffer, 1, sizeof(buffer) - 1, f); if (!feof(f)) { printf("Could not read whole file %s\n", argv[1]); fclose(f); return 1; } smsd = SMSD_NewConfig("test"); /* Zero terminate data */ buffer[len] = 0; /* Close file */ fclose(f); /* Configure state machine */ debug_info = GSM_GetGlobalDebug(); GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info); GSM_SetDebugLevel("textall", debug_info); /* Allocates state machine */ s = GSM_AllocStateMachine(); test_result(s != NULL); debug_info = GSM_GetDebug(s); GSM_SetDebugGlobal(TRUE, debug_info); /* Initialize AT engine */ Data = &s->Phone.Data; Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL); Priv = &s->Phone.Data.Priv.ATGEN; Priv->ReplyState = AT_Reply_OK; Priv->Charset = AT_CHARSET_GSM; if (argc == 3 && strcmp(argv[2], "TXT") == 0) { Priv->SMSMode = SMS_AT_TXT; Priv->SMSTextDetails = FALSE; } else if (argc == 3 && strcmp(argv[2], "TXTDETAIL") == 0) { Priv->SMSMode = SMS_AT_TXT; Priv->SMSTextDetails = TRUE; } else { Priv->SMSMode = SMS_AT_PDU; } /* Init message */ msg.Type = 0; msg.Length = len; msg.Buffer = buffer; SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE); /* Pointer to store message */ s->Phone.Data.GetSMSMessage = &sms; /* Parse it */ error = ATGEN_ReplyGetSMSMessage(&msg, s); sms.SMS[0].Memory = MEM_SM; #if 0 bkp.SMS[0] = &sms.SMS[0]; bkp.SMS[1] = NULL; GSM_AddSMSBackupFile("/tmp/back", &bkp); #endif /* Display message */ if (error == ERR_NONE) { DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL); DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL); printf("Parts: %d, count: %d, ID16: %d, ID8: %d\n", sms.SMS[0].UDH.AllParts, sms.Number, sms.SMS[0].UDH.ID16bit, sms.SMS[0].UDH.ID8bit); SMSD_RunOnReceiveEnvironment(&sms, smsd, "1"); } /* This is normally done by ATGEN_Terminate */ FreeLines(&Priv->Lines); GetLineString(NULL, NULL, 0); /* Free state machine */ GSM_FreeStateMachine(s); gammu_test_result(error, "ATGEN_ReplyGetSMSMessage"); return 0; }