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

wap_events.c

Go to the documentation of this file.
00001 /* ==================================================================== 
00002  * The Kannel Software License, Version 1.0 
00003  * 
00004  * Copyright (c) 2001-2008 Kannel Group  
00005  * Copyright (c) 1998-2001 WapIT Ltd.   
00006  * All rights reserved. 
00007  * 
00008  * Redistribution and use in source and binary forms, with or without 
00009  * modification, are permitted provided that the following conditions 
00010  * are met: 
00011  * 
00012  * 1. Redistributions of source code must retain the above copyright 
00013  *    notice, this list of conditions and the following disclaimer. 
00014  * 
00015  * 2. Redistributions in binary form must reproduce the above copyright 
00016  *    notice, this list of conditions and the following disclaimer in 
00017  *    the documentation and/or other materials provided with the 
00018  *    distribution. 
00019  * 
00020  * 3. The end-user documentation included with the redistribution, 
00021  *    if any, must include the following acknowledgment: 
00022  *       "This product includes software developed by the 
00023  *        Kannel Group (http://www.kannel.org/)." 
00024  *    Alternately, this acknowledgment may appear in the software itself, 
00025  *    if and wherever such third-party acknowledgments normally appear. 
00026  * 
00027  * 4. The names "Kannel" and "Kannel Group" must not be used to 
00028  *    endorse or promote products derived from this software without 
00029  *    prior written permission. For written permission, please  
00030  *    contact org@kannel.org. 
00031  * 
00032  * 5. Products derived from this software may not be called "Kannel", 
00033  *    nor may "Kannel" appear in their name, without prior written 
00034  *    permission of the Kannel Group. 
00035  * 
00036  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 
00037  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
00038  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
00039  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS 
00040  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,  
00041  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  
00042  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR  
00043  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  
00044  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE  
00045  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  
00046  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
00047  * ==================================================================== 
00048  * 
00049  * This software consists of voluntary contributions made by many 
00050  * individuals on behalf of the Kannel Group.  For more information on  
00051  * the Kannel Group, please see <http://www.kannel.org/>. 
00052  * 
00053  * Portions of this software are based upon software originally written at  
00054  * WapIT Ltd., Helsinki, Finland for the Kannel project.  
00055  */ 
00056 
00057 /*
00058  * wap_events.c - functions for manipulating wapbox events
00059  *
00060  * Aarno Syvänen
00061  * Lars Wirzenius
00062  */
00063 
00064 
00065 #include "gwlib/gwlib.h"
00066 #include "wsp_caps.h"
00067 #include "wap_events.h"
00068 #include "wtls_pdu.h"
00069 
00070 WAPEvent *wap_event_create_real(WAPEventName type, const char *file, long line,
00071                                 const char *func) {
00072     WAPEvent *event;
00073     
00074     gw_assert(type >= 0);
00075     gw_assert(type < WAPEventNameCount);
00076 
00077     event = gw_malloc_trace(sizeof(WAPEvent), file, line, func);
00078     event->type = type;
00079 
00080     switch (event->type) {
00081     #define WAPEVENT(name, prettyname, fields) \
00082         case name: \
00083             { struct name *p = &event->u.name; fields } \
00084             break;
00085     #define OCTSTR(name) p->name = NULL;
00086     #define OPTIONAL_OCTSTR(name) p->name = NULL;
00087     #define INTEGER(name) p->name = 0;
00088     #define WTLSPDUS(name) p->name = NULL;
00089     #define HTTPHEADER(name) p->name = NULL;
00090     #define ADDRTUPLE(name) p->name = NULL;
00091     #define CAPABILITIES(name) p->name = NULL;
00092     #include "wap_events.def"
00093     default:
00094         panic(0, "Unknown WAP event type %d", event->type);
00095     }
00096     
00097     return event;
00098 }
00099 
00100 
00101 void wap_event_destroy(WAPEvent *event) {
00102     if (event == NULL)
00103         return;
00104 
00105     wap_event_assert(event);
00106 
00107     switch (event->type) {
00108     #define WAPEVENT(name, prettyname, fields) \
00109         case name: \
00110             { struct name *p = &event->u.name; fields; } \
00111             break;
00112     #define OCTSTR(name) octstr_destroy(p->name);
00113     #define OPTIONAL_OCTSTR(name) octstr_destroy(p->name);
00114     #define INTEGER(name) p->name = 0;
00115     #define WTLSPDUS(name) debug("wap.events",0,"You need to create wtls_pdulist_destroy!");
00116     #define HTTPHEADER(name) http_destroy_headers(p->name);
00117     #define ADDRTUPLE(name) wap_addr_tuple_destroy(p->name);
00118     #define CAPABILITIES(name) wsp_cap_destroy_list(p->name);
00119     #include "wap_events.def"
00120     default:
00121         panic(0, "Unknown WAPEvent type %d", (int) event->type);
00122     }
00123     gw_free(event);
00124 }
00125 
00126 
00127 void wap_event_destroy_item(void *event) {
00128     wap_event_destroy(event);
00129 }
00130 
00131 
00132 WAPEvent *wap_event_duplicate(WAPEvent *event) {
00133     WAPEvent *new;
00134     
00135     if (event == NULL)
00136         return NULL;
00137 
00138     wap_event_assert(event);
00139 
00140     new = gw_malloc(sizeof(WAPEvent));
00141     new->type = event->type;
00142 
00143     switch (event->type) {
00144     #define WAPEVENT(name, prettyname, fields) \
00145         case name: \
00146             { struct name *p = &new->u.name; \
00147               struct name *q = &event->u.name; \
00148               fields } \
00149             break;
00150     #define OCTSTR(name) p->name = octstr_duplicate(q->name);
00151     #define OPTIONAL_OCTSTR(name) p->name = octstr_duplicate(q->name);
00152     #define INTEGER(name) p->name = q->name;
00153     #define WTLSPDUS(name) debug("wap.events",0,"You need to implement wtls_pdulist_duplicate!");
00154     #define HTTPHEADER(name) p->name = http_header_duplicate(q->name);
00155     #define ADDRTUPLE(name) p->name = wap_addr_tuple_duplicate(q->name);
00156     #define CAPABILITIES(name) p->name = wsp_cap_duplicate_list(q->name);
00157     #include "wap_events.def"
00158     default:
00159         panic(0, "Unknown WAP event type %d", event->type);
00160     }
00161     
00162     return new;
00163 }
00164 
00165 
00166 const char *wap_event_name(WAPEventName type) {
00167     switch (type) {
00168     #define WAPEVENT(name, prettyname, fields) \
00169         case name: return prettyname;
00170     #include "wap_events.def"
00171     default:
00172         panic(0, "Unknown WAPEvent type %d", (int) type);
00173         return "unknown WAPEventName";
00174     }
00175 }
00176 
00177 
00178 void wap_event_dump(WAPEvent *event) {
00179     debug("wap.event", 0, "Dumping WAPEvent %p", (void *) event);
00180     if (event != NULL) {
00181         debug("wap.event", 0, "  type = %s", 
00182             wap_event_name(event->type));
00183         switch (event->type) {
00184         #define WAPEVENT(name, prettyname, fields) \
00185             case name: \
00186             { struct name *p = &event->u.name; fields; break; }
00187         #define OCTSTR(name) \
00188             debug("wap.event", 0, "%s =", #name); \
00189             octstr_dump(p->name, 1);
00190         #define OPTIONAL_OCTSTR(name) \
00191             if (p->name == NULL) \
00192                 debug("wap.event", 0, "%s = NULL", #name); \
00193             else { \
00194                 debug("wap.event", 0, "%s =", #name); \
00195                 octstr_dump(p->name, 1); \
00196             }
00197         #define INTEGER(name) \
00198             debug("wap.event", 0, "  %s = %ld", #name, p->name);
00199         #define WTLSPDUS(name) \
00200             debug("wap.event",0,"You need to implement wtls_payloadlist_dump!");
00201         #define HTTPHEADER(name) \
00202             if (p->name == NULL) \
00203                 debug("wap.event", 0, "%s = NULL", #name); \
00204             else \
00205                 http_header_dump(p->name);
00206         #define ADDRTUPLE(name)     wap_addr_tuple_dump(p->name);
00207         #define CAPABILITIES(name)  wsp_cap_dump_list(p->name);
00208         #include "wap_events.def"
00209         default:
00210             debug("wap.event", 0, "Unknown type");
00211         }
00212     }
00213     debug("wap.event", 0, "WAPEvent dump ends.");
00214 }
00215 
00216 
00217 void wap_event_assert(WAPEvent *event) {
00218     gw_assert(event != NULL),
00219     gw_assert(event->type >= 0);
00220     gw_assert(event->type < WAPEventNameCount);
00221 
00222     switch (event->type) {
00223 #define WAPEVENT(name, prettyname, fields) \
00224     case name: \
00225     { struct name *p = &event->u.name; fields; p = NULL; break; }
00226 #define OCTSTR(name) \
00227     gw_assert(p->name != NULL); \
00228     /* This is a trick to make the Octstr module run its assertions */ \
00229     gw_assert(octstr_len(p->name) >= 0);
00230 #define OPTIONAL_OCTSTR(name) \
00231     gw_assert(p->name == NULL || octstr_len(p->name) >= 0);
00232 #define INTEGER(name)
00233 #define WTLSPDUS(name)
00234 #define HTTPHEADER(name)
00235 #define ADDRTUPLE(name) \
00236     gw_assert(p->name != NULL);
00237 #define CAPABILITIES(name)
00238 #include "wap_events.def"
00239     default:
00240         debug("wap.event", 0, "Unknown type");
00241     }
00242 }
See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.