1 /* 2 * presence module - presence server implementation 3 * 4 * Copyright (C) 2007 Voice Sistem S.R.L. 5 * 6 * This file is part of Kamailio, a free SIP server. 7 * 8 * Kamailio is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version 12 * 13 * Kamailio is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 * 22 */ 23 24 /*! \file 25 * \brief Kamailio presence module :: Hash tables 26 * \ingroup presence 27 */ 28 29 30 #ifndef PS_HASH_H 31 #define PS_HASH_H 32 33 #include <stdint.h> 34 35 #include "../../core/lock_ops.h" 36 37 struct presentity; 38 #define REMOTE_TYPE 1 << 1 39 #define LOCAL_TYPE 1 << 2 40 41 #define PKG_MEM_STR "pkg" 42 #define SHARE_MEM "share" 43 44 #define ERR_MEM(mem_type) \ 45 do { \ 46 LM_ERR("No more %s memory\n", mem_type); \ 47 goto error; \ 48 } while(0) 49 50 #define CONT_COPY(buf, dest, source) \ 51 do { \ 52 dest.s = (char *)buf + size; \ 53 memcpy(dest.s, source.s, source.len); \ 54 dest.len = source.len; \ 55 size += source.len; \ 56 } while(0) 57 58 #define PKG_MEM_TYPE (1 << 1) 59 #define SHM_MEM_TYPE (1 << 2) 60 61 extern int pres_delete_same_subs; 62 63 /* subscribe hash entry */ 64 struct subscription; 65 66 typedef struct subs_entry 67 { 68 struct subscription *entries; 69 gen_lock_t lock; 70 } subs_entry_t; 71 72 typedef subs_entry_t *shtable_t; 73 74 shtable_t new_shtable(int hash_size); 75 76 struct subscription *search_shtable(shtable_t htable, str callid, str to_tag, 77 str from_tag, unsigned int hash_code); 78 79 int insert_shtable( 80 shtable_t htable, unsigned int hash_code, struct subscription *subs); 81 82 int delete_shtable( 83 shtable_t htable, unsigned int hash_code, struct subscription *subs); 84 85 int update_shtable(shtable_t htable, unsigned int hash_code, 86 struct subscription *subs, int type); 87 88 struct subscription *mem_copy_subs(struct subscription *s, int mem_type); 89 90 void free_subs_list(struct subscription *s_array, int mem_type, int ic); 91 92 void destroy_shtable(shtable_t htable, int hash_size); 93 94 /* subs htable functions type definitions */ 95 typedef shtable_t (*new_shtable_t)(int hash_size); 96 97 typedef struct subscription *(*search_shtable_t)(shtable_t htable, str callid, 98 str to_tag, str from_tag, unsigned int hash_code); 99 100 typedef int (*insert_shtable_t)( 101 shtable_t htable, unsigned int hash_code, struct subscription *subs); 102 103 typedef int (*delete_shtable_t)( 104 shtable_t htable, unsigned int hash_code, struct subscription *subs); 105 106 typedef int (*update_shtable_t)(shtable_t htable, unsigned int hash_code, 107 struct subscription *subs, int type); 108 109 typedef void (*destroy_shtable_t)(shtable_t htable, int hash_size); 110 111 typedef struct subscription *(*mem_copy_subs_t)( 112 struct subscription *s, int mem_type); 113 114 115 /* presentity hash table */ 116 typedef struct pres_entry 117 { 118 str pres_uri; 119 int event; 120 int publ_count; 121 char *sphere; 122 struct pres_entry *next; 123 } pres_entry_t; 124 125 typedef struct pres_phtable 126 { 127 pres_entry_t *entries; 128 gen_lock_t lock; 129 } phtable_t; 130 131 phtable_t *new_phtable(void); 132 133 pres_entry_t *search_phtable(str *pres_uri, int event, unsigned int hash_code); 134 135 int insert_phtable(str *pres_uri, int event, char *sphere); 136 137 int update_phtable(struct presentity *presentity, str *pres_uri, str *body); 138 139 int delete_phtable(str *pres_uri, int event); 140 141 void destroy_phtable(void); 142 143 int delete_db_subs(str* to_tag, str* from_tag, str* callid); 144 145 typedef struct ps_presentity { 146 uint32_t bsize; 147 uint32_t hashid; 148 str user; 149 str domain; 150 str ruid; 151 str sender; 152 str event; 153 str etag; 154 int expires; 155 int received_time; 156 int priority; 157 str body; 158 struct ps_presentity *next; 159 struct ps_presentity *prev; 160 } ps_presentity_t; 161 162 typedef struct ps_pslot { 163 ps_presentity_t *plist; 164 gen_lock_t lock; 165 } ps_pslot_t; 166 167 typedef struct ps_ptable { 168 int ssize; 169 ps_pslot_t *slots; 170 } ps_ptable_t; 171 172 ps_presentity_t *ps_presentity_new(ps_presentity_t *pt, int mtype); 173 void ps_presentity_free(ps_presentity_t *pt, int mtype); 174 void ps_presentity_list_free(ps_presentity_t *pt, int mtype); 175 int ps_presentity_match(ps_presentity_t *pta, ps_presentity_t *ptb, int mmode); 176 int ps_ptable_init(int ssize); 177 void ps_ptable_destroy(void); 178 int ps_ptable_insert(ps_presentity_t *pt); 179 int ps_ptable_replace(ps_presentity_t *ptm, ps_presentity_t *pt); 180 int ps_ptable_update(ps_presentity_t *ptm, ps_presentity_t *pt); 181 int ps_ptable_remove(ps_presentity_t *pt); 182 ps_presentity_t *ps_ptable_get_list(str *user, str *domain); 183 ps_presentity_t *ps_ptable_get_item(str *user, str *domain, str *event, str *etag); 184 ps_presentity_t *ps_ptable_search(ps_presentity_t *ptm, int mmode, int rmode); 185 ps_presentity_t *ps_ptable_get_expired(int eval); 186 ps_ptable_t *ps_ptable_get(void); 187 188 #endif 189