Files
pvAccess/pvAccessApp/utils/transportRegistry.cpp
2011-02-18 08:20:27 -05:00

165 lines
3.9 KiB
C++

/*
* transportRegistry.cpp
*/
#include "transportRegistry.h"
using namespace epics::pvData;
using namespace std;
namespace epics { namespace pvAccess {
TransportRegistry::TransportRegistry(): _mutex(Mutex())
{
}
TransportRegistry::~TransportRegistry()
{
clear();
}
void TransportRegistry::put(Transport* transport)
{
Lock guard(_mutex);
//const String type = transport.getType();
const int16 priority = transport->getPriority();
const osiSockAddr* address = transport->getRemoteAddress();
_transportsIter = _transports.find(address);
prioritiesMap_t* priorities;
if(_transportsIter == _transports.end())
{
priorities = new prioritiesMap_t();
_transports[address] = priorities;
}
else
{
priorities = _transportsIter->second;
}
(*priorities)[priority] = transport;
_allTransports.push_back(transport);
}
Transport* TransportRegistry::get(const String type, const osiSockAddr* address, const int16 priority)
{
Lock guard(_mutex);
_transportsIter = _transports.find(address);
if(_transportsIter != _transports.end())
{
prioritiesMap_t* priorities = _transportsIter->second;
_prioritiesIter = priorities->find(priority);
if(_prioritiesIter != priorities->end())
{
return _prioritiesIter->second;
}
}
return NULL;
}
Transport** TransportRegistry::get(const String type, const osiSockAddr* address, int32& size)
{
Lock guard(_mutex);
_transportsIter = _transports.find(address);
if(_transportsIter != _transports.end())
{
prioritiesMap_t* priorities = _transportsIter->second;
size = priorities->size();
Transport** transportArray = new Transport*[size];
int i = 0;
for(_prioritiesIter = priorities->begin(); _prioritiesIter != priorities->end(); _prioritiesIter++, i++)
{
transportArray[i] = _prioritiesIter->second;
}
return transportArray;
}
return NULL;
}
Transport* TransportRegistry::remove(Transport* transport)
{
Lock guard(_mutex);
const int16 priority = transport->getPriority();
const osiSockAddr* address = transport->getRemoteAddress();
Transport* retTransport = NULL;
_transportsIter = _transports.find(address);
if(_transportsIter != _transports.end())
{
prioritiesMap_t* priorities = _transportsIter->second;
_prioritiesIter = priorities->find(priority);
if(_prioritiesIter != priorities->end())
{
for(_allTransportsIter = _allTransports.begin(); _allTransportsIter != _allTransports.end(); _allTransportsIter++)
{
if(_prioritiesIter->second == *_allTransportsIter)
{
retTransport = _prioritiesIter->second;
_allTransports.erase(_allTransportsIter);
break;
}
}
priorities->erase(_prioritiesIter);
if(priorities->size() == 0)
{
_transports.erase(_transportsIter);
delete priorities;
}
}
}
return retTransport;
}
void TransportRegistry::clear()
{
Lock guard(_mutex);
for(_transportsIter = _transports.begin(); _transportsIter != _transports.end(); _transportsIter++)
{
delete _transportsIter->second;
}
_transports.clear();
_allTransports.clear();
}
int TransportRegistry::numberOfActiveTransports()
{
Lock guard(_mutex);
return (int32)_allTransports.size();
}
Transport** TransportRegistry::toArray(const String type, int32& size)
{
// TODO support type
Lock guard(_mutex);
size = _allTransports.size();
Transport** transportArray = new Transport*[size];
int i = 0;
for(_allTransportsIter = _allTransports.begin(); _allTransportsIter != _allTransports.end(); _allTransportsIter++, i++)
{
transportArray[i] = *_allTransportsIter;
}
return transportArray;
}
Transport** TransportRegistry::toArray(int32& size)
{
Lock guard(_mutex);
size = _allTransports.size();
if(size == 0)
{
return NULL;
}
Transport** transportArray = new Transport*[size];
int i = 0;
for(_allTransportsIter = _allTransports.begin(); _allTransportsIter != _allTransports.end(); _allTransportsIter++, i++)
{
transportArray[i] = *_allTransportsIter;
}
return transportArray;
}
}}