Update cfscket transport to report correct in/out bytes
This commit is contained in:
parent
40a8a15df6
commit
3d46d2f68c
|
@ -1,88 +1,88 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*/
|
||||
|
||||
#include "ActionConfig.h"
|
||||
|
||||
ActionConfig::ActionConfig()
|
||||
{
|
||||
m_pHandle = tsip_action_create(tsip_atype_config,
|
||||
TSIP_ACTION_SET_NULL());
|
||||
}
|
||||
|
||||
ActionConfig::~ActionConfig()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pHandle);
|
||||
}
|
||||
|
||||
bool ActionConfig::addHeader(const char* name, const char* value)
|
||||
{
|
||||
return (tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_HEADER(name, value),
|
||||
TSIP_ACTION_SET_NULL()) == 0);
|
||||
}
|
||||
|
||||
bool ActionConfig::addPayload(const void* payload, unsigned len)
|
||||
{
|
||||
return (tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_PAYLOAD(payload, len),
|
||||
TSIP_ACTION_SET_NULL()) == 0);
|
||||
}
|
||||
|
||||
bool ActionConfig::setActiveMedia(twrap_media_type_t type)
|
||||
{
|
||||
tmedia_type_t media_type = twrap_get_native_media_type(type);
|
||||
return (tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_MEDIA_TYPE(media_type),
|
||||
TSIP_ACTION_SET_NULL()) == 0);
|
||||
}
|
||||
|
||||
ActionConfig* ActionConfig::setResponseLine(short code, const char* phrase)
|
||||
{
|
||||
int32_t _code = code;
|
||||
tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_RESP_LINE(_code, phrase),
|
||||
TSIP_ACTION_SET_NULL());
|
||||
return this;
|
||||
}
|
||||
|
||||
ActionConfig* ActionConfig::setMediaString(twrap_media_type_t type, const char* key, const char* value)
|
||||
{
|
||||
tmedia_type_t media_type = twrap_get_native_media_type(type);
|
||||
tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_MEDIA(
|
||||
TMEDIA_SESSION_SET_STR(media_type, key, value),
|
||||
TMEDIA_SESSION_SET_NULL()),
|
||||
TSIP_ACTION_SET_NULL());
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
ActionConfig* ActionConfig::setMediaInt(twrap_media_type_t type, const char* key, int value)
|
||||
{
|
||||
tmedia_type_t media_type = twrap_get_native_media_type(type);
|
||||
tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_MEDIA(
|
||||
TMEDIA_SESSION_SET_INT32(media_type, key, value),
|
||||
TMEDIA_SESSION_SET_NULL()),
|
||||
TSIP_ACTION_SET_NULL());
|
||||
|
||||
return this;
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*/
|
||||
|
||||
#include "ActionConfig.h"
|
||||
|
||||
ActionConfig::ActionConfig()
|
||||
{
|
||||
m_pHandle = tsip_action_create(tsip_atype_config,
|
||||
TSIP_ACTION_SET_NULL());
|
||||
}
|
||||
|
||||
ActionConfig::~ActionConfig()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pHandle);
|
||||
}
|
||||
|
||||
bool ActionConfig::addHeader(const char* name, const char* value)
|
||||
{
|
||||
return (tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_HEADER(name, value),
|
||||
TSIP_ACTION_SET_NULL()) == 0);
|
||||
}
|
||||
|
||||
bool ActionConfig::addPayload(const void* payload, unsigned len)
|
||||
{
|
||||
return (tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_PAYLOAD(payload, len),
|
||||
TSIP_ACTION_SET_NULL()) == 0);
|
||||
}
|
||||
|
||||
bool ActionConfig::setActiveMedia(twrap_media_type_t type)
|
||||
{
|
||||
tmedia_type_t media_type = twrap_get_native_media_type(type);
|
||||
return (tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_MEDIA_TYPE(media_type),
|
||||
TSIP_ACTION_SET_NULL()) == 0);
|
||||
}
|
||||
|
||||
ActionConfig* ActionConfig::setResponseLine(short code, const char* phrase)
|
||||
{
|
||||
int32_t _code = code;
|
||||
tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_RESP_LINE(_code, phrase),
|
||||
TSIP_ACTION_SET_NULL());
|
||||
return this;
|
||||
}
|
||||
|
||||
ActionConfig* ActionConfig::setMediaString(twrap_media_type_t type, const char* key, const char* value)
|
||||
{
|
||||
tmedia_type_t media_type = twrap_get_native_media_type(type);
|
||||
tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_MEDIA(
|
||||
TMEDIA_SESSION_SET_STR(media_type, key, value),
|
||||
TMEDIA_SESSION_SET_NULL()),
|
||||
TSIP_ACTION_SET_NULL());
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
ActionConfig* ActionConfig::setMediaInt(twrap_media_type_t type, const char* key, int value)
|
||||
{
|
||||
tmedia_type_t media_type = twrap_get_native_media_type(type);
|
||||
tsip_action_set(m_pHandle,
|
||||
TSIP_ACTION_SET_MEDIA(
|
||||
TMEDIA_SESSION_SET_INT32(media_type, key, value),
|
||||
TMEDIA_SESSION_SET_NULL()),
|
||||
TSIP_ACTION_SET_NULL());
|
||||
|
||||
return this;
|
||||
}
|
|
@ -1,52 +1,52 @@
|
|||
/* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*/
|
||||
#ifndef TINYWRAP_ACTIONCONFIG_H
|
||||
#define TINYWRAP_ACTIONCONFIG_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h"
|
||||
#include "Common.h"
|
||||
|
||||
class TINYWRAP_API ActionConfig
|
||||
{
|
||||
public:
|
||||
ActionConfig();
|
||||
virtual ~ActionConfig();
|
||||
|
||||
bool addHeader(const char* name, const char* value);
|
||||
bool addPayload(const void* payload, unsigned len);
|
||||
bool setActiveMedia(twrap_media_type_t type);
|
||||
|
||||
ActionConfig* setResponseLine(short code, const char* phrase);
|
||||
ActionConfig* setMediaString(twrap_media_type_t type, const char* key, const char* value);
|
||||
ActionConfig* setMediaInt(twrap_media_type_t type, const char* key, int value);
|
||||
|
||||
private:
|
||||
tsip_action_handle_t* m_pHandle;
|
||||
|
||||
#if !defined(SWIG)
|
||||
public:
|
||||
const inline tsip_action_handle_t* getHandle()const {
|
||||
return m_pHandle;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#endif /* TINYWRAP_ACTIONCONFIG_H */
|
||||
/* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*/
|
||||
#ifndef TINYWRAP_ACTIONCONFIG_H
|
||||
#define TINYWRAP_ACTIONCONFIG_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h"
|
||||
#include "Common.h"
|
||||
|
||||
class TINYWRAP_API ActionConfig
|
||||
{
|
||||
public:
|
||||
ActionConfig();
|
||||
virtual ~ActionConfig();
|
||||
|
||||
bool addHeader(const char* name, const char* value);
|
||||
bool addPayload(const void* payload, unsigned len);
|
||||
bool setActiveMedia(twrap_media_type_t type);
|
||||
|
||||
ActionConfig* setResponseLine(short code, const char* phrase);
|
||||
ActionConfig* setMediaString(twrap_media_type_t type, const char* key, const char* value);
|
||||
ActionConfig* setMediaInt(twrap_media_type_t type, const char* key, int value);
|
||||
|
||||
private:
|
||||
tsip_action_handle_t* m_pHandle;
|
||||
|
||||
#if !defined(SWIG)
|
||||
public:
|
||||
const inline tsip_action_handle_t* getHandle()const {
|
||||
return m_pHandle;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#endif /* TINYWRAP_ACTIONCONFIG_H */
|
||||
|
|
|
@ -1,73 +1,73 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
/**@file AudioResampler.cxx
|
||||
* @brief Audio resampler
|
||||
*
|
||||
* @author Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*/
|
||||
#include "AudioResampler.h"
|
||||
|
||||
#include "tinymedia/tmedia_resampler.h"
|
||||
|
||||
#include "tsk_debug.h"
|
||||
|
||||
AudioResampler::AudioResampler(uint32_t nInFreq, uint32_t nOutFreq, uint32_t nFrameDuration, uint32_t nChannels, uint32_t nQuality):
|
||||
m_nOutFreq(nOutFreq),
|
||||
m_nInFreq(nInFreq),
|
||||
m_nFrameDuration(nFrameDuration),
|
||||
m_nChannels(nChannels),
|
||||
m_nQuality(nQuality)
|
||||
{
|
||||
if ((m_pWrappedResampler = tmedia_resampler_create())) {
|
||||
int ret;
|
||||
if ((ret = tmedia_resampler_open(m_pWrappedResampler, nInFreq, nOutFreq, nFrameDuration, nChannels, nChannels, m_nQuality, 16))) {
|
||||
TSK_DEBUG_ERROR("Failed to open audio resampler (%d)", ret);
|
||||
TSK_OBJECT_SAFE_FREE(m_pWrappedResampler);
|
||||
}
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("No audio resampler could be found. Did you forget to call tdav_init()?");
|
||||
}
|
||||
}
|
||||
|
||||
AudioResampler::~AudioResampler()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pWrappedResampler);
|
||||
}
|
||||
|
||||
uint32_t AudioResampler::process(const void* pInData, uint32_t nInSizeInBytes, void* pOutData, uint32_t nOutSizeInBytes)
|
||||
{
|
||||
if(!m_pWrappedResampler) {
|
||||
TSK_DEBUG_ERROR("Embedded resampler is invalid");
|
||||
return 0;
|
||||
}
|
||||
if(nInSizeInBytes < getInputRequiredSizeInShort()/2) {
|
||||
TSK_DEBUG_ERROR("Input buffer is too short");
|
||||
return 0;
|
||||
}
|
||||
if(nOutSizeInBytes < getOutputRequiredSizeInShort()/2) {
|
||||
TSK_DEBUG_ERROR("Output buffer is too short");
|
||||
return 0;
|
||||
}
|
||||
return 2*tmedia_resampler_process(m_pWrappedResampler, (uint16_t*)pInData, nInSizeInBytes/2, (uint16_t*)pOutData, nOutSizeInBytes/2);
|
||||
}
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
/**@file AudioResampler.cxx
|
||||
* @brief Audio resampler
|
||||
*
|
||||
* @author Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*/
|
||||
#include "AudioResampler.h"
|
||||
|
||||
#include "tinymedia/tmedia_resampler.h"
|
||||
|
||||
#include "tsk_debug.h"
|
||||
|
||||
AudioResampler::AudioResampler(uint32_t nInFreq, uint32_t nOutFreq, uint32_t nFrameDuration, uint32_t nChannels, uint32_t nQuality):
|
||||
m_nOutFreq(nOutFreq),
|
||||
m_nInFreq(nInFreq),
|
||||
m_nFrameDuration(nFrameDuration),
|
||||
m_nChannels(nChannels),
|
||||
m_nQuality(nQuality)
|
||||
{
|
||||
if ((m_pWrappedResampler = tmedia_resampler_create())) {
|
||||
int ret;
|
||||
if ((ret = tmedia_resampler_open(m_pWrappedResampler, nInFreq, nOutFreq, nFrameDuration, nChannels, nChannels, m_nQuality, 16))) {
|
||||
TSK_DEBUG_ERROR("Failed to open audio resampler (%d)", ret);
|
||||
TSK_OBJECT_SAFE_FREE(m_pWrappedResampler);
|
||||
}
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("No audio resampler could be found. Did you forget to call tdav_init()?");
|
||||
}
|
||||
}
|
||||
|
||||
AudioResampler::~AudioResampler()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pWrappedResampler);
|
||||
}
|
||||
|
||||
uint32_t AudioResampler::process(const void* pInData, uint32_t nInSizeInBytes, void* pOutData, uint32_t nOutSizeInBytes)
|
||||
{
|
||||
if(!m_pWrappedResampler) {
|
||||
TSK_DEBUG_ERROR("Embedded resampler is invalid");
|
||||
return 0;
|
||||
}
|
||||
if(nInSizeInBytes < getInputRequiredSizeInShort()/2) {
|
||||
TSK_DEBUG_ERROR("Input buffer is too short");
|
||||
return 0;
|
||||
}
|
||||
if(nOutSizeInBytes < getOutputRequiredSizeInShort()/2) {
|
||||
TSK_DEBUG_ERROR("Output buffer is too short");
|
||||
return 0;
|
||||
}
|
||||
return 2*tmedia_resampler_process(m_pWrappedResampler, (uint16_t*)pInData, nInSizeInBytes/2, (uint16_t*)pOutData, nOutSizeInBytes/2);
|
||||
}
|
||||
|
|
|
@ -1,62 +1,62 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
/**@file AudioResampler.h
|
||||
* @brief Audio resampler
|
||||
*
|
||||
* @author Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*/
|
||||
#ifndef TINYWRAP_AUDIO_RESAMPLER_H
|
||||
#define TINYWRAP_AUDIO_RESAMPLER_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
#include "tsk_common.h"
|
||||
|
||||
class AudioResampler
|
||||
{
|
||||
public:
|
||||
AudioResampler(uint32_t nInFreq, uint32_t nOutFreq, uint32_t nFrameDuration, uint32_t nChannels, uint32_t nQuality);
|
||||
~AudioResampler();
|
||||
|
||||
public:
|
||||
inline bool isValid() {
|
||||
return (m_pWrappedResampler != tsk_null);
|
||||
}
|
||||
inline uint32_t getOutputRequiredSizeInShort() {
|
||||
return (m_nOutFreq * m_nFrameDuration)/1000;
|
||||
}
|
||||
inline uint32_t getInputRequiredSizeInShort() {
|
||||
return (m_nInFreq * m_nFrameDuration)/1000;
|
||||
}
|
||||
uint32_t process(const void* pInData, uint32_t nInSizeInBytes, void* pOutData, uint32_t nOutSizeInBytes);
|
||||
|
||||
private:
|
||||
struct tmedia_resampler_s* m_pWrappedResampler;
|
||||
uint32_t m_nOutFreq;
|
||||
uint32_t m_nInFreq;
|
||||
uint32_t m_nFrameDuration;
|
||||
uint32_t m_nChannels;
|
||||
uint32_t m_nQuality;
|
||||
};
|
||||
|
||||
|
||||
#endif /* TINYWRAP_AUDIO_RESAMPLER_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
/**@file AudioResampler.h
|
||||
* @brief Audio resampler
|
||||
*
|
||||
* @author Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*/
|
||||
#ifndef TINYWRAP_AUDIO_RESAMPLER_H
|
||||
#define TINYWRAP_AUDIO_RESAMPLER_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
#include "tsk_common.h"
|
||||
|
||||
class AudioResampler
|
||||
{
|
||||
public:
|
||||
AudioResampler(uint32_t nInFreq, uint32_t nOutFreq, uint32_t nFrameDuration, uint32_t nChannels, uint32_t nQuality);
|
||||
~AudioResampler();
|
||||
|
||||
public:
|
||||
inline bool isValid() {
|
||||
return (m_pWrappedResampler != tsk_null);
|
||||
}
|
||||
inline uint32_t getOutputRequiredSizeInShort() {
|
||||
return (m_nOutFreq * m_nFrameDuration)/1000;
|
||||
}
|
||||
inline uint32_t getInputRequiredSizeInShort() {
|
||||
return (m_nInFreq * m_nFrameDuration)/1000;
|
||||
}
|
||||
uint32_t process(const void* pInData, uint32_t nInSizeInBytes, void* pOutData, uint32_t nOutSizeInBytes);
|
||||
|
||||
private:
|
||||
struct tmedia_resampler_s* m_pWrappedResampler;
|
||||
uint32_t m_nOutFreq;
|
||||
uint32_t m_nInFreq;
|
||||
uint32_t m_nFrameDuration;
|
||||
uint32_t m_nChannels;
|
||||
uint32_t m_nQuality;
|
||||
};
|
||||
|
||||
|
||||
#endif /* TINYWRAP_AUDIO_RESAMPLER_H */
|
||||
|
|
|
@ -1,95 +1,95 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_COMMON_H
|
||||
#define TINYWRAP_COMMON_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#if ANDROID
|
||||
# define dyn_cast static_cast
|
||||
# define __JNIENV JNIEnv
|
||||
#else
|
||||
# define dyn_cast dynamic_cast
|
||||
# define __JNIENV void
|
||||
#endif
|
||||
|
||||
typedef enum twrap_media_type_e {
|
||||
// because of Java don't use OR
|
||||
twrap_media_none = 0x00,
|
||||
|
||||
twrap_media_audio = 0x01, // (0x01 << 0)
|
||||
twrap_media_video = 0x02, // (0x01 << 1)
|
||||
twrap_media_msrp = 0x04, // (0x01 << 2)
|
||||
twrap_media_t140 = 0x08, // (0x01 << 3)
|
||||
twrap_media_bfcp = 0x10, // (0x01 << 4)
|
||||
twrap_media_bfcp_audio = 0x30, // (0x01 << 5) | twrap_media_bfcp;
|
||||
twrap_media_bfcp_video = 0x50, // (0x01 << 6) | twrap_media_bfcp;
|
||||
|
||||
twrap_media_audiovideo = 0x03, /* @deprecated */
|
||||
twrap_media_audio_video = twrap_media_audiovideo,
|
||||
}
|
||||
twrap_media_type_t;
|
||||
|
||||
#if !defined(SWIG)
|
||||
#include "tinymedia/tmedia_common.h"
|
||||
|
||||
struct media_type_bind_s {
|
||||
twrap_media_type_t twrap;
|
||||
tmedia_type_t tnative;
|
||||
};
|
||||
static const struct media_type_bind_s __media_type_binds[] = {
|
||||
{ twrap_media_msrp, tmedia_msrp },
|
||||
{ twrap_media_audio , tmedia_audio },
|
||||
{ twrap_media_video, tmedia_video },
|
||||
{ twrap_media_audio_video, (tmedia_type_t)(tmedia_audio | tmedia_video) },
|
||||
{ twrap_media_t140, tmedia_t140 },
|
||||
{ twrap_media_bfcp, tmedia_bfcp },
|
||||
{ twrap_media_bfcp_audio, tmedia_bfcp_audio },
|
||||
{ twrap_media_bfcp_video, tmedia_bfcp_video },
|
||||
};
|
||||
static const tsk_size_t __media_type_binds_count = sizeof(__media_type_binds)/sizeof(__media_type_binds[0]);
|
||||
static tmedia_type_t twrap_get_native_media_type(twrap_media_type_t type)
|
||||
{
|
||||
tsk_size_t u;
|
||||
tmedia_type_t t = tmedia_none;
|
||||
for (u = 0; u < __media_type_binds_count; ++u) {
|
||||
if ((__media_type_binds[u].twrap & type) == __media_type_binds[u].twrap) {
|
||||
t = (tmedia_type_t)(t | __media_type_binds[u].tnative);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
}
|
||||
static twrap_media_type_t twrap_get_wrapped_media_type(tmedia_type_t type)
|
||||
{
|
||||
twrap_media_type_t t = twrap_media_none;
|
||||
tsk_size_t u;
|
||||
for (u = 0; u < __media_type_binds_count; ++u) {
|
||||
if ((__media_type_binds[u].tnative & type) == __media_type_binds[u].tnative) {
|
||||
t = (twrap_media_type_t)(t | __media_type_binds[u].twrap);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* TINYWRAP_COMMON_H */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_COMMON_H
|
||||
#define TINYWRAP_COMMON_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#if ANDROID
|
||||
# define dyn_cast static_cast
|
||||
# define __JNIENV JNIEnv
|
||||
#else
|
||||
# define dyn_cast dynamic_cast
|
||||
# define __JNIENV void
|
||||
#endif
|
||||
|
||||
typedef enum twrap_media_type_e {
|
||||
// because of Java don't use OR
|
||||
twrap_media_none = 0x00,
|
||||
|
||||
twrap_media_audio = 0x01, // (0x01 << 0)
|
||||
twrap_media_video = 0x02, // (0x01 << 1)
|
||||
twrap_media_msrp = 0x04, // (0x01 << 2)
|
||||
twrap_media_t140 = 0x08, // (0x01 << 3)
|
||||
twrap_media_bfcp = 0x10, // (0x01 << 4)
|
||||
twrap_media_bfcp_audio = 0x30, // (0x01 << 5) | twrap_media_bfcp;
|
||||
twrap_media_bfcp_video = 0x50, // (0x01 << 6) | twrap_media_bfcp;
|
||||
|
||||
twrap_media_audiovideo = 0x03, /* @deprecated */
|
||||
twrap_media_audio_video = twrap_media_audiovideo,
|
||||
}
|
||||
twrap_media_type_t;
|
||||
|
||||
#if !defined(SWIG)
|
||||
#include "tinymedia/tmedia_common.h"
|
||||
|
||||
struct media_type_bind_s {
|
||||
twrap_media_type_t twrap;
|
||||
tmedia_type_t tnative;
|
||||
};
|
||||
static const struct media_type_bind_s __media_type_binds[] = {
|
||||
{ twrap_media_msrp, tmedia_msrp },
|
||||
{ twrap_media_audio , tmedia_audio },
|
||||
{ twrap_media_video, tmedia_video },
|
||||
{ twrap_media_audio_video, (tmedia_type_t)(tmedia_audio | tmedia_video) },
|
||||
{ twrap_media_t140, tmedia_t140 },
|
||||
{ twrap_media_bfcp, tmedia_bfcp },
|
||||
{ twrap_media_bfcp_audio, tmedia_bfcp_audio },
|
||||
{ twrap_media_bfcp_video, tmedia_bfcp_video },
|
||||
};
|
||||
static const tsk_size_t __media_type_binds_count = sizeof(__media_type_binds)/sizeof(__media_type_binds[0]);
|
||||
static tmedia_type_t twrap_get_native_media_type(twrap_media_type_t type)
|
||||
{
|
||||
tsk_size_t u;
|
||||
tmedia_type_t t = tmedia_none;
|
||||
for (u = 0; u < __media_type_binds_count; ++u) {
|
||||
if ((__media_type_binds[u].twrap & type) == __media_type_binds[u].twrap) {
|
||||
t = (tmedia_type_t)(t | __media_type_binds[u].tnative);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
}
|
||||
static twrap_media_type_t twrap_get_wrapped_media_type(tmedia_type_t type)
|
||||
{
|
||||
twrap_media_type_t t = twrap_media_none;
|
||||
tsk_size_t u;
|
||||
for (u = 0; u < __media_type_binds_count; ++u) {
|
||||
if ((__media_type_binds[u].tnative & type) == __media_type_binds[u].tnative) {
|
||||
t = (twrap_media_type_t)(t | __media_type_binds[u].twrap);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* TINYWRAP_COMMON_H */
|
||||
|
||||
|
|
|
@ -1,145 +1,145 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "DDebug.h"
|
||||
|
||||
#include "SipStack.h"
|
||||
|
||||
#include "Common.h"
|
||||
|
||||
#if ANDROID /* callbacks will fail with jni */
|
||||
# include <android/log.h>
|
||||
# define ANDROID_DEBUG_TAG "tinyWRAP"
|
||||
#endif
|
||||
|
||||
/* Very Important ==> never call functions which could raise debug callbacks into callback functions
|
||||
* Callbacks should not be used with Android (JNI).
|
||||
*/
|
||||
|
||||
enum cb_type {
|
||||
cb_info,
|
||||
cb_warn,
|
||||
cb_error,
|
||||
cb_fatal
|
||||
};
|
||||
|
||||
int debug_xxx_cb(const void* arg, const char* fmt, enum cb_type type, va_list *app)
|
||||
{
|
||||
int ret = -1;
|
||||
if(!arg) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const SipStack* stack = dyn_cast<const SipStack*>((const SipStack*)arg);
|
||||
|
||||
if(stack && stack->getDebugCallback()) {
|
||||
char* message = tsk_null;
|
||||
tsk_sprintf_2(&message, fmt, app);
|
||||
|
||||
switch(type) {
|
||||
case cb_info:
|
||||
ret=
|
||||
#if ANDROID
|
||||
__android_log_write(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, message);
|
||||
#else
|
||||
stack->getDebugCallback()-> OnDebugInfo(message);
|
||||
#endif
|
||||
break;
|
||||
case cb_warn:
|
||||
ret=
|
||||
#if ANDROID
|
||||
__android_log_write(ANDROID_LOG_WARN, ANDROID_DEBUG_TAG, message);
|
||||
#else
|
||||
stack->getDebugCallback()-> OnDebugWarn(message);
|
||||
#endif
|
||||
break;
|
||||
case cb_error:
|
||||
ret=
|
||||
#if ANDROID
|
||||
__android_log_write(ANDROID_LOG_ERROR, ANDROID_DEBUG_TAG, message);
|
||||
#else
|
||||
stack->getDebugCallback()-> OnDebugError(message);
|
||||
#endif
|
||||
break;
|
||||
case cb_fatal:
|
||||
ret=
|
||||
#if ANDROID
|
||||
__android_log_write(ANDROID_LOG_FATAL, ANDROID_DEBUG_TAG, message);
|
||||
#else
|
||||
stack->getDebugCallback()-> OnDebugFatal(message);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
TSK_FREE(message);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DDebugCallback::debug_info_cb(const void* arg, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = debug_xxx_cb(arg, fmt, cb_info, &ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DDebugCallback::debug_warn_cb(const void* arg, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = debug_xxx_cb(arg, fmt, cb_warn, &ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DDebugCallback::debug_error_cb(const void* arg, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = debug_xxx_cb(arg, fmt, cb_error, &ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DDebugCallback::debug_fatal_cb(const void* arg, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = debug_xxx_cb(arg, fmt, cb_fatal, &ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "DDebug.h"
|
||||
|
||||
#include "SipStack.h"
|
||||
|
||||
#include "Common.h"
|
||||
|
||||
#if ANDROID /* callbacks will fail with jni */
|
||||
# include <android/log.h>
|
||||
# define ANDROID_DEBUG_TAG "tinyWRAP"
|
||||
#endif
|
||||
|
||||
/* Very Important ==> never call functions which could raise debug callbacks into callback functions
|
||||
* Callbacks should not be used with Android (JNI).
|
||||
*/
|
||||
|
||||
enum cb_type {
|
||||
cb_info,
|
||||
cb_warn,
|
||||
cb_error,
|
||||
cb_fatal
|
||||
};
|
||||
|
||||
int debug_xxx_cb(const void* arg, const char* fmt, enum cb_type type, va_list *app)
|
||||
{
|
||||
int ret = -1;
|
||||
if(!arg) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const SipStack* stack = dyn_cast<const SipStack*>((const SipStack*)arg);
|
||||
|
||||
if(stack && stack->getDebugCallback()) {
|
||||
char* message = tsk_null;
|
||||
tsk_sprintf_2(&message, fmt, app);
|
||||
|
||||
switch(type) {
|
||||
case cb_info:
|
||||
ret=
|
||||
#if ANDROID
|
||||
__android_log_write(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, message);
|
||||
#else
|
||||
stack->getDebugCallback()-> OnDebugInfo(message);
|
||||
#endif
|
||||
break;
|
||||
case cb_warn:
|
||||
ret=
|
||||
#if ANDROID
|
||||
__android_log_write(ANDROID_LOG_WARN, ANDROID_DEBUG_TAG, message);
|
||||
#else
|
||||
stack->getDebugCallback()-> OnDebugWarn(message);
|
||||
#endif
|
||||
break;
|
||||
case cb_error:
|
||||
ret=
|
||||
#if ANDROID
|
||||
__android_log_write(ANDROID_LOG_ERROR, ANDROID_DEBUG_TAG, message);
|
||||
#else
|
||||
stack->getDebugCallback()-> OnDebugError(message);
|
||||
#endif
|
||||
break;
|
||||
case cb_fatal:
|
||||
ret=
|
||||
#if ANDROID
|
||||
__android_log_write(ANDROID_LOG_FATAL, ANDROID_DEBUG_TAG, message);
|
||||
#else
|
||||
stack->getDebugCallback()-> OnDebugFatal(message);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
TSK_FREE(message);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DDebugCallback::debug_info_cb(const void* arg, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = debug_xxx_cb(arg, fmt, cb_info, &ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DDebugCallback::debug_warn_cb(const void* arg, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = debug_xxx_cb(arg, fmt, cb_warn, &ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DDebugCallback::debug_error_cb(const void* arg, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = debug_xxx_cb(arg, fmt, cb_error, &ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int DDebugCallback::debug_fatal_cb(const void* arg, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = debug_xxx_cb(arg, fmt, cb_fatal, &ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,57 +1,57 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIP_DEBUG_H
|
||||
#define TINYWRAP_SIP_DEBUG_H
|
||||
|
||||
class DDebugCallback
|
||||
{
|
||||
public:
|
||||
DDebugCallback() { }
|
||||
virtual ~DDebugCallback() {}
|
||||
|
||||
|
||||
virtual int OnDebugInfo(const char* message) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnDebugWarn(const char* message) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnDebugError(const char* message) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnDebugFatal(const char* message) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if !defined(SWIG)
|
||||
public:
|
||||
static int debug_info_cb(const void* arg, const char* fmt, ...);
|
||||
static int debug_warn_cb(const void* arg, const char* fmt, ...);
|
||||
static int debug_error_cb(const void* arg, const char* fmt, ...);
|
||||
static int debug_fatal_cb(const void* arg, const char* fmt, ...);
|
||||
#endif
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIP_DEBUG_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIP_DEBUG_H
|
||||
#define TINYWRAP_SIP_DEBUG_H
|
||||
|
||||
class DDebugCallback
|
||||
{
|
||||
public:
|
||||
DDebugCallback() { }
|
||||
virtual ~DDebugCallback() {}
|
||||
|
||||
|
||||
virtual int OnDebugInfo(const char* message) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnDebugWarn(const char* message) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnDebugError(const char* message) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnDebugFatal(const char* message) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if !defined(SWIG)
|
||||
public:
|
||||
static int debug_info_cb(const void* arg, const char* fmt, ...);
|
||||
static int debug_warn_cb(const void* arg, const char* fmt, ...);
|
||||
static int debug_error_cb(const void* arg, const char* fmt, ...);
|
||||
static int debug_fatal_cb(const void* arg, const char* fmt, ...);
|
||||
#endif
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIP_DEBUG_H */
|
||||
|
|
|
@ -1,179 +1,179 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "MediaContent.h"
|
||||
|
||||
|
||||
|
||||
MediaContent::MediaContent(tmedia_content_t* pContent)
|
||||
: m_pData(tsk_null)
|
||||
{
|
||||
m_pContent = (tmedia_content_t*)tsk_object_ref(pContent);
|
||||
}
|
||||
|
||||
MediaContent::~MediaContent()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pContent);
|
||||
TSK_OBJECT_SAFE_FREE(m_pData);
|
||||
}
|
||||
|
||||
const char* MediaContent::getType()
|
||||
{
|
||||
if(m_pContent) {
|
||||
return m_pContent->type;
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
unsigned MediaContent::getDataLength()
|
||||
{
|
||||
if(!m_pContent) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!m_pData) {
|
||||
m_pData = tmedia_content_get_data(m_pContent);
|
||||
}
|
||||
|
||||
return (m_pData ? m_pData->size : 0);
|
||||
}
|
||||
|
||||
unsigned MediaContent::getData(void* pOutput, unsigned nMaxsize)
|
||||
{
|
||||
unsigned nRetsize = 0;
|
||||
|
||||
if(!m_pContent) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!m_pData) {
|
||||
m_pData = tmedia_content_get_data(m_pContent);
|
||||
}
|
||||
|
||||
if(pOutput && nMaxsize && m_pData) {
|
||||
nRetsize = (m_pData->size > nMaxsize) ? nMaxsize : m_pData->size;
|
||||
memcpy(pOutput, m_pData->data, nRetsize);
|
||||
}
|
||||
|
||||
return nRetsize;
|
||||
}
|
||||
|
||||
MediaContent* MediaContent::parse(const void* pData, unsigned nSize, const char* pType)
|
||||
{
|
||||
MediaContent* pMediaContent = tsk_null;
|
||||
|
||||
tmedia_content_t* pContent = tmedia_content_parse(pData, (tsk_size_t)nSize, pType);
|
||||
if(pContent) {
|
||||
if(TMEDIA_CONTENT_IS_CPIM(pContent)) {
|
||||
pMediaContent = new MediaContentCPIM(pContent);
|
||||
}
|
||||
else if(TMEDIA_CONTENT_IS_DUMMY(pContent)) {
|
||||
// Todo
|
||||
}
|
||||
TSK_OBJECT_SAFE_FREE(pContent);
|
||||
}
|
||||
|
||||
return pMediaContent;
|
||||
}
|
||||
|
||||
MediaContentCPIM* MediaContent::parse(const void* pData, unsigned nSize)
|
||||
{
|
||||
MediaContent* pMediaContent;
|
||||
if((pMediaContent = MediaContent::parse(pData, nSize, TMEDIA_CONTENT_CPIM_TYPE))) {
|
||||
return dyn_cast<MediaContentCPIM*>(pMediaContent);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
/* ============ message/CPIM ================= */
|
||||
|
||||
MediaContentCPIM::MediaContentCPIM(tmedia_content_t* pContent)
|
||||
: MediaContent(pContent)
|
||||
{
|
||||
}
|
||||
|
||||
MediaContentCPIM::~MediaContentCPIM()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned MediaContentCPIM::getPayloadLength()
|
||||
{
|
||||
if(!m_pContent || !TMEDIA_CONTENT_IS_CPIM(m_pContent)) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (TMEDIA_CONTENT_CPIM(m_pContent)->e ? TMEDIA_CONTENT_CPIM(m_pContent)->e->size : 0);
|
||||
}
|
||||
|
||||
unsigned MediaContentCPIM::getPayload(void* pOutput, unsigned nMaxsize)
|
||||
{
|
||||
unsigned nRetsize = 0;
|
||||
|
||||
if(!m_pContent || !TMEDIA_CONTENT_IS_CPIM(m_pContent)) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(pOutput && nMaxsize && TMEDIA_CONTENT_CPIM(m_pContent)->e) {
|
||||
nRetsize = (TMEDIA_CONTENT_CPIM(m_pContent)->e->size > nMaxsize) ? nMaxsize : TMEDIA_CONTENT_CPIM(m_pContent)->e->size;
|
||||
memcpy(pOutput, TMEDIA_CONTENT_CPIM(m_pContent)->e->data, nRetsize);
|
||||
}
|
||||
|
||||
return nRetsize;
|
||||
}
|
||||
|
||||
const void* MediaContentCPIM::getPayloadPtr()
|
||||
{
|
||||
if(!m_pContent || !TMEDIA_CONTENT_IS_CPIM(m_pContent)) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
return TMEDIA_CONTENT_CPIM(m_pContent)->e ? TMEDIA_CONTENT_CPIM(m_pContent)->e->data : tsk_null;
|
||||
}
|
||||
|
||||
const char* MediaContentCPIM::getHeaderValue(const char* name)
|
||||
{
|
||||
const tmedia_content_cpim_t* cpim;
|
||||
const tsk_list_item_t* item;
|
||||
|
||||
if(!m_pContent || !TMEDIA_CONTENT_IS_CPIM(m_pContent)) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
cpim = TMEDIA_CONTENT_CPIM(m_pContent);
|
||||
tsk_list_foreach(item, cpim->h_headers) {
|
||||
if(tsk_striequals(name, TMEDIA_CONTENT_HEADER(item->data)->name)) {
|
||||
return TMEDIA_CONTENT_HEADER(item->data)->value;
|
||||
}
|
||||
}
|
||||
tsk_list_foreach(item, cpim->m_headers) {
|
||||
if(tsk_striequals(name, TMEDIA_CONTENT_HEADER(item->data)->name)) {
|
||||
return TMEDIA_CONTENT_HEADER(item->data)->value;
|
||||
}
|
||||
}
|
||||
|
||||
return tsk_null;
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "MediaContent.h"
|
||||
|
||||
|
||||
|
||||
MediaContent::MediaContent(tmedia_content_t* pContent)
|
||||
: m_pData(tsk_null)
|
||||
{
|
||||
m_pContent = (tmedia_content_t*)tsk_object_ref(pContent);
|
||||
}
|
||||
|
||||
MediaContent::~MediaContent()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pContent);
|
||||
TSK_OBJECT_SAFE_FREE(m_pData);
|
||||
}
|
||||
|
||||
const char* MediaContent::getType()
|
||||
{
|
||||
if(m_pContent) {
|
||||
return m_pContent->type;
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
unsigned MediaContent::getDataLength()
|
||||
{
|
||||
if(!m_pContent) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!m_pData) {
|
||||
m_pData = tmedia_content_get_data(m_pContent);
|
||||
}
|
||||
|
||||
return (m_pData ? m_pData->size : 0);
|
||||
}
|
||||
|
||||
unsigned MediaContent::getData(void* pOutput, unsigned nMaxsize)
|
||||
{
|
||||
unsigned nRetsize = 0;
|
||||
|
||||
if(!m_pContent) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!m_pData) {
|
||||
m_pData = tmedia_content_get_data(m_pContent);
|
||||
}
|
||||
|
||||
if(pOutput && nMaxsize && m_pData) {
|
||||
nRetsize = (m_pData->size > nMaxsize) ? nMaxsize : m_pData->size;
|
||||
memcpy(pOutput, m_pData->data, nRetsize);
|
||||
}
|
||||
|
||||
return nRetsize;
|
||||
}
|
||||
|
||||
MediaContent* MediaContent::parse(const void* pData, unsigned nSize, const char* pType)
|
||||
{
|
||||
MediaContent* pMediaContent = tsk_null;
|
||||
|
||||
tmedia_content_t* pContent = tmedia_content_parse(pData, (tsk_size_t)nSize, pType);
|
||||
if(pContent) {
|
||||
if(TMEDIA_CONTENT_IS_CPIM(pContent)) {
|
||||
pMediaContent = new MediaContentCPIM(pContent);
|
||||
}
|
||||
else if(TMEDIA_CONTENT_IS_DUMMY(pContent)) {
|
||||
// Todo
|
||||
}
|
||||
TSK_OBJECT_SAFE_FREE(pContent);
|
||||
}
|
||||
|
||||
return pMediaContent;
|
||||
}
|
||||
|
||||
MediaContentCPIM* MediaContent::parse(const void* pData, unsigned nSize)
|
||||
{
|
||||
MediaContent* pMediaContent;
|
||||
if((pMediaContent = MediaContent::parse(pData, nSize, TMEDIA_CONTENT_CPIM_TYPE))) {
|
||||
return dyn_cast<MediaContentCPIM*>(pMediaContent);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
/* ============ message/CPIM ================= */
|
||||
|
||||
MediaContentCPIM::MediaContentCPIM(tmedia_content_t* pContent)
|
||||
: MediaContent(pContent)
|
||||
{
|
||||
}
|
||||
|
||||
MediaContentCPIM::~MediaContentCPIM()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned MediaContentCPIM::getPayloadLength()
|
||||
{
|
||||
if(!m_pContent || !TMEDIA_CONTENT_IS_CPIM(m_pContent)) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (TMEDIA_CONTENT_CPIM(m_pContent)->e ? TMEDIA_CONTENT_CPIM(m_pContent)->e->size : 0);
|
||||
}
|
||||
|
||||
unsigned MediaContentCPIM::getPayload(void* pOutput, unsigned nMaxsize)
|
||||
{
|
||||
unsigned nRetsize = 0;
|
||||
|
||||
if(!m_pContent || !TMEDIA_CONTENT_IS_CPIM(m_pContent)) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(pOutput && nMaxsize && TMEDIA_CONTENT_CPIM(m_pContent)->e) {
|
||||
nRetsize = (TMEDIA_CONTENT_CPIM(m_pContent)->e->size > nMaxsize) ? nMaxsize : TMEDIA_CONTENT_CPIM(m_pContent)->e->size;
|
||||
memcpy(pOutput, TMEDIA_CONTENT_CPIM(m_pContent)->e->data, nRetsize);
|
||||
}
|
||||
|
||||
return nRetsize;
|
||||
}
|
||||
|
||||
const void* MediaContentCPIM::getPayloadPtr()
|
||||
{
|
||||
if(!m_pContent || !TMEDIA_CONTENT_IS_CPIM(m_pContent)) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
return TMEDIA_CONTENT_CPIM(m_pContent)->e ? TMEDIA_CONTENT_CPIM(m_pContent)->e->data : tsk_null;
|
||||
}
|
||||
|
||||
const char* MediaContentCPIM::getHeaderValue(const char* name)
|
||||
{
|
||||
const tmedia_content_cpim_t* cpim;
|
||||
const tsk_list_item_t* item;
|
||||
|
||||
if(!m_pContent || !TMEDIA_CONTENT_IS_CPIM(m_pContent)) {
|
||||
TSK_DEBUG_ERROR("Invalid internal object");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
cpim = TMEDIA_CONTENT_CPIM(m_pContent);
|
||||
tsk_list_foreach(item, cpim->h_headers) {
|
||||
if(tsk_striequals(name, TMEDIA_CONTENT_HEADER(item->data)->name)) {
|
||||
return TMEDIA_CONTENT_HEADER(item->data)->value;
|
||||
}
|
||||
}
|
||||
tsk_list_foreach(item, cpim->m_headers) {
|
||||
if(tsk_striequals(name, TMEDIA_CONTENT_HEADER(item->data)->name)) {
|
||||
return TMEDIA_CONTENT_HEADER(item->data)->value;
|
||||
}
|
||||
}
|
||||
|
||||
return tsk_null;
|
||||
}
|
|
@ -1,76 +1,76 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_MEDIA_CONTENT_H
|
||||
#define TINYWRAP_MEDIA_CONTENT_H
|
||||
|
||||
#include "tinymedia.h"
|
||||
#include "Common.h"
|
||||
|
||||
class MediaContentCPIM;
|
||||
|
||||
class MediaContent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MediaContent(tmedia_content_t* content);
|
||||
#endif
|
||||
virtual ~MediaContent();
|
||||
|
||||
public:
|
||||
const char* getType();
|
||||
virtual unsigned getDataLength();
|
||||
virtual unsigned getData(void* pOutput, unsigned nMaxsize);
|
||||
|
||||
// SWIG %newobject()
|
||||
static MediaContent* parse(const void* pData, unsigned nSize, const char* pType);
|
||||
static MediaContentCPIM* parse(const void* pData, unsigned nSize);
|
||||
|
||||
virtual unsigned getPayloadLength() = 0;
|
||||
virtual unsigned getPayload(void* pOutput, unsigned nMaxsize) = 0;
|
||||
|
||||
protected:
|
||||
tmedia_content_t* m_pContent;
|
||||
|
||||
private:
|
||||
tsk_buffer_t* m_pData;
|
||||
};
|
||||
|
||||
|
||||
/* ============ message/CPIM ================= */
|
||||
class MediaContentCPIM : public MediaContent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MediaContentCPIM(tmedia_content_t* pContent);
|
||||
#endif
|
||||
virtual ~MediaContentCPIM();
|
||||
|
||||
public:
|
||||
virtual unsigned getPayloadLength();
|
||||
virtual unsigned getPayload(void* pOutput, unsigned nMaxsize);
|
||||
#if !defined(SWIG)
|
||||
const void* getPayloadPtr();
|
||||
#endif
|
||||
const char* getHeaderValue(const char* pName);
|
||||
};
|
||||
|
||||
#endif /*TINYWRAP_MEDIA_CONTENT_H*/
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_MEDIA_CONTENT_H
|
||||
#define TINYWRAP_MEDIA_CONTENT_H
|
||||
|
||||
#include "tinymedia.h"
|
||||
#include "Common.h"
|
||||
|
||||
class MediaContentCPIM;
|
||||
|
||||
class MediaContent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MediaContent(tmedia_content_t* content);
|
||||
#endif
|
||||
virtual ~MediaContent();
|
||||
|
||||
public:
|
||||
const char* getType();
|
||||
virtual unsigned getDataLength();
|
||||
virtual unsigned getData(void* pOutput, unsigned nMaxsize);
|
||||
|
||||
// SWIG %newobject()
|
||||
static MediaContent* parse(const void* pData, unsigned nSize, const char* pType);
|
||||
static MediaContentCPIM* parse(const void* pData, unsigned nSize);
|
||||
|
||||
virtual unsigned getPayloadLength() = 0;
|
||||
virtual unsigned getPayload(void* pOutput, unsigned nMaxsize) = 0;
|
||||
|
||||
protected:
|
||||
tmedia_content_t* m_pContent;
|
||||
|
||||
private:
|
||||
tsk_buffer_t* m_pData;
|
||||
};
|
||||
|
||||
|
||||
/* ============ message/CPIM ================= */
|
||||
class MediaContentCPIM : public MediaContent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MediaContentCPIM(tmedia_content_t* pContent);
|
||||
#endif
|
||||
virtual ~MediaContentCPIM();
|
||||
|
||||
public:
|
||||
virtual unsigned getPayloadLength();
|
||||
virtual unsigned getPayload(void* pOutput, unsigned nMaxsize);
|
||||
#if !defined(SWIG)
|
||||
const void* getPayloadPtr();
|
||||
#endif
|
||||
const char* getHeaderValue(const char* pName);
|
||||
};
|
||||
|
||||
#endif /*TINYWRAP_MEDIA_CONTENT_H*/
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,246 +1,246 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_MEDIA_SESSIONMGR_H
|
||||
#define TINYWRAP_MEDIA_SESSIONMGR_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinymedia.h"
|
||||
#include "Common.h"
|
||||
|
||||
class ProxyPlugin;
|
||||
class MediaSessionMgr;
|
||||
|
||||
class TINYWRAP_API QoS
|
||||
{
|
||||
friend class MediaSessionMgr;
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
QoS(float qavg, float q1 = -1.f, float q2 = -1.f, float q3 = -1.f, float q4 = -1.f, float q5 = -1.f);
|
||||
#endif
|
||||
virtual ~QoS();
|
||||
float getQavg() {
|
||||
return m_Qqvg;
|
||||
}
|
||||
float getQ1() {
|
||||
return m_Qn[0];
|
||||
}
|
||||
float getQ2() {
|
||||
return m_Qn[1];
|
||||
}
|
||||
float getQ3() {
|
||||
return m_Qn[2];
|
||||
}
|
||||
float getQ4() {
|
||||
return m_Qn[3];
|
||||
}
|
||||
float getQ5() {
|
||||
return m_Qn[4];
|
||||
}
|
||||
unsigned getVideoInWidth() {
|
||||
return m_VideoInWidth;
|
||||
}
|
||||
unsigned getVideoOutWidth() {
|
||||
return m_VideoOutWidth;
|
||||
}
|
||||
unsigned getVideoInHeight() {
|
||||
return m_VideoInHeight;
|
||||
}
|
||||
unsigned getVideoOutHeight() {
|
||||
return m_VideoOutHeight;
|
||||
}
|
||||
unsigned getBandwidthDownKbps() {
|
||||
return m_BandwidthDownKbps;
|
||||
}
|
||||
unsigned getBandwidthUpKbps() {
|
||||
return m_BandwidthUpKbps;
|
||||
}
|
||||
unsigned getVideoInAvgFps() {
|
||||
return m_VideoInAvgFps;
|
||||
}
|
||||
unsigned getVideoDecAvgTime() { // In millis
|
||||
return m_VideoDecAvgTime;
|
||||
}
|
||||
unsigned getVideoEncAvgTime() { // In millis
|
||||
return m_VideoEncAvgTime;
|
||||
}
|
||||
private:
|
||||
float m_Qqvg;
|
||||
float m_Qn[5];
|
||||
unsigned m_VideoInWidth;
|
||||
unsigned m_VideoOutWidth;
|
||||
unsigned m_VideoInHeight;
|
||||
unsigned m_VideoOutHeight;
|
||||
unsigned m_BandwidthDownKbps;
|
||||
unsigned m_BandwidthUpKbps;
|
||||
unsigned m_VideoInAvgFps;
|
||||
unsigned m_VideoDecAvgTime;
|
||||
unsigned m_VideoEncAvgTime;
|
||||
};
|
||||
|
||||
class TINYWRAP_API Codec
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
Codec(const struct tmedia_codec_s* pWrappedCodec);
|
||||
#endif
|
||||
virtual ~Codec();
|
||||
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
const struct tmedia_codec_s* getWrappedCodec() {
|
||||
return m_pWrappedCodec;
|
||||
}
|
||||
inline bool isOpened() {
|
||||
return (m_pWrappedCodec && (m_pWrappedCodec->opened == tsk_true));
|
||||
}
|
||||
#endif
|
||||
twrap_media_type_t getMediaType();
|
||||
const char* getName();
|
||||
const char* getDescription();
|
||||
const char* getNegFormat();
|
||||
int getAudioSamplingRate();
|
||||
int getAudioChannels();
|
||||
int getAudioPTime();
|
||||
|
||||
private:
|
||||
struct tmedia_codec_s* m_pWrappedCodec;
|
||||
};
|
||||
|
||||
class TINYWRAP_API MediaSessionMgr
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MediaSessionMgr(tmedia_session_mgr_t* pWrappedMgr);
|
||||
#endif
|
||||
virtual ~MediaSessionMgr();
|
||||
|
||||
public:
|
||||
bool sessionSetInt32(twrap_media_type_t media, const char* key, int32_t value);
|
||||
int32_t sessionGetInt32(twrap_media_type_t media, const char* key);
|
||||
QoS* sessionGetQoS(twrap_media_type_t media);
|
||||
|
||||
bool consumerSetInt32(twrap_media_type_t media, const char* key, int32_t value);
|
||||
bool consumerSetInt64(twrap_media_type_t media, const char* key, int64_t value);
|
||||
|
||||
bool producerSetInt32(twrap_media_type_t media, const char* key, int32_t value);
|
||||
bool producerSetInt64(twrap_media_type_t media, const char* key, int64_t value);
|
||||
Codec* producerGetCodec(twrap_media_type_t media);
|
||||
|
||||
#if !defined(SWIG)
|
||||
const ProxyPlugin* findProxyPlugin(twrap_media_type_t media, bool consumer)const;
|
||||
#endif
|
||||
|
||||
const ProxyPlugin* findProxyPluginConsumer(twrap_media_type_t media)const {
|
||||
return this->findProxyPlugin(media, true);
|
||||
}
|
||||
const ProxyPlugin* findProxyPluginProducer(twrap_media_type_t media)const {
|
||||
return this->findProxyPlugin(media, false);
|
||||
}
|
||||
|
||||
static unsigned int registerAudioPluginFromFile(const char* path);
|
||||
|
||||
uint64_t getSessionId(twrap_media_type_t media)const;
|
||||
|
||||
#if !defined(SWIG)
|
||||
inline const tmedia_session_mgr_t* getWrappedMgr()const {
|
||||
return m_pWrappedMgr;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Defaults
|
||||
static bool defaultsSetProfile(tmedia_profile_t profile);
|
||||
static tmedia_profile_t defaultsGetProfile();
|
||||
static bool defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl); // @deprecated
|
||||
static tmedia_bandwidth_level_t defaultsGetBandwidthLevel(); // @deprecated
|
||||
static bool defaultsSetCongestionCtrlEnabled(bool enabled);
|
||||
static bool defaultsSetVideoMotionRank(int32_t video_motion_rank);
|
||||
static bool defaultsSetVideoFps(int32_t video_fps);
|
||||
static bool defaultsSetBandwidthVideoUploadMax(int32_t bw_video_up_max_kbps);
|
||||
static bool defaultsSetBandwidthVideoDownloadMax(int32_t bw_video_down_max_kbps);
|
||||
static bool defaultsSetPrefVideoSize(tmedia_pref_video_size_t pref_video_size);
|
||||
static bool defaultsSetPrefVideoSizeOutRange(tmedia_pref_video_size_t min, tmedia_pref_video_size_t max);
|
||||
static bool defaultsSetAdaptativeVideoSizeOutEnabled(bool enabled);
|
||||
static bool defaultsSetJbMargin(uint32_t jb_margin_ms);
|
||||
static bool defaultsSetJbMaxLateRate(uint32_t jb_late_rate_percent);
|
||||
static bool defaultsSetEchoTail(uint32_t echo_tail);
|
||||
static uint32_t defaultsGetEchoTail();
|
||||
static bool defaultsSetEchoSkew(uint32_t echo_skew);
|
||||
static bool defaultsSetEchoSuppEnabled(bool echo_supp_enabled);
|
||||
static bool defaultsGetEchoSuppEnabled();
|
||||
static bool defaultsSetAgcEnabled(bool agc_enabled);
|
||||
static bool defaultsGetAgcEnabled();
|
||||
static bool defaultsSetAgcLevel(float agc_level);
|
||||
static float defaultsGetAgcLevel();
|
||||
static bool defaultsSetVadEnabled(bool vad_enabled);
|
||||
static bool defaultsGetGetVadEnabled();
|
||||
static bool defaultsSetNoiseSuppEnabled(bool noise_supp_enabled);
|
||||
static bool defaultsGetNoiseSuppEnabled();
|
||||
static bool defaultsSetNoiseSuppLevel(int32_t noise_supp_level);
|
||||
static int32_t defaultsGetNoiseSuppLevel();
|
||||
static bool defaultsSet100relEnabled(bool _100rel_enabled);
|
||||
static bool defaultsGet100relEnabled();
|
||||
static bool defaultsSetScreenSize(int32_t sx, int32_t sy);
|
||||
static bool defaultsSetAudioGain(int32_t producer_gain, int32_t consumer_gain);
|
||||
static bool defaultsSetAudioPtime(int32_t ptime);
|
||||
static bool defaultsSetAudioChannels(int32_t channel_playback, int32_t channel_record);
|
||||
static bool defaultsSetRtpPortRange(uint16_t range_start, uint16_t range_stop);
|
||||
static bool defaultsSetRtpSymetricEnabled(bool enabled);
|
||||
static bool defaultsSetMediaType(twrap_media_type_t media_type);
|
||||
static bool defaultsSetVolume(int32_t volume);
|
||||
static int32_t defaultsGetVolume();
|
||||
static bool defaultsSetInviteSessionTimers(int32_t timeout, const char* refresher);
|
||||
static bool defaultsSetSRtpMode(tmedia_srtp_mode_t mode);
|
||||
static tmedia_srtp_mode_t defaultsGetSRtpMode();
|
||||
static bool defaultsSetSRtpType(tmedia_srtp_type_t srtp_type);
|
||||
static tmedia_srtp_type_t defaultsGetSRtpType();
|
||||
static bool defaultsSetRtcpEnabled(bool enabled);
|
||||
static bool defaultsGetRtcpEnabled();
|
||||
static bool defaultsSetRtcpMuxEnabled(bool enabled);
|
||||
static bool defaultsGetRtcpMuxEnabled();
|
||||
static bool defaultsSetStunEnabled(bool stun_enabled);
|
||||
static bool defaultsSetIceStunEnabled(bool icestun_enabled);
|
||||
static bool defaultsSetIceTurnEnabled(bool iceturn_enabled);
|
||||
static bool defaultsSetStunServer(const char* server_ip, uint16_t server_port);
|
||||
static bool defaultsSetStunCred(const char* username, const char* password);
|
||||
static bool defaultsSetIceEnabled(bool ice_enabled);
|
||||
static bool defaultsSetByPassEncoding(bool enabled);
|
||||
static bool defaultsGetByPassEncoding();
|
||||
static bool defaultsSetByPassDecoding(bool enabled);
|
||||
static bool defaultsGetByPassDecoding();
|
||||
static bool defaultsSetVideoJbEnabled(bool enabled);
|
||||
static bool defaultsGetVideoJbEnabled();
|
||||
static bool defaultsSetVideoZeroArtifactsEnabled(bool enabled);
|
||||
static bool defaultsGetVideoZeroArtifactsEnabled();
|
||||
static bool defaultsSetRtpBuffSize(unsigned buffSize);
|
||||
static unsigned defaultsGetRtpBuffSize();
|
||||
static bool defaultsSetAvpfTail(unsigned tail_min, unsigned tail_max);
|
||||
static bool defaultsSetAvpfMode(enum tmedia_mode_e mode);
|
||||
static bool defaultsSetOpusMaxCaptureRate(uint32_t opus_maxcapturerate);
|
||||
static bool defaultsSetOpusMaxPlaybackRate(uint32_t opus_maxplaybackrate);
|
||||
static bool defaultsSetMaxFds(int32_t max_fds);
|
||||
|
||||
private:
|
||||
tmedia_session_mgr_t* m_pWrappedMgr;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_MEDIA_SESSIONMGR_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_MEDIA_SESSIONMGR_H
|
||||
#define TINYWRAP_MEDIA_SESSIONMGR_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinymedia.h"
|
||||
#include "Common.h"
|
||||
|
||||
class ProxyPlugin;
|
||||
class MediaSessionMgr;
|
||||
|
||||
class TINYWRAP_API QoS
|
||||
{
|
||||
friend class MediaSessionMgr;
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
QoS(float qavg, float q1 = -1.f, float q2 = -1.f, float q3 = -1.f, float q4 = -1.f, float q5 = -1.f);
|
||||
#endif
|
||||
virtual ~QoS();
|
||||
float getQavg() {
|
||||
return m_Qqvg;
|
||||
}
|
||||
float getQ1() {
|
||||
return m_Qn[0];
|
||||
}
|
||||
float getQ2() {
|
||||
return m_Qn[1];
|
||||
}
|
||||
float getQ3() {
|
||||
return m_Qn[2];
|
||||
}
|
||||
float getQ4() {
|
||||
return m_Qn[3];
|
||||
}
|
||||
float getQ5() {
|
||||
return m_Qn[4];
|
||||
}
|
||||
unsigned getVideoInWidth() {
|
||||
return m_VideoInWidth;
|
||||
}
|
||||
unsigned getVideoOutWidth() {
|
||||
return m_VideoOutWidth;
|
||||
}
|
||||
unsigned getVideoInHeight() {
|
||||
return m_VideoInHeight;
|
||||
}
|
||||
unsigned getVideoOutHeight() {
|
||||
return m_VideoOutHeight;
|
||||
}
|
||||
unsigned getBandwidthDownKbps() {
|
||||
return m_BandwidthDownKbps;
|
||||
}
|
||||
unsigned getBandwidthUpKbps() {
|
||||
return m_BandwidthUpKbps;
|
||||
}
|
||||
unsigned getVideoInAvgFps() {
|
||||
return m_VideoInAvgFps;
|
||||
}
|
||||
unsigned getVideoDecAvgTime() { // In millis
|
||||
return m_VideoDecAvgTime;
|
||||
}
|
||||
unsigned getVideoEncAvgTime() { // In millis
|
||||
return m_VideoEncAvgTime;
|
||||
}
|
||||
private:
|
||||
float m_Qqvg;
|
||||
float m_Qn[5];
|
||||
unsigned m_VideoInWidth;
|
||||
unsigned m_VideoOutWidth;
|
||||
unsigned m_VideoInHeight;
|
||||
unsigned m_VideoOutHeight;
|
||||
unsigned m_BandwidthDownKbps;
|
||||
unsigned m_BandwidthUpKbps;
|
||||
unsigned m_VideoInAvgFps;
|
||||
unsigned m_VideoDecAvgTime;
|
||||
unsigned m_VideoEncAvgTime;
|
||||
};
|
||||
|
||||
class TINYWRAP_API Codec
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
Codec(const struct tmedia_codec_s* pWrappedCodec);
|
||||
#endif
|
||||
virtual ~Codec();
|
||||
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
const struct tmedia_codec_s* getWrappedCodec() {
|
||||
return m_pWrappedCodec;
|
||||
}
|
||||
inline bool isOpened() {
|
||||
return (m_pWrappedCodec && (m_pWrappedCodec->opened == tsk_true));
|
||||
}
|
||||
#endif
|
||||
twrap_media_type_t getMediaType();
|
||||
const char* getName();
|
||||
const char* getDescription();
|
||||
const char* getNegFormat();
|
||||
int getAudioSamplingRate();
|
||||
int getAudioChannels();
|
||||
int getAudioPTime();
|
||||
|
||||
private:
|
||||
struct tmedia_codec_s* m_pWrappedCodec;
|
||||
};
|
||||
|
||||
class TINYWRAP_API MediaSessionMgr
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MediaSessionMgr(tmedia_session_mgr_t* pWrappedMgr);
|
||||
#endif
|
||||
virtual ~MediaSessionMgr();
|
||||
|
||||
public:
|
||||
bool sessionSetInt32(twrap_media_type_t media, const char* key, int32_t value);
|
||||
int32_t sessionGetInt32(twrap_media_type_t media, const char* key);
|
||||
QoS* sessionGetQoS(twrap_media_type_t media);
|
||||
|
||||
bool consumerSetInt32(twrap_media_type_t media, const char* key, int32_t value);
|
||||
bool consumerSetInt64(twrap_media_type_t media, const char* key, int64_t value);
|
||||
|
||||
bool producerSetInt32(twrap_media_type_t media, const char* key, int32_t value);
|
||||
bool producerSetInt64(twrap_media_type_t media, const char* key, int64_t value);
|
||||
Codec* producerGetCodec(twrap_media_type_t media);
|
||||
|
||||
#if !defined(SWIG)
|
||||
const ProxyPlugin* findProxyPlugin(twrap_media_type_t media, bool consumer)const;
|
||||
#endif
|
||||
|
||||
const ProxyPlugin* findProxyPluginConsumer(twrap_media_type_t media)const {
|
||||
return this->findProxyPlugin(media, true);
|
||||
}
|
||||
const ProxyPlugin* findProxyPluginProducer(twrap_media_type_t media)const {
|
||||
return this->findProxyPlugin(media, false);
|
||||
}
|
||||
|
||||
static unsigned int registerAudioPluginFromFile(const char* path);
|
||||
|
||||
uint64_t getSessionId(twrap_media_type_t media)const;
|
||||
|
||||
#if !defined(SWIG)
|
||||
inline const tmedia_session_mgr_t* getWrappedMgr()const {
|
||||
return m_pWrappedMgr;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Defaults
|
||||
static bool defaultsSetProfile(tmedia_profile_t profile);
|
||||
static tmedia_profile_t defaultsGetProfile();
|
||||
static bool defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl); // @deprecated
|
||||
static tmedia_bandwidth_level_t defaultsGetBandwidthLevel(); // @deprecated
|
||||
static bool defaultsSetCongestionCtrlEnabled(bool enabled);
|
||||
static bool defaultsSetVideoMotionRank(int32_t video_motion_rank);
|
||||
static bool defaultsSetVideoFps(int32_t video_fps);
|
||||
static bool defaultsSetBandwidthVideoUploadMax(int32_t bw_video_up_max_kbps);
|
||||
static bool defaultsSetBandwidthVideoDownloadMax(int32_t bw_video_down_max_kbps);
|
||||
static bool defaultsSetPrefVideoSize(tmedia_pref_video_size_t pref_video_size);
|
||||
static bool defaultsSetPrefVideoSizeOutRange(tmedia_pref_video_size_t min, tmedia_pref_video_size_t max);
|
||||
static bool defaultsSetAdaptativeVideoSizeOutEnabled(bool enabled);
|
||||
static bool defaultsSetJbMargin(uint32_t jb_margin_ms);
|
||||
static bool defaultsSetJbMaxLateRate(uint32_t jb_late_rate_percent);
|
||||
static bool defaultsSetEchoTail(uint32_t echo_tail);
|
||||
static uint32_t defaultsGetEchoTail();
|
||||
static bool defaultsSetEchoSkew(uint32_t echo_skew);
|
||||
static bool defaultsSetEchoSuppEnabled(bool echo_supp_enabled);
|
||||
static bool defaultsGetEchoSuppEnabled();
|
||||
static bool defaultsSetAgcEnabled(bool agc_enabled);
|
||||
static bool defaultsGetAgcEnabled();
|
||||
static bool defaultsSetAgcLevel(float agc_level);
|
||||
static float defaultsGetAgcLevel();
|
||||
static bool defaultsSetVadEnabled(bool vad_enabled);
|
||||
static bool defaultsGetGetVadEnabled();
|
||||
static bool defaultsSetNoiseSuppEnabled(bool noise_supp_enabled);
|
||||
static bool defaultsGetNoiseSuppEnabled();
|
||||
static bool defaultsSetNoiseSuppLevel(int32_t noise_supp_level);
|
||||
static int32_t defaultsGetNoiseSuppLevel();
|
||||
static bool defaultsSet100relEnabled(bool _100rel_enabled);
|
||||
static bool defaultsGet100relEnabled();
|
||||
static bool defaultsSetScreenSize(int32_t sx, int32_t sy);
|
||||
static bool defaultsSetAudioGain(int32_t producer_gain, int32_t consumer_gain);
|
||||
static bool defaultsSetAudioPtime(int32_t ptime);
|
||||
static bool defaultsSetAudioChannels(int32_t channel_playback, int32_t channel_record);
|
||||
static bool defaultsSetRtpPortRange(uint16_t range_start, uint16_t range_stop);
|
||||
static bool defaultsSetRtpSymetricEnabled(bool enabled);
|
||||
static bool defaultsSetMediaType(twrap_media_type_t media_type);
|
||||
static bool defaultsSetVolume(int32_t volume);
|
||||
static int32_t defaultsGetVolume();
|
||||
static bool defaultsSetInviteSessionTimers(int32_t timeout, const char* refresher);
|
||||
static bool defaultsSetSRtpMode(tmedia_srtp_mode_t mode);
|
||||
static tmedia_srtp_mode_t defaultsGetSRtpMode();
|
||||
static bool defaultsSetSRtpType(tmedia_srtp_type_t srtp_type);
|
||||
static tmedia_srtp_type_t defaultsGetSRtpType();
|
||||
static bool defaultsSetRtcpEnabled(bool enabled);
|
||||
static bool defaultsGetRtcpEnabled();
|
||||
static bool defaultsSetRtcpMuxEnabled(bool enabled);
|
||||
static bool defaultsGetRtcpMuxEnabled();
|
||||
static bool defaultsSetStunEnabled(bool stun_enabled);
|
||||
static bool defaultsSetIceStunEnabled(bool icestun_enabled);
|
||||
static bool defaultsSetIceTurnEnabled(bool iceturn_enabled);
|
||||
static bool defaultsSetStunServer(const char* server_ip, uint16_t server_port);
|
||||
static bool defaultsSetStunCred(const char* username, const char* password);
|
||||
static bool defaultsSetIceEnabled(bool ice_enabled);
|
||||
static bool defaultsSetByPassEncoding(bool enabled);
|
||||
static bool defaultsGetByPassEncoding();
|
||||
static bool defaultsSetByPassDecoding(bool enabled);
|
||||
static bool defaultsGetByPassDecoding();
|
||||
static bool defaultsSetVideoJbEnabled(bool enabled);
|
||||
static bool defaultsGetVideoJbEnabled();
|
||||
static bool defaultsSetVideoZeroArtifactsEnabled(bool enabled);
|
||||
static bool defaultsGetVideoZeroArtifactsEnabled();
|
||||
static bool defaultsSetRtpBuffSize(unsigned buffSize);
|
||||
static unsigned defaultsGetRtpBuffSize();
|
||||
static bool defaultsSetAvpfTail(unsigned tail_min, unsigned tail_max);
|
||||
static bool defaultsSetAvpfMode(enum tmedia_mode_e mode);
|
||||
static bool defaultsSetOpusMaxCaptureRate(uint32_t opus_maxcapturerate);
|
||||
static bool defaultsSetOpusMaxPlaybackRate(uint32_t opus_maxplaybackrate);
|
||||
static bool defaultsSetMaxFds(int32_t max_fds);
|
||||
|
||||
private:
|
||||
tmedia_session_mgr_t* m_pWrappedMgr;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_MEDIA_SESSIONMGR_H */
|
||||
|
|
|
@ -1,315 +1,315 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "Msrp.h"
|
||||
|
||||
#include "SipSession.h"
|
||||
#include "Common.h"
|
||||
|
||||
/* ======================== MsrpMessage ========================*/
|
||||
MsrpMessage::MsrpMessage()
|
||||
:m_pMessage(tsk_null)
|
||||
{
|
||||
}
|
||||
|
||||
MsrpMessage::MsrpMessage(tmsrp_message_t *_message)
|
||||
{
|
||||
m_pMessage = (tmsrp_message_t *)tsk_object_ref(_message);
|
||||
}
|
||||
|
||||
MsrpMessage::~MsrpMessage()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pMessage);
|
||||
}
|
||||
|
||||
bool MsrpMessage::isRequest()
|
||||
{
|
||||
return (m_pMessage->type == tmsrp_request);
|
||||
}
|
||||
|
||||
short MsrpMessage::getCode()
|
||||
{
|
||||
return TMSRP_RESPONSE_CODE(m_pMessage);
|
||||
}
|
||||
|
||||
const char* MsrpMessage::getPhrase()
|
||||
{
|
||||
return TMSRP_RESPONSE_PHRASE(m_pMessage);
|
||||
}
|
||||
|
||||
tmsrp_request_type_t MsrpMessage::getRequestType()
|
||||
{
|
||||
if(TMSRP_MESSAGE_IS_REQUEST(m_pMessage)) {
|
||||
return m_pMessage->line.request.type;
|
||||
}
|
||||
return tmsrp_NONE;
|
||||
}
|
||||
|
||||
void MsrpMessage::getByteRange(int64_t* start, int64_t* end, int64_t* total)
|
||||
{
|
||||
if(m_pMessage->ByteRange) {
|
||||
*start = m_pMessage->ByteRange->start;
|
||||
*end = m_pMessage->ByteRange->end;
|
||||
*total = m_pMessage->ByteRange->total;
|
||||
}
|
||||
else {
|
||||
*start = *end = *total = -1;
|
||||
}
|
||||
}
|
||||
|
||||
bool MsrpMessage::isLastChunck()
|
||||
{
|
||||
if(TMSRP_MESSAGE_IS_REQUEST(m_pMessage)) {
|
||||
return (m_pMessage->end_line.cflag == '$');
|
||||
}
|
||||
else {
|
||||
if(m_pMessage->ByteRange) {
|
||||
return (m_pMessage->ByteRange->end >= m_pMessage->ByteRange->total);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MsrpMessage::isSuccessReport()
|
||||
{
|
||||
if(TMSRP_REQUEST_IS_REPORT(m_pMessage)) {
|
||||
if(m_pMessage->Status) {
|
||||
return m_pMessage->Status->code >= 200 && m_pMessage->Status->code <= 299;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MsrpMessage::isFirstChunck()
|
||||
{
|
||||
return (m_pMessage && m_pMessage->ByteRange->start == 1);
|
||||
}
|
||||
|
||||
char* MsrpMessage::getMsrpHeaderValue(const char* name)
|
||||
{
|
||||
const tmsrp_header_t* header = this->getMsrpHeader(name, 0);
|
||||
if(header) {
|
||||
return tmsrp_header_tostring(header);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
char* MsrpMessage::getMsrpHeaderParamValue(const char* name, const char* param)
|
||||
{
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
unsigned MsrpMessage::getMsrpContentLength()
|
||||
{
|
||||
if(m_pMessage &&
|
||||
m_pMessage->Content &&
|
||||
m_pMessage->Content->data &&
|
||||
m_pMessage->Content->size) {
|
||||
return m_pMessage->Content->size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned MsrpMessage::getMsrpContent(void* output, unsigned maxsize)
|
||||
{
|
||||
unsigned retsize = 0;
|
||||
if(!output ||
|
||||
!m_pMessage ||
|
||||
!m_pMessage->Content ||
|
||||
!m_pMessage->Content->data ||
|
||||
!m_pMessage->Content->size) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
retsize = (m_pMessage->Content->size > maxsize) ? maxsize : m_pMessage->Content->size;
|
||||
memcpy(output, m_pMessage->Content->data, retsize);
|
||||
return retsize;
|
||||
}
|
||||
|
||||
const tmsrp_header_t* MsrpMessage::getMsrpHeader(const char* name, unsigned index /*= 0*/)
|
||||
{
|
||||
tsk_size_t pos = 0;
|
||||
const tmsrp_header_t* hdr = tsk_null;
|
||||
const tsk_list_item_t *item;
|
||||
|
||||
/* From tmsrp_message_get_headerAt() */
|
||||
if(!m_pMessage || !name) {
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
if(tsk_striequals(name, "To-Path")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->To;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "From-Path")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->From;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Message-ID")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->MessageID;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Byte-Range")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->ByteRange;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Failure-Report")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->FailureReport;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Success-Report")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->SuccessReport;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Status")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->Status;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Content-Type")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->ContentType;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* All other headers */
|
||||
tsk_list_foreach(item, m_pMessage->headers) {
|
||||
if(tsk_striequals(tmsrp_header_get_nameex(TMSRP_HEADER(item->data)), name)) {
|
||||
if(pos++ >= index) {
|
||||
hdr = (const tmsrp_header_t*)item->data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bail:
|
||||
return hdr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ======================== MsrpEvent ========================*/
|
||||
MsrpEvent::MsrpEvent(const tmsrp_event_t *_msrpevent)
|
||||
{
|
||||
this->_event = _msrpevent;
|
||||
if(this->_event && this->_event->message) {
|
||||
m_pMessage = new MsrpMessage((tmsrp_message_t *)this->_event->message);
|
||||
}
|
||||
else {
|
||||
m_pMessage = tsk_null;
|
||||
}
|
||||
}
|
||||
|
||||
MsrpEvent::~MsrpEvent()
|
||||
{
|
||||
if(m_pMessage) {
|
||||
delete m_pMessage;
|
||||
}
|
||||
}
|
||||
|
||||
tmsrp_event_type_t MsrpEvent::getType()
|
||||
{
|
||||
if(this->_event) {
|
||||
return this->_event->type;
|
||||
}
|
||||
return tmsrp_event_type_none;
|
||||
}
|
||||
|
||||
const MsrpSession* MsrpEvent::getSipSession()
|
||||
{
|
||||
if(this->_event && this->_event->callback_data) {
|
||||
return dyn_cast<const MsrpSession*>((const MsrpSession*)this->_event->callback_data);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const MsrpMessage* MsrpEvent::getMessage() const
|
||||
{
|
||||
return m_pMessage;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int twrap_msrp_cb(const tmsrp_event_t* _event)
|
||||
{
|
||||
const MsrpSession* session = (const MsrpSession*)_event->callback_data;
|
||||
MsrpCallback* callback;
|
||||
int ret = -1;
|
||||
|
||||
if(session) {
|
||||
if((callback = session->getCallback())) {
|
||||
MsrpEvent* e = new MsrpEvent(_event);
|
||||
ret = callback->OnEvent(e);
|
||||
delete e;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
}
|
||||
|
||||
return ret;
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "Msrp.h"
|
||||
|
||||
#include "SipSession.h"
|
||||
#include "Common.h"
|
||||
|
||||
/* ======================== MsrpMessage ========================*/
|
||||
MsrpMessage::MsrpMessage()
|
||||
:m_pMessage(tsk_null)
|
||||
{
|
||||
}
|
||||
|
||||
MsrpMessage::MsrpMessage(tmsrp_message_t *_message)
|
||||
{
|
||||
m_pMessage = (tmsrp_message_t *)tsk_object_ref(_message);
|
||||
}
|
||||
|
||||
MsrpMessage::~MsrpMessage()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pMessage);
|
||||
}
|
||||
|
||||
bool MsrpMessage::isRequest()
|
||||
{
|
||||
return (m_pMessage->type == tmsrp_request);
|
||||
}
|
||||
|
||||
short MsrpMessage::getCode()
|
||||
{
|
||||
return TMSRP_RESPONSE_CODE(m_pMessage);
|
||||
}
|
||||
|
||||
const char* MsrpMessage::getPhrase()
|
||||
{
|
||||
return TMSRP_RESPONSE_PHRASE(m_pMessage);
|
||||
}
|
||||
|
||||
tmsrp_request_type_t MsrpMessage::getRequestType()
|
||||
{
|
||||
if(TMSRP_MESSAGE_IS_REQUEST(m_pMessage)) {
|
||||
return m_pMessage->line.request.type;
|
||||
}
|
||||
return tmsrp_NONE;
|
||||
}
|
||||
|
||||
void MsrpMessage::getByteRange(int64_t* start, int64_t* end, int64_t* total)
|
||||
{
|
||||
if(m_pMessage->ByteRange) {
|
||||
*start = m_pMessage->ByteRange->start;
|
||||
*end = m_pMessage->ByteRange->end;
|
||||
*total = m_pMessage->ByteRange->total;
|
||||
}
|
||||
else {
|
||||
*start = *end = *total = -1;
|
||||
}
|
||||
}
|
||||
|
||||
bool MsrpMessage::isLastChunck()
|
||||
{
|
||||
if(TMSRP_MESSAGE_IS_REQUEST(m_pMessage)) {
|
||||
return (m_pMessage->end_line.cflag == '$');
|
||||
}
|
||||
else {
|
||||
if(m_pMessage->ByteRange) {
|
||||
return (m_pMessage->ByteRange->end >= m_pMessage->ByteRange->total);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MsrpMessage::isSuccessReport()
|
||||
{
|
||||
if(TMSRP_REQUEST_IS_REPORT(m_pMessage)) {
|
||||
if(m_pMessage->Status) {
|
||||
return m_pMessage->Status->code >= 200 && m_pMessage->Status->code <= 299;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MsrpMessage::isFirstChunck()
|
||||
{
|
||||
return (m_pMessage && m_pMessage->ByteRange->start == 1);
|
||||
}
|
||||
|
||||
char* MsrpMessage::getMsrpHeaderValue(const char* name)
|
||||
{
|
||||
const tmsrp_header_t* header = this->getMsrpHeader(name, 0);
|
||||
if(header) {
|
||||
return tmsrp_header_tostring(header);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
char* MsrpMessage::getMsrpHeaderParamValue(const char* name, const char* param)
|
||||
{
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
unsigned MsrpMessage::getMsrpContentLength()
|
||||
{
|
||||
if(m_pMessage &&
|
||||
m_pMessage->Content &&
|
||||
m_pMessage->Content->data &&
|
||||
m_pMessage->Content->size) {
|
||||
return m_pMessage->Content->size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned MsrpMessage::getMsrpContent(void* output, unsigned maxsize)
|
||||
{
|
||||
unsigned retsize = 0;
|
||||
if(!output ||
|
||||
!m_pMessage ||
|
||||
!m_pMessage->Content ||
|
||||
!m_pMessage->Content->data ||
|
||||
!m_pMessage->Content->size) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
retsize = (m_pMessage->Content->size > maxsize) ? maxsize : m_pMessage->Content->size;
|
||||
memcpy(output, m_pMessage->Content->data, retsize);
|
||||
return retsize;
|
||||
}
|
||||
|
||||
const tmsrp_header_t* MsrpMessage::getMsrpHeader(const char* name, unsigned index /*= 0*/)
|
||||
{
|
||||
tsk_size_t pos = 0;
|
||||
const tmsrp_header_t* hdr = tsk_null;
|
||||
const tsk_list_item_t *item;
|
||||
|
||||
/* From tmsrp_message_get_headerAt() */
|
||||
if(!m_pMessage || !name) {
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
if(tsk_striequals(name, "To-Path")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->To;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "From-Path")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->From;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Message-ID")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->MessageID;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Byte-Range")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->ByteRange;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Failure-Report")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->FailureReport;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Success-Report")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->SuccessReport;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Status")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->Status;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "Content-Type")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tmsrp_header_t*)m_pMessage->ContentType;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* All other headers */
|
||||
tsk_list_foreach(item, m_pMessage->headers) {
|
||||
if(tsk_striequals(tmsrp_header_get_nameex(TMSRP_HEADER(item->data)), name)) {
|
||||
if(pos++ >= index) {
|
||||
hdr = (const tmsrp_header_t*)item->data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bail:
|
||||
return hdr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ======================== MsrpEvent ========================*/
|
||||
MsrpEvent::MsrpEvent(const tmsrp_event_t *_msrpevent)
|
||||
{
|
||||
this->_event = _msrpevent;
|
||||
if(this->_event && this->_event->message) {
|
||||
m_pMessage = new MsrpMessage((tmsrp_message_t *)this->_event->message);
|
||||
}
|
||||
else {
|
||||
m_pMessage = tsk_null;
|
||||
}
|
||||
}
|
||||
|
||||
MsrpEvent::~MsrpEvent()
|
||||
{
|
||||
if(m_pMessage) {
|
||||
delete m_pMessage;
|
||||
}
|
||||
}
|
||||
|
||||
tmsrp_event_type_t MsrpEvent::getType()
|
||||
{
|
||||
if(this->_event) {
|
||||
return this->_event->type;
|
||||
}
|
||||
return tmsrp_event_type_none;
|
||||
}
|
||||
|
||||
const MsrpSession* MsrpEvent::getSipSession()
|
||||
{
|
||||
if(this->_event && this->_event->callback_data) {
|
||||
return dyn_cast<const MsrpSession*>((const MsrpSession*)this->_event->callback_data);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const MsrpMessage* MsrpEvent::getMessage() const
|
||||
{
|
||||
return m_pMessage;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int twrap_msrp_cb(const tmsrp_event_t* _event)
|
||||
{
|
||||
const MsrpSession* session = (const MsrpSession*)_event->callback_data;
|
||||
MsrpCallback* callback;
|
||||
int ret = -1;
|
||||
|
||||
if(session) {
|
||||
if((callback = session->getCallback())) {
|
||||
MsrpEvent* e = new MsrpEvent(_event);
|
||||
ret = callback->OnEvent(e);
|
||||
delete e;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -1,101 +1,101 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_MSRP_H
|
||||
#define TINYWRAP_MSRP_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinymsrp.h"
|
||||
|
||||
class MsrpSession;
|
||||
|
||||
class TINYWRAP_API MsrpMessage
|
||||
{
|
||||
public:
|
||||
MsrpMessage();
|
||||
#if !defined(SWIG)
|
||||
MsrpMessage(tmsrp_message_t *message);
|
||||
#endif
|
||||
virtual ~MsrpMessage();
|
||||
|
||||
bool isRequest();
|
||||
short getCode();
|
||||
const char* getPhrase();
|
||||
tmsrp_request_type_t getRequestType();
|
||||
#if defined(SWIG)
|
||||
void getByteRange(int64_t* OUTPUT, int64_t* OUTPUT, int64_t* OUTPUT);
|
||||
#else
|
||||
void getByteRange(int64_t* start, int64_t* end, int64_t* total);
|
||||
#endif
|
||||
bool isLastChunck();
|
||||
bool isFirstChunck();
|
||||
bool isSuccessReport();
|
||||
char* getMsrpHeaderValue(const char* name);
|
||||
char* getMsrpHeaderParamValue(const char* name, const char* param);
|
||||
unsigned getMsrpContentLength();
|
||||
unsigned getMsrpContent(void* output, unsigned maxsize);
|
||||
#if !defined(SWIG)
|
||||
const tmsrp_message_t* getWrappedMsrpMessage() {
|
||||
return m_pMessage;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
const tmsrp_header_t* getMsrpHeader(const char* name, unsigned index = 0);
|
||||
|
||||
private:
|
||||
tmsrp_message_t *m_pMessage;
|
||||
};
|
||||
|
||||
class TINYWRAP_API MsrpEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MsrpEvent(const tmsrp_event_t *_event);
|
||||
#endif
|
||||
virtual ~MsrpEvent();
|
||||
|
||||
tmsrp_event_type_t getType();
|
||||
const MsrpSession* getSipSession();
|
||||
const MsrpMessage* getMessage() const;
|
||||
|
||||
protected:
|
||||
const tmsrp_event_t *_event;
|
||||
MsrpMessage* m_pMessage;
|
||||
};
|
||||
|
||||
class TINYWRAP_API MsrpCallback
|
||||
{
|
||||
public:
|
||||
MsrpCallback() { }
|
||||
virtual ~MsrpCallback() {}
|
||||
virtual int OnEvent(const MsrpEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#if !defined(SWIG)
|
||||
int twrap_msrp_cb(const tmsrp_event_t* _event);
|
||||
#endif
|
||||
|
||||
#endif /* TINYWRAP_MSRP_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_MSRP_H
|
||||
#define TINYWRAP_MSRP_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinymsrp.h"
|
||||
|
||||
class MsrpSession;
|
||||
|
||||
class TINYWRAP_API MsrpMessage
|
||||
{
|
||||
public:
|
||||
MsrpMessage();
|
||||
#if !defined(SWIG)
|
||||
MsrpMessage(tmsrp_message_t *message);
|
||||
#endif
|
||||
virtual ~MsrpMessage();
|
||||
|
||||
bool isRequest();
|
||||
short getCode();
|
||||
const char* getPhrase();
|
||||
tmsrp_request_type_t getRequestType();
|
||||
#if defined(SWIG)
|
||||
void getByteRange(int64_t* OUTPUT, int64_t* OUTPUT, int64_t* OUTPUT);
|
||||
#else
|
||||
void getByteRange(int64_t* start, int64_t* end, int64_t* total);
|
||||
#endif
|
||||
bool isLastChunck();
|
||||
bool isFirstChunck();
|
||||
bool isSuccessReport();
|
||||
char* getMsrpHeaderValue(const char* name);
|
||||
char* getMsrpHeaderParamValue(const char* name, const char* param);
|
||||
unsigned getMsrpContentLength();
|
||||
unsigned getMsrpContent(void* output, unsigned maxsize);
|
||||
#if !defined(SWIG)
|
||||
const tmsrp_message_t* getWrappedMsrpMessage() {
|
||||
return m_pMessage;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
const tmsrp_header_t* getMsrpHeader(const char* name, unsigned index = 0);
|
||||
|
||||
private:
|
||||
tmsrp_message_t *m_pMessage;
|
||||
};
|
||||
|
||||
class TINYWRAP_API MsrpEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MsrpEvent(const tmsrp_event_t *_event);
|
||||
#endif
|
||||
virtual ~MsrpEvent();
|
||||
|
||||
tmsrp_event_type_t getType();
|
||||
const MsrpSession* getSipSession();
|
||||
const MsrpMessage* getMessage() const;
|
||||
|
||||
protected:
|
||||
const tmsrp_event_t *_event;
|
||||
MsrpMessage* m_pMessage;
|
||||
};
|
||||
|
||||
class TINYWRAP_API MsrpCallback
|
||||
{
|
||||
public:
|
||||
MsrpCallback() { }
|
||||
virtual ~MsrpCallback() {}
|
||||
virtual int OnEvent(const MsrpEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#if !defined(SWIG)
|
||||
int twrap_msrp_cb(const tmsrp_event_t* _event);
|
||||
#endif
|
||||
|
||||
#endif /* TINYWRAP_MSRP_H */
|
||||
|
|
|
@ -1,34 +1,34 @@
|
|||
%{
|
||||
#include "Msrp.h"
|
||||
%}
|
||||
|
||||
/* Callbacks */
|
||||
%feature("director") MsrpCallback;
|
||||
|
||||
|
||||
%nodefaultctor;
|
||||
%include "Msrp.h"
|
||||
%clearnodefaultctor;
|
||||
|
||||
/* From tinyMSRP/tmsrp_message.h */
|
||||
typedef enum tmsrp_request_type_e
|
||||
{
|
||||
tmsrp_NONE = 0,
|
||||
|
||||
tmsrp_SEND,
|
||||
tmsrp_REPORT,
|
||||
tmsrp_AUTH
|
||||
//...
|
||||
}
|
||||
tmsrp_request_type_t;
|
||||
|
||||
|
||||
/* From tinyMSRP/tmsrp_event.h */
|
||||
typedef enum tmsrp_event_type_e
|
||||
{
|
||||
tmsrp_event_type_none,
|
||||
tmsrp_event_type_connected,
|
||||
tmsrp_event_type_disconnected,
|
||||
tmsrp_event_type_message,
|
||||
}
|
||||
%{
|
||||
#include "Msrp.h"
|
||||
%}
|
||||
|
||||
/* Callbacks */
|
||||
%feature("director") MsrpCallback;
|
||||
|
||||
|
||||
%nodefaultctor;
|
||||
%include "Msrp.h"
|
||||
%clearnodefaultctor;
|
||||
|
||||
/* From tinyMSRP/tmsrp_message.h */
|
||||
typedef enum tmsrp_request_type_e
|
||||
{
|
||||
tmsrp_NONE = 0,
|
||||
|
||||
tmsrp_SEND,
|
||||
tmsrp_REPORT,
|
||||
tmsrp_AUTH
|
||||
//...
|
||||
}
|
||||
tmsrp_request_type_t;
|
||||
|
||||
|
||||
/* From tinyMSRP/tmsrp_event.h */
|
||||
typedef enum tmsrp_event_type_e
|
||||
{
|
||||
tmsrp_event_type_none,
|
||||
tmsrp_event_type_connected,
|
||||
tmsrp_event_type_disconnected,
|
||||
tmsrp_event_type_message,
|
||||
}
|
||||
tmsrp_event_type_t;
|
File diff suppressed because it is too large
Load Diff
|
@ -1,265 +1,265 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
/**@file ProxyConsumer.h
|
||||
* @brief Audio/Video proxy consumers.
|
||||
*
|
||||
* @author Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*/
|
||||
#ifndef TINYWRAP_CONSUMER_PROXY_H
|
||||
#define TINYWRAP_CONSUMER_PROXY_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "ProxyPluginMgr.h"
|
||||
|
||||
#include "tinymedia/tmedia_common.h"
|
||||
#include "tinymedia/tmedia_consumer.h"
|
||||
|
||||
class AudioResampler;
|
||||
|
||||
/* ============ ProxyAudioConsumerCallback Class ================= */
|
||||
class ProxyAudioConsumerCallback
|
||||
{
|
||||
public:
|
||||
ProxyAudioConsumerCallback() { }
|
||||
virtual ~ProxyAudioConsumerCallback() { }
|
||||
|
||||
virtual int prepare(int ptime, int rate, int channels) {
|
||||
return -1;
|
||||
}
|
||||
virtual int start() {
|
||||
return -1;
|
||||
}
|
||||
virtual int pause() {
|
||||
return -1;
|
||||
}
|
||||
virtual int stop() {
|
||||
return -1;
|
||||
}
|
||||
#if !defined(SWIG)
|
||||
// whether the audio buffer have to be stored in the JB then pulled using "ProxyAudioConsumer::pull()" or not
|
||||
virtual bool putInJitterBuffer() {
|
||||
return true;
|
||||
}
|
||||
// whether we are using the "telepresence" system (PIVOT audio settings must not be changed)
|
||||
virtual bool isPivotSettings() {
|
||||
return false;
|
||||
}
|
||||
// only called if "putInJitterBuffer()" return "true"
|
||||
virtual int consume(const void* buffer_ptr, tsk_size_t buffer_size, const tsk_object_t* proto_hdr) {
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
/* ============ ProxyAudioConsumer Class ================= */
|
||||
class ProxyAudioConsumer : public ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyAudioConsumer(struct twrap_consumer_proxy_audio_s* pConsumer);
|
||||
#endif
|
||||
virtual ~ProxyAudioConsumer();
|
||||
bool setActualSndCardPlaybackParams(int nPtime, int nRate, int nChannels);
|
||||
bool queryForResampler(uint16_t nInFreq, uint16_t nOutFreq, uint16_t nFrameDuration, uint16_t nChannels, uint16_t nResamplerQuality);
|
||||
bool setPullBuffer(const void* pPullBufferPtr, unsigned nPullBufferSize);
|
||||
unsigned pull(void* pOutput=tsk_null, unsigned nSize=0);
|
||||
bool setGain(unsigned nGain);
|
||||
unsigned getGain();
|
||||
bool reset();
|
||||
void setCallback(ProxyAudioConsumerCallback* pCallback) {
|
||||
m_pCallback = pCallback;
|
||||
}
|
||||
#if !defined(SWIG)
|
||||
inline ProxyAudioConsumerCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* pWrappedPlugin) {
|
||||
return m_pWrappedPlugin == pWrappedPlugin;
|
||||
}
|
||||
#endif
|
||||
virtual inline uint64_t getMediaSessionId() {
|
||||
return m_pWrappedPlugin ? TMEDIA_CONSUMER(m_pWrappedPlugin)->session_id : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
static bool registerPlugin();
|
||||
|
||||
private:
|
||||
struct twrap_consumer_proxy_audio_s* m_pWrappedPlugin;
|
||||
ProxyAudioConsumerCallback* m_pCallback;
|
||||
struct {
|
||||
const void* pPullBufferPtr;
|
||||
unsigned nPullBufferSize;
|
||||
} m_PullBuffer;
|
||||
|
||||
struct {
|
||||
void* pInBufferPtr;
|
||||
unsigned nInBufferSizeInByte;
|
||||
AudioResampler* pResampler;
|
||||
} m_Resampler;
|
||||
};
|
||||
|
||||
class ProxyVideoFrame;
|
||||
|
||||
/* ============ ProxyVideoConsumerCallback Class ================= */
|
||||
class ProxyVideoConsumerCallback
|
||||
{
|
||||
public:
|
||||
ProxyVideoConsumerCallback() {}
|
||||
virtual ~ProxyVideoConsumerCallback() {}
|
||||
|
||||
virtual int prepare(int nWidth, int nHeight, int nFps) {
|
||||
return -1;
|
||||
}
|
||||
virtual int consume(const ProxyVideoFrame* frame) {
|
||||
return -1;
|
||||
}
|
||||
// only called if a buffer is registered using setPullBuffer(). Otherwise, consume() will be called
|
||||
virtual int bufferCopied(unsigned nCopiedSize, unsigned nAvailableSize) {
|
||||
return -1;
|
||||
}
|
||||
virtual int start() {
|
||||
return -1;
|
||||
}
|
||||
virtual int pause() {
|
||||
return -1;
|
||||
}
|
||||
virtual int stop() {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
/* ============ ProxyVideoConsumer Class ================= */
|
||||
class ProxyVideoConsumer : public ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyVideoConsumer(tmedia_chroma_t eChroma, struct twrap_consumer_proxy_video_s* pConsumer);
|
||||
#endif
|
||||
virtual ~ProxyVideoConsumer();
|
||||
|
||||
bool setDisplaySize(unsigned nWidth, unsigned nHeight);
|
||||
unsigned getDisplayWidth();
|
||||
unsigned getDisplayHeight();
|
||||
unsigned getDecodedWidth();
|
||||
unsigned getDecodedHeight();
|
||||
|
||||
void setCallback(ProxyVideoConsumerCallback* pCallback) {
|
||||
m_pCallback = pCallback;
|
||||
}
|
||||
bool setAutoResizeDisplay(bool bAutoResizeDisplay);
|
||||
bool getAutoResizeDisplay()const;
|
||||
bool setConsumeBuffer(const void* pConsumeBufferPtr, unsigned nConsumeBufferSize);
|
||||
unsigned pull(void* pOutput, unsigned nSize);
|
||||
bool reset();
|
||||
|
||||
#if !defined(SWIG)
|
||||
bool hasConsumeBuffer()const {
|
||||
return m_ConsumeBuffer.pConsumeBufferPtr && m_ConsumeBuffer.nConsumeBufferSize;
|
||||
}
|
||||
unsigned copyBuffer(const void* pBuffer, unsigned nSize)const;
|
||||
inline ProxyVideoConsumerCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* wrapped_plugin) {
|
||||
return m_pWrappedPlugin == wrapped_plugin;
|
||||
}
|
||||
#endif
|
||||
virtual inline uint64_t getMediaSessionId() {
|
||||
return m_pWrappedPlugin ? TMEDIA_CONSUMER(m_pWrappedPlugin)->session_id : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
static bool registerPlugin();
|
||||
static void setDefaultChroma(tmedia_chroma_t eChroma) {
|
||||
s_eDefaultChroma = eChroma;
|
||||
}
|
||||
static void setDefaultAutoResizeDisplay(bool bAutoResizeDisplay) {
|
||||
s_bAutoResizeDisplay = bAutoResizeDisplay;
|
||||
}
|
||||
|
||||
#if !defined(SWIG)
|
||||
tmedia_chroma_t getChroma()const;
|
||||
static tmedia_chroma_t getDefaultChroma() {
|
||||
return s_eDefaultChroma;
|
||||
}
|
||||
static bool getDefaultAutoResizeDisplay() {
|
||||
return s_bAutoResizeDisplay;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
struct twrap_consumer_proxy_video_s* m_pWrappedPlugin;
|
||||
tmedia_chroma_t m_eChroma;
|
||||
ProxyVideoConsumerCallback* m_pCallback;
|
||||
struct {
|
||||
const void* pConsumeBufferPtr;
|
||||
unsigned nConsumeBufferSize;
|
||||
} m_ConsumeBuffer;
|
||||
bool m_bAutoResizeDisplay;
|
||||
|
||||
static tmedia_chroma_t s_eDefaultChroma;
|
||||
static bool s_bAutoResizeDisplay;
|
||||
};
|
||||
|
||||
/* ============ ProxyVideoFrame Class ================= */
|
||||
class ProxyVideoFrame
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyVideoFrame(const void* pBufferPtr, unsigned nBufferSize, unsigned nFrameWidth, unsigned nFrameHeight, const tsk_object_t* pProtoHdr);
|
||||
#endif
|
||||
virtual ~ProxyVideoFrame();
|
||||
|
||||
public: /* For Java/C# applications */
|
||||
unsigned getSize();
|
||||
unsigned getContent(void* pOutput, unsigned nMaxsize);
|
||||
inline unsigned getFrameWidth()const {
|
||||
return m_nFrameWidth;
|
||||
}
|
||||
inline unsigned getFrameHeight()const {
|
||||
return m_nFrameHeight;
|
||||
}
|
||||
|
||||
#if !defined(SWIG) /* For C/C++ applications */
|
||||
public:
|
||||
inline unsigned getBufferSize()const {
|
||||
return m_nBufferSize;
|
||||
}
|
||||
inline const void* getBufferPtr()const {
|
||||
return m_pBufferPtr;
|
||||
}
|
||||
inline const tsk_object_t* getProtoHdr()const {
|
||||
return m_pProtoHdr;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
const void* m_pBufferPtr;
|
||||
unsigned m_nBufferSize, m_nFrameWidth, m_nFrameHeight;
|
||||
const tsk_object_t* m_pProtoHdr;
|
||||
};
|
||||
|
||||
|
||||
#endif /* TINYWRAP_CONSUMER_PROXY_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
/**@file ProxyConsumer.h
|
||||
* @brief Audio/Video proxy consumers.
|
||||
*
|
||||
* @author Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*/
|
||||
#ifndef TINYWRAP_CONSUMER_PROXY_H
|
||||
#define TINYWRAP_CONSUMER_PROXY_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "ProxyPluginMgr.h"
|
||||
|
||||
#include "tinymedia/tmedia_common.h"
|
||||
#include "tinymedia/tmedia_consumer.h"
|
||||
|
||||
class AudioResampler;
|
||||
|
||||
/* ============ ProxyAudioConsumerCallback Class ================= */
|
||||
class ProxyAudioConsumerCallback
|
||||
{
|
||||
public:
|
||||
ProxyAudioConsumerCallback() { }
|
||||
virtual ~ProxyAudioConsumerCallback() { }
|
||||
|
||||
virtual int prepare(int ptime, int rate, int channels) {
|
||||
return -1;
|
||||
}
|
||||
virtual int start() {
|
||||
return -1;
|
||||
}
|
||||
virtual int pause() {
|
||||
return -1;
|
||||
}
|
||||
virtual int stop() {
|
||||
return -1;
|
||||
}
|
||||
#if !defined(SWIG)
|
||||
// whether the audio buffer have to be stored in the JB then pulled using "ProxyAudioConsumer::pull()" or not
|
||||
virtual bool putInJitterBuffer() {
|
||||
return true;
|
||||
}
|
||||
// whether we are using the "telepresence" system (PIVOT audio settings must not be changed)
|
||||
virtual bool isPivotSettings() {
|
||||
return false;
|
||||
}
|
||||
// only called if "putInJitterBuffer()" return "true"
|
||||
virtual int consume(const void* buffer_ptr, tsk_size_t buffer_size, const tsk_object_t* proto_hdr) {
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
/* ============ ProxyAudioConsumer Class ================= */
|
||||
class ProxyAudioConsumer : public ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyAudioConsumer(struct twrap_consumer_proxy_audio_s* pConsumer);
|
||||
#endif
|
||||
virtual ~ProxyAudioConsumer();
|
||||
bool setActualSndCardPlaybackParams(int nPtime, int nRate, int nChannels);
|
||||
bool queryForResampler(uint16_t nInFreq, uint16_t nOutFreq, uint16_t nFrameDuration, uint16_t nChannels, uint16_t nResamplerQuality);
|
||||
bool setPullBuffer(const void* pPullBufferPtr, unsigned nPullBufferSize);
|
||||
unsigned pull(void* pOutput=tsk_null, unsigned nSize=0);
|
||||
bool setGain(unsigned nGain);
|
||||
unsigned getGain();
|
||||
bool reset();
|
||||
void setCallback(ProxyAudioConsumerCallback* pCallback) {
|
||||
m_pCallback = pCallback;
|
||||
}
|
||||
#if !defined(SWIG)
|
||||
inline ProxyAudioConsumerCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* pWrappedPlugin) {
|
||||
return m_pWrappedPlugin == pWrappedPlugin;
|
||||
}
|
||||
#endif
|
||||
virtual inline uint64_t getMediaSessionId() {
|
||||
return m_pWrappedPlugin ? TMEDIA_CONSUMER(m_pWrappedPlugin)->session_id : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
static bool registerPlugin();
|
||||
|
||||
private:
|
||||
struct twrap_consumer_proxy_audio_s* m_pWrappedPlugin;
|
||||
ProxyAudioConsumerCallback* m_pCallback;
|
||||
struct {
|
||||
const void* pPullBufferPtr;
|
||||
unsigned nPullBufferSize;
|
||||
} m_PullBuffer;
|
||||
|
||||
struct {
|
||||
void* pInBufferPtr;
|
||||
unsigned nInBufferSizeInByte;
|
||||
AudioResampler* pResampler;
|
||||
} m_Resampler;
|
||||
};
|
||||
|
||||
class ProxyVideoFrame;
|
||||
|
||||
/* ============ ProxyVideoConsumerCallback Class ================= */
|
||||
class ProxyVideoConsumerCallback
|
||||
{
|
||||
public:
|
||||
ProxyVideoConsumerCallback() {}
|
||||
virtual ~ProxyVideoConsumerCallback() {}
|
||||
|
||||
virtual int prepare(int nWidth, int nHeight, int nFps) {
|
||||
return -1;
|
||||
}
|
||||
virtual int consume(const ProxyVideoFrame* frame) {
|
||||
return -1;
|
||||
}
|
||||
// only called if a buffer is registered using setPullBuffer(). Otherwise, consume() will be called
|
||||
virtual int bufferCopied(unsigned nCopiedSize, unsigned nAvailableSize) {
|
||||
return -1;
|
||||
}
|
||||
virtual int start() {
|
||||
return -1;
|
||||
}
|
||||
virtual int pause() {
|
||||
return -1;
|
||||
}
|
||||
virtual int stop() {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
/* ============ ProxyVideoConsumer Class ================= */
|
||||
class ProxyVideoConsumer : public ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyVideoConsumer(tmedia_chroma_t eChroma, struct twrap_consumer_proxy_video_s* pConsumer);
|
||||
#endif
|
||||
virtual ~ProxyVideoConsumer();
|
||||
|
||||
bool setDisplaySize(unsigned nWidth, unsigned nHeight);
|
||||
unsigned getDisplayWidth();
|
||||
unsigned getDisplayHeight();
|
||||
unsigned getDecodedWidth();
|
||||
unsigned getDecodedHeight();
|
||||
|
||||
void setCallback(ProxyVideoConsumerCallback* pCallback) {
|
||||
m_pCallback = pCallback;
|
||||
}
|
||||
bool setAutoResizeDisplay(bool bAutoResizeDisplay);
|
||||
bool getAutoResizeDisplay()const;
|
||||
bool setConsumeBuffer(const void* pConsumeBufferPtr, unsigned nConsumeBufferSize);
|
||||
unsigned pull(void* pOutput, unsigned nSize);
|
||||
bool reset();
|
||||
|
||||
#if !defined(SWIG)
|
||||
bool hasConsumeBuffer()const {
|
||||
return m_ConsumeBuffer.pConsumeBufferPtr && m_ConsumeBuffer.nConsumeBufferSize;
|
||||
}
|
||||
unsigned copyBuffer(const void* pBuffer, unsigned nSize)const;
|
||||
inline ProxyVideoConsumerCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* wrapped_plugin) {
|
||||
return m_pWrappedPlugin == wrapped_plugin;
|
||||
}
|
||||
#endif
|
||||
virtual inline uint64_t getMediaSessionId() {
|
||||
return m_pWrappedPlugin ? TMEDIA_CONSUMER(m_pWrappedPlugin)->session_id : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
static bool registerPlugin();
|
||||
static void setDefaultChroma(tmedia_chroma_t eChroma) {
|
||||
s_eDefaultChroma = eChroma;
|
||||
}
|
||||
static void setDefaultAutoResizeDisplay(bool bAutoResizeDisplay) {
|
||||
s_bAutoResizeDisplay = bAutoResizeDisplay;
|
||||
}
|
||||
|
||||
#if !defined(SWIG)
|
||||
tmedia_chroma_t getChroma()const;
|
||||
static tmedia_chroma_t getDefaultChroma() {
|
||||
return s_eDefaultChroma;
|
||||
}
|
||||
static bool getDefaultAutoResizeDisplay() {
|
||||
return s_bAutoResizeDisplay;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
struct twrap_consumer_proxy_video_s* m_pWrappedPlugin;
|
||||
tmedia_chroma_t m_eChroma;
|
||||
ProxyVideoConsumerCallback* m_pCallback;
|
||||
struct {
|
||||
const void* pConsumeBufferPtr;
|
||||
unsigned nConsumeBufferSize;
|
||||
} m_ConsumeBuffer;
|
||||
bool m_bAutoResizeDisplay;
|
||||
|
||||
static tmedia_chroma_t s_eDefaultChroma;
|
||||
static bool s_bAutoResizeDisplay;
|
||||
};
|
||||
|
||||
/* ============ ProxyVideoFrame Class ================= */
|
||||
class ProxyVideoFrame
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyVideoFrame(const void* pBufferPtr, unsigned nBufferSize, unsigned nFrameWidth, unsigned nFrameHeight, const tsk_object_t* pProtoHdr);
|
||||
#endif
|
||||
virtual ~ProxyVideoFrame();
|
||||
|
||||
public: /* For Java/C# applications */
|
||||
unsigned getSize();
|
||||
unsigned getContent(void* pOutput, unsigned nMaxsize);
|
||||
inline unsigned getFrameWidth()const {
|
||||
return m_nFrameWidth;
|
||||
}
|
||||
inline unsigned getFrameHeight()const {
|
||||
return m_nFrameHeight;
|
||||
}
|
||||
|
||||
#if !defined(SWIG) /* For C/C++ applications */
|
||||
public:
|
||||
inline unsigned getBufferSize()const {
|
||||
return m_nBufferSize;
|
||||
}
|
||||
inline const void* getBufferPtr()const {
|
||||
return m_pBufferPtr;
|
||||
}
|
||||
inline const tsk_object_t* getProtoHdr()const {
|
||||
return m_pProtoHdr;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
const void* m_pBufferPtr;
|
||||
unsigned m_nBufferSize, m_nFrameWidth, m_nFrameHeight;
|
||||
const tsk_object_t* m_pProtoHdr;
|
||||
};
|
||||
|
||||
|
||||
#endif /* TINYWRAP_CONSUMER_PROXY_H */
|
||||
|
|
|
@ -1,308 +1,308 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "ProxyPluginMgr.h"
|
||||
|
||||
#include "ProxyConsumer.h"
|
||||
#include "ProxyProducer.h"
|
||||
|
||||
//
|
||||
// "twrap_proxy_plugin_t" Declarations
|
||||
//
|
||||
typedef struct twrap_proxy_plugin_s {
|
||||
TSK_DECLARE_OBJECT;
|
||||
ProxyPlugin* plugin;
|
||||
}
|
||||
twrap_proxy_plugin_t;
|
||||
#define TWRAP_PROXY_PLUGIN(self) ((twrap_proxy_plugin_t*)(self))
|
||||
static int pred_find_plugin_by_value(const tsk_list_item_t *item, const void *proxyPlugin);
|
||||
static twrap_proxy_plugin_t* twrap_proxy_plugin_create(ProxyPlugin** plugin);
|
||||
|
||||
|
||||
//
|
||||
// "ProxyPluginMgr" Class Implementation
|
||||
//
|
||||
ProxyPluginMgr* ProxyPluginMgr::instance = tsk_null;
|
||||
static uint64_t __uniqueId = 0;
|
||||
|
||||
ProxyPluginMgr::ProxyPluginMgr(ProxyPluginMgrCallback* _callback)
|
||||
:callback(_callback)
|
||||
{
|
||||
this->plugins = tsk_list_create();
|
||||
if(!this->callback) {
|
||||
TSK_DEBUG_WARN("Callback function is Null => You will have big problems as we won't check it before call");
|
||||
}
|
||||
}
|
||||
|
||||
ProxyPluginMgr::~ProxyPluginMgr()
|
||||
{
|
||||
if(this == ProxyPluginMgr::instance) {
|
||||
ProxyPluginMgr::instance = tsk_null;
|
||||
}
|
||||
TSK_OBJECT_SAFE_FREE(this->plugins);
|
||||
}
|
||||
|
||||
ProxyPluginMgr* ProxyPluginMgr::createInstance(ProxyPluginMgrCallback* pCallback)
|
||||
{
|
||||
if(!ProxyPluginMgr::instance) {
|
||||
ProxyPluginMgr::instance = new ProxyPluginMgr(pCallback);
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_WARN("Plugin instance already exist");
|
||||
ProxyPluginMgr::instance->callback = pCallback;
|
||||
}
|
||||
return ProxyPluginMgr::instance;
|
||||
}
|
||||
|
||||
void ProxyPluginMgr::destroyInstance(ProxyPluginMgr** ppInstance)
|
||||
{
|
||||
if(ppInstance && *ppInstance) {
|
||||
bool bMatch = ProxyPluginMgr::instance && (*ppInstance == ProxyPluginMgr::instance);
|
||||
delete *ppInstance, *ppInstance = tsk_null;
|
||||
if(bMatch) {
|
||||
ProxyPluginMgr::instance = tsk_null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ProxyPluginMgr* ProxyPluginMgr::getInstance()
|
||||
{
|
||||
if(!ProxyPluginMgr::instance) {
|
||||
TSK_DEBUG_ERROR("No instance of the manager could be found");
|
||||
}
|
||||
return ProxyPluginMgr::instance;
|
||||
}
|
||||
|
||||
uint64_t ProxyPluginMgr::getUniqueId()
|
||||
{
|
||||
return ++__uniqueId;
|
||||
}
|
||||
|
||||
int ProxyPluginMgr::addPlugin(ProxyPlugin** plugin)
|
||||
{
|
||||
twrap_proxy_plugin_t* twrap_plugin;
|
||||
int ret = -1;
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
|
||||
if(!plugin || !*plugin) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if(tsk_list_find_item_by_pred(this->plugins, pred_find_plugin_by_value, *plugin)) {
|
||||
TSK_DEBUG_ERROR("Plugin already exist");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if((twrap_plugin = twrap_proxy_plugin_create(plugin))) {
|
||||
tsk_list_push_back_data(this->plugins, (void**)&twrap_plugin);
|
||||
ret = 0;
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Failed to create plugin");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
bail:
|
||||
tsk_list_unlock(this->plugins);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ProxyPluginMgr::removePlugin(ProxyPlugin** plugin)
|
||||
{
|
||||
if(!plugin || !*plugin) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return -1;
|
||||
}
|
||||
return this->removePlugin((*plugin)->getId());
|
||||
}
|
||||
|
||||
const ProxyPlugin* ProxyPluginMgr::findPlugin(uint64_t id)
|
||||
{
|
||||
ProxyPlugin* ret = tsk_null;
|
||||
|
||||
tsk_list_item_t* item;
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
tsk_list_foreach(item, this->plugins) {
|
||||
if(TWRAP_PROXY_PLUGIN(item->data)->plugin->getId() == id) {
|
||||
ret = TWRAP_PROXY_PLUGIN(item->data)->plugin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tsk_list_unlock(this->plugins);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const ProxyPlugin* ProxyPluginMgr::findPlugin(tsk_object_t* wrapped_plugin)
|
||||
{
|
||||
ProxyPlugin* ret = tsk_null;
|
||||
|
||||
tsk_list_item_t* item;
|
||||
|
||||
if(!wrapped_plugin) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
tsk_list_foreach(item, this->plugins) {
|
||||
if(TWRAP_PROXY_PLUGIN(item->data)->plugin->isWrapping(wrapped_plugin)) {
|
||||
ret = TWRAP_PROXY_PLUGIN(item->data)->plugin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tsk_list_unlock(this->plugins);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ProxyPluginMgr::removePlugin(uint64_t id)
|
||||
{
|
||||
tsk_list_item_t* item;
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
|
||||
tsk_list_foreach(item, this->plugins) {
|
||||
if(TWRAP_PROXY_PLUGIN(item->data)->plugin->getId() == id) {
|
||||
tsk_list_remove_item(this->plugins, item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tsk_list_unlock(this->plugins);
|
||||
return 0;
|
||||
}
|
||||
|
||||
const ProxyAudioConsumer* ProxyPluginMgr::findAudioConsumer(uint64_t id)
|
||||
{
|
||||
const ProxyPlugin* audioConsumer = this->findPlugin(id);
|
||||
if(audioConsumer && audioConsumer->getType() == twrap_proxy_plugin_audio_consumer) {
|
||||
return dyn_cast<const ProxyAudioConsumer*>(audioConsumer);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const ProxyVideoConsumer* ProxyPluginMgr::findVideoConsumer(uint64_t id)
|
||||
{
|
||||
const ProxyPlugin* videoConsumer = this->findPlugin(id);
|
||||
if(videoConsumer && videoConsumer->getType() == twrap_proxy_plugin_video_consumer) {
|
||||
return dyn_cast<const ProxyVideoConsumer*>(videoConsumer);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const ProxyAudioProducer* ProxyPluginMgr::findAudioProducer(uint64_t id)
|
||||
{
|
||||
const ProxyPlugin* audioProducer = this->findPlugin(id);
|
||||
if(audioProducer && audioProducer->getType() == twrap_proxy_plugin_audio_producer) {
|
||||
return dyn_cast<const ProxyAudioProducer*>(audioProducer);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const ProxyVideoProducer* ProxyPluginMgr::findVideoProducer(uint64_t id)
|
||||
{
|
||||
const ProxyPlugin* videoProducer = this->findPlugin(id);
|
||||
if(videoProducer && videoProducer->getType() == twrap_proxy_plugin_video_producer) {
|
||||
return dyn_cast<const ProxyVideoProducer*>(videoProducer);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// "twrap_proxy_plugin_t" Implementations
|
||||
//
|
||||
static tsk_object_t* twrap_proxy_plugin_ctor(tsk_object_t * self, va_list * app)
|
||||
{
|
||||
twrap_proxy_plugin_t *_self = dyn_cast<twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(self));
|
||||
if(_self) {
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
static tsk_object_t* twrap_proxy_plugin_dtor(tsk_object_t * self)
|
||||
{
|
||||
twrap_proxy_plugin_t *_self = dyn_cast<twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(self));
|
||||
if(_self) {
|
||||
if(_self->plugin) {
|
||||
delete _self->plugin, _self->plugin = tsk_null;
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
static int twrap_proxy_plugin_cmp(const tsk_object_t *_c1, const tsk_object_t *_c2)
|
||||
{
|
||||
const twrap_proxy_plugin_t *c1 = dyn_cast<const twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(_c1));
|
||||
const twrap_proxy_plugin_t *c2 = dyn_cast<const twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(_c2));
|
||||
|
||||
if(c1 && c2) {
|
||||
return (c1->plugin == c2->plugin); // See "ProxyPlugin::operator =="
|
||||
}
|
||||
else if(!c1 && !c2) {
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static const tsk_object_def_t twrap_proxy_plugin_def_s = {
|
||||
sizeof(twrap_proxy_plugin_t),
|
||||
twrap_proxy_plugin_ctor,
|
||||
twrap_proxy_plugin_dtor,
|
||||
twrap_proxy_plugin_cmp,
|
||||
};
|
||||
const tsk_object_def_t *twrap_proxy_plugin_def_t = &twrap_proxy_plugin_def_s;
|
||||
|
||||
static int pred_find_plugin_by_value(const tsk_list_item_t *item, const void *proxyPlugin)
|
||||
{
|
||||
if(item && item->data) {
|
||||
const twrap_proxy_plugin_t *twrap_plugin = dyn_cast<const twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(item->data));
|
||||
return (twrap_plugin->plugin == dyn_cast<const ProxyPlugin *>((const ProxyPlugin*)proxyPlugin)) ? 0 : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static twrap_proxy_plugin_t* twrap_proxy_plugin_create(ProxyPlugin** plugin)
|
||||
{
|
||||
if(!plugin || !*plugin) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
twrap_proxy_plugin_t* twrap_plugin = (twrap_proxy_plugin_t*)tsk_object_new(twrap_proxy_plugin_def_t);
|
||||
if(!twrap_plugin) {
|
||||
TSK_DEBUG_ERROR("Failed to create new instance of 'twrap_proxy_plugin_t'");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
twrap_plugin->plugin = *plugin,
|
||||
*plugin = tsk_null;
|
||||
return twrap_plugin;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "ProxyPluginMgr.h"
|
||||
|
||||
#include "ProxyConsumer.h"
|
||||
#include "ProxyProducer.h"
|
||||
|
||||
//
|
||||
// "twrap_proxy_plugin_t" Declarations
|
||||
//
|
||||
typedef struct twrap_proxy_plugin_s {
|
||||
TSK_DECLARE_OBJECT;
|
||||
ProxyPlugin* plugin;
|
||||
}
|
||||
twrap_proxy_plugin_t;
|
||||
#define TWRAP_PROXY_PLUGIN(self) ((twrap_proxy_plugin_t*)(self))
|
||||
static int pred_find_plugin_by_value(const tsk_list_item_t *item, const void *proxyPlugin);
|
||||
static twrap_proxy_plugin_t* twrap_proxy_plugin_create(ProxyPlugin** plugin);
|
||||
|
||||
|
||||
//
|
||||
// "ProxyPluginMgr" Class Implementation
|
||||
//
|
||||
ProxyPluginMgr* ProxyPluginMgr::instance = tsk_null;
|
||||
static uint64_t __uniqueId = 0;
|
||||
|
||||
ProxyPluginMgr::ProxyPluginMgr(ProxyPluginMgrCallback* _callback)
|
||||
:callback(_callback)
|
||||
{
|
||||
this->plugins = tsk_list_create();
|
||||
if(!this->callback) {
|
||||
TSK_DEBUG_WARN("Callback function is Null => You will have big problems as we won't check it before call");
|
||||
}
|
||||
}
|
||||
|
||||
ProxyPluginMgr::~ProxyPluginMgr()
|
||||
{
|
||||
if(this == ProxyPluginMgr::instance) {
|
||||
ProxyPluginMgr::instance = tsk_null;
|
||||
}
|
||||
TSK_OBJECT_SAFE_FREE(this->plugins);
|
||||
}
|
||||
|
||||
ProxyPluginMgr* ProxyPluginMgr::createInstance(ProxyPluginMgrCallback* pCallback)
|
||||
{
|
||||
if(!ProxyPluginMgr::instance) {
|
||||
ProxyPluginMgr::instance = new ProxyPluginMgr(pCallback);
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_WARN("Plugin instance already exist");
|
||||
ProxyPluginMgr::instance->callback = pCallback;
|
||||
}
|
||||
return ProxyPluginMgr::instance;
|
||||
}
|
||||
|
||||
void ProxyPluginMgr::destroyInstance(ProxyPluginMgr** ppInstance)
|
||||
{
|
||||
if(ppInstance && *ppInstance) {
|
||||
bool bMatch = ProxyPluginMgr::instance && (*ppInstance == ProxyPluginMgr::instance);
|
||||
delete *ppInstance, *ppInstance = tsk_null;
|
||||
if(bMatch) {
|
||||
ProxyPluginMgr::instance = tsk_null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ProxyPluginMgr* ProxyPluginMgr::getInstance()
|
||||
{
|
||||
if(!ProxyPluginMgr::instance) {
|
||||
TSK_DEBUG_ERROR("No instance of the manager could be found");
|
||||
}
|
||||
return ProxyPluginMgr::instance;
|
||||
}
|
||||
|
||||
uint64_t ProxyPluginMgr::getUniqueId()
|
||||
{
|
||||
return ++__uniqueId;
|
||||
}
|
||||
|
||||
int ProxyPluginMgr::addPlugin(ProxyPlugin** plugin)
|
||||
{
|
||||
twrap_proxy_plugin_t* twrap_plugin;
|
||||
int ret = -1;
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
|
||||
if(!plugin || !*plugin) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if(tsk_list_find_item_by_pred(this->plugins, pred_find_plugin_by_value, *plugin)) {
|
||||
TSK_DEBUG_ERROR("Plugin already exist");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if((twrap_plugin = twrap_proxy_plugin_create(plugin))) {
|
||||
tsk_list_push_back_data(this->plugins, (void**)&twrap_plugin);
|
||||
ret = 0;
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Failed to create plugin");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
bail:
|
||||
tsk_list_unlock(this->plugins);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ProxyPluginMgr::removePlugin(ProxyPlugin** plugin)
|
||||
{
|
||||
if(!plugin || !*plugin) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return -1;
|
||||
}
|
||||
return this->removePlugin((*plugin)->getId());
|
||||
}
|
||||
|
||||
const ProxyPlugin* ProxyPluginMgr::findPlugin(uint64_t id)
|
||||
{
|
||||
ProxyPlugin* ret = tsk_null;
|
||||
|
||||
tsk_list_item_t* item;
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
tsk_list_foreach(item, this->plugins) {
|
||||
if(TWRAP_PROXY_PLUGIN(item->data)->plugin->getId() == id) {
|
||||
ret = TWRAP_PROXY_PLUGIN(item->data)->plugin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tsk_list_unlock(this->plugins);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const ProxyPlugin* ProxyPluginMgr::findPlugin(tsk_object_t* wrapped_plugin)
|
||||
{
|
||||
ProxyPlugin* ret = tsk_null;
|
||||
|
||||
tsk_list_item_t* item;
|
||||
|
||||
if(!wrapped_plugin) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
tsk_list_foreach(item, this->plugins) {
|
||||
if(TWRAP_PROXY_PLUGIN(item->data)->plugin->isWrapping(wrapped_plugin)) {
|
||||
ret = TWRAP_PROXY_PLUGIN(item->data)->plugin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tsk_list_unlock(this->plugins);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ProxyPluginMgr::removePlugin(uint64_t id)
|
||||
{
|
||||
tsk_list_item_t* item;
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
|
||||
tsk_list_foreach(item, this->plugins) {
|
||||
if(TWRAP_PROXY_PLUGIN(item->data)->plugin->getId() == id) {
|
||||
tsk_list_remove_item(this->plugins, item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tsk_list_unlock(this->plugins);
|
||||
return 0;
|
||||
}
|
||||
|
||||
const ProxyAudioConsumer* ProxyPluginMgr::findAudioConsumer(uint64_t id)
|
||||
{
|
||||
const ProxyPlugin* audioConsumer = this->findPlugin(id);
|
||||
if(audioConsumer && audioConsumer->getType() == twrap_proxy_plugin_audio_consumer) {
|
||||
return dyn_cast<const ProxyAudioConsumer*>(audioConsumer);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const ProxyVideoConsumer* ProxyPluginMgr::findVideoConsumer(uint64_t id)
|
||||
{
|
||||
const ProxyPlugin* videoConsumer = this->findPlugin(id);
|
||||
if(videoConsumer && videoConsumer->getType() == twrap_proxy_plugin_video_consumer) {
|
||||
return dyn_cast<const ProxyVideoConsumer*>(videoConsumer);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const ProxyAudioProducer* ProxyPluginMgr::findAudioProducer(uint64_t id)
|
||||
{
|
||||
const ProxyPlugin* audioProducer = this->findPlugin(id);
|
||||
if(audioProducer && audioProducer->getType() == twrap_proxy_plugin_audio_producer) {
|
||||
return dyn_cast<const ProxyAudioProducer*>(audioProducer);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const ProxyVideoProducer* ProxyPluginMgr::findVideoProducer(uint64_t id)
|
||||
{
|
||||
const ProxyPlugin* videoProducer = this->findPlugin(id);
|
||||
if(videoProducer && videoProducer->getType() == twrap_proxy_plugin_video_producer) {
|
||||
return dyn_cast<const ProxyVideoProducer*>(videoProducer);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// "twrap_proxy_plugin_t" Implementations
|
||||
//
|
||||
static tsk_object_t* twrap_proxy_plugin_ctor(tsk_object_t * self, va_list * app)
|
||||
{
|
||||
twrap_proxy_plugin_t *_self = dyn_cast<twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(self));
|
||||
if(_self) {
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
static tsk_object_t* twrap_proxy_plugin_dtor(tsk_object_t * self)
|
||||
{
|
||||
twrap_proxy_plugin_t *_self = dyn_cast<twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(self));
|
||||
if(_self) {
|
||||
if(_self->plugin) {
|
||||
delete _self->plugin, _self->plugin = tsk_null;
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
static int twrap_proxy_plugin_cmp(const tsk_object_t *_c1, const tsk_object_t *_c2)
|
||||
{
|
||||
const twrap_proxy_plugin_t *c1 = dyn_cast<const twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(_c1));
|
||||
const twrap_proxy_plugin_t *c2 = dyn_cast<const twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(_c2));
|
||||
|
||||
if(c1 && c2) {
|
||||
return (c1->plugin == c2->plugin); // See "ProxyPlugin::operator =="
|
||||
}
|
||||
else if(!c1 && !c2) {
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static const tsk_object_def_t twrap_proxy_plugin_def_s = {
|
||||
sizeof(twrap_proxy_plugin_t),
|
||||
twrap_proxy_plugin_ctor,
|
||||
twrap_proxy_plugin_dtor,
|
||||
twrap_proxy_plugin_cmp,
|
||||
};
|
||||
const tsk_object_def_t *twrap_proxy_plugin_def_t = &twrap_proxy_plugin_def_s;
|
||||
|
||||
static int pred_find_plugin_by_value(const tsk_list_item_t *item, const void *proxyPlugin)
|
||||
{
|
||||
if(item && item->data) {
|
||||
const twrap_proxy_plugin_t *twrap_plugin = dyn_cast<const twrap_proxy_plugin_t *>(TWRAP_PROXY_PLUGIN(item->data));
|
||||
return (twrap_plugin->plugin == dyn_cast<const ProxyPlugin *>((const ProxyPlugin*)proxyPlugin)) ? 0 : -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static twrap_proxy_plugin_t* twrap_proxy_plugin_create(ProxyPlugin** plugin)
|
||||
{
|
||||
if(!plugin || !*plugin) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
twrap_proxy_plugin_t* twrap_plugin = (twrap_proxy_plugin_t*)tsk_object_new(twrap_proxy_plugin_def_t);
|
||||
if(!twrap_plugin) {
|
||||
TSK_DEBUG_ERROR("Failed to create new instance of 'twrap_proxy_plugin_t'");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
twrap_plugin->plugin = *plugin,
|
||||
*plugin = tsk_null;
|
||||
return twrap_plugin;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,137 +1,137 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_PROXY_PLUGIN_MGR_H
|
||||
#define TINYWRAP_PROXY_PLUGIN_MGR_H
|
||||
|
||||
#include "tinymedia.h"
|
||||
#include "Common.h"
|
||||
|
||||
class ProxyPlugin;
|
||||
class ProxyConsumer;
|
||||
class ProxyAudioConsumer;
|
||||
class ProxyVideoConsumer;
|
||||
class ProxyAudioProducer;
|
||||
class ProxyVideoProducer;
|
||||
class ProxyPluginMgrCallback;
|
||||
|
||||
typedef enum twrap_proxy_plugin_type_e {
|
||||
twrap_proxy_plugin_audio_producer,
|
||||
twrap_proxy_plugin_video_producer,
|
||||
twrap_proxy_plugin_audio_consumer,
|
||||
twrap_proxy_plugin_video_consumer,
|
||||
}
|
||||
twrap_proxy_plugin_type_t;
|
||||
|
||||
/* ============ ProxyPluginMgr Class ================= */
|
||||
|
||||
typedef tsk_list_t twrap_proxy_plungins_L_t; // contains "twrap_proxy_plungin_t" elements
|
||||
|
||||
class ProxyPluginMgr
|
||||
{
|
||||
private:
|
||||
ProxyPluginMgr(ProxyPluginMgrCallback* callback);
|
||||
public:
|
||||
virtual ~ProxyPluginMgr();
|
||||
|
||||
// SWIG %newobject
|
||||
static ProxyPluginMgr* createInstance(ProxyPluginMgrCallback* pCallback);
|
||||
#if !defined(SWIG)
|
||||
static void destroyInstance(ProxyPluginMgr** ppInstance);
|
||||
#endif
|
||||
static ProxyPluginMgr* getInstance();
|
||||
|
||||
#if !defined(SWIG)
|
||||
static uint64_t getUniqueId();
|
||||
|
||||
int addPlugin(ProxyPlugin**);
|
||||
const ProxyPlugin* findPlugin(tsk_object_t* wrapped_plugin);
|
||||
int removePlugin(uint64_t id);
|
||||
int removePlugin(ProxyPlugin**);
|
||||
|
||||
inline ProxyPluginMgrCallback* getCallback() {
|
||||
return this->callback;
|
||||
}
|
||||
#endif
|
||||
|
||||
const ProxyPlugin* findPlugin(uint64_t id);
|
||||
|
||||
const ProxyAudioConsumer* findAudioConsumer(uint64_t id);
|
||||
const ProxyVideoConsumer* findVideoConsumer(uint64_t id);
|
||||
const ProxyAudioProducer* findAudioProducer(uint64_t id);
|
||||
const ProxyVideoProducer* findVideoProducer(uint64_t id);
|
||||
|
||||
private:
|
||||
static ProxyPluginMgr* instance;
|
||||
ProxyPluginMgrCallback* callback;
|
||||
|
||||
twrap_proxy_plungins_L_t* plugins;
|
||||
};
|
||||
|
||||
|
||||
/* ============ ProxyPluginMgrCallback Class ================= */
|
||||
class ProxyPluginMgrCallback
|
||||
{
|
||||
public:
|
||||
ProxyPluginMgrCallback() { }
|
||||
virtual ~ProxyPluginMgrCallback() { }
|
||||
|
||||
virtual int OnPluginCreated(uint64_t id, enum twrap_proxy_plugin_type_e type) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnPluginDestroyed(uint64_t id, enum twrap_proxy_plugin_type_e type) {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
/* ============ ProxyPlugin Class ================= */
|
||||
class ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined SWIG
|
||||
ProxyPlugin(twrap_proxy_plugin_type_t _type) {
|
||||
this->type=_type;
|
||||
this->id = ProxyPluginMgr::getUniqueId();
|
||||
}
|
||||
#endif
|
||||
virtual ~ProxyPlugin() {}
|
||||
|
||||
#if !defined(SWIG)
|
||||
virtual bool operator ==(const ProxyPlugin &plugin)const {
|
||||
return this->getId() == plugin.getId();
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* wrapped_plugin) = 0;
|
||||
virtual inline uint64_t getMediaSessionId() = 0;
|
||||
#endif
|
||||
|
||||
inline twrap_proxy_plugin_type_t getType()const {
|
||||
return this->type;
|
||||
}
|
||||
inline uint64_t getId()const {
|
||||
return this->id;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64_t id;
|
||||
twrap_proxy_plugin_type_t type;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_PROXY_PLUGIN_MGR_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_PROXY_PLUGIN_MGR_H
|
||||
#define TINYWRAP_PROXY_PLUGIN_MGR_H
|
||||
|
||||
#include "tinymedia.h"
|
||||
#include "Common.h"
|
||||
|
||||
class ProxyPlugin;
|
||||
class ProxyConsumer;
|
||||
class ProxyAudioConsumer;
|
||||
class ProxyVideoConsumer;
|
||||
class ProxyAudioProducer;
|
||||
class ProxyVideoProducer;
|
||||
class ProxyPluginMgrCallback;
|
||||
|
||||
typedef enum twrap_proxy_plugin_type_e {
|
||||
twrap_proxy_plugin_audio_producer,
|
||||
twrap_proxy_plugin_video_producer,
|
||||
twrap_proxy_plugin_audio_consumer,
|
||||
twrap_proxy_plugin_video_consumer,
|
||||
}
|
||||
twrap_proxy_plugin_type_t;
|
||||
|
||||
/* ============ ProxyPluginMgr Class ================= */
|
||||
|
||||
typedef tsk_list_t twrap_proxy_plungins_L_t; // contains "twrap_proxy_plungin_t" elements
|
||||
|
||||
class ProxyPluginMgr
|
||||
{
|
||||
private:
|
||||
ProxyPluginMgr(ProxyPluginMgrCallback* callback);
|
||||
public:
|
||||
virtual ~ProxyPluginMgr();
|
||||
|
||||
// SWIG %newobject
|
||||
static ProxyPluginMgr* createInstance(ProxyPluginMgrCallback* pCallback);
|
||||
#if !defined(SWIG)
|
||||
static void destroyInstance(ProxyPluginMgr** ppInstance);
|
||||
#endif
|
||||
static ProxyPluginMgr* getInstance();
|
||||
|
||||
#if !defined(SWIG)
|
||||
static uint64_t getUniqueId();
|
||||
|
||||
int addPlugin(ProxyPlugin**);
|
||||
const ProxyPlugin* findPlugin(tsk_object_t* wrapped_plugin);
|
||||
int removePlugin(uint64_t id);
|
||||
int removePlugin(ProxyPlugin**);
|
||||
|
||||
inline ProxyPluginMgrCallback* getCallback() {
|
||||
return this->callback;
|
||||
}
|
||||
#endif
|
||||
|
||||
const ProxyPlugin* findPlugin(uint64_t id);
|
||||
|
||||
const ProxyAudioConsumer* findAudioConsumer(uint64_t id);
|
||||
const ProxyVideoConsumer* findVideoConsumer(uint64_t id);
|
||||
const ProxyAudioProducer* findAudioProducer(uint64_t id);
|
||||
const ProxyVideoProducer* findVideoProducer(uint64_t id);
|
||||
|
||||
private:
|
||||
static ProxyPluginMgr* instance;
|
||||
ProxyPluginMgrCallback* callback;
|
||||
|
||||
twrap_proxy_plungins_L_t* plugins;
|
||||
};
|
||||
|
||||
|
||||
/* ============ ProxyPluginMgrCallback Class ================= */
|
||||
class ProxyPluginMgrCallback
|
||||
{
|
||||
public:
|
||||
ProxyPluginMgrCallback() { }
|
||||
virtual ~ProxyPluginMgrCallback() { }
|
||||
|
||||
virtual int OnPluginCreated(uint64_t id, enum twrap_proxy_plugin_type_e type) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnPluginDestroyed(uint64_t id, enum twrap_proxy_plugin_type_e type) {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
/* ============ ProxyPlugin Class ================= */
|
||||
class ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined SWIG
|
||||
ProxyPlugin(twrap_proxy_plugin_type_t _type) {
|
||||
this->type=_type;
|
||||
this->id = ProxyPluginMgr::getUniqueId();
|
||||
}
|
||||
#endif
|
||||
virtual ~ProxyPlugin() {}
|
||||
|
||||
#if !defined(SWIG)
|
||||
virtual bool operator ==(const ProxyPlugin &plugin)const {
|
||||
return this->getId() == plugin.getId();
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* wrapped_plugin) = 0;
|
||||
virtual inline uint64_t getMediaSessionId() = 0;
|
||||
#endif
|
||||
|
||||
inline twrap_proxy_plugin_type_t getType()const {
|
||||
return this->type;
|
||||
}
|
||||
inline uint64_t getId()const {
|
||||
return this->id;
|
||||
}
|
||||
|
||||
protected:
|
||||
uint64_t id;
|
||||
twrap_proxy_plugin_type_t type;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_PROXY_PLUGIN_MGR_H */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,200 +1,200 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
/**@file ProxyProducer.h
|
||||
* @brief Audio/Video proxy consumers.
|
||||
*
|
||||
* @author Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
|
||||
*/
|
||||
#ifndef TINYWRAP_PRODUCER_PROXY_H
|
||||
#define TINYWRAP_PRODUCER_PROXY_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "ProxyPluginMgr.h"
|
||||
|
||||
#include "tinymedia/tmedia_common.h"
|
||||
#include "tinymedia/tmedia_producer.h"
|
||||
|
||||
/* ============ ProxyAudioProducerCallback Class ================= */
|
||||
class ProxyAudioProducerCallback
|
||||
{
|
||||
public:
|
||||
ProxyAudioProducerCallback() { }
|
||||
virtual ~ProxyAudioProducerCallback() { }
|
||||
|
||||
virtual int prepare(int ptime, int rate, int channels) {
|
||||
return -1;
|
||||
}
|
||||
virtual int start() {
|
||||
return -1;
|
||||
}
|
||||
virtual int pause() {
|
||||
return -1;
|
||||
}
|
||||
virtual int stop() {
|
||||
return -1;
|
||||
}
|
||||
// this function is called to signal that it's time to copy push data
|
||||
virtual int fillPushBuffer() {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* ============ ProxyAudioProducer Class ================= */
|
||||
class ProxyAudioProducer : public ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyAudioProducer(struct twrap_producer_proxy_audio_s* pProducer);
|
||||
#endif
|
||||
virtual ~ProxyAudioProducer();
|
||||
|
||||
bool setActualSndCardRecordParams(int nPtime, int nRate, int nChannels);
|
||||
bool setPushBuffer(const void* pPushBufferPtr, unsigned nPushBufferSize, bool bUsePushCallback=false);
|
||||
int push(const void* pBuffer=tsk_null, unsigned nSize=0);
|
||||
bool setGain(unsigned nGain);
|
||||
unsigned getGain();
|
||||
void setCallback(ProxyAudioProducerCallback* pCallback) {
|
||||
m_pCallback = pCallback;
|
||||
}
|
||||
#if !defined(SWIG)
|
||||
inline bool usePushCallback() {
|
||||
return m_bUsePushCallback;
|
||||
}
|
||||
inline ProxyAudioProducerCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* pWrappedPlugin) {
|
||||
return m_pWrappedPlugin == pWrappedPlugin;
|
||||
}
|
||||
#endif
|
||||
virtual inline uint64_t getMediaSessionId() {
|
||||
return m_pWrappedPlugin ? TMEDIA_PRODUCER(m_pWrappedPlugin)->session_id : 0;
|
||||
}
|
||||
|
||||
#if !defined(SWIG)
|
||||
public:
|
||||
bool startPushCallback();
|
||||
bool stopPushCallback();
|
||||
private:
|
||||
static int pushTimerCallback(const void* arg, tsk_timer_id_t timer_id);
|
||||
#endif
|
||||
|
||||
public:
|
||||
static bool registerPlugin();
|
||||
|
||||
private:
|
||||
struct twrap_producer_proxy_audio_s* m_pWrappedPlugin;
|
||||
ProxyAudioProducerCallback* m_pCallback;
|
||||
struct {
|
||||
const void* pPushBufferPtr;
|
||||
unsigned nPushBufferSize;
|
||||
} m_PushBuffer;
|
||||
bool m_bUsePushCallback;
|
||||
void* m_hPushTimerMgr;
|
||||
uint64_t m_uPushTimer;
|
||||
};
|
||||
|
||||
/* ============ ProxyVideoProducerCallback Class ================= */
|
||||
class ProxyVideoProducerCallback
|
||||
{
|
||||
public:
|
||||
ProxyVideoProducerCallback() { }
|
||||
virtual ~ProxyVideoProducerCallback() { }
|
||||
|
||||
virtual int prepare(int width, int height, int fps) {
|
||||
return -1;
|
||||
}
|
||||
virtual int start() {
|
||||
return -1;
|
||||
}
|
||||
virtual int pause() {
|
||||
return -1;
|
||||
}
|
||||
virtual int stop() {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
/* ============ ProxyVideoProducer Class ================= */
|
||||
class ProxyVideoProducer : public ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyVideoProducer(tmedia_chroma_t eChroma, struct twrap_producer_proxy_video_s* pProducer);
|
||||
#endif
|
||||
virtual ~ProxyVideoProducer();
|
||||
|
||||
int getRotation()const;
|
||||
bool setRotation(int nRot);
|
||||
bool getMirror()const;
|
||||
bool setMirror(bool bMirror);
|
||||
bool setActualCameraOutputSize(unsigned nWidth, unsigned nHeight);
|
||||
int push(const void* pBuffer, unsigned nSize);
|
||||
void setCallback(ProxyVideoProducerCallback* pCallback) {
|
||||
m_pCallback = pCallback;
|
||||
}
|
||||
#if !defined(SWIG)
|
||||
int sendRaw(const void* pBuffer, unsigned nSize, unsigned nDuration, bool bMarker);
|
||||
int sendRaw(const void* pBuffer, unsigned nSize, const void* proto_hdr);
|
||||
inline ProxyVideoProducerCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* wrapped_plugin) {
|
||||
return m_pWrappedPlugin == wrapped_plugin;
|
||||
}
|
||||
virtual inline const tmedia_producer_t* getWrappedPlugin()const {
|
||||
return (tmedia_producer_t*)m_pWrappedPlugin;
|
||||
}
|
||||
#endif
|
||||
virtual inline uint64_t getMediaSessionId() {
|
||||
return m_pWrappedPlugin ? TMEDIA_PRODUCER(m_pWrappedPlugin)->session_id : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
static bool registerPlugin();
|
||||
static void setDefaultChroma(tmedia_chroma_t eChroma) {
|
||||
s_eDefaultChroma = eChroma;
|
||||
}
|
||||
|
||||
#if !defined(SWIG)
|
||||
tmedia_chroma_t getChroma()const;
|
||||
static tmedia_chroma_t getDefaultChroma() {
|
||||
return s_eDefaultChroma;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
struct twrap_producer_proxy_video_s* m_pWrappedPlugin;
|
||||
ProxyVideoProducerCallback* m_pCallback;
|
||||
tmedia_chroma_t m_eChroma;
|
||||
int m_nRotation;
|
||||
bool m_bMirror;
|
||||
|
||||
static tmedia_chroma_t s_eDefaultChroma;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_PRODUCER_PROXY_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
/**@file ProxyProducer.h
|
||||
* @brief Audio/Video proxy consumers.
|
||||
*
|
||||
* @author Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
|
||||
*/
|
||||
#ifndef TINYWRAP_PRODUCER_PROXY_H
|
||||
#define TINYWRAP_PRODUCER_PROXY_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "ProxyPluginMgr.h"
|
||||
|
||||
#include "tinymedia/tmedia_common.h"
|
||||
#include "tinymedia/tmedia_producer.h"
|
||||
|
||||
/* ============ ProxyAudioProducerCallback Class ================= */
|
||||
class ProxyAudioProducerCallback
|
||||
{
|
||||
public:
|
||||
ProxyAudioProducerCallback() { }
|
||||
virtual ~ProxyAudioProducerCallback() { }
|
||||
|
||||
virtual int prepare(int ptime, int rate, int channels) {
|
||||
return -1;
|
||||
}
|
||||
virtual int start() {
|
||||
return -1;
|
||||
}
|
||||
virtual int pause() {
|
||||
return -1;
|
||||
}
|
||||
virtual int stop() {
|
||||
return -1;
|
||||
}
|
||||
// this function is called to signal that it's time to copy push data
|
||||
virtual int fillPushBuffer() {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* ============ ProxyAudioProducer Class ================= */
|
||||
class ProxyAudioProducer : public ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyAudioProducer(struct twrap_producer_proxy_audio_s* pProducer);
|
||||
#endif
|
||||
virtual ~ProxyAudioProducer();
|
||||
|
||||
bool setActualSndCardRecordParams(int nPtime, int nRate, int nChannels);
|
||||
bool setPushBuffer(const void* pPushBufferPtr, unsigned nPushBufferSize, bool bUsePushCallback=false);
|
||||
int push(const void* pBuffer=tsk_null, unsigned nSize=0);
|
||||
bool setGain(unsigned nGain);
|
||||
unsigned getGain();
|
||||
void setCallback(ProxyAudioProducerCallback* pCallback) {
|
||||
m_pCallback = pCallback;
|
||||
}
|
||||
#if !defined(SWIG)
|
||||
inline bool usePushCallback() {
|
||||
return m_bUsePushCallback;
|
||||
}
|
||||
inline ProxyAudioProducerCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* pWrappedPlugin) {
|
||||
return m_pWrappedPlugin == pWrappedPlugin;
|
||||
}
|
||||
#endif
|
||||
virtual inline uint64_t getMediaSessionId() {
|
||||
return m_pWrappedPlugin ? TMEDIA_PRODUCER(m_pWrappedPlugin)->session_id : 0;
|
||||
}
|
||||
|
||||
#if !defined(SWIG)
|
||||
public:
|
||||
bool startPushCallback();
|
||||
bool stopPushCallback();
|
||||
private:
|
||||
static int pushTimerCallback(const void* arg, tsk_timer_id_t timer_id);
|
||||
#endif
|
||||
|
||||
public:
|
||||
static bool registerPlugin();
|
||||
|
||||
private:
|
||||
struct twrap_producer_proxy_audio_s* m_pWrappedPlugin;
|
||||
ProxyAudioProducerCallback* m_pCallback;
|
||||
struct {
|
||||
const void* pPushBufferPtr;
|
||||
unsigned nPushBufferSize;
|
||||
} m_PushBuffer;
|
||||
bool m_bUsePushCallback;
|
||||
void* m_hPushTimerMgr;
|
||||
uint64_t m_uPushTimer;
|
||||
};
|
||||
|
||||
/* ============ ProxyVideoProducerCallback Class ================= */
|
||||
class ProxyVideoProducerCallback
|
||||
{
|
||||
public:
|
||||
ProxyVideoProducerCallback() { }
|
||||
virtual ~ProxyVideoProducerCallback() { }
|
||||
|
||||
virtual int prepare(int width, int height, int fps) {
|
||||
return -1;
|
||||
}
|
||||
virtual int start() {
|
||||
return -1;
|
||||
}
|
||||
virtual int pause() {
|
||||
return -1;
|
||||
}
|
||||
virtual int stop() {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
/* ============ ProxyVideoProducer Class ================= */
|
||||
class ProxyVideoProducer : public ProxyPlugin
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
ProxyVideoProducer(tmedia_chroma_t eChroma, struct twrap_producer_proxy_video_s* pProducer);
|
||||
#endif
|
||||
virtual ~ProxyVideoProducer();
|
||||
|
||||
int getRotation()const;
|
||||
bool setRotation(int nRot);
|
||||
bool getMirror()const;
|
||||
bool setMirror(bool bMirror);
|
||||
bool setActualCameraOutputSize(unsigned nWidth, unsigned nHeight);
|
||||
int push(const void* pBuffer, unsigned nSize);
|
||||
void setCallback(ProxyVideoProducerCallback* pCallback) {
|
||||
m_pCallback = pCallback;
|
||||
}
|
||||
#if !defined(SWIG)
|
||||
int sendRaw(const void* pBuffer, unsigned nSize, unsigned nDuration, bool bMarker);
|
||||
int sendRaw(const void* pBuffer, unsigned nSize, const void* proto_hdr);
|
||||
inline ProxyVideoProducerCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
virtual inline bool isWrapping(tsk_object_t* wrapped_plugin) {
|
||||
return m_pWrappedPlugin == wrapped_plugin;
|
||||
}
|
||||
virtual inline const tmedia_producer_t* getWrappedPlugin()const {
|
||||
return (tmedia_producer_t*)m_pWrappedPlugin;
|
||||
}
|
||||
#endif
|
||||
virtual inline uint64_t getMediaSessionId() {
|
||||
return m_pWrappedPlugin ? TMEDIA_PRODUCER(m_pWrappedPlugin)->session_id : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
static bool registerPlugin();
|
||||
static void setDefaultChroma(tmedia_chroma_t eChroma) {
|
||||
s_eDefaultChroma = eChroma;
|
||||
}
|
||||
|
||||
#if !defined(SWIG)
|
||||
tmedia_chroma_t getChroma()const;
|
||||
static tmedia_chroma_t getDefaultChroma() {
|
||||
return s_eDefaultChroma;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
struct twrap_producer_proxy_video_s* m_pWrappedPlugin;
|
||||
ProxyVideoProducerCallback* m_pCallback;
|
||||
tmedia_chroma_t m_eChroma;
|
||||
int m_nRotation;
|
||||
bool m_bMirror;
|
||||
|
||||
static tmedia_chroma_t s_eDefaultChroma;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_PRODUCER_PROXY_H */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
%{
|
||||
#include "SMSEncoder.h"
|
||||
%}
|
||||
|
||||
%nodefaultctor;
|
||||
%include "SMSEncoder.h"
|
||||
%{
|
||||
#include "SMSEncoder.h"
|
||||
%}
|
||||
|
||||
%nodefaultctor;
|
||||
%include "SMSEncoder.h"
|
||||
%clearnodefaultctor;
|
|
@ -1,371 +1,371 @@
|
|||
/*
|
||||
* Copyright (C) 2009 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou@doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SMSEncoder.h"
|
||||
|
||||
// Short description: http://betelco.blogspot.com/2009/10/sms-over-3gpp-ims-network.html
|
||||
|
||||
|
||||
RPMessage::RPMessage(twrap_rpmessage_type_t _type, tsms_rpdu_message_t* _rp_message)
|
||||
{
|
||||
this->rp_message = (tsms_rpdu_message_t*)tsk_object_ref(_rp_message);
|
||||
this->type = _type;
|
||||
this->tmpBuffer = tsk_null;
|
||||
}
|
||||
|
||||
RPMessage::RPMessage() :
|
||||
rp_message(tsk_null),
|
||||
type(twrap_rpmessage_type_sms_none),
|
||||
tmpBuffer(tsk_null)
|
||||
{
|
||||
}
|
||||
|
||||
twrap_rpmessage_type_t RPMessage::getType()
|
||||
{
|
||||
return this->type;
|
||||
}
|
||||
|
||||
unsigned RPMessage::getPayloadLength()
|
||||
{
|
||||
if(!this->tmpBuffer) {
|
||||
if((this->tmpBuffer = tsk_buffer_create_null())) {
|
||||
tsms_rpdu_data_serialize(this->rp_message, this->tmpBuffer);
|
||||
}
|
||||
}
|
||||
return this->tmpBuffer ? this->tmpBuffer->size : 0;
|
||||
}
|
||||
|
||||
unsigned RPMessage::getPayload(void* output, unsigned maxsize)
|
||||
{
|
||||
unsigned retsize = 0;
|
||||
|
||||
if(!this->tmpBuffer) {
|
||||
if((this->tmpBuffer = tsk_buffer_create_null())) {
|
||||
tsms_rpdu_message_serialize(this->rp_message, this->tmpBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
if(output && maxsize && this->tmpBuffer && this->tmpBuffer->data) {
|
||||
retsize = (this->tmpBuffer->size > maxsize) ? maxsize : this->tmpBuffer->size;
|
||||
memcpy(output, this->tmpBuffer->data, retsize);
|
||||
}
|
||||
return retsize;
|
||||
}
|
||||
|
||||
RPMessage::~RPMessage()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(this->rp_message);
|
||||
TSK_OBJECT_SAFE_FREE(this->tmpBuffer);
|
||||
}
|
||||
|
||||
|
||||
SMSData::SMSData(twrap_sms_type_t _type, int _mr, const void* _ascii, tsk_size_t _size): oa(tsk_null), da(tsk_null)
|
||||
{
|
||||
this->type = _type;
|
||||
this->mr = _mr;
|
||||
if((this->size = _size)) {
|
||||
if((this->ascii = tsk_calloc(size+1, 1))) {
|
||||
memcpy(this->ascii, _ascii, _size);
|
||||
}
|
||||
}
|
||||
else {
|
||||
this->ascii = tsk_null;
|
||||
}
|
||||
}
|
||||
|
||||
SMSData::SMSData(): oa(tsk_null), da(tsk_null)
|
||||
{
|
||||
this->type = twrap_sms_type_none;
|
||||
this->mr = 0;
|
||||
this->size = 0;
|
||||
this->ascii = tsk_null;
|
||||
}
|
||||
|
||||
SMSData::~SMSData()
|
||||
{
|
||||
TSK_FREE(this->ascii);
|
||||
TSK_FREE(this->oa);
|
||||
TSK_FREE(this->da);
|
||||
}
|
||||
|
||||
twrap_sms_type_t SMSData::getType()
|
||||
{
|
||||
return this->type;
|
||||
}
|
||||
|
||||
int SMSData::getMR()
|
||||
{
|
||||
return this->mr;
|
||||
}
|
||||
|
||||
unsigned SMSData::getPayloadLength()
|
||||
{
|
||||
return this->size;
|
||||
}
|
||||
|
||||
unsigned SMSData::getPayload(void* output, unsigned maxsize)
|
||||
{
|
||||
unsigned retsize = 0;
|
||||
|
||||
if(output && maxsize && this->ascii) {
|
||||
retsize = (this->size > maxsize) ? maxsize : this->size;
|
||||
memcpy(output, this->ascii, retsize);
|
||||
}
|
||||
return retsize;
|
||||
}
|
||||
|
||||
const char* SMSData::getOA()
|
||||
{
|
||||
return this->oa;
|
||||
}
|
||||
|
||||
const char* SMSData::getDA()
|
||||
{
|
||||
return this->da;
|
||||
}
|
||||
|
||||
void SMSData::setOA(const char* _oa)
|
||||
{
|
||||
TSK_FREE(this->oa);
|
||||
this->oa = tsk_strdup(_oa);
|
||||
}
|
||||
|
||||
void SMSData::setDA(const char* _da)
|
||||
{
|
||||
TSK_FREE(this->da);
|
||||
this->da = tsk_strdup(_da);
|
||||
}
|
||||
|
||||
|
||||
// More information about RP-DATA: http://www.doubango.org/API/tinySMS/group__tsms__rpdu__group.html#tsms_rpdu_group_DATA
|
||||
RPMessage* SMSEncoder::encodeSubmit(int mr, const char *smsc, const char *destination, const char *ascii)
|
||||
{
|
||||
int ret;
|
||||
tsk_buffer_t* buffer = tsk_null;
|
||||
tsms_tpdu_submit_t* sms_submit = tsk_null;
|
||||
tsms_rpdu_data_t* rp_data = tsk_null;
|
||||
|
||||
RPMessage* encodedData = tsk_null;
|
||||
|
||||
if(!smsc || ! destination || !ascii) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
if(mr<0 || mr>0xFF) {
|
||||
TSK_DEBUG_WARN("Invalid Message Reference");
|
||||
mr &= 0xFF;
|
||||
}
|
||||
|
||||
// create SMS-SUBMIT message
|
||||
if(!(sms_submit = tsms_tpdu_submit_create(mr, (const uint8_t*)smsc, (const uint8_t*)destination))) {
|
||||
TSK_DEBUG_ERROR("Failed to create the TPDU SMS-SUBMIT message");
|
||||
goto bail;
|
||||
}
|
||||
// Set content for SMS-SUBMIT
|
||||
if((buffer = tsms_pack_to_7bit(ascii))) {
|
||||
ret = tsms_tpdu_submit_set_userdata(sms_submit, buffer, tsms_alpha_7bit);
|
||||
TSK_OBJECT_SAFE_FREE(buffer);
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Failed to encode the TPDU SMS-SUBMIT message");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
// create RP-DATA(SMS-SUBMIT)
|
||||
if((rp_data = tsms_rpdu_data_create_mo(mr, (const uint8_t*)smsc, TSMS_TPDU_MESSAGE(sms_submit)))) {
|
||||
encodedData = new RPMessage(twrap_rpmessage_type_sms_submit, TSMS_RPDU_MESSAGE(rp_data));
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Failed to create the RP-DATA(SMS-SUBMIT) message");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
bail:
|
||||
TSK_OBJECT_SAFE_FREE(buffer);
|
||||
TSK_OBJECT_SAFE_FREE(sms_submit);
|
||||
TSK_OBJECT_SAFE_FREE(rp_data);
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
// More information about RP-DATA: http://www.doubango.org/API/tinySMS/group__tsms__rpdu__group.html#tsms_rpdu_group_DATA
|
||||
RPMessage* SMSEncoder::encodeDeliver(int mr, const char* smsc, const char* originator, const char* ascii)
|
||||
{
|
||||
int ret;
|
||||
tsk_buffer_t* buffer = tsk_null;
|
||||
tsms_tpdu_deliver_t* sms_deliver = tsk_null;
|
||||
tsms_rpdu_data_t* rp_data = tsk_null;
|
||||
|
||||
RPMessage* encodedData = tsk_null;
|
||||
|
||||
if(!smsc || ! originator || !ascii) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
if(mr<0 || mr>0xFF) {
|
||||
TSK_DEBUG_WARN("Invalid Message Reference");
|
||||
mr &= 0xFF;
|
||||
}
|
||||
|
||||
// create SMS-DELIVER message
|
||||
sms_deliver = tsms_tpdu_deliver_create((const uint8_t*)smsc, (const uint8_t*)originator);
|
||||
// Set content for SMS-DELIVER
|
||||
if((buffer = tsms_pack_to_7bit(ascii))) {
|
||||
ret = tsms_tpdu_deliver_set_userdata(sms_deliver, buffer, tsms_alpha_7bit);
|
||||
TSK_OBJECT_SAFE_FREE(buffer);
|
||||
}
|
||||
// create RP-DATA message
|
||||
if((rp_data = tsms_rpdu_data_create_mt(mr, (const uint8_t*)smsc, TSMS_TPDU_MESSAGE(sms_deliver)))) {
|
||||
encodedData = new RPMessage(twrap_rpmessage_type_sms_deliver, TSMS_RPDU_MESSAGE(rp_data));
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Failed to create the RP-DATA(SMS-DELIVER) message");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
bail:
|
||||
TSK_OBJECT_SAFE_FREE(buffer);
|
||||
TSK_OBJECT_SAFE_FREE(sms_deliver);
|
||||
TSK_OBJECT_SAFE_FREE(rp_data);
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
RPMessage* SMSEncoder::encodeACK(int mr, const char* smsc, const char* destination, bool forSUBMIT)
|
||||
{
|
||||
tsms_tpdu_report_t* sms_report = tsk_null;
|
||||
tsms_rpdu_ack_t* rp_ack = tsk_null;
|
||||
tsk_bool_t isSUBMIT = forSUBMIT ? tsk_true : tsk_false;
|
||||
tsk_bool_t isERROR = tsk_false;
|
||||
|
||||
RPMessage* encodedData = tsk_null;
|
||||
|
||||
// create SMS-DELIVER(or SUBMIT)-REPORT message
|
||||
sms_report = tsms_tpdu_report_create((const uint8_t*)smsc, isSUBMIT, isERROR);
|
||||
// create RP-ACK message (From MS to SC)
|
||||
if((rp_ack = tsms_rpdu_ack_create_mo(mr, TSMS_TPDU_MESSAGE(sms_report)))) {
|
||||
encodedData = new RPMessage(twrap_rpmessage_type_sms_ack, TSMS_RPDU_MESSAGE(rp_ack));
|
||||
}
|
||||
|
||||
TSK_OBJECT_SAFE_FREE(sms_report);
|
||||
TSK_OBJECT_SAFE_FREE(rp_ack);
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
RPMessage* SMSEncoder::encodeError(int mr, const char* smsc, const char* destination, bool forSUBMIT)
|
||||
{
|
||||
tsms_tpdu_report_t* sms_report = tsk_null;
|
||||
tsms_rpdu_error_t* rp_error= tsk_null;
|
||||
tsk_bool_t isSUBMIT = forSUBMIT ? tsk_true : tsk_false;
|
||||
tsk_bool_t isERROR = tsk_true;
|
||||
|
||||
RPMessage* encodedData = tsk_null;
|
||||
|
||||
// create SMS-DELIVER-REPORT message
|
||||
sms_report = tsms_tpdu_report_create((const uint8_t*)smsc, isSUBMIT, isERROR);
|
||||
// create RP-ERROR message
|
||||
if((rp_error = tsms_rpdu_error_create_mo(mr, TSMS_TPDU_MESSAGE(sms_report), 0x0A/*call barred*/))) {
|
||||
encodedData = new RPMessage(twrap_rpmessage_type_sms_error, TSMS_RPDU_MESSAGE(rp_error));
|
||||
}
|
||||
|
||||
TSK_OBJECT_SAFE_FREE(sms_report);
|
||||
TSK_OBJECT_SAFE_FREE(rp_error);
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
SMSData* SMSEncoder::decode(const void* data, unsigned size, bool MobOrig)
|
||||
{
|
||||
tsms_rpdu_message_t* rp_message = tsk_null;
|
||||
tsms_tpdu_message_t* tpdu = tsk_null;
|
||||
|
||||
SMSData* decodedData = tsk_null;
|
||||
|
||||
if(!(rp_message = tsms_rpdu_message_deserialize(data, size))) {
|
||||
TSK_DEBUG_ERROR("Failed to deserialize the RP-MESSAGE");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
switch(rp_message->mti) {
|
||||
case tsms_rpdu_type_data_mo:
|
||||
case tsms_rpdu_type_data_mt: {
|
||||
char* ascii = tsk_null;
|
||||
tsms_rpdu_data_t* rp_data = TSMS_RPDU_DATA(rp_message);
|
||||
if((tpdu = tsms_tpdu_message_deserialize(rp_data->udata->data, rp_data->udata->size, MobOrig))) {
|
||||
if(tpdu->mti == tsms_tpdu_mti_deliver_mt || tpdu->mti == tsms_tpdu_mti_submit_mo) { /* SMS-SUBMIT or SMS-DELIVER? */
|
||||
ascii = tsms_tpdu_message_get_payload(tpdu);
|
||||
decodedData = new SMSData(twrap_sms_type_rpdata, rp_message->mr, ascii, (tsk_size_t)tsk_strlen(ascii));
|
||||
|
||||
if(tpdu->mti == tsms_tpdu_mti_deliver_mt) {
|
||||
tsms_tpdu_deliver_t* tpdu_deliver = (tsms_tpdu_deliver_t*)tpdu;
|
||||
decodedData->setOA(tpdu_deliver->oa ? tpdu_deliver->oa->digits : tsk_null);
|
||||
}
|
||||
/* IMPORTANT: to not uncomment
|
||||
else if(TSK_OBJECT_DEF(tpdu) == tsms_tpdu_submit_def_t){
|
||||
tsms_tpdu_submit_t* tpdu_submit = (tsms_tpdu_submit_t*)tpdu;
|
||||
decodedData->setDA(tpdu_submit->da ? tpdu_submit->da->digits : tsk_null);
|
||||
}*/
|
||||
TSK_FREE(ascii);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case tsms_rpdu_type_ack_mo:
|
||||
case tsms_rpdu_type_ack_mt: {
|
||||
tsms_rpdu_ack_t* rp_ack = TSMS_RPDU_ACK(rp_message);
|
||||
// ...do whatever you want
|
||||
if(rp_ack->udata && (tpdu = tsms_tpdu_message_deserialize(rp_ack->udata->data, rp_ack->udata->size, MobOrig))) {
|
||||
// ...do whatever you want
|
||||
}
|
||||
decodedData = new SMSData(twrap_sms_type_ack, rp_message->mr, tsk_null, 0);
|
||||
break;
|
||||
}
|
||||
case tsms_rpdu_type_error_mo:
|
||||
case tsms_rpdu_type_error_mt: {
|
||||
tsms_rpdu_error_t* rp_error = TSMS_RPDU_ERROR(rp_message);
|
||||
// ...do whatever you want
|
||||
if(rp_error->udata && (tpdu = tsms_tpdu_message_deserialize(rp_error->udata->data, rp_error->udata->size, MobOrig))) {
|
||||
// ...do whatever you want
|
||||
}
|
||||
decodedData = new SMSData(twrap_sms_type_error, rp_message->mr, tsk_null, 0);
|
||||
break;
|
||||
}
|
||||
case tsms_rpdu_type_smma_mo: {
|
||||
// tsms_rpdu_smma_t* rp_smma = TSMS_RPDU_SMMA(rp_message);
|
||||
// ...do whatever you want
|
||||
decodedData = new SMSData(twrap_sms_type_smma, rp_message->mr, tsk_null, 0);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
TSK_DEBUG_INFO("Unknown RP-Message type (%u).", rp_message->mti);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bail:
|
||||
TSK_OBJECT_SAFE_FREE(rp_message);
|
||||
TSK_OBJECT_SAFE_FREE(tpdu);
|
||||
|
||||
return decodedData;
|
||||
/*
|
||||
* Copyright (C) 2009 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou@doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SMSEncoder.h"
|
||||
|
||||
// Short description: http://betelco.blogspot.com/2009/10/sms-over-3gpp-ims-network.html
|
||||
|
||||
|
||||
RPMessage::RPMessage(twrap_rpmessage_type_t _type, tsms_rpdu_message_t* _rp_message)
|
||||
{
|
||||
this->rp_message = (tsms_rpdu_message_t*)tsk_object_ref(_rp_message);
|
||||
this->type = _type;
|
||||
this->tmpBuffer = tsk_null;
|
||||
}
|
||||
|
||||
RPMessage::RPMessage() :
|
||||
rp_message(tsk_null),
|
||||
type(twrap_rpmessage_type_sms_none),
|
||||
tmpBuffer(tsk_null)
|
||||
{
|
||||
}
|
||||
|
||||
twrap_rpmessage_type_t RPMessage::getType()
|
||||
{
|
||||
return this->type;
|
||||
}
|
||||
|
||||
unsigned RPMessage::getPayloadLength()
|
||||
{
|
||||
if(!this->tmpBuffer) {
|
||||
if((this->tmpBuffer = tsk_buffer_create_null())) {
|
||||
tsms_rpdu_data_serialize(this->rp_message, this->tmpBuffer);
|
||||
}
|
||||
}
|
||||
return this->tmpBuffer ? this->tmpBuffer->size : 0;
|
||||
}
|
||||
|
||||
unsigned RPMessage::getPayload(void* output, unsigned maxsize)
|
||||
{
|
||||
unsigned retsize = 0;
|
||||
|
||||
if(!this->tmpBuffer) {
|
||||
if((this->tmpBuffer = tsk_buffer_create_null())) {
|
||||
tsms_rpdu_message_serialize(this->rp_message, this->tmpBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
if(output && maxsize && this->tmpBuffer && this->tmpBuffer->data) {
|
||||
retsize = (this->tmpBuffer->size > maxsize) ? maxsize : this->tmpBuffer->size;
|
||||
memcpy(output, this->tmpBuffer->data, retsize);
|
||||
}
|
||||
return retsize;
|
||||
}
|
||||
|
||||
RPMessage::~RPMessage()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(this->rp_message);
|
||||
TSK_OBJECT_SAFE_FREE(this->tmpBuffer);
|
||||
}
|
||||
|
||||
|
||||
SMSData::SMSData(twrap_sms_type_t _type, int _mr, const void* _ascii, tsk_size_t _size): oa(tsk_null), da(tsk_null)
|
||||
{
|
||||
this->type = _type;
|
||||
this->mr = _mr;
|
||||
if((this->size = _size)) {
|
||||
if((this->ascii = tsk_calloc(size+1, 1))) {
|
||||
memcpy(this->ascii, _ascii, _size);
|
||||
}
|
||||
}
|
||||
else {
|
||||
this->ascii = tsk_null;
|
||||
}
|
||||
}
|
||||
|
||||
SMSData::SMSData(): oa(tsk_null), da(tsk_null)
|
||||
{
|
||||
this->type = twrap_sms_type_none;
|
||||
this->mr = 0;
|
||||
this->size = 0;
|
||||
this->ascii = tsk_null;
|
||||
}
|
||||
|
||||
SMSData::~SMSData()
|
||||
{
|
||||
TSK_FREE(this->ascii);
|
||||
TSK_FREE(this->oa);
|
||||
TSK_FREE(this->da);
|
||||
}
|
||||
|
||||
twrap_sms_type_t SMSData::getType()
|
||||
{
|
||||
return this->type;
|
||||
}
|
||||
|
||||
int SMSData::getMR()
|
||||
{
|
||||
return this->mr;
|
||||
}
|
||||
|
||||
unsigned SMSData::getPayloadLength()
|
||||
{
|
||||
return this->size;
|
||||
}
|
||||
|
||||
unsigned SMSData::getPayload(void* output, unsigned maxsize)
|
||||
{
|
||||
unsigned retsize = 0;
|
||||
|
||||
if(output && maxsize && this->ascii) {
|
||||
retsize = (this->size > maxsize) ? maxsize : this->size;
|
||||
memcpy(output, this->ascii, retsize);
|
||||
}
|
||||
return retsize;
|
||||
}
|
||||
|
||||
const char* SMSData::getOA()
|
||||
{
|
||||
return this->oa;
|
||||
}
|
||||
|
||||
const char* SMSData::getDA()
|
||||
{
|
||||
return this->da;
|
||||
}
|
||||
|
||||
void SMSData::setOA(const char* _oa)
|
||||
{
|
||||
TSK_FREE(this->oa);
|
||||
this->oa = tsk_strdup(_oa);
|
||||
}
|
||||
|
||||
void SMSData::setDA(const char* _da)
|
||||
{
|
||||
TSK_FREE(this->da);
|
||||
this->da = tsk_strdup(_da);
|
||||
}
|
||||
|
||||
|
||||
// More information about RP-DATA: http://www.doubango.org/API/tinySMS/group__tsms__rpdu__group.html#tsms_rpdu_group_DATA
|
||||
RPMessage* SMSEncoder::encodeSubmit(int mr, const char *smsc, const char *destination, const char *ascii)
|
||||
{
|
||||
int ret;
|
||||
tsk_buffer_t* buffer = tsk_null;
|
||||
tsms_tpdu_submit_t* sms_submit = tsk_null;
|
||||
tsms_rpdu_data_t* rp_data = tsk_null;
|
||||
|
||||
RPMessage* encodedData = tsk_null;
|
||||
|
||||
if(!smsc || ! destination || !ascii) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
if(mr<0 || mr>0xFF) {
|
||||
TSK_DEBUG_WARN("Invalid Message Reference");
|
||||
mr &= 0xFF;
|
||||
}
|
||||
|
||||
// create SMS-SUBMIT message
|
||||
if(!(sms_submit = tsms_tpdu_submit_create(mr, (const uint8_t*)smsc, (const uint8_t*)destination))) {
|
||||
TSK_DEBUG_ERROR("Failed to create the TPDU SMS-SUBMIT message");
|
||||
goto bail;
|
||||
}
|
||||
// Set content for SMS-SUBMIT
|
||||
if((buffer = tsms_pack_to_7bit(ascii))) {
|
||||
ret = tsms_tpdu_submit_set_userdata(sms_submit, buffer, tsms_alpha_7bit);
|
||||
TSK_OBJECT_SAFE_FREE(buffer);
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Failed to encode the TPDU SMS-SUBMIT message");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
// create RP-DATA(SMS-SUBMIT)
|
||||
if((rp_data = tsms_rpdu_data_create_mo(mr, (const uint8_t*)smsc, TSMS_TPDU_MESSAGE(sms_submit)))) {
|
||||
encodedData = new RPMessage(twrap_rpmessage_type_sms_submit, TSMS_RPDU_MESSAGE(rp_data));
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Failed to create the RP-DATA(SMS-SUBMIT) message");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
bail:
|
||||
TSK_OBJECT_SAFE_FREE(buffer);
|
||||
TSK_OBJECT_SAFE_FREE(sms_submit);
|
||||
TSK_OBJECT_SAFE_FREE(rp_data);
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
// More information about RP-DATA: http://www.doubango.org/API/tinySMS/group__tsms__rpdu__group.html#tsms_rpdu_group_DATA
|
||||
RPMessage* SMSEncoder::encodeDeliver(int mr, const char* smsc, const char* originator, const char* ascii)
|
||||
{
|
||||
int ret;
|
||||
tsk_buffer_t* buffer = tsk_null;
|
||||
tsms_tpdu_deliver_t* sms_deliver = tsk_null;
|
||||
tsms_rpdu_data_t* rp_data = tsk_null;
|
||||
|
||||
RPMessage* encodedData = tsk_null;
|
||||
|
||||
if(!smsc || ! originator || !ascii) {
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
if(mr<0 || mr>0xFF) {
|
||||
TSK_DEBUG_WARN("Invalid Message Reference");
|
||||
mr &= 0xFF;
|
||||
}
|
||||
|
||||
// create SMS-DELIVER message
|
||||
sms_deliver = tsms_tpdu_deliver_create((const uint8_t*)smsc, (const uint8_t*)originator);
|
||||
// Set content for SMS-DELIVER
|
||||
if((buffer = tsms_pack_to_7bit(ascii))) {
|
||||
ret = tsms_tpdu_deliver_set_userdata(sms_deliver, buffer, tsms_alpha_7bit);
|
||||
TSK_OBJECT_SAFE_FREE(buffer);
|
||||
}
|
||||
// create RP-DATA message
|
||||
if((rp_data = tsms_rpdu_data_create_mt(mr, (const uint8_t*)smsc, TSMS_TPDU_MESSAGE(sms_deliver)))) {
|
||||
encodedData = new RPMessage(twrap_rpmessage_type_sms_deliver, TSMS_RPDU_MESSAGE(rp_data));
|
||||
}
|
||||
else {
|
||||
TSK_DEBUG_ERROR("Failed to create the RP-DATA(SMS-DELIVER) message");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
bail:
|
||||
TSK_OBJECT_SAFE_FREE(buffer);
|
||||
TSK_OBJECT_SAFE_FREE(sms_deliver);
|
||||
TSK_OBJECT_SAFE_FREE(rp_data);
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
RPMessage* SMSEncoder::encodeACK(int mr, const char* smsc, const char* destination, bool forSUBMIT)
|
||||
{
|
||||
tsms_tpdu_report_t* sms_report = tsk_null;
|
||||
tsms_rpdu_ack_t* rp_ack = tsk_null;
|
||||
tsk_bool_t isSUBMIT = forSUBMIT ? tsk_true : tsk_false;
|
||||
tsk_bool_t isERROR = tsk_false;
|
||||
|
||||
RPMessage* encodedData = tsk_null;
|
||||
|
||||
// create SMS-DELIVER(or SUBMIT)-REPORT message
|
||||
sms_report = tsms_tpdu_report_create((const uint8_t*)smsc, isSUBMIT, isERROR);
|
||||
// create RP-ACK message (From MS to SC)
|
||||
if((rp_ack = tsms_rpdu_ack_create_mo(mr, TSMS_TPDU_MESSAGE(sms_report)))) {
|
||||
encodedData = new RPMessage(twrap_rpmessage_type_sms_ack, TSMS_RPDU_MESSAGE(rp_ack));
|
||||
}
|
||||
|
||||
TSK_OBJECT_SAFE_FREE(sms_report);
|
||||
TSK_OBJECT_SAFE_FREE(rp_ack);
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
RPMessage* SMSEncoder::encodeError(int mr, const char* smsc, const char* destination, bool forSUBMIT)
|
||||
{
|
||||
tsms_tpdu_report_t* sms_report = tsk_null;
|
||||
tsms_rpdu_error_t* rp_error= tsk_null;
|
||||
tsk_bool_t isSUBMIT = forSUBMIT ? tsk_true : tsk_false;
|
||||
tsk_bool_t isERROR = tsk_true;
|
||||
|
||||
RPMessage* encodedData = tsk_null;
|
||||
|
||||
// create SMS-DELIVER-REPORT message
|
||||
sms_report = tsms_tpdu_report_create((const uint8_t*)smsc, isSUBMIT, isERROR);
|
||||
// create RP-ERROR message
|
||||
if((rp_error = tsms_rpdu_error_create_mo(mr, TSMS_TPDU_MESSAGE(sms_report), 0x0A/*call barred*/))) {
|
||||
encodedData = new RPMessage(twrap_rpmessage_type_sms_error, TSMS_RPDU_MESSAGE(rp_error));
|
||||
}
|
||||
|
||||
TSK_OBJECT_SAFE_FREE(sms_report);
|
||||
TSK_OBJECT_SAFE_FREE(rp_error);
|
||||
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
SMSData* SMSEncoder::decode(const void* data, unsigned size, bool MobOrig)
|
||||
{
|
||||
tsms_rpdu_message_t* rp_message = tsk_null;
|
||||
tsms_tpdu_message_t* tpdu = tsk_null;
|
||||
|
||||
SMSData* decodedData = tsk_null;
|
||||
|
||||
if(!(rp_message = tsms_rpdu_message_deserialize(data, size))) {
|
||||
TSK_DEBUG_ERROR("Failed to deserialize the RP-MESSAGE");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
switch(rp_message->mti) {
|
||||
case tsms_rpdu_type_data_mo:
|
||||
case tsms_rpdu_type_data_mt: {
|
||||
char* ascii = tsk_null;
|
||||
tsms_rpdu_data_t* rp_data = TSMS_RPDU_DATA(rp_message);
|
||||
if((tpdu = tsms_tpdu_message_deserialize(rp_data->udata->data, rp_data->udata->size, MobOrig))) {
|
||||
if(tpdu->mti == tsms_tpdu_mti_deliver_mt || tpdu->mti == tsms_tpdu_mti_submit_mo) { /* SMS-SUBMIT or SMS-DELIVER? */
|
||||
ascii = tsms_tpdu_message_get_payload(tpdu);
|
||||
decodedData = new SMSData(twrap_sms_type_rpdata, rp_message->mr, ascii, (tsk_size_t)tsk_strlen(ascii));
|
||||
|
||||
if(tpdu->mti == tsms_tpdu_mti_deliver_mt) {
|
||||
tsms_tpdu_deliver_t* tpdu_deliver = (tsms_tpdu_deliver_t*)tpdu;
|
||||
decodedData->setOA(tpdu_deliver->oa ? tpdu_deliver->oa->digits : tsk_null);
|
||||
}
|
||||
/* IMPORTANT: to not uncomment
|
||||
else if(TSK_OBJECT_DEF(tpdu) == tsms_tpdu_submit_def_t){
|
||||
tsms_tpdu_submit_t* tpdu_submit = (tsms_tpdu_submit_t*)tpdu;
|
||||
decodedData->setDA(tpdu_submit->da ? tpdu_submit->da->digits : tsk_null);
|
||||
}*/
|
||||
TSK_FREE(ascii);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case tsms_rpdu_type_ack_mo:
|
||||
case tsms_rpdu_type_ack_mt: {
|
||||
tsms_rpdu_ack_t* rp_ack = TSMS_RPDU_ACK(rp_message);
|
||||
// ...do whatever you want
|
||||
if(rp_ack->udata && (tpdu = tsms_tpdu_message_deserialize(rp_ack->udata->data, rp_ack->udata->size, MobOrig))) {
|
||||
// ...do whatever you want
|
||||
}
|
||||
decodedData = new SMSData(twrap_sms_type_ack, rp_message->mr, tsk_null, 0);
|
||||
break;
|
||||
}
|
||||
case tsms_rpdu_type_error_mo:
|
||||
case tsms_rpdu_type_error_mt: {
|
||||
tsms_rpdu_error_t* rp_error = TSMS_RPDU_ERROR(rp_message);
|
||||
// ...do whatever you want
|
||||
if(rp_error->udata && (tpdu = tsms_tpdu_message_deserialize(rp_error->udata->data, rp_error->udata->size, MobOrig))) {
|
||||
// ...do whatever you want
|
||||
}
|
||||
decodedData = new SMSData(twrap_sms_type_error, rp_message->mr, tsk_null, 0);
|
||||
break;
|
||||
}
|
||||
case tsms_rpdu_type_smma_mo: {
|
||||
// tsms_rpdu_smma_t* rp_smma = TSMS_RPDU_SMMA(rp_message);
|
||||
// ...do whatever you want
|
||||
decodedData = new SMSData(twrap_sms_type_smma, rp_message->mr, tsk_null, 0);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
TSK_DEBUG_INFO("Unknown RP-Message type (%u).", rp_message->mti);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bail:
|
||||
TSK_OBJECT_SAFE_FREE(rp_message);
|
||||
TSK_OBJECT_SAFE_FREE(tpdu);
|
||||
|
||||
return decodedData;
|
||||
}
|
|
@ -1,113 +1,113 @@
|
|||
/*
|
||||
* Copyright (C) 2009 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou@doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SMSENCODER_H
|
||||
#define TINYWRAP_SMSENCODER_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h" /* SIP/IMS */
|
||||
#include "tinysms.h" /* Binary SMS API*/
|
||||
|
||||
typedef enum twrap_rpmessage_type_e {
|
||||
twrap_rpmessage_type_sms_none,
|
||||
twrap_rpmessage_type_sms_submit,
|
||||
twrap_rpmessage_type_sms_deliver,
|
||||
twrap_rpmessage_type_sms_ack,
|
||||
twrap_rpmessage_type_sms_error,
|
||||
}
|
||||
twrap_rpmessage_type_t;
|
||||
|
||||
typedef enum twrap_sms_type_e {
|
||||
twrap_sms_type_none,
|
||||
twrap_sms_type_rpdata,
|
||||
twrap_sms_type_smma,
|
||||
twrap_sms_type_ack,
|
||||
twrap_sms_type_error,
|
||||
}
|
||||
twrap_sms_type_t;
|
||||
|
||||
class RPMessage
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
RPMessage(twrap_rpmessage_type_t type, tsms_rpdu_message_t* rp_message);
|
||||
#endif
|
||||
RPMessage();
|
||||
|
||||
virtual ~RPMessage();
|
||||
|
||||
public:
|
||||
/* Public API functions */
|
||||
twrap_rpmessage_type_t getType();
|
||||
unsigned getPayloadLength();
|
||||
unsigned getPayload(void* output, unsigned maxsize);
|
||||
|
||||
private:
|
||||
twrap_rpmessage_type_t type;
|
||||
tsms_rpdu_message_t* rp_message;
|
||||
|
||||
tsk_buffer_t* tmpBuffer;
|
||||
};
|
||||
|
||||
class SMSData
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
SMSData(twrap_sms_type_t type, int mr, const void* ascii, tsk_size_t size);
|
||||
#endif
|
||||
SMSData();
|
||||
|
||||
virtual ~SMSData();
|
||||
|
||||
public:
|
||||
/* Public API functions */
|
||||
twrap_sms_type_t getType();
|
||||
int getMR();
|
||||
unsigned getPayloadLength();
|
||||
unsigned getPayload(void* output, unsigned maxsize);
|
||||
const char* getOA();
|
||||
const char* getDA();
|
||||
#if !defined(SWIG)
|
||||
void setOA(const char* oa);
|
||||
void setDA(const char* da);
|
||||
#endif
|
||||
|
||||
private:
|
||||
twrap_sms_type_t type;
|
||||
int mr;
|
||||
void* ascii;
|
||||
char* oa;
|
||||
char* da;
|
||||
tsk_size_t size;
|
||||
};
|
||||
|
||||
class SMSEncoder
|
||||
{
|
||||
public:
|
||||
static RPMessage* encodeSubmit(int mr, const char* smsc, const char* destination, const char* ascii);
|
||||
static RPMessage* encodeDeliver(int mr, const char* smsc, const char* originator, const char* ascii);
|
||||
static RPMessage* encodeACK(int mr, const char* smsc, const char* destination, bool forSUBMIT);
|
||||
static RPMessage* encodeError(int mr, const char* smsc, const char* destination, bool forSUBMIT);
|
||||
static SMSData* decode(const void* data, unsigned size, bool MobOrig);
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SMSENCODER_H */
|
||||
/*
|
||||
* Copyright (C) 2009 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou@doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SMSENCODER_H
|
||||
#define TINYWRAP_SMSENCODER_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h" /* SIP/IMS */
|
||||
#include "tinysms.h" /* Binary SMS API*/
|
||||
|
||||
typedef enum twrap_rpmessage_type_e {
|
||||
twrap_rpmessage_type_sms_none,
|
||||
twrap_rpmessage_type_sms_submit,
|
||||
twrap_rpmessage_type_sms_deliver,
|
||||
twrap_rpmessage_type_sms_ack,
|
||||
twrap_rpmessage_type_sms_error,
|
||||
}
|
||||
twrap_rpmessage_type_t;
|
||||
|
||||
typedef enum twrap_sms_type_e {
|
||||
twrap_sms_type_none,
|
||||
twrap_sms_type_rpdata,
|
||||
twrap_sms_type_smma,
|
||||
twrap_sms_type_ack,
|
||||
twrap_sms_type_error,
|
||||
}
|
||||
twrap_sms_type_t;
|
||||
|
||||
class RPMessage
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
RPMessage(twrap_rpmessage_type_t type, tsms_rpdu_message_t* rp_message);
|
||||
#endif
|
||||
RPMessage();
|
||||
|
||||
virtual ~RPMessage();
|
||||
|
||||
public:
|
||||
/* Public API functions */
|
||||
twrap_rpmessage_type_t getType();
|
||||
unsigned getPayloadLength();
|
||||
unsigned getPayload(void* output, unsigned maxsize);
|
||||
|
||||
private:
|
||||
twrap_rpmessage_type_t type;
|
||||
tsms_rpdu_message_t* rp_message;
|
||||
|
||||
tsk_buffer_t* tmpBuffer;
|
||||
};
|
||||
|
||||
class SMSData
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
SMSData(twrap_sms_type_t type, int mr, const void* ascii, tsk_size_t size);
|
||||
#endif
|
||||
SMSData();
|
||||
|
||||
virtual ~SMSData();
|
||||
|
||||
public:
|
||||
/* Public API functions */
|
||||
twrap_sms_type_t getType();
|
||||
int getMR();
|
||||
unsigned getPayloadLength();
|
||||
unsigned getPayload(void* output, unsigned maxsize);
|
||||
const char* getOA();
|
||||
const char* getDA();
|
||||
#if !defined(SWIG)
|
||||
void setOA(const char* oa);
|
||||
void setDA(const char* da);
|
||||
#endif
|
||||
|
||||
private:
|
||||
twrap_sms_type_t type;
|
||||
int mr;
|
||||
void* ascii;
|
||||
char* oa;
|
||||
char* da;
|
||||
tsk_size_t size;
|
||||
};
|
||||
|
||||
class SMSEncoder
|
||||
{
|
||||
public:
|
||||
static RPMessage* encodeSubmit(int mr, const char* smsc, const char* destination, const char* ascii);
|
||||
static RPMessage* encodeDeliver(int mr, const char* smsc, const char* originator, const char* ascii);
|
||||
static RPMessage* encodeACK(int mr, const char* smsc, const char* destination, bool forSUBMIT);
|
||||
static RPMessage* encodeError(int mr, const char* smsc, const char* destination, bool forSUBMIT);
|
||||
static SMSData* decode(const void* data, unsigned size, bool MobOrig);
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SMSENCODER_H */
|
||||
|
|
|
@ -1,42 +1,42 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SafeObject.h"
|
||||
|
||||
SafeObject::SafeObject()
|
||||
{
|
||||
this->mutex = tsk_mutex_create();
|
||||
}
|
||||
|
||||
int SafeObject::Lock()const
|
||||
{
|
||||
return tsk_mutex_lock(this->mutex);
|
||||
}
|
||||
|
||||
int SafeObject::UnLock()const
|
||||
{
|
||||
return tsk_mutex_unlock(this->mutex);
|
||||
}
|
||||
|
||||
SafeObject::~SafeObject()
|
||||
{
|
||||
tsk_mutex_destroy(&this->mutex);
|
||||
}
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SafeObject.h"
|
||||
|
||||
SafeObject::SafeObject()
|
||||
{
|
||||
this->mutex = tsk_mutex_create();
|
||||
}
|
||||
|
||||
int SafeObject::Lock()const
|
||||
{
|
||||
return tsk_mutex_lock(this->mutex);
|
||||
}
|
||||
|
||||
int SafeObject::UnLock()const
|
||||
{
|
||||
return tsk_mutex_unlock(this->mutex);
|
||||
}
|
||||
|
||||
SafeObject::~SafeObject()
|
||||
{
|
||||
tsk_mutex_destroy(&this->mutex);
|
||||
}
|
||||
|
|
|
@ -1,43 +1,43 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SAFEOBJECT_H
|
||||
#define TINYWRAP_SAFEOBJECT_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tsk_mutex.h"
|
||||
|
||||
class TINYWRAP_API SafeObject
|
||||
{
|
||||
public:
|
||||
SafeObject();
|
||||
virtual ~SafeObject();
|
||||
|
||||
/* protected: */
|
||||
int Lock()const;
|
||||
int UnLock()const;
|
||||
|
||||
private:
|
||||
tsk_mutex_handle_t *mutex;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SAFEOBJECT_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SAFEOBJECT_H
|
||||
#define TINYWRAP_SAFEOBJECT_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tsk_mutex.h"
|
||||
|
||||
class TINYWRAP_API SafeObject
|
||||
{
|
||||
public:
|
||||
SafeObject();
|
||||
virtual ~SafeObject();
|
||||
|
||||
/* protected: */
|
||||
int Lock()const;
|
||||
int UnLock()const;
|
||||
|
||||
private:
|
||||
tsk_mutex_handle_t *mutex;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SAFEOBJECT_H */
|
||||
|
|
|
@ -1,31 +1,31 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SipCallback.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SipCallback.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,74 +1,74 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPCALLBACK_H
|
||||
#define TINYWRAP_SIPCALLBACK_H
|
||||
|
||||
class DialogEvent;
|
||||
class StackEvent;
|
||||
|
||||
class InviteEvent;
|
||||
class MessagingEvent;
|
||||
class InfoEvent;
|
||||
class OptionsEvent;
|
||||
class PublicationEvent;
|
||||
class RegistrationEvent;
|
||||
class SubscriptionEvent;
|
||||
|
||||
class SipCallback
|
||||
{
|
||||
public:
|
||||
SipCallback() { }
|
||||
virtual ~SipCallback() {}
|
||||
virtual int OnDialogEvent(const DialogEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnStackEvent(const StackEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
virtual int OnInviteEvent(const InviteEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnMessagingEvent(const MessagingEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnInfoEvent(const InfoEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnOptionsEvent(const OptionsEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnPublicationEvent(const PublicationEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnRegistrationEvent(const RegistrationEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnSubscriptionEvent(const SubscriptionEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPCALLBACK_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPCALLBACK_H
|
||||
#define TINYWRAP_SIPCALLBACK_H
|
||||
|
||||
class DialogEvent;
|
||||
class StackEvent;
|
||||
|
||||
class InviteEvent;
|
||||
class MessagingEvent;
|
||||
class InfoEvent;
|
||||
class OptionsEvent;
|
||||
class PublicationEvent;
|
||||
class RegistrationEvent;
|
||||
class SubscriptionEvent;
|
||||
|
||||
class SipCallback
|
||||
{
|
||||
public:
|
||||
SipCallback() { }
|
||||
virtual ~SipCallback() {}
|
||||
virtual int OnDialogEvent(const DialogEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnStackEvent(const StackEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
virtual int OnInviteEvent(const InviteEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnMessagingEvent(const MessagingEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnInfoEvent(const InfoEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnOptionsEvent(const OptionsEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnPublicationEvent(const PublicationEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnRegistrationEvent(const RegistrationEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
virtual int OnSubscriptionEvent(const SubscriptionEvent* e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPCALLBACK_H */
|
||||
|
|
|
@ -1,284 +1,284 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SipEvent.h"
|
||||
#include "SipSession.h"
|
||||
#include "SipMessage.h"
|
||||
|
||||
#include "SipStack.h"
|
||||
|
||||
|
||||
#define takeOwnership_Implement(cls, name, session) \
|
||||
name##Session* cls##Event::take##session##Ownership() const \
|
||||
{ \
|
||||
if(this->sipevent && this->sipevent->ss /*&& !tsip_ssession_have_ownership(this->sipevent->ss)*/){ \
|
||||
SipStack* stack = this->getStack(); \
|
||||
if(stack){ \
|
||||
/* The constructor will call take_ownerhip() */ \
|
||||
return new name##Session(stack, this->sipevent->ss); \
|
||||
} \
|
||||
} \
|
||||
return tsk_null; \
|
||||
} \
|
||||
|
||||
/* ======================== SipEvent ========================*/
|
||||
SipEvent::SipEvent(const tsip_event_t *_sipevent)
|
||||
{
|
||||
this->sipevent = _sipevent;
|
||||
if(_sipevent) {
|
||||
this->sipmessage = new SipMessage(_sipevent->sipmessage);
|
||||
}
|
||||
else {
|
||||
this->sipmessage = tsk_null;
|
||||
}
|
||||
}
|
||||
|
||||
SipEvent::~SipEvent()
|
||||
{
|
||||
if(this->sipmessage) {
|
||||
delete this->sipmessage;
|
||||
}
|
||||
}
|
||||
|
||||
short SipEvent::getCode() const
|
||||
{
|
||||
return this->sipevent->code;
|
||||
}
|
||||
|
||||
const char* SipEvent::getPhrase() const
|
||||
{
|
||||
return this->sipevent->phrase;
|
||||
}
|
||||
|
||||
const SipSession* SipEvent::getBaseSession() const
|
||||
{
|
||||
const void* userdata = tsip_ssession_get_userdata(this->sipevent->ss);
|
||||
if(userdata) {
|
||||
return dyn_cast<const SipSession*>((const SipSession*)userdata);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const SipMessage* SipEvent::getSipMessage() const
|
||||
{
|
||||
return this->sipmessage;
|
||||
}
|
||||
|
||||
SipStack* SipEvent::getStack()const
|
||||
{
|
||||
const tsip_stack_handle_t* stack_handle = tsip_ssession_get_stack(sipevent->ss);
|
||||
const void* userdata;
|
||||
if(stack_handle && (userdata = tsip_stack_get_userdata(stack_handle))) {
|
||||
return dyn_cast<SipStack*>((SipStack*)userdata);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
|
||||
/* ======================== DialogEvent ========================*/
|
||||
DialogEvent::DialogEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent) { }
|
||||
|
||||
DialogEvent::~DialogEvent() { }
|
||||
|
||||
|
||||
/* ======================== DialogEvent ========================*/
|
||||
StackEvent::StackEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent) { }
|
||||
|
||||
StackEvent::~StackEvent() { }
|
||||
|
||||
|
||||
/* ======================== InviteEvent ========================*/
|
||||
InviteEvent::InviteEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
InviteEvent::~InviteEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_invite_event_type_t InviteEvent::getType() const
|
||||
{
|
||||
return TSIP_INVITE_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
twrap_media_type_t InviteEvent::getMediaType() const
|
||||
{
|
||||
// Ignore Mixed session (both audio/video and MSRP) as specified by GSMA RCS.
|
||||
if (this->sipevent && this->sipevent->ss) {
|
||||
tmedia_type_t type = tsip_ssession_get_mediatype(this->sipevent->ss);
|
||||
if ((type & tmedia_msrp) == tmedia_msrp) {
|
||||
return twrap_media_msrp;
|
||||
}
|
||||
else {
|
||||
return twrap_get_wrapped_media_type(type);
|
||||
}
|
||||
}
|
||||
return twrap_media_none;
|
||||
}
|
||||
|
||||
const InviteSession* InviteEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const InviteSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Invite, Call, CallSession);
|
||||
takeOwnership_Implement(Invite, Msrp, MsrpSession);
|
||||
|
||||
/* ======================== MessagingEvent ========================*/
|
||||
MessagingEvent::MessagingEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
MessagingEvent::~MessagingEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_message_event_type_t MessagingEvent::getType() const
|
||||
{
|
||||
return TSIP_MESSAGE_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const MessagingSession* MessagingEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const MessagingSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Messaging, Messaging, Session);
|
||||
|
||||
|
||||
/* ======================== InfoEvent ========================*/
|
||||
InfoEvent::InfoEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
InfoEvent::~InfoEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_info_event_type_t InfoEvent::getType() const
|
||||
{
|
||||
return TSIP_INFO_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const InfoSession* InfoEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const InfoSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Info, Info, Session);
|
||||
|
||||
|
||||
|
||||
/* ======================== OptionsEvent ========================*/
|
||||
OptionsEvent::OptionsEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
OptionsEvent::~OptionsEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_options_event_type_t OptionsEvent::getType() const
|
||||
{
|
||||
return TSIP_OPTIONS_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const OptionsSession* OptionsEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const OptionsSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Options, Options, Session);
|
||||
|
||||
|
||||
/* ======================== PublicationEvent ========================*/
|
||||
PublicationEvent::PublicationEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
PublicationEvent::~PublicationEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_publish_event_type_t PublicationEvent::getType() const
|
||||
{
|
||||
return TSIP_PUBLISH_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const PublicationSession* PublicationEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const PublicationSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Publication, Publication, Session);
|
||||
|
||||
|
||||
/* ======================== RegistrationEvent ========================*/
|
||||
RegistrationEvent::RegistrationEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
RegistrationEvent::~RegistrationEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_register_event_type_t RegistrationEvent::getType() const
|
||||
{
|
||||
return TSIP_REGISTER_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const RegistrationSession* RegistrationEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const RegistrationSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Registration, Registration, Session);
|
||||
|
||||
|
||||
/* ======================== SubscriptionEvent ========================*/
|
||||
SubscriptionEvent::SubscriptionEvent(const tsip_event_t *sipevent)
|
||||
:SipEvent(sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
SubscriptionEvent::~SubscriptionEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_subscribe_event_type_t SubscriptionEvent::getType() const
|
||||
{
|
||||
return TSIP_SUBSCRIBE_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const SubscriptionSession* SubscriptionEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const SubscriptionSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SipEvent.h"
|
||||
#include "SipSession.h"
|
||||
#include "SipMessage.h"
|
||||
|
||||
#include "SipStack.h"
|
||||
|
||||
|
||||
#define takeOwnership_Implement(cls, name, session) \
|
||||
name##Session* cls##Event::take##session##Ownership() const \
|
||||
{ \
|
||||
if(this->sipevent && this->sipevent->ss /*&& !tsip_ssession_have_ownership(this->sipevent->ss)*/){ \
|
||||
SipStack* stack = this->getStack(); \
|
||||
if(stack){ \
|
||||
/* The constructor will call take_ownerhip() */ \
|
||||
return new name##Session(stack, this->sipevent->ss); \
|
||||
} \
|
||||
} \
|
||||
return tsk_null; \
|
||||
} \
|
||||
|
||||
/* ======================== SipEvent ========================*/
|
||||
SipEvent::SipEvent(const tsip_event_t *_sipevent)
|
||||
{
|
||||
this->sipevent = _sipevent;
|
||||
if(_sipevent) {
|
||||
this->sipmessage = new SipMessage(_sipevent->sipmessage);
|
||||
}
|
||||
else {
|
||||
this->sipmessage = tsk_null;
|
||||
}
|
||||
}
|
||||
|
||||
SipEvent::~SipEvent()
|
||||
{
|
||||
if(this->sipmessage) {
|
||||
delete this->sipmessage;
|
||||
}
|
||||
}
|
||||
|
||||
short SipEvent::getCode() const
|
||||
{
|
||||
return this->sipevent->code;
|
||||
}
|
||||
|
||||
const char* SipEvent::getPhrase() const
|
||||
{
|
||||
return this->sipevent->phrase;
|
||||
}
|
||||
|
||||
const SipSession* SipEvent::getBaseSession() const
|
||||
{
|
||||
const void* userdata = tsip_ssession_get_userdata(this->sipevent->ss);
|
||||
if(userdata) {
|
||||
return dyn_cast<const SipSession*>((const SipSession*)userdata);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const SipMessage* SipEvent::getSipMessage() const
|
||||
{
|
||||
return this->sipmessage;
|
||||
}
|
||||
|
||||
SipStack* SipEvent::getStack()const
|
||||
{
|
||||
const tsip_stack_handle_t* stack_handle = tsip_ssession_get_stack(sipevent->ss);
|
||||
const void* userdata;
|
||||
if(stack_handle && (userdata = tsip_stack_get_userdata(stack_handle))) {
|
||||
return dyn_cast<SipStack*>((SipStack*)userdata);
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
|
||||
/* ======================== DialogEvent ========================*/
|
||||
DialogEvent::DialogEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent) { }
|
||||
|
||||
DialogEvent::~DialogEvent() { }
|
||||
|
||||
|
||||
/* ======================== DialogEvent ========================*/
|
||||
StackEvent::StackEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent) { }
|
||||
|
||||
StackEvent::~StackEvent() { }
|
||||
|
||||
|
||||
/* ======================== InviteEvent ========================*/
|
||||
InviteEvent::InviteEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
InviteEvent::~InviteEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_invite_event_type_t InviteEvent::getType() const
|
||||
{
|
||||
return TSIP_INVITE_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
twrap_media_type_t InviteEvent::getMediaType() const
|
||||
{
|
||||
// Ignore Mixed session (both audio/video and MSRP) as specified by GSMA RCS.
|
||||
if (this->sipevent && this->sipevent->ss) {
|
||||
tmedia_type_t type = tsip_ssession_get_mediatype(this->sipevent->ss);
|
||||
if ((type & tmedia_msrp) == tmedia_msrp) {
|
||||
return twrap_media_msrp;
|
||||
}
|
||||
else {
|
||||
return twrap_get_wrapped_media_type(type);
|
||||
}
|
||||
}
|
||||
return twrap_media_none;
|
||||
}
|
||||
|
||||
const InviteSession* InviteEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const InviteSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Invite, Call, CallSession);
|
||||
takeOwnership_Implement(Invite, Msrp, MsrpSession);
|
||||
|
||||
/* ======================== MessagingEvent ========================*/
|
||||
MessagingEvent::MessagingEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
MessagingEvent::~MessagingEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_message_event_type_t MessagingEvent::getType() const
|
||||
{
|
||||
return TSIP_MESSAGE_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const MessagingSession* MessagingEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const MessagingSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Messaging, Messaging, Session);
|
||||
|
||||
|
||||
/* ======================== InfoEvent ========================*/
|
||||
InfoEvent::InfoEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
InfoEvent::~InfoEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_info_event_type_t InfoEvent::getType() const
|
||||
{
|
||||
return TSIP_INFO_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const InfoSession* InfoEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const InfoSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Info, Info, Session);
|
||||
|
||||
|
||||
|
||||
/* ======================== OptionsEvent ========================*/
|
||||
OptionsEvent::OptionsEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
OptionsEvent::~OptionsEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_options_event_type_t OptionsEvent::getType() const
|
||||
{
|
||||
return TSIP_OPTIONS_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const OptionsSession* OptionsEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const OptionsSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Options, Options, Session);
|
||||
|
||||
|
||||
/* ======================== PublicationEvent ========================*/
|
||||
PublicationEvent::PublicationEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
PublicationEvent::~PublicationEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_publish_event_type_t PublicationEvent::getType() const
|
||||
{
|
||||
return TSIP_PUBLISH_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const PublicationSession* PublicationEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const PublicationSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Publication, Publication, Session);
|
||||
|
||||
|
||||
/* ======================== RegistrationEvent ========================*/
|
||||
RegistrationEvent::RegistrationEvent(const tsip_event_t *_sipevent)
|
||||
:SipEvent(_sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
RegistrationEvent::~RegistrationEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_register_event_type_t RegistrationEvent::getType() const
|
||||
{
|
||||
return TSIP_REGISTER_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const RegistrationSession* RegistrationEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const RegistrationSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Registration, Registration, Session);
|
||||
|
||||
|
||||
/* ======================== SubscriptionEvent ========================*/
|
||||
SubscriptionEvent::SubscriptionEvent(const tsip_event_t *sipevent)
|
||||
:SipEvent(sipevent)
|
||||
{
|
||||
}
|
||||
|
||||
SubscriptionEvent::~SubscriptionEvent()
|
||||
{
|
||||
}
|
||||
|
||||
tsip_subscribe_event_type_t SubscriptionEvent::getType() const
|
||||
{
|
||||
return TSIP_SUBSCRIBE_EVENT(this->sipevent)->type;
|
||||
}
|
||||
|
||||
const SubscriptionSession* SubscriptionEvent::getSession() const
|
||||
{
|
||||
return dyn_cast<const SubscriptionSession*>(this->getBaseSession());
|
||||
}
|
||||
|
||||
takeOwnership_Implement(Subscription, Subscription, Session);
|
|
@ -1,218 +1,218 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPEVENT_H
|
||||
#define TINYWRAP_SIPEVENT_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h"
|
||||
#include "Common.h"
|
||||
|
||||
class SipStack;
|
||||
|
||||
class SipSession;
|
||||
class InviteSession;
|
||||
class CallSession;
|
||||
class MsrpSession;
|
||||
class MessagingSession;
|
||||
class InfoSession;
|
||||
class OptionsSession;
|
||||
class PublicationSession;
|
||||
class RegistrationSession;
|
||||
class SubscriptionSession;
|
||||
|
||||
class SipMessage;
|
||||
|
||||
|
||||
/* ======================== SipEvent ========================*/
|
||||
class TINYWRAP_API SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
SipEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~SipEvent();
|
||||
|
||||
public:
|
||||
short getCode() const;
|
||||
const char* getPhrase() const;
|
||||
const SipSession* getBaseSession() const;
|
||||
const SipMessage* getSipMessage() const;
|
||||
#if !defined(SWIG)
|
||||
const tsip_event_t * getWrappedEvent() {
|
||||
return sipevent;
|
||||
}
|
||||
#endif
|
||||
#if !defined(SWIG)
|
||||
SipStack* getStack()const;
|
||||
#endif
|
||||
|
||||
protected:
|
||||
const tsip_event_t *sipevent;
|
||||
SipMessage* sipmessage;
|
||||
};
|
||||
|
||||
|
||||
/* ======================== DialogEvent ========================*/
|
||||
class TINYWRAP_API DialogEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
DialogEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~DialogEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
};
|
||||
|
||||
/* ======================== StackEvent ========================*/
|
||||
class TINYWRAP_API StackEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
StackEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~StackEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== InviteEvent ========================*/
|
||||
class TINYWRAP_API InviteEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
InviteEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~InviteEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_invite_event_type_t getType() const;
|
||||
twrap_media_type_t getMediaType() const;
|
||||
const InviteSession* getSession() const;
|
||||
CallSession* takeCallSessionOwnership() const;
|
||||
MsrpSession* takeMsrpSessionOwnership() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== MessagingEvent ========================*/
|
||||
class TINYWRAP_API MessagingEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MessagingEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~MessagingEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_message_event_type_t getType() const;
|
||||
const MessagingSession* getSession() const;
|
||||
MessagingSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
/* ======================== InfoEvent ========================*/
|
||||
class TINYWRAP_API InfoEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
InfoEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~InfoEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_info_event_type_t getType() const;
|
||||
const InfoSession* getSession() const;
|
||||
InfoSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== OptionsEvent ========================*/
|
||||
class TINYWRAP_API OptionsEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
OptionsEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~OptionsEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_options_event_type_t getType() const;
|
||||
const OptionsSession* getSession() const;
|
||||
OptionsSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== PublicationEvent ========================*/
|
||||
class TINYWRAP_API PublicationEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
PublicationEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~PublicationEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_publish_event_type_t getType() const;
|
||||
const PublicationSession* getSession() const;
|
||||
PublicationSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== RegistrationEvent ========================*/
|
||||
class TINYWRAP_API RegistrationEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
RegistrationEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~RegistrationEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_register_event_type_t getType() const;
|
||||
const RegistrationSession* getSession() const;
|
||||
RegistrationSession* takeSessionOwnership() const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* ======================== SubscriptionEvent ========================*/
|
||||
class TINYWRAP_API SubscriptionEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
SubscriptionEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~SubscriptionEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_subscribe_event_type_t getType() const;
|
||||
const SubscriptionSession* getSession() const;
|
||||
SubscriptionSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPEVENT_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPEVENT_H
|
||||
#define TINYWRAP_SIPEVENT_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h"
|
||||
#include "Common.h"
|
||||
|
||||
class SipStack;
|
||||
|
||||
class SipSession;
|
||||
class InviteSession;
|
||||
class CallSession;
|
||||
class MsrpSession;
|
||||
class MessagingSession;
|
||||
class InfoSession;
|
||||
class OptionsSession;
|
||||
class PublicationSession;
|
||||
class RegistrationSession;
|
||||
class SubscriptionSession;
|
||||
|
||||
class SipMessage;
|
||||
|
||||
|
||||
/* ======================== SipEvent ========================*/
|
||||
class TINYWRAP_API SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
SipEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~SipEvent();
|
||||
|
||||
public:
|
||||
short getCode() const;
|
||||
const char* getPhrase() const;
|
||||
const SipSession* getBaseSession() const;
|
||||
const SipMessage* getSipMessage() const;
|
||||
#if !defined(SWIG)
|
||||
const tsip_event_t * getWrappedEvent() {
|
||||
return sipevent;
|
||||
}
|
||||
#endif
|
||||
#if !defined(SWIG)
|
||||
SipStack* getStack()const;
|
||||
#endif
|
||||
|
||||
protected:
|
||||
const tsip_event_t *sipevent;
|
||||
SipMessage* sipmessage;
|
||||
};
|
||||
|
||||
|
||||
/* ======================== DialogEvent ========================*/
|
||||
class TINYWRAP_API DialogEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
DialogEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~DialogEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
};
|
||||
|
||||
/* ======================== StackEvent ========================*/
|
||||
class TINYWRAP_API StackEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
StackEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~StackEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== InviteEvent ========================*/
|
||||
class TINYWRAP_API InviteEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
InviteEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~InviteEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_invite_event_type_t getType() const;
|
||||
twrap_media_type_t getMediaType() const;
|
||||
const InviteSession* getSession() const;
|
||||
CallSession* takeCallSessionOwnership() const;
|
||||
MsrpSession* takeMsrpSessionOwnership() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== MessagingEvent ========================*/
|
||||
class TINYWRAP_API MessagingEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
MessagingEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~MessagingEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_message_event_type_t getType() const;
|
||||
const MessagingSession* getSession() const;
|
||||
MessagingSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
/* ======================== InfoEvent ========================*/
|
||||
class TINYWRAP_API InfoEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
InfoEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~InfoEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_info_event_type_t getType() const;
|
||||
const InfoSession* getSession() const;
|
||||
InfoSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== OptionsEvent ========================*/
|
||||
class TINYWRAP_API OptionsEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
OptionsEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~OptionsEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_options_event_type_t getType() const;
|
||||
const OptionsSession* getSession() const;
|
||||
OptionsSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== PublicationEvent ========================*/
|
||||
class TINYWRAP_API PublicationEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
PublicationEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~PublicationEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_publish_event_type_t getType() const;
|
||||
const PublicationSession* getSession() const;
|
||||
PublicationSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== RegistrationEvent ========================*/
|
||||
class TINYWRAP_API RegistrationEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
RegistrationEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~RegistrationEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_register_event_type_t getType() const;
|
||||
const RegistrationSession* getSession() const;
|
||||
RegistrationSession* takeSessionOwnership() const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/* ======================== SubscriptionEvent ========================*/
|
||||
class TINYWRAP_API SubscriptionEvent: public SipEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
SubscriptionEvent(const tsip_event_t *sipevent);
|
||||
#endif
|
||||
virtual ~SubscriptionEvent();
|
||||
|
||||
public: /* Public API functions */
|
||||
tsip_subscribe_event_type_t getType() const;
|
||||
const SubscriptionSession* getSession() const;
|
||||
SubscriptionSession* takeSessionOwnership() const;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPEVENT_H */
|
||||
|
|
|
@ -1,355 +1,355 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SipMessage.h"
|
||||
|
||||
|
||||
SdpMessage::SdpMessage()
|
||||
:m_pSdpMessage(tsk_null)
|
||||
{
|
||||
}
|
||||
|
||||
SdpMessage::SdpMessage(tsdp_message_t *_sdpmessage)
|
||||
{
|
||||
m_pSdpMessage = (tsdp_message_t *)tsk_object_ref(_sdpmessage);
|
||||
}
|
||||
|
||||
SdpMessage::~SdpMessage()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pSdpMessage);
|
||||
}
|
||||
|
||||
char* SdpMessage::getSdpHeaderValue(const char* media, char name, unsigned index /*= 0*/)
|
||||
{
|
||||
const tsdp_header_M_t* M;
|
||||
|
||||
if((M = (const tsdp_header_M_t*)tsdp_message_get_header(m_pSdpMessage, tsdp_htype_M))) {
|
||||
tsdp_header_type_t type = tsdp_htype_Dummy;
|
||||
const tsdp_header_t* header;
|
||||
switch(name) {
|
||||
case 'a':
|
||||
type = tsdp_htype_A;
|
||||
break;
|
||||
case 'b':
|
||||
type = tsdp_htype_B;
|
||||
break;
|
||||
case 'c':
|
||||
type = tsdp_htype_C;
|
||||
break;
|
||||
case 'e':
|
||||
type = tsdp_htype_E;
|
||||
break;
|
||||
case 'i':
|
||||
type = tsdp_htype_I;
|
||||
break;
|
||||
case 'k':
|
||||
type = tsdp_htype_K;
|
||||
break;
|
||||
case 'm':
|
||||
type = tsdp_htype_M;
|
||||
break;
|
||||
case 'o':
|
||||
type = tsdp_htype_O;
|
||||
break;
|
||||
|
||||
|
||||
case 'p':
|
||||
type = tsdp_htype_P;
|
||||
break;
|
||||
case 'r':
|
||||
type = tsdp_htype_R;
|
||||
break;
|
||||
case 's':
|
||||
type = tsdp_htype_S;
|
||||
break;
|
||||
case 't':
|
||||
type = tsdp_htype_T;
|
||||
break;
|
||||
case 'u':
|
||||
type = tsdp_htype_U;
|
||||
break;
|
||||
case 'v':
|
||||
type = tsdp_htype_V;
|
||||
break;
|
||||
case 'z':
|
||||
type = tsdp_htype_Z;
|
||||
break;
|
||||
}
|
||||
|
||||
if((header = tsdp_message_get_headerAt(m_pSdpMessage, type, index))) {
|
||||
return tsdp_header_tostring(header);
|
||||
}
|
||||
}
|
||||
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
char* SdpMessage::getSdpHeaderAValue(const char* media, const char* attributeName)
|
||||
{
|
||||
const tsdp_header_M_t* M;
|
||||
tsk_size_t i;
|
||||
|
||||
for(i = 0; (M = (const tsdp_header_M_t*)tsdp_message_get_headerAt(m_pSdpMessage, tsdp_htype_M, i)); i++) {
|
||||
if(tsk_striequals(M->media, media)) {
|
||||
const tsdp_header_A_t* A;
|
||||
if((A = tsdp_header_M_findA(M, attributeName))) {
|
||||
return tsk_strdup(A->value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
|
||||
SipMessage::SipMessage()
|
||||
:m_pSipMessage(tsk_null), m_pSdpMessage(tsk_null)
|
||||
{
|
||||
}
|
||||
|
||||
SipMessage::SipMessage(tsip_message_t *_sipmessage)
|
||||
: m_pSdpMessage(tsk_null)
|
||||
{
|
||||
m_pSipMessage = (tsip_message_t *)tsk_object_ref(_sipmessage);
|
||||
}
|
||||
|
||||
SipMessage::~SipMessage()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pSipMessage);
|
||||
if(m_pSdpMessage) {
|
||||
delete m_pSdpMessage;
|
||||
}
|
||||
}
|
||||
|
||||
bool SipMessage::isResponse()
|
||||
{
|
||||
return TSIP_MESSAGE_IS_RESPONSE(m_pSipMessage);
|
||||
}
|
||||
|
||||
tsip_request_type_t SipMessage::getRequestType()
|
||||
{
|
||||
if(TSIP_MESSAGE_IS_REQUEST(m_pSipMessage)) {
|
||||
return (m_pSipMessage)->line.request.request_type;
|
||||
}
|
||||
return tsip_NONE;
|
||||
}
|
||||
|
||||
short SipMessage::getResponseCode()
|
||||
{
|
||||
return TSIP_RESPONSE_CODE(m_pSipMessage);
|
||||
}
|
||||
|
||||
const char* SipMessage::getResponsePhrase()
|
||||
{
|
||||
return TSIP_RESPONSE_PHRASE(m_pSipMessage);
|
||||
}
|
||||
|
||||
const tsip_header_t* SipMessage::getSipHeader(const char* name, unsigned index /* =0 */)
|
||||
{
|
||||
/* Do not worry about calling tsk_striequals() several times because the function
|
||||
* is fully optimized.
|
||||
*/
|
||||
/* Code below comes from tsip_message_get_headerAt() */
|
||||
tsk_size_t pos = 0;
|
||||
const tsk_list_item_t *item;
|
||||
const tsip_header_t* hdr = tsk_null;
|
||||
if(!m_pSipMessage || !name) {
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
if(tsk_striequals(name, "v") || tsk_striequals(name, "via")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->firstVia;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "f") || tsk_striequals(name, "from")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->From;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "t") || tsk_striequals(name, "to")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->To;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "m") || tsk_striequals(name, "contact")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Contact;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "i") || tsk_striequals(name, "call-id")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Call_ID;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "cseq")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->CSeq;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "expires")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Expires;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "c") || tsk_striequals(name, "content-type")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Content_Type;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "l") || tsk_striequals(name, "content-length")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Content_Length;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
tsk_list_foreach(item, m_pSipMessage->headers) {
|
||||
if(tsk_striequals(tsip_header_get_name_2(TSIP_HEADER(item->data)), name)) {
|
||||
if(pos++ >= index) {
|
||||
hdr = (const tsip_header_t*)item->data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bail:
|
||||
return hdr;
|
||||
}
|
||||
|
||||
// e.g. getHeaderParamValue("content-type");
|
||||
char* SipMessage::getSipHeaderValue(const char* name, unsigned index /* = 0*/)
|
||||
{
|
||||
const tsip_header_t* header;
|
||||
if((header = this->getSipHeader(name, index))) {
|
||||
|
||||
switch(header->type) {
|
||||
case tsip_htype_From:
|
||||
return tsip_uri_tostring(((const tsip_header_From_t*)header)->uri, tsk_false, tsk_false);
|
||||
case tsip_htype_To:
|
||||
return tsip_uri_tostring(((const tsip_header_To_t*)header)->uri, tsk_false, tsk_false);
|
||||
break;
|
||||
case tsip_htype_P_Asserted_Identity:
|
||||
return tsip_uri_tostring(((const tsip_header_P_Asserted_Identity_t*)header)->uri, tsk_false, tsk_false);
|
||||
break;
|
||||
|
||||
default:
|
||||
return tsip_header_value_tostring(header);
|
||||
}
|
||||
}
|
||||
// SWIG: %newobject getHeaderValueAt;
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
// e.g. getHeaderParamValue("content-type", "charset");
|
||||
char* SipMessage::getSipHeaderParamValue(const char* name, const char* param, unsigned index /*=0*/)
|
||||
{
|
||||
const tsip_header_t* header;
|
||||
|
||||
if((header = this->getSipHeader(name, index))) {
|
||||
return tsip_header_get_param_value(header, param);
|
||||
}
|
||||
|
||||
// SWIG: %newobject getSipHeaderParamValue;
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
/** Returns the content length.
|
||||
*/
|
||||
unsigned SipMessage::getSipContentLength()
|
||||
{
|
||||
return TSIP_MESSAGE_CONTENT_DATA_LENGTH(m_pSipMessage);
|
||||
}
|
||||
|
||||
/** Gets the message content
|
||||
* @param output A pointer to the output buffer where to copy the data. MUST
|
||||
* be allocated by the caller.
|
||||
* @param maxsize The maximum number of octets to copy. Should be less than the size of the
|
||||
* @a output buffer. You can use @a getSipContentLength() to get the right value to use.
|
||||
* @retval The number of octet copied in the @a output buffer.
|
||||
*/
|
||||
unsigned SipMessage::getSipContent(void* output, unsigned maxsize)
|
||||
{
|
||||
unsigned retsize = 0;
|
||||
if(output && maxsize && TSIP_MESSAGE_HAS_CONTENT(m_pSipMessage)) {
|
||||
retsize = (m_pSipMessage->Content->size > maxsize) ? maxsize : m_pSipMessage->Content->size;
|
||||
memcpy(output, m_pSipMessage->Content->data, retsize);
|
||||
}
|
||||
return retsize;
|
||||
}
|
||||
|
||||
const void* SipMessage::getSipContentPtr()
|
||||
{
|
||||
if(m_pSipMessage && m_pSipMessage->Content) {
|
||||
return m_pSipMessage->Content->data;
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const SdpMessage* SipMessage::getSdpMessage()
|
||||
{
|
||||
if(!m_pSdpMessage && TSIP_MESSAGE_HAS_CONTENT(m_pSipMessage)) {
|
||||
tsdp_message_t* sdp = tsdp_message_parse(m_pSipMessage->Content->data, m_pSipMessage->Content->size);
|
||||
if(sdp) {
|
||||
m_pSdpMessage = new SdpMessage(sdp);
|
||||
TSK_OBJECT_SAFE_FREE(sdp);
|
||||
}
|
||||
}
|
||||
|
||||
return m_pSdpMessage;
|
||||
}
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SipMessage.h"
|
||||
|
||||
|
||||
SdpMessage::SdpMessage()
|
||||
:m_pSdpMessage(tsk_null)
|
||||
{
|
||||
}
|
||||
|
||||
SdpMessage::SdpMessage(tsdp_message_t *_sdpmessage)
|
||||
{
|
||||
m_pSdpMessage = (tsdp_message_t *)tsk_object_ref(_sdpmessage);
|
||||
}
|
||||
|
||||
SdpMessage::~SdpMessage()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pSdpMessage);
|
||||
}
|
||||
|
||||
char* SdpMessage::getSdpHeaderValue(const char* media, char name, unsigned index /*= 0*/)
|
||||
{
|
||||
const tsdp_header_M_t* M;
|
||||
|
||||
if((M = (const tsdp_header_M_t*)tsdp_message_get_header(m_pSdpMessage, tsdp_htype_M))) {
|
||||
tsdp_header_type_t type = tsdp_htype_Dummy;
|
||||
const tsdp_header_t* header;
|
||||
switch(name) {
|
||||
case 'a':
|
||||
type = tsdp_htype_A;
|
||||
break;
|
||||
case 'b':
|
||||
type = tsdp_htype_B;
|
||||
break;
|
||||
case 'c':
|
||||
type = tsdp_htype_C;
|
||||
break;
|
||||
case 'e':
|
||||
type = tsdp_htype_E;
|
||||
break;
|
||||
case 'i':
|
||||
type = tsdp_htype_I;
|
||||
break;
|
||||
case 'k':
|
||||
type = tsdp_htype_K;
|
||||
break;
|
||||
case 'm':
|
||||
type = tsdp_htype_M;
|
||||
break;
|
||||
case 'o':
|
||||
type = tsdp_htype_O;
|
||||
break;
|
||||
|
||||
|
||||
case 'p':
|
||||
type = tsdp_htype_P;
|
||||
break;
|
||||
case 'r':
|
||||
type = tsdp_htype_R;
|
||||
break;
|
||||
case 's':
|
||||
type = tsdp_htype_S;
|
||||
break;
|
||||
case 't':
|
||||
type = tsdp_htype_T;
|
||||
break;
|
||||
case 'u':
|
||||
type = tsdp_htype_U;
|
||||
break;
|
||||
case 'v':
|
||||
type = tsdp_htype_V;
|
||||
break;
|
||||
case 'z':
|
||||
type = tsdp_htype_Z;
|
||||
break;
|
||||
}
|
||||
|
||||
if((header = tsdp_message_get_headerAt(m_pSdpMessage, type, index))) {
|
||||
return tsdp_header_tostring(header);
|
||||
}
|
||||
}
|
||||
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
char* SdpMessage::getSdpHeaderAValue(const char* media, const char* attributeName)
|
||||
{
|
||||
const tsdp_header_M_t* M;
|
||||
tsk_size_t i;
|
||||
|
||||
for(i = 0; (M = (const tsdp_header_M_t*)tsdp_message_get_headerAt(m_pSdpMessage, tsdp_htype_M, i)); i++) {
|
||||
if(tsk_striequals(M->media, media)) {
|
||||
const tsdp_header_A_t* A;
|
||||
if((A = tsdp_header_M_findA(M, attributeName))) {
|
||||
return tsk_strdup(A->value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
|
||||
SipMessage::SipMessage()
|
||||
:m_pSipMessage(tsk_null), m_pSdpMessage(tsk_null)
|
||||
{
|
||||
}
|
||||
|
||||
SipMessage::SipMessage(tsip_message_t *_sipmessage)
|
||||
: m_pSdpMessage(tsk_null)
|
||||
{
|
||||
m_pSipMessage = (tsip_message_t *)tsk_object_ref(_sipmessage);
|
||||
}
|
||||
|
||||
SipMessage::~SipMessage()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pSipMessage);
|
||||
if(m_pSdpMessage) {
|
||||
delete m_pSdpMessage;
|
||||
}
|
||||
}
|
||||
|
||||
bool SipMessage::isResponse()
|
||||
{
|
||||
return TSIP_MESSAGE_IS_RESPONSE(m_pSipMessage);
|
||||
}
|
||||
|
||||
tsip_request_type_t SipMessage::getRequestType()
|
||||
{
|
||||
if(TSIP_MESSAGE_IS_REQUEST(m_pSipMessage)) {
|
||||
return (m_pSipMessage)->line.request.request_type;
|
||||
}
|
||||
return tsip_NONE;
|
||||
}
|
||||
|
||||
short SipMessage::getResponseCode()
|
||||
{
|
||||
return TSIP_RESPONSE_CODE(m_pSipMessage);
|
||||
}
|
||||
|
||||
const char* SipMessage::getResponsePhrase()
|
||||
{
|
||||
return TSIP_RESPONSE_PHRASE(m_pSipMessage);
|
||||
}
|
||||
|
||||
const tsip_header_t* SipMessage::getSipHeader(const char* name, unsigned index /* =0 */)
|
||||
{
|
||||
/* Do not worry about calling tsk_striequals() several times because the function
|
||||
* is fully optimized.
|
||||
*/
|
||||
/* Code below comes from tsip_message_get_headerAt() */
|
||||
tsk_size_t pos = 0;
|
||||
const tsk_list_item_t *item;
|
||||
const tsip_header_t* hdr = tsk_null;
|
||||
if(!m_pSipMessage || !name) {
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
if(tsk_striequals(name, "v") || tsk_striequals(name, "via")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->firstVia;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "f") || tsk_striequals(name, "from")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->From;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "t") || tsk_striequals(name, "to")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->To;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "m") || tsk_striequals(name, "contact")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Contact;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "i") || tsk_striequals(name, "call-id")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Call_ID;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "cseq")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->CSeq;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "expires")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Expires;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "c") || tsk_striequals(name, "content-type")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Content_Type;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if(tsk_striequals(name, "l") || tsk_striequals(name, "content-length")) {
|
||||
if(index == 0) {
|
||||
hdr = (const tsip_header_t*)m_pSipMessage->Content_Length;
|
||||
goto bail;
|
||||
}
|
||||
else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
tsk_list_foreach(item, m_pSipMessage->headers) {
|
||||
if(tsk_striequals(tsip_header_get_name_2(TSIP_HEADER(item->data)), name)) {
|
||||
if(pos++ >= index) {
|
||||
hdr = (const tsip_header_t*)item->data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bail:
|
||||
return hdr;
|
||||
}
|
||||
|
||||
// e.g. getHeaderParamValue("content-type");
|
||||
char* SipMessage::getSipHeaderValue(const char* name, unsigned index /* = 0*/)
|
||||
{
|
||||
const tsip_header_t* header;
|
||||
if((header = this->getSipHeader(name, index))) {
|
||||
|
||||
switch(header->type) {
|
||||
case tsip_htype_From:
|
||||
return tsip_uri_tostring(((const tsip_header_From_t*)header)->uri, tsk_false, tsk_false);
|
||||
case tsip_htype_To:
|
||||
return tsip_uri_tostring(((const tsip_header_To_t*)header)->uri, tsk_false, tsk_false);
|
||||
break;
|
||||
case tsip_htype_P_Asserted_Identity:
|
||||
return tsip_uri_tostring(((const tsip_header_P_Asserted_Identity_t*)header)->uri, tsk_false, tsk_false);
|
||||
break;
|
||||
|
||||
default:
|
||||
return tsip_header_value_tostring(header);
|
||||
}
|
||||
}
|
||||
// SWIG: %newobject getHeaderValueAt;
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
// e.g. getHeaderParamValue("content-type", "charset");
|
||||
char* SipMessage::getSipHeaderParamValue(const char* name, const char* param, unsigned index /*=0*/)
|
||||
{
|
||||
const tsip_header_t* header;
|
||||
|
||||
if((header = this->getSipHeader(name, index))) {
|
||||
return tsip_header_get_param_value(header, param);
|
||||
}
|
||||
|
||||
// SWIG: %newobject getSipHeaderParamValue;
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
/** Returns the content length.
|
||||
*/
|
||||
unsigned SipMessage::getSipContentLength()
|
||||
{
|
||||
return TSIP_MESSAGE_CONTENT_DATA_LENGTH(m_pSipMessage);
|
||||
}
|
||||
|
||||
/** Gets the message content
|
||||
* @param output A pointer to the output buffer where to copy the data. MUST
|
||||
* be allocated by the caller.
|
||||
* @param maxsize The maximum number of octets to copy. Should be less than the size of the
|
||||
* @a output buffer. You can use @a getSipContentLength() to get the right value to use.
|
||||
* @retval The number of octet copied in the @a output buffer.
|
||||
*/
|
||||
unsigned SipMessage::getSipContent(void* output, unsigned maxsize)
|
||||
{
|
||||
unsigned retsize = 0;
|
||||
if(output && maxsize && TSIP_MESSAGE_HAS_CONTENT(m_pSipMessage)) {
|
||||
retsize = (m_pSipMessage->Content->size > maxsize) ? maxsize : m_pSipMessage->Content->size;
|
||||
memcpy(output, m_pSipMessage->Content->data, retsize);
|
||||
}
|
||||
return retsize;
|
||||
}
|
||||
|
||||
const void* SipMessage::getSipContentPtr()
|
||||
{
|
||||
if(m_pSipMessage && m_pSipMessage->Content) {
|
||||
return m_pSipMessage->Content->data;
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const SdpMessage* SipMessage::getSdpMessage()
|
||||
{
|
||||
if(!m_pSdpMessage && TSIP_MESSAGE_HAS_CONTENT(m_pSipMessage)) {
|
||||
tsdp_message_t* sdp = tsdp_message_parse(m_pSipMessage->Content->data, m_pSipMessage->Content->size);
|
||||
if(sdp) {
|
||||
m_pSdpMessage = new SdpMessage(sdp);
|
||||
TSK_OBJECT_SAFE_FREE(sdp);
|
||||
}
|
||||
}
|
||||
|
||||
return m_pSdpMessage;
|
||||
}
|
||||
|
|
|
@ -1,82 +1,82 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPMESSAGE_H
|
||||
#define TINYWRAP_SIPMESSAGE_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
#include "tinysip.h"
|
||||
|
||||
class TINYWRAP_API SdpMessage
|
||||
{
|
||||
public:
|
||||
SdpMessage();
|
||||
#if !defined(SWIG)
|
||||
SdpMessage(tsdp_message_t *sdpmessage);
|
||||
#endif
|
||||
virtual ~SdpMessage();
|
||||
|
||||
char* getSdpHeaderValue(const char* media, char name, unsigned index = 0);
|
||||
char* getSdpHeaderAValue(const char* media, const char* attributeName);
|
||||
#if !defined(SWIG)
|
||||
const tsdp_message_t * getWrappedSdpMessage() {
|
||||
return m_pSdpMessage;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
tsdp_message_t *m_pSdpMessage;
|
||||
};
|
||||
|
||||
class TINYWRAP_API SipMessage
|
||||
{
|
||||
public:
|
||||
SipMessage();
|
||||
#if !defined(SWIG)
|
||||
SipMessage(tsip_message_t *sipmessage);
|
||||
#endif
|
||||
virtual ~SipMessage();
|
||||
|
||||
bool isResponse();
|
||||
tsip_request_type_t getRequestType();
|
||||
short getResponseCode();
|
||||
const char* getResponsePhrase();
|
||||
char* getSipHeaderValue(const char* name, unsigned index = 0);
|
||||
char* getSipHeaderParamValue(const char* name, const char* param, unsigned index = 0);
|
||||
unsigned getSipContentLength();
|
||||
unsigned getSipContent(void* output, unsigned maxsize);
|
||||
#if !defined(SWIG)
|
||||
const void* getSipContentPtr();
|
||||
const tsip_message_t* getWrappedSipMessage()const {
|
||||
return m_pSipMessage;
|
||||
}
|
||||
#endif
|
||||
const SdpMessage* getSdpMessage();
|
||||
|
||||
private:
|
||||
const tsip_header_t* getSipHeader(const char* name, unsigned index = 0);
|
||||
|
||||
private:
|
||||
tsip_message_t *m_pSipMessage;
|
||||
SdpMessage *m_pSdpMessage;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPMESSAGE_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPMESSAGE_H
|
||||
#define TINYWRAP_SIPMESSAGE_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
#include "tinysip.h"
|
||||
|
||||
class TINYWRAP_API SdpMessage
|
||||
{
|
||||
public:
|
||||
SdpMessage();
|
||||
#if !defined(SWIG)
|
||||
SdpMessage(tsdp_message_t *sdpmessage);
|
||||
#endif
|
||||
virtual ~SdpMessage();
|
||||
|
||||
char* getSdpHeaderValue(const char* media, char name, unsigned index = 0);
|
||||
char* getSdpHeaderAValue(const char* media, const char* attributeName);
|
||||
#if !defined(SWIG)
|
||||
const tsdp_message_t * getWrappedSdpMessage() {
|
||||
return m_pSdpMessage;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
tsdp_message_t *m_pSdpMessage;
|
||||
};
|
||||
|
||||
class TINYWRAP_API SipMessage
|
||||
{
|
||||
public:
|
||||
SipMessage();
|
||||
#if !defined(SWIG)
|
||||
SipMessage(tsip_message_t *sipmessage);
|
||||
#endif
|
||||
virtual ~SipMessage();
|
||||
|
||||
bool isResponse();
|
||||
tsip_request_type_t getRequestType();
|
||||
short getResponseCode();
|
||||
const char* getResponsePhrase();
|
||||
char* getSipHeaderValue(const char* name, unsigned index = 0);
|
||||
char* getSipHeaderParamValue(const char* name, const char* param, unsigned index = 0);
|
||||
unsigned getSipContentLength();
|
||||
unsigned getSipContent(void* output, unsigned maxsize);
|
||||
#if !defined(SWIG)
|
||||
const void* getSipContentPtr();
|
||||
const tsip_message_t* getWrappedSipMessage()const {
|
||||
return m_pSipMessage;
|
||||
}
|
||||
#endif
|
||||
const SdpMessage* getSdpMessage();
|
||||
|
||||
private:
|
||||
const tsip_header_t* getSipHeader(const char* name, unsigned index = 0);
|
||||
|
||||
private:
|
||||
tsip_message_t *m_pSipMessage;
|
||||
SdpMessage *m_pSdpMessage;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPMESSAGE_H */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,374 +1,374 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPSESSION_H
|
||||
#define TINYWRAP_SIPSESSION_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h"
|
||||
#include "tinymedia/tmedia_qos.h"
|
||||
#include "ActionConfig.h"
|
||||
|
||||
class SipUri;
|
||||
class SipStack;
|
||||
class MsrpCallback;
|
||||
class MediaSessionMgr;
|
||||
|
||||
/* ======================== T140Callback ========================*/
|
||||
class TINYWRAP_API T140CallbackData
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
T140CallbackData(enum tmedia_t140_data_type_e data_type, const void* data_ptr, unsigned data_size) {
|
||||
m_eType = data_type;
|
||||
m_pPtr = data_ptr;
|
||||
m_nSize = data_size;
|
||||
}
|
||||
#endif
|
||||
virtual ~T140CallbackData() {}
|
||||
|
||||
inline enum tmedia_t140_data_type_e getType()const {
|
||||
return m_eType;
|
||||
}
|
||||
inline unsigned getSize()const {
|
||||
return m_nSize;
|
||||
}
|
||||
inline unsigned getData(void* pOutput, unsigned nMaxsize)const {
|
||||
unsigned nRetsize = 0;
|
||||
if(pOutput && nMaxsize && m_pPtr) {
|
||||
nRetsize = (m_nSize > nMaxsize) ? nMaxsize : m_nSize;
|
||||
memcpy(pOutput, m_pPtr, nRetsize);
|
||||
}
|
||||
return nRetsize;
|
||||
}
|
||||
|
||||
private:
|
||||
enum tmedia_t140_data_type_e m_eType;
|
||||
const void* m_pPtr;
|
||||
unsigned m_nSize;
|
||||
};
|
||||
|
||||
class TINYWRAP_API T140Callback
|
||||
{
|
||||
public:
|
||||
T140Callback() {}
|
||||
virtual ~T140Callback() {}
|
||||
virtual int ondata(const T140CallbackData* pData) {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
#if !defined(SWIG)
|
||||
class RtcpCallbackData
|
||||
{
|
||||
public:
|
||||
RtcpCallbackData(enum tmedia_rtcp_event_type_e event_type, uint32_t ssrc_media) {
|
||||
m_eType = event_type;
|
||||
m_nSSRC = ssrc_media;
|
||||
}
|
||||
virtual ~RtcpCallbackData() {}
|
||||
inline enum tmedia_rtcp_event_type_e getType()const {
|
||||
return m_eType;
|
||||
}
|
||||
inline uint32_t getSSRC()const {
|
||||
return m_nSSRC;
|
||||
}
|
||||
private:
|
||||
enum tmedia_rtcp_event_type_e m_eType;
|
||||
uint32_t m_nSSRC;
|
||||
};
|
||||
|
||||
class TINYWRAP_API RtcpCallback
|
||||
{
|
||||
public:
|
||||
RtcpCallback() {}
|
||||
virtual ~RtcpCallback() {}
|
||||
virtual int onevent(const RtcpCallbackData* e) {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
#endif /* #if !defined(SWIG) */
|
||||
|
||||
|
||||
|
||||
/* ======================== SipSession ========================*/
|
||||
class TINYWRAP_API SipSession
|
||||
{
|
||||
public:
|
||||
SipSession(SipStack* stack);
|
||||
#if !defined(SWIG)
|
||||
SipSession(SipStack* stack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~SipSession();
|
||||
|
||||
public:
|
||||
bool haveOwnership();
|
||||
bool addHeader(const char* name, const char* value);
|
||||
bool removeHeader(const char* name);
|
||||
bool addCaps(const char* name, const char* value);
|
||||
bool addCaps(const char* name);
|
||||
bool removeCaps(const char* name);
|
||||
bool setExpires(unsigned expires);
|
||||
bool setFromUri(const char* fromUriString);
|
||||
bool setFromUri(const SipUri* fromUri);
|
||||
bool setToUri(const char* toUriString);
|
||||
bool setToUri(const SipUri* toUri);
|
||||
bool setSilentHangup(bool silent);
|
||||
bool addSigCompCompartment(const char* compId);
|
||||
bool removeSigCompCompartment();
|
||||
#if !defined(SWIG)
|
||||
bool setAuth(const char* authHa1, const char* authIMPI);
|
||||
#endif
|
||||
unsigned getId()const;
|
||||
|
||||
#if !defined(SWIG)
|
||||
bool setWebSocketSrc(const char* host, int32_t port, const char* proto);
|
||||
const SipStack* getStack() const;
|
||||
const tsip_ssession_handle_t* getWrappedSession() {
|
||||
return m_pHandle;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
void init(SipStack* stack, tsip_ssession_handle_t* pHandle=tsk_null);
|
||||
|
||||
protected:
|
||||
tsip_ssession_handle_t* m_pHandle;
|
||||
const SipStack* m_pStack;
|
||||
};
|
||||
|
||||
/* ======================== InviteSession ========================*/
|
||||
class TINYWRAP_API InviteSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
InviteSession(SipStack* Stack);
|
||||
#if !defined(SWIG)
|
||||
InviteSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~InviteSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool hangup(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
bool sendInfo(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
const MediaSessionMgr* getMediaMgr();
|
||||
|
||||
private:
|
||||
MediaSessionMgr* m_pMediaMgr;
|
||||
};
|
||||
|
||||
|
||||
/* ======================== CallSession ========================*/
|
||||
class TINYWRAP_API CallSession : public InviteSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
CallSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
CallSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~CallSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool callAudio(const char* remoteUriString, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callAudio(const SipUri* remoteUri, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callAudioVideo(const char* remoteUriString, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callAudioVideo(const SipUri* remoteUri, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callVideo(const char* remoteUriString, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callVideo(const SipUri* remoteUri, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
|
||||
bool call(const char* remoteUriString, twrap_media_type_t media, ActionConfig* config=tsk_null);
|
||||
bool call(const SipUri* remoteUri, twrap_media_type_t media, ActionConfig* config=tsk_null);
|
||||
#if !defined(SWIG)
|
||||
bool setSupportedCodecs(int32_t codecs);
|
||||
int32_t getNegotiatedCodecs();
|
||||
bool setMediaSSRC(twrap_media_type_t media, uint32_t ssrc);
|
||||
#endif
|
||||
bool setSessionTimer(unsigned timeout, const char* refresher);
|
||||
bool set100rel(bool enabled);
|
||||
bool setRtcp(bool enabled);
|
||||
bool setRtcpMux(bool enabled);
|
||||
bool setSRtpMode(enum tmedia_srtp_mode_e mode);
|
||||
bool setAvpfMode(enum tmedia_mode_e mode);
|
||||
bool setICE(bool enabled);
|
||||
bool setICEStun(bool enabled);
|
||||
bool setICETurn(bool enabled);
|
||||
bool setSTUNServer(const char* hostname, uint16_t port);
|
||||
bool setSTUNCred(const char* username, const char* password);
|
||||
bool setVideoFps(int32_t fps);
|
||||
bool setVideoBandwidthUploadMax(int32_t max);
|
||||
bool setVideoBandwidthDownloadMax(int32_t max);
|
||||
bool setVideoPrefSize(tmedia_pref_video_size_t pref_video_size);
|
||||
bool setQoS(tmedia_qos_stype_t type, tmedia_qos_strength_t strength);
|
||||
bool hold(ActionConfig* config=tsk_null);
|
||||
bool resume(ActionConfig* config=tsk_null);
|
||||
bool transfer(const char* referToUriString, ActionConfig* config=tsk_null);
|
||||
bool acceptTransfer(ActionConfig* config=tsk_null);
|
||||
bool rejectTransfer(ActionConfig* config=tsk_null);
|
||||
bool sendDTMF(int number);
|
||||
unsigned getSessionTransferId();
|
||||
bool sendT140Data(enum tmedia_t140_data_type_e data_type, const void* data_ptr = NULL, unsigned data_size = 0);
|
||||
bool setT140Callback(const T140Callback* pT140Callback);
|
||||
#if !defined(SWIG)
|
||||
bool sendRtcpEvent(enum tmedia_rtcp_event_type_e event_type, twrap_media_type_t media_type, uint32_t ssrc_media = 0);
|
||||
bool setRtcpCallback(const RtcpCallback* pRtcpCallback, twrap_media_type_t media_type);
|
||||
const T140Callback* getT140Callback() const;
|
||||
static int t140OnDataCallback(const void* context, enum tmedia_t140_data_type_e data_type, const void* data_ptr, unsigned data_size);
|
||||
const RtcpCallback* getRtcpCallback() const;
|
||||
static int rtcpOnCallback(const void* context, enum tmedia_rtcp_event_type_e event_type, uint32_t ssrc_media);
|
||||
#endif /* #if !defined(SWIG) */
|
||||
|
||||
private:
|
||||
const T140Callback* m_pT140Callback;
|
||||
const RtcpCallback* m_pRtcpCallback;
|
||||
};
|
||||
|
||||
/* ======================== MsrpSession ========================*/
|
||||
class TINYWRAP_API MsrpSession : public InviteSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
MsrpSession(SipStack* pStack, MsrpCallback* pCallback);
|
||||
#if !defined(SWIG)
|
||||
MsrpSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~MsrpSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool setCallback(MsrpCallback* pCallback);
|
||||
bool callMsrp(const char* remoteUriString, ActionConfig* config=tsk_null);
|
||||
bool callMsrp(const SipUri* remoteUri, ActionConfig* config=tsk_null);
|
||||
bool sendMessage(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
bool sendFile(ActionConfig* config=tsk_null);
|
||||
|
||||
public: /* Public helper function */
|
||||
#if !defined(SWIG)
|
||||
inline MsrpCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
MsrpCallback* m_pCallback;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== MessagingSession ========================*/
|
||||
class TINYWRAP_API MessagingSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
MessagingSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
MessagingSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~MessagingSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool send(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
/* ======================== InfoSession ========================*/
|
||||
class TINYWRAP_API InfoSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
InfoSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
InfoSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~InfoSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool send(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
/* ======================== OptionsSession ========================*/
|
||||
class TINYWRAP_API OptionsSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
OptionsSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
OptionsSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~OptionsSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool send(ActionConfig* config=tsk_null);
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== PublicationSession ========================*/
|
||||
class TINYWRAP_API PublicationSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
PublicationSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
PublicationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~PublicationSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool publish(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
bool unPublish(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
|
||||
/* ======================== RegistrationSession ========================*/
|
||||
class TINYWRAP_API RegistrationSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
RegistrationSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
RegistrationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~RegistrationSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool register_(ActionConfig* config=tsk_null);
|
||||
bool unRegister(ActionConfig* config=tsk_null);
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
|
||||
/* ======================== SubscriptionSession ========================*/
|
||||
class TINYWRAP_API SubscriptionSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
SubscriptionSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
SubscriptionSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~SubscriptionSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool subscribe();
|
||||
bool unSubscribe();
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPSESSION_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPSESSION_H
|
||||
#define TINYWRAP_SIPSESSION_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h"
|
||||
#include "tinymedia/tmedia_qos.h"
|
||||
#include "ActionConfig.h"
|
||||
|
||||
class SipUri;
|
||||
class SipStack;
|
||||
class MsrpCallback;
|
||||
class MediaSessionMgr;
|
||||
|
||||
/* ======================== T140Callback ========================*/
|
||||
class TINYWRAP_API T140CallbackData
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
T140CallbackData(enum tmedia_t140_data_type_e data_type, const void* data_ptr, unsigned data_size) {
|
||||
m_eType = data_type;
|
||||
m_pPtr = data_ptr;
|
||||
m_nSize = data_size;
|
||||
}
|
||||
#endif
|
||||
virtual ~T140CallbackData() {}
|
||||
|
||||
inline enum tmedia_t140_data_type_e getType()const {
|
||||
return m_eType;
|
||||
}
|
||||
inline unsigned getSize()const {
|
||||
return m_nSize;
|
||||
}
|
||||
inline unsigned getData(void* pOutput, unsigned nMaxsize)const {
|
||||
unsigned nRetsize = 0;
|
||||
if(pOutput && nMaxsize && m_pPtr) {
|
||||
nRetsize = (m_nSize > nMaxsize) ? nMaxsize : m_nSize;
|
||||
memcpy(pOutput, m_pPtr, nRetsize);
|
||||
}
|
||||
return nRetsize;
|
||||
}
|
||||
|
||||
private:
|
||||
enum tmedia_t140_data_type_e m_eType;
|
||||
const void* m_pPtr;
|
||||
unsigned m_nSize;
|
||||
};
|
||||
|
||||
class TINYWRAP_API T140Callback
|
||||
{
|
||||
public:
|
||||
T140Callback() {}
|
||||
virtual ~T140Callback() {}
|
||||
virtual int ondata(const T140CallbackData* pData) {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
#if !defined(SWIG)
|
||||
class RtcpCallbackData
|
||||
{
|
||||
public:
|
||||
RtcpCallbackData(enum tmedia_rtcp_event_type_e event_type, uint32_t ssrc_media) {
|
||||
m_eType = event_type;
|
||||
m_nSSRC = ssrc_media;
|
||||
}
|
||||
virtual ~RtcpCallbackData() {}
|
||||
inline enum tmedia_rtcp_event_type_e getType()const {
|
||||
return m_eType;
|
||||
}
|
||||
inline uint32_t getSSRC()const {
|
||||
return m_nSSRC;
|
||||
}
|
||||
private:
|
||||
enum tmedia_rtcp_event_type_e m_eType;
|
||||
uint32_t m_nSSRC;
|
||||
};
|
||||
|
||||
class TINYWRAP_API RtcpCallback
|
||||
{
|
||||
public:
|
||||
RtcpCallback() {}
|
||||
virtual ~RtcpCallback() {}
|
||||
virtual int onevent(const RtcpCallbackData* e) {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
#endif /* #if !defined(SWIG) */
|
||||
|
||||
|
||||
|
||||
/* ======================== SipSession ========================*/
|
||||
class TINYWRAP_API SipSession
|
||||
{
|
||||
public:
|
||||
SipSession(SipStack* stack);
|
||||
#if !defined(SWIG)
|
||||
SipSession(SipStack* stack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~SipSession();
|
||||
|
||||
public:
|
||||
bool haveOwnership();
|
||||
bool addHeader(const char* name, const char* value);
|
||||
bool removeHeader(const char* name);
|
||||
bool addCaps(const char* name, const char* value);
|
||||
bool addCaps(const char* name);
|
||||
bool removeCaps(const char* name);
|
||||
bool setExpires(unsigned expires);
|
||||
bool setFromUri(const char* fromUriString);
|
||||
bool setFromUri(const SipUri* fromUri);
|
||||
bool setToUri(const char* toUriString);
|
||||
bool setToUri(const SipUri* toUri);
|
||||
bool setSilentHangup(bool silent);
|
||||
bool addSigCompCompartment(const char* compId);
|
||||
bool removeSigCompCompartment();
|
||||
#if !defined(SWIG)
|
||||
bool setAuth(const char* authHa1, const char* authIMPI);
|
||||
#endif
|
||||
unsigned getId()const;
|
||||
|
||||
#if !defined(SWIG)
|
||||
bool setWebSocketSrc(const char* host, int32_t port, const char* proto);
|
||||
const SipStack* getStack() const;
|
||||
const tsip_ssession_handle_t* getWrappedSession() {
|
||||
return m_pHandle;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
void init(SipStack* stack, tsip_ssession_handle_t* pHandle=tsk_null);
|
||||
|
||||
protected:
|
||||
tsip_ssession_handle_t* m_pHandle;
|
||||
const SipStack* m_pStack;
|
||||
};
|
||||
|
||||
/* ======================== InviteSession ========================*/
|
||||
class TINYWRAP_API InviteSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
InviteSession(SipStack* Stack);
|
||||
#if !defined(SWIG)
|
||||
InviteSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~InviteSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool hangup(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
bool sendInfo(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
const MediaSessionMgr* getMediaMgr();
|
||||
|
||||
private:
|
||||
MediaSessionMgr* m_pMediaMgr;
|
||||
};
|
||||
|
||||
|
||||
/* ======================== CallSession ========================*/
|
||||
class TINYWRAP_API CallSession : public InviteSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
CallSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
CallSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~CallSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool callAudio(const char* remoteUriString, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callAudio(const SipUri* remoteUri, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callAudioVideo(const char* remoteUriString, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callAudioVideo(const SipUri* remoteUri, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callVideo(const char* remoteUriString, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
bool callVideo(const SipUri* remoteUri, ActionConfig* config=tsk_null); /* @deprecated */
|
||||
|
||||
bool call(const char* remoteUriString, twrap_media_type_t media, ActionConfig* config=tsk_null);
|
||||
bool call(const SipUri* remoteUri, twrap_media_type_t media, ActionConfig* config=tsk_null);
|
||||
#if !defined(SWIG)
|
||||
bool setSupportedCodecs(int32_t codecs);
|
||||
int32_t getNegotiatedCodecs();
|
||||
bool setMediaSSRC(twrap_media_type_t media, uint32_t ssrc);
|
||||
#endif
|
||||
bool setSessionTimer(unsigned timeout, const char* refresher);
|
||||
bool set100rel(bool enabled);
|
||||
bool setRtcp(bool enabled);
|
||||
bool setRtcpMux(bool enabled);
|
||||
bool setSRtpMode(enum tmedia_srtp_mode_e mode);
|
||||
bool setAvpfMode(enum tmedia_mode_e mode);
|
||||
bool setICE(bool enabled);
|
||||
bool setICEStun(bool enabled);
|
||||
bool setICETurn(bool enabled);
|
||||
bool setSTUNServer(const char* hostname, uint16_t port);
|
||||
bool setSTUNCred(const char* username, const char* password);
|
||||
bool setVideoFps(int32_t fps);
|
||||
bool setVideoBandwidthUploadMax(int32_t max);
|
||||
bool setVideoBandwidthDownloadMax(int32_t max);
|
||||
bool setVideoPrefSize(tmedia_pref_video_size_t pref_video_size);
|
||||
bool setQoS(tmedia_qos_stype_t type, tmedia_qos_strength_t strength);
|
||||
bool hold(ActionConfig* config=tsk_null);
|
||||
bool resume(ActionConfig* config=tsk_null);
|
||||
bool transfer(const char* referToUriString, ActionConfig* config=tsk_null);
|
||||
bool acceptTransfer(ActionConfig* config=tsk_null);
|
||||
bool rejectTransfer(ActionConfig* config=tsk_null);
|
||||
bool sendDTMF(int number);
|
||||
unsigned getSessionTransferId();
|
||||
bool sendT140Data(enum tmedia_t140_data_type_e data_type, const void* data_ptr = NULL, unsigned data_size = 0);
|
||||
bool setT140Callback(const T140Callback* pT140Callback);
|
||||
#if !defined(SWIG)
|
||||
bool sendRtcpEvent(enum tmedia_rtcp_event_type_e event_type, twrap_media_type_t media_type, uint32_t ssrc_media = 0);
|
||||
bool setRtcpCallback(const RtcpCallback* pRtcpCallback, twrap_media_type_t media_type);
|
||||
const T140Callback* getT140Callback() const;
|
||||
static int t140OnDataCallback(const void* context, enum tmedia_t140_data_type_e data_type, const void* data_ptr, unsigned data_size);
|
||||
const RtcpCallback* getRtcpCallback() const;
|
||||
static int rtcpOnCallback(const void* context, enum tmedia_rtcp_event_type_e event_type, uint32_t ssrc_media);
|
||||
#endif /* #if !defined(SWIG) */
|
||||
|
||||
private:
|
||||
const T140Callback* m_pT140Callback;
|
||||
const RtcpCallback* m_pRtcpCallback;
|
||||
};
|
||||
|
||||
/* ======================== MsrpSession ========================*/
|
||||
class TINYWRAP_API MsrpSession : public InviteSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
MsrpSession(SipStack* pStack, MsrpCallback* pCallback);
|
||||
#if !defined(SWIG)
|
||||
MsrpSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~MsrpSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool setCallback(MsrpCallback* pCallback);
|
||||
bool callMsrp(const char* remoteUriString, ActionConfig* config=tsk_null);
|
||||
bool callMsrp(const SipUri* remoteUri, ActionConfig* config=tsk_null);
|
||||
bool sendMessage(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
bool sendFile(ActionConfig* config=tsk_null);
|
||||
|
||||
public: /* Public helper function */
|
||||
#if !defined(SWIG)
|
||||
inline MsrpCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
MsrpCallback* m_pCallback;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== MessagingSession ========================*/
|
||||
class TINYWRAP_API MessagingSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
MessagingSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
MessagingSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~MessagingSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool send(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
/* ======================== InfoSession ========================*/
|
||||
class TINYWRAP_API InfoSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
InfoSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
InfoSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~InfoSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool send(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
/* ======================== OptionsSession ========================*/
|
||||
class TINYWRAP_API OptionsSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
OptionsSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
OptionsSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~OptionsSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool send(ActionConfig* config=tsk_null);
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* ======================== PublicationSession ========================*/
|
||||
class TINYWRAP_API PublicationSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
PublicationSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
PublicationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~PublicationSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool publish(const void* payload, unsigned len, ActionConfig* config=tsk_null);
|
||||
bool unPublish(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
|
||||
/* ======================== RegistrationSession ========================*/
|
||||
class TINYWRAP_API RegistrationSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
RegistrationSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
RegistrationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~RegistrationSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool register_(ActionConfig* config=tsk_null);
|
||||
bool unRegister(ActionConfig* config=tsk_null);
|
||||
bool accept(ActionConfig* config=tsk_null);
|
||||
bool reject(ActionConfig* config=tsk_null);
|
||||
};
|
||||
|
||||
|
||||
/* ======================== SubscriptionSession ========================*/
|
||||
class TINYWRAP_API SubscriptionSession : public SipSession
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
SubscriptionSession(SipStack* pStack);
|
||||
#if !defined(SWIG)
|
||||
SubscriptionSession(SipStack* pStack, tsip_ssession_handle_t* pHandle);
|
||||
#endif
|
||||
virtual ~SubscriptionSession();
|
||||
|
||||
public: /* Public functions */
|
||||
bool subscribe();
|
||||
bool unSubscribe();
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPSESSION_H */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,123 +1,123 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPSTACK_H
|
||||
#define TINYWRAP_SIPSTACK_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "SipCallback.h"
|
||||
#include "SafeObject.h"
|
||||
|
||||
#include "tinydav/tdav.h"
|
||||
#include "tinysip.h"
|
||||
#include "tinyhttp.h"
|
||||
|
||||
class DDebugCallback;
|
||||
|
||||
class TINYWRAP_API SipStack: public SafeObject
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
SipStack(SipCallback* pCallback, const char* realm_uri, const char* impi_uri, const char* impu_uri);
|
||||
~SipStack();
|
||||
|
||||
public: /* API functions */
|
||||
bool start();
|
||||
bool setDebugCallback(DDebugCallback* pCallback);
|
||||
bool setDisplayName(const char* display_name);
|
||||
bool setRealm(const char* realm_uri);
|
||||
bool setIMPI(const char* impi);
|
||||
bool setIMPU(const char* impu_uri);
|
||||
bool setPassword(const char* password);
|
||||
bool setAMF(const char* amf);
|
||||
bool setOperatorId(const char* opid);
|
||||
bool setProxyCSCF(const char* fqdn, unsigned short port, const char* transport, const char* ipversion);
|
||||
bool setLocalIP(const char* ip, const char* transport=tsk_null);
|
||||
bool setLocalPort(unsigned short port, const char* transport=tsk_null);
|
||||
bool setEarlyIMS(bool enabled);
|
||||
bool addHeader(const char* name, const char* value);
|
||||
bool removeHeader(const char* name);
|
||||
bool addDnsServer(const char* ip);
|
||||
bool setDnsDiscovery(bool enabled);
|
||||
bool setAoR(const char* ip, int port);
|
||||
#if !defined(SWIG)
|
||||
bool setMode(enum tsip_stack_mode_e mode);
|
||||
#endif
|
||||
|
||||
bool setSigCompParams(unsigned dms, unsigned sms, unsigned cpb, bool enablePresDict);
|
||||
bool addSigCompCompartment(const char* compId);
|
||||
bool removeSigCompCompartment(const char* compId);
|
||||
|
||||
bool setSTUNEnabledForICE(bool enabled); // @deprecated
|
||||
bool setSTUNServer(const char* hostname, unsigned short port); // @deprecated
|
||||
bool setSTUNCred(const char* login, const char* password); // @deprecated
|
||||
bool setSTUNEnabled(bool enabled);
|
||||
|
||||
bool setTLSSecAgree(bool enabled);
|
||||
bool setSSLCertificates(const char* privKey, const char* pubKey, const char* caKey, bool verify = false);
|
||||
bool setSSLCretificates(const char* privKey, const char* pubKey, const char* caKey, bool verify = false); /*@deprecated: typo */
|
||||
bool setIPSecSecAgree(bool enabled);
|
||||
bool setIPSecParameters(const char* algo, const char* ealgo, const char* mode, const char* proto);
|
||||
|
||||
char* dnsENUM(const char* service, const char* e164num, const char* domain);
|
||||
char* dnsNaptrSrv(const char* domain, const char* service, unsigned short *OUTPUT);
|
||||
char* dnsSrv(const char* service, unsigned short* OUTPUT);
|
||||
|
||||
bool setMaxFDs(unsigned max_fds);
|
||||
|
||||
char* getLocalIPnPort(const char* protocol, unsigned short* OUTPUT);
|
||||
|
||||
char* getPreferredIdentity();
|
||||
|
||||
bool isValid();
|
||||
bool stop();
|
||||
|
||||
static bool initialize();
|
||||
static bool deInitialize();
|
||||
static void setCodecs(tdav_codec_id_t codecs);
|
||||
static void setCodecs_2(int64_t codecs); // For stupid languages
|
||||
static bool setCodecPriority(tdav_codec_id_t codec_id, int priority);
|
||||
static bool setCodecPriority_2(int codec, int priority);// For stupid languages
|
||||
static bool isCodecSupported(tdav_codec_id_t codec_id);
|
||||
static bool isIPSecSupported();
|
||||
|
||||
public: /* Public helper function */
|
||||
#if !defined(SWIG)
|
||||
inline tsip_stack_handle_t* getHandle()const {
|
||||
return m_pHandle;
|
||||
}
|
||||
inline SipCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
inline DDebugCallback* getDebugCallback() const {
|
||||
return m_pDebugCallback;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
SipCallback* m_pCallback;
|
||||
DDebugCallback* m_pDebugCallback;
|
||||
tsip_stack_handle_t* m_pHandle;
|
||||
|
||||
static bool g_bInitialized;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPSTACK_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPSTACK_H
|
||||
#define TINYWRAP_SIPSTACK_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "SipCallback.h"
|
||||
#include "SafeObject.h"
|
||||
|
||||
#include "tinydav/tdav.h"
|
||||
#include "tinysip.h"
|
||||
#include "tinyhttp.h"
|
||||
|
||||
class DDebugCallback;
|
||||
|
||||
class TINYWRAP_API SipStack: public SafeObject
|
||||
{
|
||||
public: /* ctor() and dtor() */
|
||||
SipStack(SipCallback* pCallback, const char* realm_uri, const char* impi_uri, const char* impu_uri);
|
||||
~SipStack();
|
||||
|
||||
public: /* API functions */
|
||||
bool start();
|
||||
bool setDebugCallback(DDebugCallback* pCallback);
|
||||
bool setDisplayName(const char* display_name);
|
||||
bool setRealm(const char* realm_uri);
|
||||
bool setIMPI(const char* impi);
|
||||
bool setIMPU(const char* impu_uri);
|
||||
bool setPassword(const char* password);
|
||||
bool setAMF(const char* amf);
|
||||
bool setOperatorId(const char* opid);
|
||||
bool setProxyCSCF(const char* fqdn, unsigned short port, const char* transport, const char* ipversion);
|
||||
bool setLocalIP(const char* ip, const char* transport=tsk_null);
|
||||
bool setLocalPort(unsigned short port, const char* transport=tsk_null);
|
||||
bool setEarlyIMS(bool enabled);
|
||||
bool addHeader(const char* name, const char* value);
|
||||
bool removeHeader(const char* name);
|
||||
bool addDnsServer(const char* ip);
|
||||
bool setDnsDiscovery(bool enabled);
|
||||
bool setAoR(const char* ip, int port);
|
||||
#if !defined(SWIG)
|
||||
bool setMode(enum tsip_stack_mode_e mode);
|
||||
#endif
|
||||
|
||||
bool setSigCompParams(unsigned dms, unsigned sms, unsigned cpb, bool enablePresDict);
|
||||
bool addSigCompCompartment(const char* compId);
|
||||
bool removeSigCompCompartment(const char* compId);
|
||||
|
||||
bool setSTUNEnabledForICE(bool enabled); // @deprecated
|
||||
bool setSTUNServer(const char* hostname, unsigned short port); // @deprecated
|
||||
bool setSTUNCred(const char* login, const char* password); // @deprecated
|
||||
bool setSTUNEnabled(bool enabled);
|
||||
|
||||
bool setTLSSecAgree(bool enabled);
|
||||
bool setSSLCertificates(const char* privKey, const char* pubKey, const char* caKey, bool verify = false);
|
||||
bool setSSLCretificates(const char* privKey, const char* pubKey, const char* caKey, bool verify = false); /*@deprecated: typo */
|
||||
bool setIPSecSecAgree(bool enabled);
|
||||
bool setIPSecParameters(const char* algo, const char* ealgo, const char* mode, const char* proto);
|
||||
|
||||
char* dnsENUM(const char* service, const char* e164num, const char* domain);
|
||||
char* dnsNaptrSrv(const char* domain, const char* service, unsigned short *OUTPUT);
|
||||
char* dnsSrv(const char* service, unsigned short* OUTPUT);
|
||||
|
||||
bool setMaxFDs(unsigned max_fds);
|
||||
|
||||
char* getLocalIPnPort(const char* protocol, unsigned short* OUTPUT);
|
||||
|
||||
char* getPreferredIdentity();
|
||||
|
||||
bool isValid();
|
||||
bool stop();
|
||||
|
||||
static bool initialize();
|
||||
static bool deInitialize();
|
||||
static void setCodecs(tdav_codec_id_t codecs);
|
||||
static void setCodecs_2(int64_t codecs); // For stupid languages
|
||||
static bool setCodecPriority(tdav_codec_id_t codec_id, int priority);
|
||||
static bool setCodecPriority_2(int codec, int priority);// For stupid languages
|
||||
static bool isCodecSupported(tdav_codec_id_t codec_id);
|
||||
static bool isIPSecSupported();
|
||||
|
||||
public: /* Public helper function */
|
||||
#if !defined(SWIG)
|
||||
inline tsip_stack_handle_t* getHandle()const {
|
||||
return m_pHandle;
|
||||
}
|
||||
inline SipCallback* getCallback()const {
|
||||
return m_pCallback;
|
||||
}
|
||||
inline DDebugCallback* getDebugCallback() const {
|
||||
return m_pDebugCallback;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
SipCallback* m_pCallback;
|
||||
DDebugCallback* m_pDebugCallback;
|
||||
tsip_stack_handle_t* m_pHandle;
|
||||
|
||||
static bool g_bInitialized;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPSTACK_H */
|
||||
|
|
|
@ -1,457 +1,457 @@
|
|||
|
||||
%{
|
||||
#include "ActionConfig.h"
|
||||
#include "MediaSessionMgr.h"
|
||||
#include "MediaContent.h"
|
||||
#include "SipUri.h"
|
||||
#include "SipMessage.h"
|
||||
#include "SipEvent.h"
|
||||
#include "SipSession.h"
|
||||
|
||||
#include "ProxyPluginMgr.h"
|
||||
#include "ProxyConsumer.h"
|
||||
#include "ProxyProducer.h"
|
||||
|
||||
#include "SipCallback.h"
|
||||
#include "SafeObject.h"
|
||||
#include "SipStack.h"
|
||||
%}
|
||||
|
||||
/* Callbacks */
|
||||
%feature("director") SipCallback;
|
||||
%feature("director") ProxyPluginMgrCallback;
|
||||
%feature("director") ProxyAudioConsumerCallback;
|
||||
%feature("director") ProxyVideoConsumerCallback;
|
||||
%feature("director") ProxyAudioProducerCallback;
|
||||
%feature("director") ProxyVideoProducerCallback;
|
||||
%feature("director") T140Callback;
|
||||
|
||||
%nodefaultctor;
|
||||
%include "ActionConfig.h"
|
||||
%include "MediaSessionMgr.h"
|
||||
%include "MediaContent.h"
|
||||
%include "SipUri.h"
|
||||
%include "SipMessage.h"
|
||||
%include "SipEvent.h"
|
||||
%include "SipSession.h"
|
||||
|
||||
%include "ProxyPluginMgr.h"
|
||||
%include "ProxyConsumer.h"
|
||||
%include "ProxyProducer.h"
|
||||
|
||||
%include "SipCallback.h"
|
||||
%include "SafeObject.h"
|
||||
%include "SipStack.h"
|
||||
%clearnodefaultctor;
|
||||
|
||||
|
||||
/* ====== From "tinySIP\include\tsip.h" ====== */
|
||||
typedef enum tsip_stack_mode_e
|
||||
{
|
||||
tsip_stack_mode_ua,
|
||||
tsip_stack_mode_p2p,
|
||||
tsip_stack_mode_mediaproxy,
|
||||
tsip_stack_mode_mcu
|
||||
}
|
||||
tsip_stack_mode_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_messag_common.h" ====== */
|
||||
typedef enum tsip_request_type_e
|
||||
{
|
||||
tsip_NONE = 0,
|
||||
|
||||
tsip_ACK,
|
||||
tsip_BYE,
|
||||
tsip_CANCEL,
|
||||
tsip_INVITE,
|
||||
tsip_OPTIONS,
|
||||
tsip_REGISTER,
|
||||
tsip_SUBSCRIBE,
|
||||
tsip_NOTIFY,
|
||||
tsip_REFER,
|
||||
tsip_INFO,
|
||||
tsip_UPDATE,
|
||||
tsip_MESSAGE,
|
||||
tsip_PUBLISH,
|
||||
tsip_PRACK
|
||||
}
|
||||
tsip_request_type_t;
|
||||
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_event.h" ====== */
|
||||
typedef enum tsip_event_type_e
|
||||
{
|
||||
tsip_event_invite,
|
||||
tsip_event_message,
|
||||
tsip_event_info,
|
||||
tsip_event_options,
|
||||
tsip_event_publish,
|
||||
tsip_event_register,
|
||||
tsip_event_subscribe,
|
||||
|
||||
tsip_event_dialog
|
||||
}
|
||||
tsip_event_type_t;
|
||||
|
||||
// 7xx ==> errors
|
||||
#define tsip_event_code_dialog_transport_error 702
|
||||
#define tsip_event_code_dialog_global_error 703
|
||||
#define tsip_event_code_dialog_message_error 704
|
||||
|
||||
// 8xx ==> success
|
||||
#define tsip_event_code_dialog_request_incoming 800
|
||||
#define tsip_event_code_dialog_request_outgoing 802
|
||||
#define tsip_event_code_dialog_request_cancelled 803
|
||||
#define tsip_event_code_dialog_request_sent 804
|
||||
|
||||
// 9xx ==> Informational
|
||||
#define tsip_event_code_dialog_connecting 900
|
||||
#define tsip_event_code_dialog_connected 901
|
||||
#define tsip_event_code_dialog_terminating 902
|
||||
#define tsip_event_code_dialog_terminated 903
|
||||
#define tsip_event_code_stack_starting 950
|
||||
#define tsip_event_code_stack_started 951
|
||||
#define tsip_event_code_stack_stopping 952
|
||||
#define tsip_event_code_stack_stopped 953
|
||||
#define tsip_event_code_stack_failed_to_start 954
|
||||
#define tsip_event_code_stack_failed_to_stop 955
|
||||
#define tsip_event_code_stack_disconnected 956
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_register.h" ====== */
|
||||
typedef enum tsip_register_event_type_e
|
||||
{
|
||||
tsip_i_newreg,
|
||||
|
||||
tsip_i_register, // refresh
|
||||
tsip_ao_register,
|
||||
|
||||
tsip_i_unregister,
|
||||
tsip_ao_unregister,
|
||||
}
|
||||
tsip_register_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_subscribe.h" ====== */
|
||||
typedef enum tsip_subscribe_event_type_e
|
||||
{
|
||||
tsip_i_subscribe,
|
||||
tsip_ao_subscribe,
|
||||
|
||||
tsip_i_unsubscribe,
|
||||
tsip_ao_unsubscribe,
|
||||
|
||||
tsip_i_notify,
|
||||
tsip_ao_notify
|
||||
}
|
||||
tsip_subscribe_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_publish.h" ====== */
|
||||
typedef enum tsip_publish_event_type_e
|
||||
{
|
||||
tsip_i_publish,
|
||||
tsip_ao_publish,
|
||||
|
||||
tsip_i_unpublish,
|
||||
tsip_ao_unpublish
|
||||
}
|
||||
tsip_publish_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_message.h" ====== */
|
||||
typedef enum tsip_message_event_type_e
|
||||
{
|
||||
tsip_i_message,
|
||||
tsip_ao_message,
|
||||
}
|
||||
tsip_message_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_info.h" ====== */
|
||||
typedef enum tsip_info_event_type_e
|
||||
{
|
||||
tsip_i_info,
|
||||
tsip_ao_info,
|
||||
}
|
||||
tsip_info_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_options.h" ====== */
|
||||
typedef enum tsip_options_event_type_e
|
||||
{
|
||||
tsip_i_options,
|
||||
tsip_ao_options,
|
||||
}
|
||||
tsip_options_event_type_t;
|
||||
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_invite.h" ====== */
|
||||
typedef enum tsip_invite_event_type_e
|
||||
{
|
||||
// ============================
|
||||
// Sip Events
|
||||
//
|
||||
tsip_i_newcall,
|
||||
|
||||
//! in-dialog requests/reponses
|
||||
tsip_i_request,
|
||||
tsip_ao_request,
|
||||
|
||||
/* 3GPP TS 24.629: Explicit Call Transfer (ECT) */
|
||||
tsip_o_ect_trying,
|
||||
tsip_o_ect_accepted,
|
||||
tsip_o_ect_completed,
|
||||
tsip_o_ect_failed,
|
||||
tsip_o_ect_notify,
|
||||
tsip_i_ect_requested,
|
||||
tsip_i_ect_newcall,
|
||||
tsip_i_ect_completed,
|
||||
tsip_i_ect_failed,
|
||||
tsip_i_ect_notify,
|
||||
|
||||
// ============================
|
||||
// Media Events
|
||||
//
|
||||
|
||||
tsip_m_early_media,
|
||||
tsip_m_updating, // Trying to update from Audio -> Video for example
|
||||
tsip_m_updated, // succeed to update
|
||||
|
||||
/* 3GPP TS 24.610: Communication Hold */
|
||||
tsip_m_local_hold_ok,
|
||||
tsip_m_local_hold_nok,
|
||||
tsip_m_local_resume_ok,
|
||||
tsip_m_local_resume_nok,
|
||||
tsip_m_remote_hold,
|
||||
tsip_m_remote_resume,
|
||||
}
|
||||
tsip_invite_event_type_t;
|
||||
|
||||
|
||||
/* ====== From "tinymedia/tmedia_qos.h" ====== */
|
||||
typedef enum tmedia_qos_stype_e
|
||||
{
|
||||
tmedia_qos_stype_none,/* not part of the RFC */
|
||||
|
||||
tmedia_qos_stype_segmented,
|
||||
tmedia_qos_stype_e2e,
|
||||
}
|
||||
tmedia_qos_stype_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_qos.h" ====== */
|
||||
typedef enum tmedia_qos_strength_e
|
||||
{
|
||||
/* do no change the order (none -> optional -> manadatory) */
|
||||
tmedia_qos_strength_none,
|
||||
tmedia_qos_strength_failure,
|
||||
tmedia_qos_strength_unknown,
|
||||
tmedia_qos_strength_optional,
|
||||
tmedia_qos_strength_mandatory
|
||||
}
|
||||
tmedia_qos_strength_t;
|
||||
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
// used by tinyWRAP
|
||||
typedef enum tmedia_chroma_e
|
||||
{
|
||||
tmedia_chroma_none=0,
|
||||
tmedia_chroma_rgb24, // will be stored as bgr24 on x86 (little endians) machines; e.g. WindowsPhone7
|
||||
tmedia_chroma_bgr24, // used by windows consumer (DirectShow) -
|
||||
tmedia_chroma_rgb32, // used by iOS4 consumer (iPhone and iPod touch)
|
||||
tmedia_chroma_rgb565le, // (used by both android and wince consumers)
|
||||
tmedia_chroma_rgb565be,
|
||||
tmedia_chroma_nv12, // used by iOS4 producer (iPhone and iPod Touch 3GS and 4)
|
||||
tmedia_chroma_nv21, // Yuv420 SP (used by android producer)
|
||||
tmedia_chroma_yuv422p,
|
||||
tmedia_chroma_uyvy422, // used by iOS4 producer (iPhone and iPod Touch 3G)
|
||||
tmedia_chroma_yuv420p, // Default
|
||||
tmedia_chroma_mjpeg, // Compressed. e.g. used by VirtualBox (Windows as host and Ubuntu as guest)
|
||||
tmedia_chroma_yuyv422, // YUYV422 (V4L2 preferred format)
|
||||
}
|
||||
tmedia_chroma_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_mode_e
|
||||
{
|
||||
tmedia_mode_none,
|
||||
tmedia_mode_optional,
|
||||
tmedia_mode_mandatory
|
||||
}
|
||||
tmedia_mode_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_srtp_mode_e
|
||||
{
|
||||
tmedia_srtp_mode_none,
|
||||
tmedia_srtp_mode_optional,
|
||||
tmedia_srtp_mode_mandatory
|
||||
}
|
||||
tmedia_srtp_mode_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_srtp_type_e
|
||||
{
|
||||
tmedia_srtp_type_none = 0x00,
|
||||
tmedia_srtp_type_sdes = 0x01,
|
||||
tmedia_srtp_type_dtls = 0x02,
|
||||
tmedia_srtp_type_sdes_dtls = (0x01 | 0x02)
|
||||
}
|
||||
tmedia_srtp_type_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_t140_data_type_e
|
||||
{
|
||||
tmedia_t140_data_type_utf8,
|
||||
tmedia_t140_data_type_zero_width_no_break_space = 0xefbbbf,
|
||||
tmedia_t140_data_type_backspace = 0x08,
|
||||
tmedia_t140_data_type_esc = 0x1b,
|
||||
tmedia_t140_data_type_cr = 0x0d,
|
||||
tmedia_t140_data_type_lf = 0x0a,
|
||||
tmedia_t140_data_type_cr_lf = 0x0d0a,
|
||||
tmedia_t140_data_type_interrupt2 = 0x61,
|
||||
tmedia_t140_data_type_bell = 0x07,
|
||||
tmedia_t140_data_type_sos = 0x98,
|
||||
tmedia_t140_data_type_string_term = 0x9c,
|
||||
tmedia_t140_data_type_graphic_start = 0x9b,
|
||||
tmedia_t140_data_type_graphic_end = 0x6d,
|
||||
tmedia_t140_data_type_loss_char_char = 0xfffd,
|
||||
tmedia_t140_data_type_loss_utf8 = 0xefbfbd,
|
||||
}
|
||||
tmedia_t140_data_type_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
#typedef enum tmedia_rtcp_event_type_e
|
||||
#{
|
||||
# tmedia_rtcp_event_type_fir, // Full Intra Refresh
|
||||
#}
|
||||
#tmedia_rtcp_event_type_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_profile_e
|
||||
{
|
||||
tmedia_profile_default,
|
||||
tmedia_profile_rtcweb
|
||||
}
|
||||
tmedia_profile_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
// @deprecated
|
||||
typedef enum tmedia_bandwidth_level_e
|
||||
{
|
||||
tmedia_bl_low,
|
||||
tmedia_bl_medium,
|
||||
tmedia_bl_hight,
|
||||
tmedia_bl_unrestricted
|
||||
}
|
||||
tmedia_bandwidth_level_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_pref_video_size_s
|
||||
{ /* must be sorted like this */
|
||||
tmedia_pref_video_size_sqcif, // 128 x 98
|
||||
tmedia_pref_video_size_qcif, // 176 x 144
|
||||
tmedia_pref_video_size_qvga, // 320 x 240
|
||||
tmedia_pref_video_size_cif, // 352 x 288
|
||||
tmedia_pref_video_size_hvga, // 480 x 320
|
||||
tmedia_pref_video_size_vga, // 640 x 480
|
||||
tmedia_pref_video_size_4cif, // 704 x 576
|
||||
tmedia_pref_video_size_wvga, // 800 x 480
|
||||
tmedia_pref_video_size_svga, // 800 x 600
|
||||
tmedia_pref_video_size_480p, // 852 x 480
|
||||
tmedia_pref_video_size_xga, // 1024 x 768
|
||||
tmedia_pref_video_size_720p, // 1280 x 720
|
||||
tmedia_pref_video_size_16cif, // 1408 x 1152
|
||||
tmedia_pref_video_size_1080p, // 1920 x 1080
|
||||
tmedia_pref_video_size_2160p, // 3840 x 2160
|
||||
}
|
||||
tmedia_pref_video_size_t;
|
||||
|
||||
|
||||
/* ====== From "tinymedia/tmedia_codec.h" ====== */
|
||||
typedef enum tmedia_codec_id_e
|
||||
{
|
||||
tmedia_codec_id_none = 0x00000000,
|
||||
|
||||
tmedia_codec_id_amr_nb_oa = 0x00000001<<0,
|
||||
tmedia_codec_id_amr_nb_be = 0x00000001<<1,
|
||||
tmedia_codec_id_amr_wb_oa = 0x00000001<<2,
|
||||
tmedia_codec_id_amr_wb_be = 0x00000001<<3,
|
||||
tmedia_codec_id_gsm = 0x00000001<<4,
|
||||
tmedia_codec_id_pcma = 0x00000001<<5,
|
||||
tmedia_codec_id_pcmu = 0x00000001<<6,
|
||||
tmedia_codec_id_ilbc = 0x00000001<<7,
|
||||
tmedia_codec_id_speex_nb = 0x00000001<<8,
|
||||
tmedia_codec_id_speex_wb = 0x00000001<<9,
|
||||
tmedia_codec_id_speex_uwb = 0x00000001<<10,
|
||||
tmedia_codec_id_bv16 = 0x00000001<<11,
|
||||
tmedia_codec_id_bv32 = 0x00000001<<12,
|
||||
tmedia_codec_id_opus = 0x00000001<<13,
|
||||
tmedia_codec_id_g729ab = 0x00000001<<14,
|
||||
tmedia_codec_id_g722 = 0x00000001<<15,
|
||||
|
||||
/* room for new Audio codecs */
|
||||
|
||||
tmedia_codec_id_h261 = 0x00010000<<0,
|
||||
tmedia_codec_id_h263 = 0x00010000<<1,
|
||||
tmedia_codec_id_h263p = 0x00010000<<2,
|
||||
tmedia_codec_id_h263pp = 0x00010000<<3,
|
||||
tmedia_codec_id_h264_bp = 0x00010000<<4,
|
||||
tmedia_codec_id_h264_mp = 0x00010000<<5,
|
||||
tmedia_codec_id_h264_hp = 0x00010000<<6,
|
||||
tmedia_codec_id_h264_bp10 = tmedia_codec_id_h264_bp, // @deprecated
|
||||
tmedia_codec_id_h264_bp20 = tmedia_codec_id_h264_bp, // @deprecated
|
||||
tmedia_codec_id_h264_bp30 = tmedia_codec_id_h264_bp, // @deprecated
|
||||
tmedia_codec_id_h264_svc = 0x00010000<<7,
|
||||
tmedia_codec_id_theora = 0x00010000<<8,
|
||||
tmedia_codec_id_mp4ves_es = 0x00010000<<9,
|
||||
tmedia_codec_id_vp8 = 0x00010000<<10,
|
||||
|
||||
/* room for new Video codecs */
|
||||
|
||||
tmedia_codec_id_t140 = 0x00010000<<14,
|
||||
tmedia_codec_id_red = 0x00010000<<15,
|
||||
}
|
||||
tmedia_codec_id_t;
|
||||
|
||||
/* ====== From "tinydav/tdav.h" ====== */
|
||||
// @deprecated: to be replaced by "tmedia_codec_id_t" in Doubango 3.0
|
||||
typedef enum tdav_codec_id_e
|
||||
{
|
||||
tdav_codec_id_none = 0x00000000,
|
||||
|
||||
tdav_codec_id_amr_nb_oa = 0x00000001<<0,
|
||||
tdav_codec_id_amr_nb_be = 0x00000001<<1,
|
||||
tdav_codec_id_amr_wb_oa = 0x00000001<<2,
|
||||
tdav_codec_id_amr_wb_be = 0x00000001<<3,
|
||||
tdav_codec_id_gsm = 0x00000001<<4,
|
||||
tdav_codec_id_pcma = 0x00000001<<5,
|
||||
tdav_codec_id_pcmu = 0x00000001<<6,
|
||||
tdav_codec_id_ilbc = 0x00000001<<7,
|
||||
tdav_codec_id_speex_nb = 0x00000001<<8,
|
||||
tdav_codec_id_speex_wb = 0x00000001<<9,
|
||||
tdav_codec_id_speex_uwb = 0x00000001<<10,
|
||||
tdav_codec_id_bv16 = 0x00000001<<11,
|
||||
tdav_codec_id_bv32 = 0x00000001<<12,
|
||||
tdav_codec_id_opus = 0x00000001<<13,
|
||||
tdav_codec_id_g729ab = 0x00000001<<14,
|
||||
tdav_codec_id_g722 = 0x00000001<<15,
|
||||
|
||||
/* room for new Audio codecs */
|
||||
|
||||
tdav_codec_id_h261 = 0x00010000<<0,
|
||||
tdav_codec_id_h263 = 0x00010000<<1,
|
||||
tdav_codec_id_h263p = 0x00010000<<2,
|
||||
tdav_codec_id_h263pp = 0x00010000<<3,
|
||||
tdav_codec_id_h264_bp = 0x00010000<<4,
|
||||
tdav_codec_id_h264_mp = 0x00010000<<5,
|
||||
tdav_codec_id_h264_hp = 0x00010000<<6,
|
||||
tdav_codec_id_h264_bp10 = tdav_codec_id_h264_bp, // @deprecated
|
||||
tdav_codec_id_h264_bp20 = tdav_codec_id_h264_bp, // @deprecated
|
||||
tdav_codec_id_h264_bp30 = tdav_codec_id_h264_bp, // @deprecated
|
||||
tdav_codec_id_h264_svc = 0x00010000<<7,
|
||||
tdav_codec_id_theora = 0x00010000<<8,
|
||||
tdav_codec_id_mp4ves_es = 0x00010000<<9,
|
||||
tdav_codec_id_vp8 = 0x00010000<<10,
|
||||
|
||||
/* room for new Video codecs */
|
||||
|
||||
tdav_codec_id_t140 = 0x00010000<<14,
|
||||
tdav_codec_id_red = 0x00010000<<15,
|
||||
}
|
||||
tdav_codec_id_t;
|
||||
|
||||
%{
|
||||
#include "ActionConfig.h"
|
||||
#include "MediaSessionMgr.h"
|
||||
#include "MediaContent.h"
|
||||
#include "SipUri.h"
|
||||
#include "SipMessage.h"
|
||||
#include "SipEvent.h"
|
||||
#include "SipSession.h"
|
||||
|
||||
#include "ProxyPluginMgr.h"
|
||||
#include "ProxyConsumer.h"
|
||||
#include "ProxyProducer.h"
|
||||
|
||||
#include "SipCallback.h"
|
||||
#include "SafeObject.h"
|
||||
#include "SipStack.h"
|
||||
%}
|
||||
|
||||
/* Callbacks */
|
||||
%feature("director") SipCallback;
|
||||
%feature("director") ProxyPluginMgrCallback;
|
||||
%feature("director") ProxyAudioConsumerCallback;
|
||||
%feature("director") ProxyVideoConsumerCallback;
|
||||
%feature("director") ProxyAudioProducerCallback;
|
||||
%feature("director") ProxyVideoProducerCallback;
|
||||
%feature("director") T140Callback;
|
||||
|
||||
%nodefaultctor;
|
||||
%include "ActionConfig.h"
|
||||
%include "MediaSessionMgr.h"
|
||||
%include "MediaContent.h"
|
||||
%include "SipUri.h"
|
||||
%include "SipMessage.h"
|
||||
%include "SipEvent.h"
|
||||
%include "SipSession.h"
|
||||
|
||||
%include "ProxyPluginMgr.h"
|
||||
%include "ProxyConsumer.h"
|
||||
%include "ProxyProducer.h"
|
||||
|
||||
%include "SipCallback.h"
|
||||
%include "SafeObject.h"
|
||||
%include "SipStack.h"
|
||||
%clearnodefaultctor;
|
||||
|
||||
|
||||
/* ====== From "tinySIP\include\tsip.h" ====== */
|
||||
typedef enum tsip_stack_mode_e
|
||||
{
|
||||
tsip_stack_mode_ua,
|
||||
tsip_stack_mode_p2p,
|
||||
tsip_stack_mode_mediaproxy,
|
||||
tsip_stack_mode_mcu
|
||||
}
|
||||
tsip_stack_mode_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_messag_common.h" ====== */
|
||||
typedef enum tsip_request_type_e
|
||||
{
|
||||
tsip_NONE = 0,
|
||||
|
||||
tsip_ACK,
|
||||
tsip_BYE,
|
||||
tsip_CANCEL,
|
||||
tsip_INVITE,
|
||||
tsip_OPTIONS,
|
||||
tsip_REGISTER,
|
||||
tsip_SUBSCRIBE,
|
||||
tsip_NOTIFY,
|
||||
tsip_REFER,
|
||||
tsip_INFO,
|
||||
tsip_UPDATE,
|
||||
tsip_MESSAGE,
|
||||
tsip_PUBLISH,
|
||||
tsip_PRACK
|
||||
}
|
||||
tsip_request_type_t;
|
||||
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_event.h" ====== */
|
||||
typedef enum tsip_event_type_e
|
||||
{
|
||||
tsip_event_invite,
|
||||
tsip_event_message,
|
||||
tsip_event_info,
|
||||
tsip_event_options,
|
||||
tsip_event_publish,
|
||||
tsip_event_register,
|
||||
tsip_event_subscribe,
|
||||
|
||||
tsip_event_dialog
|
||||
}
|
||||
tsip_event_type_t;
|
||||
|
||||
// 7xx ==> errors
|
||||
#define tsip_event_code_dialog_transport_error 702
|
||||
#define tsip_event_code_dialog_global_error 703
|
||||
#define tsip_event_code_dialog_message_error 704
|
||||
|
||||
// 8xx ==> success
|
||||
#define tsip_event_code_dialog_request_incoming 800
|
||||
#define tsip_event_code_dialog_request_outgoing 802
|
||||
#define tsip_event_code_dialog_request_cancelled 803
|
||||
#define tsip_event_code_dialog_request_sent 804
|
||||
|
||||
// 9xx ==> Informational
|
||||
#define tsip_event_code_dialog_connecting 900
|
||||
#define tsip_event_code_dialog_connected 901
|
||||
#define tsip_event_code_dialog_terminating 902
|
||||
#define tsip_event_code_dialog_terminated 903
|
||||
#define tsip_event_code_stack_starting 950
|
||||
#define tsip_event_code_stack_started 951
|
||||
#define tsip_event_code_stack_stopping 952
|
||||
#define tsip_event_code_stack_stopped 953
|
||||
#define tsip_event_code_stack_failed_to_start 954
|
||||
#define tsip_event_code_stack_failed_to_stop 955
|
||||
#define tsip_event_code_stack_disconnected 956
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_register.h" ====== */
|
||||
typedef enum tsip_register_event_type_e
|
||||
{
|
||||
tsip_i_newreg,
|
||||
|
||||
tsip_i_register, // refresh
|
||||
tsip_ao_register,
|
||||
|
||||
tsip_i_unregister,
|
||||
tsip_ao_unregister,
|
||||
}
|
||||
tsip_register_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_subscribe.h" ====== */
|
||||
typedef enum tsip_subscribe_event_type_e
|
||||
{
|
||||
tsip_i_subscribe,
|
||||
tsip_ao_subscribe,
|
||||
|
||||
tsip_i_unsubscribe,
|
||||
tsip_ao_unsubscribe,
|
||||
|
||||
tsip_i_notify,
|
||||
tsip_ao_notify
|
||||
}
|
||||
tsip_subscribe_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_publish.h" ====== */
|
||||
typedef enum tsip_publish_event_type_e
|
||||
{
|
||||
tsip_i_publish,
|
||||
tsip_ao_publish,
|
||||
|
||||
tsip_i_unpublish,
|
||||
tsip_ao_unpublish
|
||||
}
|
||||
tsip_publish_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_message.h" ====== */
|
||||
typedef enum tsip_message_event_type_e
|
||||
{
|
||||
tsip_i_message,
|
||||
tsip_ao_message,
|
||||
}
|
||||
tsip_message_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_info.h" ====== */
|
||||
typedef enum tsip_info_event_type_e
|
||||
{
|
||||
tsip_i_info,
|
||||
tsip_ao_info,
|
||||
}
|
||||
tsip_info_event_type_t;
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_options.h" ====== */
|
||||
typedef enum tsip_options_event_type_e
|
||||
{
|
||||
tsip_i_options,
|
||||
tsip_ao_options,
|
||||
}
|
||||
tsip_options_event_type_t;
|
||||
|
||||
|
||||
/* ====== From "tinySIP\include\tinysip\tsip_api_invite.h" ====== */
|
||||
typedef enum tsip_invite_event_type_e
|
||||
{
|
||||
// ============================
|
||||
// Sip Events
|
||||
//
|
||||
tsip_i_newcall,
|
||||
|
||||
//! in-dialog requests/reponses
|
||||
tsip_i_request,
|
||||
tsip_ao_request,
|
||||
|
||||
/* 3GPP TS 24.629: Explicit Call Transfer (ECT) */
|
||||
tsip_o_ect_trying,
|
||||
tsip_o_ect_accepted,
|
||||
tsip_o_ect_completed,
|
||||
tsip_o_ect_failed,
|
||||
tsip_o_ect_notify,
|
||||
tsip_i_ect_requested,
|
||||
tsip_i_ect_newcall,
|
||||
tsip_i_ect_completed,
|
||||
tsip_i_ect_failed,
|
||||
tsip_i_ect_notify,
|
||||
|
||||
// ============================
|
||||
// Media Events
|
||||
//
|
||||
|
||||
tsip_m_early_media,
|
||||
tsip_m_updating, // Trying to update from Audio -> Video for example
|
||||
tsip_m_updated, // succeed to update
|
||||
|
||||
/* 3GPP TS 24.610: Communication Hold */
|
||||
tsip_m_local_hold_ok,
|
||||
tsip_m_local_hold_nok,
|
||||
tsip_m_local_resume_ok,
|
||||
tsip_m_local_resume_nok,
|
||||
tsip_m_remote_hold,
|
||||
tsip_m_remote_resume,
|
||||
}
|
||||
tsip_invite_event_type_t;
|
||||
|
||||
|
||||
/* ====== From "tinymedia/tmedia_qos.h" ====== */
|
||||
typedef enum tmedia_qos_stype_e
|
||||
{
|
||||
tmedia_qos_stype_none,/* not part of the RFC */
|
||||
|
||||
tmedia_qos_stype_segmented,
|
||||
tmedia_qos_stype_e2e,
|
||||
}
|
||||
tmedia_qos_stype_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_qos.h" ====== */
|
||||
typedef enum tmedia_qos_strength_e
|
||||
{
|
||||
/* do no change the order (none -> optional -> manadatory) */
|
||||
tmedia_qos_strength_none,
|
||||
tmedia_qos_strength_failure,
|
||||
tmedia_qos_strength_unknown,
|
||||
tmedia_qos_strength_optional,
|
||||
tmedia_qos_strength_mandatory
|
||||
}
|
||||
tmedia_qos_strength_t;
|
||||
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
// used by tinyWRAP
|
||||
typedef enum tmedia_chroma_e
|
||||
{
|
||||
tmedia_chroma_none=0,
|
||||
tmedia_chroma_rgb24, // will be stored as bgr24 on x86 (little endians) machines; e.g. WindowsPhone7
|
||||
tmedia_chroma_bgr24, // used by windows consumer (DirectShow) -
|
||||
tmedia_chroma_rgb32, // used by iOS4 consumer (iPhone and iPod touch)
|
||||
tmedia_chroma_rgb565le, // (used by both android and wince consumers)
|
||||
tmedia_chroma_rgb565be,
|
||||
tmedia_chroma_nv12, // used by iOS4 producer (iPhone and iPod Touch 3GS and 4)
|
||||
tmedia_chroma_nv21, // Yuv420 SP (used by android producer)
|
||||
tmedia_chroma_yuv422p,
|
||||
tmedia_chroma_uyvy422, // used by iOS4 producer (iPhone and iPod Touch 3G)
|
||||
tmedia_chroma_yuv420p, // Default
|
||||
tmedia_chroma_mjpeg, // Compressed. e.g. used by VirtualBox (Windows as host and Ubuntu as guest)
|
||||
tmedia_chroma_yuyv422, // YUYV422 (V4L2 preferred format)
|
||||
}
|
||||
tmedia_chroma_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_mode_e
|
||||
{
|
||||
tmedia_mode_none,
|
||||
tmedia_mode_optional,
|
||||
tmedia_mode_mandatory
|
||||
}
|
||||
tmedia_mode_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_srtp_mode_e
|
||||
{
|
||||
tmedia_srtp_mode_none,
|
||||
tmedia_srtp_mode_optional,
|
||||
tmedia_srtp_mode_mandatory
|
||||
}
|
||||
tmedia_srtp_mode_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_srtp_type_e
|
||||
{
|
||||
tmedia_srtp_type_none = 0x00,
|
||||
tmedia_srtp_type_sdes = 0x01,
|
||||
tmedia_srtp_type_dtls = 0x02,
|
||||
tmedia_srtp_type_sdes_dtls = (0x01 | 0x02)
|
||||
}
|
||||
tmedia_srtp_type_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_t140_data_type_e
|
||||
{
|
||||
tmedia_t140_data_type_utf8,
|
||||
tmedia_t140_data_type_zero_width_no_break_space = 0xefbbbf,
|
||||
tmedia_t140_data_type_backspace = 0x08,
|
||||
tmedia_t140_data_type_esc = 0x1b,
|
||||
tmedia_t140_data_type_cr = 0x0d,
|
||||
tmedia_t140_data_type_lf = 0x0a,
|
||||
tmedia_t140_data_type_cr_lf = 0x0d0a,
|
||||
tmedia_t140_data_type_interrupt2 = 0x61,
|
||||
tmedia_t140_data_type_bell = 0x07,
|
||||
tmedia_t140_data_type_sos = 0x98,
|
||||
tmedia_t140_data_type_string_term = 0x9c,
|
||||
tmedia_t140_data_type_graphic_start = 0x9b,
|
||||
tmedia_t140_data_type_graphic_end = 0x6d,
|
||||
tmedia_t140_data_type_loss_char_char = 0xfffd,
|
||||
tmedia_t140_data_type_loss_utf8 = 0xefbfbd,
|
||||
}
|
||||
tmedia_t140_data_type_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
#typedef enum tmedia_rtcp_event_type_e
|
||||
#{
|
||||
# tmedia_rtcp_event_type_fir, // Full Intra Refresh
|
||||
#}
|
||||
#tmedia_rtcp_event_type_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_profile_e
|
||||
{
|
||||
tmedia_profile_default,
|
||||
tmedia_profile_rtcweb
|
||||
}
|
||||
tmedia_profile_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
// @deprecated
|
||||
typedef enum tmedia_bandwidth_level_e
|
||||
{
|
||||
tmedia_bl_low,
|
||||
tmedia_bl_medium,
|
||||
tmedia_bl_hight,
|
||||
tmedia_bl_unrestricted
|
||||
}
|
||||
tmedia_bandwidth_level_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_common.h" ====== */
|
||||
typedef enum tmedia_pref_video_size_s
|
||||
{ /* must be sorted like this */
|
||||
tmedia_pref_video_size_sqcif, // 128 x 98
|
||||
tmedia_pref_video_size_qcif, // 176 x 144
|
||||
tmedia_pref_video_size_qvga, // 320 x 240
|
||||
tmedia_pref_video_size_cif, // 352 x 288
|
||||
tmedia_pref_video_size_hvga, // 480 x 320
|
||||
tmedia_pref_video_size_vga, // 640 x 480
|
||||
tmedia_pref_video_size_4cif, // 704 x 576
|
||||
tmedia_pref_video_size_wvga, // 800 x 480
|
||||
tmedia_pref_video_size_svga, // 800 x 600
|
||||
tmedia_pref_video_size_480p, // 852 x 480
|
||||
tmedia_pref_video_size_xga, // 1024 x 768
|
||||
tmedia_pref_video_size_720p, // 1280 x 720
|
||||
tmedia_pref_video_size_16cif, // 1408 x 1152
|
||||
tmedia_pref_video_size_1080p, // 1920 x 1080
|
||||
tmedia_pref_video_size_2160p, // 3840 x 2160
|
||||
}
|
||||
tmedia_pref_video_size_t;
|
||||
|
||||
|
||||
/* ====== From "tinymedia/tmedia_codec.h" ====== */
|
||||
typedef enum tmedia_codec_id_e
|
||||
{
|
||||
tmedia_codec_id_none = 0x00000000,
|
||||
|
||||
tmedia_codec_id_amr_nb_oa = 0x00000001<<0,
|
||||
tmedia_codec_id_amr_nb_be = 0x00000001<<1,
|
||||
tmedia_codec_id_amr_wb_oa = 0x00000001<<2,
|
||||
tmedia_codec_id_amr_wb_be = 0x00000001<<3,
|
||||
tmedia_codec_id_gsm = 0x00000001<<4,
|
||||
tmedia_codec_id_pcma = 0x00000001<<5,
|
||||
tmedia_codec_id_pcmu = 0x00000001<<6,
|
||||
tmedia_codec_id_ilbc = 0x00000001<<7,
|
||||
tmedia_codec_id_speex_nb = 0x00000001<<8,
|
||||
tmedia_codec_id_speex_wb = 0x00000001<<9,
|
||||
tmedia_codec_id_speex_uwb = 0x00000001<<10,
|
||||
tmedia_codec_id_bv16 = 0x00000001<<11,
|
||||
tmedia_codec_id_bv32 = 0x00000001<<12,
|
||||
tmedia_codec_id_opus = 0x00000001<<13,
|
||||
tmedia_codec_id_g729ab = 0x00000001<<14,
|
||||
tmedia_codec_id_g722 = 0x00000001<<15,
|
||||
|
||||
/* room for new Audio codecs */
|
||||
|
||||
tmedia_codec_id_h261 = 0x00010000<<0,
|
||||
tmedia_codec_id_h263 = 0x00010000<<1,
|
||||
tmedia_codec_id_h263p = 0x00010000<<2,
|
||||
tmedia_codec_id_h263pp = 0x00010000<<3,
|
||||
tmedia_codec_id_h264_bp = 0x00010000<<4,
|
||||
tmedia_codec_id_h264_mp = 0x00010000<<5,
|
||||
tmedia_codec_id_h264_hp = 0x00010000<<6,
|
||||
tmedia_codec_id_h264_bp10 = tmedia_codec_id_h264_bp, // @deprecated
|
||||
tmedia_codec_id_h264_bp20 = tmedia_codec_id_h264_bp, // @deprecated
|
||||
tmedia_codec_id_h264_bp30 = tmedia_codec_id_h264_bp, // @deprecated
|
||||
tmedia_codec_id_h264_svc = 0x00010000<<7,
|
||||
tmedia_codec_id_theora = 0x00010000<<8,
|
||||
tmedia_codec_id_mp4ves_es = 0x00010000<<9,
|
||||
tmedia_codec_id_vp8 = 0x00010000<<10,
|
||||
|
||||
/* room for new Video codecs */
|
||||
|
||||
tmedia_codec_id_t140 = 0x00010000<<14,
|
||||
tmedia_codec_id_red = 0x00010000<<15,
|
||||
}
|
||||
tmedia_codec_id_t;
|
||||
|
||||
/* ====== From "tinydav/tdav.h" ====== */
|
||||
// @deprecated: to be replaced by "tmedia_codec_id_t" in Doubango 3.0
|
||||
typedef enum tdav_codec_id_e
|
||||
{
|
||||
tdav_codec_id_none = 0x00000000,
|
||||
|
||||
tdav_codec_id_amr_nb_oa = 0x00000001<<0,
|
||||
tdav_codec_id_amr_nb_be = 0x00000001<<1,
|
||||
tdav_codec_id_amr_wb_oa = 0x00000001<<2,
|
||||
tdav_codec_id_amr_wb_be = 0x00000001<<3,
|
||||
tdav_codec_id_gsm = 0x00000001<<4,
|
||||
tdav_codec_id_pcma = 0x00000001<<5,
|
||||
tdav_codec_id_pcmu = 0x00000001<<6,
|
||||
tdav_codec_id_ilbc = 0x00000001<<7,
|
||||
tdav_codec_id_speex_nb = 0x00000001<<8,
|
||||
tdav_codec_id_speex_wb = 0x00000001<<9,
|
||||
tdav_codec_id_speex_uwb = 0x00000001<<10,
|
||||
tdav_codec_id_bv16 = 0x00000001<<11,
|
||||
tdav_codec_id_bv32 = 0x00000001<<12,
|
||||
tdav_codec_id_opus = 0x00000001<<13,
|
||||
tdav_codec_id_g729ab = 0x00000001<<14,
|
||||
tdav_codec_id_g722 = 0x00000001<<15,
|
||||
|
||||
/* room for new Audio codecs */
|
||||
|
||||
tdav_codec_id_h261 = 0x00010000<<0,
|
||||
tdav_codec_id_h263 = 0x00010000<<1,
|
||||
tdav_codec_id_h263p = 0x00010000<<2,
|
||||
tdav_codec_id_h263pp = 0x00010000<<3,
|
||||
tdav_codec_id_h264_bp = 0x00010000<<4,
|
||||
tdav_codec_id_h264_mp = 0x00010000<<5,
|
||||
tdav_codec_id_h264_hp = 0x00010000<<6,
|
||||
tdav_codec_id_h264_bp10 = tdav_codec_id_h264_bp, // @deprecated
|
||||
tdav_codec_id_h264_bp20 = tdav_codec_id_h264_bp, // @deprecated
|
||||
tdav_codec_id_h264_bp30 = tdav_codec_id_h264_bp, // @deprecated
|
||||
tdav_codec_id_h264_svc = 0x00010000<<7,
|
||||
tdav_codec_id_theora = 0x00010000<<8,
|
||||
tdav_codec_id_mp4ves_es = 0x00010000<<9,
|
||||
tdav_codec_id_vp8 = 0x00010000<<10,
|
||||
|
||||
/* room for new Video codecs */
|
||||
|
||||
tdav_codec_id_t140 = 0x00010000<<14,
|
||||
tdav_codec_id_red = 0x00010000<<15,
|
||||
}
|
||||
tdav_codec_id_t;
|
||||
|
|
|
@ -1,102 +1,102 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SipUri.h"
|
||||
|
||||
SipUri::SipUri(const char* uriString, const char* displayName/*=tsk_null*/)
|
||||
{
|
||||
if((m_pUri = tsip_uri_parse(uriString, (tsk_size_t)tsk_strlen(uriString))) && displayName) {
|
||||
m_pUri->display_name = tsk_strdup(displayName);
|
||||
}
|
||||
}
|
||||
|
||||
SipUri::~SipUri()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pUri);
|
||||
}
|
||||
|
||||
bool SipUri::isValid(const char* uriString)
|
||||
{
|
||||
tsip_uri_t* uri;
|
||||
bool ret = false;
|
||||
|
||||
if((uri = tsip_uri_parse(uriString, (tsk_size_t)tsk_strlen(uriString)))) {
|
||||
ret = (uri->type != uri_unknown)
|
||||
&& (!tsk_strnullORempty(uri->host));
|
||||
TSK_OBJECT_SAFE_FREE(uri);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool SipUri::isValid()
|
||||
{
|
||||
return (m_pUri != tsk_null);
|
||||
}
|
||||
|
||||
const char* SipUri::getScheme()
|
||||
{
|
||||
if(m_pUri) {
|
||||
return m_pUri->scheme;
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const char* SipUri::getHost()
|
||||
{
|
||||
return m_pUri ? m_pUri->host : tsk_null;
|
||||
}
|
||||
|
||||
unsigned short SipUri::getPort()
|
||||
{
|
||||
return m_pUri ? m_pUri->port : 0;
|
||||
}
|
||||
|
||||
const char* SipUri::getUserName()
|
||||
{
|
||||
return m_pUri ? m_pUri->user_name : tsk_null;
|
||||
}
|
||||
|
||||
const char* SipUri::getPassword()
|
||||
{
|
||||
return m_pUri ? m_pUri->password : tsk_null;
|
||||
}
|
||||
|
||||
const char* SipUri::getDisplayName()
|
||||
{
|
||||
return m_pUri ? m_pUri->display_name : tsk_null;
|
||||
}
|
||||
|
||||
void SipUri::setDisplayName(const char* displayName)
|
||||
{
|
||||
if(m_pUri) {
|
||||
tsk_strupdate(&m_pUri->display_name, displayName);
|
||||
}
|
||||
}
|
||||
|
||||
const char* SipUri::getParamValue(const char* pname)
|
||||
{
|
||||
if(m_pUri && m_pUri->params) {
|
||||
const char* pvalue = tsk_params_get_param_value(m_pUri->params, pname);
|
||||
return pvalue;
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#include "SipUri.h"
|
||||
|
||||
SipUri::SipUri(const char* uriString, const char* displayName/*=tsk_null*/)
|
||||
{
|
||||
if((m_pUri = tsip_uri_parse(uriString, (tsk_size_t)tsk_strlen(uriString))) && displayName) {
|
||||
m_pUri->display_name = tsk_strdup(displayName);
|
||||
}
|
||||
}
|
||||
|
||||
SipUri::~SipUri()
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(m_pUri);
|
||||
}
|
||||
|
||||
bool SipUri::isValid(const char* uriString)
|
||||
{
|
||||
tsip_uri_t* uri;
|
||||
bool ret = false;
|
||||
|
||||
if((uri = tsip_uri_parse(uriString, (tsk_size_t)tsk_strlen(uriString)))) {
|
||||
ret = (uri->type != uri_unknown)
|
||||
&& (!tsk_strnullORempty(uri->host));
|
||||
TSK_OBJECT_SAFE_FREE(uri);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool SipUri::isValid()
|
||||
{
|
||||
return (m_pUri != tsk_null);
|
||||
}
|
||||
|
||||
const char* SipUri::getScheme()
|
||||
{
|
||||
if(m_pUri) {
|
||||
return m_pUri->scheme;
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
const char* SipUri::getHost()
|
||||
{
|
||||
return m_pUri ? m_pUri->host : tsk_null;
|
||||
}
|
||||
|
||||
unsigned short SipUri::getPort()
|
||||
{
|
||||
return m_pUri ? m_pUri->port : 0;
|
||||
}
|
||||
|
||||
const char* SipUri::getUserName()
|
||||
{
|
||||
return m_pUri ? m_pUri->user_name : tsk_null;
|
||||
}
|
||||
|
||||
const char* SipUri::getPassword()
|
||||
{
|
||||
return m_pUri ? m_pUri->password : tsk_null;
|
||||
}
|
||||
|
||||
const char* SipUri::getDisplayName()
|
||||
{
|
||||
return m_pUri ? m_pUri->display_name : tsk_null;
|
||||
}
|
||||
|
||||
void SipUri::setDisplayName(const char* displayName)
|
||||
{
|
||||
if(m_pUri) {
|
||||
tsk_strupdate(&m_pUri->display_name, displayName);
|
||||
}
|
||||
}
|
||||
|
||||
const char* SipUri::getParamValue(const char* pname)
|
||||
{
|
||||
if(m_pUri && m_pUri->params) {
|
||||
const char* pvalue = tsk_params_get_param_value(m_pUri->params, pname);
|
||||
return pvalue;
|
||||
}
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,57 +1,57 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPURI_H
|
||||
#define TINYWRAP_SIPURI_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h"
|
||||
|
||||
class TINYWRAP_API SipUri
|
||||
{
|
||||
public:
|
||||
SipUri(const char* uriString, const char* displayName=tsk_null);
|
||||
~SipUri();
|
||||
|
||||
public:
|
||||
static bool isValid(const char*);
|
||||
|
||||
bool isValid();
|
||||
const char* getScheme();
|
||||
const char* getHost();
|
||||
unsigned short getPort();
|
||||
const char* getUserName();
|
||||
const char* getPassword();
|
||||
const char* getDisplayName();
|
||||
const char* getParamValue(const char* pname);
|
||||
void setDisplayName(const char* displayName);
|
||||
#if !defined(SWIG)
|
||||
inline const tsip_uri_t* getWrappedUri()const {
|
||||
return m_pUri;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
tsip_uri_t* m_pUri;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPURI_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_SIPURI_H
|
||||
#define TINYWRAP_SIPURI_H
|
||||
|
||||
#include "tinyWRAP_config.h"
|
||||
|
||||
#include "tinysip.h"
|
||||
|
||||
class TINYWRAP_API SipUri
|
||||
{
|
||||
public:
|
||||
SipUri(const char* uriString, const char* displayName=tsk_null);
|
||||
~SipUri();
|
||||
|
||||
public:
|
||||
static bool isValid(const char*);
|
||||
|
||||
bool isValid();
|
||||
const char* getScheme();
|
||||
const char* getHost();
|
||||
unsigned short getPort();
|
||||
const char* getUserName();
|
||||
const char* getPassword();
|
||||
const char* getDisplayName();
|
||||
const char* getParamValue(const char* pname);
|
||||
void setDisplayName(const char* displayName);
|
||||
#if !defined(SWIG)
|
||||
inline const tsip_uri_t* getWrappedUri()const {
|
||||
return m_pUri;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
tsip_uri_t* m_pUri;
|
||||
};
|
||||
|
||||
#endif /* TINYWRAP_SIPURI_H */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,167 +1,167 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_XCAP_H
|
||||
#define TINYWRAP_XCAP_H
|
||||
|
||||
#include "tinyxcap.h"
|
||||
|
||||
class XcapStack;
|
||||
|
||||
typedef tsk_list_t twrap_xcap_steps_L_t;
|
||||
|
||||
//
|
||||
// XcapSelector
|
||||
//
|
||||
class XcapSelector
|
||||
{
|
||||
public:
|
||||
XcapSelector(XcapStack* stack);
|
||||
virtual ~XcapSelector();
|
||||
|
||||
public: /* API functions */
|
||||
XcapSelector* setAUID(const char* auid);
|
||||
XcapSelector* setName(const char* qname);
|
||||
XcapSelector* setAttribute(const char* qname, const char* att_qname, const char* att_value);
|
||||
XcapSelector* setPos(const char* qname, unsigned pos);
|
||||
XcapSelector* setPosAttribute(const char* qname, unsigned pos, const char* att_qname, const char* att_value);
|
||||
XcapSelector* setNamespace(const char* prefix, const char* value);
|
||||
|
||||
char* getString();// %newobject
|
||||
void reset();
|
||||
|
||||
private:
|
||||
txcap_stack_handle_t* stack_handle;
|
||||
char* auid;
|
||||
twrap_xcap_steps_L_t* steps;
|
||||
};
|
||||
|
||||
//
|
||||
// XcapMessage
|
||||
//
|
||||
class XcapMessage
|
||||
{
|
||||
public:
|
||||
XcapMessage();
|
||||
#if !defined(SWIG)
|
||||
XcapMessage(const thttp_message_t *httpmessage);
|
||||
#endif
|
||||
virtual ~XcapMessage();
|
||||
|
||||
short getCode() const;
|
||||
const char* getPhrase() const;
|
||||
|
||||
char* getXcapHeaderValue(const char* name, unsigned index = 0);
|
||||
char* getXcapHeaderParamValue(const char* name, const char* param, unsigned index = 0);
|
||||
unsigned getXcapContentLength();
|
||||
unsigned getXcapContent(void* output, unsigned maxsize);
|
||||
|
||||
private:
|
||||
const thttp_message_t *httpmessage;
|
||||
};
|
||||
|
||||
//
|
||||
// XcapEvent
|
||||
//
|
||||
class XcapEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
XcapEvent(const thttp_event_t *httpevent);
|
||||
#endif
|
||||
virtual ~XcapEvent();
|
||||
thttp_event_type_t getType();
|
||||
const XcapMessage* getXcapMessage() const;
|
||||
|
||||
private:
|
||||
const thttp_event_t *httpevent;
|
||||
const XcapMessage* httpmessage;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// XcapCallback
|
||||
//
|
||||
class XcapCallback
|
||||
{
|
||||
public:
|
||||
XcapCallback();
|
||||
virtual ~XcapCallback();
|
||||
|
||||
virtual int onEvent(const XcapEvent* e)const {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// XcapStack
|
||||
//
|
||||
class XcapStack
|
||||
{
|
||||
public:
|
||||
XcapStack(XcapCallback* callback, const char* xui, const char* password, const char* xcap_root);
|
||||
virtual ~XcapStack();
|
||||
|
||||
public: /* API functions */
|
||||
bool registerAUID(const char* id, const char* mime_type, const char* ns, const char* document_name, bool is_global);
|
||||
bool start();
|
||||
bool setCredentials(const char* xui, const char* password);
|
||||
bool setXcapRoot(const char* xcap_root);
|
||||
bool setLocalIP(const char* ip);
|
||||
bool setLocalPort(unsigned port);
|
||||
bool addHeader(const char* name, const char* value);
|
||||
bool removeHeader(const char* name);
|
||||
bool setTimeout(unsigned timeout);
|
||||
|
||||
bool getDocument(const char* url);
|
||||
bool getElement(const char* url);
|
||||
bool getAttribute(const char* url);
|
||||
|
||||
bool deleteDocument(const char* url);
|
||||
bool deleteElement(const char* url);
|
||||
bool deleteAttribute(const char* url);
|
||||
|
||||
bool putDocument(const char* url, const void* payload, unsigned len, const char* contentType);
|
||||
bool putElement(const char* url, const void* payload, unsigned len);
|
||||
bool putAttribute(const char* url, const void* payload, unsigned len);
|
||||
|
||||
bool stop();
|
||||
|
||||
public: /* Public helper function */
|
||||
#if !defined(SWIG)
|
||||
txcap_stack_handle_t* getHandle() {
|
||||
return this->handle;
|
||||
}
|
||||
XcapCallback* getCallback()const {
|
||||
return this->callback;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
txcap_stack_handle_t* handle;
|
||||
XcapCallback* callback;
|
||||
|
||||
static unsigned count;
|
||||
};
|
||||
|
||||
|
||||
#endif /* TINYWRAP_XCAP_H */
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
#ifndef TINYWRAP_XCAP_H
|
||||
#define TINYWRAP_XCAP_H
|
||||
|
||||
#include "tinyxcap.h"
|
||||
|
||||
class XcapStack;
|
||||
|
||||
typedef tsk_list_t twrap_xcap_steps_L_t;
|
||||
|
||||
//
|
||||
// XcapSelector
|
||||
//
|
||||
class XcapSelector
|
||||
{
|
||||
public:
|
||||
XcapSelector(XcapStack* stack);
|
||||
virtual ~XcapSelector();
|
||||
|
||||
public: /* API functions */
|
||||
XcapSelector* setAUID(const char* auid);
|
||||
XcapSelector* setName(const char* qname);
|
||||
XcapSelector* setAttribute(const char* qname, const char* att_qname, const char* att_value);
|
||||
XcapSelector* setPos(const char* qname, unsigned pos);
|
||||
XcapSelector* setPosAttribute(const char* qname, unsigned pos, const char* att_qname, const char* att_value);
|
||||
XcapSelector* setNamespace(const char* prefix, const char* value);
|
||||
|
||||
char* getString();// %newobject
|
||||
void reset();
|
||||
|
||||
private:
|
||||
txcap_stack_handle_t* stack_handle;
|
||||
char* auid;
|
||||
twrap_xcap_steps_L_t* steps;
|
||||
};
|
||||
|
||||
//
|
||||
// XcapMessage
|
||||
//
|
||||
class XcapMessage
|
||||
{
|
||||
public:
|
||||
XcapMessage();
|
||||
#if !defined(SWIG)
|
||||
XcapMessage(const thttp_message_t *httpmessage);
|
||||
#endif
|
||||
virtual ~XcapMessage();
|
||||
|
||||
short getCode() const;
|
||||
const char* getPhrase() const;
|
||||
|
||||
char* getXcapHeaderValue(const char* name, unsigned index = 0);
|
||||
char* getXcapHeaderParamValue(const char* name, const char* param, unsigned index = 0);
|
||||
unsigned getXcapContentLength();
|
||||
unsigned getXcapContent(void* output, unsigned maxsize);
|
||||
|
||||
private:
|
||||
const thttp_message_t *httpmessage;
|
||||
};
|
||||
|
||||
//
|
||||
// XcapEvent
|
||||
//
|
||||
class XcapEvent
|
||||
{
|
||||
public:
|
||||
#if !defined(SWIG)
|
||||
XcapEvent(const thttp_event_t *httpevent);
|
||||
#endif
|
||||
virtual ~XcapEvent();
|
||||
thttp_event_type_t getType();
|
||||
const XcapMessage* getXcapMessage() const;
|
||||
|
||||
private:
|
||||
const thttp_event_t *httpevent;
|
||||
const XcapMessage* httpmessage;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// XcapCallback
|
||||
//
|
||||
class XcapCallback
|
||||
{
|
||||
public:
|
||||
XcapCallback();
|
||||
virtual ~XcapCallback();
|
||||
|
||||
virtual int onEvent(const XcapEvent* e)const {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// XcapStack
|
||||
//
|
||||
class XcapStack
|
||||
{
|
||||
public:
|
||||
XcapStack(XcapCallback* callback, const char* xui, const char* password, const char* xcap_root);
|
||||
virtual ~XcapStack();
|
||||
|
||||
public: /* API functions */
|
||||
bool registerAUID(const char* id, const char* mime_type, const char* ns, const char* document_name, bool is_global);
|
||||
bool start();
|
||||
bool setCredentials(const char* xui, const char* password);
|
||||
bool setXcapRoot(const char* xcap_root);
|
||||
bool setLocalIP(const char* ip);
|
||||
bool setLocalPort(unsigned port);
|
||||
bool addHeader(const char* name, const char* value);
|
||||
bool removeHeader(const char* name);
|
||||
bool setTimeout(unsigned timeout);
|
||||
|
||||
bool getDocument(const char* url);
|
||||
bool getElement(const char* url);
|
||||
bool getAttribute(const char* url);
|
||||
|
||||
bool deleteDocument(const char* url);
|
||||
bool deleteElement(const char* url);
|
||||
bool deleteAttribute(const char* url);
|
||||
|
||||
bool putDocument(const char* url, const void* payload, unsigned len, const char* contentType);
|
||||
bool putElement(const char* url, const void* payload, unsigned len);
|
||||
bool putAttribute(const char* url, const void* payload, unsigned len);
|
||||
|
||||
bool stop();
|
||||
|
||||
public: /* Public helper function */
|
||||
#if !defined(SWIG)
|
||||
txcap_stack_handle_t* getHandle() {
|
||||
return this->handle;
|
||||
}
|
||||
XcapCallback* getCallback()const {
|
||||
return this->callback;
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
txcap_stack_handle_t* handle;
|
||||
XcapCallback* callback;
|
||||
|
||||
static unsigned count;
|
||||
};
|
||||
|
||||
|
||||
#endif /* TINYWRAP_XCAP_H */
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
%{
|
||||
#include "Xcap.h"
|
||||
%}
|
||||
|
||||
/* Callbacks */
|
||||
%feature("director") XcapCallback;
|
||||
|
||||
|
||||
%nodefaultctor;
|
||||
%include "Xcap.h"
|
||||
%clearnodefaultctor;
|
||||
|
||||
typedef enum thttp_event_type_e
|
||||
{
|
||||
thttp_event_dialog_started,
|
||||
thttp_event_message,
|
||||
thttp_event_auth_failed,
|
||||
thttp_event_closed,
|
||||
thttp_event_transport_error,
|
||||
thttp_event_dialog_terminated
|
||||
}
|
||||
%{
|
||||
#include "Xcap.h"
|
||||
%}
|
||||
|
||||
/* Callbacks */
|
||||
%feature("director") XcapCallback;
|
||||
|
||||
|
||||
%nodefaultctor;
|
||||
%include "Xcap.h"
|
||||
%clearnodefaultctor;
|
||||
|
||||
typedef enum thttp_event_type_e
|
||||
{
|
||||
thttp_event_dialog_started,
|
||||
thttp_event_message,
|
||||
thttp_event_auth_failed,
|
||||
thttp_event_closed,
|
||||
thttp_event_transport_error,
|
||||
thttp_event_dialog_terminated
|
||||
}
|
||||
thttp_event_type_t;
|
|
@ -1,73 +1,73 @@
|
|||
/* File : tinyWRAP.i */
|
||||
%module(directors="1") tinyWRAP
|
||||
%include "typemaps.i"
|
||||
%include <stdint.i>
|
||||
|
||||
%{
|
||||
#include "tinyWRAP_config.h"
|
||||
#include "DDebug.h"
|
||||
#include "AudioResampler.h"
|
||||
%}
|
||||
|
||||
%feature("director") DDebugCallback;
|
||||
|
||||
%nodefaultctor;
|
||||
%include "tinyWRAP_config.h"
|
||||
%include "DDebug.h"
|
||||
%include "AudioResampler.h"
|
||||
%include "Common.h"
|
||||
%clearnodefaultctor;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ========== Sip/Sdp Stack ========== */
|
||||
%newobject getSipHeaderValue;
|
||||
%newobject getSdpHeaderValue;
|
||||
%newobject getSdpHeaderAValue;
|
||||
%newobject getSipHeaderParamValue;
|
||||
%newobject SipStack::dnsENUM;
|
||||
%newobject SipStack::dnsNaptrSrv;
|
||||
%newobject SipStack::dnsSrv;
|
||||
%newobject SipStack::getPreferredIdentity;
|
||||
%newobject SipStack::getLocalIPnPort;
|
||||
%newobject MediaSessionMgr::producerGetCodec;
|
||||
%newobject MediaSessionMgr::sessionGetQoS;
|
||||
|
||||
%newobject MessagingEvent::takeSessionOwnership;
|
||||
%newobject InviteEvent::takeCallSessionOwnership;
|
||||
%newobject InviteEvent::takeMsrpSessionOwnership;
|
||||
%newobject RegistrationEvent::takeSessionOwnership;
|
||||
|
||||
%newobject ProxyPluginMgr::createInstance;
|
||||
|
||||
%newobject MediaContent::parse;
|
||||
|
||||
%include SipStack.i
|
||||
|
||||
|
||||
/* ========== Xcap Stack ========== */
|
||||
%newobject XcapSelector::getString;
|
||||
|
||||
%newobject getXcapHeaderValue;
|
||||
%newobject getXcapHeaderParamValue;
|
||||
|
||||
%include Xcap.i
|
||||
|
||||
|
||||
/* ========== SMS ========== */
|
||||
%newobject SMSEncoder::encodeSubmit;
|
||||
%newobject SMSEncoder::encodeDeliver;
|
||||
%newobject SMSEncoder::encodeACK;
|
||||
%newobject SMSEncoder::encodeError;
|
||||
%newobject SMSEncoder::decode;
|
||||
|
||||
%include SMS.i
|
||||
|
||||
|
||||
/* ========== MSRP ========== */
|
||||
%newobject getMsrpHeaderValue;
|
||||
%newobject getMsrpHeaderParamValue;
|
||||
|
||||
%include Msrp.i
|
||||
/* File : tinyWRAP.i */
|
||||
%module(directors="1") tinyWRAP
|
||||
%include "typemaps.i"
|
||||
%include <stdint.i>
|
||||
|
||||
%{
|
||||
#include "tinyWRAP_config.h"
|
||||
#include "DDebug.h"
|
||||
#include "AudioResampler.h"
|
||||
%}
|
||||
|
||||
%feature("director") DDebugCallback;
|
||||
|
||||
%nodefaultctor;
|
||||
%include "tinyWRAP_config.h"
|
||||
%include "DDebug.h"
|
||||
%include "AudioResampler.h"
|
||||
%include "Common.h"
|
||||
%clearnodefaultctor;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ========== Sip/Sdp Stack ========== */
|
||||
%newobject getSipHeaderValue;
|
||||
%newobject getSdpHeaderValue;
|
||||
%newobject getSdpHeaderAValue;
|
||||
%newobject getSipHeaderParamValue;
|
||||
%newobject SipStack::dnsENUM;
|
||||
%newobject SipStack::dnsNaptrSrv;
|
||||
%newobject SipStack::dnsSrv;
|
||||
%newobject SipStack::getPreferredIdentity;
|
||||
%newobject SipStack::getLocalIPnPort;
|
||||
%newobject MediaSessionMgr::producerGetCodec;
|
||||
%newobject MediaSessionMgr::sessionGetQoS;
|
||||
|
||||
%newobject MessagingEvent::takeSessionOwnership;
|
||||
%newobject InviteEvent::takeCallSessionOwnership;
|
||||
%newobject InviteEvent::takeMsrpSessionOwnership;
|
||||
%newobject RegistrationEvent::takeSessionOwnership;
|
||||
|
||||
%newobject ProxyPluginMgr::createInstance;
|
||||
|
||||
%newobject MediaContent::parse;
|
||||
|
||||
%include SipStack.i
|
||||
|
||||
|
||||
/* ========== Xcap Stack ========== */
|
||||
%newobject XcapSelector::getString;
|
||||
|
||||
%newobject getXcapHeaderValue;
|
||||
%newobject getXcapHeaderParamValue;
|
||||
|
||||
%include Xcap.i
|
||||
|
||||
|
||||
/* ========== SMS ========== */
|
||||
%newobject SMSEncoder::encodeSubmit;
|
||||
%newobject SMSEncoder::encodeDeliver;
|
||||
%newobject SMSEncoder::encodeACK;
|
||||
%newobject SMSEncoder::encodeError;
|
||||
%newobject SMSEncoder::decode;
|
||||
|
||||
%include SMS.i
|
||||
|
||||
|
||||
/* ========== MSRP ========== */
|
||||
%newobject getMsrpHeaderValue;
|
||||
%newobject getMsrpHeaderParamValue;
|
||||
|
||||
%include Msrp.i
|
||||
|
|
|
@ -1,72 +1,72 @@
|
|||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef TINYWRAP_CONFIG_H
|
||||
#define TINYWRAP_CONFIG_H
|
||||
|
||||
#ifdef __SYMBIAN32__
|
||||
#undef _WIN32 /* Because of WINSCW */
|
||||
#endif
|
||||
|
||||
// Windows (XP/Vista/7/CE and Windows Mobile) macro definition.
|
||||
#if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE)
|
||||
# define TWRAP_UNDER_WINDOWS 1
|
||||
# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP)
|
||||
# define TWRAP_UNDER_WINDOWS_RT 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if (TWRAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYWRAP_EXPORTS)
|
||||
# define TINYWRAP_API __declspec(dllexport)
|
||||
# define TINYWRAP_GEXTERN extern __declspec(dllexport)
|
||||
#elif (TWRAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYWRAP_IMPORTS_IGNORE)
|
||||
# define TINYWRAP_API __declspec(dllimport)
|
||||
# define TINYWRAP_GEXTERN __declspec(dllimport)
|
||||
#else
|
||||
# define TINYWRAP_API
|
||||
# define TINYWRAP_GEXTERN extern
|
||||
#endif
|
||||
|
||||
/* Guards against C++ name mangling
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
# define TWRAP_BEGIN_DECLS extern "C" {
|
||||
# define TWRAP_END_DECLS }
|
||||
#else
|
||||
# define TWRAP_BEGIN_DECLS
|
||||
# define TWRAP_END_DECLS
|
||||
#endif
|
||||
|
||||
/* Disable some well-known warnings
|
||||
*/
|
||||
#ifdef _MSC_VER
|
||||
# define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#endif // TINYWRAP_CONFIG_H
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Mamadou Diop.
|
||||
*
|
||||
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
|
||||
*
|
||||
* This file is part of Open Source Doubango Framework.
|
||||
*
|
||||
* DOUBANGO 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DOUBANGO 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 DOUBANGO.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef TINYWRAP_CONFIG_H
|
||||
#define TINYWRAP_CONFIG_H
|
||||
|
||||
#ifdef __SYMBIAN32__
|
||||
#undef _WIN32 /* Because of WINSCW */
|
||||
#endif
|
||||
|
||||
// Windows (XP/Vista/7/CE and Windows Mobile) macro definition.
|
||||
#if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE)
|
||||
# define TWRAP_UNDER_WINDOWS 1
|
||||
# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP)
|
||||
# define TWRAP_UNDER_WINDOWS_RT 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if (TWRAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYWRAP_EXPORTS)
|
||||
# define TINYWRAP_API __declspec(dllexport)
|
||||
# define TINYWRAP_GEXTERN extern __declspec(dllexport)
|
||||
#elif (TWRAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYWRAP_IMPORTS_IGNORE)
|
||||
# define TINYWRAP_API __declspec(dllimport)
|
||||
# define TINYWRAP_GEXTERN __declspec(dllimport)
|
||||
#else
|
||||
# define TINYWRAP_API
|
||||
# define TINYWRAP_GEXTERN extern
|
||||
#endif
|
||||
|
||||
/* Guards against C++ name mangling
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
# define TWRAP_BEGIN_DECLS extern "C" {
|
||||
# define TWRAP_END_DECLS }
|
||||
#else
|
||||
# define TWRAP_BEGIN_DECLS
|
||||
# define TWRAP_END_DECLS
|
||||
#endif
|
||||
|
||||
/* Disable some well-known warnings
|
||||
*/
|
||||
#ifdef _MSC_VER
|
||||
# define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#endif // TINYWRAP_CONFIG_H
|
||||
|
|
|
@ -614,12 +614,12 @@ static int tdav_session_video_rtcp_cb(const void* callback_data, const trtp_rtcp
|
|||
case trtp_rtcp_psfb_fci_type_afb: {
|
||||
if (psfb->afb.type == trtp_rtcp_psfb_afb_type_remb) {
|
||||
uint64_t bw_up_reported_kpbs = ((psfb->afb.remb.mantissa << psfb->afb.remb.exp) >> 10);
|
||||
TSK_DEBUG_INFO("Receiving RTCP-AFB-REMB (%u), exp=%u, mantissa=%u, bandwidth=%ukbps", ((const trtp_rtcp_report_fb_t*)psfb)->ssrc_media, psfb->afb.remb.exp, psfb->afb.remb.mantissa, bw_up_reported_kpbs);
|
||||
TSK_DEBUG_INFO("Receiving RTCP-AFB-REMB (%u), exp=%u, mantissa=%u, bandwidth=%llukbps", ((const trtp_rtcp_report_fb_t*)psfb)->ssrc_media, psfb->afb.remb.exp, psfb->afb.remb.mantissa, bw_up_reported_kpbs);
|
||||
if (base->congestion_ctrl_enabled) {
|
||||
if (session->qos_metrics.bw_up_est_kbps != 0) {
|
||||
float q3 = bw_up_reported_kpbs / (float)session->qos_metrics.bw_up_est_kbps;
|
||||
q3 = TSK_CLAMP(0.f, q3, 1.f);
|
||||
TSK_DEBUG_INFO("bw_up_estimated_kbps=%llu, bw_up_reported_kpbs=%llu, q3=%f", session->qos_metrics.bw_up_est_kbps, bw_up_reported_kpbs, q3);
|
||||
TSK_DEBUG_INFO("bw_up_estimated_kbps=%u, bw_up_reported_kpbs=%llu, q3=%f", session->qos_metrics.bw_up_est_kbps, bw_up_reported_kpbs, q3);
|
||||
tsk_mutex_lock(video->h_mutex_qos);
|
||||
session->qos_metrics.q3 = (session->qos_metrics.q3 + q3) / (video->q3_n++ ? 2.f : 1.f);
|
||||
tsk_mutex_unlock(video->h_mutex_qos);
|
||||
|
@ -1539,7 +1539,7 @@ static int _tdav_session_video_report_bw_usage_and_jcng(tdav_session_video_t* se
|
|||
jcng_q = q5;
|
||||
}
|
||||
}
|
||||
TSK_DEBUG_INFO("video with congestion control enabled: est_bw_down=%llukbps, est_jcng=%f", session->qos_metrics.bw_down_est_kbps, jcng_q);
|
||||
TSK_DEBUG_INFO("video with congestion control enabled: est_bw_down=%ukbps, est_jcng=%f", session->qos_metrics.bw_down_est_kbps, jcng_q);
|
||||
ret = trtp_manager_set_app_bw_and_jcng(base->rtp_manager, INT_MAX/* unused */, (int32_t)session->qos_metrics.bw_down_est_kbps, jcng_q);
|
||||
self->last_sendreport_time = tsk_time_now();
|
||||
}
|
||||
|
|
|
@ -319,6 +319,7 @@ static int recvData(tnet_transport_t *transport, transport_socket_xt* active_soc
|
|||
|
||||
if (len && buffer) {
|
||||
tnet_transport_event_t* e = tnet_transport_event_create(event_data, transport->callback_data, active_socket->fd);
|
||||
transport->bytes_in += len;
|
||||
if (e && buffer && len) {
|
||||
e->data = buffer;
|
||||
buffer = NULL;
|
||||
|
@ -485,6 +486,7 @@ tsk_size_t tnet_transport_send(const tnet_transport_handle_t *handle, tnet_fd_t
|
|||
}
|
||||
|
||||
bail:
|
||||
transport->bytes_out += numberOfBytesSent;
|
||||
return numberOfBytesSent;
|
||||
}
|
||||
|
||||
|
@ -517,6 +519,7 @@ tsk_size_t tnet_transport_sendto(const tnet_transport_handle_t *handle, tnet_fd_
|
|||
}
|
||||
|
||||
bail:
|
||||
transport->bytes_out += numberOfBytesSent;
|
||||
return numberOfBytesSent;
|
||||
}
|
||||
|
||||
|
@ -1034,6 +1037,7 @@ void __CFSocketCallBack(CFSocketRef s, CFSocketCallBackType callbackType, CFData
|
|||
int len = (int)CFDataGetLength((CFDataRef)data);
|
||||
if (ptr && len > 0) {
|
||||
tnet_transport_event_t* e = tnet_transport_event_create(event_data, transport->callback_data, sock->fd);
|
||||
transport->bytes_in += len;
|
||||
if (e) {
|
||||
e->data = tsk_malloc(len);
|
||||
if (e->data) {
|
||||
|
|
Loading…
Reference in New Issue