IOManager.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023
00024 #include "IOManager.hpp"
00025 #include "IOThread.hpp"
00026 #include <fcntl.h>
00027 #include <Exception.hpp>
00028 #include <cassert>
00029
00030 using namespace mermaid::support::io;
00031 using mermaid::support::errorhandling::Exception;
00032
00033 shared_ptr<IOManager> IOManager::instance_ (shared_ptr<IOManager> (new IOManager()));
00034
00035 IOManager::IOManager() : ioThread_ (new IOThread()) { }
00036
00037 IOManager::~IOManager() { }
00038
00039 shared_ptr<IOManager> IOManager::getInstance()
00040 {
00041 return instance_;
00042 }
00043
00044 shared_ptr<DeviceHandle> IOManager::createDevice (std::string filename, shared_ptr<ActiveObject> owner, shared_ptr<DeviceConfigurator> deviceConfigurator, int expectedDataSize)
00045 {
00046
00047 int fileDescriptor = open (filename.c_str(), O_RDWR);
00048 if (fileDescriptor == -1) {
00049 throw Exception ("IOManager::createDevice: Error opening device: " + filename);
00050 }
00051
00052 shared_ptr<Device> device (new Device (expectedDataSize, fileDescriptor, owner, deviceConfigurator));
00053
00054 deviceConfigurator->configureDevice (fileDescriptor);
00055
00056 shared_ptr<DeviceHandle> deviceHandle (new DeviceHandle (device));
00057 deviceHandleMap_[device] = deviceHandle;
00058
00059 return deviceHandle;
00060 }
00061
00062 void IOManager::enableDeviceRead (shared_ptr<Device> device, shared_ptr<StreamOperationHandlerMethodBase> streamOperationHandlerRead)
00063 {
00064 device->enableRead (streamOperationHandlerRead);
00065 }
00066
00067 void IOManager::enableDeviceWrite (shared_ptr<Device> device)
00068 {
00069 device->enableWrite();
00070 }
00071
00072 shared_ptr<IOThread> IOManager::getIOThread() const
00073 {
00074 return ioThread_;
00075 }
00076
00077 void IOManager::closeDevice (shared_ptr<Device> device)
00078 {
00079 assert (deviceHandleMap_.find (device) != deviceHandleMap_.end());
00080 deviceHandleMap_.erase (device);
00081 device->close();
00082 }