mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
6.3 KiB
258 lines
6.3 KiB
/*
|
|
* Copyright (C) 2008 Voice System SRL
|
|
*
|
|
* This file is part of Kamailio, a free SIP server.
|
|
*
|
|
* Kamailio is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version
|
|
*
|
|
* Kamailio is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
|
|
/*!
|
|
* \file
|
|
* \brief Profile handling
|
|
* \ingroup dialog
|
|
* Module: \ref dialog
|
|
*/
|
|
|
|
|
|
#ifndef _DIALOG_DLG_PROFILE_H_
|
|
#define _DIALOG_DLG_PROFILE_H_
|
|
|
|
#include <time.h>
|
|
|
|
#include "../../parser/msg_parser.h"
|
|
#include "../../lib/srutils/srjson.h"
|
|
#include "../../lib/srutils/sruid.h"
|
|
#include "../../locking.h"
|
|
#include "../../str.h"
|
|
#include "../../modules/tm/h_table.h"
|
|
|
|
|
|
|
|
/*!
|
|
* \file
|
|
* \brief Profile related functions for the dialog module
|
|
* \ingroup dialog
|
|
* Module: \ref dialog
|
|
*/
|
|
|
|
|
|
/*! dialog profile hash list */
|
|
typedef struct dlg_profile_hash {
|
|
str value; /*!< hash value */
|
|
struct dlg_cell *dlg; /*!< dialog cell */
|
|
char puid[SRUID_SIZE];
|
|
int puid_len;
|
|
time_t expires;
|
|
int flags;
|
|
struct dlg_profile_link *linker;
|
|
struct dlg_profile_hash *next;
|
|
struct dlg_profile_hash *prev;
|
|
unsigned int hash; /*!< position in the hash table */
|
|
} dlg_profile_hash_t;
|
|
|
|
|
|
/*! list with links to dialog profiles */
|
|
typedef struct dlg_profile_link {
|
|
struct dlg_profile_hash hash_linker;
|
|
struct dlg_profile_link *next;
|
|
struct dlg_profile_table *profile;
|
|
} dlg_profile_link_t;
|
|
|
|
|
|
/*! dialog profile entry */
|
|
typedef struct dlg_profile_entry {
|
|
struct dlg_profile_hash *first;
|
|
unsigned int content; /*!< content of the entry */
|
|
} dlg_profile_entry_t;
|
|
|
|
#define FLAG_PROFILE_REMOTE 1
|
|
|
|
/*! dialog profile table */
|
|
typedef struct dlg_profile_table {
|
|
str name; /*!< name of the dialog profile */
|
|
unsigned int size; /*!< size of the dialog profile */
|
|
unsigned int has_value; /*!< 0 for profiles without value, otherwise it has a value */
|
|
int flags; /*!< flags related to the profile */
|
|
gen_lock_t lock; /*! lock for concurrent access */
|
|
struct dlg_profile_entry *entries;
|
|
struct dlg_profile_table *next;
|
|
} dlg_profile_table_t;
|
|
|
|
|
|
/*!
|
|
* \brief Add profile definitions to the global list
|
|
* \see new_dlg_profile
|
|
* \param profiles profile name
|
|
* \param has_value set to 0 for a profile without value, otherwise it has a value
|
|
* \return 0 on success, -1 on failure
|
|
*/
|
|
int add_profile_definitions( char* profiles, unsigned int has_value);
|
|
|
|
|
|
/*!
|
|
* \brief Destroy the global dialog profile list
|
|
*/
|
|
void destroy_dlg_profiles(void);
|
|
|
|
|
|
/*!
|
|
* \brief Search a dialog profile in the global list
|
|
* \note Linear search, this won't have the best performance for huge profile lists
|
|
* \param name searched dialog profile
|
|
* \return pointer to the profile on success, NULL otherwise
|
|
*/
|
|
struct dlg_profile_table* search_dlg_profile(str *name);
|
|
|
|
|
|
/*!
|
|
* \brief Callback for cleanup of profile local vars
|
|
* \param msg SIP message
|
|
* \param flags unused
|
|
* \param param unused
|
|
* \return 1
|
|
*/
|
|
int cb_profile_reset( struct sip_msg *msg, unsigned int flags, void *param );
|
|
|
|
|
|
/*!
|
|
* \brief Cleanup a profile
|
|
* \param msg SIP message
|
|
* \param flags unused
|
|
* \param param unused
|
|
* \return 1
|
|
*/
|
|
int profile_cleanup(sip_msg_t *msg, unsigned int flags, void *param );
|
|
|
|
|
|
/*!
|
|
* \brief Destroy dialog linkers
|
|
* \param linker dialog linker
|
|
*/
|
|
void destroy_linkers(dlg_profile_link_t *linker);
|
|
|
|
|
|
/*!
|
|
* \brief Set the global variables to the current dialog
|
|
* \param msg SIP message
|
|
* \param dlg dialog cell
|
|
*/
|
|
void set_current_dialog(sip_msg_t *msg, struct dlg_cell *dlg);
|
|
|
|
|
|
/*!
|
|
* \brief Set the dialog profile
|
|
* \param msg SIP message
|
|
* \param value value
|
|
* \param profile dialog profile table
|
|
* \return 0 on success, -1 on failure
|
|
*/
|
|
int set_dlg_profile(sip_msg_t *msg, str *value,
|
|
dlg_profile_table_t *profile);
|
|
|
|
|
|
/*!
|
|
* \brief Unset a dialog profile
|
|
* \param msg SIP message
|
|
* \param value value
|
|
* \param profile dialog profile table
|
|
* \return 1 on success, -1 on failure
|
|
*/
|
|
int unset_dlg_profile(sip_msg_t *msg, str *value,
|
|
dlg_profile_table_t *profile);
|
|
|
|
|
|
/*!
|
|
* \brief Check if a dialog belongs to a profile
|
|
* \param msg SIP message
|
|
* \param profile dialog profile table
|
|
* \param value value
|
|
* \return 1 on success, -1 on failure
|
|
*/
|
|
int is_dlg_in_profile(sip_msg_t *msg, dlg_profile_table_t *profile,
|
|
str *value);
|
|
|
|
|
|
/*!
|
|
* \brief Get the size of a profile
|
|
* \param profile evaluated profile
|
|
* \param value value
|
|
* \return the profile size
|
|
*/
|
|
unsigned int get_profile_size(dlg_profile_table_t *profile, str *value);
|
|
|
|
|
|
/*!
|
|
* \brief Output a profile via MI interface
|
|
* \param cmd_tree MI command tree
|
|
* \param param MI parameter
|
|
* \return MI root output on success, NULL on failure
|
|
*/
|
|
struct mi_root * mi_get_profile(struct mi_root *cmd_tree, void *param );
|
|
|
|
|
|
/*!
|
|
* \brief List the profiles via MI interface
|
|
* \param cmd_tree MI command tree
|
|
* \param param unused
|
|
* \return MI root output on success, NULL on failure
|
|
*/
|
|
struct mi_root * mi_profile_list(struct mi_root *cmd_tree, void *param );
|
|
|
|
/*!
|
|
* \brief return true if the messages belongs to a tracked dialog
|
|
*/
|
|
int is_known_dlg(sip_msg_t *msg);
|
|
|
|
/*!
|
|
* \brief Adjust timeout in all dialogs within a profile.
|
|
*/
|
|
|
|
int dlg_set_timeout_by_profile(struct dlg_profile_table *, str *, int);
|
|
|
|
/*!
|
|
* \brief Add dialog to a profile
|
|
* \param dlg dialog
|
|
* \param value value
|
|
* \param profile dialog profile table
|
|
* \return 0 on success, -1 on failure
|
|
*/
|
|
int dlg_add_profile(dlg_cell_t *dlg, str *value, struct dlg_profile_table *profile,
|
|
str *puid, time_t expires, int flags);
|
|
|
|
/*!
|
|
* \brief Serialize dialog profiles to json
|
|
*/
|
|
int dlg_profiles_to_json(dlg_cell_t *dlg, srjson_doc_t *jdoc);
|
|
|
|
/*!
|
|
* \brief Deserialize dialog profiles to json
|
|
*/
|
|
int dlg_json_to_profiles(dlg_cell_t *dlg, srjson_doc_t *jdoc);
|
|
|
|
/*!
|
|
* \brief Remove expired remove profiles
|
|
*/
|
|
void remove_expired_remote_profiles(time_t te);
|
|
|
|
/*!
|
|
*
|
|
*/
|
|
int dlg_cmd_remote_profile(str *cmd, str *pname, str *value, str *puid,
|
|
time_t expires, int flags);
|
|
|
|
#endif
|