00001 #ifndef __RL_SUBSCRIPTION_H
00002 #define __RL_SUBSCRIPTION_H
00003
00004 #include "../../modules/tm/dlg.h"
00005 #include "../../lock_ops.h"
00006 #include "subscription_manager.h"
00007 #include <xcap/resource_lists_parser.h>
00008 #include <cds/vector.h>
00009 #include <cds/ptr_vector.h>
00010 #include <cds/sstr.h>
00011
00012 #include <presence/subscriber.h>
00013 #include <presence/notifier.h>
00014 #include <xcap/resource_list.h>
00015
00016 #include "trace.h"
00017
00018
00019 typedef char db_id_t[48];
00020
00021 typedef enum {
00022 rls_auth_none,
00023 rls_auth_implicit,
00024 rls_auth_xcap
00025 } rls_authorization_type_t;
00026
00027 typedef struct {
00028 rls_authorization_type_t type;
00029 } rls_auth_params_t;
00030
00031 struct _virtual_subscription_t;
00032 struct _rl_subscription_t;
00033 typedef struct _rl_subscription_t rl_subscription_t;
00034
00035 typedef struct {
00036 str name;
00037 str lang;
00038 } vs_display_name_t;
00039
00040 typedef struct _virtual_subscription_t {
00041
00042 qsa_subscription_data_t local_subscription_pres_data;
00043
00044
00045 qsa_subscription_t *local_subscription_pres;
00046 rl_subscription_t *local_subscription_list;
00047
00048 vector_t display_names;
00049
00050 rl_subscription_t *subscription;
00051
00052 int changed;
00053
00055 str state_document;
00057 str content_type;
00059 subscription_status_t status;
00060
00061
00062 str uri;
00063
00064 struct _virtual_subscription_t *next;
00065 struct _virtual_subscription_t *prev;
00066
00067
00068 db_id_t dbid;
00069
00070 char uri_str[1];
00071 } virtual_subscription_t;
00072
00073 typedef enum {
00074 rls_internal_subscription,
00075 rls_external_subscription
00076 } rls_subscription_type_t;
00077
00078 typedef struct {
00079 str *package;
00080 str *record_id;
00081 str *subscriber_id;
00082
00083
00084 virtual_subscription_t *vs;
00085
00086 } internal_subscription_data_t;
00087
00089 struct _rl_subscription_t {
00090 rls_subscription_type_t type;
00091
00092
00093
00094 xcap_query_params_t xcap_params;
00095
00096 union {
00097
00098 subscription_data_t external;
00099
00100
00101
00102 internal_subscription_data_t internal;
00103 } u;
00104
00106 int doc_version;
00107
00110 int changed;
00111
00112
00113 ptr_vector_t vs;
00114
00115
00116 str from_uid;
00117
00118
00119 db_id_t dbid;
00120 };
00121
00122 str_t * rls_get_package(rl_subscription_t *s);
00123 str_t * rls_get_uri(rl_subscription_t *s);
00124 str_t * rls_get_subscriber(rl_subscription_t *subscription);
00125
00126
00127
00128 int rls_create_subscription(struct sip_msg *m,
00129 rl_subscription_t **dst,
00130 flat_list_t *flat,
00131 xcap_query_params_t *params);
00132 int rls_create_internal_subscription(virtual_subscription_t *vs,
00133 rl_subscription_t **dst,
00134 flat_list_t *flat,
00135 int nesting_level);
00136 int rls_refresh_subscription(struct sip_msg *m, rl_subscription_t *s);
00137 int rls_find_subscription(str *from_tag, str *to_tag, str *call_id, rl_subscription_t **dst);
00138 void rls_free(rl_subscription_t *s);
00139 void rls_remove(rl_subscription_t *s);
00140 int rls_generate_notify(rl_subscription_t *s, int full_info);
00141 int rls_prepare_subscription_response(rl_subscription_t *s, struct sip_msg *m);
00142
00143
00144
00145
00146
00147 int vs_init();
00148 int vs_destroy();
00149
00150 int vs_create(str *uri,
00151 virtual_subscription_t **dst,
00152 display_name_t *dnames,
00153 rl_subscription_t *subscription,
00154 int nesting_level);
00155 int vs_add_display_name(virtual_subscription_t *vs, const char *name, const char *lang);
00156 void vs_free(virtual_subscription_t *vs);
00157 int create_virtual_subscriptions(rl_subscription_t *ss,
00158 int nesting_level);
00159 int add_virtual_subscriptions(rl_subscription_t *ss,
00160 flat_list_t *flat,
00161 int nesting_level);
00162
00163
00164 int rls_db_add(rl_subscription_t *s);
00165 int rls_db_remove(rl_subscription_t *s);
00166 int rls_db_update(rl_subscription_t *s);
00167 int db_load_rls();
00168
00169
00170 void generate_db_id(db_id_t *id, void *data);
00171
00173 int rls_subscription_expires_in(rl_subscription_t *s);
00174
00175
00176 rl_subscription_t *rls_alloc_subscription(rls_subscription_type_t type);
00177
00178
00179 int xcap_query_rls_services(xcap_query_params_t *xcap_params,
00180 const str *uri, const str *package,
00181 flat_list_t **dst);
00182
00183
00184 void process_internal_notify(virtual_subscription_t *vs,
00185 str_t *new_state_document,
00186 str_t *new_content_type);
00187
00188 void process_rls_notification(virtual_subscription_t *vs, client_notify_info_t *info);
00189
00190 #endif