apmanager: claim interfaces from shill

apmanager requires sole ownership of a device before it can successfully
start a hostapd on that device.

The support for reclaiming interfaces from shill when an instance of
shill is started/restarted is not in yet. It requires support for registering
DBusNameOwnerChanged callback to the dbus_object_proxy_ which is not possible
in the current generated proxy code.

BUG=chromium:435704
TEST=unittests and manual test using apmanager on stumpy router

Change-Id: I7f737d0bf55f31c1e4ed2a7e5ffe04943ea056db
Reviewed-on: https://chromium-review.googlesource.com/232752
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Queue: Peter Qiu <zqiu@chromium.org>
Tested-by: Peter Qiu <zqiu@chromium.org>
diff --git a/shill_proxy.h b/shill_proxy.h
new file mode 100644
index 0000000..f02aa90
--- /dev/null
+++ b/shill_proxy.h
@@ -0,0 +1,44 @@
+// Copyright 2014 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 APMANAGER_SHILL_PROXY_H_
+#define APMANAGER_SHILL_PROXY_H_
+
+#include <set>
+#include <string>
+
+#include <base/macros.h>
+#include <base/memory/scoped_ptr.h>
+
+#include "shill/dbus-proxies.h"
+
+// Proxy for shill "org.chromium.flimflam" DBus service.
+namespace apmanager {
+
+class ShillProxy {
+ public:
+  ShillProxy();
+  virtual ~ShillProxy();
+
+  // Claim the given interface |interface_name| from shill.
+  virtual void ClaimInterface(const std::string& interface_name);
+  // Release the given interface |interface_name| to shill.
+  virtual void ReleaseInterface(const std::string& interface_name);
+
+ private:
+  static const char kManagerPath[];
+
+  // Bus object for system bus.
+  scoped_refptr<dbus::Bus> bus_;
+  // DBus proxy for shill manager.
+  std::unique_ptr<org::chromium::flimflam::ManagerProxy> manager_proxy_;
+  // List of interfaces apmanager have claimed.
+  std::set<std::string> claimed_interfaces_;
+
+  DISALLOW_COPY_AND_ASSIGN(ShillProxy);
+};
+
+}  // namespace apmanager
+
+#endif  // APMANAGER_SHILL_PROXY_H_