blob: f7d283651b5b528c4831017e5c0afd2cf87b22ae [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);
80 static ::DBus::Variant Uint32ToVariant(uint32 value);
Paul Stewarte18c33b2012-07-10 20:48:44 -070081 static ::DBus::Variant Uint64ToVariant(uint64 value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070082
83 static bool IsBool(::DBus::Signature signature);
84 static bool IsByte(::DBus::Signature signature);
Paul Stewartced6a0b2011-11-08 15:32:04 -080085 static bool IsByteArrays(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070086 static bool IsInt16(::DBus::Signature signature);
87 static bool IsInt32(::DBus::Signature signature);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070088 static bool IsPath(::DBus::Signature signature);
mukesh agrawal2366eed2012-03-20 18:21:50 -070089 static bool IsPaths(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070090 static bool IsString(::DBus::Signature signature);
91 static bool IsStringmap(::DBus::Signature signature);
Chris Masone27c4aa52011-07-02 13:10:14 -070092 static bool IsStringmaps(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070093 static bool IsStrings(::DBus::Signature signature);
94 static bool IsUint16(::DBus::Signature signature);
95 static bool IsUint32(::DBus::Signature signature);
Paul Stewarte18c33b2012-07-10 20:48:44 -070096 static bool IsUint64(::DBus::Signature signature);
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050097 static bool IsKeyValueStore(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070098
Darin Petkove5bc2cb2011-12-07 14:47:32 +010099 protected:
Eric Shienbrood9a245532012-03-07 14:20:39 -0500100 ResultCallback GetMethodReplyCallback(const DBus::Tag *tag);
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800101 // It would be nice if these two methods could be templated. Unfortunately,
102 // attempts to do so will trigger some fairly esoteric warnings from the
103 // base library.
104 ResultStringCallback GetStringMethodReplyCallback(const DBus::Tag *tag);
105 ResultBoolCallback GetBoolMethodReplyCallback(const DBus::Tag *tag);
106
Eric Shienbrood9a245532012-03-07 14:20:39 -0500107 // Adaptors call this method just before returning. If |error|
108 // indicates that the operation has completed, with no asynchronously
109 // delivered result expected, then a DBus method reply is immediately
110 // sent to the client that initiated the method invocation. Otherwise,
111 // the operation is ongoing, and the result will be sent to the client
112 // when the operation completes at some later time.
113 //
114 // Adaptors should always construct an Error initialized to the value
115 // Error::kOperationInitiated. A pointer to this Error is passed down
116 // through the call stack. Any layer that determines that the operation
117 // has completed, either because of a failure that prevents carrying it
118 // out, or because it was possible to complete it without sending a request
119 // to an external server, should call error.Reset() to indicate success,
120 // or to some error type to reflect the kind of failure that occurred.
121 // Otherwise, they should leave the Error alone.
122 //
123 // The general structure of an adaptor method is
124 //
125 // void XXXXDBusAdaptor::SomeMethod(<args...>, DBus::Error &error) {
126 // Error e(Error::kOperationInitiated);
127 // DBus::Tag *tag = new DBus::Tag();
128 // xxxx_->SomeMethod(<args...>, &e, GetMethodReplyCallback(tag));
129 // ReturnResultOrDefer(tag, e, &error);
130 // }
131 //
132 void ReturnResultOrDefer(const DBus::Tag *tag,
133 const Error &error,
134 DBus::Error *dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100135
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700136 private:
Paul Stewartced6a0b2011-11-08 15:32:04 -0800137 static const char kByteArraysSig[];
mukesh agrawal2366eed2012-03-20 18:21:50 -0700138 static const char kPathsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700139 static const char kStringmapSig[];
Chris Masone27c4aa52011-07-02 13:10:14 -0700140 static const char kStringmapsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700141 static const char kStringsSig[];
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100142
Eric Shienbrood9a245532012-03-07 14:20:39 -0500143 void MethodReplyCallback(const DBus::Tag *tag, const Error &error);
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800144 void StringMethodReplyCallback(const DBus::Tag *tag, const Error &error,
145 const std::string &returned);
146 void BoolMethodReplyCallback(const DBus::Tag *tag, const Error &error,
147 bool returned);
148 template<typename T>
149 void TypedMethodReplyCallback(const DBus::Tag *tag, const Error &error,
150 const T &returned);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500151 void DeferReply(const DBus::Tag *tag);
152 void ReplyNow(const DBus::Tag *tag);
Christopher Wiley0d9cf0c2013-02-19 19:24:57 -0800153 template <typename T>
154 void TypedReplyNow(const DBus::Tag *tag, const T &value);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500155 void ReplyNowWithError(const DBus::Tag *tag, const DBus::Error &error);
156
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700157 DISALLOW_COPY_AND_ASSIGN(DBusAdaptor);
Chris Masoned7732e42011-05-20 11:08:56 -0700158};
159
160} // namespace shill
161#endif // SHILL_DBUS_ADAPTOR_H_