/** * @name gammu_create_if_necessary: */ gammu_state_t *gammu_create_if_necessary(gammu_state_t **sp) { if (*sp != NULL) { return *sp; } gammu_state_t *rv = gammu_create(app.gammu_configuration_path); if (!rv) { return NULL; } if (app.verbose) { /* Enable global debugging to stderr */ GSM_Debug_Info *debug_info = GSM_GetGlobalDebug(); GSM_SetDebugFileDescriptor(stderr, TRUE, debug_info); GSM_SetDebugLevel("textall", debug_info); /* Enable state machine debugging to stderr */ debug_info = GSM_GetDebug(rv->sm); GSM_SetDebugGlobal(FALSE, debug_info); GSM_SetDebugFileDescriptor(stderr, TRUE, debug_info); GSM_SetDebugLevel("textall", debug_info); } *sp = rv; return rv; }
void single_check(const char *device, const char *connection, const char *model, GSM_Error expected) { GSM_Config *smcfg; GSM_Error error; GSM_Debug_Info *debug_info; /* Allocates state machine */ s = GSM_AllocStateMachine(); test_result(s != NULL); debug_info = GSM_GetDebug(s); GSM_SetDebugGlobal(TRUE, debug_info); smcfg = GSM_GetConfig(s, 0); strcpy(smcfg->Model, model); smcfg->Device = strdup(device); smcfg->UseGlobalDebugFile = TRUE; smcfg->Connection = strdup(connection); smcfg->PhoneFeatures[0] = F_PBK_ENCODENUMBER; smcfg->PhoneFeatures[1] = 0; GSM_SetConfigNum(s, 1); error = GSM_InitConnection(s, 1); test_result(error == expected); /* Free state machine */ GSM_FreeStateMachine(s); }
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_NetworkInfo NetworkInfo; /* Check parameters */ if (argc != 2) { printf("Not enough parameters!\nUsage: at-creg-reply comm.dump\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; } /* 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); Data->NetworkInfo = &NetworkInfo; Data->RequestID = ID_GetNetworkInfo; Priv = &s->Phone.Data.Priv.ATGEN; Priv->ReplyState = AT_Reply_OK; Priv->SMSMode = SMS_AT_PDU; Priv->Charset = AT_CHARSET_UCS2; /* Init message */ msg.Type = 0; msg.Length = len; msg.Buffer = buffer; SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE); /* Parse it */ error = ATGEN_ReplyGetNetworkLAC_CID(msg, s); /* 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_ReplyGetCNMIMode"); printf("Network: %d\nLAC: %s\nCID: %s\n", NetworkInfo.State, NetworkInfo.LAC, NetworkInfo.CID); return 0; }
{ GSM_Debug_Info *debug_info; GSM_StateMachine *s; GSM_Protocol_Message msg; GSM_Error error; GSM_MultiSMSMessage sms; 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); GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info); GSM_SetDebugLevel("textall", debug_info); s->Phone.Data.ModelInfo = GetModelData(NULL, NULL, "unknown", NULL); /* Init message */ msg.Type = 0x14; msg.Length = sizeof(data); msg.Buffer = data; s->Phone.Data.GetSMSMessage = &sms; sms.SMS[0].Memory = MEM_ME; /* Parse it */
/* Find one multi SMS to sending and return it (or return ERR_EMPTY) * There is also set ID for SMS * File extension convention: * OUTxxxxx.txt : normal text SMS * Options appended to the extension applying to this SMS only: * d: delivery report requested * f: flash SMS * b: WAP bookmark as name,URL * e.g. OUTG20040620_193810_123_+4512345678_xpq.txtdf * is a flash text SMS requesting delivery reports */ static GSM_Error SMSDFiles_FindOutboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char *ID) { GSM_MultiPartSMSInfo SMSInfo; GSM_WAPBookmark Bookmark; char FileName[100], FullName[400]; unsigned char Buffer[(GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS + 1) * 2]; unsigned char Buffer2[(GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS + 1) * 2]; FILE *File; int i, len, phlen; char *pos1, *pos2, *options = NULL; gboolean backup = FALSE; #ifdef GSM_ENABLE_BACKUP GSM_SMS_Backup smsbackup; GSM_Error error; #endif #ifdef WIN32 struct _finddata_t c_file; intptr_t hFile; strcpy(FullName, Config->outboxpath); strcat(FullName, "OUT*.txt*"); hFile = _findfirst(FullName, &c_file); if (hFile == -1) { strcpy(FullName, Config->outboxpath); strcat(FullName, "OUT*.smsbackup*"); hFile = _findfirst(FullName, &c_file); backup = TRUE; } if (hFile == -1) { return ERR_EMPTY; } else { strcpy(FileName, c_file.name); } _findclose(hFile); #elif defined(HAVE_DIRBROWSING) struct dirent **namelist = NULL; int cur_file, num_files; char *pos; strcpy(FullName, Config->outboxpath); FullName[strlen(Config->outboxpath) - 1] = '\0'; num_files = scandir(FullName, &namelist, 0, alphasort); for (cur_file = 0; cur_file < num_files; cur_file++) { /* Hidden file or current/parent directory */ if (namelist[cur_file]->d_name[0] == '.') { continue; } /* We care only about files starting with out */ if (strncasecmp(namelist[cur_file]->d_name, "out", 3) != 0) { continue; } /* Check extension */ pos = strrchr(namelist[cur_file]->d_name, '.'); if (pos == NULL) { continue; } if (strncasecmp(pos, ".txt", 4) == 0) { /* We have found text file */ backup = FALSE; break; } if (strncasecmp(pos, ".smsbackup", 10) == 0) { /* We have found a SMS backup file */ backup = TRUE; break; } } /* Remember file name */ if (cur_file < num_files) { strcpy(FileName, namelist[cur_file]->d_name); } /* Free scandir result */ for (i = 0; i < num_files; i++) { free(namelist[i]); } free(namelist); namelist = NULL; /* Did we actually find something? */ if (cur_file >= num_files) { return ERR_EMPTY; } #else return ERR_NOTSUPPORTED; #endif strcpy(FullName, Config->outboxpath); strcat(FullName, FileName); if (backup) { #ifdef GSM_ENABLE_BACKUP /* Remember ID */ strcpy(ID, FileName); /* Load backup */ GSM_ClearSMSBackup(&smsbackup); error = GSM_ReadSMSBackupFile(FullName, &smsbackup); if (error != ERR_NONE) { return error; } /* Copy it to our message */ sms->Number = 0; for (i = 0; smsbackup.SMS[i] != NULL; i++) { sms->SMS[sms->Number++] = *smsbackup.SMS[i]; } /* Free memory */ GSM_FreeSMSBackup(&smsbackup); /* Set delivery report flag */ if (sms->SMS[0].PDU == SMS_Status_Report) { Config->currdeliveryreport = 1; } else { Config->currdeliveryreport = -1; } #else SMSD_Log(DEBUG_ERROR, Config, "SMS backup loading disabled at compile time!"); return ERR_DISABLED; #endif } else { options = strrchr(FileName, '.') + 4; File = fopen(FullName, "rb"); if (File == NULL) { return ERR_CANTOPENFILE; } len = fread(Buffer, 1, sizeof(Buffer) - 2, File); fclose(File); if ((len < 2) || (len >= 2 && ((Buffer[0] != 0xFF || Buffer[1] != 0xFE) && (Buffer[0] != 0xFE || Buffer[1] != 0xFF)))) { if (len > GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS) len = GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS; EncodeUnicode(Buffer2, Buffer, len); len = len * 2; memmove(Buffer, Buffer2, len); Buffer[len] = 0; Buffer[len + 1] = 0; } else { Buffer[len] = 0; Buffer[len + 1] = 0; /* Possibly convert byte order */ ReadUnicodeFile(Buffer2, Buffer); } GSM_ClearMultiPartSMSInfo(&SMSInfo); sms->Number = 0; SMSInfo.ReplaceMessage = 0; SMSInfo.Entries[0].Buffer = Buffer2; SMSInfo.Class = -1; SMSInfo.EntriesNum = 1; Config->currdeliveryreport = -1; if (strchr(options, 'd')) Config->currdeliveryreport = 1; if (strchr(options, 'f')) SMSInfo.Class = 0; /* flash SMS */ if (strcasecmp(Config->transmitformat, "unicode") == 0) { SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong; SMSInfo.UnicodeCoding = TRUE; } else if (strcasecmp(Config->transmitformat, "7bit") == 0) { SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong; SMSInfo.UnicodeCoding = FALSE; } else { /* auto */ SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong; } if (strchr(options, 'b')) { // WAP bookmark as title,URL SMSInfo.Entries[0].Buffer = NULL; SMSInfo.Entries[0].Bookmark = &Bookmark; SMSInfo.Entries[0].ID = SMS_NokiaWAPBookmarkLong; SMSInfo.Entries[0].Bookmark->Location = 0; pos2 = mywstrstr(Buffer2, "\0,"); if (pos2 == NULL) { pos2 = Buffer2; } else { *pos2 = '\0'; pos2++; *pos2 = '\0'; pos2++; // replace comma by zero } len = UnicodeLength(Buffer2); if (len > 50) { len = 50; } memmove(&SMSInfo.Entries[0].Bookmark->Title, Buffer2, len * 2); pos1 = &SMSInfo.Entries[0].Bookmark->Title[0] + len * 2; *pos1 = '\0'; pos1++; *pos1 = '\0'; len = UnicodeLength(pos2); if (len > 255) { len = 255; } memmove(&SMSInfo.Entries[0].Bookmark->Address, pos2, len * 2); pos1 = &SMSInfo.Entries[0].Bookmark->Address[0] + len * 2; *pos1 = '\0'; pos1++; *pos1 = '\0'; } GSM_EncodeMultiPartSMS(GSM_GetDebug(Config->gsm), &SMSInfo, sms); strcpy(ID, FileName); pos1 = FileName; for (i = 1; i <= 3 && pos1 != NULL; i++) { pos1 = strchr(++pos1, '_'); } if (pos1 != NULL) { /* OUT<priority><date>_<time>_<serialno>_<phone number>_<anything>.txt */ pos2 = strchr(++pos1, '_'); if (pos2 != NULL) { phlen = strlen(pos1) - strlen(pos2); } else { /* something wrong */ return ERR_UNKNOWN; } } else if (i == 2) { /* OUTxxxxxxx.txt or OUTxxxxxxx */ pos1 = &FileName[3]; pos2 = strchr(pos1, '.'); if (pos2 == NULL) { phlen = strlen(pos1); } else { phlen = strlen(pos1) - strlen(pos2); } } else if (i == 4) { /* OUT<priority>_<phone number>_<serialno>.txt */ pos1 = strchr(FileName, '_'); pos2 = strchr(++pos1, '_'); phlen = strlen(pos1) - strlen(pos2); } else { /* something wrong */ return ERR_UNKNOWN; } for (len = 0; len < sms->Number; len++) { EncodeUnicode(sms->SMS[len].Number, pos1, phlen); } } if (sms->Number != 0) { DecodeUnicode(sms->SMS[0].Number, Buffer); if (options != NULL && strchr(options, 'b')) { // WAP bookmark as title,URL SMSD_Log(DEBUG_NOTICE, Config, "Found %i sms to \"%s\" with bookmark \"%s\" cod %i lgt %i udh: t %i l %i dlr: %i fls: %i", sms->Number, Buffer, DecodeUnicodeString(SMSInfo.Entries[0].Bookmark->Address), sms->SMS[0].Coding, sms->SMS[0].Length, sms->SMS[0].UDH.Type, sms->SMS[0].UDH.Length, Config->currdeliveryreport, SMSInfo.Class); } else { SMSD_Log(DEBUG_NOTICE, Config, "Found %i sms to \"%s\" with text \"%s\" cod %i lgt %i udh: t %i l %i dlr: %i fls: %i", sms->Number, Buffer, DecodeUnicodeString(sms->SMS[0].Text), sms->SMS[0].Coding, sms->SMS[0].Length, sms->SMS[0].UDH.Type, sms->SMS[0].UDH.Length, Config->currdeliveryreport, sms->SMS[0].Class); } } else { SMSD_Log(DEBUG_NOTICE, Config, "error: SMS-count = 0"); } return ERR_NONE; }
void SaveFile(int argc, char *argv[]) { GSM_Error error; GSM_Backup Backup; int i; size_t data_size = 0; FILE *file; unsigned char Buffer[100000]; GSM_MemoryEntry *pbk; long int location; if (strcasecmp(argv[2],"CALENDAR") == 0) { if (argc < 5) { printf("%s\n", _("Where is backup filename and location?")); Terminate(2); } location = GetInt(argv[5]) - 1; error = GSM_ReadBackupFile(argv[4], &Backup,GSM_GuessBackupFormat(argv[4], FALSE)); if (error != ERR_NOTIMPLEMENTED) { Print_Error(error); } i = 0; while (Backup.Calendar[i] != NULL) { if (i == location) break; i++; } if (i != location || Backup.Calendar[i] == NULL) { printf("%s\n", _("Calendar note not found in file")); GSM_FreeBackup(&Backup); Terminate(2); } error = GSM_EncodeVCALENDAR(Buffer, sizeof(Buffer), &data_size, Backup.Calendar[i],TRUE,Nokia_VCalendar); GSM_FreeBackup(&Backup); Print_Error(error); } else if (strcasecmp(argv[2],"BOOKMARK") == 0) { if (argc < 5) { printf("%s\n", _("Where is backup filename and location?")); Terminate(2); } location = GetInt(argv[5]) - 1; error = GSM_ReadBackupFile(argv[4],&Backup,GSM_GuessBackupFormat(argv[4], FALSE)); if (error != ERR_NOTIMPLEMENTED) { Print_Error(error); } i = 0; while (Backup.WAPBookmark[i]!=NULL) { if (i == location) break; i++; } if (i != location || Backup.WAPBookmark[i] == NULL) { printf("%s\n", _("WAP bookmark not found in file")); GSM_FreeBackup(&Backup); Terminate(2); } error = GSM_EncodeURLFile(Buffer, &data_size, Backup.WAPBookmark[i]); GSM_FreeBackup(&Backup); Print_Error(error); } else if (strcasecmp(argv[2],"NOTE") == 0) { if (argc<5) { printf("%s\n", _("Where is backup filename and location?")); Terminate(2); } location = GetInt(argv[5]) - 1; error=GSM_ReadBackupFile(argv[4],&Backup,GSM_GuessBackupFormat(argv[4], FALSE)); if (error!=ERR_NOTIMPLEMENTED) Print_Error(error); i = 0; while (Backup.Note[i]!=NULL) { if (i == location) break; i++; } if (i != location || Backup.Note[i] == NULL) { printf("%s\n", _("Note not found in file")); GSM_FreeBackup(&Backup); Terminate(2); } error = GSM_EncodeVNTFile(Buffer, sizeof(Buffer), &data_size, Backup.Note[i]); GSM_FreeBackup(&Backup); Print_Error(error); } else if (strcasecmp(argv[2],"TODO") == 0) { if (argc<5) { printf("%s\n", _("Where is backup filename and location?")); Terminate(2); } location = GetInt(argv[5]) - 1; error=GSM_ReadBackupFile(argv[4],&Backup,GSM_GuessBackupFormat(argv[4], FALSE)); if (error!=ERR_NOTIMPLEMENTED) Print_Error(error); i = 0; while (Backup.ToDo[i]!=NULL) { if (i == location) break; i++; } if (i != location || Backup.ToDo[i] == NULL) { printf("%s\n", _("Todo note not found in file")); GSM_FreeBackup(&Backup); Terminate(2); } error = GSM_EncodeVTODO(Buffer, sizeof(Buffer), &data_size, Backup.ToDo[i], TRUE, Nokia_VToDo); GSM_FreeBackup(&Backup); Print_Error(error); } else if (strcasecmp(argv[2],"VCARD10") == 0 || strcasecmp(argv[2],"VCARD21") == 0) { if (argc<6) { printf("%s\n", _("Where is backup filename and location and memory type?")); Terminate(2); } location = GetInt(argv[6]) - 1; error=GSM_ReadBackupFile(argv[4],&Backup,GSM_GuessBackupFormat(argv[4], FALSE)); if (error!=ERR_NOTIMPLEMENTED) Print_Error(error); i = 0; if (strcasecmp(argv[5],"SM") == 0) { while (Backup.SIMPhonebook[i]!=NULL) { if (i == location) break; i++; } if (i != location || Backup.SIMPhonebook[i] == NULL) { printf("%s\n", _("Phonebook entry not found in file")); GSM_FreeBackup(&Backup); Terminate(2); } pbk = Backup.SIMPhonebook[i]; } else if (strcasecmp(argv[5],"ME") == 0) { while (Backup.PhonePhonebook[i]!=NULL) { if (i == location) break; i++; } if (i != location || Backup.PhonePhonebook[i] == NULL) { printf("%s\n", _("Phonebook entry not found in file")); GSM_FreeBackup(&Backup); Terminate(2); } pbk = Backup.PhonePhonebook[i]; } else { printf(_("Unknown memory type: \"%s\"\n"),argv[5]); GSM_FreeBackup(&Backup); Terminate(2); } if (strcasecmp(argv[2],"VCARD10") == 0) { error = GSM_EncodeVCARD(GSM_GetDebug(gsm), Buffer, sizeof(Buffer), &data_size, pbk, TRUE, Nokia_VCard10); GSM_FreeBackup(&Backup); Print_Error(error); } else { error = GSM_EncodeVCARD(GSM_GetDebug(gsm), Buffer, sizeof(Buffer), &data_size, pbk, TRUE, Nokia_VCard21); GSM_FreeBackup(&Backup); Print_Error(error); } } else { printf(_("Unknown backup format: \"%s\"\n"), argv[2]); Terminate(2); } file = fopen(argv[3],"wb"); if (file == NULL) { printf_err("%s", _("Error while opening file for writing!\n")); Terminate(3); } if (data_size != fwrite(Buffer,1,data_size,file)) { printf_err("%s", _("Error while writing file!\n")); } if (fclose(file) != 0) { printf_err("%s", _("Error while closing file!\n")); } }
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; }
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_SMSC SMSC; /* Check parameters */ if (argc != 2) { printf("Not enough parameters!\nUsage: get-smsc-at comm.dump\n"); return 1; } /* 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 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); GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info); GSM_SetDebugLevel("textall", 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->SMSMode = SMS_AT_PDU; Priv->Charset = AT_CHARSET_UCS2; /* 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.SMSC = &SMSC; /* Parse it */ error = ATGEN_ReplyGetSMSC(msg, s); /* This is normally done by ATGEN_Terminate */ FreeLines(&Priv->Lines); GetLineString(NULL, NULL, 0); /* Free state machine */ GSM_FreeStateMachine(s); printf("%s\n", GSM_ErrorString(error)); return (error == ERR_NONE) ? 0 : 1; }