Diffstat (limited to 'gammu/emb/common/phone/nokia/dct4/n3650.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | gammu/emb/common/phone/nokia/dct4/n3650.c | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/gammu/emb/common/phone/nokia/dct4/n3650.c b/gammu/emb/common/phone/nokia/dct4/n3650.c new file mode 100644 index 0000000..2da55bf --- a/dev/null +++ b/gammu/emb/common/phone/nokia/dct4/n3650.c @@ -0,0 +1,392 @@ +/* (c) 2003 by Marcin Wiacek */ + +#include "../../../gsmstate.h" + +#ifdef GSM_ENABLE_NOKIA3650 + +#include <string.h> +#include <time.h> + +#include "../../../gsmcomon.h" +#include "../../../misc/coding/coding.h" +#include "../../../service/gsmlogo.h" +#include "../nfunc.h" +#include "../nfuncold.h" +#include "../../pfunc.h" +#include "dct4func.h" +#include "n3650.h" + +static GSM_Error N3650_ReplyGetFilePart(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + int old; + + smprintf(s,"File part received\n"); + old = s->Phone.Data.File->Used; + + if (msg.Length < 10) { + if (old == 0) return ERR_UNKNOWN; + return ERR_EMPTY; + } + + s->Phone.Data.File->Used += msg.Buffer[10]*256*256*256+ + msg.Buffer[11]*256*256+ + msg.Buffer[12]*256+ + msg.Buffer[13]; + smprintf(s,"Length: %i\n", + msg.Buffer[10]*256*256*256+ + msg.Buffer[11]*256*256+ + msg.Buffer[12]*256+ + msg.Buffer[13]); + s->Phone.Data.File->Buffer = (unsigned char *)realloc(s->Phone.Data.File->Buffer,s->Phone.Data.File->Used); + memcpy(s->Phone.Data.File->Buffer+old,msg.Buffer+18,s->Phone.Data.File->Used-old); + if (s->Phone.Data.File->Used-old < 0x03 * 256 + 0xD4) return ERR_EMPTY; + return ERR_NONE; +} + +static GSM_Error N3650_GetFilePart(GSM_StateMachine *s, GSM_File *File) +{ + unsigned int len=10,i; + GSM_Error error; + unsigned char StartReq[500] = { + N7110_FRAME_HEADER, 0x0D, 0x10, 0x01, 0x07, + 0x24, /* len1 */ + 0x12, /* len2 */ + 0x0E, /* len3 */ + 0x00}; /* File name */ + unsigned char ContinueReq[] = { + N7110_FRAME_HEADER, 0x0D, 0x20, 0x01, 0xF0, + 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}; + + if (File->Used == 0) { + sprintf(StartReq+10,"%s",File->ID_FullName); + len+=strlen(File->ID_FullName)-1; + StartReq[7] = strlen(File->ID_FullName) + 3; + + StartReq[8] = strlen(File->ID_FullName); + StartReq[9] = 0; + while (File->ID_FullName[StartReq[8]] != '\\') { + StartReq[8]--; + StartReq[9]++; + } + for (i=StartReq[8];i<strlen(File->ID_FullName);i++) { + StartReq[i+10] = StartReq[i+1+10]; + } + StartReq[9]--; + + EncodeUnicode(File->Name,File->ID_FullName+StartReq[8]+1,StartReq[9]); + File->Folder = false; + + error = DCT4_SetPhoneMode(s, DCT4_MODE_TEST); + if (error != ERR_NONE) return error; + + s->Phone.Data.File = File; + return GSM_WaitFor (s, StartReq, len, 0x58, 4, ID_GetFile); + } + + s->Phone.Data.File = File; + error = GSM_WaitFor (s, ContinueReq, 14, 0x58, 4, ID_GetFile); + +// if (error == GE_EMPTY) { +// error = DCT4_SetPhoneMode(s, DCT4_MODE_NORMAL); +// if (error != ERR_NONE) return error; +// return GE_EMPTY; +// } + + return error; +} + +static GSM_Error N3650_ReplyGetFolderInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + GSM_File *File = s->Phone.Data.FileInfo; + GSM_Phone_N3650Data *Priv = &s->Phone.Data.Priv.N3650; + int i,pos = 6; + + i = Priv->FilesLocationsUsed-1; + while (1) { + if (i==Priv->FilesLocationsCurrent-1) break; + dbgprintf("Copying %i to %i, max %i, current %i\n", + i,i+msg.Buffer[5], + Priv->FilesLocationsUsed,Priv->FilesLocationsCurrent); + memcpy(Priv->Files[i+msg.Buffer[5]],Priv->Files[i],sizeof(GSM_File)); + i--; + } + Priv->FileEntries = msg.Buffer[5]; + Priv->FilesLocationsUsed += msg.Buffer[5]; + for (i=0;i<msg.Buffer[5];i++) { + Priv->Files[Priv->FilesLocationsCurrent+i]->Folder = true; + if (msg.Buffer[pos+2] == 0x01) { + Priv->Files[Priv->FilesLocationsCurrent+i]->Folder = false; + smprintf(s,"File "); + } + EncodeUnicode(Priv->Files[Priv->FilesLocationsCurrent+i]->Name,msg.Buffer+pos+9,msg.Buffer[pos+8]); + smprintf(s,"%s\n",DecodeUnicodeString(Priv->Files[Priv->FilesLocationsCurrent+i]->Name)); + Priv->Files[Priv->FilesLocationsCurrent+i]->Level = File->Level+1; + sprintf(Priv->Files[Priv->FilesLocationsCurrent+i]->ID_FullName,"%s\\%s",File->ID_FullName,msg.Buffer+pos+9); + pos+=msg.Buffer[pos+1]; + } + dbgprintf("\n"); + return ERR_NONE; +} + +static GSM_Error N3650_GetFolderInfo(GSM_StateMachine *s, GSM_File *File) +{ + int len=10; + unsigned char req[500] = { + N7110_FRAME_HEADER, 0x0B, 0x00, 0x01, 0x07, + 0x18, /* folder name length + 6 */ + 0x12, /* folder name length */ + 0x00, + 0x00}; /* folder name */ + + sprintf(req+10,File->ID_FullName); + len +=strlen(File->ID_FullName); + req[7] = strlen(File->ID_FullName) + 6; + req[8] = strlen(File->ID_FullName); + req[len++] = 0x00; + req[len++] = 0x00; + + s->Phone.Data.FileInfo = File; + return GSM_WaitFor (s, req, len, 0x58, 4, ID_GetFile); +} + +static GSM_Error N3650_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, bool start) +{ + GSM_Error error; + GSM_Phone_N3650Data *Priv = &s->Phone.Data.Priv.N3650; + + if (start) { + error = DCT4_SetPhoneMode(s, DCT4_MODE_LOCAL); + if (error != ERR_NONE) return error; + + Priv->Files[0]->Folder = true; + Priv->Files[0]->Level = 1; + Priv->Files[0]->Name[0] = 0; + Priv->Files[0]->Name[1] = 0; + Priv->Files[0]->ID_FullName[0] = 'Z'; + Priv->Files[0]->ID_FullName[1] = ':'; + Priv->Files[0]->ID_FullName[2] = 0; + + Priv->Files[1]->Folder = true; + Priv->Files[1]->Level = 1; + Priv->Files[1]->Name[0] = 0; + Priv->Files[1]->Name[1] = 0; + Priv->Files[1]->ID_FullName[0] = 'E'; + Priv->Files[1]->ID_FullName[1] = ':'; + Priv->Files[1]->ID_FullName[2] = 0; + + Priv->Files[2]->Folder = true; + Priv->Files[2]->Level = 1; + Priv->Files[2]->Name[0] = 0; + Priv->Files[2]->Name[1] = 0; + Priv->Files[2]->ID_FullName[0] = 'C'; + Priv->Files[2]->ID_FullName[1] = ':'; + Priv->Files[2]->ID_FullName[2] = 0; + + Priv->FilesLocationsUsed = 3; + Priv->FilesLocationsCurrent = 0; + Priv->FileLev = 1; + } + + if (Priv->FilesLocationsCurrent == Priv->FilesLocationsUsed) { +// error = DCT4_SetPhoneMode(s, DCT4_MODE_NORMAL); +// if (error != ERR_NONE) return error; + + return ERR_EMPTY; + } + + strcpy(File->ID_FullName,Priv->Files[Priv->FilesLocationsCurrent]->ID_FullName); + File->Level = Priv->Files[Priv->FilesLocationsCurrent]->Level; + File->Folder = Priv->Files[Priv->FilesLocationsCurrent]->Folder; + CopyUnicodeString(File->Name,Priv->Files[Priv->FilesLocationsCurrent]->Name); + Priv->FilesLocationsCurrent++; + + if (!File->Folder) return ERR_NONE; + + if (Priv->FilesLocationsCurrent > 1) { + if (File->ID_FullName[0]!=Priv->Files[Priv->FilesLocationsCurrent-2]->ID_FullName[0]) { + if (File->ID_FullName[0] == 'E') { + error = DCT4_SetPhoneMode(s, DCT4_MODE_TEST); + error = DCT4_SetPhoneMode(s, DCT4_MODE_TEST); + } + if (File->ID_FullName[0] == 'C') { + error = DCT4_SetPhoneMode(s, DCT4_MODE_LOCAL); + error = DCT4_SetPhoneMode(s, DCT4_MODE_LOCAL); + } +// if (error != ERR_NONE) return error; + } + } + + File->ReadOnly = false; + File->System = false; + File->Protected = false; + File->Hidden = false; + + return N3650_GetFolderInfo(s, File); +} + +static GSM_Error N3650_Initialise (GSM_StateMachine *s) +{ + GSM_Phone_N3650Data *Priv = &s->Phone.Data.Priv.N3650; + int i; + + for (i=0;i<10000;i++) { + Priv->Files[i] = malloc(sizeof(GSM_File)); + if (Priv->Files[i] == NULL) return ERR_MOREMEMORY; + } + return ERR_NONE; +} + +static GSM_Error N3650_Terminate(GSM_StateMachine *s) +{ + GSM_Phone_N3650Data *Priv = &s->Phone.Data.Priv.N3650; + int i; + + for (i=0;i<10000;i++) free(Priv->Files[i]); + return ERR_NONE; +} + +static GSM_Reply_Function N3650ReplyFunctions[] = { + {DCT4_ReplySetPhoneMode, "\x15",0x03,0x64,ID_Reset }, + {DCT4_ReplyGetPhoneMode, "\x15",0x03,0x65,ID_Reset }, + {NoneReply, "\x15",0x03,0x68,ID_Reset }, + + {DCT4_ReplyGetIMEI, "\x1B",0x03,0x01,ID_GetIMEI }, + {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x08,ID_GetHardware }, + {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x0C,ID_GetProductCode }, + + {N3650_ReplyGetFolderInfo, "\x58",0x03,0x0C,ID_GetFile }, + {N3650_ReplyGetFilePart, "\x58",0x03,0x0E,ID_GetFile }, + + {NULL, "\x00",0x00,0x00,ID_None } +}; + +GSM_Phone_Functions N3650Phone = { + "3650|NGAGE", + N3650ReplyFunctions, + N3650_Initialise, + N3650_Terminate, + GSM_DispatchMessage, + NOTSUPPORTED, /* ShowStartInfo */ + NOKIA_GetManufacturer, + DCT3DCT4_GetModel, + DCT3DCT4_GetFirmware, + DCT4_GetIMEI, + NOTSUPPORTED, /* GetOriginalIMEI */ + NOTSUPPORTED, /* GetManufactureMonth */ + DCT4_GetProductCode, + DCT4_GetHardware, + NOTSUPPORTED, /* GetPPM */ + NOTSUPPORTED, /* GetSIMIMSI */ + NOTSUPPORTED, /* GetDateTime */ + NOTSUPPORTED, /* SetDateTime */ + NOTSUPPORTED, /* GetAlarm */ + NOTSUPPORTED, /* SetAlarm */ + NOTSUPPORTED, /* GetLocale */ + NOTSUPPORTED, /* SetLocale */ + NOTSUPPORTED, /* PressKey */ + DCT4_Reset, + NOTSUPPORTED, /* ResetPhoneSettings */ + NOTSUPPORTED, /* EnterSecurityCode */ + NOTSUPPORTED, /* GetSecurityStatus */ + NOTSUPPORTED, /* GetDisplayStatus */ + NOTSUPPORTED, /* SetAutoNetworkLogin */ + NOTSUPPORTED, /* GetBatteryCharge */ + NOTSUPPORTED, /* GetSignalQuality */ + NOTSUPPORTED, /* GetNetworkInfo */ + NOTSUPPORTED, /* GetCategory */ + NOTSUPPORTED, /* AddCategory */ + NOTSUPPORTED, /* GetCategoryStatus */ + NOTSUPPORTED, /* GetMemoryStatus */ + NOTSUPPORTED, /* GetMemory */ + NOTSUPPORTED, /* GetNextMemory */ + NOTSUPPORTED, /* SetMemory */ + NOTSUPPORTED, /* AddMemory */ + NOTSUPPORTED, /* DeleteMemory */ + NOTIMPLEMENTED, /* DeleteAllMemory */ + NOTSUPPORTED, /* GetSpeedDial */ + NOTSUPPORTED, /* SetSpeedDial */ + NOTSUPPORTED, /* GetSMSC */ + NOTSUPPORTED, /* SetSMSC */ + NOTSUPPORTED, /* GetSMSStatus */ + NOTSUPPORTED, /* GetSMS */ + NOTSUPPORTED, /* GetNextSMS */ + NOTSUPPORTED, /* SetSMS */ + NOTSUPPORTED, /* AddSMS */ + NOTSUPPORTED, /* DeleteSMS */ + NOTSUPPORTED, /* SendSMS */ + NOTSUPPORTED, /* SendSavedSMS */ + NOTSUPPORTED, /* SetIncomingSMS */ + NOTSUPPORTED, /* SetIncomingCB */ + NOTSUPPORTED, /* GetSMSFolders */ + NOTSUPPORTED, /* AddSMSFolder */ + NOTSUPPORTED, /* DeleteSMSFolder */ + NOTIMPLEMENTED, /* DialVoice */ + NOTIMPLEMENTED, /* AnswerCall */ + NOTIMPLEMENTED, /* CancelCall */ + NOTIMPLEMENTED, /* HoldCall */ + NOTIMPLEMENTED, /* UnholdCall */ + NOTIMPLEMENTED, /* ConferenceCall */ + NOTIMPLEMENTED, /* SplitCall */ + NOTIMPLEMENTED, /* TransferCall */ + NOTIMPLEMENTED, /* SwitchCall */ + NOTSUPPORTED, /* GetCallDivert */ + NOTSUPPORTED, /* SetCallDivert */ + NOTSUPPORTED, /* CancelAllDiverts */ + NOTIMPLEMENTED, /* SetIncomingCall */ + NOTIMPLEMENTED, /* SetIncomingUSSD */ + NOTSUPPORTED, /* SendDTMF */ + NOTSUPPORTED, /* GetRingtone */ + NOTSUPPORTED, /* SetRingtone */ + NOTSUPPORTED, /* GetRingtonesInfo */ + NOTIMPLEMENTED, /* DeleteUserRingtones */ + NOTSUPPORTED, /* PlayTone */ + NOTSUPPORTED, /* GetWAPBookmark */ + NOTSUPPORTED, /* SetWAPBookmark */ + NOTSUPPORTED, /* DeleteWAPBookmark */ + NOTSUPPORTED, /* GetWAPSettings */ + NOTSUPPORTED, /* SetWAPSettings */ + NOTSUPPORTED, /* GetMMSSettings */ + NOTSUPPORTED, /* SetMMSSettings */ + NOTSUPPORTED, /* GetSyncMLSettings */ + NOTSUPPORTED, /* SetSyncMLSettings */ + NOTSUPPORTED, /* GetChatSettings */ + NOTSUPPORTED, /* SetChatSettings */ + NOTSUPPORTED, /* GetBitmap */ + NOTSUPPORTED, /* SetBitmap */ + NOTSUPPORTED, /* GetToDoStatus */ + NOTSUPPORTED, /* GetToDo */ + NOTSUPPORTED, /* GetNextToDo */ + NOTSUPPORTED, /* SetToDo */ + NOTSUPPORTED, /* AddToDo */ + NOTSUPPORTED, /* DeleteToDo */ + NOTSUPPORTED, /* DeleteAllToDo */ + NOTIMPLEMENTED, /* GetCalendarStatus */ + NOTIMPLEMENTED, /* GetCalendar */ + NOTSUPPORTED, /* GetNextCalendar */ + NOTIMPLEMENTED, /* SetCalendar */ + NOTSUPPORTED, /* AddCalendar */ + NOTSUPPORTED, /* DeleteCalendar */ + NOTIMPLEMENTED, /* DeleteAllCalendar */ + NOTSUPPORTED, /* GetCalendarSettings */ + NOTSUPPORTED, /* SetCalendarSettings */ + NOTSUPPORTED, /* GetNote */ + NOTSUPPORTED, /* GetProfile */ + NOTSUPPORTED, /* SetProfile */ + NOTSUPPORTED, /* GetFMStation */ + NOTSUPPORTED, /* SetFMStation */ + NOTSUPPORTED, /* ClearFMStations */ + N3650_GetNextFileFolder, + N3650_GetFilePart, + NOTIMPLEMENTED, /* AddFilePart */ + NOTSUPPORTED, /* GetFileSystemStatus */ + NOTIMPLEMENTED, /* DeleteFile */ + NOTIMPLEMENTED, /* AddFolder */ + NOTSUPPORTED, /* GetGPRSAccessPoint */ + NOTSUPPORTED /* SetGPRSAccessPoint */ +}; + +#endif + +/* How should editor hadle tabs in this file? Add editor commands here. + * vim: noexpandtab sw=8 ts=8 sts=8: + */ |