00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef __NOTIFIER_DOMAIN_H
00027 #define __NOTIFIER_DOMAIN_H
00028
00029 #include <cds/sstr.h>
00030 #include <cds/ptr_vector.h>
00031 #include <cds/sync.h>
00032
00033 #include <presence/qsa_params.h>
00034
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #endif
00038
00039 struct _qsa_subscription_t;
00040 typedef struct _qsa_subscription_t qsa_subscription_t;
00041 struct _notifier_package_t;
00042 typedef struct _notifier_package_t notifier_package_t;
00043 struct _notifier_t;
00044 typedef struct _notifier_t notifier_t;
00045 struct _notifier_domain_t;
00046 typedef struct _notifier_domain_t notifier_domain_t;
00047
00048
00049
00050
00051 typedef struct _qsa_subscription_data_t {
00052 msg_queue_t *dst;
00053 str_t record_id;
00054 str_t subscriber_id;
00055 qsa_subscription_params_t *first_param;
00056 void *subscriber_data;
00057 } qsa_subscription_data_t;
00058
00062 struct _qsa_subscription_t {
00063
00064 cds_mutex_t *mutex;
00065 notifier_package_t *package;
00066 int allow_notifications;
00067 qsa_subscription_data_t *data;
00068 struct _qsa_subscription_t *prev, *next;
00069 reference_counter_data_t ref;
00070 };
00071
00072
00073
00074 typedef int (*server_subscribe_func)(notifier_t *n, qsa_subscription_t *subscription);
00075
00076 typedef void (*server_unsubscribe_func)(notifier_t *n, qsa_subscription_t *subscription);
00077
00078 typedef struct _qsa_content_type_t {
00079 struct _qsa_content_type_t *next, *prev;
00080 str_t name;
00081 destroy_function_f destroy_func;
00082 char buf[1];
00083 } qsa_content_type_t;
00084
00086 struct _notifier_t {
00087 server_subscribe_func subscribe;
00088 server_unsubscribe_func unsubscribe;
00089 void *user_data;
00090 notifier_package_t *package;
00091 struct _notifier_t *prev, *next;
00092 };
00093
00094 struct _notifier_package_t {
00095 str_t name;
00096
00097 notifier_domain_t *domain;
00098 notifier_t *first_notifier, *last_notifier;
00099 qsa_subscription_t *first_subscription, *last_subscription;
00100 notifier_package_t *next, *prev;
00101 };
00102
00103 struct _notifier_domain_t {
00104 cds_mutex_t mutex;
00105 cds_mutex_t data_mutex;
00106 str_t name;
00107 notifier_package_t *first_package, *last_package;
00108 qsa_content_type_t *first_content_type, *last_content_type;
00109 reference_counter_data_t ref;
00110 reference_counter_group_t *rc_grp;
00111 };
00112
00113
00114
00116 notifier_domain_t *create_notifier_domain(reference_counter_group_t *g, const str_t *name);
00117
00121 void destroy_notifier_domain(notifier_domain_t *domain);
00122
00123 qsa_content_type_t *register_content_type(notifier_domain_t *d,
00124 const str_t *name,
00125 destroy_function_f destroy_func);
00126
00127 #define lock_notifier_domain(d) cds_mutex_lock(&(d->mutex))
00128 #define unlock_notifier_domain(d) cds_mutex_unlock(&(d->mutex))
00129
00130 #ifdef __cplusplus
00131 }
00132 #endif
00133
00134
00135 #endif