summaryrefslogtreecommitdiffabout
path: root/gammu/emb/common/service/gsmmisc.c
Side-by-side diff
Diffstat (limited to 'gammu/emb/common/service/gsmmisc.c') (more/less context) (ignore whitespace changes)
-rw-r--r--gammu/emb/common/service/gsmmisc.c262
1 files changed, 262 insertions, 0 deletions
diff --git a/gammu/emb/common/service/gsmmisc.c b/gammu/emb/common/service/gsmmisc.c
new file mode 100644
index 0000000..6959a22
--- a/dev/null
+++ b/gammu/emb/common/service/gsmmisc.c
@@ -0,0 +1,262 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+#include <string.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#ifdef WIN32
+# include <io.h>
+# include <fcntl.h>
+#endif
+
+#include "../misc/coding/coding.h"
+#include "../gsmcomon.h"
+#include "gsmmisc.h"
+
+struct keys_table_position {
+ char whatchar;
+ int whatcode;
+};
+
+static struct keys_table_position Keys[] = {
+ {'m',GSM_KEY_MENU}, {'M',GSM_KEY_MENU},
+ {'n',GSM_KEY_NAMES}, {'N',GSM_KEY_NAMES},
+ {'p',GSM_KEY_POWER}, {'P',GSM_KEY_POWER},
+ {'u',GSM_KEY_UP}, {'U',GSM_KEY_UP},
+ {'d',GSM_KEY_DOWN}, {'D',GSM_KEY_DOWN},
+ {'+',GSM_KEY_INCREASEVOLUME}, {'-',GSM_KEY_DECREASEVOLUME},
+ {'1',GSM_KEY_1}, {'2',GSM_KEY_2}, {'3',GSM_KEY_3},
+ {'4',GSM_KEY_4}, {'5',GSM_KEY_5}, {'6',GSM_KEY_6},
+ {'7',GSM_KEY_7}, {'8',GSM_KEY_8}, {'9',GSM_KEY_9},
+ {'*',GSM_KEY_ASTERISK}, {'0',GSM_KEY_0}, {'#',GSM_KEY_HASH},
+ {'g',GSM_KEY_GREEN}, {'G',GSM_KEY_GREEN},
+ {'r',GSM_KEY_RED}, {'R',GSM_KEY_RED},
+ {' ',0}
+};
+
+GSM_Error MakeKeySequence(char *text, GSM_KeyCode *KeyCode, int *Length)
+{
+ int i,j;
+ unsigned char key;
+
+ for (i=0;i<(int)(strlen(text));i++) {
+ key = text[i];
+ KeyCode[i] = GSM_KEY_NONE;
+ j = 0;
+ while (Keys[j].whatchar!=' ') {
+ if (Keys[j].whatchar==key) {
+ KeyCode[i]=Keys[j].whatcode;
+ break;
+ }
+ j++;
+ }
+ if (KeyCode[i] == GSM_KEY_NONE) {
+ *Length = i;
+ return ERR_NOTSUPPORTED;
+ }
+ }
+ *Length = i;
+ return ERR_NONE;
+}
+
+GSM_Error GSM_ReadFile(char *FileName, GSM_File *File)
+{
+ int i = 1000;
+ FILE *file;
+ struct stat fileinfo;
+
+ if (FileName[0] == 0x00) return ERR_UNKNOWN;
+ file = fopen(FileName,"rb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ free(File->Buffer);
+ File->Buffer = NULL;
+ File->Used = 0;
+ while (i == 1000) {
+ File->Buffer = realloc(File->Buffer,File->Used + 1000);
+ i = fread(File->Buffer+File->Used,1,1000,file);
+ File->Used = File->Used + i;
+ }
+ File->Buffer = realloc(File->Buffer,File->Used);
+ fclose(file);
+
+ File->ModifiedEmpty = true;
+ if (stat(FileName,&fileinfo) == 0) {
+ File->ModifiedEmpty = false;
+ dbgprintf("File info read correctly\n");
+ //st_mtime is time of last modification of file
+ Fill_GSM_DateTime(&File->Modified, fileinfo.st_mtime);
+ File->Modified.Year = File->Modified.Year + 1900;
+ dbgprintf("FileTime: %02i-%02i-%04i %02i:%02i:%02i\n",
+ File->Modified.Day,File->Modified.Month,File->Modified.Year,
+ File->Modified.Hour,File->Modified.Minute,File->Modified.Second);
+ }
+
+ return ERR_NONE;
+}
+
+static void GSM_JADFindLine(GSM_File File, char *Name, char *Value)
+{
+ unsigned char Line[2000];
+ int Pos = 0;
+
+ Value[0] = 0;
+
+ while (1) {
+ MyGetLine(File.Buffer, &Pos, Line, File.Used);
+ if (strlen(Line) == 0) break;
+ if (!strncmp(Line,Name,strlen(Name))) {
+ Pos = strlen(Name);
+ while (Line[Pos] == 0x20) Pos++;
+ strcpy(Value,Line+Pos);
+ return;
+ }
+ }
+}
+
+GSM_Error GSM_JADFindData(GSM_File File, char *Vendor, char *Name, char *JAR, char *Version, int *Size)
+{
+ char Size2[200];
+
+ GSM_JADFindLine(File, "MIDlet-Vendor:", Vendor);
+ if (Vendor[0] == 0x00) return ERR_FILENOTSUPPORTED;
+ dbgprintf("Vendor: \"%s\"\n",Vendor);
+
+ GSM_JADFindLine(File, "MIDlet-Name:", Name);
+ if (Name[0] == 0x00) return ERR_FILENOTSUPPORTED;
+ dbgprintf("Name: \"%s\"\n",Name);
+
+ GSM_JADFindLine(File, "MIDlet-Jar-URL:", JAR);
+ if (JAR[0] == 0x00) return ERR_FILENOTSUPPORTED;
+ dbgprintf("JAR file URL: \"%s\"\n",JAR);
+
+ GSM_JADFindLine(File, "MIDlet-Jar-Size:", Size2);
+ *Size = -1;
+ if (Size2[0] == 0x00) return ERR_FILENOTSUPPORTED;
+ dbgprintf("JAR size: \"%s\"\n",Size2);
+ (*Size) = atoi(Size2);
+
+ GSM_JADFindLine(File, "MIDlet-Version:", Version);
+ dbgprintf("Version: \"%s\"\n",Version);
+
+ return ERR_NONE;
+}
+
+void GSM_IdentifyFileFormat(GSM_File *File)
+{
+ File->Type = GSM_File_Other;
+ if (File->Used > 2) {
+ if (memcmp(File->Buffer, "BM",2)==0) {
+ File->Type = GSM_File_Image_BMP;
+ } else if (memcmp(File->Buffer, "GIF",3)==0) {
+ File->Type = GSM_File_Image_GIF;
+ } else if (File->Buffer[0] == 0x00 && File->Buffer[1] == 0x00) {
+ File->Type = GSM_File_Image_WBMP;
+ } else if (memcmp(File->Buffer+1, "PNG",3)==0) {
+ File->Type = GSM_File_Image_PNG;
+ } else if (File->Buffer[0] == 0xFF && File->Buffer[1] == 0xD8) {
+ File->Type = GSM_File_Image_JPG;
+ } else if (memcmp(File->Buffer, "MThd",4)==0) {
+ File->Type = GSM_File_Sound_MIDI;
+ } else if (File->Buffer[0] == 0x00 && File->Buffer[1] == 0x02) {
+ File->Type = GSM_File_Sound_NRT;
+ }
+ }
+}
+
+void SaveVCALDateTime(char *Buffer, int *Length, GSM_DateTime *Date, char *Start)
+{
+ if (Start != NULL) {
+ *Length+=sprintf(Buffer+(*Length), "%s:",Start);
+ }
+ *Length+=sprintf(Buffer+(*Length), "%04d%02d%02dT%02d%02d%02d%c%c",
+ Date->Year, Date->Month, Date->Day,
+ Date->Hour, Date->Minute, Date->Second,13,10);
+}
+
+void ReadVCALDateTime(char *Buffer, GSM_DateTime *dt)
+{
+ char year[5]="", month[3]="", day[3]="", hour[3]="", minute[3]="", second[3]="";
+
+ memset(dt,0,sizeof(dt));
+
+ strncpy(year, Buffer, 4);
+ strncpy(month, Buffer+4, 2);
+ strncpy(day, Buffer+6, 2);
+ strncpy(hour, Buffer+9, 2);
+ strncpy(minute, Buffer+11, 2);
+ strncpy(second, Buffer+13, 2);
+
+ /* FIXME: Should check ranges... */
+ dt->Year = atoi(year);
+ dt->Month = atoi(month);
+ dt->Day = atoi(day);
+ dt->Hour = atoi(hour);
+ dt->Minute = atoi(minute);
+ dt->Second = atoi(second);
+ /* FIXME */
+ dt->Timezone = 0;
+}
+
+void SaveVCALText(char *Buffer, int *Length, char *Text, char *Start)
+{
+ char buffer[1000];
+
+ if (UnicodeLength(Text) != 0) {
+ EncodeUTF8QuotedPrintable(buffer,Text);
+ if (UnicodeLength(Text)==strlen(buffer)) {
+ *Length+=sprintf(Buffer+(*Length), "%s:%s%c%c",Start,DecodeUnicodeString(Text),13,10);
+ } else {
+ *Length+=sprintf(Buffer+(*Length), "%s;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c",Start,buffer,13,10);
+ }
+ }
+}
+
+bool ReadVCALText(char *Buffer, char *Start, char *Value)
+{
+ unsigned char buff[200];
+
+ Value[0] = 0x00;
+ Value[1] = 0x00;
+
+ strcpy(buff,Start);
+ strcat(buff,":");
+ if (!strncmp(Buffer,buff,strlen(buff))) {
+ EncodeUnicode(Value,Buffer+strlen(Start)+1,strlen(Buffer)-(strlen(Start)+1));
+ dbgprintf("ReadVCalText is \"%s\"\n",DecodeUnicodeConsole(Value));
+ return true;
+ }
+ /* SE T68i */
+ strcpy(buff,Start);
+ strcat(buff,";ENCODING=QUOTED-PRINTABLE:");
+ if (!strncmp(Buffer,buff,strlen(buff))) {
+ DecodeUTF8QuotedPrintable(Value,Buffer+strlen(Start)+27,strlen(Buffer)-(strlen(Start)+27));
+ dbgprintf("ReadVCalText is \"%s\"\n",DecodeUnicodeConsole(Value));
+ return true;
+ }
+ strcpy(buff,Start);
+ strcat(buff,";CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:");
+ if (!strncmp(Buffer,buff,strlen(buff))) {
+ DecodeUTF8QuotedPrintable(Value,Buffer+strlen(Start)+41,strlen(Buffer)-(strlen(Start)+41));
+ dbgprintf("ReadVCalText is \"%s\"\n",DecodeUnicodeConsole(Value));
+ return true;
+ }
+ strcpy(buff,Start);
+ strcat(buff,";CHARSET=UTF-8:");
+ if (!strncmp(Buffer,buff,strlen(buff))) {
+ DecodeUTF8(Value,Buffer+strlen(Start)+15,strlen(Buffer)-(strlen(Start)+15));
+ dbgprintf("ReadVCalText is \"%s\"\n",DecodeUnicodeConsole(Value));
+ return true;
+ }
+ strcpy(buff,Start);
+ strcat(buff,";CHARSET=UTF-7:");
+ if (!strncmp(Buffer,buff,strlen(buff))) {
+ DecodeUTF7(Value,Buffer+strlen(Start)+15,strlen(Buffer)-(strlen(Start)+15));
+ dbgprintf("ReadVCalText is \"%s\"\n",DecodeUnicodeConsole(Value));
+ return true;
+ }
+ return false;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */