ota_prov.c

来自「mms client」· C语言 代码 · 共 499 行 · 第 1/2 页

C
499
字号
/* * ota_prov.c: OTA settings and bookmarks provisioning routines * * This module contains routines for the SMS OTA (auto configuration) message  * creation and manipulation for the sendota HTTP interface. * * Official Nokia and Ericsson WAP OTA configuration settings coded  * by Stipe Tolj <tolj@wapme-systems.de>, Wapme Systems AG. *  * XML compiler by Aarno Syv鋘en <aarno@wiral.com>, Wiral Ltd. */#include <string.h>#include "gwlib/gwlib.h"#include "msg.h"#include "sms.h"#include "ota_prov.h"#include "ota_prov_attr.h"#include "ota_compiler.h"/*************************************************************************** * * Implementation of the internal function *//* * Append the User Data Header (UDH) including the lenght (UDHL). Only ports  * UDH here - SAR UDH is added when (or if) we split the message. This is our * *specific* WDP layer. */static void ota_pack_udh(Msg **msg){    (*msg)->sms.udhdata = octstr_create("");    octstr_append_from_hex((*msg)->sms.udhdata, "060504C34FC002");}/* * Our WSP headers: Push Id, PDU type, headers, charset. */static int ota_pack_push_headers(Msg **msg, Octstr *mime_type){        (*msg)->sms.msgdata = octstr_create("");    if (octstr_case_compare(mime_type, octstr_imm("settings")) == 0) {        /* PUSH ID, PDU type, header length, value length */        octstr_append_from_hex((*msg)->sms.msgdata, "01062C1F2A");        /* MIME type for settings */        octstr_format_append((*msg)->sms.msgdata, "%s",                              "application/x-wap-prov.browser-settings");        octstr_append_from_hex((*msg)->sms.msgdata, "00");    } else if (octstr_case_compare(mime_type, octstr_imm("bookmarks")) == 0) {        /* PUSH ID, PDU type, header length, value length */        octstr_append_from_hex((*msg)->sms.msgdata, "01062D1F2B");        /* MIME type for bookmarks */        octstr_format_append((*msg)->sms.msgdata, "%s",                              "application/x-wap-prov.browser-bookmarks");        octstr_append_from_hex((*msg)->sms.msgdata, "00");    } else {        warning(0, "Unknown MIME type in OTA request, type '%s' is unsupported.",                 octstr_get_cstr(mime_type));        return 0;    }    /* charset UTF-8 */    octstr_append_from_hex((*msg)->sms.msgdata, "81EA");    return 1;}/*************************************************************************** * * Implementation of the external function */int ota_pack_message(Msg **msg, Octstr *ota_doc, Octstr *doc_type,                      Octstr *from, Octstr *phone_number){    Octstr *ota_binary;    *msg = msg_create(sms);    (*msg)->sms.sms_type = mt_push;    ota_pack_udh(msg);    if (!ota_pack_push_headers(msg, doc_type))        goto herror;    if (ota_compile(ota_doc, octstr_imm("UTF-8"), &ota_binary) == -1)        goto cerror;    octstr_format_append((*msg)->sms.msgdata, "%S", ota_binary);    (*msg)->sms.sender = octstr_duplicate(from);    (*msg)->sms.receiver = octstr_duplicate(phone_number);    (*msg)->sms.coding = DC_8BIT;    (*msg)->sms.time = time(NULL);    octstr_dump((*msg)->sms.msgdata, 0);    info(0, "/cgi-bin/sendota: XML request for target <%s>", octstr_get_cstr(phone_number));    octstr_destroy(ota_binary);    octstr_destroy(ota_doc);    octstr_destroy(doc_type);    octstr_destroy(from);    return 0;herror:    octstr_destroy(ota_doc);    octstr_destroy(doc_type);    octstr_destroy(from);    return -2;cerror:    octstr_destroy(ota_doc);    octstr_destroy(doc_type);    octstr_destroy(from);    return -1;}Msg *ota_tokenize_settings(CfgGroup *grp, Octstr *from, Octstr *receiver){    Octstr *url, *desc, *ipaddr, *phonenum, *username, *passwd;    int speed, bearer, calltype, connection, security, authent;    Msg *msg;    Octstr *p;        url = NULL;    desc = NULL;    ipaddr = NULL;    phonenum = NULL;    username = NULL;    passwd = NULL;    bearer = -1;    calltype = -1;    connection = WBXML_TOK_VALUE_PORT_9201;    security = 0;    authent = WBXML_TOK_VALUE_AUTH_PAP;    url = cfg_get(grp, octstr_imm("location"));    desc = cfg_get(grp, octstr_imm("service"));    ipaddr = cfg_get(grp, octstr_imm("ipaddress"));    phonenum = cfg_get(grp, octstr_imm("phonenumber"));    p = cfg_get(grp, octstr_imm("bearer"));    if (p != NULL) {        if (strcasecmp(octstr_get_cstr(p), "data") == 0)            bearer = WBXML_TOK_VALUE_GSM_CSD;        else            bearer = -1;        octstr_destroy(p);    }    p = cfg_get(grp, octstr_imm("calltype"));    if (p != NULL) {        if (strcasecmp(octstr_get_cstr(p), "calltype") == 0)            calltype = WBXML_TOK_VALUE_CONN_ISDN;        else            calltype = -1;        octstr_destroy(p);    }	    speed = WBXML_TOK_VALUE_SPEED_9600;    p = cfg_get(grp, octstr_imm("speed"));    if (p != NULL) {        if (octstr_compare(p, octstr_imm("14400")) == 0)            speed = WBXML_TOK_VALUE_SPEED_14400;        octstr_destroy(p);    }    /* connection mode: UDP (port 9200) or TCP (port 9201)*/    p = cfg_get(grp, octstr_imm("connection"));    if (p != NULL) {        if (strcasecmp(octstr_get_cstr(p), "temp") == 0)            connection = WBXML_TOK_VALUE_PORT_9200;        else            connection = WBXML_TOK_VALUE_PORT_9201;        octstr_destroy(p);    }    /* dial in security: CHAP or PAP */    p = cfg_get(grp, octstr_imm("pppsecurity"));    if (p != NULL) {        if (strcasecmp(octstr_get_cstr(p), "on") == 0)            authent = WBXML_TOK_VALUE_AUTH_CHAP;        else            authent = WBXML_TOK_VALUE_AUTH_PAP;        octstr_destroy(p);    }        /* WTLS: for UDP (port 9202) or TCP (port 9203) */    p = cfg_get(grp, octstr_imm("authentication"));    if (p != NULL) {        if (strcasecmp(octstr_get_cstr(p), "secure") == 0)            security = 1;        else            security = WBXML_TOK_VALUE_PORT_9201;        octstr_destroy(p);    }    if (security == 1)        connection = (connection == WBXML_TOK_VALUE_PORT_9201)?             WBXML_TOK_VALUE_PORT_9203 : WBXML_TOK_VALUE_PORT_9202;        username = cfg_get(grp, octstr_imm("login"));    passwd = cfg_get(grp, octstr_imm("secret"));        msg = msg_create(sms);    /*     * Append the User Data Header (UDH) including the lenght (UDHL)     * WDP layer (start WDP headers)     */        msg->sms.sms_type = mt_push;    msg->sms.udhdata = octstr_create("");    /*      * Within OTA spec this is "0B0504C34FC0020003040201", but it works     * with the following too?!     */    octstr_append_from_hex(msg->sms.udhdata, "060504C34FC002");    /* WDP layer (end WDP headers) */             /*     * WSP layer (start WSP headers)     */        msg->sms.msgdata = octstr_create("");    /* PUSH ID, PDU type, header length, value length */    octstr_append_from_hex(msg->sms.msgdata, "01062C1F2A");    /* MIME-type: application/x-wap-prov.browser-settings */    octstr_format_append(msg->sms.msgdata, "%s",                          "application/x-wap-prov.browser-settings");    octstr_append_from_hex(msg->sms.msgdata, "00");    /* charset UTF-8 */    octstr_append_from_hex(msg->sms.msgdata, "81EA");    /* WSP layer (end WSP headers) */    /*     * WSP layer (start WSP data field)     */    /* WBXML version 1.1 */    octstr_append_from_hex(msg->sms.msgdata, "0101");    /* charset UTF-8 */    octstr_append_from_hex(msg->sms.msgdata, "6A00");    /* CHARACTERISTIC_LIST */    octstr_append_from_hex(msg->sms.msgdata, "45");    /* CHARACTERISTIC with content and attributes */    octstr_append_from_hex(msg->sms.msgdata, "C6");    /* TYPE=ADDRESS */    octstr_append_char(msg->sms.msgdata, WBXML_TOK_TYPE_ADDRESS);    octstr_append_char(msg->sms.msgdata, WBXML_TOK_END);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?