#define _GNU_SOURCE /* For strcasestr */ #include #include #include #include #include #include #ifdef WIN32 # include #else # include #endif #include #include "locales.h" #include "formats.h" #include "printing.h" #include "string.h" #include "message-cmdline.h" #include "cmdline.h" typedef enum { COMPOSE_ANIMATION = 1, COMPOSE_BOOKMARK, COMPOSE_CALENDAR, COMPOSE_CALLER, COMPOSE_EMS, COMPOSE_MMSINDICATOR, COMPOSE_MMSSETTINGS, COMPOSE_OPERATOR, COMPOSE_PICTURE, COMPOSE_PROFILE, COMPOSE_RINGTONE, COMPOSE_SMSTEMPLATE, COMPOSE_TEXT, COMPOSE_TODO, COMPOSE_VCARD10, COMPOSE_VCARD21, COMPOSE_WAPINDICATOR, COMPOSE_WAPSETTINGS } ComposeType; typedef struct { const char *name; const ComposeType type; } ComposeMapEntry; ComposeMapEntry ComposeMap[] = { {"ANIMATION", COMPOSE_ANIMATION}, {"BOOKMARK", COMPOSE_BOOKMARK}, {"CALENDAR", COMPOSE_CALENDAR}, {"CALLER", COMPOSE_CALLER}, {"EMS", COMPOSE_EMS}, {"MMSINDICATOR", COMPOSE_MMSINDICATOR}, {"MMSSETTINGS", COMPOSE_MMSSETTINGS}, {"OPERATOR", COMPOSE_OPERATOR}, {"PICTURE", COMPOSE_PICTURE}, {"PROFILE", COMPOSE_PROFILE}, {"RINGTONE", COMPOSE_RINGTONE}, {"SMSTEMPLATE", COMPOSE_SMSTEMPLATE}, {"TEXT", COMPOSE_TEXT}, {"TODO", COMPOSE_TODO}, {"VCARD10", COMPOSE_VCARD10}, {"VCARD21", COMPOSE_VCARD21}, {"WAPINDICATOR", COMPOSE_WAPINDICATOR}, {"WAPSETTINGS", COMPOSE_WAPSETTINGS}, {NULL, 0} }; #define BMP_AUTO_ALLOC(n) \ if (bitmap[n] == NULL) { \ bitmap[n] = (GSM_MultiBitmap *)malloc(sizeof(GSM_MultiBitmap)); \ if (bitmap[n] == NULL) { \ error = ERR_MOREMEMORY; \ goto end_compose; \ } \ memset(bitmap[n], 0, sizeof(GSM_MultiBitmap)); \ } #define RNG_AUTO_ALLOC(n) \ if (ringtone[n] == NULL) { \ ringtone[n] = (GSM_Ringtone *)malloc(sizeof(GSM_Ringtone)); \ if (ringtone[n] == NULL) { \ error = ERR_MOREMEMORY; \ goto end_compose; \ } \ memset(ringtone[n], 0, sizeof(GSM_Ringtone)); \ } #define SEND_SAVE_SMS_BUFFER_SIZE 10000 GSM_Error CreateMessage(GSM_Message_Type *type, GSM_MultiSMSMessage *sms, int argc, int typearg, char *argv[], GSM_StateMachine *sm) { /** * Whether SMSC is set manually (0) or should be read from phone. */ int SMSCSet = 1; int startarg; GSM_Error error; #ifdef GSM_ENABLE_BACKUP GSM_Backup Backup; #endif int i,j,z,FramesNum = 0; int Protected = 0; GSM_Ringtone *ringtone[GSM_MAX_MULTI_SMS]; GSM_MultiBitmap *bitmap[GSM_MAX_MULTI_SMS]; GSM_MultiBitmap bitmap2; GSM_MultiPartSMSInfo SMSInfo; GSM_NetworkInfo NetInfo; GSM_MMSIndicator MMSInfo; FILE *ReplaceFileHadle,*f; unsigned char ReplaceBuffer2 [200],ReplaceBuffer[200]; char InputBuffer [SEND_SAVE_SMS_BUFFER_SIZE/2+1]; unsigned char Buffer [GSM_MAX_MULTI_SMS][SEND_SAVE_SMS_BUFFER_SIZE]; int chars_read = 0; int nextlong = 0; gboolean ReplyViaSameSMSC = FALSE; int MaxSMS = -1; gboolean EMS16Bit = FALSE; int frames_num; int param_value; /* Parameters required only during saving */ int Folder = 1; /*Inbox by default */ GSM_SMS_State State = SMS_Sent; /* Required only during sending */ GSM_SMSValidity Validity; GSM_SMSC PhoneSMSC; gboolean DeliveryReport = FALSE; /* Whether we already got text for TEXT message */ gboolean HasText = FALSE; ComposeType compose_type = 0; /** * Recipient or sender. */ unsigned char RemoteNumber[(GSM_MAX_NUMBER_LENGTH + 1) * 2]; /** * Name of message. */ unsigned char Name[(GSM_MAX_SMS_NAME_LENGTH + 1) * 2]; /** * SMSC to use for message. */ unsigned char SMSC[(GSM_MAX_NUMBER_LENGTH + 1) * 2]; /* Some defaults */ Name[0] = 0; Name[1] = 0; SMSC[0] = 0; SMSC[1] = 0; ReplaceBuffer[0] = 0; ReplaceBuffer[1] = 0; for (i = 0; i < GSM_MAX_MULTI_SMS; i++) { ringtone[i] = NULL; bitmap[i] = NULL; } #ifdef GSM_ENABLE_BACKUP GSM_ClearBackup(&Backup); #endif EncodeUnicode(RemoteNumber, "Gammu", 5); GSM_ClearMultiPartSMSInfo(&SMSInfo); SMSInfo.ReplaceMessage = 0; SMSInfo.EntriesNum = 1; Validity.Format = 0; Validity.Relative = 0; if (*type == SMS_Save) { startarg = typearg + 1; } else { /* When not saving SMS, recipient has to be specified */ if (typearg + 1 >= argc) { printf("%s\n", _("Not enough parameters!")); exit(-1); } EncodeUnicode(RemoteNumber, argv[typearg + 1], strlen(argv[typearg + 1])); startarg = typearg + 2; } if (*type == SMS_SMSD || *type == SMS_Display) { /* * We don't care about SMSC number here, SMSD handles this * itself and for displaying we don't really need a SMSC * number. */ SMSCSet = 0; } for (i = 0; ComposeMap[i].type != 0; i++) { if (strcasecmp(argv[typearg], ComposeMap[i].name) == 0) { compose_type = ComposeMap[i].type; break; } } if (compose_type == 0) { printf(_("What format of sms (\"%s\") ?\n"),argv[typearg]); exit(-1); } switch (compose_type) { case COMPOSE_TEXT: /* Text is fed to the buffer later! */ SMSInfo.Entries[0].Buffer = Buffer[0]; SMSInfo.Entries[0].ID = SMS_Text; SMSInfo.UnicodeCoding = FALSE; break; case COMPOSE_SMSTEMPLATE: SMSInfo.UnicodeCoding = FALSE; SMSInfo.EntriesNum = 1; Buffer[0][0] = 0x00; Buffer[0][1] = 0x00; SMSInfo.Entries[0].Buffer = Buffer[0]; SMSInfo.Entries[0].ID = SMS_AlcatelSMSTemplateName; break; case COMPOSE_EMS: SMSInfo.UnicodeCoding = FALSE; SMSInfo.EntriesNum = 0; break; case COMPOSE_MMSINDICATOR: if (argc < 3 + startarg) { printf("%s\n", _("Where are parameters?")); exit(-1); } SMSInfo.Entries[0].ID = SMS_MMSIndicatorLong; SMSInfo.Entries[0].MMSIndicator = &MMSInfo; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber,"MMS Info",8); } strcpy(MMSInfo.Address, argv[0 + startarg]); strcpy(MMSInfo.Title, argv[1 + startarg]); strcpy(MMSInfo.Sender, argv[2 + startarg]); MMSInfo.Class = GSM_MMS_Auto; MMSInfo.MessageSize = 0; startarg += 3; break; case COMPOSE_WAPINDICATOR: if (argc < 2 + startarg) { printf("%s\n", _("Where are parameters?")); exit(-1); } SMSInfo.Entries[0].ID = SMS_WAPIndicatorLong; SMSInfo.Entries[0].MMSIndicator = &MMSInfo; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber,"WAP Info",8); } strcpy(MMSInfo.Address, argv[0 + startarg]); strcpy(MMSInfo.Title, argv[1 + startarg]); startarg += 2; break; case COMPOSE_RINGTONE: if (argc < 1 + startarg) { printf("%s\n", _("Where is ringtone filename?")); exit(-1); } RNG_AUTO_ALLOC(0); ringtone[0]->Format = RING_NOTETONE; error=GSM_ReadRingtoneFile(argv[startarg], ringtone[0]); if (error != ERR_NONE) goto end_compose; SMSInfo.Entries[0].ID = SMS_NokiaRingtone; SMSInfo.Entries[0].Ringtone = ringtone[0]; if (*type == SMS_Save) { CopyUnicodeString(RemoteNumber, ringtone[0]->Name); EncodeUnicode(Name,"Ringtone ",9); CopyUnicodeString(Name+9*2, ringtone[0]->Name); } startarg += 1; break; case COMPOSE_OPERATOR: if (argc < 1 + startarg) { printf("%s\n", _("Where is logo filename?")); exit(-1); } BMP_AUTO_ALLOC(0); bitmap[0]->Bitmap[0].Type = GSM_OperatorLogo; error=GSM_ReadBitmapFile(argv[startarg], bitmap[0]); if (error != ERR_NONE) goto end_compose; strcpy(bitmap[0]->Bitmap[0].NetworkCode,"000 00"); SMSInfo.Entries[0].ID = SMS_NokiaOperatorLogo; SMSInfo.Entries[0].Bitmap = bitmap[0]; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "OpLogo",6); EncodeUnicode(Name,"OpLogo ",7); } startarg += 1; break; case COMPOSE_CALLER: if (argc < 1 + startarg) { printf("%s\n", _("Where is logo filename?")); exit(-1); } BMP_AUTO_ALLOC(0); bitmap[0]->Bitmap[0].Type = GSM_CallerGroupLogo; error=GSM_ReadBitmapFile(argv[startarg], bitmap[0]); if (error != ERR_NONE) goto end_compose; SMSInfo.Entries[0].ID = SMS_NokiaCallerLogo; SMSInfo.Entries[0].Bitmap = bitmap[0]; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "Caller",6); } startarg += 1; break; case COMPOSE_ANIMATION: SMSInfo.UnicodeCoding = FALSE; SMSInfo.EntriesNum = 1; if (argc < 1 + startarg) { printf("%s\n", _("Where is number of frames?")); exit(-1); } BMP_AUTO_ALLOC(0); bitmap[0]->Number = 0; i = 1; frames_num = GetInt(argv[startarg]); if (frames_num > GSM_MAX_MULTI_BITMAP) { printf("%s\n", _("Too many animation frames!")); exit(-1); } while (1) { bitmap2.Bitmap[0].Type = GSM_StartupLogo; error=GSM_ReadBitmapFile(argv[startarg + i],&bitmap2); if (error != ERR_NONE) goto end_compose; for (j=0;jNumber == frames_num) break; memcpy(&bitmap[0]->Bitmap[bitmap[0]->Number],&bitmap2.Bitmap[j],sizeof(GSM_Bitmap)); bitmap[0]->Number++; } if (bitmap[0]->Number == frames_num) break; i++; } SMSInfo.Entries[0].ID = SMS_AlcatelMonoAnimationLong; SMSInfo.Entries[0].Bitmap = bitmap[0]; bitmap[0]->Bitmap[0].Text[0] = 0; bitmap[0]->Bitmap[0].Text[1] = 0; startarg += 1 + frames_num; break; case COMPOSE_PICTURE: if (argc < 1 + startarg) { printf("%s\n", _("Where is logo filename?")); exit(-1); } BMP_AUTO_ALLOC(0); bitmap[0]->Bitmap[0].Type = GSM_PictureImage; error=GSM_ReadBitmapFile(argv[startarg], bitmap[0]); printf(_("File \"%s\"\n"),argv[startarg]); if (error != ERR_NONE) goto end_compose; SMSInfo.Entries[0].ID = SMS_NokiaPictureImageLong; SMSInfo.Entries[0].Bitmap = bitmap[0]; SMSInfo.UnicodeCoding = FALSE; bitmap[0]->Bitmap[0].Text[0] = 0; bitmap[0]->Bitmap[0].Text[1] = 0; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "Picture",7); EncodeUnicode(Name,"Picture Image",13); } startarg += 1; break; #ifdef GSM_ENABLE_BACKUP case COMPOSE_BOOKMARK: if (argc < 2 + startarg) { printf("%s\n", _("Where is backup filename and location?")); exit(-1); } error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE)); if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose; i = 0; while (Backup.WAPBookmark[i]!=NULL) { if (i == GetInt(argv[1 + startarg])-1) break; i++; } if (i != GetInt(argv[1 + startarg])-1) { printf("%s\n", _("Bookmark not found in file")); exit(-1); } SMSInfo.Entries[0].ID = SMS_NokiaWAPBookmarkLong; SMSInfo.Entries[0].Bookmark = Backup.WAPBookmark[i]; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "Bookmark",8); EncodeUnicode(Name,"WAP Bookmark",12); } startarg += 2; break; case COMPOSE_WAPSETTINGS: if (argc < 3 + startarg) { printf("%s\n", _("Where is backup filename and location?")); exit(-1); } error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE)); if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose; i = 0; while (Backup.WAPSettings[i]!=NULL) { if (i == GetInt(argv[1 + startarg])-1) break; i++; } if (i != GetInt(argv[1 + startarg])-1 || Backup.WAPSettings[i] == NULL) { printf("%s\n", _("WAP settings not found in file")); exit(-1); } SMSInfo.Entries[0].Settings = NULL; for (j=0;jNumber;j++) { switch (Backup.WAPSettings[i]->Settings[j].Bearer) { case WAPSETTINGS_BEARER_GPRS: if (strcasecmp(argv[2 + startarg],"GPRS") == 0) { SMSInfo.Entries[0].Settings = &Backup.WAPSettings[i]->Settings[j]; break; } case WAPSETTINGS_BEARER_DATA: if (strcasecmp(argv[2 + startarg],"DATA") == 0) { SMSInfo.Entries[0].Settings = &Backup.WAPSettings[i]->Settings[j]; break; } default: break; } } if (SMSInfo.Entries[0].Settings == NULL) { printf("%s\n", _("Sorry. For now there is only support for GPRS or DATA bearers end")); exit(-1); } SMSInfo.Entries[0].ID = SMS_NokiaWAPSettingsLong; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "Settings",8); EncodeUnicode(Name,"WAP Settings",12); } startarg += 3; break; case COMPOSE_MMSSETTINGS: if (argc < 2 + startarg) { printf("%s\n", _("Where is backup filename and location?")); exit(-1); } error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE)); if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose; i = 0; while (Backup.MMSSettings[i]!=NULL) { if (i == GetInt(argv[1 + startarg])-1) break; i++; } if (i != GetInt(argv[1 + startarg])-1 || Backup.MMSSettings[i] == NULL) { printf("%s\n", _("MMS settings not found in file")); exit(-1); } SMSInfo.Entries[0].Settings = NULL; for (j=0;jNumber;j++) { switch (Backup.MMSSettings[i]->Settings[j].Bearer) { case WAPSETTINGS_BEARER_GPRS: SMSInfo.Entries[0].Settings = &Backup.MMSSettings[i]->Settings[j]; break; default: break; } } if (SMSInfo.Entries[0].Settings == NULL) { printf("%s\n", _("Sorry. No GPRS bearer found in MMS settings")); exit(-1); } SMSInfo.Entries[0].ID = SMS_NokiaMMSSettingsLong; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "Settings",8); EncodeUnicode(Name,"MMS Settings",12); } startarg += 2; break; case COMPOSE_CALENDAR: if (argc < 2 + startarg) { printf("%s\n", _("Where is backup filename and location?")); exit(-1); } error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE)); if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose; i = 0; while (Backup.Calendar[i]!=NULL) { if (i == GetInt(argv[1 + startarg])-1) break; i++; } if (i != GetInt(argv[1 + startarg])-1) { printf("%s\n", _("Calendar note not found in file")); exit(-1); } SMSInfo.Entries[0].ID = SMS_NokiaVCALENDAR10Long; SMSInfo.Entries[0].Calendar = Backup.Calendar[i]; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "Calendar",8); } startarg += 2; break; case COMPOSE_TODO: if (argc < 2 + startarg) { printf("%s\n", _("Where is backup filename and location?")); exit(-1); } error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE)); if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose; i = 0; while (Backup.ToDo[i]!=NULL) { if (i == GetInt(argv[1 + startarg])-1) break; i++; } if (i != GetInt(argv[1 + startarg])-1) { printf("%s\n", _("ToDo note not found in file")); exit(-1); } SMSInfo.Entries[0].ID = SMS_NokiaVTODOLong; SMSInfo.Entries[0].ToDo = Backup.ToDo[i]; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "ToDo",8); } startarg += 2; break; case COMPOSE_VCARD10: case COMPOSE_VCARD21: if (argc < 3 + startarg) { printf("%s\n", _("Where is backup filename and location and memory type?")); exit(-1); } error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE)); if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose; i = 0; if (strcasecmp(argv[1 + startarg],"SM") == 0) { while (Backup.SIMPhonebook[i]!=NULL) { if (i == GetInt(argv[2 + startarg])-1) break; i++; } if (i != GetInt(argv[2 + startarg])-1) { printf("%s\n", _("Phonebook entry not found in file")); exit(-1); } SMSInfo.Entries[0].Phonebook = Backup.SIMPhonebook[i]; } else if (strcasecmp(argv[1 + startarg],"ME") == 0) { while (Backup.PhonePhonebook[i]!=NULL) { if (i == GetInt(argv[2 + startarg])-1) break; i++; } if (i != GetInt(argv[2 + startarg])-1) { printf("%s\n", _("Phonebook entry not found in file")); exit(-1); } SMSInfo.Entries[0].Phonebook = Backup.PhonePhonebook[i]; } else { printf(_("Unknown memory type: \"%s\"\n"),argv[1 + startarg]); exit(-1); } if (compose_type == COMPOSE_VCARD10) { SMSInfo.Entries[0].ID = SMS_VCARD10Long; } else { SMSInfo.Entries[0].ID = SMS_VCARD21Long; } if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "VCARD",5); EncodeUnicode(Name, "Phonebook entry",15); } startarg += 3; break; #else case COMPOSE_BOOKMARK: case COMPOSE_WAPSETTINGS: case COMPOSE_MMSSETTINGS: case COMPOSE_CALENDAR: case COMPOSE_TODO: case COMPOSE_VCARD10: case COMPOSE_VCARD21: printf("%s\n", _("Backup functionality not compiled in!")); exit(100 + ERR_DISABLED); break; #endif case COMPOSE_PROFILE: SMSInfo.Entries[0].ID = SMS_NokiaProfileLong; if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "Profile",7); } break; } for (i = startarg; i < argc; i++) { switch (nextlong) { case 0: if (*type == SMS_Save || *type == SMS_SendSaved) { if (strcasecmp(argv[i],"-folder") == 0) { nextlong=1; continue; } } if (*type == SMS_Save) { if (strcasecmp(argv[i],"-unread") == 0) { State = SMS_UnRead; continue; } if (strcasecmp(argv[i],"-read") == 0) { State = SMS_Read; continue; } if (strcasecmp(argv[i],"-unsent") == 0) { State = SMS_UnSent; continue; } if (strcasecmp(argv[i],"-sent") == 0) { State = SMS_Sent; continue; } if (strcasecmp(argv[i],"-sender") == 0) { nextlong=2; continue; } if (strcasecmp(argv[i],"-smsname") == 0) { nextlong=25; continue; } } else { if (strcasecmp(argv[i],"-save") == 0) { *type = SMS_SendSaved; continue; } if (strcasecmp(argv[i],"-report") == 0) { DeliveryReport=TRUE; continue; } if (strcasecmp(argv[i],"-validity") == 0) { nextlong=10; continue; } } if (strcasecmp(argv[i],"-smscset") == 0) { nextlong=3; continue; } if (strcasecmp(argv[i],"-smscnumber") == 0) { nextlong=4; continue; } if (strcasecmp(argv[i],"-protected") == 0) { nextlong=19; continue; } if (strcasecmp(argv[i],"-reply") == 0) { ReplyViaSameSMSC=TRUE; continue; } if (strcasecmp(argv[i],"-maxsms") == 0) { nextlong=21; continue; } if (compose_type == COMPOSE_RINGTONE) { if (strcasecmp(argv[i],"-long") == 0) { SMSInfo.Entries[0].ID = SMS_NokiaRingtoneLong; break; } if (strcasecmp(argv[i],"-scale") == 0) { RNG_AUTO_ALLOC(0); ringtone[0]->NoteTone.AllNotesScale=TRUE; break; } } if (compose_type == COMPOSE_TEXT) { if (strcasecmp(argv[i],"-text") == 0) { nextlong = 26; break; } if (strcasecmp(argv[i],"-textutf8") == 0) { nextlong = 27; break; } if (strcasecmp(argv[i],"-inputunicode") == 0) { ReadUnicodeFile(Buffer[0],InputBuffer); break; } if (strcasecmp(argv[i],"-16bit") == 0) { if (SMSInfo.Entries[0].ID == SMS_ConcatenatedTextLong) SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong16bit; if (SMSInfo.Entries[0].ID == SMS_ConcatenatedAutoTextLong) SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong16bit; break; } if (strcasecmp(argv[i],"-flash") == 0) { SMSInfo.Class = 0; break; } if (strcasecmp(argv[i],"-len") == 0) { nextlong = 5; break; } /* Backward compatibility with bad docs */ if (strcasecmp(argv[i],"-maxlen") == 0) { nextlong = 5; break; } if (strcasecmp(argv[i],"-autolen") == 0) { nextlong = 5; break; } if (strcasecmp(argv[i],"-unicode") == 0) { SMSInfo.UnicodeCoding = TRUE; break; } if (strcasecmp(argv[i],"-enablevoice") == 0) { SMSInfo.Entries[0].ID = SMS_EnableVoice; break; } if (strcasecmp(argv[i],"-disablevoice") == 0) { SMSInfo.Entries[0].ID = SMS_DisableVoice; break; } if (strcasecmp(argv[i],"-enablefax") == 0) { SMSInfo.Entries[0].ID = SMS_EnableFax; break; } if (strcasecmp(argv[i],"-disablefax") == 0) { SMSInfo.Entries[0].ID = SMS_DisableFax; break; } if (strcasecmp(argv[i],"-enableemail") == 0) { SMSInfo.Entries[0].ID = SMS_EnableEmail; break; } if (strcasecmp(argv[i],"-disableemail") == 0) { SMSInfo.Entries[0].ID = SMS_DisableEmail; break; } if (strcasecmp(argv[i],"-voidsms") == 0) { SMSInfo.Entries[0].ID = SMS_VoidSMS; break; } if (strcasecmp(argv[i],"-replacemessages") == 0 && SMSInfo.Entries[0].ID != SMS_ConcatenatedTextLong) { nextlong = 8; break; } if (strcasecmp(argv[i],"-replacefile") == 0) { nextlong = 9; continue; } } if (compose_type == COMPOSE_PICTURE) { if (strcasecmp(argv[i],"-text") == 0) { nextlong = 6; break; } if (strcasecmp(argv[i],"-unicode") == 0) { SMSInfo.UnicodeCoding = TRUE; break; } if (strcasecmp(argv[i],"-alcatelbmmi") == 0) { BMP_AUTO_ALLOC(0); bitmap[0]->Bitmap[0].Type = GSM_StartupLogo; error = GSM_ReadBitmapFile(argv[startarg-1], bitmap[0]); if (error != ERR_NONE) goto end_compose; SMSInfo.UnicodeCoding = TRUE; SMSInfo.Entries[0].ID = SMS_AlcatelMonoBitmapLong; break; } break; } if (compose_type == COMPOSE_VCARD10) { if (strcasecmp(argv[i],"-nokia") == 0) { SMSInfo.Entries[0].ID = SMS_NokiaVCARD10Long; break; } break; } if (compose_type == COMPOSE_VCARD21) { if (strcasecmp(argv[i],"-nokia") == 0) { SMSInfo.Entries[0].ID = SMS_NokiaVCARD21Long; break; } break; } if (compose_type == COMPOSE_PROFILE) { if (strcasecmp(argv[i],"-name") == 0) { nextlong = 22; break; } if (strcasecmp(argv[i],"-ringtone") == 0) { nextlong = 23; break; } if (strcasecmp(argv[i],"-bitmap") == 0) { nextlong = 24; break; } } if (compose_type == COMPOSE_SMSTEMPLATE) { if (strcasecmp(argv[i],"-unicode") == 0) { SMSInfo.UnicodeCoding = TRUE; break; } if (strcasecmp(argv[i],"-text") == 0) { nextlong = 11; break; } if (strcasecmp(argv[i],"-unicodefiletext") == 0) { nextlong = 18; break; } if (strcasecmp(argv[i],"-defsound") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedSound; nextlong = 12; break; } if (strcasecmp(argv[i],"-defanimation") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedAnimation; nextlong = 12; break; } if (strcasecmp(argv[i],"-tone10") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-tone10long") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10Long; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-tone12") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-tone12long") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12Long; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-toneSE") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSound; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-toneSElong") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSoundLong; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-variablebitmap") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmap; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 15; break; } if (strcasecmp(argv[i],"-variablebitmaplong") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmapLong; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 15; break; } if (strcasecmp(argv[i],"-animation") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSAnimation; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } BMP_AUTO_ALLOC(SMSInfo.EntriesNum); bitmap[SMSInfo.EntriesNum]->Number = 0; nextlong = 16; break; } } if (compose_type == COMPOSE_EMS) { if (strcasecmp(argv[i],"-unicode") == 0) { SMSInfo.UnicodeCoding = TRUE; break; } if (strcasecmp(argv[i],"-16bit") == 0) { EMS16Bit = TRUE; break; } if (strcasecmp(argv[i],"-format") == 0) { nextlong = 20; break; } if (strcasecmp(argv[i],"-text") == 0) { nextlong = 11; break; } if (strcasecmp(argv[i],"-unicodefiletext") == 0) { nextlong = 18; break; } if (strcasecmp(argv[i],"-defsound") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedSound; nextlong = 12; break; } if (strcasecmp(argv[i],"-defanimation") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedAnimation; nextlong = 12; break; } if (strcasecmp(argv[i],"-tone10") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-tone10long") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10Long; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-tone12") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-tone12long") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12Long; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-toneSE") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSound; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-toneSElong") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSoundLong; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 14; break; } if (strcasecmp(argv[i],"-fixedbitmap") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSFixedBitmap; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 15; break; } if (strcasecmp(argv[i],"-variablebitmap") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmap; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 15; break; } if (strcasecmp(argv[i],"-variablebitmaplong") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmapLong; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } nextlong = 15; break; } if (strcasecmp(argv[i],"-animation") == 0) { SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSAnimation; if (Protected != 0) { SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE; Protected --; } BMP_AUTO_ALLOC(SMSInfo.EntriesNum); bitmap[SMSInfo.EntriesNum]->Number = 0; nextlong = 16; break; } } if (compose_type == COMPOSE_OPERATOR) { if (strcasecmp(argv[i],"-netcode") == 0) { nextlong = 7; break; } if (strcasecmp(argv[i],"-biglogo") == 0) { SMSInfo.Entries[0].ID = SMS_NokiaOperatorLogoLong; break; } break; } printf(_("Unknown parameter (\"%s\")\n"),argv[i]); exit(-1); break; case 1: /* SMS folder - only during saving SMS */ Folder = GetInt(argv[i]); nextlong = 0; break; case 2: /* Remote number - only during saving SMS */ EncodeUnicode(RemoteNumber,argv[i],strlen(argv[i])); nextlong = 0; break; case 3: /* SMSC set number */ SMSCSet = GetInt(argv[i]); nextlong = 0; break; case 4: /* Number of SMSC */ EncodeUnicode(SMSC,argv[i],strlen(argv[i])); SMSCSet = 0; nextlong = 0; break; case 5: /* Length of text SMS */ param_value = GetInt(argv[i]); if (param_value <= 0) { printf(_("Wrong message length (\"%s\")\n"),argv[i]); exit(-1); } printf("%d / %d\n", param_value, chars_read); if (param_value < chars_read) { Buffer[0][param_value * 2] = 0x00; Buffer[0][param_value * 2 + 1] = 0x00; } SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong; if (strcasecmp(argv[i-1],"-autolen") == 0) { SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong; } nextlong = 0; break; case 6: /* Picture Images - text */ BMP_AUTO_ALLOC(0); EncodeUnicode(bitmap[0]->Bitmap[0].Text,argv[i],strlen(argv[i])); nextlong = 0; break; case 7: /* Operator Logo - network code */ BMP_AUTO_ALLOC(0); strncpy(bitmap[0]->Bitmap[0].NetworkCode,argv[i],7); if (!strcmp(DecodeUnicodeConsole(GSM_GetNetworkName(bitmap[0]->Bitmap[0].NetworkCode)),"unknown")) { printf(_("Unknown GSM network code (\"%s\")\n"),argv[i]); exit(-1); } if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "OpLogo",6); EncodeUnicode(RemoteNumber+6*2,bitmap[0]->Bitmap[0].NetworkCode,3); EncodeUnicode(RemoteNumber+6*2+3*2,bitmap[0]->Bitmap[0].NetworkCode+4,2); if (UnicodeLength(GSM_GetNetworkName(bitmap[0]->Bitmap[0].NetworkCode))Bitmap[0].NetworkCode)); } else { CopyUnicodeString(Name,RemoteNumber); } } nextlong = 0; break; case 8:/* Reject duplicates ID */ SMSInfo.ReplaceMessage = GetInt(argv[i]); if (SMSInfo.ReplaceMessage < 1 || SMSInfo.ReplaceMessage > 7) { printf(_("You have to give number between 1 and 7 (\"%s\")\n"),argv[i]); exit(-1); } nextlong = 0; break; case 9:/* Replace file for text SMS */ ReplaceFileHadle = fopen(argv[i], "rb"); if (ReplaceFileHadle == NULL) { error = ERR_CANTOPENFILE; goto end_compose; } memset(ReplaceBuffer,0,sizeof(ReplaceBuffer)); if (fread(ReplaceBuffer,1,sizeof(ReplaceBuffer),ReplaceFileHadle) != sizeof(ReplaceBuffer)) { printf_err("%s", _("Error while writing file!\n")); } fclose(ReplaceFileHadle); ReadUnicodeFile(ReplaceBuffer2,ReplaceBuffer); for(j=0;j<(int)(UnicodeLength(Buffer[0]));j++) { for (z=0;z<(int)(UnicodeLength(ReplaceBuffer2)/2);z++) { if (ReplaceBuffer2[z*4] == Buffer[0][j] && ReplaceBuffer2[z*4+1] == Buffer[0][j+1]) { Buffer[0][j] = ReplaceBuffer2[z*4+2]; Buffer[0][j+1] = ReplaceBuffer2[z*4+3]; break; } } } nextlong = 0; break; case 10: Validity.Format = SMS_Validity_RelativeFormat; if (strcasecmp(argv[i],"HOUR") == 0) Validity.Relative = SMS_VALID_1_Hour; else if (strcasecmp(argv[i],"6HOURS") == 0) Validity.Relative = SMS_VALID_6_Hours; else if (strcasecmp(argv[i],"DAY") == 0) Validity.Relative = SMS_VALID_1_Day; else if (strcasecmp(argv[i],"3DAYS") == 0) Validity.Relative = SMS_VALID_3_Days; else if (strcasecmp(argv[i],"WEEK") == 0) Validity.Relative = SMS_VALID_1_Week; else if (strcasecmp(argv[i],"MAX") == 0) Validity.Relative = SMS_VALID_Max_Time; else { printf(_("Unknown validity string (\"%s\")\n"),argv[i]); exit(-1); } nextlong = 0; break; case 11:/* EMS text from parameter */ EncodeUnicode(Buffer[SMSInfo.EntriesNum],argv[i],strlen(argv[i])); SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_ConcatenatedTextLong; SMSInfo.Entries[SMSInfo.EntriesNum].Buffer = Buffer[SMSInfo.EntriesNum]; SMSInfo.EntriesNum++; nextlong = 0; break; case 12:/* EMS predefined sound/animation number */ SMSInfo.Entries[SMSInfo.EntriesNum].Number = GetInt(argv[i]); SMSInfo.EntriesNum++; nextlong = 0; break; case 14: /* EMS ringtone - IMelody */ RNG_AUTO_ALLOC(SMSInfo.EntriesNum); ringtone[SMSInfo.EntriesNum]->Format = RING_NOTETONE; error=GSM_ReadRingtoneFile(argv[i], ringtone[SMSInfo.EntriesNum]); if (error != ERR_NONE) goto end_compose; SMSInfo.Entries[SMSInfo.EntriesNum].Ringtone = ringtone[SMSInfo.EntriesNum]; SMSInfo.EntriesNum++; nextlong = 0; break; case 15:/* EMS bitmap file */ BMP_AUTO_ALLOC(SMSInfo.EntriesNum); bitmap[SMSInfo.EntriesNum]->Bitmap[0].Type = GSM_StartupLogo; error=GSM_ReadBitmapFile(argv[i], bitmap[SMSInfo.EntriesNum]); if (error != ERR_NONE) goto end_compose; SMSInfo.Entries[SMSInfo.EntriesNum].Bitmap = bitmap[SMSInfo.EntriesNum]; SMSInfo.EntriesNum++; nextlong = 0; break; case 16:/* Number of frames for EMS animation */ FramesNum = GetInt(argv[i]); if (FramesNum < 1 || FramesNum > 4) { printf(_("You have to give number of EMS frames between 1 and 4 (\"%s\")\n"),argv[i]); exit(-1); } BMP_AUTO_ALLOC(SMSInfo.EntriesNum); bitmap[SMSInfo.EntriesNum]->Number = 0; nextlong = 17; break; case 17:/*File for EMS animation */ BMP_AUTO_ALLOC(SMSInfo.EntriesNum); bitmap2.Bitmap[0].Type=GSM_StartupLogo; error=GSM_ReadBitmapFile(argv[i],&bitmap2); if (error != ERR_NONE) { printf(_("Can't open file \"%s\"\n"),argv[i]); exit(-1); } for (j=0;jNumber == FramesNum) break; memcpy(&bitmap[SMSInfo.EntriesNum]->Bitmap[bitmap[SMSInfo.EntriesNum]->Number],&bitmap2.Bitmap[j],sizeof(GSM_Bitmap)); bitmap[SMSInfo.EntriesNum]->Number++; } if (bitmap[SMSInfo.EntriesNum]->Number == FramesNum) { SMSInfo.Entries[SMSInfo.EntriesNum].Bitmap = bitmap[SMSInfo.EntriesNum]; SMSInfo.EntriesNum++; nextlong = 0; } break; case 18:/* EMS text from Unicode file */ f = fopen(argv[i],"rb"); if (f == NULL) { printf(_("Can't open file \"%s\"\n"),argv[i]); exit(-1); } z=fread(InputBuffer,1,2000,f); InputBuffer[z] = 0; InputBuffer[z+1] = 0; fclose(f); ReadUnicodeFile(Buffer[SMSInfo.EntriesNum],InputBuffer); SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_ConcatenatedTextLong; SMSInfo.Entries[SMSInfo.EntriesNum].Buffer = Buffer[SMSInfo.EntriesNum]; SMSInfo.EntriesNum++; nextlong = 0; break; case 19:/* Number of protected items */ Protected = GetInt(argv[i]); nextlong = 0; break; case 20:/* Formatting text for EMS */ if (SMSInfo.Entries[SMSInfo.EntriesNum-1].ID == SMS_ConcatenatedTextLong) { for(j=0;j<(int)strlen(argv[i]);j++) { switch(argv[i][j]) { case 'l': case 'L': SMSInfo.Entries[SMSInfo.EntriesNum-1].Left = TRUE; break; case 'c': case 'C': SMSInfo.Entries[SMSInfo.EntriesNum-1].Center = TRUE; break; case 'r': case 'R': SMSInfo.Entries[SMSInfo.EntriesNum-1].Right = TRUE; break; case 'a': case 'A': SMSInfo.Entries[SMSInfo.EntriesNum-1].Large = TRUE; break; case 's': case 'S': SMSInfo.Entries[SMSInfo.EntriesNum-1].Small = TRUE; break; case 'b': case 'B': SMSInfo.Entries[SMSInfo.EntriesNum-1].Bold = TRUE; break; case 'i': case 'I': SMSInfo.Entries[SMSInfo.EntriesNum-1].Italic = TRUE; break; case 'u': case 'U': SMSInfo.Entries[SMSInfo.EntriesNum-1].Underlined = TRUE; break; case 't': case 'T': SMSInfo.Entries[SMSInfo.EntriesNum-1].Strikethrough = TRUE; break; default: printf(_("Unknown parameter (\"%c\")\n"),argv[i][j]); exit(-1); } } } else { printf("%s\n", _("Last parameter wasn't text")); exit(-1); } nextlong = 0; break; case 21:/*MaxSMS*/ MaxSMS = GetInt(argv[i]); nextlong = 0; break; case 22:/* profile name */ EncodeUnicode(Buffer[0],argv[i],strlen(argv[i])); SMSInfo.Entries[0].Buffer = Buffer[0]; nextlong = 0; break; case 23:/* profile ringtone */ RNG_AUTO_ALLOC(0); ringtone[0]->Format = RING_NOTETONE; error=GSM_ReadRingtoneFile(argv[i], ringtone[0]); if (error != ERR_NONE) goto end_compose; SMSInfo.Entries[0].Ringtone = ringtone[0]; nextlong = 0; break; case 24:/* profile bitmap */ BMP_AUTO_ALLOC(0); bitmap[0]->Bitmap[0].Type = GSM_PictureImage; error=GSM_ReadBitmapFile(argv[i], bitmap[0]); if (error != ERR_NONE) goto end_compose; bitmap[0]->Bitmap[0].Text[0] = 0; bitmap[0]->Bitmap[0].Text[1] = 0; SMSInfo.Entries[0].Bitmap = bitmap[0]; nextlong = 0; break; case 25:/* sms name */ if (strlen(argv[i])>GSM_MAX_SMS_NAME_LENGTH) { printf(_("Too long SMS name (\"%s\"), ignored\n"),argv[i]); } else { EncodeUnicode(Name, argv[i],strlen(argv[i])); } nextlong = 0; break; case 26:/* text from parameter */ chars_read = strlen(argv[i]); EncodeUnicode(Buffer[0], argv[i], chars_read); HasText = TRUE; nextlong = 0; break; case 27:/* utf-8 text from parameter */ chars_read = strlen(argv[i]); DecodeUTF8(Buffer[0], argv[i], chars_read); HasText = TRUE; nextlong = 0; break; } } if (nextlong!=0) { printf_err("%s\n", _("Parameter missing!")); exit(-1); } if (compose_type == COMPOSE_EMS && EMS16Bit) { for (i=0;iBitmap[0].Type==GSM_OperatorLogo && strcmp(bitmap[0]->Bitmap[0].NetworkCode,"000 00")==0) { printf("%s\n", _("No network code")); exit(-1); } } } else { if (sm == NULL) { printf_err("%s\n", _("You have to set network code!")); exit(-1); } if (compose_type == COMPOSE_OPERATOR) { if (bitmap[0]->Bitmap[0].Type == GSM_OperatorLogo && strcmp(bitmap[0]->Bitmap[0].NetworkCode,"000 00")==0) { error = GSM_GetNetworkInfo(sm,&NetInfo); if (error != ERR_NONE) goto end_compose; strcpy(bitmap[0]->Bitmap[0].NetworkCode,NetInfo.NetworkCode); if (*type == SMS_Save) { EncodeUnicode(RemoteNumber, "OpLogo",6); EncodeUnicode(RemoteNumber+6*2,bitmap[0]->Bitmap[0].NetworkCode,3); EncodeUnicode(RemoteNumber+6*2+3*2,bitmap[0]->Bitmap[0].NetworkCode+4,2); if (UnicodeLength(GSM_GetNetworkName(bitmap[0]->Bitmap[0].NetworkCode))Bitmap[0].NetworkCode)); } else { CopyUnicodeString(Name,RemoteNumber); } } } } } error = GSM_EncodeMultiPartSMS(GSM_GetGlobalDebug(), &SMSInfo, sms); if (error != ERR_NONE) goto end_compose; for (i=0;iNoteTone.NrCommands) { printf_warn(_("Ringtone too long. %i percent part cut\n"), (SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands-SMSInfo.Entries[i].RingtoneNotes)*100/SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands); } default: break; } } /* Check whether we did not reach user limit of messages */ if (MaxSMS != -1 && sms->Number > MaxSMS) { printf_err(_("There are %i SMS messages packed and the limit is %i. Exiting\n"),sms->Number,MaxSMS); error = ERR_MOREMEMORY; goto end_compose; } /* * Are we supposed to read SMSC from phone? */ if (SMSCSet != 0) { if (sm == NULL) { printf_err("%s\n", _("Use -smscnumber option to give SMSC number")); exit(-1); } PhoneSMSC.Location = SMSCSet; error = GSM_GetSMSC(sm, &PhoneSMSC); if (error != ERR_NONE) { error = ERR_GETTING_SMSC; goto end_compose; } CopyUnicodeString(SMSC, PhoneSMSC.Number); SMSCSet = 0; } /* * Fill up all messages with flags. */ for (i=0;iNumber;i++) { CopyUnicodeString(sms->SMS[i].Number, RemoteNumber); CopyUnicodeString(sms->SMS[i].Name, Name); sms->SMS[i].Location = 0; sms->SMS[i].Folder = Folder; sms->SMS[i].State = State; sms->SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC; sms->SMS[i].SMSC.Location = SMSCSet; CopyUnicodeString(sms->SMS[i].SMSC.Number, SMSC); if (DeliveryReport) { sms->SMS[i].PDU = SMS_Status_Report; } else { sms->SMS[i].PDU = SMS_Submit; } if (Validity.Format != 0) { sms->SMS[i].SMSC.Validity = Validity; } } error = ERR_NONE; end_compose: for (i = 0; i < GSM_MAX_MULTI_SMS; i++) { free(ringtone[i]); free(bitmap[i]); } #ifdef GSM_ENABLE_BACKUP GSM_FreeBackup(&Backup); #endif return error; } /* How should editor hadle tabs in this file? Add editor commands here. * vim: noexpandtab sw=8 ts=8 sts=8: */