/* G N O K I I A Linux/Unix toolset and driver for Nokia mobile phones. Released under the terms of the GNU GPL, see file COPYING for more details. Functions for manipulating WAP settings and bookmarks */ #include "config.h" #include #include #include #include #include #include "gsm-common.h" #include "gsm-wap.h" #include "gsm-sms.h" #include "gsm-coding.h" int GSM_SaveWAPBookmarkToSMS(GSM_MultiSMSMessage *SMS, GSM_WAPBookmark *bookmark) { unsigned char Data[500]; GSM_UDH UDHType; u16 current=0; u8 buffer[50*3]; strcpy(Data+current,"\x01\x06-\x1F");current=current+4; strcpy(Data+current,"+application/x-wap-prov.browser-bookmarks");current=current+12+29; Data[current++]=0x00; strcpy(Data+current,"\x81\xEA");current=current+2; EncodeUTF8(buffer,bookmark->title,strlen(bookmark->title)); if (strlen(bookmark->title)==strlen(buffer)) { strcpy(Data+current,"\x00");current=current+1; strcpy(Data+current,"\x01\x00");current=current+2; } else { strcpy(Data+current,"\x01\x01\x87\x68\x00");current=current+5; } strcpy(Data+current,"\x45\xC6\x7F");current=current+3; /* The same to "title" block in WAP settings */ strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5; if (strlen(bookmark->title)==strlen(buffer)) { strcpy(Data+current,bookmark->title);current=current+strlen(bookmark->title); } else { EncodeUnicode (Data+current, bookmark->title, strlen(bookmark->title)); current=current+2*strlen(bookmark->title); Data[current++]=0x00; } Data[current++]=0x00; /* The same to "homepage" block in WAP settings */ strcpy(Data+current,"\x01\x87\x17\x11\x03");current=current+5; if (strlen(bookmark->title)==strlen(buffer)) { strcpy(Data+current,bookmark->address);current=current+strlen(bookmark->address); } else { EncodeUnicode (Data+current, bookmark->address, strlen(bookmark->address)); current=current+2*strlen(bookmark->address); Data[current++]=0x00; } Data[current++]=0x00; /* Mark of end */ strcpy(Data+current,"\x01\x01\x01");current=current+3; if (current>(140-7)) { //more than 1 SMS UDHType=GSM_WAPBookmarkUDHLong; } else { UDHType=GSM_WAPBookmarkUDH; } GSM_MakeMultiPartSMS2(SMS, Data,current, UDHType, GSM_Coding_Default); return 0; } GSM_Error GSM_ReadWAPBookmark(GSM_SMSMessage *message, GSM_WAPBookmark *bookmark) { unsigned char Data[250]; int current=0,i,j; switch (message->UDHType) { case GSM_WAPBookmarkUDH: strcpy(Data+current,"\x01\x06-\x1F");current=current+4; strcpy(Data+current,"+application/x-wap-prov.browser-bookmarks");current=current+12+29; Data[current++]=0x00; strcpy(Data+current,"\x81\xEA\x00");current=current+3; strcpy(Data+current,"\x01\x00");current=current+2; strcpy(Data+current,"\x45\xC6\x7F");current=current+3; strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5; for (i=0;iMessageText[i]!=Data[i]) return GE_UNKNOWN; j=0; while (message->MessageText[current]!=0x00) { bookmark->title[j++]=message->MessageText[current]; current++; } bookmark->title[j]=0; current=current+6; j=0; while (message->MessageText[current]!=0x00) { bookmark->address[j++]=message->MessageText[current]; current++; } bookmark->address[j]=0; break; default: /* error */ return GE_UNKNOWN; break; } return GE_NONE; } /* Made from sniff of WAP settings sent from Logo Manager with such file: [GSMCSD] Name=Orange URL=http://OtherSites/ Gateway=192.168.71.81 ; 9200=Temporary,Normal 9201=Continuous,Normal 9202=Temp,Secure 9203=Continuous,Secure Port=9201 DialString=+447973100501 ; Auth Type can be PAP, CHAP or MS_CHAP PPPAuthType=PAP PPPAuthName=Orange PPPAuthPass=Multimedia ; ISDN or ANALOGUE CallType=ISDN CallSpeed=14400 SMS contenst: 0106 , 1F *application/x-wap-prov.browser-settings 00 81ea01016a 0045c606 0187121145 0187141101 0187131103 00 0187211103 00 0187281172 018729116b 01872211700101c608 0187151103 settings->title 00 01 0186071103 settings->homepage 0001c67f 0187151103 settings->title 00 0187171103 settings->homepage 00 010101 */ /* Function created from software from http://www.tektonica.com/projects/gsmsms/ */ int GSM_SaveWAPSettingsToSMS(GSM_MultiSMSMessage *SMS, GSM_WAPSettings *settings) { unsigned char Data[500]; u16 current=0; strcpy(Data+current,"\x01\x06\x04\x03\x94");current=current+5; strcpy(Data+current,"\x81\xEA\x00");current=current+3; strcpy(Data+current,"\x01\x00");current=current+2; strcpy(Data+current,"\x45\xC6\x06");current=current+3; strcpy(Data+current,"\x01\x87\x12");current=current+3; switch (settings->bearer) { case WAPSETTINGS_BEARER_DATA:Data[current++]=0x45;break; case WAPSETTINGS_BEARER_SMS :Data[current++]=0x41;break; } strcpy(Data+current,"\x01\x87\x13\x11\x03");current=current+5; strcpy(Data+current,settings->ipaddress);current=current+strlen(settings->ipaddress); Data[current++]=0x00; strcpy(Data+current,"\x01\x87\x14");current=current+3; if (settings->iscontinuous) { Data[current++]=0x61; } //continuous else { Data[current++]=0x60; } //temporary strcpy(Data+current,"\x01\x87\x21\x11\x03");current=current+5; strcpy(Data+current,settings->dialup);current=current+strlen(settings->dialup); Data[current++]=0x00; strcpy(Data+current,"\x01\x87\x22");current=current+3; if (settings->isnormalauthentication) { Data[current++]=0x70;//OTA_CSD_AUTHTYPE_PAP. Correct ? } else { Data[current++]=0x71;//OTA_CSD_AUTHTYPE_CHAP. Correct ? } strcpy(Data+current,"\x01\x87\x23\x11\x03");current=current+5; strcpy(Data+current,settings->user);current=current+strlen(settings->user); Data[current++]=0x00; strcpy(Data+current,"\x01\x87\x24\x11\x03");current=current+5; strcpy(Data+current,settings->password);current=current+strlen(settings->password); Data[current++]=0x00; strcpy(Data+current,"\x01\x87\x28");current=current+3; if (settings->isISDNcall) { Data[current++]=0x73; } //ISDN else { Data[current++]=0x72; } //analogue strcpy(Data+current,"\x01\x87\x29");current=current+3; //use constant OTA_CSD_CALLSPEED_AUTO => '6A'; if (settings->isspeed14400) { Data[current++]=0x6C; } //14400 else { Data[current++]=0x6B; } //9600 Data[current++]=0x01; strcpy(Data+current,"\x01\x86\x07\x11\x03");current=current+5; strcpy(Data+current,settings->homepage);current=current+strlen(settings->homepage); Data[current++]=0x00; strcpy(Data+current,"\x01\xC6\x08");current=current+3; strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5; strcpy(Data+current,settings->title);current=current+strlen(settings->title); Data[current++]=0x00; /* Mark of end */ strcpy(Data+current,"\x01\x01\x01");current=current+3; GSM_MakeMultiPartSMS2(SMS, Data,current, GSM_WAPSettingsUDH, GSM_Coding_Default); return 0; }