Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

ota_prov.c File Reference

#include <string.h>
#include "gwlib/gwlib.h"
#include <openssl/hmac.h>
#include "msg.h"
#include "sms.h"
#include "ota_prov.h"
#include "ota_prov_attr.h"
#include "ota_compiler.h"
#include "wap/wsp_headers.h"

Include dependency graph for ota_prov.c:

Include dependency graph

Go to the source code of this file.

Functions

void ota_pack_udh (Msg **msg, Octstr *doc_type)
int ota_pack_push_headers (Msg **msg, Octstr *mime_type, Octstr *sec, Octstr *pin, Octstr *ota_binary)
int ota_pack_message (Msg **msg, Octstr *ota_doc, Octstr *doc_type, Octstr *from, Octstr *phone_number, Octstr *sec, Octstr *pin)
Msgota_tokenize_settings (CfgGroup *grp, Octstr *from, Octstr *receiver)
Msgota_tokenize_bookmarks (CfgGroup *grp, Octstr *from, Octstr *receiver)


Function Documentation

int ota_pack_message Msg **  msg,
Octstr ota_doc,
Octstr doc_type,
Octstr from,
Octstr phone_number,
Octstr sec,
Octstr pin
 

Definition at line 207 of file ota_prov.c.

References info(), msg_create, octstr_destroy(), octstr_dump, octstr_duplicate, octstr_format_append(), octstr_get_cstr, octstr_imm(), ota_compile(), ota_pack_push_headers(), ota_pack_udh(), and sms.

Referenced by smsbox_req_sendota(), and smsbox_sendota_post().

00209 {
00210     Octstr *ota_binary;
00211 
00212     *msg = msg_create(sms);
00213     (*msg)->sms.sms_type = mt_push;
00214 
00215     ota_pack_udh(msg, doc_type);
00216 
00217     if (ota_compile(ota_doc, octstr_imm("UTF-8"), &ota_binary) == -1)
00218         goto cerror;
00219         
00220     if (!ota_pack_push_headers(msg, doc_type, sec, pin, ota_binary))
00221         goto herror;
00222 
00223     octstr_format_append((*msg)->sms.msgdata, "%S", ota_binary);
00224     (*msg)->sms.sender = octstr_duplicate(from);
00225     (*msg)->sms.receiver = octstr_duplicate(phone_number);
00226     (*msg)->sms.coding = DC_8BIT;
00227     (*msg)->sms.time = time(NULL);
00228 
00229     octstr_dump((*msg)->sms.msgdata, 0);
00230     info(0, "/cgi-bin/sendota: XML request for target <%s>", octstr_get_cstr(phone_number));
00231 
00232     octstr_destroy(ota_binary);
00233     octstr_destroy(ota_doc);
00234     octstr_destroy(doc_type);
00235     octstr_destroy(from);
00236     octstr_destroy(sec);
00237     octstr_destroy(pin);
00238     return 0;
00239 
00240 herror:
00241     octstr_destroy(ota_binary);
00242     octstr_destroy(ota_doc);
00243     octstr_destroy(doc_type);
00244     octstr_destroy(from);
00245     octstr_destroy(sec);
00246     octstr_destroy(pin);
00247     return -2;
00248 
00249 cerror:
00250     octstr_destroy(ota_doc);
00251     octstr_destroy(doc_type);
00252     octstr_destroy(from);
00253     octstr_destroy(sec);
00254     octstr_destroy(pin);
00255     return -1;
00256 }

Here is the call graph for this function:

int ota_pack_push_headers Msg **  msg,
Octstr mime_type,
Octstr sec,
Octstr pin,
Octstr ota_binary
[static]
 

Definition at line 114 of file ota_prov.c.

References octstr_append(), octstr_append_from_hex(), octstr_append_uintvar(), octstr_binary_to_hex(), octstr_case_compare(), octstr_create, octstr_create_from_data, octstr_destroy(), octstr_format_append(), octstr_get_cstr, octstr_imm(), octstr_len(), warning(), and wsp_pack_short_integer().

Referenced by ota_pack_message().

00116 {    
00117     (*msg)->sms.msgdata = octstr_create("");
00118     if (octstr_case_compare(mime_type, octstr_imm("settings")) == 0) {
00119         
00120         /* PUSH ID, PDU type, header length, value length */
00121         octstr_append_from_hex((*msg)->sms.msgdata, "01062C1F2A");
00122         /* MIME type for settings */
00123         octstr_format_append((*msg)->sms.msgdata, "%s", 
00124                              "application/x-wap-prov.browser-settings");
00125         octstr_append_from_hex((*msg)->sms.msgdata, "00");
00126         /* charset UTF-8 */
00127         octstr_append_from_hex((*msg)->sms.msgdata, "81EA");
00128 
00129     } else if (octstr_case_compare(mime_type, octstr_imm("bookmarks")) == 0) {
00130         
00131         /* PUSH ID, PDU type, header length, value length */
00132         octstr_append_from_hex((*msg)->sms.msgdata, "01062D1F2B");
00133         /* MIME type for bookmarks */
00134         octstr_format_append((*msg)->sms.msgdata, "%s", 
00135                              "application/x-wap-prov.browser-bookmarks");
00136         octstr_append_from_hex((*msg)->sms.msgdata, "00");
00137         /* charset UTF-8 */
00138         octstr_append_from_hex((*msg)->sms.msgdata, "81EA");
00139 
00140     } else if (octstr_case_compare(mime_type, octstr_imm("syncsettings")) == 0) {
00141 
00142         octstr_append_from_hex((*msg)->sms.msgdata, "3406060502020b81EA"); 
00143 
00144     } else if (octstr_case_compare(mime_type, octstr_imm("oma-settings")) == 0) {
00145         Octstr *hdr = octstr_create(""), *mac; 
00146         unsigned char *p;
00147         unsigned int mac_len;
00148 #ifdef HAVE_LIBSSL
00149         unsigned char macbuf[EVP_MAX_MD_SIZE];
00150 #endif
00151 
00152         /* PUSH ID, PDU type, header length, value length */
00153         octstr_append_from_hex((*msg)->sms.msgdata, "0106");
00154     
00155         octstr_append_from_hex(hdr, "1f2db6"); /* Content type + other type + sec param */
00156         wsp_pack_short_integer(hdr, 0x11);
00157         if (octstr_case_compare(sec, octstr_imm("netwpin")) == 0)
00158             wsp_pack_short_integer(hdr, 0x0);       
00159         else if (octstr_case_compare(sec, octstr_imm("userpin")) == 0)
00160             wsp_pack_short_integer(hdr, 0x01);          
00161         else if (octstr_case_compare(sec, octstr_imm("usernetwpin")) == 0)
00162             wsp_pack_short_integer(hdr, 0x02);          
00163         else if (octstr_case_compare(sec, octstr_imm("userpinmac")) == 0)
00164             wsp_pack_short_integer(hdr, 0x03); /* XXXX Although not quite supported now.*/          
00165         else {
00166             warning(0, "OMA ProvCont: Unknown SEC pin type '%s'.", octstr_get_cstr(sec));
00167             wsp_pack_short_integer(hdr, 0x01);          
00168         }
00169         wsp_pack_short_integer(hdr, 0x12); /* MAC */
00170 
00171 #ifdef HAVE_LIBSSL
00172         p = HMAC(EVP_sha1(), octstr_get_cstr(pin), octstr_len(pin), 
00173                  (unsigned char *)octstr_get_cstr(ota_binary), octstr_len(ota_binary), 
00174                  macbuf, &mac_len);
00175 #else
00176         mac_len = 0;
00177         p = "";
00178         warning(0, "OMA ProvCont: No SSL Support, '%s' not supported!", octstr_get_cstr(mime_type));
00179 #endif
00180         mac = octstr_create_from_data((char *)p, mac_len);
00181         octstr_binary_to_hex(mac, 1);
00182     
00183         octstr_append(hdr, mac);
00184         octstr_append_from_hex(hdr, "00");
00185     
00186         octstr_append_uintvar((*msg)->sms.msgdata, octstr_len(hdr));
00187         octstr_append((*msg)->sms.msgdata, hdr);
00188     
00189         octstr_destroy(hdr);
00190         octstr_destroy(mac);
00191         
00192     } else {
00193         warning(0, "Unknown MIME type in OTA request, type '%s' is unsupported.", 
00194                 octstr_get_cstr(mime_type));
00195         return 0;
00196     }
00197 
00198     return 1;
00199 }

Here is the call graph for this function:

void ota_pack_udh Msg **  msg,
Octstr doc_type
[static]
 

Definition at line 99 of file ota_prov.c.

References octstr_append_from_hex(), octstr_case_compare(), octstr_create, and octstr_imm().

Referenced by ota_pack_message().

00100 {
00101     (*msg)->sms.udhdata = octstr_create("");
00102     if (octstr_case_compare(doc_type, octstr_imm("oma-settings")) == 0) 
00103         octstr_append_from_hex((*msg)->sms.udhdata, "0605040B840B84");    
00104     else if (octstr_case_compare(doc_type, octstr_imm("syncsettings")) == 0) {
00105         octstr_append_from_hex((*msg)->sms.udhdata, "060504C34CC002");
00106     } else 
00107         octstr_append_from_hex((*msg)->sms.udhdata, "060504C34FC002");    
00108  }

Here is the call graph for this function:

Msg* ota_tokenize_bookmarks CfgGroup grp,
Octstr from,
Octstr receiver
 

Definition at line 540 of file ota_prov.c.

References cfg_get, msg_create, name, octstr_append(), octstr_append_char(), octstr_append_from_hex(), octstr_create, octstr_destroy(), octstr_duplicate, octstr_format_append(), octstr_imm(), sms, WBXML_TOK_END, WBXML_TOK_END_STR_I, WBXML_TOK_NAME_NAME, WBXML_TOK_NAME_URL, WBXML_TOK_STR_I, WBXML_TOK_TYPE_BOOKMARK, and WBXML_TOK_VALUE.

Referenced by smsbox_req_sendota().

00541 {
00542     Octstr *url, *name;
00543     Msg *msg;
00544     
00545     url = NULL;
00546     name = NULL;
00547 
00548     url = cfg_get(grp, octstr_imm("url"));
00549     name = cfg_get(grp, octstr_imm("name"));
00550     
00551     msg = msg_create(sms);
00552 
00553     /*
00554      * Append the User Data Header (UDH) including the lenght (UDHL)
00555      * WDP layer (start WDP headers)
00556      */
00557     
00558     msg->sms.sms_type = mt_push;
00559     msg->sms.udhdata = octstr_create("");
00560 
00561     octstr_append_from_hex(msg->sms.udhdata, "060504C34FC002");
00562     /* WDP layer (end WDP headers) */
00563 
00564     /*
00565      * WSP layer (start WSP headers)
00566      */
00567     
00568     msg->sms.msgdata = octstr_create("");
00569     /* PUSH ID, PDU type, header length, value length */
00570     octstr_append_from_hex(msg->sms.msgdata, "01062D1F2B");
00571     /* MIME-type: application/x-wap-prov.browser-bookmarks */
00572     octstr_format_append(msg->sms.msgdata, "%s", 
00573                          "application/x-wap-prov.browser-bookmarks");
00574     octstr_append_from_hex(msg->sms.msgdata, "00");
00575     /* charset UTF-8 */
00576     octstr_append_from_hex(msg->sms.msgdata, "81EA");
00577     /* WSP layer (end WSP headers) */
00578 
00579     /*
00580      * WSP layer (start WSP data field)
00581      */
00582 
00583     /* WBXML version 1.1 */
00584     octstr_append_from_hex(msg->sms.msgdata, "0101");
00585     /* charset UTF-8 */
00586     octstr_append_from_hex(msg->sms.msgdata, "6A00");
00587 
00588     /* CHARACTERISTIC_LIST */
00589     octstr_append_from_hex(msg->sms.msgdata, "45");
00590     /* CHARACTERISTIC with content and attributes */
00591     octstr_append_from_hex(msg->sms.msgdata, "C6");
00592     /* TYPE=BOOKMARK */
00593     octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_BOOKMARK);
00594     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00595 
00596     /* name */
00597     if (name != NULL) {
00598         /* PARM with attributes */
00599         octstr_append_from_hex(msg->sms.msgdata, "87");
00600         /* NAME=PROXY, VALUE, inline string */
00601         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_NAME);
00602         octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00603         octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00604         octstr_append(msg->sms.msgdata, octstr_duplicate(name));
00605         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00606         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00607     }
00608     /* URL */
00609     if (url != NULL) {
00610         /* PARM with attributes */
00611         octstr_append_from_hex(msg->sms.msgdata, "87");
00612         /* NAME=PROXY, VALUE, inline string */
00613         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_URL);
00614         octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00615         octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00616         octstr_append(msg->sms.msgdata, octstr_duplicate(url));
00617         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00618         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00619     }
00620 
00621     /* end of CHARACTERISTIC */
00622     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00623     /* end of CHARACTERISTIC-LIST */
00624     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00625     /* WSP layer (end WSP data field) */
00626 
00627     msg->sms.sender = from;
00628     msg->sms.receiver = octstr_duplicate(receiver);
00629     msg->sms.coding = DC_8BIT;
00630     
00631     msg->sms.time = time(NULL);
00632                               
00633     octstr_destroy(name);
00634     octstr_destroy(url);
00635 
00636     return msg;
00637 }

Here is the call graph for this function:

Msg* ota_tokenize_settings CfgGroup grp,
Octstr from,
Octstr receiver
 

Definition at line 259 of file ota_prov.c.

References cfg_get, msg_create, octstr_append(), octstr_append_char(), octstr_append_from_hex(), octstr_compare(), octstr_create, octstr_destroy(), octstr_duplicate, octstr_format_append(), octstr_get_cstr, octstr_imm(), sms, username, WBXML_TOK_END, WBXML_TOK_END_STR_I, WBXML_TOK_NAME_BEARER, WBXML_TOK_NAME_CSD_CALLSPEED, WBXML_TOK_NAME_CSD_CALLTYPE, WBXML_TOK_NAME_CSD_DIALSTRING, WBXML_TOK_NAME_NAME, WBXML_TOK_NAME_PORT, WBXML_TOK_NAME_PPP_AUTHNAME, WBXML_TOK_NAME_PPP_AUTHSECRET, WBXML_TOK_NAME_PPP_AUTHTYPE, WBXML_TOK_NAME_PROXY, WBXML_TOK_STR_I, WBXML_TOK_TYPE_ADDRESS, WBXML_TOK_TYPE_NAME, WBXML_TOK_TYPE_URL, WBXML_TOK_VALUE, and WBXML_TOK_VALUE_PORT_9203.

Referenced by smsbox_req_sendota().

00260 {
00261     Octstr *url, *desc, *ipaddr, *phonenum, *username, *passwd;
00262     int speed, bearer, calltype, connection, security, authent;
00263     Msg *msg;
00264     Octstr *p;
00265     
00266     url = NULL;
00267     desc = NULL;
00268     ipaddr = NULL;
00269     phonenum = NULL;
00270     username = NULL;
00271     passwd = NULL;
00272     bearer = -1;
00273     calltype =  WBXML_TOK_VALUE_CONN_ISDN;
00274     connection = WBXML_TOK_VALUE_PORT_9201;
00275     security = 0;
00276     authent = WBXML_TOK_VALUE_AUTH_PAP;
00277 
00278     url = cfg_get(grp, octstr_imm("location"));
00279     desc = cfg_get(grp, octstr_imm("service"));
00280     ipaddr = cfg_get(grp, octstr_imm("ipaddress"));
00281     phonenum = cfg_get(grp, octstr_imm("phonenumber"));
00282     p = cfg_get(grp, octstr_imm("bearer"));
00283     if (p != NULL) {
00284         if (strcasecmp(octstr_get_cstr(p), "data") == 0)
00285             bearer = WBXML_TOK_VALUE_GSM_CSD;
00286         else
00287             bearer = -1;
00288         octstr_destroy(p);
00289     }
00290     p = cfg_get(grp, octstr_imm("calltype"));
00291     if (p != NULL) {
00292         if (strcasecmp(octstr_get_cstr(p), "analog") == 0)
00293             calltype = WBXML_TOK_VALUE_CONN_ANALOGUE;
00294         else
00295             calltype =  WBXML_TOK_VALUE_CONN_ISDN;
00296         octstr_destroy(p);
00297     }
00298     
00299     speed = WBXML_TOK_VALUE_SPEED_9600;
00300     p = cfg_get(grp, octstr_imm("speed"));
00301     if (p != NULL) {
00302         if (octstr_compare(p, octstr_imm("14400")) == 0)
00303             speed = WBXML_TOK_VALUE_SPEED_14400;
00304         octstr_destroy(p);
00305     }
00306 
00307     /* connection mode: UDP (port 9200) or TCP (port 9201)*/
00308     p = cfg_get(grp, octstr_imm("connection"));
00309     if (p != NULL) {
00310         if (strcasecmp(octstr_get_cstr(p), "temp") == 0)
00311             connection = WBXML_TOK_VALUE_PORT_9200;
00312         else
00313             connection = WBXML_TOK_VALUE_PORT_9201;
00314         octstr_destroy(p);
00315     }
00316 
00317     /* dial in security: CHAP or PAP */
00318     p = cfg_get(grp, octstr_imm("pppsecurity"));
00319     if (p != NULL) {
00320         if (strcasecmp(octstr_get_cstr(p), "on") == 0)
00321             authent = WBXML_TOK_VALUE_AUTH_CHAP;
00322         else
00323             authent = WBXML_TOK_VALUE_AUTH_PAP;
00324         octstr_destroy(p);
00325     }
00326     
00327     /* WTLS: for UDP (port 9202) or TCP (port 9203) */
00328     p = cfg_get(grp, octstr_imm("authentication"));
00329     if (p != NULL) {
00330         if (strcasecmp(octstr_get_cstr(p), "secure") == 0)
00331             security = 1;
00332         else
00333             security = WBXML_TOK_VALUE_PORT_9201;
00334         octstr_destroy(p);
00335     }
00336     if (security == 1)
00337         connection = (connection == WBXML_TOK_VALUE_PORT_9201)? 
00338             WBXML_TOK_VALUE_PORT_9203 : WBXML_TOK_VALUE_PORT_9202;
00339     
00340     username = cfg_get(grp, octstr_imm("login"));
00341     passwd = cfg_get(grp, octstr_imm("secret"));
00342     
00343     msg = msg_create(sms);
00344 
00345     /*
00346      * Append the User Data Header (UDH) including the lenght (UDHL)
00347      * WDP layer (start WDP headers)
00348      */
00349     
00350     msg->sms.sms_type = mt_push;
00351     msg->sms.udhdata = octstr_create("");
00352 
00353     /* 
00354      * Within OTA spec this is "0B0504C34FC0020003040201", but it works
00355      * with the following too?!
00356      */
00357     octstr_append_from_hex(msg->sms.udhdata, "060504C34FC002");
00358     /* WDP layer (end WDP headers) */         
00359 
00360     /*
00361      * WSP layer (start WSP headers)
00362      */
00363     
00364     msg->sms.msgdata = octstr_create("");
00365     /* PUSH ID, PDU type, header length, value length */
00366     octstr_append_from_hex(msg->sms.msgdata, "01062C1F2A");
00367     /* MIME-type: application/x-wap-prov.browser-settings */
00368     octstr_format_append(msg->sms.msgdata, "%s", 
00369                          "application/x-wap-prov.browser-settings");
00370     octstr_append_from_hex(msg->sms.msgdata, "00");
00371     /* charset UTF-8 */
00372     octstr_append_from_hex(msg->sms.msgdata, "81EA");
00373     /* WSP layer (end WSP headers) */
00374 
00375     /*
00376      * WSP layer (start WSP data field)
00377      */
00378 
00379     /* WBXML version 1.1 */
00380     octstr_append_from_hex(msg->sms.msgdata, "0101");
00381     /* charset UTF-8 */
00382     octstr_append_from_hex(msg->sms.msgdata, "6A00");
00383 
00384     /* CHARACTERISTIC_LIST */
00385     octstr_append_from_hex(msg->sms.msgdata, "45");
00386     /* CHARACTERISTIC with content and attributes */
00387     octstr_append_from_hex(msg->sms.msgdata, "C6");
00388     /* TYPE=ADDRESS */
00389     octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_ADDRESS);
00390     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00391 
00392     /* bearer type */
00393     if (bearer != -1) {
00394         /* PARM with attributes */
00395         octstr_append_from_hex(msg->sms.msgdata, "87");
00396         /* NAME=BEARER, VALUE=GSM_CSD */
00397         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_BEARER);
00398         octstr_append_char(msg->sms.msgdata, bearer);
00399         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00400     }
00401     /* IP address */
00402     if (ipaddr != NULL) {
00403         /* PARM with attributes */
00404         octstr_append_from_hex(msg->sms.msgdata, "87");
00405         /* NAME=PROXY, VALUE, inline string */
00406         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PROXY);
00407         octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00408         octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00409         octstr_append(msg->sms.msgdata, octstr_duplicate(ipaddr));
00410         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00411         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00412     }
00413     /* connection type */
00414     if (connection != -1) {
00415         /* PARM with attributes */
00416         octstr_append_from_hex(msg->sms.msgdata, "87");
00417         /* NAME=PORT, VALUE */
00418         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PORT);
00419         octstr_append_char(msg->sms.msgdata, connection);
00420         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00421     }
00422     /* phone number */
00423     if (phonenum != NULL) {
00424         /* PARM with attributes */
00425         octstr_append_from_hex(msg->sms.msgdata, "87");
00426         /* NAME=CSD_DIALSTRING, VALUE, inline string */
00427         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_CSD_DIALSTRING);
00428         octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00429         octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00430         octstr_append(msg->sms.msgdata, octstr_duplicate(phonenum));
00431         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00432         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00433     }
00434     /* authentication */
00435     /* PARM with attributes */
00436     octstr_append_from_hex(msg->sms.msgdata, "87");
00437      /* NAME=PPP_AUTHTYPE, VALUE */
00438     octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PPP_AUTHTYPE);
00439     octstr_append_char(msg->sms.msgdata, authent);
00440     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00441     /* user name */
00442     if (username != NULL) {
00443         /* PARM with attributes */
00444         octstr_append_from_hex(msg->sms.msgdata, "87");
00445         /* NAME=PPP_AUTHNAME, VALUE, inline string */
00446         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PPP_AUTHNAME);
00447         octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00448         octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00449         octstr_append(msg->sms.msgdata, octstr_duplicate(username));
00450         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00451         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00452     }
00453     /* password */
00454     if (passwd != NULL) {
00455         /* PARM with attributes */
00456         octstr_append_from_hex(msg->sms.msgdata, "87");
00457         /* NAME=PPP_AUTHSECRET, VALUE, inline string */
00458         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_PPP_AUTHSECRET);
00459         octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00460         octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00461         octstr_append(msg->sms.msgdata, octstr_duplicate(passwd));
00462         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00463         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00464     }
00465     /* data call type */
00466     if (calltype != -1) {
00467         /* PARM with attributes */
00468         octstr_append_from_hex(msg->sms.msgdata, "87");
00469         /* NAME=CSD_CALLTYPE, VALUE */
00470         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_CSD_CALLTYPE);
00471         octstr_append_char(msg->sms.msgdata, calltype);
00472         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00473     }
00474     /* speed */
00475     /* PARM with attributes */
00476     octstr_append_from_hex(msg->sms.msgdata, "87");
00477     /* NAME=CSD_CALLSPEED, VALUE */
00478     octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_CSD_CALLSPEED);
00479     octstr_append_char(msg->sms.msgdata, speed);
00480     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00481 
00482     /* end CHARACTERISTIC TYPE=ADDRESS */
00483     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00484 
00485     /* homepage */
00486     if (url != NULL) {
00487         /* CHARACTERISTIC with attributes */
00488         octstr_append_from_hex(msg->sms.msgdata, "86");
00489         /* TYPE=URL */
00490         octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_URL);
00491         octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00492         octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00493         octstr_append(msg->sms.msgdata, url);
00494         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00495         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00496     }
00497 
00498     /* CHARACTERISTIC with content and attributes */
00499     octstr_append_from_hex(msg->sms.msgdata, "C6");
00500     /* TYPE=NAME */
00501     octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_NAME);
00502     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00503 
00504     /* service description */
00505     if (desc != NULL) {
00506         /* PARAM with attributes */
00507         octstr_append_from_hex(msg->sms.msgdata, "87");
00508         /* NAME=NAME, VALUE, inline */
00509         octstr_append_char(msg->sms.msgdata, WBXML_TOK_NAME_NAME);
00510         octstr_append_char(msg->sms.msgdata, WBXML_TOK_VALUE);
00511         octstr_append_char(msg->sms.msgdata, WBXML_TOK_STR_I);
00512         octstr_append(msg->sms.msgdata, desc);
00513         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END_STR_I);
00514         octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00515     }
00516 
00517     /* end of CHARACTERISTIC */
00518     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00519     /* end of CHARACTERISTIC-LIST */
00520     octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);
00521     /* WSP layer (end WSP data field) */
00522 
00523     msg->sms.sender = from;
00524     msg->sms.receiver = octstr_duplicate(receiver);
00525     msg->sms.coding = DC_8BIT;
00526     
00527     msg->sms.time = time(NULL);
00528                               
00529     octstr_destroy(url);
00530     octstr_destroy(desc);
00531     octstr_destroy(ipaddr);
00532     octstr_destroy(phonenum);
00533     octstr_destroy(username);
00534     octstr_destroy(passwd);
00535 
00536     return msg;
00537 }

Here is the call graph for this function:

See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.