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