wtp_pack.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:4k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*                          
  2.  * wtp_pack.c - WTP message packing module implementation
  3.  *
  4.  * By Aarno Syv鋘en for WapIT Ltd.
  5.  */
  6. #include "gwlib/gwlib.h"
  7. #include "wtp_pack.h"
  8. #include "wtp_pdu.h"
  9. /*
  10.  * Readable names for octets
  11.  */
  12. enum {
  13.     first_byte,
  14.     second_byte,
  15.     third_byte,
  16.     fourth_byte
  17. };
  18. /*
  19.  * Types of header information added by the user (TPIs, or transportation 
  20.  * information items). 
  21.  */
  22. enum {
  23.     ERROR_DATA = 0x00,
  24.     INFO_DATA = 0x01,
  25.     OPTION = 0x02,
  26.     PACKET_SEQUENCE_NUMBER = 0x03
  27. };
  28. /*****************************************************************************
  29.  *
  30.  * Prototypes of internal functions
  31.  */
  32. /*
  33.  * WTP defines SendTID and RcvTID.  We should use SendTID in all PDUs
  34.  * we send.  The RcvTID is the one we got from the initial Invoke and
  35.  * is the one we expect on all future PDUs for this machine.  
  36.  * SendTID is always RcvTID xor 0x8000.
  37.  * 
  38.  * Note that when we are the Initiator, for example with WSP PUSH,
  39.  * we must still store the RcvTID in machine->tid, to be consistent
  40.  * with the current code.  So we'll choose the SendTID and then calculate
  41.  * the RcvTID.
  42.  */
  43. static unsigned short send_tid(unsigned short tid);
  44. /*****************************************************************************
  45.  *
  46.  * EXTERNAL FUNCTIONS:
  47.  *
  48.  */
  49. WAPEvent *wtp_pack_invoke(WTPInitMachine *machine, WAPEvent *event)
  50. {
  51.     WAPEvent *dgram = NULL;
  52.     WTP_PDU *pdu = NULL;
  53.     gw_assert(event->type == TR_Invoke_Req);
  54.     pdu = wtp_pdu_create(Invoke);
  55.     pdu->u.Invoke.con = 0;
  56.     pdu->u.Invoke.gtr = 1;
  57.     pdu->u.Invoke.ttr = 1;
  58.     pdu->u.Invoke.rid = 0;
  59.     pdu->u.Invoke.version = 0;
  60.     pdu->u.Invoke.tid = send_tid(machine->tid);
  61.     pdu->u.Invoke.tidnew = machine->tidnew;
  62.     pdu->u.Invoke.user_data =
  63.     octstr_duplicate(event->u.TR_Invoke_Req.user_data);
  64.     pdu->u.Invoke.class = event->u.TR_Invoke_Req.tcl;
  65.     pdu->u.Invoke.uack = event->u.TR_Invoke_Req.up_flag;
  66.     dgram = wap_event_create(T_DUnitdata_Req);
  67.     dgram->u.T_DUnitdata_Req.addr_tuple =
  68. wap_addr_tuple_duplicate(machine->addr_tuple);
  69.     dgram->u.T_DUnitdata_Req.user_data = wtp_pdu_pack(pdu);
  70.     wtp_pdu_destroy(pdu);
  71.     return dgram;
  72. }
  73.  
  74. WAPEvent *wtp_pack_result(WTPRespMachine *machine, WAPEvent *event)
  75. {
  76.     WAPEvent *dgram = NULL;
  77.     WTP_PDU *pdu = NULL;
  78.      
  79.     gw_assert(event->type == TR_Result_Req);
  80.     pdu = wtp_pdu_create(Result);
  81.     pdu->u.Result.con = 0;
  82.     pdu->u.Result.gtr = 1;
  83.     pdu->u.Result.ttr = 1;
  84.     pdu->u.Result.rid = 0;
  85.     pdu->u.Result.tid = send_tid(machine->tid);
  86.     pdu->u.Result.user_data = 
  87.       octstr_duplicate(event->u.TR_Result_Req.user_data);
  88.     dgram = wap_event_create(T_DUnitdata_Req);
  89.     dgram->u.T_DUnitdata_Req.addr_tuple =
  90. wap_addr_tuple_duplicate(machine->addr_tuple);
  91.     dgram->u.T_DUnitdata_Req.user_data = wtp_pdu_pack(pdu);
  92.     wtp_pdu_destroy(pdu);
  93.   
  94.     return dgram;
  95. }
  96. void wtp_pack_set_rid(WAPEvent *dgram, long rid)
  97. {
  98.     gw_assert(dgram != NULL);
  99.     gw_assert(dgram->type == T_DUnitdata_Req);
  100.     octstr_set_bits(dgram->u.T_DUnitdata_Req.user_data, 7, 1, rid);
  101. }
  102. WAPEvent *wtp_pack_abort(long abort_type, long abort_reason, long tid, 
  103.                          WAPAddrTuple *address) 
  104. {
  105.     WAPEvent *dgram;
  106.     WTP_PDU *pdu;
  107.     pdu = wtp_pdu_create(Abort);
  108.     pdu->u.Abort.con = 0;
  109.     pdu->u.Abort.abort_type = abort_type;
  110.     pdu->u.Abort.tid = send_tid(tid);
  111.     pdu->u.Abort.abort_reason = abort_reason;
  112.     dgram = wap_event_create(T_DUnitdata_Req);
  113.     dgram->u.T_DUnitdata_Req.addr_tuple = wap_addr_tuple_duplicate(address);
  114.     dgram->u.T_DUnitdata_Req.user_data = wtp_pdu_pack(pdu);
  115.     wtp_pdu_destroy(pdu);
  116.     return dgram;
  117. }
  118. WAPEvent *wtp_pack_ack(long ack_type, int rid_flag, long tid, 
  119.                        WAPAddrTuple *address)
  120. {
  121.     WAPEvent *dgram = NULL;
  122.     WTP_PDU *pdu;
  123.      
  124.     pdu = wtp_pdu_create(Ack);
  125.     pdu->u.Ack.con = 0;
  126.     pdu->u.Ack.tidverify = ack_type;
  127.     pdu->u.Ack.rid = rid_flag;
  128.     pdu->u.Ack.tid = send_tid(tid);
  129.     dgram = wap_event_create(T_DUnitdata_Req);
  130.     dgram->u.T_DUnitdata_Req.addr_tuple = wap_addr_tuple_duplicate(address);
  131.     dgram->u.T_DUnitdata_Req.user_data = wtp_pdu_pack(pdu);
  132.     wtp_pdu_destroy(pdu);
  133.     return dgram;
  134. }
  135. /****************************************************************************
  136.  *
  137.  * INTERNAL FUNCTIONS:
  138.  *
  139.  */
  140. static unsigned short send_tid(unsigned short tid)
  141. {
  142.        return tid ^ 0x8000;
  143. }
  144. /****************************************************************************/