Skip to content
MockAdapter.cpp 7.87 KiB
Newer Older
#include "MockAdapter.h"

#include "MockDevices.h"
#include "MockAdapterDevice.h"
#include "Common/Log.h"
gladish's avatar
gladish committed

#include <algorithm>
jacobgladish's avatar
jacobgladish committed
#include <sstream>
#include <vector>
gladish's avatar
gladish committed
namespace
{
  DSB_DECLARE_LOGNAME(MockAdapter);
gladish's avatar
gladish committed
  bridge::IAdapter::RegistrationHandle nextHandle = 0;
  bridge::IAdapter::RegistrationHandle GetNextRegistrationHandle()
gladish's avatar
gladish committed
  {
    return ++nextHandle;
  }
}

gladish's avatar
gladish committed
adapters::mock::MockAdapter::MockAdapter()
gladish's avatar
gladish committed
  : m_vendor("Acme")
  , m_adapterName("MockAdapter")
gladish's avatar
gladish committed
  , m_exposedAdapterPrefix("com." + m_vendor)
  , m_exposedApplicationName("DeviceSystemBridge")
  , m_exposedApplicationGuid(common::Guid::Parse("C27BC425-0058-4829-8775-441B5D8740C0"))
gladish's avatar
gladish committed
{
  // TODO: get m_exposedApplicatioName and Prefix from config
}

gladish's avatar
gladish committed
adapters::mock::MockAdapter::~MockAdapter()
gladish's avatar
gladish committed
{
  Shutdown();
gladish's avatar
gladish committed
std::string
adapters::mock::MockAdapter::GetVendor()
gladish's avatar
gladish committed
{
  return m_vendor;
}

gladish's avatar
gladish committed
std::string
adapters::mock::MockAdapter::GetAdapterName()
gladish's avatar
gladish committed
{
  return m_adapterName;
}

gladish's avatar
gladish committed
std::string
adapters::mock::MockAdapter::GetVersion()
gladish's avatar
gladish committed
{
  return m_version;
}

gladish's avatar
gladish committed
std::string
adapters::mock::MockAdapter::GetExposedAdapterPrefix()
gladish's avatar
gladish committed
{
  return m_exposedAdapterPrefix;
}

gladish's avatar
gladish committed
std::string
adapters::mock::MockAdapter::GetExposedApplicationName()
gladish's avatar
gladish committed
{
  return m_exposedApplicationName;
}

gladish's avatar
gladish committed
adapters::mock::MockAdapter::GetExposedApplicationGuid()
gladish's avatar
gladish committed
{
  return m_exposedApplicationGuid;
}

gladish's avatar
gladish committed
bridge::AdapterSignalVector adapters::mock::MockAdapter::GetSignals()
gladish's avatar
gladish committed
{
gladish's avatar
gladish committed
  return bridge::AdapterSignalVector();
bridge::AdapterStatus
adapters::mock::MockAdapter::Initialize(std::shared_ptr<bridge::IAdapterLog> const& log)
gladish's avatar
gladish committed
{
  CreateMockDevices();
  CreateSignals();
jacobgladish's avatar
jacobgladish committed
  m_log = log;
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::Shutdown()
gladish's avatar
gladish committed
{
  m_vendor.clear();
  m_adapterName.clear();
  m_version.clear();
  m_exposedAdapterPrefix.clear();
  m_exposedApplicationName.clear();

  m_devices.clear();
  m_signals.clear();

  m_signalListeners.clear();
  return ER_OK;
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::EnumDevices(
    bridge::EnumDeviceOptions /*opts*/,
    bridge::AdapterDeviceVector& deviceList,
    std::shared_ptr<bridge::IAdapterIoRequest>* req)
gladish's avatar
gladish committed
{
Jacob Gladish's avatar
Jacob Gladish committed
    req->reset();
    

  deviceList.clear();
  std::copy(m_devices.begin(), m_devices.end(), std::back_inserter(deviceList));

  return ER_OK;
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::GetProperty(
    std::shared_ptr<bridge::IAdapterProperty>& prop,
    std::shared_ptr<bridge::IAdapterIoRequest>* req)
gladish's avatar
gladish committed
{
Jacob Gladish's avatar
Jacob Gladish committed
    req->reset();
  std::shared_ptr<MockAdapterProperty> mockAdapterProperty = std::dynamic_pointer_cast<MockAdapterProperty>(prop);
  if (!mockAdapterProperty)
    return ER_BAD_ARG_1;

  std::shared_ptr<MockAdapterDevice> device = mockAdapterProperty->GetParent();
  if (!device)
    return ER_INVALID_ADDRESS;

  std::shared_ptr<MockAdapter> adapter = device->GetParent();
  if (!adapter)
    return ER_INVALID_ADDRESS;

  // TODO: set prop with latest stuff
  
  return ER_OK;
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::SetProperty(
    std::shared_ptr<bridge::IAdapterProperty> const& prop,
    std::shared_ptr<bridge::IAdapterIoRequest>* req)
gladish's avatar
gladish committed
{
Jacob Gladish's avatar
Jacob Gladish committed
    req ->reset();
  std::shared_ptr<MockAdapterProperty> mockAdapterProperty = std::dynamic_pointer_cast<MockAdapterProperty>(prop);
  if (!mockAdapterProperty)
    return ER_BAD_ARG_1;

  std::shared_ptr<MockAdapterDevice> device = mockAdapterProperty->GetParent();
  if (!device)
    return ER_INVALID_ADDRESS;

  std::shared_ptr<MockAdapter> adapter = device->GetParent();
  if (!adapter)
    return ER_INVALID_ADDRESS;

  // TODO: set internal state from prop->GetData()
  
  return ER_OK;
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::GetPropertyValue(
    std::shared_ptr<bridge::IAdapterProperty> const& prop,
gladish's avatar
gladish committed
    std::string const& attributeName,
    std::shared_ptr<bridge::IAdapterValue>& value,
    std::shared_ptr<bridge::IAdapterIoRequest>* req)
gladish's avatar
gladish committed
{
Jacob Gladish's avatar
Jacob Gladish committed
    req->reset();
  std::shared_ptr<MockAdapterProperty> mockAdapterProperty = std::dynamic_pointer_cast<MockAdapterProperty>(prop);
  if (!mockAdapterProperty)
    return ER_BAD_ARG_1;

  std::shared_ptr<MockAdapterValue> attr = mockAdapterProperty->GetAttributeByName(attributeName);
  if (!attr)
    return ER_INVALID_ADDRESS;

  value = std::dynamic_pointer_cast<bridge::IAdapterValue>(attr);
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::SetPropertyValue(
    std::shared_ptr<bridge::IAdapterProperty> const& prop,
    std::shared_ptr<bridge::IAdapterValue> const& value,
    std::shared_ptr<bridge::IAdapterIoRequest>* req)
gladish's avatar
gladish committed
{
Jacob Gladish's avatar
Jacob Gladish committed
    req->reset(); 
  std::shared_ptr<MockAdapterProperty> mockAdapterProperty = std::dynamic_pointer_cast<MockAdapterProperty>(prop);
  if (!mockAdapterProperty)
    return ER_BAD_ARG_1;

  std::shared_ptr<MockAdapterValue> attr = mockAdapterProperty->GetAttributeByName(value->GetName());
  if (!attr)
    return ER_INVALID_ADDRESS;

  attr->SetData(value->GetData());

  return ER_OK;
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::CallMethod(
    std::shared_ptr<bridge::IAdapterMethod>& method,
    std::shared_ptr<bridge::IAdapterIoRequest>* req)
gladish's avatar
gladish committed
{
  std::shared_ptr<MockAdapterMethod> m = std::dynamic_pointer_cast<MockAdapterMethod>(method);
  if (!m)
    return ER_BAD_ARG_1;

  std::shared_ptr<MockAdapterDevice> device = m->GetParent();
  if (!device)
    return ER_INVALID_ADDRESS;

  return device->DispatchMethod(m, req);
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::RegisterSignalListener(
gladish's avatar
gladish committed
    std::string const& signalName,
    std::shared_ptr<bridge::IAdapterSignalListener> const& listener,
gladish's avatar
gladish committed
    void* argp,
gladish's avatar
gladish committed
    bridge::IAdapter::RegistrationHandle& handle)
gladish's avatar
gladish committed
{
gladish's avatar
gladish committed
  RegisteredSignal reg;
  reg.Listener = listener;
  reg.Context = argp;
  reg.RegHandle = GetNextRegistrationHandle();
  m_signalListeners.insert(SignalMap::value_type(signalName, reg));
  handle = reg.RegHandle;
  return ER_OK;
bridge::AdapterStatus
gladish's avatar
gladish committed
adapters::mock::MockAdapter::UnregisterSignalListener(bridge::IAdapter::RegistrationHandle const& h)
gladish's avatar
gladish committed
{
  bridge::AdapterStatus st = ER_FAIL;
gladish's avatar
gladish committed
  for (SignalMap::iterator begin = m_signalListeners.begin(), end = m_signalListeners.end();
    begin != end; ++begin)
  {
    if (begin->second.RegHandle == h)
    {
      m_signalListeners.erase(begin);
      st = ER_OK;
      break;
    }
  }
  return st;
gladish's avatar
gladish committed
void
adapters::mock::MockAdapter::CreateMockDevices()
gladish's avatar
gladish committed
{
  std::shared_ptr<MockAdapter> self = std::dynamic_pointer_cast<MockAdapter>(shared_from_this());
gladish's avatar
gladish committed
  typedef std::vector<adapters::mock::MockDeviceDescriptor> vector;
gladish's avatar
gladish committed
  vector devices = adapters::mock::GetMockDevices();
gladish's avatar
gladish committed
  for (vector::const_iterator begin = devices.begin(), end = devices.end();
    begin != end; ++begin)
  {
    std::shared_ptr<MockAdapterDevice> dev = MockAdapterDevice::Create(*begin, self);
gladish's avatar
gladish committed
void
adapters::mock::MockAdapter::CreateSignals()
gladish's avatar
gladish committed
{
  std::shared_ptr<MockAdapterDevice> parent;
gladish's avatar
gladish committed
  bridge::AdapterValueVector values;
  std::shared_ptr<MockAdapterValue> val(new MockAdapterValue(bridge::kDeviceArravalHandle));
  std::shared_ptr<MockAdapterSignal> signal(new MockAdapterSignal(bridge::kDeviceArrivalSignal,
    parent, values));
  m_signals.push_back(signal);
bridge::AdapterStatus
adapters::mock::MockAdapter::NotifySignalListeners(std::shared_ptr<MockAdapterSignal> const& signal)
  bridge::AdapterStatus st = ER_FAIL;
  std::pair< SignalMap::iterator, SignalMap::iterator > range = 
    m_signalListeners.equal_range(signal->GetName());
  for (SignalMap::iterator begin = range.first, end = range.second; begin != end; ++begin)
  {
    RegisteredSignal& handler = begin->second;
    handler.Listener->AdapterSignalHandler(*signal, handler.Context);
  }

  return st;
}
jacobgladish's avatar
jacobgladish committed
std::string
adapters::mock::MockAdapter::GetStatusText(bridge::AdapterStatus st)
{
  if (st == 0)
    return std::string("ok");

  std::stringstream buff;
  buff << "MockError:";
  buff << static_cast<uint32_t>(st);
  return buff.str();
}