blob: 2b89fb15893c117f3a828615c74ebbc67ef3c504 [file] [log] [blame]
Darin Petkov63138a92012-02-06 14:09:15 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masoned7732e42011-05-20 11:08:56 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_DBUS_ADAPTOR_H_
6#define SHILL_DBUS_ADAPTOR_H_
7
Chris Masone8fe2c7e2011-06-09 15:51:19 -07008#include <map>
Chris Masoned7732e42011-05-20 11:08:56 -07009#include <string>
Chris Masone8fe2c7e2011-06-09 15:51:19 -070010#include <vector>
Chris Masoned7732e42011-05-20 11:08:56 -070011
Chris Masoned0ceb8c2011-06-02 10:05:39 -070012#include <base/basictypes.h>
Eric Shienbrood9a245532012-03-07 14:20:39 -050013#include <base/callback.h>
14#include <base/memory/weak_ptr.h>
Chris Masoned7732e42011-05-20 11:08:56 -070015#include <dbus-c++/dbus.h>
16
Chris Masone889666b2011-07-03 12:58:50 -070017#include "shill/accessor_interface.h"
Darin Petkove5bc2cb2011-12-07 14:47:32 +010018#include "shill/adaptor_interfaces.h"
Eric Shienbrood9a245532012-03-07 14:20:39 -050019#include "shill/callbacks.h"
Darin Petkove5bc2cb2011-12-07 14:47:32 +010020#include "shill/error.h"
Chris Masone889666b2011-07-03 12:58:50 -070021
Chris Masoned7732e42011-05-20 11:08:56 -070022namespace shill {
23
24#define SHILL_INTERFACE "org.chromium.flimflam"
25#define SHILL_PATH "/org/chromium/flimflam"
26
mukesh agrawal7a4e4002011-09-06 11:26:05 -070027class KeyValueStore;
Chris Masoneb925cc82011-06-22 15:39:57 -070028class PropertyStore;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070029
Chris Masoned7732e42011-05-20 11:08:56 -070030// Superclass for all DBus-backed Adaptor objects
mukesh agrawalf1f490c2011-09-06 15:20:22 -070031class DBusAdaptor : public DBus::ObjectAdaptor,
Eric Shienbrood9a245532012-03-07 14:20:39 -050032 public DBus::IntrospectableAdaptor,
33 public base::SupportsWeakPtr<DBusAdaptor> {
Chris Masoned7732e42011-05-20 11:08:56 -070034 public:
mukesh agrawalcbfb34e2013-04-17 19:33:25 -070035 static const char kNullPath[];
36
Chris Masoneb925cc82011-06-22 15:39:57 -070037 DBusAdaptor(DBus::Connection* conn, const std::string &object_path);
Chris Masoned0ceb8c2011-06-02 10:05:39 -070038 virtual ~DBusAdaptor();
39
mukesh agrawalbebf1b82013-04-23 15:06:33 -070040 // Set the property with |name| through |store|. Returns true if and
41 // only if the property was changed. Updates |error| if a) an error
42 // was encountered, and b) |error| is non-NULL. Otherwise, |error| is
43 // unchanged.
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080044 static bool SetProperty(PropertyStore *store,
45 const std::string &name,
46 const ::DBus::Variant &value,
47 ::DBus::Error *error);
mukesh agrawalde29fa82011-09-16 16:16:36 -070048 static bool GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070049 std::map<std::string, ::DBus::Variant> *out,
50 ::DBus::Error *error);
mukesh agrawal8abd2f62012-01-30 14:56:14 -080051 // Look for a property with |name| in |store|. If found, reset the
52 // property to its "factory" value. If the property can not be
53 // found, or if it can not be cleared (e.g., because it is
54 // read-only), set |error| accordingly.
55 //
56 // Returns true if the property was found and cleared; returns false
57 // otherwise.
58 static bool ClearProperty(PropertyStore *store,
59 const std::string &name,
60 ::DBus::Error *error);
mukesh agrawal7a4e4002011-09-06 11:26:05 -070061 static void ArgsToKeyValueStore(
62 const std::map<std::string, ::DBus::Variant> &args,
63 KeyValueStore *out,
64 Error *error);
Chris Masoned0ceb8c2011-06-02 10:05:39 -070065
Chris Masone8fe2c7e2011-06-09 15:51:19 -070066 static ::DBus::Variant BoolToVariant(bool value);
Paul Stewartced6a0b2011-11-08 15:32:04 -080067 static ::DBus::Variant ByteArraysToVariant(const ByteArrays &value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070068 static ::DBus::Variant ByteToVariant(uint8 value);
69 static ::DBus::Variant Int16ToVariant(int16 value);
70 static ::DBus::Variant Int32ToVariant(int32 value);
Darin Petkov63138a92012-02-06 14:09:15 +010071 static ::DBus::Variant KeyValueStoreToVariant(const KeyValueStore &value);
Chris Masoneb925cc82011-06-22 15:39:57 -070072 static ::DBus::Variant PathToVariant(const ::DBus::Path &value);
mukesh agrawal2366eed2012-03-20 18:21:50 -070073 static ::DBus::Variant PathsToVariant(
mukesh agrawal32399322011-09-01 10:53:43 -070074 const std::vector< ::DBus::Path> &value);
Chris Masoneb925cc82011-06-22 15:39:57 -070075 static ::DBus::Variant StringToVariant(const std::string &value);
Chris Masone889666b2011-07-03 12:58:50 -070076 static ::DBus::Variant StringmapToVariant(const Stringmap &value);
77 static ::DBus::Variant StringmapsToVariant(const Stringmaps &value);
78 static ::DBus::Variant StringsToVariant(const Strings &value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070079 static ::DBus::Variant Uint16ToVariant(uint16 value);
mukesh agrawale7c7e652013-06-18 17:19:39 -070080 static ::DBus::Variant Uint16sToVariant(const Uint16s &value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070081 static ::DBus::Variant Uint32ToVariant(uint32 value);
Paul Stewarte18c33b2012-07-10 20:48:44 -070082 static ::DBus::Variant Uint64ToVariant(uint64 value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070083
84 static bool IsBool(::DBus::Signature signature);
85 static bool IsByte(::DBus::Signature signature);
Paul Stewartced6a0b2011-11-08 15:32:04 -080086 static bool IsByteArrays(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070087 static bool IsInt16(::DBus::Signature signature);
88 static bool IsInt32(::DBus::Signature signature);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070089 static bool IsPath(::DBus::Signature signature);
mukesh agrawal2366eed2012-03-20 18:21:50 -070090 static bool IsPaths(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070091 static bool IsString(::DBus::Signature signature);
92 static bool IsStringmap(::DBus::Signature signature);
Chris Masone27c4aa52011-07-02 13:10:14 -070093 static bool IsStringmaps(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070094 static bool IsStrings(::DBus::Signature signature);
95 static bool IsUint16(::DBus::Signature signature);
mukesh agrawale7c7e652013-06-18 17:19:39 -070096 static bool IsUint16s(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070097 static bool IsUint32(::DBus::Signature signature);
Paul Stewarte18c33b2012-07-10 20:48:44 -070098 static bool IsUint64(::DBus::Signature signature);
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050099 static bool IsKeyValueStore(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700100
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100101 protected:
Eric Shienbrood9a245532012-03-07 14:20:39 -0500102 ResultCallback GetMethodReplyCallback(const DBus::Tag *tag);
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800103 // It would be nice if these two methods could be templated. Unfortunately,
104 // attempts to do so will trigger some fairly esoteric warnings from the
105 // base library.
106 ResultStringCallback GetStringMethodReplyCallback(const DBus::Tag *tag);
107 ResultBoolCallback GetBoolMethodReplyCallback(const DBus::Tag *tag);
108
Eric Shienbrood9a245532012-03-07 14:20:39 -0500109 // Adaptors call this method just before returning. If |error|
110 // indicates that the operation has completed, with no asynchronously
111 // delivered result expected, then a DBus method reply is immediately
112 // sent to the client that initiated the method invocation. Otherwise,
113 // the operation is ongoing, and the result will be sent to the client
114 // when the operation completes at some later time.
115 //
116 // Adaptors should always construct an Error initialized to the value
117 // Error::kOperationInitiated. A pointer to this Error is passed down
118 // through the call stack. Any layer that determines that the operation
119 // has completed, either because of a failure that prevents carrying it
120 // out, or because it was possible to complete it without sending a request
121 // to an external server, should call error.Reset() to indicate success,
122 // or to some error type to reflect the kind of failure that occurred.
123 // Otherwise, they should leave the Error alone.
124 //
125 // The general structure of an adaptor method is
126 //
127 // void XXXXDBusAdaptor::SomeMethod(<args...>, DBus::Error &error) {
128 // Error e(Error::kOperationInitiated);
129 // DBus::Tag *tag = new DBus::Tag();
130 // xxxx_->SomeMethod(<args...>, &e, GetMethodReplyCallback(tag));
131 // ReturnResultOrDefer(tag, e, &error);
132 // }
133 //
134 void ReturnResultOrDefer(const DBus::Tag *tag,
135 const Error &error,
136 DBus::Error *dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100137
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700138 private:
Paul Stewartced6a0b2011-11-08 15:32:04 -0800139 static const char kByteArraysSig[];
mukesh agrawal2366eed2012-03-20 18:21:50 -0700140 static const char kPathsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700141 static const char kStringmapSig[];
Chris Masone27c4aa52011-07-02 13:10:14 -0700142 static const char kStringmapsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700143 static const char kStringsSig[];
mukesh agrawale7c7e652013-06-18 17:19:39 -0700144 static const char kUint16sSig[];
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100145
Eric Shienbrood9a245532012-03-07 14:20:39 -0500146 void MethodReplyCallback(const DBus::Tag *tag, const Error &error);
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800147 void StringMethodReplyCallback(const DBus::Tag *tag, const Error &error,
148 const std::string &returned);
149 void BoolMethodReplyCallback(const DBus::Tag *tag, const Error &error,
150 bool returned);
151 template<typename T>
152 void TypedMethodReplyCallback(const DBus::Tag *tag, const Error &error,
153 const T &returned);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500154 void DeferReply(const DBus::Tag *tag);
155 void ReplyNow(const DBus::Tag *tag);
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800156 template <typename T>
157 void TypedReplyNow(const DBus::Tag *tag, const T &value);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500158 void ReplyNowWithError(const DBus::Tag *tag, const DBus::Error &error);
159
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700160 DISALLOW_COPY_AND_ASSIGN(DBusAdaptor);
Chris Masoned7732e42011-05-20 11:08:56 -0700161};
162
163} // namespace shill
164#endif // SHILL_DBUS_ADAPTOR_H_