15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROMEOS_DBUS_SHILL_PROFILE_CLIENT_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEOS_DBUS_SHILL_PROFILE_CLIENT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/chromeos_export.h"
13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chromeos/dbus/dbus_client.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_client_helper.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dbus {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ObjectPath;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace dbus
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShillPropertyChangedObserver;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ShillProfileClient is used to communicate with the Shill Profile
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// service.  All methods should be called from the origin thread which
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initializes the DBusThreadManager instance.
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class CHROMEOS_EXPORT ShillProfileClient : public DBusClient {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ShillClientHelper::PropertyChangedHandler PropertyChangedHandler;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ShillClientHelper::DictionaryValueCallbackWithoutStatus
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValueCallbackWithoutStatus;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef ShillClientHelper::ErrorCallback ErrorCallback;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Interface for setting up services for testing. Accessed through
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetTestInterface(), only implemented in the stub implementation.
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // TODO(stevenjb): remove dependencies on entry_path -> service_path
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // mappings in some of the TestInterface implementations.
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class TestInterface {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    virtual void AddProfile(const std::string& profile_path,
50b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                            const std::string& userhash) = 0;
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Adds an entry to the profile only. |entry_path| corresponds to a
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // 'service_path' and a corresponding entry will be added to
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // ShillManagerClient ServiceCompleteList. No checking or updating of
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // ShillServiceClient is performed.
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void AddEntry(const std::string& profile_path,
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          const std::string& entry_path,
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          const base::DictionaryValue& properties) = 0;
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Adds a service to the profile, copying properties from the
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // ShillServiceClient entry matching |service_path|. Returns false if no
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Service entry exists or if a Profile entry already exists. Also sets
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // the Profile property of the service in ShillServiceClient.
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual bool AddService(const std::string& profile_path,
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const std::string& service_path) = 0;
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Copies properties from the ShillServiceClient entry matching
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // |service_path| to the profile entry matching |profile_path|. Returns
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // false if no Service entry exits or if no Profile entry exists.
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual bool UpdateService(const std::string& profile_path,
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               const std::string& service_path) = 0;
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Sets |profiles| to the current list of profile paths.
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void GetProfilePaths(std::vector<std::string>* profiles) = 0;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Sets |properties| to the entry for |service_path|, sets |profile_path|
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // to the path of the profile with the entry, and returns true if the
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // service exists in any profile.
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual bool GetService(const std::string& service_path,
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            std::string* profile_path,
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            base::DictionaryValue* properties) = 0;
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Remove all profile entries.
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual void ClearProfiles() = 0;
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   protected:
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~TestInterface() {}
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ShillProfileClient();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory function, creates a new instance which is owned by the caller.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For normal usage, access the singleton via DBusThreadManager::Get().
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static ShillProfileClient* Create();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns the shared profile path.
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static std::string GetSharedProfilePath();
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a property changed |observer| for the profile at |profile_path|.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddPropertyChangedObserver(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectPath& profile_path,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShillPropertyChangedObserver* observer) = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a property changed |observer| for the profile at |profile_path|.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemovePropertyChangedObserver(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectPath& profile_path,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShillPropertyChangedObserver* observer) = 0;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls GetProperties method.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |callback| is called after the method call succeeds.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetProperties(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const dbus::ObjectPath& profile_path,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const DictionaryValueCallbackWithoutStatus& callback,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ErrorCallback& error_callback) = 0;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls GetEntry method.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |callback| is called after the method call succeeds.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetEntry(const dbus::ObjectPath& profile_path,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& entry_path,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const DictionaryValueCallbackWithoutStatus& callback,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const ErrorCallback& error_callback) = 0;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls DeleteEntry method.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |callback| is called after the method call succeeds.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeleteEntry(const dbus::ObjectPath& profile_path,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& entry_path,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const base::Closure& callback,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const ErrorCallback& error_callback) = 0;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns an interface for testing (stub only), or returns NULL.
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual TestInterface* GetTestInterface() = 0;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  friend class ShillProfileClientTest;
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create() should be used instead.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShillProfileClient();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShillProfileClient);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROMEOS_DBUS_SHILL_PROFILE_CLIENT_H_
146