1 /*
2  * This file is part of the Sofia-SIP package
3  *
4  * Copyright (C) 2006 Nokia Corporation.
5  *
6  * Contact: Pekka Pessi <pekka.pessi@nokia.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation; either version 2.1 of
11  * the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  *
23  */
24 
25 #ifndef NUA_SERVER_H
26 /** Defined when <nua_server.h> has been included. */
27 #define NUA_SERVER_H
28 
29 /**@IFILE nua_server.h
30  * @brief Dialog and dialog usage handling
31  *
32  * @author Pekka Pessi <Pekka.Pessi@nokia.com>
33  * @author Kai Vehmanen <Kai.Vehmanen@nokia.com>
34  *
35  * @date Created: Wed Mar  8 11:38:18 EET 2006  ppessi
36  */
37 
38 #include <nua_types.h>
39 
40 #ifndef NTA_H
41 #include <sofia-sip/nta.h>
42 #endif
43 
44 typedef struct {
45   sip_method_t sm_method;
46   char const *sm_method_name;
47 
48   int sm_event;
49 
50   struct {
51     unsigned create_dialog:1, in_dialog:1, target_refresh:1, add_contact:1;
52     unsigned :0;
53   } sm_flags;
54 
55   /** Initialize server-side request. */
56   int (*sm_init)(nua_server_request_t *sr);
57 
58   /** Preprocess server-side request (after handle has been created). */
59   int (*sm_preprocess)(nua_server_request_t *sr);
60 
61   /** Update server-side request parameters */
62   int (*sm_params)(nua_server_request_t *sr, tagi_t const *tags);
63 
64   /** Respond to server-side request. */
65   int (*sm_respond)(nua_server_request_t *sr, tagi_t const *tags);
66 
67   /** Report server-side request to application. */
68   int (*sm_report)(nua_server_request_t *sr, tagi_t const *tags);
69 
70 } nua_server_methods_t;
71 
72 /* Server side transaction */
73 struct nua_server_request {
74   struct nua_server_request *sr_next, **sr_prev;
75 
76   nua_server_methods_t const *sr_methods;
77 
78   nua_owner_t *sr_owner;	/**< Backpointer to handle */
79   nua_dialog_usage_t *sr_usage;	/**< Backpointer to usage */
80 
81   nta_incoming_t *sr_irq;	/**< Server transaction object */
82 
83   struct {
84     msg_t *msg;			/**< Request message */
85     sip_t const *sip;		/**< Headers in request message */
86   } sr_request;
87 
88   struct {
89     msg_t *msg;			/**< Response message */
90     sip_t *sip;			/**< Headers in response message */
91   } sr_response;
92 
93   sip_method_t sr_method;	/**< Request method */
94 
95   int sr_application;		/**< Status by application */
96 
97   int sr_status;		/**< Status code */
98   char const *sr_phrase;	/**< Status phrase */
99 
100   unsigned sr_event:1;		/**< Reported to application */
101   unsigned sr_initial:1;	/**< Handle was created by this request */
102   unsigned sr_add_contact:1;	/**< Add Contact header to the response */
103   unsigned sr_target_refresh:1;	/**< Refresh target */
104   unsigned sr_terminating:1;	/**< Terminate usage after final response */
105   unsigned sr_gracefully:1;	/**< Terminate usage gracefully */
106 
107   unsigned sr_neutral:1;	/**< No effect on session or other usage */
108 
109   /* Flags used with 100rel */
110   unsigned sr_100rel:1, sr_pracked:1;
111 
112   /* Flags used with offer-answer */
113   unsigned sr_offer_recv:1;	/**< We have received an offer */
114   unsigned sr_answer_sent:2;	/**< We have answered (reliably, if >1) */
115 
116   unsigned sr_offer_sent:2;	/**< We have offered SDP (reliably, if >1) */
117   unsigned sr_answer_recv:1;	/**< We have received SDP answer */
118 
119   unsigned :0;
120 
121   char const *sr_sdp;		/**< SDP received from client */
122   size_t sr_sdp_len;		/**< SDP length */
123 
124   /**< Save 200 OK nua_respond() signal until PRACK has been received */
125   nua_saved_signal_t sr_signal[1];
126 };
127 
128 #define SR_STATUS(sr, status, phrase) \
129   ((sr)->sr_phrase = (phrase), (sr)->sr_status = (status))
130 
131 #define SR_STATUS1(sr, statusphrase)					\
132   sr_status(sr, statusphrase)
133 
134 #define SR_HAS_SAVED_SIGNAL(sr) ((sr)->sr_signal[0] != NULL)
135 
136 su_inline
sr_status(nua_server_request_t * sr,int status,char const * phrase)137 int sr_status(nua_server_request_t *sr, int status, char const *phrase)
138 {
139   return (void)(sr->sr_phrase = phrase), (sr->sr_status = status);
140 }
141 
142 extern nua_server_methods_t const
143   nua_extension_server_methods,
144   nua_invite_server_methods,	/**< INVITE */
145   nua_bye_server_methods,	/**< BYE */
146   nua_options_server_methods,	/**< OPTIONS */
147   nua_register_server_methods,	/**< REGISTER */
148   nua_info_server_methods,	/**< INFO */
149   nua_prack_server_methods,	/**< PRACK */
150   nua_update_server_methods,	/**< UPDATE */
151   nua_message_server_methods,	/**< MESSAGE */
152   nua_subscribe_server_methods, /**< SUBSCRIBE */
153   nua_notify_server_methods,	/**< NOTIFY */
154   nua_refer_server_methods,	/**< REFER */
155   nua_publish_server_methods;	/**< PUBLISH */
156 
157 /** Return true if we have not sent final response to request */
158 su_inline
nua_server_request_is_pending(nua_server_request_t const * sr)159 int nua_server_request_is_pending(nua_server_request_t const *sr)
160 {
161   return sr && sr->sr_response.msg;
162 }
163 
164 su_inline
nua_server_request_status(nua_server_request_t const * sr)165 int nua_server_request_status(nua_server_request_t const *sr)
166 {
167   return sr ? nta_incoming_status(sr->sr_irq) : 500;
168 }
169 
170 void nua_server_request_destroy(nua_server_request_t *sr);
171 
172 int nua_base_server_init(nua_server_request_t *sr);
173 
174 #define nua_base_server_init NULL
175 
176 int nua_base_server_preprocess(nua_server_request_t *sr);
177 
178 #define nua_base_server_preprocess NULL
179 
180 int nua_server_params(nua_server_request_t *sr, tagi_t const *tags);
181 
182 int nua_base_server_params(nua_server_request_t *sr, tagi_t const *tags);
183 
184 #define nua_base_server_params NULL
185 
186 int nua_server_trespond(nua_server_request_t *sr,
187 			tag_type_t tag, tag_value_t value, ...);
188 int nua_server_respond(nua_server_request_t *sr, tagi_t const *tags);
189 
190 int nua_base_server_trespond(nua_server_request_t *sr,
191 			     tag_type_t tag, tag_value_t value, ...);
192 int nua_base_server_respond(nua_server_request_t *sr,
193 			    tagi_t const *tags);
194 
195 int nua_server_report(nua_server_request_t *sr);
196 
197 int nua_base_server_treport(nua_server_request_t *sr,
198 			    tag_type_t tag, tag_value_t value, ...);
199 int nua_base_server_report(nua_server_request_t *sr, tagi_t const *tags);
200 
201 #endif /* NUA_SERVER_H */
202