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