all: updated FSF address in GPL text
[sip-router] / modules / ims_registrar_scscf / registrar_notify.h
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2012 Smile Communications, jason.penton@smilecoms.com
5  * Copyright (C) 2012 Smile Communications, richard.good@smilecoms.com
6  * 
7  * The initial version of this code was written by Dragos Vingarzan
8  * (dragos(dot)vingarzan(at)fokus(dot)fraunhofer(dot)de and the
9  * Fruanhofer Institute. It was and still is maintained in a separate
10  * branch of the original SER. We are therefore migrating it to
11  * Kamailio/SR and look forward to maintaining it from here on out.
12  * 2011/2012 Smile Communications, Pty. Ltd.
13  * ported/maintained/improved by 
14  * Jason Penton (jason(dot)penton(at)smilecoms.com and
15  * Richard Good (richard(dot)good(at)smilecoms.com) as part of an 
16  * effort to add full IMS support to Kamailio/SR using a new and
17  * improved architecture
18  * 
19  * NB: Alot of this code was originally part of OpenIMSCore,
20  * FhG Fokus. 
21  * Copyright (C) 2004-2006 FhG Fokus
22  * Thanks for great work! This is an effort to 
23  * break apart the various CSCF functions into logically separate
24  * components. We hope this will drive wider use. We also feel
25  * that in this way the architecture is more complete and thereby easier
26  * to manage in the Kamailio/SR environment
27  *
28  * This file is part of Kamailio, a free SIP server.
29  *
30  * Kamailio is free software; you can redistribute it and/or modify
31  * it under the terms of the GNU General Public License as published by
32  * the Free Software Foundation; either version 2 of the License, or
33  * (at your option) any later version
34  *
35  * Kamailio is distributed in the hope that it will be useful,
36  * but WITHOUT ANY WARRANTY; without even the implied warranty of
37  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
38  * GNU General Public License for more details.
39  *
40  * You should have received a copy of the GNU General Public License 
41  * along with this program; if not, write to the Free Software 
42  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
43  * 
44  */
45
46 #ifndef S_CSCF_REGISTRAR_NOTIFY_H_
47 #define S_CSCF_REGISTRAR_NOTIFY_H_
48
49
50 #include "../ims_usrloc_scscf/usrloc.h"
51 #include "../../locking.h"
52
53
54 #define MSG_REG_SUBSCRIBE_OK "Subscription to REG saved"
55 #define MSG_REG_UNSUBSCRIBE_OK "Subscription to REG dropped"
56 #define MSG_REG_PUBLISH_OK "Publish to REG saved"
57
58
59
60 typedef struct _reg_notification {
61     
62     str subscription_state; /**< Subscription-state header value*/
63     str content_type; /**< content type                                 */
64     str content; /**< content                                           */
65     
66     str watcher_contact;
67     str watcher_uri;
68     str presentity_uri;
69     
70     
71     unsigned int local_cseq;
72     str call_id;
73     str from_tag;
74     str to_tag;
75     str record_route;
76     str sockinfo_str;
77     
78     struct _reg_notification *next; /**< next notification in the list  */
79     struct _reg_notification *prev; /**< previous notification in the list      */
80 } reg_notification;
81
82
83
84 /** Notification List Structure */
85 typedef struct {
86     gen_lock_t *lock; /**< lock for notifications ops           */
87     reg_notification *head; /**< first notification in the list */
88     reg_notification *tail; /**< last notification in the list  */
89 } reg_notification_list;
90
91 /** Events for subscriptions */
92 enum {
93     IMS_EVENT_NONE, /**< Generic, no event                                      */
94     IMS_EVENT_REG /**< Registration event                                       */
95 } IMS_Events;
96
97 /** Event types for "reg" to generated notifications after */
98 enum {
99     IMS_REGISTRAR_NONE, /**< no event - donothing                                                       */
100     IMS_REGISTRAR_SUBSCRIBE, /**< Initial SUBSCRIBE - just send all data - this should not be treated though */
101     IMS_REGISTRAR_UNSUBSCRIBE, /**< Final UnSUBSCRIBE - just send a NOTIFY which will probably fail */
102     IMS_REGISTRAR_SUBSCRIBE_EXPIRED, /**< The subscribe has expired                                             */
103
104     //richard we only use contact reg, refresh, expired and unreg
105     IMS_REGISTRAR_CONTACT_REGISTERED, /**< Registered with REGISTER                                             */
106     IMS_REGISTRAR_CONTACT_REFRESHED, /**< The expiration was refreshed                                  */
107     IMS_REGISTRAR_CONTACT_EXPIRED, /**< A contact has expired and will be removed               */
108     IMS_REGISTRAR_CONTACT_UNREGISTERED, /**< User unregistered with Expires 0                           */
109 } IMS_Registrar_events;
110
111
112 int can_subscribe_to_reg(struct sip_msg *msg, char *str1, char *str2);
113
114 int subscribe_to_reg(struct sip_msg *msg, char *str1, char *str2);
115
116 int can_publish_reg(struct sip_msg *msg, char *str1, char *str2);
117
118 int publish_reg(struct sip_msg *msg, char *str1, char *str2);
119
120 int subscribe_reply(struct sip_msg *msg, int code, char *text, int *expires, str *contact);
121
122 int event_reg(udomain_t* _d, impurecord_t* r_passed, ucontact_t* c_passed, int event_type, str *presentity_uri, str *watcher_contact);
123
124
125 str generate_reginfo_full(udomain_t* _t, str* impu_list, int new_subscription);
126
127 str get_reginfo_partial(impurecord_t *r, ucontact_t *c, int event_type);
128
129 void create_notifications(udomain_t* _t, impurecord_t* r_passed, ucontact_t* c_passed, str *presentity_uri, str *watcher_contact, str content, int event_type);
130
131 void notification_timer(unsigned int ticks, void* param);
132
133 void free_notification(reg_notification *n);
134
135 void send_notification(reg_notification * n);
136
137 void add_notification(reg_notification *n);
138 reg_notification* new_notification(str subscription_state,
139         str content_type, str content, int version, reg_subscriber* r);
140
141 dlg_t* build_dlg_t_from_notification(reg_notification* n);
142
143
144 int notify_init();
145 void notify_destroy();
146
147 int aor_to_contact(str* aor, str* contact);
148 int contact_port_ip_match(str *c1, str *c2);
149
150 #endif //S_CSCF_REGISTRAR_NOTIFY_H_