1 /* ==================================================================== 
     2  * The Kannel Software License, Version 1.0 
     4  * Copyright (c) 2001-2018 Kannel Group  
     5  * Copyright (c) 1998-2001 WapIT Ltd.   
     8  * Redistribution and use in source and binary forms, with or without 
     9  * modification, are permitted provided that the following conditions 
    12  * 1. Redistributions of source code must retain the above copyright 
    13  *    notice, this list of conditions and the following disclaimer. 
    15  * 2. Redistributions in binary form must reproduce the above copyright 
    16  *    notice, this list of conditions and the following disclaimer in 
    17  *    the documentation and/or other materials provided with the 
    20  * 3. The end-user documentation included with the redistribution, 
    21  *    if any, must include the following acknowledgment: 
    22  *       "This product includes software developed by the 
    23  *        Kannel Group (http://www.kannel.org/)." 
    24  *    Alternately, this acknowledgment may appear in the software itself, 
    25  *    if and wherever such third-party acknowledgments normally appear. 
    27  * 4. The names "Kannel" and "Kannel Group" must not be used to 
    28  *    endorse or promote products derived from this software without 
    29  *    prior written permission. For written permission, please  
    30  *    contact org@kannel.org. 
    32  * 5. Products derived from this software may not be called "Kannel", 
    33  *    nor may "Kannel" appear in their name, without prior written 
    34  *    permission of the Kannel Group. 
    36  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 
    37  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
    38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
    39  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS 
    40  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,  
    41  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  
    42  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR  
    43  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  
    44  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE  
    45  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  
    46  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
    47  * ==================================================================== 
    49  * This software consists of voluntary contributions made by many 
    50  * individuals on behalf of the Kannel Group.  For more information on  
    51  * the Kannel Group, please see <http://www.kannel.org/>. 
    53  * Portions of this software are based upon software originally written at  
    54  * WapIT Ltd., Helsinki, Finland for the Kannel project.  
    58  * wsp_push_client_states.def: Macros defining wsp push client state table 
    60  * See documentation for guidance how to use and update these.
    61  * 1 means an unconditional action, {} an ignored event.
    63  * By Aarno Syvänen for Wapit Ltd.
    66 PUSH_CLIENT_STATE_NAME(PUSH_CLIENT_NULL_STATE)
    67 PUSH_CLIENT_STATE_NAME(PUSH_CLIENT_RECEIVING)
    69 ROW(PUSH_CLIENT_NULL_STATE,
    71     e->u.TR_Invoke_Ind.tcl == 1 && pdu->type == ConfirmedPush,
    76      if (pdu->u.ConfirmedPush.headers_len > 0) 
    77     push_headers = wsp_headers_unpack(pdu->u.ConfirmedPush.headers, 0);
    81      http_remove_hop_headers(push_headers);
    82      http_header_pack(push_headers);
    83      gw_assert(push_headers);
    84      cpm->push_headers = http_header_duplicate(push_headers);
    85      push_body = octstr_duplicate(pdu->u.ConfirmedPush.data);
    87      http_destroy_headers(push_headers);
    89  * For debugging: just tell about the push OTA event, and destroy it here - 
    90  * handle_event does not do it.
    92      indicate_confirmedpush(cpm, push_body);
    93      octstr_destroy(push_body);
    95  * For debugging: create S_ConfirmedPush_Res by ourselves and send it to 
    98     response_confirmedpush(cpm);
   100     PUSH_CLIENT_RECEIVING)
   103 ROW(PUSH_CLIENT_RECEIVING,
   107      response_responder_invoke(cpm);
   109     PUSH_CLIENT_NULL_STATE)
   112 ROW(PUSH_CLIENT_RECEIVING,
   116      send_abort_to_responder(cpm, e->u.S_PushAbort_Req.reason);
   117      indicate_pushabort(cpm, e->u.S_PushAbort_Req.reason);
   119     PUSH_CLIENT_NULL_STATE)
   121 ROW(PUSH_CLIENT_RECEIVING,
   125      send_abort_to_responder(cpm, e->u.S_PushAbort_Req.reason);
   126      indicate_pushabort(cpm, WSP_ABORT_USERREQ);
   128     PUSH_CLIENT_NULL_STATE)
   130 ROW(PUSH_CLIENT_RECEIVING,
   132     e->u.TR_Abort_Ind.abort_code == WSP_ABORT_DISCONNECT,
   136      wsp_event = wap_event_create(Disconnect_Event);
   137      wsp_event->u.Disconnect_Event.session_handle = cpm->client_push_id;
   138      gwlist_append(push_client_queue, wsp_event);
   140     PUSH_CLIENT_NULL_STATE)
   142 ROW(PUSH_CLIENT_RECEIVING,
   144     e->u.TR_Abort_Ind.abort_code == WSP_ABORT_SUSPEND,
   148      wsp_event = wap_event_create(Suspend_Event);
   149      wsp_event->u.Suspend_Event.session_handle = cpm->client_push_id;
   150      gwlist_append(push_client_queue, wsp_event);
   152     PUSH_CLIENT_NULL_STATE)
   154 ROW(PUSH_CLIENT_RECEIVING,
   156     e->u.TR_Abort_Ind.abort_code != WSP_ABORT_DISCONNECT &&
   157     e->u.TR_Abort_Ind.abort_code != WSP_ABORT_SUSPEND,
   159      indicate_pushabort(cpm, e->u.S_PushAbort_Req.reason);
   161     PUSH_CLIENT_NULL_STATE)
   163 #undef PUSH_CLIENT_STATE_NAME