Files
pvAccess/pvAccessApp/factory/ChannelAccessFactory.cpp
2011-05-13 14:02:06 +02:00

64 lines
1.6 KiB
C++

/*ChannelAccessFactory.cpp*/
#include <lock.h>
#include <noDefaultMethods.h>
#include <pvAccess.h>
#include <pvData.h>
#include <factory.h>
#include <map>
#include <vector>
using namespace epics::pvData;
namespace epics { namespace pvAccess {
static ChannelAccess::shared_pointer channelAccess;
static Mutex channelProviderMutex;
typedef std::map<String, ChannelProvider::shared_pointer> ChannelProviderMap;
static ChannelProviderMap channelProviders;
class ChannelAccessImpl : public ChannelAccess {
public:
ChannelProvider::shared_pointer getProvider(String providerName) {
Lock guard(channelProviderMutex);
return channelProviders[providerName];
}
std::auto_ptr<stringVector_t> getProviderNames() {
Lock guard(channelProviderMutex);
std::auto_ptr<stringVector_t> providers(new stringVector_t());
for (ChannelProviderMap::const_iterator i = channelProviders.begin();
i != channelProviders.end(); i++)
providers->push_back(i->first);
return providers;
}
};
ChannelAccess::shared_pointer getChannelAccess() {
static Mutex mutex;
Lock guard(mutex);
if(channelAccess.get()==0){
channelAccess.reset(new ChannelAccessImpl());
}
return channelAccess;
}
void registerChannelProvider(ChannelProvider::shared_pointer const & channelProvider) {
Lock guard(channelProviderMutex);
channelProviders[channelProvider->getProviderName()] = channelProvider;
}
void unregisterChannelProvider(ChannelProvider::shared_pointer const & channelProvider) {
Lock guard(channelProviderMutex);
channelProviders.erase(channelProvider->getProviderName());
}
}}