Conditional (enabled) compilation of Nokia Authentication phase (not needed?)
[gnokii.git] / common / gsm-wap.c
1 /*
2
3   G N O K I I
4
5   A Linux/Unix toolset and driver for Nokia mobile phones.
6
7   Released under the terms of the GNU GPL, see file COPYING for more details.
8         
9   Functions for manipulating WAP settings and bookmarks
10   
11 */
12
13 #include "config.h"
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <ctype.h>
19 #include <sys/stat.h>
20
21 #include "gsm-common.h"
22 #include "gsm-wap.h"
23 #include "gsm-sms.h"
24 #include "gsm-coding.h"
25
26 int GSM_SaveWAPBookmarkToSMS(GSM_MultiSMSMessage *SMS,
27                              GSM_WAPBookmark *bookmark)
28 {
29   unsigned char Data[500];
30   GSM_UDH UDHType;
31   u16 current=0;
32   u8 buffer[50*3];
33
34   strcpy(Data+current,"\x01\x06-\x1F");current=current+4;
35   strcpy(Data+current,"+application/x-wap-prov.browser-bookmarks");current=current+12+29;
36   Data[current++]=0x00;
37
38   strcpy(Data+current,"\x81\xEA");current=current+2;
39
40   EncodeUTF8(buffer,bookmark->title,strlen(bookmark->title));
41   if (strlen(bookmark->title)==strlen(buffer)) {
42     strcpy(Data+current,"\x00");current=current+1;
43     strcpy(Data+current,"\x01\x00");current=current+2;
44   } else {
45     strcpy(Data+current,"\x01\x01\x87\x68\x00");current=current+5;
46   }
47
48   strcpy(Data+current,"\x45\xC6\x7F");current=current+3;
49
50   /* The same to "title" block in WAP settings */
51   strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5;
52   if (strlen(bookmark->title)==strlen(buffer)) {
53     strcpy(Data+current,bookmark->title);current=current+strlen(bookmark->title);
54   } else {
55     EncodeUnicode (Data+current, bookmark->title, strlen(bookmark->title));
56     current=current+2*strlen(bookmark->title);
57     Data[current++]=0x00;
58   }
59   Data[current++]=0x00;
60
61   /* The same to "homepage" block in WAP settings */
62   strcpy(Data+current,"\x01\x87\x17\x11\x03");current=current+5;
63   if (strlen(bookmark->title)==strlen(buffer)) {
64     strcpy(Data+current,bookmark->address);current=current+strlen(bookmark->address);
65   } else {
66     EncodeUnicode (Data+current, bookmark->address, strlen(bookmark->address));
67     current=current+2*strlen(bookmark->address);
68     Data[current++]=0x00;
69   }
70   Data[current++]=0x00;
71
72   /* Mark of end */
73   strcpy(Data+current,"\x01\x01\x01");current=current+3;
74
75   if (current>(140-7)) { //more than 1 SMS
76     UDHType=GSM_WAPBookmarkUDHLong;
77   } else {
78     UDHType=GSM_WAPBookmarkUDH;
79   }
80
81   GSM_MakeMultiPartSMS2(SMS, Data,current, UDHType, GSM_Coding_Default);
82   
83   return 0;
84 }
85
86 GSM_Error GSM_ReadWAPBookmark(GSM_SMSMessage *message, GSM_WAPBookmark *bookmark)
87 {
88   unsigned char Data[250];
89   int current=0,i,j;
90
91   switch (message->UDHType) {
92   case GSM_WAPBookmarkUDH:
93
94     strcpy(Data+current,"\x01\x06-\x1F");current=current+4;
95     strcpy(Data+current,"+application/x-wap-prov.browser-bookmarks");current=current+12+29;
96     Data[current++]=0x00;
97
98     strcpy(Data+current,"\x81\xEA\x00");current=current+3;
99
100     strcpy(Data+current,"\x01\x00");current=current+2;
101     strcpy(Data+current,"\x45\xC6\x7F");current=current+3;
102
103     strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5;
104
105     for (i=0;i<current;i++)
106       if (message->MessageText[i]!=Data[i]) return GE_UNKNOWN;
107
108     j=0;
109     while (message->MessageText[current]!=0x00) {
110       bookmark->title[j++]=message->MessageText[current];
111       current++;
112     }
113     bookmark->title[j]=0;    
114
115     current=current+6;
116
117     j=0;
118     while (message->MessageText[current]!=0x00) {
119       bookmark->address[j++]=message->MessageText[current];
120       current++;
121     }
122     bookmark->address[j]=0;    
123
124     break;
125
126   default: /* error */
127     return GE_UNKNOWN;
128     break;
129   }
130
131   return GE_NONE;
132 }
133
134 /* Made from sniff of WAP settings sent from Logo Manager with such file:
135 [GSMCSD]
136 Name=Orange
137 URL=http://OtherSites/
138 Gateway=192.168.71.81
139 ; 9200=Temporary,Normal 9201=Continuous,Normal 9202=Temp,Secure 9203=Continuous,Secure
140 Port=9201
141 DialString=+447973100501
142 ; Auth Type can be PAP, CHAP or MS_CHAP
143 PPPAuthType=PAP
144 PPPAuthName=Orange
145 PPPAuthPass=Multimedia
146 ; ISDN or ANALOGUE
147 CallType=ISDN
148 CallSpeed=14400
149
150 SMS contenst:
151
152 0106
153 ,
154 1F
155 *application/x-wap-prov.browser-settings
156 00
157 81ea01016a
158 0045c606
159 0187121145
160 0187141101
161 0187131103
162 00
163 0187211103
164 00
165 0187281172
166 018729116b
167 01872211700101c608
168 0187151103
169    settings->title
170 00
171 01
172 0186071103
173    settings->homepage
174 0001c67f
175 0187151103
176    settings->title
177 00
178 0187171103
179    settings->homepage
180 00
181 010101
182 */
183
184 /* Function created from software from
185    http://www.tektonica.com/projects/gsmsms/ */
186 int GSM_SaveWAPSettingsToSMS(GSM_MultiSMSMessage *SMS,
187                              GSM_WAPSettings *settings)
188 {
189   unsigned char Data[500];
190   u16 current=0;
191
192   strcpy(Data+current,"\x01\x06\x04\x03\x94");current=current+5;
193
194   strcpy(Data+current,"\x81\xEA\x00");current=current+3;
195
196   strcpy(Data+current,"\x01\x00");current=current+2;
197   strcpy(Data+current,"\x45\xC6\x06");current=current+3;
198
199   strcpy(Data+current,"\x01\x87\x12");current=current+3;
200   switch (settings->bearer) {
201     case WAPSETTINGS_BEARER_DATA:Data[current++]=0x45;break;
202     case WAPSETTINGS_BEARER_SMS :Data[current++]=0x41;break;
203   }
204
205   strcpy(Data+current,"\x01\x87\x13\x11\x03");current=current+5;
206   strcpy(Data+current,settings->ipaddress);current=current+strlen(settings->ipaddress);
207   Data[current++]=0x00;
208
209   strcpy(Data+current,"\x01\x87\x14");current=current+3;
210   if (settings->iscontinuous) { Data[current++]=0x61; } //continuous
211                          else { Data[current++]=0x60; } //temporary
212
213   strcpy(Data+current,"\x01\x87\x21\x11\x03");current=current+5;
214   strcpy(Data+current,settings->dialup);current=current+strlen(settings->dialup);
215   Data[current++]=0x00;
216
217   strcpy(Data+current,"\x01\x87\x22");current=current+3;
218   if (settings->isnormalauthentication) {
219     Data[current++]=0x70;//OTA_CSD_AUTHTYPE_PAP. Correct ?
220   } else {
221     Data[current++]=0x71;//OTA_CSD_AUTHTYPE_CHAP. Correct ?
222   }
223
224   strcpy(Data+current,"\x01\x87\x23\x11\x03");current=current+5;
225   strcpy(Data+current,settings->user);current=current+strlen(settings->user);
226   Data[current++]=0x00;
227
228   strcpy(Data+current,"\x01\x87\x24\x11\x03");current=current+5;
229   strcpy(Data+current,settings->password);current=current+strlen(settings->password);
230   Data[current++]=0x00;
231
232   strcpy(Data+current,"\x01\x87\x28");current=current+3;
233   if (settings->isISDNcall) { Data[current++]=0x73; } //ISDN
234                        else { Data[current++]=0x72; } //analogue
235
236   strcpy(Data+current,"\x01\x87\x29");current=current+3;
237 //use constant    OTA_CSD_CALLSPEED_AUTO => '6A';
238   if (settings->isspeed14400) { Data[current++]=0x6C; } //14400
239                          else { Data[current++]=0x6B; } //9600
240
241   Data[current++]=0x01;
242   strcpy(Data+current,"\x01\x86\x07\x11\x03");current=current+5;
243   strcpy(Data+current,settings->homepage);current=current+strlen(settings->homepage);
244   Data[current++]=0x00;
245
246   strcpy(Data+current,"\x01\xC6\x08");current=current+3;
247   strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5;
248   strcpy(Data+current,settings->title);current=current+strlen(settings->title);
249   Data[current++]=0x00;
250
251   /* Mark of end */
252   strcpy(Data+current,"\x01\x01\x01");current=current+3;
253
254   GSM_MakeMultiPartSMS2(SMS, Data,current, GSM_WAPSettingsUDH, GSM_Coding_Default);
255
256   return 0;
257 }