From 88b0d33b8b0b1f6ae320cfc863ca6a47fa8fec22 Mon Sep 17 00:00:00 2001 From: zautrix Date: Sat, 07 Aug 2004 17:24:40 +0000 Subject: Initial revision --- (limited to 'gammu/emb/common/phone/nokia/dct3/dct3func.c') diff --git a/gammu/emb/common/phone/nokia/dct3/dct3func.c b/gammu/emb/common/phone/nokia/dct3/dct3func.c new file mode 100644 index 0000000..beef33c --- a/dev/null +++ b/gammu/emb/common/phone/nokia/dct3/dct3func.c @@ -0,0 +1,1535 @@ +/* (c) 2001-2004 by Marcin Wiacek */ +/* based on some work from Markus Plail, Pavel Janik, others and Gnokii */ +/* resetting DCT4 phones settings (c) by Walek */ + +#include /* memcpy only */ +#include +#include + +#include "../../../gsmstate.h" +#include "../../../misc/coding/coding.h" +#include "../../../service/sms/gsmsms.h" +#include "../../pfunc.h" +#include "../nfunc.h" +#include "dct3func.h" + +#ifdef GSM_ENABLE_NOKIA_DCT3 + +GSM_Error DCT3_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark) +{ + GSM_Error error; + + /* We have to enable WAP frames in phone */ + error=DCT3DCT4_EnableWAPFunctions(s); + if (error!=ERR_NONE) return error; + + return DCT3DCT4_DeleteWAPBookmarkPart(s,bookmark); +} + +GSM_Error DCT3_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark) +{ + GSM_Error error; + + /* We have to enable WAP frames in phone */ + error=DCT3DCT4_EnableWAPFunctions(s); + if (error!=ERR_NONE) return error; + + return DCT3DCT4_GetWAPBookmarkPart(s,bookmark); +} + +GSM_Error DCT3_ReplyPressKey(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + GSM_Phone_Data *Data = &s->Phone.Data; + + switch (msg.Buffer[2]) { + case 0x46: + smprintf(s, "Pressing key OK\n"); + if (Data->PressKey) return ERR_NONE; + break; + case 0x47: + smprintf(s, "Releasing key OK\n"); + if (!Data->PressKey) return ERR_NONE; + break; + } + return ERR_UNKNOWNRESPONSE; +} + +GSM_Error DCT3_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, bool Press) +{ + unsigned char PressReq[] = {0x00, 0x01, 0x46, 0x00, 0x01, + 0x0a}; /* Key code */ + unsigned char ReleaseReq[] = {0x00, 0x01, 0x47, 0x00, 0x01, 0x0c}; + + if (Press) { + PressReq[5] = Key; + s->Phone.Data.PressKey = true; + smprintf(s, "Pressing key\n"); + return GSM_WaitFor (s, PressReq, 6, 0xd1, 4, ID_PressKey); + } else { + s->Phone.Data.PressKey = false; + smprintf(s, "Releasing key\n"); + return GSM_WaitFor (s, ReleaseReq, 6, 0xd1, 4, ID_PressKey); + } +} + +GSM_Error DCT3_ReplyPlayTone(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "Tone played\n"); + return ERR_NONE; +} + +GSM_Error DCT3_PlayTone(GSM_StateMachine *s, int Herz, unsigned char Volume, bool start) +{ + GSM_Error error; + unsigned char req[] = {0x00,0x01,0x8f, + 0x00, /* Volume */ + 0x00, /* HerzLo */ + 0x00}; /* HerzHi */ + + if (start) { + error=DCT3_EnableSecurity (s, 0x01); + if (error!=ERR_NONE) return error; + } + + /* For Herz==255*255 we have silent */ + if (Herz!=255*255) { + req[3]=Volume; + req[5]=Herz%256; + req[4]=Herz/256; + } else { + req[3]=0; + req[5]=0; + req[4]=0; + } + + return GSM_WaitFor (s, req, 6, 0x40, 4, ID_PlayTone); +} + +#ifdef GSM_ENABLE_CELLBROADCAST + +GSM_Error DCT3_ReplyIncomingCB(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + GSM_CBMessage CB; + int i; + char Buffer[300]; + + smprintf(s, "CB received\n"); + CB.Channel = msg.Buffer[7]; + i = GSM_UnpackEightBitsToSeven(0, msg.Buffer[9], msg.Buffer[9], msg.Buffer+10, Buffer); + i = msg.Buffer[9] - 1; + while (i!=0) { + if (Buffer[i] == 13) i = i - 1; else break; + } + DecodeDefault(CB.Text, Buffer, i + 1, false, NULL); + smprintf(s, "Channel %i, text \"%s\"\n",CB.Channel,DecodeUnicodeString(CB.Text)); + if (s->Phone.Data.EnableIncomingCB && s->User.IncomingCB!=NULL) { + s->User.IncomingCB(s->CurrentConfig->Device,CB); + } + return ERR_NONE; +} + +GSM_Error DCT3_ReplySetIncomingCB(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + switch (msg.Buffer[3]) { + case 0x21: + smprintf(s, "CB set\n"); + return ERR_NONE; + case 0x22: + smprintf(s, "CB not set\n"); + return ERR_UNKNOWN; + case 0xCA: + smprintf(s, "No network and no CB\n"); + return ERR_SECURITYERROR; + } + return ERR_UNKNOWNRESPONSE; +} + +#endif + +GSM_Error DCT3_SetIncomingCB(GSM_StateMachine *s, bool enable) +{ +#ifdef GSM_ENABLE_CELLBROADCAST + unsigned char reqOn[] = {N6110_FRAME_HEADER, 0x20, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x01}; + unsigned char reqOff[] = {N6110_FRAME_HEADER, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; + + if (s->Phone.Data.EnableIncomingCB!=enable) { + s->Phone.Data.EnableIncomingCB = enable; + if (enable) { + smprintf(s, "Enabling incoming CB\n"); + return GSM_WaitFor(s, reqOn, 10, 0x02, 4, ID_SetIncomingCB); + } else { + smprintf(s, "Disabling incoming CB\n"); + return GSM_WaitFor(s, reqOff, 10, 0x02, 4, ID_SetIncomingCB); + } + } + return ERR_NONE; +#else + return ERR_SOURCENOTAVAILABLE; +#endif +} + +GSM_Error DCT3_ReplySetSMSC(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "SMSC set\n"); + return ERR_NONE; +} + +GSM_Error DCT3_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc) +{ + unsigned char req[100] = {N6110_FRAME_HEADER, 0x30, 0x64}; + + memset(req+6,100-6,0); + + /* SMSC location */ + req[5] = smsc->Location; + + /* SMSC format */ + switch (smsc->Format) { + case SMS_FORMAT_Text : req[7] = 0x00; break; + case SMS_FORMAT_Fax : req[7] = 0x22; break; + case SMS_FORMAT_Pager : req[7] = 0x26; break; + case SMS_FORMAT_Email : req[7] = 0x32; break; + } + + /* SMS validity */ + req[9] = smsc->Validity.Relative; + + /* Default number for SMS messages */ + req[10] = GSM_PackSemiOctetNumber(smsc->DefaultNumber, req+11, true); + + /* SMSC number */ + req[22] = GSM_PackSemiOctetNumber(smsc->Number, req+23, false); + + /* SMSC name */ + memcpy(req + 34, DecodeUnicodeString(smsc->Name),UnicodeLength(smsc->Name)); + + smprintf(s, "Setting SMSC\n"); + return GSM_WaitFor (s, req, 35+UnicodeLength(smsc->Name), 0x02, 4, ID_SetSMSC); +} + +GSM_Error DCT3_ReplyEnableSecurity(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "State of security commands set\n"); + return ERR_NONE; +} + +/* If you set make some things (for example, change Security Code from + * phone's menu, disable and enable phone), it won't answer for 0x40 frames + * and you won't be able to play tones, get netmonitor, etc. + * This function do thing called "Enabling extended security commands" + * and it enables 0x40 frame functions. + * This frame can also some other things - see below + */ +GSM_Error DCT3_EnableSecurity (GSM_StateMachine *s, unsigned char status) +{ + unsigned char req[] = {0x00, 0x01, 0x64, + 0x01}; /* 0x00/0x01 - off/on, + * 0x03/0x04 - soft/hard reset, + * 0x06 - CONTACT SERVICE + */ + + /* 0x06 MAKES CONTACT SERVICE! BE CAREFULL! */ + /* When use 0x03 and had during session changed time & date + * some phones (like 6150 or 6210) can ask for time & date after reset + * or disable clock on the screen + */ + if (status!=0x06) req[3] = status; + smprintf(s, "Setting state of security commands\n"); + return GSM_WaitFor (s, req, 4, 0x40, 4, ID_EnableSecurity); +} + +GSM_Error DCT3_ReplyGetIMEI(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + memcpy(s->Phone.Data.IMEI,msg.Buffer + 4, 16); + smprintf(s, "Received IMEI %s\n",s->Phone.Data.IMEI); + return ERR_NONE; +} + +GSM_Error DCT3_GetIMEI (GSM_StateMachine *s) +{ + unsigned char req[] = {0x00, 0x01, 0x66, 0x00}; + GSM_Error error; + + if (strlen(s->Phone.Data.IMEI)!=0) return ERR_NONE; + + error=DCT3_EnableSecurity (s, 0x01); + if (error!=ERR_NONE) return error; + + smprintf(s, "Getting IMEI\n"); + return GSM_WaitFor (s, req, 4, 0x40, 2, ID_GetIMEI); +} + +GSM_Error DCT3_ReplySIMLogin(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "Login for SIM card\n"); + return ERR_NONE; +} + +GSM_Error DCT3_ReplySIMLogout(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "Logout for SIM card\n"); + return ERR_NONE; +} + +GSM_Error DCT3_ReplyGetDateTime(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "Date & time received\n"); + if (msg.Buffer[4]==0x01) { + NOKIA_DecodeDateTime(s, msg.Buffer+8, s->Phone.Data.DateTime); + return ERR_NONE; + } + smprintf(s, "Not set in phone\n"); + return ERR_EMPTY; +} + +GSM_Error DCT3_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x62}; + + s->Phone.Data.DateTime=date_time; + smprintf(s, "Getting date & time\n"); + return GSM_WaitFor (s, req, 4, msgtype, 4, ID_GetDateTime); +} + +GSM_Error DCT3_ReplyGetAlarm(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + GSM_Phone_Data *Data = &s->Phone.Data; + + smprintf(s, "Alarm: "); + if (msg.Buffer[8]==0x02) { + smprintf(s, "set to %02i:%02i\n", msg.Buffer[9], msg.Buffer[10]); + Data->Alarm->Repeating = true; + Data->Alarm->Text[0] = 0; + Data->Alarm->Text[1] = 0; + Data->Alarm->DateTime.Hour = msg.Buffer[9]; + Data->Alarm->DateTime.Minute = msg.Buffer[10]; + Data->Alarm->DateTime.Second = 0; + return ERR_NONE; + } + smprintf(s, "not set\n"); + return ERR_EMPTY; +} + +GSM_Error DCT3_GetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm, unsigned char msgtype) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x6d}; + + if (alarm->Location!=1) return ERR_NOTSUPPORTED; + + s->Phone.Data.Alarm=alarm; + smprintf(s, "Getting alarm\n"); + return GSM_WaitFor (s, req, 4, msgtype, 4, ID_GetAlarm); +} + +GSM_Error DCT3_ReplySetDateTime(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "Date & time: "); + if (msg.Buffer[4]==0x01) { + smprintf(s, "set OK\n"); + return ERR_NONE; + } + smprintf(s, "error setting\n"); + return ERR_UNKNOWN; +} + +GSM_Error DCT3_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x60, 0x01, 0x01, 0x07, + 0x00, 0x00, /* Year */ + 0x00, /* Month */ + 0x00, /* Day */ + 0x00, /* Hour */ + 0x00, /* Minute */ + 0x00}; /* Unknown. Not seconds */ + + NOKIA_EncodeDateTime(s, req+7, date_time); + smprintf(s, "Setting date & time\n"); + return GSM_WaitFor (s, req, 14, msgtype, 4, ID_SetDateTime); +} + +GSM_Error DCT3_ReplySetAlarm(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "Alarm: "); + if (msg.Buffer[4]==0x01) { + smprintf(s, "set OK\n"); + return ERR_NONE; + } + smprintf(s, "error setting\n"); + return ERR_UNKNOWN; +} + +GSM_Error DCT3_SetAlarm(GSM_StateMachine *s, GSM_Alarm *alarm, unsigned char msgtype) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x6b, 0x01, 0x20, 0x03, + 0x02, /* Unknown. Not for enabling/disabling */ + 0x00, /* Hour */ + 0x00, /* Minute */ + 0x00}; /* Unknown. Not seconds */ + + if (alarm->Location != 1) return ERR_NOTSUPPORTED; + + req[8] = alarm->DateTime.Hour; + req[9] = alarm->DateTime.Minute; + + smprintf(s, "Setting alarm\n"); + return GSM_WaitFor (s, req, 11, msgtype, 4, ID_SetAlarm); +} + +GSM_Error DCT3_ReplyGetSMSC(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + int i; + GSM_Phone_Data *Data = &s->Phone.Data; + + switch (msg.Buffer[3]) { + case 0x34: + smprintf(s, "SMSC received\n"); + Data->SMSC->Format = SMS_FORMAT_Text; + switch (msg.Buffer[6]) { + case 0x00: Data->SMSC->Format = SMS_FORMAT_Text; break; + case 0x22: Data->SMSC->Format = SMS_FORMAT_Fax; break; + case 0x26: Data->SMSC->Format = SMS_FORMAT_Pager; break; + case 0x32: Data->SMSC->Format = SMS_FORMAT_Email; break; + } + Data->SMSC->Validity.Format = SMS_Validity_RelativeFormat; + Data->SMSC->Validity.Relative = msg.Buffer[8]; + + i=33; + while (msg.Buffer[i]!=0) {i++;} + i=i-33; + if (i>GSM_MAX_SMSC_NAME_LENGTH) { + smprintf(s, "Too long name\n"); + return ERR_UNKNOWNRESPONSE; + } + EncodeUnicode(Data->SMSC->Name,msg.Buffer+33,i); + smprintf(s, "Name \"%s\"\n", DecodeUnicodeString(Data->SMSC->Name)); + + GSM_UnpackSemiOctetNumber(Data->SMSC->DefaultNumber,msg.Buffer+9,true); + smprintf(s, "Default number \"%s\"\n", DecodeUnicodeString(Data->SMSC->DefaultNumber)); + + GSM_UnpackSemiOctetNumber(Data->SMSC->Number,msg.Buffer+21,false); + smprintf(s, "Number \"%s\"\n", DecodeUnicodeString(Data->SMSC->Number)); + + return ERR_NONE; + case 0x35: + smprintf(s, "Getting SMSC failed\n"); + return ERR_INVALIDLOCATION; + } + return ERR_UNKNOWNRESPONSE; +} + +GSM_Error DCT3_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x33, 0x64, + 0x00}; /* Location */ + + if (smsc->Location==0x00) return ERR_INVALIDLOCATION; + + req[5]=smsc->Location; + + s->Phone.Data.SMSC=smsc; + smprintf(s, "Getting SMSC\n"); + return GSM_WaitFor (s, req, 6, 0x02, 4, ID_GetSMSC); +} + +GSM_Error DCT3_ReplyGetNetworkInfo(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + int count; + GSM_Phone_Data *Data = &s->Phone.Data; +#ifdef DEBUG + GSM_NetworkInfo NetInfo; + char name[100]; + + smprintf(s, "Network info received\n"); + smprintf(s, " Status : "); + switch (msg.Buffer[8]) { + case 0x01: smprintf(s, "home network"); break; + case 0x02: smprintf(s, "roaming network"); break; + case 0x03: smprintf(s, "requesting network"); break; + case 0x04: smprintf(s, "not registered in the network"); break; + default : smprintf(s, "unknown"); + } + smprintf(s, "\n"); + smprintf(s, "Network selection : %s\n", msg.Buffer[9]==1?"manual":"automatic"); + if (msg.Buffer[8]<0x03) { + sprintf(NetInfo.CID, "%02x%02x", msg.Buffer[10], msg.Buffer[11]); + smprintf(s, "CID : %s\n", NetInfo.CID); + + sprintf(NetInfo.LAC, "%02x%02x", msg.Buffer[12], msg.Buffer[13]); + smprintf(s, "LAC : %s\n", NetInfo.LAC); + + smprintf(s, "Network code : %s\n", NetInfo.NetworkCode); + NOKIA_DecodeNetworkCode(msg.Buffer+14,NetInfo.NetworkCode); + smprintf(s, "Network name for Gammu : %s ", + DecodeUnicodeString(GSM_GetNetworkName(NetInfo.NetworkCode))); + smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(NetInfo.NetworkCode))); + + if (msg.Length>18) { + if (msg.Buffer[18]==0x00) { + /* In 6210 name is in "normal" Unicode */ + memcpy(name,msg.Buffer+18,msg.Buffer[17]*2); + name[msg.Buffer[17]*2] =0x00; + name[msg.Buffer[17]*2+1]=0x00; + smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name)); + } else { + /* In 9210 first 0x00 is cut from Unicode string */ + name[0] = 0; + memcpy(name+1,msg.Buffer+18,msg.Buffer[17]*2); + name[msg.Buffer[17]*2+1]=0x00; + name[msg.Buffer[17]*2+2]=0x00; + smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name)); + } + } + } +#endif + if (Data->RequestID==ID_GetNetworkInfo) { + Data->NetworkInfo->NetworkName[0] = 0x00; + Data->NetworkInfo->NetworkName[1] = 0x00; + Data->NetworkInfo->State = 0; + switch (msg.Buffer[8]) { + case 0x01: Data->NetworkInfo->State = GSM_HomeNetwork; break; + case 0x02: Data->NetworkInfo->State = GSM_RoamingNetwork; break; + case 0x03: Data->NetworkInfo->State = GSM_RequestingNetwork; break; + case 0x04: Data->NetworkInfo->State = GSM_NoNetwork; break; + } + if (Data->NetworkInfo->State == GSM_HomeNetwork || Data->NetworkInfo->State == GSM_RoamingNetwork) { + if (msg.Buffer[18]==0x00) { + /* In 6210 name is in "normal" Unicode */ + memcpy(Data->NetworkInfo->NetworkName,msg.Buffer+18,msg.Buffer[17]*2); + Data->NetworkInfo->NetworkName[msg.Buffer[17]*2] = 0x00; + Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+1] = 0x00; + } else { + /* In 9210 first 0x00 is cut from Unicode string */ + Data->NetworkInfo->NetworkName[0] = 0; + memcpy(Data->NetworkInfo->NetworkName+1,msg.Buffer+18,msg.Buffer[17]*2); + Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+1]=0x00; + Data->NetworkInfo->NetworkName[msg.Buffer[17]*2+2]=0x00; + } + NOKIA_DecodeNetworkCode(msg.Buffer+14,Data->NetworkInfo->NetworkCode); + sprintf(Data->NetworkInfo->CID, "%02x%02x", msg.Buffer[10], msg.Buffer[11]); + sprintf(Data->NetworkInfo->LAC, "%02x%02x", msg.Buffer[12], msg.Buffer[13]); + } + } + /* 6210/6250/7110 */ + if (Data->RequestID==ID_GetBitmap) { + if (msg.Buffer[4]==0x02) { + smprintf(s, "Operator logo available\n"); + count = 7; + /* skip network info */ + count += msg.Buffer[count]; + count ++; + Data->Bitmap->BitmapWidth = msg.Buffer[count++]; + Data->Bitmap->BitmapHeight = msg.Buffer[count++]; + count+=4; + PHONE_DecodeBitmap(GSM_Nokia7110OperatorLogo,msg.Buffer+count,Data->Bitmap); + NOKIA_DecodeNetworkCode(msg.Buffer+14,Data->Bitmap->NetworkCode); + } else { + Data->Bitmap->BitmapWidth = 78; + Data->Bitmap->BitmapHeight = 21; + GSM_ClearBitmap(Data->Bitmap); + strcpy(Data->Bitmap->NetworkCode,"000 00"); + } + } + return ERR_NONE; +} + +GSM_Error DCT3_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x70}; + + s->Phone.Data.NetworkInfo=netinfo; + smprintf(s, "Getting network info\n"); + return GSM_WaitFor (s, req, 4, 0x0a, 4, ID_GetNetworkInfo); +} + +GSM_Error DCT3_ReplyDialCommand(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "Answer for call commands\n"); + return ERR_NONE; +} + +GSM_Error DCT3_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber) +{ + unsigned int i = 0; + GSM_Error error; + unsigned char req[100] = {0x00, 0x01, 0x7c, + 0x01}; /* call command */ + + if (ShowNumber != GSM_CALL_DefaultNumberPresence) return ERR_NOTSUPPORTED; + + error=DCT3_EnableSecurity (s, 0x01); + if (error!=ERR_NONE) return error; + + for (i=0; i < strlen(number); i++) req[4+i]=number[i]; + req[4+i+1]=0; + + smprintf(s, "Making voice call\n"); + return GSM_WaitFor (s, req, 4+strlen(number)+1, 0x40, 4, ID_DialVoice); +} + +static GSM_Error DCT3_CancelAllCalls(GSM_StateMachine *s) +{ + GSM_Error error; + unsigned char req[] = {0x00, 0x01, 0x7c, + 0x03}; /* call command */ + + error=DCT3_EnableSecurity (s, 0x01); + if (error!=ERR_NONE) return error; + + smprintf(s, "Canceling calls\n"); + return GSM_WaitFor (s, req, 4, 0x40, 4, ID_CancelCall); +} + +GSM_Error DCT3_CancelCall(GSM_StateMachine *s, int ID, bool all) +{ + if (!all) return DCT3DCT4_CancelCall(s,ID); + return DCT3_CancelAllCalls(s); +} + +GSM_Error DCT3_AnswerAllCalls(GSM_StateMachine *s) +{ + GSM_Error error; + unsigned char req[] = {0x00, 0x01, 0x7c, + 0x02}; /* call command */ + + error=DCT3_EnableSecurity (s, 0x01); + if (error!=ERR_NONE) return error; + + smprintf(s, "Answering calls\n"); + return GSM_WaitFor (s, req, 4, 0x40, 4, ID_AnswerCall); +} + +GSM_Error DCT3_Reset(GSM_StateMachine *s, bool hard) +{ + GSM_Error error; + + if (hard) { + error=DCT3_EnableSecurity(s, 0x04); + } else { + error=DCT3_EnableSecurity(s, 0x03); + } + if (error == ERR_NONE) { + s->Phone.Data.EnableIncomingSMS = false; + s->Phone.Data.EnableIncomingCB = false; + } + return error; +} + +GSM_Error DCT3_ReplyGetWAPBookmark(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + return DCT3DCT4_ReplyGetWAPBookmark (msg,s,false); +} + +GSM_Error DCT3_SetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark) +{ + GSM_Error error; + int count = 4, location; + unsigned char req[600] = {N6110_FRAME_HEADER, 0x09}; + + /* We have to enable WAP frames in phone */ + error=DCT3DCT4_EnableWAPFunctions(s); + if (error!=ERR_NONE) return error; + + location = bookmark->Location - 1; + if (bookmark->Location == 0) location = 0xffff; + req[count++] = (location & 0xff00) >> 8; + req[count++] = location & 0x00ff; + + count += NOKIA_SetUnicodeString(s, req+count, bookmark->Title, false); + count += NOKIA_SetUnicodeString(s, req+count, bookmark->Address, false); + + /* unknown */ + req[count++] = 0x01; req[count++] = 0x80; req[count++] = 0x00; + req[count++] = 0x00; req[count++] = 0x00; req[count++] = 0x00; + req[count++] = 0x00; req[count++] = 0x00; req[count++] = 0x00; + + smprintf(s, "Setting WAP bookmark\n"); + error = GSM_WaitFor (s, req, count, 0x3f, 4, ID_SetWAPBookmark); + if (error != ERR_NONE) { + if (error == ERR_INSIDEPHONEMENU || error == ERR_EMPTY || error == ERR_FULL) { + DCT3DCT4_DisableConnectionFunctions(s); + } + return error; + } + + return DCT3DCT4_DisableConnectionFunctions(s); +} + +GSM_Error DCT3_ReplyGetWAPSettings(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + int tmp,Number; +// int tmp2; + GSM_Phone_Data *Data = &s->Phone.Data; +#ifdef GSM_ENABLE_NOKIA6110 + GSM_Phone_N6110Data *Priv6110 = &s->Phone.Data.Priv.N6110; +#endif +#ifdef GSM_ENABLE_NOKIA7110 + GSM_Phone_N7110Data *Priv7110 = &s->Phone.Data.Priv.N7110; +#endif + + switch(msg.Buffer[3]) { + case 0x16: + smprintf(s, "WAP settings part 1 received OK\n"); + + tmp = 4; + + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[0].Title,false); + smprintf(s, "Title: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].Title)); + + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[0].HomePage,false); + smprintf(s, "Homepage: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].HomePage)); +#ifdef DEBUG + smprintf(s, "Connection type: "); + switch (msg.Buffer[tmp]) { + case 0x00: smprintf(s, "temporary\n"); break; + case 0x01: smprintf(s, "continuous\n"); break; + default: smprintf(s, "unknown\n"); + } + smprintf(s, "Connection security: "); + switch (msg.Buffer[tmp+13]) { + case 0x00: smprintf(s, "off\n"); break; + case 0x01: smprintf(s, "on\n"); break; + default: smprintf(s, "unknown\n"); + } +#endif + Data->WAPSettings->Settings[0].IsContinuous = false; + if (msg.Buffer[tmp] == 0x01) Data->WAPSettings->Settings[0].IsContinuous = true; + Data->WAPSettings->Settings[0].IsSecurity = false; + if (msg.Buffer[tmp+13] == 0x01) Data->WAPSettings->Settings[0].IsSecurity = true; + + /* I'm not sure here. Experimental values from 6210 5.56 */ +// tmp2 = DecodeUnicodeLength(Data->WAPSettings->Settings[0].Title); +// if (tmp2 != 0) tmp2 --; +// tmp2 += tmp; + if (!(UnicodeLength(Data->WAPSettings->Settings[0].Title)) % 2) tmp++; + if (UnicodeLength(Data->WAPSettings->Settings[0].HomePage)!=0) tmp++; + + smprintf(s, "ID for writing %i\n",msg.Buffer[tmp+5]); + + smprintf(s, "Current set location in phone %i\n",msg.Buffer[tmp+6]); + + smprintf(s, "1 location %i\n",msg.Buffer[tmp+8]); + smprintf(s, "2 location %i\n",msg.Buffer[tmp+9]); + smprintf(s, "3 location %i\n",msg.Buffer[tmp+10]); + smprintf(s, "4 location %i\n",msg.Buffer[tmp+11]); +#ifdef GSM_ENABLE_NOKIA7110 + if (strstr(N7110Phone.models, Data->ModelInfo->model) != NULL) { + Priv7110->WAPLocations.ID = msg.Buffer[tmp+5]; + Priv7110->WAPLocations.CurrentLocation = msg.Buffer[tmp+6]; + Priv7110->WAPLocations.Locations[0] = msg.Buffer[tmp+8]; + Priv7110->WAPLocations.Locations[1] = msg.Buffer[tmp+9]; + Priv7110->WAPLocations.Locations[2] = msg.Buffer[tmp+10]; + Priv7110->WAPLocations.Locations[3] = msg.Buffer[tmp+11]; + +// Priv7110->WAPLocations.CurrentLocation = msg.Buffer[tmp2+1]; +// Priv7110->WAPLocations.Locations[0] = msg.Buffer[tmp2+3]; +// Priv7110->WAPLocations.Locations[1] = msg.Buffer[tmp2+4]; +// Priv7110->WAPLocations.Locations[2] = msg.Buffer[tmp2+5]; +// Priv7110->WAPLocations.Locations[3] = msg.Buffer[tmp2+6]; + } +#endif +#ifdef GSM_ENABLE_NOKIA6110 + if (strstr(N6110Phone.models, Data->ModelInfo->model) != NULL) { + Priv6110->WAPLocations.ID = msg.Buffer[tmp+5]; + Priv6110->WAPLocations.CurrentLocation = msg.Buffer[tmp+6]; + Priv6110->WAPLocations.Locations[0] = msg.Buffer[tmp+8]; + Priv6110->WAPLocations.Locations[1] = msg.Buffer[tmp+9]; + Priv6110->WAPLocations.Locations[2] = msg.Buffer[tmp+10]; + Priv6110->WAPLocations.Locations[3] = msg.Buffer[tmp+11]; + } +#endif + return ERR_NONE; + case 0x17: + smprintf(s, "WAP settings part 1 receiving error\n"); + switch (msg.Buffer[4]) { + case 0x01: + smprintf(s, "Security error. Inside WAP settings menu\n"); + return ERR_INSIDEPHONEMENU; + case 0x02: + smprintf(s, "Invalid or empty\n"); + return ERR_INVALIDLOCATION; + default: + smprintf(s, "ERROR: unknown %i\n",msg.Buffer[4]); + return ERR_UNKNOWNRESPONSE; + } + break; + case 0x1c: + smprintf(s, "WAP settings part 2 received OK\n"); + Number = Data->WAPSettings->Number; + switch (msg.Buffer[5]) { + case 0x00: + Data->WAPSettings->Settings[Number].Bearer = WAPSETTINGS_BEARER_SMS; + smprintf(s, "Settings for SMS bearer:\n"); + tmp = 6; + + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[Number].Service,false); + smprintf(s, "Service number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Service)); + + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[Number].Server,false); + smprintf(s, "Server number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Server)); + break; + case 0x01: + Data->WAPSettings->Settings[Number].Bearer = WAPSETTINGS_BEARER_DATA; + smprintf(s, "Settings for data bearer:\n"); + Data->WAPSettings->Settings[Number].ManualLogin = false; + tmp = 10; + + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[Number].IPAddress,false); + smprintf(s, "IP address: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].IPAddress)); + + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[Number].DialUp,false); + smprintf(s, "Dial-up number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].DialUp)); + + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[Number].User,false); + smprintf(s, "User name: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].User)); + + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[Number].Password,false); + smprintf(s, "Password: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Password)); +#ifdef DEBUG + smprintf(s, "Authentication type: "); + switch (msg.Buffer[6]) { + case 0x00: smprintf(s, "normal\n"); break; + case 0x01: smprintf(s, "secure\n"); break; + default: smprintf(s, "unknown\n"); break; + } + smprintf(s, "Data call type: "); + switch (msg.Buffer[7]) { + case 0x00: smprintf(s, "analogue\n"); break; + case 0x01: smprintf(s, "ISDN\n"); break; + default: smprintf(s, "unknown\n"); break; + } + smprintf(s, "Data call speed: "); + switch (msg.Buffer[9]) { + case 0x01: smprintf(s, "9600\n"); break; + case 0x02: smprintf(s, "14400\n"); break; + default: smprintf(s, "unknown\n"); break; + } +#endif + Data->WAPSettings->Settings[Number].IsNormalAuthentication=true; + if (msg.Buffer[6]==0x01) Data->WAPSettings->Settings[Number].IsNormalAuthentication=false; + Data->WAPSettings->Settings[Number].IsISDNCall=false; + if (msg.Buffer[7]==0x01) Data->WAPSettings->Settings[Number].IsISDNCall=true; + Data->WAPSettings->Settings[Number].Speed = WAPSETTINGS_SPEED_9600; + if (msg.Buffer[9]==0x02) Data->WAPSettings->Settings[Number].Speed = WAPSETTINGS_SPEED_14400; + break; + case 0x02: + Data->WAPSettings->Settings[Number].Bearer=WAPSETTINGS_BEARER_USSD; + smprintf(s, "Settings for USSD bearer:\n"); + tmp = 7; + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[Number].Service,false); +#ifdef DEBUG + if (msg.Buffer[6]==0x01) + smprintf(s, "Service number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Service)); + else + smprintf(s, "IP address: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Service)); +#endif + Data->WAPSettings->Settings[Number].IsIP=true; + if (msg.Buffer[6]==0x01) Data->WAPSettings->Settings[Number].IsIP=false; + NOKIA_GetUnicodeString(s, &tmp, msg.Buffer, Data->WAPSettings->Settings[Number].Code,false); + smprintf(s, "Service code: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Code)); + } + Data->WAPSettings->Number++; + return ERR_NONE; + case 0x1d: + smprintf(s, "Incorrect WAP settings location\n"); + return ERR_NONE; + } + return ERR_UNKNOWNRESPONSE; +} + +GSM_Error DCT3_GetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings) +{ +#ifdef GSM_ENABLE_NOKIA6110 + GSM_Phone_N6110Data *Priv6110 = &s->Phone.Data.Priv.N6110; +#endif +#ifdef GSM_ENABLE_NOKIA7110 + GSM_Phone_N7110Data *Priv7110 = &s->Phone.Data.Priv.N7110; +#endif + GSM_Error error; + int i; + unsigned char req[] = {N6110_FRAME_HEADER,0x15, + 0x00}; /* Location */ + unsigned char req2[] = {N6110_FRAME_HEADER,0x1b, + 0x00}; /* Location */ + + /* We have to enable WAP frames in phone */ + error=DCT3DCT4_EnableWAPFunctions(s); + if (error!=ERR_NONE) return error; + + s->Phone.Data.WAPSettings = settings; + settings->Number = 0; + settings->ReadOnly = false; + + req[4] = settings->Location-1; + smprintf(s, "Getting WAP settings part 1\n"); + error = GSM_WaitFor (s, req, 5, 0x3f, 4, ID_GetConnectSet); + if (error != ERR_NONE) return error; + +#ifdef GSM_ENABLE_NOKIA7110 + if (strstr(N7110Phone.models, s->Phone.Data.ModelInfo->model) != NULL) { + for (i=0;i<4;i++) { + req2[4] = Priv7110->WAPLocations.Locations[i]; + smprintf(s, "Getting WAP settings part 2\n"); + error=GSM_WaitFor (s, req2, 5, 0x3f, 4, ID_GetConnectSet); + if (error != ERR_NONE) return error; + if (Priv7110->WAPLocations.Locations[i] == Priv7110->WAPLocations.CurrentLocation) { + settings->ActiveBearer = settings->Settings[settings->Number-1].Bearer; + } + } + } +#endif +#ifdef GSM_ENABLE_NOKIA6110 + if (strstr(N6110Phone.models, s->Phone.Data.ModelInfo->model) != NULL) { + for (i=0;i<4;i++) { + req2[4] = Priv6110->WAPLocations.Locations[i]; + smprintf(s, "Getting WAP settings part 2\n"); + error=GSM_WaitFor (s, req2, 5, 0x3f, 4, ID_GetConnectSet); + if (error != ERR_NONE) return error; + if (Priv6110->WAPLocations.Locations[i] == Priv6110->WAPLocations.CurrentLocation) { + settings->ActiveBearer = settings->Settings[settings->Number-1].Bearer; + } + } + } +#endif + if (error == ERR_NONE) { + for (i=1;i<3;i++) { + CopyUnicodeString(settings->Settings[i].Title,settings->Settings[0].Title); + CopyUnicodeString(settings->Settings[i].HomePage,settings->Settings[0].HomePage); + settings->Settings[i].IsContinuous = settings->Settings[0].IsContinuous; + settings->Settings[i].IsSecurity = settings->Settings[0].IsSecurity; + + settings->Settings[i].IsContinuous = settings->Settings[0].IsContinuous; + settings->Settings[i].IsSecurity = settings->Settings[0].IsSecurity; + } + error = DCT3DCT4_GetActiveConnectSet(s); + } + if (error != ERR_NONE) return error; + + settings->Proxy[0] = 0x00; + settings->Proxy[1] = 0x00; + settings->ProxyPort = 8080; + + settings->Proxy2[0] = 0x00; + settings->Proxy2[1] = 0x00; + settings->Proxy2Port = 8080; + + return DCT3DCT4_DisableConnectionFunctions(s); +} + +GSM_Error DCT3_ReplySetWAPSettings(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + switch(msg.Buffer[3]) { + case 0x19: + smprintf(s, "WAP settings part 1 set OK\n"); + return ERR_NONE; + case 0x1a: + smprintf(s, "WAP settings part 1 setting error\n"); + switch (msg.Buffer[4]) { + case 0x01: + smprintf(s, "Security error. Inside WAP settings menu\n"); + return ERR_INSIDEPHONEMENU; + case 0x02: + smprintf(s, "Incorrect data\n"); + return ERR_UNKNOWN; + default: + smprintf(s, "ERROR: unknown %i\n",msg.Buffer[4]); + return ERR_UNKNOWNRESPONSE; + } + case 0x1F: + smprintf(s, "WAP settings part 2 set OK\n"); + return ERR_NONE; + } + return ERR_UNKNOWNRESPONSE; +} + +GSM_Error DCT3_SetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings) +{ +#ifdef GSM_ENABLE_NOKIA6110 + GSM_Phone_N6110Data *Priv6110 = &s->Phone.Data.Priv.N6110; +#endif +#ifdef GSM_ENABLE_NOKIA7110 + GSM_Phone_N7110Data *Priv7110 = &s->Phone.Data.Priv.N7110; +#endif + GSM_Error error; + GSM_MultiWAPSettings settings2; + int i,pos,phone1=-1,phone2=-1,phone3=-1; + int ID=0,locations[4],loc1=-1,loc2=-1,loc3=-1; + unsigned char req[] = {N6110_FRAME_HEADER,0x15, + 0x00}; /* Location */ + unsigned char req2[] = {N6110_FRAME_HEADER,0x1b, + 0x00}; /* Location */ + unsigned char SetReq[200] = {N7110_FRAME_HEADER, 0x18, + 0x00}; /* Location */ + unsigned char SetReq2[200] = {N7110_FRAME_HEADER, 0x1e, + 0x00}; /* Location */ + + /* We have to enable WAP frames in phone */ + error=DCT3DCT4_EnableWAPFunctions(s); + if (error!=ERR_NONE) return error; + + s->Phone.Data.WAPSettings = &settings2; + settings2.Number = 0; + + req[4] = settings->Location-1; + smprintf(s, "Getting WAP settings part 1\n"); + error = GSM_WaitFor (s, req, 6, 0x3f, 4, ID_GetConnectSet); + if (error != ERR_NONE) return error; + +#ifdef GSM_ENABLE_NOKIA6110 + if (strstr(N6110Phone.models, s->Phone.Data.ModelInfo->model) != NULL) { + for (i=0;i<4;i++) locations[i] = Priv6110->WAPLocations.Locations[i]; + ID = Priv6110->WAPLocations.ID; + } +#endif +#ifdef GSM_ENABLE_NOKIA7110 + if (strstr(N7110Phone.models, s->Phone.Data.ModelInfo->model) != NULL) { + for (i=0;i<4;i++) locations[i] = Priv7110->WAPLocations.Locations[i]; + ID = Priv7110->WAPLocations.ID; + } +#endif + + /* Now we get info about supported types by phone and their locations */ + for (i=0;i<4;i++) { + settings2.Number = 0; + settings2.Settings[0].Bearer = 0; + req2[4] = locations[i]; + smprintf(s, "Getting WAP settings part 2\n"); + error=GSM_WaitFor (s, req2, 6, 0x3f, 4, ID_GetConnectSet); + if (error != ERR_NONE) return error; + switch (settings2.Settings[0].Bearer) { + case WAPSETTINGS_BEARER_DATA: phone1 = locations[i]; break; + case WAPSETTINGS_BEARER_SMS : phone2 = locations[i]; break; + case WAPSETTINGS_BEARER_USSD: phone3 = locations[i]; break; + default : break; + } + if (error != ERR_NONE) return error; + } + + /* We have some phone locations and some data to set. We try to + * find info about locations in phone used to write concrete bearers + */ + for (i=0;iNumber;i++) { + if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_DATA) { + if (phone1 != -1) loc1=i; + } + if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_SMS) { + if (phone2 != -1) loc2=i; + } + if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_USSD) { + if (phone3 != -1) loc3=i; + } + } + + pos = 5; + memset(SetReq + pos, 0, 200 - pos); + SetReq[4] = settings->Location - 1; + if (loc1 != -1) { + /* Name */ + pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc1].Title, false); + /* HomePage */ + pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc1].HomePage, false); + if (settings->Settings[loc1].IsContinuous) SetReq[pos] = 0x01; + pos++; + SetReq[pos++] = ID; + + SetReq[pos] = phone1; /* bearer */ + switch (settings->ActiveBearer) { + case WAPSETTINGS_BEARER_DATA: + if (loc1 != -1) SetReq[pos] = phone1; + break; + case WAPSETTINGS_BEARER_SMS: + if (loc2 != -1) SetReq[pos] = phone2; + break; + case WAPSETTINGS_BEARER_USSD: + if (loc3 != -1) SetReq[pos] = phone3; + break; + default: break; + } + pos++; + + if (settings->Settings[loc1].IsSecurity) SetReq[pos] = 0x01; + pos++; + } else if (loc2 != -1) { + /* Name */ + pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc2].Title, false); + /* HomePage */ + pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc2].HomePage, false); + if (settings->Settings[loc2].IsContinuous) SetReq[pos] = 0x01; + pos++; + SetReq[pos++] = ID; + + SetReq[pos] = phone2; /* bearer */ + switch (settings->ActiveBearer) { + case WAPSETTINGS_BEARER_DATA: + if (loc1 != -1) SetReq[pos] = phone1; + break; + case WAPSETTINGS_BEARER_SMS: + if (loc2 != -1) SetReq[pos] = phone2; + break; + case WAPSETTINGS_BEARER_USSD: + if (loc3 != -1) SetReq[pos] = phone3; + break; + default: break; + } + pos++; + + if (settings->Settings[loc2].IsSecurity) SetReq[pos] = 0x01; + pos++; + } else if (loc3 != -1) { + /* Name */ + pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc3].Title, false); + /* HomePage */ + pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc3].HomePage, false); + if (settings->Settings[loc3].IsContinuous) SetReq[pos] = 0x01; + pos++; + SetReq[pos++] = ID; + + SetReq[pos] = phone3; /* bearer */ + switch (settings->ActiveBearer) { + case WAPSETTINGS_BEARER_DATA: + if (loc1 != -1) SetReq[pos] = phone1; + break; + case WAPSETTINGS_BEARER_SMS: + if (loc2 != -1) SetReq[pos] = phone2; + break; + case WAPSETTINGS_BEARER_USSD: + if (loc3 != -1) SetReq[pos] = phone3; + break; + default: break; + } + pos++; + + if (settings->Settings[loc3].IsSecurity) SetReq[pos] = 0x01; + pos++; + } else { + return ERR_UNKNOWN; /* We have to have write something known */ + } + memcpy(SetReq + pos, "\x01\x80\x00\x00\x00\x00\x00\x00\x00", 9); + pos += 9; + + smprintf(s, "Writing WAP settings part 1\n"); + error=GSM_WaitFor (s, SetReq, pos, 0x3f, 4, ID_SetConnectSet); + if (error != ERR_NONE) return error; + + /* Data */ + if (phone1 != -1) { + pos = 4; + memset(SetReq2 + pos, 0, 200 - pos); + SetReq2[pos++] = phone1; + SetReq2[pos++] = 0x02; + SetReq2[pos++] = 0x01; /* GSMdata */ + if (loc1 != -1) { + if (!settings->Settings[loc1].IsNormalAuthentication) SetReq2[pos] = 0x01; + } + pos++; + if (loc1 != -1) { + if (settings->Settings[loc1].IsISDNCall) SetReq2[pos] = 0x01; + } + pos++; + if (loc1 != -1) { + switch (settings->Settings[loc1].Speed) { + case WAPSETTINGS_SPEED_9600 : SetReq2[pos++] = 0x01; break; + case WAPSETTINGS_SPEED_14400 : SetReq2[pos++] = 0x02; break; + default : SetReq2[pos++] = 0x02; break; + } + switch (settings->Settings[loc1].Speed) { + case WAPSETTINGS_SPEED_9600 : SetReq2[pos++] = 0x01; break; + case WAPSETTINGS_SPEED_14400 : SetReq2[pos++] = 0x02; break; + default : SetReq2[pos++] = 0x02; break; + } + } else pos+=2; + if (loc1 != -1) { + /* IP */ + pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc1].IPAddress, false); + /* Number */ + pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc1].DialUp, false); + /* Username */ + pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc1].User, false); + /* Password */ + pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc1].Password, false); + } else pos+=5; + memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8); + pos += 8; + smprintf(s, "Writing WAP settings part 2 (Data bearer)\n"); + error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet); + if (error != ERR_NONE) return error; + } + /* SMS */ + if (phone2 != -1) { + pos = 4; + memset(SetReq2 + pos, 0, 200 - pos); + SetReq2[pos++] = phone2; + SetReq2[pos++] = 0x02; + SetReq2[pos++] = 0x00; /* SMS */ + if (loc2 != -1) { + /* Service number */ + pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc2].Service, false); + /* Server number */ + pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc2].Server, false); + } else pos += 2; + memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8); + pos += 8; + smprintf(s, "Writing WAP settings part 2 (SMS bearer)\n"); + error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet); + if (error != ERR_NONE) return error; + } + /* USSD */ + if (phone3 != -1) { + pos = 4; + memset(SetReq2 + pos, 0, 200 - pos); + SetReq2[pos++] = phone3; + SetReq2[pos++] = 0x02; + SetReq2[pos++] = 0x02; /* USSD */ + if (loc3 != -1) { + if (!settings->Settings[loc3].IsIP) SetReq2[pos] = 0x01; + } + pos++; + if (loc3 != -1) { + /* Service number or IP address */ + pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc3].Service, false); + /* Code number */ + pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc3].Code, false); + } else pos+=2; + memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8); + pos += 8; + smprintf(s, "Writing WAP settings part 2 (USSD bearer)\n"); + error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet); + if (error != ERR_NONE) return error; + } + error = DCT3DCT4_SetActiveConnectSet(s, settings); + if (error != ERR_NONE) return error; + + return DCT3DCT4_DisableConnectionFunctions(s); +} + +GSM_Error DCT3_ReplySendSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + switch (msg.Buffer[3]) { + case 0x02: + smprintf(s, "SMS sent OK\n"); + if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,0,0); + return ERR_NONE; + case 0x03: + smprintf(s, "Error %i\n",msg.Buffer[6]); + if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s->CurrentConfig->Device,msg.Buffer[6],0); + return ERR_NONE; + } + return ERR_UNKNOWNRESPONSE; +} + +GSM_Error DCT3_SendSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms) +{ + int length; + GSM_Error error; + unsigned char req[256] = {N6110_FRAME_HEADER, 0x01, 0x02, 0x00}; + + error=PHONE_EncodeSMSFrame(s,sms,req+6,PHONE_SMSSubmit,&length, true); + if (error != ERR_NONE) return error; + + smprintf(s, "Sending sms\n"); + return s->Protocol.Functions->WriteMessage(s, req, 6+length, 0x02); +} + +GSM_Error DCT3_ReplyNetmonitor(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + switch (msg.Buffer[3]) { + case 0x00: + smprintf(s, "Netmonitor correctly set\n"); + break; + default: + smprintf(s, "Menu %i\n",msg.Buffer[3]); + smprintf(s, "%s\n",msg.Buffer+4); + strcpy(s->Phone.Data.Netmonitor,msg.Buffer+4); + break; + } + return ERR_NONE; +} + +GSM_Error DCT3_Netmonitor(GSM_StateMachine *s, int testnumber, char *value) +{ + GSM_Error error; + unsigned char req[] = {0x00, 0x01, 0x7e, + 0x00}; /* Test number */ + + value[0] = 0; + + error=DCT3_EnableSecurity (s, 0x01); + if (error != ERR_NONE) return error; + + req[3] = testnumber; + + smprintf(s, "Getting netmonitor test\n"); + s->Phone.Data.Netmonitor = value; + return GSM_WaitFor (s, req, 4, 0x40, 4, ID_Netmonitor); +} + +GSM_Error DCT3_GetManufactureMonth(GSM_StateMachine *s, char *value) +{ + GSM_Error error; + + error=DCT3_EnableSecurity (s, 0x01); + if (error != ERR_NONE) return error; + return NOKIA_GetPhoneString(s,"\x00\x01\xCC\x02",4,0x40,value,ID_GetManufactureMonth,5); +} + +GSM_Error DCT3_GetProductCode(GSM_StateMachine *s, char *value) +{ + GSM_Error error; + + if (strlen(s->Phone.Data.ProductCodeCache)!=0) { + strcpy(value,s->Phone.Data.ProductCodeCache); + return ERR_NONE; + } + + error=DCT3_EnableSecurity (s, 0x01); + if (error != ERR_NONE) return error; + return NOKIA_GetPhoneString(s,"\x00\x01\xCA\x01",4,0x40,value,ID_GetProductCode,5); +} + +GSM_Error DCT3_GetOriginalIMEI(GSM_StateMachine *s, char *value) +{ + GSM_Error error; + + error=DCT3_EnableSecurity (s, 0x01); + if (error != ERR_NONE) return error; + return NOKIA_GetPhoneString(s,"\x00\x01\xCC\x01",4,0x40,value,ID_GetOriginalIMEI,5); +} + +GSM_Error DCT3_GetHardware(GSM_StateMachine *s, char *value) +{ + GSM_Error error; + + if (strlen(s->Phone.Data.HardwareCache)!=0) { + strcpy(value,s->Phone.Data.HardwareCache); + return ERR_NONE; + } + + error=DCT3_EnableSecurity (s, 0x01); + if (error != ERR_NONE) return error; + return NOKIA_GetPhoneString(s,"\x00\x01\xC8\x05",4,0x40,value,ID_GetHardware,5); +} + +GSM_Error DCT3_GetPPM(GSM_StateMachine *s, char *value) +{ + GSM_Error error; + + error=DCT3_EnableSecurity (s, 0x01); + if (error != ERR_NONE) return error; + return NOKIA_GetPhoneString(s,"\x00\x01\xC8\x12",4,0x40,value,ID_GetPPM,5); +} + +GSM_Error DCT3_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x36, 0x64}; + + s->Phone.Data.SMSStatus=status; + smprintf(s, "Getting SMS status\n"); + return GSM_WaitFor (s, req, 5, 0x14, 2, ID_GetSMSStatus); + + /* 6210 family doesn't show in frame with SMS status info + * about Templates. We get separately info about this SMS folder. + */ +} + +GSM_Error DCT3_ReplyDeleteSMSMessage(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + switch(msg.Buffer[3]) { + case 0x0b: + smprintf(s, "SMS deleted\n"); + return ERR_NONE; + case 0x0c: + smprintf(s, "Error deleting SMS\n"); + switch (msg.Buffer[4]) { + case 0x00: + /* Not tested on 6210 */ + smprintf(s, "Unknown meaning, SMS seems to be deleted\n"); + return ERR_NONE; + case 0x02: + /* Not tested on 6210 */ + smprintf(s, "Invalid location\n"); + return ERR_INVALIDLOCATION; + case 0x06: + /* Not tested on 6210 */ + smprintf(s, "Phone is OFF\n"); + return ERR_PHONEOFF; + default: + smprintf(s, "Unknown error: %02x\n",msg.Buffer[4]); + return ERR_UNKNOWNRESPONSE; + } + } + return ERR_UNKNOWNRESPONSE; +} + +GSM_Error N71_92_ReplyGetSignalQuality(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + GSM_Phone_Data *Data = &s->Phone.Data; + + smprintf(s, "Network level received: %i\n",msg.Buffer[4]); + Data->SignalQuality->SignalStrength = -1; + Data->SignalQuality->SignalPercent = ((int)msg.Buffer[4]); + Data->SignalQuality->BitErrorRate = -1; + return ERR_NONE; +} + +GSM_Error N71_92_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x81}; + + s->Phone.Data.SignalQuality = sig; + smprintf(s, "Getting network level\n"); + return GSM_WaitFor (s, req, 4, 0x0a, 4, ID_GetSignalQuality); +} + +GSM_Error N71_92_ReplyGetBatteryCharge(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + GSM_Phone_Data *Data = &s->Phone.Data; + + smprintf(s, "Battery level received: %i\n",msg.Buffer[5]); + Data->BatteryCharge->BatteryPercent = ((int)msg.Buffer[5]); + Data->BatteryCharge->ChargeState = 0; + return ERR_NONE; +} + +GSM_Error N71_92_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat) +{ + unsigned char req[] = {N6110_FRAME_HEADER, 0x02}; + + s->Phone.Data.BatteryCharge = bat; + smprintf(s, "Getting battery level\n"); + return GSM_WaitFor (s, req, 4, 0x17, 4, ID_GetBatteryCharge); +} + +GSM_Error N71_92_ReplyPhoneSetting(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + GSM_Phone_Bitmap_Types BmpType; + GSM_Phone_Data *Data = &s->Phone.Data; + + switch (msg.Buffer[4]) { + case 0x02: + if (Data->RequestID == ID_GetBitmap || Data->RequestID == ID_EachFrame) { + smprintf(s, "Welcome note text received\n"); + CopyUnicodeString(Data->Bitmap->Text,msg.Buffer+6); + smprintf(s, "Text is \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Text)); + return ERR_NONE; + } + if (Data->RequestID == ID_SetBitmap || Data->RequestID == ID_EachFrame) { + smprintf(s, "Startup text set\n"); + return ERR_NONE; + } + case 0x15: + if (Data->RequestID == ID_GetBitmap || Data->RequestID == ID_EachFrame) { + smprintf(s, "Startup logo received\n"); + BmpType=GSM_Nokia7110StartupLogo; + if (msg.Buffer[17]==0x60) BmpType=GSM_Nokia6210StartupLogo; + if (msg.Buffer[17]==0xc0) BmpType=GSM_NokiaStartupLogo; + PHONE_DecodeBitmap(BmpType, msg.Buffer+22, Data->Bitmap); + return ERR_NONE; + } + if (Data->RequestID == ID_SetBitmap || Data->RequestID == ID_EachFrame) { + smprintf(s, "Startup logo set\n"); + return ERR_NONE; + } + case 0x17: + if (Data->RequestID == ID_GetBitmap || Data->RequestID == ID_EachFrame) { + smprintf(s, "Dealer note text received\n"); + CopyUnicodeString(Data->Bitmap->Text,msg.Buffer+6); + smprintf(s, "Text is \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Text)); + return ERR_NONE; + } + if (Data->RequestID == ID_SetBitmap || Data->RequestID == ID_EachFrame) { + smprintf(s, "Dealer text set\n"); + return ERR_NONE; + } + } + return ERR_UNKNOWNRESPONSE; +} + +GSM_Error N71_92_GetPhoneSetting(GSM_StateMachine *s, int Request, int Setting) +{ + unsigned char req[] = {N7110_FRAME_HEADER, 0xee, + 0x1c}; /* Setting */ + + req[4]=Setting; + return GSM_WaitFor (s, req, 5, 0x7a, 4, Request); +} + +GSM_Error N71_92_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time) +{ + return DCT3_GetDateTime(s, date_time, 0x19); +} + +GSM_Error N71_92_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time) +{ + return DCT3_SetDateTime(s, date_time, 0x19); +} + +GSM_Error DCT3_DecodeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *SMS, unsigned char *buffer) +{ + switch (buffer[12] & 0x03) { + case 0x00: + smprintf(s, "SMS type - deliver\n"); + SMS->PDU = SMS_Deliver; + return GSM_DecodeSMSFrame(SMS,buffer,PHONE_SMSDeliver); + case 0x01: + smprintf(s, "SMS type - submit\n"); + SMS->PDU = SMS_Submit; + return GSM_DecodeSMSFrame(SMS,buffer,PHONE_SMSSubmit); + case 0x02: + smprintf(s, "SMS type - delivery report\n"); + SMS->PDU = SMS_Status_Report; + return GSM_DecodeSMSFrame(SMS,buffer,PHONE_SMSStatusReport); + } + return ERR_UNKNOWN; +} + +GSM_Error N61_91_ReplySetOpLogo(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + switch (msg.Buffer[3]) { + case 0x31: + smprintf(s, "Operator logo set OK\n"); + return ERR_NONE; + case 0x32: + smprintf(s, "Error setting operator logo\n"); + switch (msg.Buffer[4]) { + case 0x7d: + smprintf(s, "Too high location ?\n"); + return ERR_INVALIDLOCATION; + default: + smprintf(s, "ERROR: unknown %i\n",msg.Buffer[4]); + } + } + return ERR_UNKNOWNRESPONSE; +} + +GSM_Error N61_71_ReplyResetPhoneSettings(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + smprintf(s, "Phone settings cleaned OK\n"); + return ERR_NONE; +} + +GSM_Error N61_71_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type) +{ + GSM_Error error; + unsigned char req[] = {0x00, 0x01, 0x65, + 0x01}; /* Reset type */ + + switch (Type) { + case GSM_RESET_PHONESETTINGS : req[3] = 0x01; break; + case GSM_RESET_DEVICE : req[3] = 0x02; break; + case GSM_RESET_USERINTERFACE : req[3] = 0x08; break; + case GSM_RESET_USERINTERFACE_PHONESETTINGS : req[3] = 0x38; break; + case GSM_RESET_FULLFACTORY : req[3] = 0xff; break; + } + + error=DCT3_EnableSecurity (s, 0x01); + if (error != ERR_NONE) return error; + + return GSM_WaitFor (s, req, 4, 0x40, 4, ID_ResetPhoneSettings); +} + +#endif + +/* How should editor hadle tabs in this file? Add editor commands here. + * vim: noexpandtab sw=8 ts=8 sts=8: + */ -- cgit v0.9.0.2