no message

git-svn-id: http://yate.null.ro/svn/yate/trunk@285 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2005-04-11 00:56:55 +00:00
parent 9459c52dcd
commit 5d77d22865
8 changed files with 154 additions and 157 deletions

View File

@ -47,7 +47,7 @@ private:
class SimpleTranslator : public DataTranslator
{
public:
SimpleTranslator(const String& sFormat, const String& dFormat)
SimpleTranslator(const DataFormat& sFormat, const DataFormat& dFormat)
: DataTranslator(sFormat,dFormat) { }
virtual void Consume(const DataBlock& data, unsigned long timeDelta)
{
@ -102,7 +102,8 @@ static const FormatInfo s_formats[] = {
};
static flist* s_flist = 0;
static const FormatInfo* s_slin = &s_formats[0];
static const FormatInfo* f_slin = &s_formats[0];
static const char s_slin[] = "slin";
const FormatInfo* FormatRepository::getFormat(const String& name)
{
@ -149,11 +150,24 @@ const FormatInfo* FormatRepository::addFormat(const String& name, int drate, int
return f;
}
void DataFormat::changed()
{
m_parsed = 0;
String::changed();
}
const FormatInfo* DataFormat::getInfo() const
{
if (!(m_parsed || null()))
m_parsed = FormatRepository::getFormat(*this);
return m_parsed;
}
void DataSource::Forward(const DataBlock& data, unsigned long timeDelta)
{
// no number of samples provided - try to guess
if (!timeDelta) {
const FormatInfo* f = FormatRepository::getFormat(m_format);
const FormatInfo* f = m_format.getInfo();
if (f)
timeDelta = f->guessSamples(data.length());
}
@ -409,7 +423,7 @@ void DataTranslator::uninstall(TranslatorFactory* factory)
s_mutex.unlock();
}
String DataTranslator::srcFormats(const String& dFormat)
String DataTranslator::srcFormats(const DataFormat& dFormat)
{
String s;
s_mutex.lock();
@ -429,7 +443,7 @@ String DataTranslator::srcFormats(const String& dFormat)
return s;
}
String DataTranslator::destFormats(const String& sFormat)
String DataTranslator::destFormats(const DataFormat& sFormat)
{
String s;
s_mutex.lock();
@ -449,7 +463,7 @@ String DataTranslator::destFormats(const String& sFormat)
return s;
}
int DataTranslator::cost(const String& sFormat, const String& dFormat)
int DataTranslator::cost(const DataFormat& sFormat, const DataFormat& dFormat)
{
int c = -1;
s_mutex.lock();
@ -468,7 +482,7 @@ int DataTranslator::cost(const String& sFormat, const String& dFormat)
return c;
}
DataTranslator* DataTranslator::create(const String& sFormat, const String& dFormat)
DataTranslator* DataTranslator::create(const DataFormat& sFormat, const DataFormat& dFormat)
{
if (sFormat == dFormat) {
Debug(DebugInfo,"Not creating identity DataTranslator for \"%s\"",sFormat.c_str());
@ -541,7 +555,7 @@ bool DataTranslator::attachChain(DataSource* source, DataConsumer* consumer)
}
}
NDebug(retv ? DebugAll : DebugWarn,"DataTranslator::attachChain [%p] \"%s\" -> [%p] \"%s\" %s",
source,source->getFormatName(),consumer,consumer->getFormatName(),
source,source->getFormat(),consumer,consumer->getFormat(),
retv ? "succeeded" : "failed");
return retv;
}

View File

@ -22,19 +22,6 @@
#include "yateclass.h"
#ifndef _WINDOWS
#ifndef SOCKET
typedef int SOCKET;
#endif
#endif
#ifndef IPTOS_LOWDELAY
#define IPTOS_LOWDELAY 0x10
#define IPTOS_THROUGHPUT 0x08
#define IPTOS_RELIABILITY 0x04
#define IPTOS_MINCOST 0x02
#endif
using namespace TelEngine;
Socket::Socket()
@ -140,47 +127,24 @@ bool Socket::listen(unsigned int backlog)
return checkError(::listen(m_handle,backlog));
}
bool Socket::setOption(int level, int name, const void* value, int length)
bool Socket::setOption(int level, int name, const void* value, socklen_t length)
{
if (!value)
length = 0;
return checkError(::setsockopt(m_handle,level,name,(const char*)value,length));
}
bool Socket::getOption(int level, int name, void* buffer, int* length)
bool Socket::getOption(int level, int name, void* buffer, socklen_t* length)
{
#ifdef _WINDOWS
if (length && !buffer)
*length = 0;
return checkError(::getsockopt(m_handle,level,name,(char*)buffer,length));
#else
socklen_t len = 0;
if (length)
len = *length;
bool ok = checkError(::getsockopt(m_handle,level,name,(char*)buffer,&len));
if (length)
*length = len;
return ok;
#endif
}
bool Socket::setTOS(TOS tos)
bool Socket::setTOS(int tos)
{
#ifdef IP_TOS
int val = tos;
switch (tos) {
case LowDelay:
val = IPTOS_LOWDELAY;
break;
case MaxThroughput:
val = IPTOS_THROUGHPUT;
break;
case MaxReliability:
val = IPTOS_RELIABILITY;
break;
case MinCost:
val = IPTOS_MINCOST;
break;
}
return setOption(IPPROTO_IP,IP_TOS,&val,sizeof(val));
return setOption(IPPROTO_IP,IP_TOS,&tos,sizeof(tos));
#else
m_error = ENOTIMPL;
return false;

View File

@ -179,9 +179,7 @@ void ThreadPrivate::run()
Thread::usleep(10);
m_thread->run();
#ifdef _WINDOWS
destroy();
#else
#ifndef _WINDOWS
pthread_cleanup_pop(1);
#endif
}
@ -324,7 +322,7 @@ void* ThreadPrivate::startFunc(void* arg)
ThreadPrivate *t = reinterpret_cast<ThreadPrivate *>(arg);
t->run();
#ifdef _WINDOWS
t->cleanup();
t->destroy();
#else
return 0;
#endif

View File

@ -108,13 +108,7 @@ public:
void answer(iax_event *e);
void reg(iax_event *e);
void run(void);
IAXConnection *find(iax_session *session);
void handleEvent(iax_event *event);
inline ObjList &calls()
{ return m_calls; }
private:
ObjList m_calls;
};
class IAXConnection : public Channel
@ -160,6 +154,7 @@ public:
virtual ~IAXPlugin();
virtual void initialize();
virtual bool msgExecute(Message& msg, String& dest);
IAXConnection *find(iax_session *session);
IAXEndPoint *m_endpoint;
};
@ -294,7 +289,7 @@ void IAXEndPoint::run(void)
case IAX_EVENT_TIMEOUT:
case IAX_EVENT_REJECT:
case IAX_EVENT_HANGUP:
if ((conn = find(e->session)) != 0) {
if ((conn = iplugin.find(e->session)) != 0) {
conn->abort(e->etype);
conn->destruct();
}
@ -483,17 +478,6 @@ void IAXEndPoint::reg(iax_event *e)
s_mutex.unlock();
}
IAXConnection* IAXEndPoint::find(iax_session *session)
{
ObjList *p = m_calls.skipNull();
for (; p; p=p->skipNext()) {
IAXConnection *t = static_cast<IAXConnection *>(p->get());
if (t->session() == session)
return t;
}
return 0;
}
IAXConnection::IAXConnection(Driver* driver, const char* addr, iax_session *session)
: Channel(driver,0,(session == 0)),
m_session(session), m_final(false), m_muted(false),
@ -653,7 +637,7 @@ void IAXConnection::hangup(const char *reason)
if (!reason)
reason = m_reason;
if (!reason)
reason = "Unexpected problem";
reason = Engine::exiting() ? "Server shutdown" : "Unexpected problem";
if (!m_final) {
s_mutex.lock();
m_final = true;
@ -894,6 +878,17 @@ bool IAXPlugin::msgExecute(Message& msg, String& dest)
return true;
};
IAXConnection* IAXPlugin::find(iax_session *session)
{
ObjList *p = channels().skipNull();
for (; p; p=p->skipNext()) {
IAXConnection *t = static_cast<IAXConnection *>(p->get());
if (t->session() == session)
return t;
}
return 0;
}
IAXPlugin::IAXPlugin()
: Driver("iax","varchans"), m_endpoint(0)
{

View File

@ -150,10 +150,12 @@ Connection::~Connection()
void Connection::run()
{
#ifdef O_NONBLOCK
if (::fcntl(m_socket,F_SETFL,O_NONBLOCK)) {
Debug("RManager",DebugGoOn, "Failed to set tcp socket to nonblocking mode: %s\n", strerror(errno));
return;
}
#endif
// For the sake of responsiveness try to turn off the tcp assembly timer
int arg = 1;
if (::setsockopt(m_socket, SOL_SOCKET, TCP_NODELAY, (char *)&arg, sizeof(arg) ) < 0)
@ -178,6 +180,8 @@ void Connection::run()
Debug("RManager",DebugInfo,"Socket exception condition on %d",m_socket);
return;
}
if (!FD_ISSET(m_socket,&readfd))
continue;
int readsize = ::read(m_socket,buffer+posinbuf,sizeof(buffer)-posinbuf-1);
if (!readsize) {
Debug("RManager",DebugInfo,"Socket condition EOF on %d",m_socket);

View File

@ -54,7 +54,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib /nologo /dll /machine:I386 /out:"Release/rmanager.yate"
# ADD LINK32 kernel32.lib ws2_32.lib /nologo /dll /machine:I386 /out:"Release/rmanager.yate"
# SUBTRACT LINK32 /incremental:yes
!ELSEIF "$(CFG)" == "_rmanager - Win32 Debug"
@ -82,7 +82,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug/rmanager.yate" /pdbtype:sept
# ADD LINK32 kernel32.lib ws2_32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug/rmanager.yate" /pdbtype:sept
!ENDIF

View File

@ -55,6 +55,8 @@ typedef signed __int64 int64_t;
typedef unsigned __int64 u_int64_t;
typedef unsigned __int64 uint64_t;
typedef int socklen_t;
#define vsnprintf _vsnprintf
#define snprintf _snprintf
#define strcasecmp _stricmp
@ -99,7 +101,9 @@ typedef unsigned __int64 uint64_t;
#include <arpa/inet.h>
#include <netdb.h>
#ifndef SOCKET
typedef int SOCKET;
#endif
#define YATE_API
@ -107,6 +111,13 @@ typedef int SOCKET;
#endif /* ! _WINDOWS */
#ifndef IPTOS_LOWDELAY
#define IPTOS_LOWDELAY 0x10
#define IPTOS_THROUGHPUT 0x08
#define IPTOS_RELIABILITY 0x04
#define IPTOS_MINCOST 0x02
#endif
struct timeval;
/**
@ -2177,10 +2188,10 @@ public:
* Types of service
*/
enum TOS {
LowDelay = 0x1000,
MaxThroughput,
MaxReliability,
MinCost,
LowDelay = IPTOS_LOWDELAY,
MaxThroughput = IPTOS_THROUGHPUT,
MaxReliability = IPTOS_RELIABILITY,
MinCost = IPTOS_MINCOST,
};
/**
@ -2262,7 +2273,7 @@ public:
* @param length Size of the supplied buffer
* @return True if operation was successfull, false if an error occured
*/
bool setOption(int level, int name, const void* value = 0, int length = 0);
bool setOption(int level, int name, const void* value = 0, socklen_t length = 0);
/**
* Get socket options
@ -2271,14 +2282,14 @@ public:
* @param length Pointer to size of the supplied buffer, will be filled on return
* @return True if operation was successfull, false if an error occured
*/
bool getOption(int level, int name, void* buffer, int* length);
bool getOption(int level, int name, void* buffer, socklen_t* length);
/**
* Set the Type of Service on the IP level of this socket
* @param tos New TOS enum to set or byte value
* @param tos New TOS bits to set
* @return True if operation was successfull, false if an error occured
*/
bool setTOS(TOS tos);
bool setTOS(int tos);
/**
* Start listening for incoming connections on the socket

View File

@ -164,6 +164,73 @@ public:
static const FormatInfo* addFormat(const String& name, int drate, int fsize, const String& type = "audio", int srate = 8000, int nchan = 1);
};
/**
* An extension of a String that can parse data formats
* @short A Data format
*/
class YATE_API DataFormat : public String
{
public:
/**
* Creates a new, empty string.
*/
inline DataFormat()
: m_parsed(0)
{ }
/**
* Creates a new initialized format.
* @param value Initial value of the format
*/
inline DataFormat(const char* value)
: String(value), m_parsed(0)
{ }
/**
* Copy constructor.
* @param value Initial value of the format
*/
DataFormat(const DataFormat& value)
: String(value), m_parsed(0)
{ }
/**
* Constructor from String reference
* @param value Initial value of the format
*/
DataFormat(const String& value)
: String(value), m_parsed(0)
{ }
/**
* Constructor from String pointer.
* @param value Initial value of the format
*/
DataFormat(const String* value)
: String(value), m_parsed(0)
{ }
/**
* Assignment operator.
*/
inline DataFormat& operator=(const DataFormat& value)
{ String::operator=(value); return *this; }
/**
* Retrive a pointer to the format information
* @return Pointer to the associated format info or NULL if error
*/
const FormatInfo* getInfo() const;
protected:
/**
* Called whenever the value changed (except in constructors).
*/
virtual void changed();
mutable const FormatInfo* m_parsed;
};
/**
* A generic data handling object
*/
@ -174,54 +241,33 @@ public:
* Construct a DataNode
* @param format Description of the data format, default none
*/
inline DataNode(const FormatInfo* format = 0)
: m_format(format), m_timestamp(0) { }
/**
* Construct a DataNode from a format name
* @param format Name of the data format, default none
*/
inline DataNode(const String& format)
: m_format(FormatRepository::getFormat(format)), m_timestamp(0) { }
inline DataNode(const char* format = 0)
: m_format(format), m_timestamp(0)
{ }
/**
* Get the computing cost of converting the data to the format asked
* @param format Name of the format to check for
* @return -1 if unsupported, 0 for native format else cost in KIPS
*/
virtual int costFormat(const FormatInfo* format)
virtual int costFormat(const DataFormat& format)
{ return -1; }
/**
* Change the format used to transfer data
* @param format Description of the format to set for data
* @return True if the format changed successfully, false if not changed
*/
virtual bool setFormat(const FormatInfo* format = 0)
{ return false; }
/**
* Change the format used to transfer data
* @param format Name of the format to set for data
* @return True if the format changed successfully, false if not changed
*/
inline bool setFormat(const String& format)
{ return setFormat(FormatRepository::getFormat(format)); }
virtual bool setFormat(const DataFormat& format)
{ return false; }
/**
* Get the description of the format currently in use
* @return Pointer to the data format
*/
inline const FormatInfo* getFormat() const
inline const DataFormat& getFormat() const
{ return m_format; }
/**
* Get the name of the format currently in use
* @return Name of the data format
*/
inline const char* getFormatName() const
{ return m_format ? m_format->name : 0; }
/**
* Get the current position in the data stream
* @return Timestamp of current data position
@ -230,23 +276,7 @@ public:
{ return m_timestamp; }
protected:
/**
* Change the format used to transfer data
* @param format Description of the format to set for data
* @return True if the format changed successfully, false if not changed
*/
inline void setFormatInternal(const FormatInfo* format = 0)
{ m_format = format; }
/**
* Change the format used to transfer data
* @param format Name of the format to set for data
* @return True if the format changed successfully, false if not changed
*/
inline void setFormatInternal(const String& format)
{ setFormatInternal(FormatRepository::getFormat(format)); }
const FormatInfo* m_format;
DataFormat m_format;
unsigned long m_timestamp;
};
@ -256,19 +286,13 @@ protected:
class YATE_API DataConsumer : public DataNode
{
friend class DataSource;
public:
/**
* Consumer constructor
* @param format Description of the data format
*/
inline DataConsumer(const FormatInfo *format)
: DataNode(format), m_source(0) { }
public:
/**
* Consumer constructor
* @param format Name of the data format, default "slin" (Signed Linear)
*/
inline DataConsumer(const String& format = "slin")
inline DataConsumer(const char* format = "slin")
: DataNode(format), m_source(0) { }
/**
@ -304,19 +328,13 @@ private:
class YATE_API DataSource : public DataNode
{
friend class DataTranslator;
public:
/**
* Source constructor
* @param format Description of the data format
*/
inline DataSource(const FormatInfo* format)
: DataNode(format), m_translator(0) { }
public:
/**
* Source constructor
* @param format Name of the data format, default "slin" (Signed Linear)
*/
inline DataSource(const String& format = "slin")
inline DataSource(const char* format = "slin")
: DataNode(format), m_translator(0) { }
/**
@ -399,18 +417,11 @@ public:
Thread* thread() const;
protected:
/**
* Threaded Source constructor
* @param format Description of the data format
*/
inline ThreadedSource(const FormatInfo* format)
: DataSource(format), m_thread(0) { }
/**
* Threaded Source constructor
* @param format Name of the data format, default "slin" (Signed Linear)
*/
inline ThreadedSource(const String& format = "slin")
inline ThreadedSource(const char* format = "slin")
: DataSource(format), m_thread(0) { }
/**
@ -468,14 +479,14 @@ public:
* @param dFormat Name of destination format
* @return Space separated list of source formats
*/
static String srcFormats(const String& dFormat = "slin");
static String srcFormats(const DataFormat& dFormat = "slin");
/**
* Get a textual list of formats supported for a given input format
* @param sFormat Name of source format
* @return Space separated list of destination formats
*/
static String destFormats(const String& sFormat = "slin");
static String destFormats(const DataFormat& sFormat = "slin");
/**
* Finds the cost of a translator given the source and destination format names
@ -483,7 +494,7 @@ public:
* @param dFormat Name of the destination format (data supplied to the source)
* @return Cost of best (cheapest) codec or -1 if no known codec exists
*/
static int cost(const String& sFormat, const String& dFormat);
static int cost(const DataFormat& sFormat, const DataFormat& dFormat);
/**
* Creates a translator given the source and destination format names
@ -491,7 +502,7 @@ public:
* @param dFormat Name of the destination format (data supplied to the source)
* @return A pointer to a DataTranslator object or NULL if no known codec exists
*/
static DataTranslator* create(const String& sFormat, const String& dFormat);
static DataTranslator* create(const DataFormat& sFormat, const DataFormat& dFormat);
/**
* Attach a consumer to a source, possibly trough a chain of translators
@ -549,7 +560,7 @@ public:
* @param dFormat Name of the destination format (data supplied to the source)
* @return A pointer to a DataTranslator object or NULL
*/
virtual DataTranslator* create(const String& sFormat, const String& dFormat) = 0;
virtual DataTranslator* create(const DataFormat& sFormat, const DataFormat& dFormat) = 0;
/**
* Get the capabilities table of this translator