-rw-r--r-- | gammu/emb/common/service/backup/backgen.h | 4 | ||||
-rw-r--r-- | gammu/emb/common/service/backup/backtext.c | 229 | ||||
-rw-r--r-- | gammu/emb/common/service/backup/gsmback.c | 36 | ||||
-rw-r--r-- | gammu/emb/common/service/backup/gsmback.h | 2 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmcal.h | 2 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmdata.c | 124 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmdata.h | 2 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmlogo.c | 47 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmlogo.h | 28 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmmisc.h | 7 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmring.c | 45 | ||||
-rw-r--r-- | gammu/emb/common/service/gsmring.h | 8 | ||||
-rw-r--r-- | gammu/emb/common/service/sms/gsmmulti.c | 5 | ||||
-rw-r--r-- | gammu/emb/common/service/sms/gsmmulti.h | 11 | ||||
-rw-r--r-- | gammu/emb/common/service/sms/gsmsms.c | 5 | ||||
-rw-r--r-- | gammu/emb/common/service/sms/gsmsms.h | 5 |
16 files changed, 497 insertions, 63 deletions
diff --git a/gammu/emb/common/service/backup/backgen.h b/gammu/emb/common/service/backup/backgen.h index 9d7d973..9a930fc 100644 --- a/gammu/emb/common/service/backup/backgen.h +++ b/gammu/emb/common/service/backup/backgen.h @@ -21,6 +21,8 @@ #define GSM_BACKUP_MAX_WAPBOOKMARK 40 #define GSM_BACKUP_MAX_WAPSETTINGS 30 #define GSM_BACKUP_MAX_MMSSETTINGS 30 +#define GSM_BACKUP_MAX_SYNCMLSETTINGS 10 +#define GSM_BACKUP_MAX_CHATSETTINGS 10 #define GSM_BACKUP_MAX_RINGTONES 30 #define GSM_BACKUP_MAX_PROFILES 10 #define GSM_BACKUP_MAX_FMSTATIONS 20 @@ -43,6 +45,8 @@ typedef struct { GSM_WAPBookmark *WAPBookmark [GSM_BACKUP_MAX_WAPBOOKMARK + 1]; GSM_MultiWAPSettings *WAPSettings [GSM_BACKUP_MAX_WAPSETTINGS + 1]; GSM_MultiWAPSettings *MMSSettings [GSM_BACKUP_MAX_MMSSETTINGS + 1]; + GSM_SyncMLSettings *SyncMLSettings [GSM_BACKUP_MAX_SYNCMLSETTINGS + 1]; + GSM_ChatSettings *ChatSettings [GSM_BACKUP_MAX_CHATSETTINGS + 1]; GSM_Ringtone *Ringtone [GSM_BACKUP_MAX_RINGTONES + 1]; GSM_ToDoEntry *ToDo [GSM_MAXCALENDARTODONOTES + 1]; GSM_Profile *Profiles [GSM_BACKUP_MAX_PROFILES + 1]; diff --git a/gammu/emb/common/service/backup/backtext.c b/gammu/emb/common/service/backup/backtext.c index fee0f73..4cb1bb7 100644 --- a/gammu/emb/common/service/backup/backtext.c +++ b/gammu/emb/common/service/backup/backtext.c @@ -151,13 +151,13 @@ static void SaveBackupText(FILE *file, char *myname, char *myvalue, bool UseUnic EncodeUnicode(buffer2,buffer,strlen(buffer)); fwrite(buffer2,1,strlen(buffer)*2,file); - fwrite(myvalue,1,UnicodeLength(myvalue)*2,file); + fwrite(EncodeUnicodeSpecialChars(myvalue),1,UnicodeLength(EncodeUnicodeSpecialChars(myvalue))*2,file); sprintf(buffer,"\"%c%c",13,10); EncodeUnicode(buffer2,buffer,strlen(buffer)); fwrite(buffer2,1,strlen(buffer)*2,file); } else { - sprintf(buffer,"%s = \"%s\"%c%c",myname,DecodeUnicodeString(myvalue),13,10); + sprintf(buffer,"%s = \"%s\"%c%c",myname,EncodeSpecialChars(DecodeUnicodeString(myvalue)),13,10); fprintf(file,"%s",buffer); EncodeHexBin(buffer,myvalue,UnicodeLength(myvalue)*2); @@ -168,15 +168,16 @@ static void SaveBackupText(FILE *file, char *myname, char *myvalue, bool UseUnic static bool ReadBackupText(INI_Section *file_info, char *section, char *myname, char *myvalue, bool UseUnicode) { - unsigned char paramname[10000],*readvalue; + unsigned char paramname[10000],*readvalue; if (UseUnicode) { EncodeUnicode(paramname,myname,strlen(myname)); readvalue = INI_GetValue(file_info, section, paramname, UseUnicode); if (readvalue!=NULL) { - CopyUnicodeString(myvalue,readvalue+2); - myvalue[UnicodeLength(readvalue)*2-4]=0; - myvalue[UnicodeLength(readvalue)*2-3]=0; + CopyUnicodeString(myvalue,DecodeUnicodeSpecialChars(readvalue+2)); + myvalue[UnicodeLength(myvalue)*2-2]=0; + myvalue[UnicodeLength(myvalue)*2-1]=0; + dbgprintf("%s\n",DecodeUnicodeString(readvalue)); } else { myvalue[0]=0; @@ -197,7 +198,7 @@ static bool ReadBackupText(INI_Section *file_info, char *section, char *myname, strcpy(paramname,myname); readvalue = ReadCFGText(file_info, section, paramname, UseUnicode); if (readvalue!=NULL) { - EncodeUnicode(myvalue,readvalue+1,strlen(readvalue)-2); + EncodeUnicode(myvalue,DecodeSpecialChars(readvalue+1),strlen(DecodeSpecialChars(readvalue+1))-1); } else { myvalue[0]=0; myvalue[1]=0; @@ -418,6 +419,17 @@ static void SavePbkEntry(FILE *file, GSM_MemoryEntry *Pbk, bool UseUnicode) SaveBackupText(file, "", buffer, UseUnicode); } +static void SaveNoteEntry(FILE *file, GSM_NoteEntry *Note, bool UseUnicode) +{ + char buffer[1000]; + + sprintf(buffer,"Location = %d%c%c", Note->Location,13,10); + SaveBackupText(file, "", buffer, UseUnicode); + SaveBackupText(file, "Text", Note->Text, UseUnicode); + sprintf(buffer, "%c%c",13,10); + SaveBackupText(file, "", buffer, UseUnicode); +} + static void SaveCalendarEntry(FILE *file, GSM_CalendarEntry *Note, bool UseUnicode) { int i; @@ -433,9 +445,9 @@ static void SaveCalendarEntry(FILE *file, GSM_CalendarEntry *Note, bool UseUnico case GSM_CAL_BIRTHDAY : sprintf(buffer,"Birthday%c%c", 13,10); break; case GSM_CAL_TRAVEL : sprintf(buffer,"Travel%c%c", 13,10); break; case GSM_CAL_VACATION : sprintf(buffer,"Vacation%c%c", 13,10); break; - case GSM_CAL_MEMO : sprintf(buffer,"Memo%c%c", 13,10); break; + case GSM_CAL_MEMO : sprintf(buffer,"Memo%c%c", 13,10); break; case GSM_CAL_ALARM : sprintf(buffer,"Alarm%c%c", 13,10); break; - case GSM_CAL_DAILY_ALARM : sprintf(buffer,"DailyAlarm%c%c", 13,10); break; + case GSM_CAL_DAILY_ALARM: sprintf(buffer,"DailyAlarm%c%c", 13,10); break; case GSM_CAL_T_ATHL : sprintf(buffer,"Training/Athletism%c%c", 13,10); break; case GSM_CAL_T_BALL : sprintf(buffer,"Training/BallGames%c%c", 13,10); break; case GSM_CAL_T_CYCL : sprintf(buffer,"Training/Cycling%c%c", 13,10); break; @@ -657,6 +669,48 @@ static void SaveWAPSettingsEntry(FILE *file, GSM_MultiWAPSettings *settings, boo } } +static void SaveChatSettingsEntry(FILE *file, GSM_ChatSettings *settings, bool UseUnicode) +{ + char buffer[10000]; + + sprintf(buffer,"HomePage"); + SaveBackupText(file, buffer, settings->HomePage, UseUnicode); + sprintf(buffer,"User"); + SaveBackupText(file, buffer, settings->User, UseUnicode); + sprintf(buffer,"Password"); + SaveBackupText(file, buffer, settings->Password, UseUnicode); + SaveWAPSettingsEntry(file, &settings->Connection, UseUnicode); +} + +static void SaveSyncMLSettingsEntry(FILE *file, GSM_SyncMLSettings *settings, bool UseUnicode) +{ + char buffer[10000]; + + sprintf(buffer,"User"); + SaveBackupText(file, buffer, settings->User, UseUnicode); + sprintf(buffer,"Password"); + SaveBackupText(file, buffer, settings->Password, UseUnicode); + sprintf(buffer,"PhonebookDB"); + SaveBackupText(file, buffer, settings->PhonebookDataBase, UseUnicode); + sprintf(buffer,"CalendarDB"); + SaveBackupText(file, buffer, settings->CalendarDataBase, UseUnicode); + sprintf(buffer,"Server"); + SaveBackupText(file, buffer, settings->Server, UseUnicode); + if (settings->SyncPhonebook) { + sprintf(buffer,"SyncPhonebook = True%c%c",13,10); + } else { + sprintf(buffer,"SyncPhonebook = False%c%c",13,10); + } + SaveBackupText(file, "", buffer, UseUnicode); + if (settings->SyncCalendar) { + sprintf(buffer,"SyncCalendar = True%c%c",13,10); + } else { + sprintf(buffer,"SyncCalendar = False%c%c",13,10); + } + SaveBackupText(file, "", buffer, UseUnicode); + SaveWAPSettingsEntry(file, &settings->Connection, UseUnicode); +} + static void SaveBitmapEntry(FILE *file, GSM_Bitmap *bitmap, bool UseUnicode) { unsigned char buffer[10000],buffer2[10000]; @@ -764,23 +818,24 @@ static void SaveSMSCEntry(FILE *file, GSM_SMSC *SMSC, bool UseUnicode) static void SaveRingtoneEntry(FILE *file, GSM_Ringtone *ringtone, bool UseUnicode) { - unsigned char buffer[45000]; - int i,j; + unsigned char buffer[45000]; sprintf(buffer,"Location = %i%c%c",ringtone->Location,13,10); SaveBackupText(file, "", buffer, UseUnicode); SaveBackupText(file, "Name", ringtone->Name, UseUnicode); switch (ringtone->Format) { case RING_NOKIABINARY: - j = 0; i = 0; EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length); SaveLinkedBackupText(file, "NokiaBinary", buffer, UseUnicode); break; case RING_MIDI: - j = 0; i = 0; EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length); SaveLinkedBackupText(file, "Pure Midi", buffer, UseUnicode); break; + case RING_MMF: + EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length); + SaveLinkedBackupText(file, "SMAF", buffer, UseUnicode); + break; case RING_NOTETONE: break; } @@ -1075,6 +1130,13 @@ GSM_Error SaveBackup(char *FileName, GSM_Backup *backup, bool UseUnicode) i++; } i=0; + while (backup->Note[i]!=NULL) { + sprintf(buffer,"[Note%03i]%c%c",i+1,13,10); + SaveBackupText(file, "", buffer, UseUnicode); + SaveNoteEntry(file, backup->Note[i], UseUnicode); + i++; + } + i=0; while (backup->CallerLogos[i]!=NULL) { sprintf(buffer,"[Caller%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); @@ -1110,6 +1172,20 @@ GSM_Error SaveBackup(char *FileName, GSM_Backup *backup, bool UseUnicode) i++; } i=0; + while (backup->SyncMLSettings[i]!=NULL) { + sprintf(buffer,"[SyncMLSettings%03i]%c%c",i+1,13,10); + SaveBackupText(file, "", buffer, UseUnicode); + SaveSyncMLSettingsEntry(file, backup->SyncMLSettings[i], UseUnicode); + i++; + } + i=0; + while (backup->ChatSettings[i]!=NULL) { + sprintf(buffer,"[ChatSettings%03i]%c%c",i+1,13,10); + SaveBackupText(file, "", buffer, UseUnicode); + SaveChatSettingsEntry(file, backup->ChatSettings[i], UseUnicode); + i++; + } + i=0; while (backup->Ringtone[i]!=NULL) { sprintf(buffer,"[Ringtone%03i]%c%c",i+1,13,10); SaveBackupText(file, "", buffer, UseUnicode); @@ -2656,7 +2732,132 @@ GSM_Error LoadBackup(char *FileName, GSM_Backup *backup, bool UseUnicode) if (backup->MD5Original[0]!=0) { FindBackupChecksum(FileName, UseUnicode, backup->MD5Calculated); } - + for (h = file_info; h != NULL; h = h->Next) { + found = false; + if (UseUnicode) { + EncodeUnicode(buffer,"Backup",4); + if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true; + } else { + if (mystrncasecmp("Backup", h->SectionName, 6)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Checksum",4); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("Checksum", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Profile",7); + if (mywstrncasecmp(buffer, h->SectionName, 7)) found = true; + } else { + if (mystrncasecmp("Profile", h->SectionName, 7)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"PhonePBK",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("PhonePBK", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"SIMPBK",6); + if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true; + } else { + if (mystrncasecmp("SIMPBK", h->SectionName, 6)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Calendar",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("Calendar", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Caller",6); + if (mywstrncasecmp(buffer, h->SectionName, 6)) found = true; + } else { + if (mystrncasecmp("Caller", h->SectionName, 6)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"SMSC",4); + if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; + } else { + if (mystrncasecmp("SMSC", h->SectionName, 4)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"WAPBookmark",11); + if (mywstrncasecmp(buffer, h->SectionName, 11)) found = true; + if (!found) { + EncodeUnicode(buffer,"Bookmark",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } + } else { + if (mystrncasecmp("WAPBookmark", h->SectionName, 11)) found = true; + if (!found) { + if (mystrncasecmp("Bookmark", h->SectionName, 8)) found = true; + } + } + if (UseUnicode) { + EncodeUnicode(buffer,"WAPSettings",11); + if (mywstrncasecmp(buffer, h->SectionName, 11)) found = true; + if (!found) { + EncodeUnicode(buffer,"Settings",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } + } else { + if (mystrncasecmp("WAPSettings", h->SectionName, 11)) found = true; + if (!found) { + if (mystrncasecmp("Settings", h->SectionName, 8)) found = true; + } + } + if (UseUnicode) { + EncodeUnicode(buffer,"MMSSettings",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("MMSSettings", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Ringtone",8); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("Ringtone", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"TODO",4); + if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; + } else { + if (mystrncasecmp("TODO", h->SectionName, 4)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Startup",7); + if (mywstrncasecmp(buffer, h->SectionName, 7)) found = true; + } else { + if (mystrncasecmp("Startup", h->SectionName, 7)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Operator",7); + if (mywstrncasecmp(buffer, h->SectionName, 8)) found = true; + } else { + if (mystrncasecmp("Operator", h->SectionName, 8)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"FMStation",9); + if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true; + } else { + if (mystrncasecmp("FMStation", h->SectionName, 9)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"GPRSPoint",9); + if (mywstrncasecmp(buffer, h->SectionName, 9)) found = true; + } else { + if (mystrncasecmp("GPRSPoint", h->SectionName, 9)) found = true; + } + if (UseUnicode) { + EncodeUnicode(buffer,"Note",4); + if (mywstrncasecmp(buffer, h->SectionName, 4)) found = true; + } else { + if (mystrncasecmp("Note", h->SectionName, 4)) found = true; + } + if (!found) return ERR_NOTIMPLEMENTED; + } return ERR_NONE; } diff --git a/gammu/emb/common/service/backup/gsmback.c b/gammu/emb/common/service/backup/gsmback.c index 91ac745..c94a4d2 100644 --- a/gammu/emb/common/service/backup/gsmback.c +++ b/gammu/emb/common/service/backup/gsmback.c @@ -73,6 +73,18 @@ void GSM_FreeBackup(GSM_Backup *backup) i++; } i=0; + while (backup->SyncMLSettings[i]!=NULL) { + free(backup->SyncMLSettings[i]); + backup->SyncMLSettings[i] = NULL; + i++; + } + i=0; + while (backup->ChatSettings[i]!=NULL) { + free(backup->ChatSettings[i]); + backup->ChatSettings[i] = NULL; + i++; + } + i=0; while (backup->Ringtone[i]!=NULL) { free(backup->Ringtone[i]); backup->Ringtone[i] = NULL; @@ -120,15 +132,15 @@ void GSM_FreeBackup(GSM_Backup *backup) GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup, bool UseUnicode) { - if (strstr(FileName,".lmb")) { + if (mystrcasestr(FileName,".lmb")) { return SaveLMB(FileName,backup); - } else if (strstr(FileName,".vcs")) { + } else if (mystrcasestr(FileName,".vcs")) { return SaveVCalendar(FileName,backup); - } else if (strstr(FileName,".vcf")) { + } else if (mystrcasestr(FileName,".vcf")) { return SaveVCard(FileName,backup); - } else if (strstr(FileName,".ldif")) { + } else if (mystrcasestr(FileName,".ldif")) { return SaveLDIF(FileName,backup); - } else if (strstr(FileName,".ics")) { + } else if (mystrcasestr(FileName,".ics")) { return SaveICS(FileName,backup); } else { return SaveBackup(FileName,backup, UseUnicode); @@ -148,13 +160,13 @@ GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup) GSM_ClearBackup(backup); /* Attempt to identify filetype */ - if (strstr(FileName,".vcs")) { + if (mystrcasestr(FileName,".vcs")) { return LoadVCalendar(FileName,backup); - } else if (strstr(FileName,".vcf")) { + } else if (mystrcasestr(FileName,".vcf")) { return LoadVCard(FileName,backup); - } else if (strstr(FileName,".ldif")) { + } else if (mystrcasestr(FileName,".ldif")) { return LoadLDIF(FileName,backup); - } else if (strstr(FileName,".ics")) { + } else if (mystrcasestr(FileName,".ics")) { return LoadICS(FileName,backup); } else if (memcmp(buffer, "LMB ",4)==0) { return LoadLMB(FileName,backup); @@ -177,6 +189,8 @@ void GSM_ClearBackup(GSM_Backup *backup) backup->WAPBookmark [0] = NULL; backup->WAPSettings [0] = NULL; backup->MMSSettings [0] = NULL; + backup->SyncMLSettings [0] = NULL; + backup->ChatSettings [0] = NULL; backup->Ringtone [0] = NULL; backup->Profiles [0] = NULL; backup->ToDo [0] = NULL; @@ -209,6 +223,8 @@ void GSM_GetBackupFormatFeatures(char *FileName, GSM_Backup_Info *info) info->WAPBookmark = false; info->WAPSettings = false; info->MMSSettings = false; + info->SyncMLSettings = false; + info->ChatSettings = false; info->Ringtone = false; info->StartupLogo = false; info->OperatorLogo = false; @@ -246,6 +262,8 @@ void GSM_GetBackupFormatFeatures(char *FileName, GSM_Backup_Info *info) info->WAPBookmark = true; info->WAPSettings = true; info->MMSSettings = true; + info->SyncMLSettings = true; + info->ChatSettings = true; info->Ringtone = true; info->StartupLogo = true; info->OperatorLogo = true; diff --git a/gammu/emb/common/service/backup/gsmback.h b/gammu/emb/common/service/backup/gsmback.h index 1fd99b0..791e81d 100644 --- a/gammu/emb/common/service/backup/gsmback.h +++ b/gammu/emb/common/service/backup/gsmback.h @@ -29,6 +29,8 @@ typedef struct { bool Profiles; bool WAPSettings; bool MMSSettings; + bool SyncMLSettings; + bool ChatSettings; bool Ringtone; bool StartupLogo; bool OperatorLogo; diff --git a/gammu/emb/common/service/gsmcal.h b/gammu/emb/common/service/gsmcal.h index 067a4a4..0a41b7b 100644 --- a/gammu/emb/common/service/gsmcal.h +++ b/gammu/emb/common/service/gsmcal.h @@ -405,7 +405,7 @@ typedef struct { typedef struct { int Location; - char Text[100]; + char Text[3000*2]; } GSM_NoteEntry; GSM_Error GSM_EncodeVNTFile(unsigned char *Buffer, int *Length, GSM_NoteEntry *Note); diff --git a/gammu/emb/common/service/gsmdata.c b/gammu/emb/common/service/gsmdata.c index 94e9b7b..9303b57 100644 --- a/gammu/emb/common/service/gsmdata.c +++ b/gammu/emb/common/service/gsmdata.c @@ -246,13 +246,15 @@ void NOKIA_EncodeWAPMMSSettingsSMSText(unsigned char *Buffer, int *Length, GSM_W } /* http://forum.nokia.com: OTA Settings 7.0 */ +/* first it used default/ISO coding */ +/* Joergen Thomsen changed to UTF8 */ void NOKIA_EncodeWAPBookmarkSMSText(unsigned char *Buffer, int *Length, GSM_WAPBookmark *bookmark) { unsigned char buffer[100]; - bool UnicodeCoding = false; - EncodeUTF8QuotedPrintable(buffer,bookmark->Title); - if (UnicodeLength(bookmark->Title)!=strlen(buffer)) UnicodeCoding = true; +// bool UnicodeCoding = false; +// EncodeUTF8QuotedPrintable(buffer,bookmark->Title); +// if (UnicodeLength(bookmark->Title)!=strlen(buffer)) UnicodeCoding = true; Buffer[(*Length)++] = 0x01; //Push ID Buffer[(*Length)++] = 0x06; //PDU Type (push) @@ -265,34 +267,110 @@ void NOKIA_EncodeWAPBookmarkSMSText(unsigned char *Buffer, int *Length, GSM_WAPB strcpy(Buffer+(*Length),"\x81\xEA"); (*Length)=(*Length)+2; //charset UTF-8 short int. + /* removed by Joergen Thomsen */ /* Block from sniffs. UNKNOWN */ - if (!UnicodeCoding) { - Buffer[(*Length)++] = 0x00; - Buffer[(*Length)++] = 0x01; - } else { - strcpy(Buffer+(*Length),"\x01\x01\x87\x68"); - (*Length)=(*Length)+4; - } - Buffer[(*Length)++] = 0x00; +// if (!UnicodeCoding) { +// Buffer[(*Length)++] = 0x00; +// Buffer[(*Length)++] = 0x01; +// } else { +// strcpy(Buffer+(*Length),"\x01\x01\x87\x68"); +// (*Length)=(*Length)+4; +// } +// Buffer[(*Length)++] = 0x00; + + /* added by Joergen Thomsen */ + Buffer[(*Length)++] = 0x01; // Version WBXML 1.1 + Buffer[(*Length)++] = 0x01; // Unknown public identifier + Buffer[(*Length)++] = 0x6A; // charset UTF-8 + Buffer[(*Length)++] = 0x00; // string table length Buffer[(*Length)++] = 0x45; //CHARACTERISTIC-LIST with content /* URL */ Buffer[(*Length)++] = 0xC6; //CHARACTERISTIC with content and attributes Buffer[(*Length)++] = 0x7F; //TYPE = BOOKMARK Buffer[(*Length)++] = 0x01; //END PARMeter - if (!UnicodeCoding) { - /* TITLE */ - AddWAPSMSParameterText(Buffer, Length, 0x15, DecodeUnicodeString(bookmark->Title), UnicodeLength(bookmark->Title)); - /* URL */ - AddWAPSMSParameterText(Buffer, Length, 0x17, DecodeUnicodeString(bookmark->Address), UnicodeLength(bookmark->Address)); - } else { - /* TITLE */ - AddWAPSMSParameterText(Buffer, Length, 0x15, bookmark->Title, UnicodeLength(bookmark->Title)*2+1); - /* URL */ - AddWAPSMSParameterText(Buffer, Length, 0x17, bookmark->Address, UnicodeLength(bookmark->Address)*2+1); + + /* removed by Joergen Thomsen */ +// if (!UnicodeCoding) { +// /* TITLE */ +// AddWAPSMSParameterText(Buffer, Length, 0x15, DecodeUnicodeString(bookmark->Title), UnicodeLength(bookmark->Title)); +// /* URL */ +// AddWAPSMSParameterText(Buffer, Length, 0x17, DecodeUnicodeString(bookmark->Address), UnicodeLength(bookmark->Address)); +// } else { +// /* TITLE */ +// AddWAPSMSParameterText(Buffer, Length, 0x15, bookmark->Title, UnicodeLength(bookmark->Title)*2+1); +// /* URL */ +// AddWAPSMSParameterText(Buffer, Length, 0x17, bookmark->Address, UnicodeLength(bookmark->Address)*2+1); +// } + + /* added by Joergen Thomsen */ + /* TITLE */ + EncodeUTF8(buffer, bookmark->Title); + AddWAPSMSParameterText(Buffer, Length, 0x15, buffer, strlen(buffer)); + /* URL */ + EncodeUTF8(buffer, bookmark->Address); + AddWAPSMSParameterText(Buffer, Length, 0x17, buffer, strlen(buffer)); + + Buffer[(*Length)++] = 0x01; //END (CHARACTERISTIC) + Buffer[(*Length)++] = 0x01; //END (CHARACTERISTIC-LIST) +} + +void GSM_EncodeWAPIndicatorSMSText(unsigned char *Buffer, int *Length, char *Text, char *URL) +{ + int i; + + Buffer[(*Length)++] = 0x01; //Push ID + Buffer[(*Length)++] = 0x06; //PDU Type (push) + Buffer[(*Length)++] = 28; //Headers length (content type + headers) + strcpy(Buffer+(*Length),"\x1F\x23"); + (*Length)=(*Length)+2; //Value length + strcpy(Buffer+(*Length),"application/vnd.wap.sic"); + (*Length)=(*Length)+23; //MIME-Type + Buffer[(*Length)++] = 0x00; //end inline string + strcpy(Buffer+(*Length),"\x81\xEA"); + (*Length)=(*Length)+2; //charset UTF-8 short int. + + Buffer[(*Length)++] = 0x02; // WBXML 1.2 + Buffer[(*Length)++] = 0x05; // SI 1.0 Public Identifier + Buffer[(*Length)++] = 0x6A; // charset UTF-8 + Buffer[(*Length)++] = 0x00; // string table length + Buffer[(*Length)++] = 0x45; // SI with content + Buffer[(*Length)++] = 0xC6; // indication with content and attributes + Buffer[(*Length)++] = 0x0B; // address + Buffer[(*Length)++] = 0x03; // Inline string + for (i=0;i<(int)strlen(URL);i++) { + Buffer[(*Length)++] = URL[i];//Text } - Buffer[(*Length)++] = 0x01; //END PARMeter - Buffer[(*Length)++] = 0x01; //END PARMeter + Buffer[(*Length)++] = 0x00; // END Inline string + +#ifdef XXX + Buffer[(*Length)++] = 0x0A; // created... + Buffer[(*Length)++] = 0xC3; // OPAQUE + Buffer[(*Length)++] = 0x07; // length + Buffer[(*Length)++] = 0x19; // year + Buffer[(*Length)++] = 0x80; // year + Buffer[(*Length)++] = 0x21; // month + Buffer[(*Length)++] = 0x12; // .. + Buffer[(*Length)++] = 0x00; // .. + Buffer[(*Length)++] = 0x00; // .. + Buffer[(*Length)++] = 0x00; // .. + Buffer[(*Length)++] = 0x10; // expires + Buffer[(*Length)++] = 0xC3; // OPAQUE + Buffer[(*Length)++] = 0x04; // length + Buffer[(*Length)++] = 0x20; // year + Buffer[(*Length)++] = 0x10; // year + Buffer[(*Length)++] = 0x06; // month + Buffer[(*Length)++] = 0x25; // day +#endif + + Buffer[(*Length)++] = 0x01; // END (indication) + Buffer[(*Length)++] = 0x03; // Inline string + for (i=0;i<(int)strlen(Text);i++) { + Buffer[(*Length)++] = Text[i]; //Text + } + Buffer[(*Length)++] = 0x00; // END Inline string + Buffer[(*Length)++] = 0x01; // END (indication) + Buffer[(*Length)++] = 0x01; // END (SI) } void GSM_EncodeMMSFile(GSM_EncodeMultiPartMMSInfo *Info, unsigned char *Buffer, int *Length) diff --git a/gammu/emb/common/service/gsmdata.h b/gammu/emb/common/service/gsmdata.h index f5f8e07..e81589f 100644 --- a/gammu/emb/common/service/gsmdata.h +++ b/gammu/emb/common/service/gsmdata.h @@ -88,6 +88,8 @@ typedef struct { void GSM_EncodeMMSIndicatorSMSText(unsigned char *Buffer, int *Length, GSM_MMSIndicator Indicator); +void GSM_EncodeWAPIndicatorSMSText(unsigned char *Buffer, int *Length, char *Text, char *URL); + /* ------------------------------ MMS file --------------------------------- */ #define MAX_MULTI_MMS 20 diff --git a/gammu/emb/common/service/gsmlogo.c b/gammu/emb/common/service/gsmlogo.c index c992915..7c19967 100644 --- a/gammu/emb/common/service/gsmlogo.c +++ b/gammu/emb/common/service/gsmlogo.c @@ -2,6 +2,7 @@ #include <string.h> #include <stdlib.h> +#include <sys/stat.h> #include "../misc/misc.h" #include "../misc/coding/coding.h" @@ -161,6 +162,7 @@ void PHONE_DecodeBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *B Bitmap->Sender[0] = 0; Bitmap->Sender[1] = 0; Bitmap->ID = 0; + Bitmap->Name = NULL; GSM_ClearBitmap(Bitmap); for (x=0;x<Bitmap->BitmapWidth;x++) { @@ -626,17 +628,17 @@ GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_MultiBitmap *bitmap) if (file == NULL) return ERR_CANTOPENFILE; /* Attempt to identify filetype */ - if (strstr(FileName,".nlm")) { + if (mystrcasestr(FileName,".nlm")) { error=savenlm(file,bitmap); - } else if (strstr(FileName,".ngg")) { + } else if (mystrcasestr(FileName,".ngg")) { error=savengg(file,bitmap); - } else if (strstr(FileName,".nol")) { + } else if (mystrcasestr(FileName,".nol")) { error=savenol(file,bitmap); - } else if (strstr(FileName,".xpm")) { + } else if (mystrcasestr(FileName,".xpm")) { error=savexpm(file,bitmap); - } else if (strstr(FileName,".nsl")) { + } else if (mystrcasestr(FileName,".nsl")) { error=savensl(file,bitmap); - } else if (strstr(FileName,".wbmp")) { + } else if (mystrcasestr(FileName,".wbmp")) { error=savewbmp(file,bitmap); } else { error=savebmp(file,bitmap); @@ -955,6 +957,33 @@ static GSM_Error loadwbmp(FILE *file, GSM_MultiBitmap *bitmap) return ERR_NONE; } +static GSM_Error loadgif(FILE *file, GSM_MultiBitmap *bitmap) +{ + GSM_Bitmap *bmap = &bitmap->Bitmap[0]; + char *buffer; + struct stat st; + int length; + + dbgprintf("loading gif file\n"); + fstat(fileno(file), &st); + bmap->BinaryPic.Length = length = st.st_size; + bmap->BinaryPic.Buffer = buffer = malloc(length); + if (bmap->BinaryPic.Buffer == NULL) + return ERR_MOREMEMORY; + + fread(buffer, 1, length, file); + dbgprintf("Length %i name \"%s\"\n", length, + DecodeUnicodeString(bmap->Name)); + + bmap->Type = GSM_PictureBinary; + bmap->BinaryPic.Type = PICTURE_GIF; + bmap->BitmapWidth = 256 * buffer[7] + buffer[6]; + bmap->BitmapHeight = 256 * buffer[9] + buffer[8]; + bitmap->Number = 1; + + return ERR_NONE; +} + GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap *bitmap) { FILE *file; @@ -963,6 +992,10 @@ GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap *bitmap) file = fopen(FileName, "rb"); if (file == NULL) return ERR_CANTOPENFILE; + bitmap->Bitmap[0].Name = malloc((strlen(FileName) + 1) * 2); + if (bitmap->Bitmap[0].Name == NULL) return ERR_MOREMEMORY; + EncodeUnicode(bitmap->Bitmap[0].Name, FileName, strlen(FileName)); + fread(buffer, 1, 9, file); /* Read the header of the file. */ rewind(file); @@ -981,6 +1014,8 @@ GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap *bitmap) return loadnolngg(file,bitmap,false); } else if (memcmp(buffer, "FORM",4)==0) { return loadnsl(file,bitmap); + } else if (memcmp(buffer, "GIF",3)==0) { + return loadgif(file,bitmap); } return ERR_UNKNOWN; } diff --git a/gammu/emb/common/service/gsmlogo.h b/gammu/emb/common/service/gsmlogo.h index b1b579d..6c6e2d8 100644 --- a/gammu/emb/common/service/gsmlogo.h +++ b/gammu/emb/common/service/gsmlogo.h @@ -5,6 +5,20 @@ #include "../gsmcomon.h" +typedef enum { + PICTURE_BMP = 1, + PICTURE_GIF, + PICTURE_JPG, + PICTURE_ICN, + PICTURE_PNG +} GSM_BinaryPicture_Types; + +typedef struct { + GSM_BinaryPicture_Types Type; + unsigned char *Buffer; + int Length; +} GSM_BinaryPicture; + /** * Enum to handle all possible bitmaps, which are not saved in various filesystems. */ @@ -45,7 +59,11 @@ typedef enum { /** * Image defined in Smart Messaging specification */ - GSM_PictureImage + GSM_PictureImage, + /** + * Binary picture (BMP, GIF, etc.) + */ + GSM_PictureBinary } GSM_Bitmap_Types; #define GSM_BITMAP_SIZE (65+7)/8*96 @@ -115,6 +133,14 @@ typedef struct { * For colour bitmaps: ID */ unsigned char ID; + /** + * For binary pictures (GIF, BMP, etc.): frame and length + */ + GSM_BinaryPicture BinaryPic; + /** + * Bitmap name + */ + char *Name; } GSM_Bitmap; #define MAX_MULTI_BITMAP 6 diff --git a/gammu/emb/common/service/gsmmisc.h b/gammu/emb/common/service/gsmmisc.h index 37501ad..793d3d1 100644 --- a/gammu/emb/common/service/gsmmisc.h +++ b/gammu/emb/common/service/gsmmisc.h @@ -292,7 +292,12 @@ typedef struct { typedef enum { GSM_Date_DDMMYYYY = 1, GSM_Date_MMDDYYYY, - GSM_Date_YYYYMMDD + GSM_Date_YYYYMMDD, + GSM_Date_DDMMMYY, + GSM_Date_MMDDYY, + GSM_Date_DDMMYY, + GSM_Date_YYMMDD, + GSM_Date_OFF } GSM_DateFormat; typedef struct { diff --git a/gammu/emb/common/service/gsmring.c b/gammu/emb/common/service/gsmring.c index 7df46f1..dab028c 100644 --- a/gammu/emb/common/service/gsmring.c +++ b/gammu/emb/common/service/gsmring.c @@ -1,12 +1,15 @@ /* (c) 2001-2004 by Marcin Wiacek */ -/* Based on some work from Ralf Thelen (7110 ringtones), - * Gnokii (RTTL and SM) and others +/* Based on some work from Ralf Thelen (7110 ringtones) and others */ +/* Based on some work (RTTL and SM) from Gnokii (www.gnokii.org) + * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot + * GNU GPL version 2 or later */ #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> +#include <sys/stat.h> #ifdef WIN32 # include <windows.h> #endif @@ -156,6 +159,12 @@ static GSM_Error savepuremidi(FILE *file, GSM_Ringtone *ringtone) return ERR_NONE; } +static GSM_Error savemmf(FILE *file, GSM_Ringtone *ringtone) +{ + fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file); + return ERR_NONE; +} + GSM_Error saverttl(FILE *file, GSM_Ringtone *ringtone) { GSM_RingNoteScale DefNoteScale; @@ -485,6 +494,9 @@ GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone) case RING_MIDI: savepuremidi(file, ringtone); break; + case RING_MMF: + savemmf(file, ringtone); + break; } fclose(file); @@ -769,6 +781,26 @@ static GSM_Error loadpuremidi(FILE *file, GSM_Ringtone *ringtone) return ERR_NONE; } +static GSM_Error loadmmf(FILE *file, GSM_Ringtone *ringtone) +{ + struct stat st; + char *buffer; + int length; + + dbgprintf("loading smaf file\n"); + fstat(fileno(file), &st); + ringtone->BinaryTone.Length = length = st.st_size; + ringtone->BinaryTone.Buffer = buffer = malloc(length); + if (buffer == NULL) + return ERR_MOREMEMORY; + fread(buffer, 1, length, file); + + dbgprintf("Length %i name \"%s\"\n", length, + DecodeUnicodeString(ringtone->Name)); + + return ERR_NONE; +} + static GSM_Error loadre(FILE *file, GSM_Ringtone *ringtone) { unsigned char buffer[2000]; @@ -816,6 +848,10 @@ GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone) buffer[2]==0x68 && buffer[3]==0x64) { ringtone->Format = RING_MIDI; } + if (buffer[0]==0x4D && buffer[1]==0x4D && + buffer[2]==0x4D && buffer[3]==0x44) { + ringtone->Format = RING_MMF; + } } rewind(file); switch (ringtone->Format) { @@ -842,6 +878,11 @@ GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone) case RING_MIDI: EncodeUnicode(ringtone->Name,FileName,strlen(FileName)); error = loadpuremidi(file,ringtone); + break; + case RING_MMF: + EncodeUnicode(ringtone->Name,FileName,strlen(FileName)); + error = loadmmf(file,ringtone); + break; } fclose(file); return(error); diff --git a/gammu/emb/common/service/gsmring.h b/gammu/emb/common/service/gsmring.h index 207cf31..2d2dd7a 100644 --- a/gammu/emb/common/service/gsmring.h +++ b/gammu/emb/common/service/gsmring.h @@ -120,21 +120,23 @@ typedef struct { bool AllNotesScale; } GSM_NoteRingtone; +/* FIXME: should use BinaryTone instead? */ /* Structure to hold Nokia binary ringtones. */ typedef struct { - unsigned char Frame[30000]; + unsigned char Frame[50000]; int Length; } GSM_NokiaBinaryRingtone; typedef struct { - unsigned char *Frame; + unsigned char *Buffer; int Length; } GSM_BinaryTone; typedef enum { RING_NOTETONE = 1, RING_NOKIABINARY, - RING_MIDI + RING_MIDI, + RING_MMF } GSM_RingtoneFormat; /** diff --git a/gammu/emb/common/service/sms/gsmmulti.c b/gammu/emb/common/service/sms/gsmmulti.c index 6c1cdcd..bdb5ee9 100644 --- a/gammu/emb/common/service/sms/gsmmulti.c +++ b/gammu/emb/common/service/sms/gsmmulti.c @@ -487,6 +487,11 @@ GSM_Error GSM_EncodeMultiPartSMS(GSM_MultiPartSMSInfo *Info, UDH = UDH_MMSIndicatorLong; GSM_EncodeMMSIndicatorSMSText(Buffer,&Length,*Info->Entries[0].MMSIndicator); break; + case SMS_WAPIndicatorLong: + Class = 1; + UDH = UDH_MMSIndicatorLong; + GSM_EncodeWAPIndicatorSMSText(Buffer,&Length,Info->Entries[0].MMSIndicator->Title,Info->Entries[0].MMSIndicator->Address); + break; case SMS_NokiaRingtoneLong: case SMS_NokiaRingtone: UDH = UDH_NokiaRingtone; diff --git a/gammu/emb/common/service/sms/gsmmulti.h b/gammu/emb/common/service/sms/gsmmulti.h index c672261..3f70d81 100644 --- a/gammu/emb/common/service/sms/gsmmulti.h +++ b/gammu/emb/common/service/sms/gsmmulti.h @@ -3,6 +3,10 @@ #ifndef __gsm_multi_h #define __gsm_multi_h +#if defined(_MSC_VER) && defined(__cplusplus) + extern "C" { +#endif + #include "../../gsmcomon.h" #include "../gsmlogo.h" #include "../gsmcal.h" @@ -172,7 +176,7 @@ typedef enum { * IMelody 1.0 with UPI. */ SMS_EMSSound10Long, - /*** + /** * IMelody 1.2 with UPI. */ SMS_EMSSound12Long, @@ -190,6 +194,7 @@ typedef enum { SMS_EMSVariableBitmap, SMS_EMSVariableBitmapLong, SMS_MMSIndicatorLong, + SMS_WAPIndicatorLong, /** * Variable bitmap with black and white colors */ @@ -264,6 +269,10 @@ void GSM_FreeMultiPartSMSInfo (GSM_MultiPartSMSInfo *Info); */ GSM_Error GSM_LinkSMS(GSM_MultiSMSMessage **INPUT, GSM_MultiSMSMessage **OUTPUT, bool ems); +#if defined(_MSC_VER) && defined(__cplusplus) + } +#endif + #endif /* How should editor hadle tabs in this file? Add editor commands here. diff --git a/gammu/emb/common/service/sms/gsmsms.c b/gammu/emb/common/service/sms/gsmsms.c index 9920835..feceba4 100644 --- a/gammu/emb/common/service/sms/gsmsms.c +++ b/gammu/emb/common/service/sms/gsmsms.c @@ -1,5 +1,8 @@ /* (c) 2001-2004 by Marcin Wiacek */ -/* based on some work from Pawel Kot, others and Gnokii */ +/* Based on some Pawel Kot and others work from Gnokii (www.gnokii.org) + * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot + * GNU GPL version 2 or later + */ #include <ctype.h> #include <string.h> diff --git a/gammu/emb/common/service/sms/gsmsms.h b/gammu/emb/common/service/sms/gsmsms.h index d87ff60..0b950d3 100644 --- a/gammu/emb/common/service/sms/gsmsms.h +++ b/gammu/emb/common/service/sms/gsmsms.h @@ -1,5 +1,8 @@ /* (c) 2001-2004 by Marcin Wiacek */ -/* based on some work from Pawel Kot, others and Gnokii */ +/* Based on some Pawel Kot and others work from Gnokii (www.gnokii.org) + * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot + * GNU GPL version 2 or later + */ #ifndef __gsm_sms_h #define __gsm_sms_h |