// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SHILL_CONTROL_INTERFACE_
#define SHILL_CONTROL_INTERFACE_

#include <string>

namespace shill {

class Manager;
class Service;
class Device;

using std::string;

// This is the Interface for "partner" objects which are in charge of
// handling incoming RPCs to the various core classes.
class AdaptorInterface {
 public:
  virtual void SetProperty(const string &key, const string &value) = 0;
  virtual const string *GetProperty(const string &key) = 0;
  virtual void ClearProperty(const string &key) = 0;
  virtual ~AdaptorInterface() {}
};

// These are the functions that a Manager adaptor must support
class ManagerAdaptorInterface {
 public:
  virtual void UpdateRunning() = 0;
  virtual ~ManagerAdaptorInterface() {}
};

// These are the functions that a Service adaptor must support
class ServiceAdaptorInterface {
 public:
  virtual void UpdateConnected() = 0;
  virtual ~ServiceAdaptorInterface() {}
};

// These are the functions that a Device adaptor must support
class DeviceAdaptorInterface {
 public:
  virtual void UpdateEnabled() = 0;
  virtual ~DeviceAdaptorInterface() {}
};

// This is the Interface for an object factory that creates adaptor objects
class ControlInterface {
 public:
  virtual ManagerAdaptorInterface *CreateManagerAdaptor(Manager *manager) = 0;
  virtual ServiceAdaptorInterface *CreateServiceAdaptor(Service *service) = 0;
  virtual DeviceAdaptorInterface *CreateDeviceAdaptor(Device *device) = 0;
  virtual ~ControlInterface() {}
};

}  // namespace shill
#endif  // SHILL_CONTROL_INTERFACE_
