blob: 1288a3311264f3650caf03f4746b545e5cddb295 [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:
Chris Masoneb925cc82011-06-22 15:39:57 -070035 DBusAdaptor(DBus::Connection* conn, const std::string &object_path);
Chris Masoned0ceb8c2011-06-02 10:05:39 -070036 virtual ~DBusAdaptor();
37
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080038 static bool SetProperty(PropertyStore *store,
39 const std::string &name,
40 const ::DBus::Variant &value,
41 ::DBus::Error *error);
mukesh agrawalde29fa82011-09-16 16:16:36 -070042 static bool GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070043 std::map<std::string, ::DBus::Variant> *out,
44 ::DBus::Error *error);
mukesh agrawal8abd2f62012-01-30 14:56:14 -080045 // Look for a property with |name| in |store|. If found, reset the
46 // property to its "factory" value. If the property can not be
47 // found, or if it can not be cleared (e.g., because it is
48 // read-only), set |error| accordingly.
49 //
50 // Returns true if the property was found and cleared; returns false
51 // otherwise.
52 static bool ClearProperty(PropertyStore *store,
53 const std::string &name,
54 ::DBus::Error *error);
mukesh agrawal7a4e4002011-09-06 11:26:05 -070055 static void ArgsToKeyValueStore(
56 const std::map<std::string, ::DBus::Variant> &args,
57 KeyValueStore *out,
58 Error *error);
Chris Masoned0ceb8c2011-06-02 10:05:39 -070059
Chris Masone8fe2c7e2011-06-09 15:51:19 -070060 static ::DBus::Variant BoolToVariant(bool value);
Paul Stewartced6a0b2011-11-08 15:32:04 -080061 static ::DBus::Variant ByteArraysToVariant(const ByteArrays &value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070062 static ::DBus::Variant ByteToVariant(uint8 value);
63 static ::DBus::Variant Int16ToVariant(int16 value);
64 static ::DBus::Variant Int32ToVariant(int32 value);
Darin Petkov63138a92012-02-06 14:09:15 +010065 static ::DBus::Variant KeyValueStoreToVariant(const KeyValueStore &value);
Chris Masoneb925cc82011-06-22 15:39:57 -070066 static ::DBus::Variant PathToVariant(const ::DBus::Path &value);
mukesh agrawal2366eed2012-03-20 18:21:50 -070067 static ::DBus::Variant PathsToVariant(
mukesh agrawal32399322011-09-01 10:53:43 -070068 const std::vector< ::DBus::Path> &value);
Chris Masoneb925cc82011-06-22 15:39:57 -070069 static ::DBus::Variant StringToVariant(const std::string &value);
Chris Masone889666b2011-07-03 12:58:50 -070070 static ::DBus::Variant StringmapToVariant(const Stringmap &value);
71 static ::DBus::Variant StringmapsToVariant(const Stringmaps &value);
72 static ::DBus::Variant StringsToVariant(const Strings &value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070073 static ::DBus::Variant Uint16ToVariant(uint16 value);
74 static ::DBus::Variant Uint32ToVariant(uint32 value);
Paul Stewarte18c33b2012-07-10 20:48:44 -070075 static ::DBus::Variant Uint64ToVariant(uint64 value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070076
77 static bool IsBool(::DBus::Signature signature);
78 static bool IsByte(::DBus::Signature signature);
Paul Stewartced6a0b2011-11-08 15:32:04 -080079 static bool IsByteArrays(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070080 static bool IsInt16(::DBus::Signature signature);
81 static bool IsInt32(::DBus::Signature signature);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070082 static bool IsPath(::DBus::Signature signature);
mukesh agrawal2366eed2012-03-20 18:21:50 -070083 static bool IsPaths(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070084 static bool IsString(::DBus::Signature signature);
85 static bool IsStringmap(::DBus::Signature signature);
Chris Masone27c4aa52011-07-02 13:10:14 -070086 static bool IsStringmaps(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070087 static bool IsStrings(::DBus::Signature signature);
88 static bool IsUint16(::DBus::Signature signature);
89 static bool IsUint32(::DBus::Signature signature);
Paul Stewarte18c33b2012-07-10 20:48:44 -070090 static bool IsUint64(::DBus::Signature signature);
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050091 static bool IsKeyValueStore(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070092
Darin Petkove5bc2cb2011-12-07 14:47:32 +010093 protected:
Eric Shienbrood9a245532012-03-07 14:20:39 -050094 ResultCallback GetMethodReplyCallback(const DBus::Tag *tag);
95 // Adaptors call this method just before returning. If |error|
96 // indicates that the operation has completed, with no asynchronously
97 // delivered result expected, then a DBus method reply is immediately
98 // sent to the client that initiated the method invocation. Otherwise,
99 // the operation is ongoing, and the result will be sent to the client
100 // when the operation completes at some later time.
101 //
102 // Adaptors should always construct an Error initialized to the value
103 // Error::kOperationInitiated. A pointer to this Error is passed down
104 // through the call stack. Any layer that determines that the operation
105 // has completed, either because of a failure that prevents carrying it
106 // out, or because it was possible to complete it without sending a request
107 // to an external server, should call error.Reset() to indicate success,
108 // or to some error type to reflect the kind of failure that occurred.
109 // Otherwise, they should leave the Error alone.
110 //
111 // The general structure of an adaptor method is
112 //
113 // void XXXXDBusAdaptor::SomeMethod(<args...>, DBus::Error &error) {
114 // Error e(Error::kOperationInitiated);
115 // DBus::Tag *tag = new DBus::Tag();
116 // xxxx_->SomeMethod(<args...>, &e, GetMethodReplyCallback(tag));
117 // ReturnResultOrDefer(tag, e, &error);
118 // }
119 //
120 void ReturnResultOrDefer(const DBus::Tag *tag,
121 const Error &error,
122 DBus::Error *dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100123
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700124 private:
Paul Stewartced6a0b2011-11-08 15:32:04 -0800125 static const char kByteArraysSig[];
mukesh agrawal2366eed2012-03-20 18:21:50 -0700126 static const char kPathsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700127 static const char kStringmapSig[];
Chris Masone27c4aa52011-07-02 13:10:14 -0700128 static const char kStringmapsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700129 static const char kStringsSig[];
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100130
Eric Shienbrood9a245532012-03-07 14:20:39 -0500131 void MethodReplyCallback(const DBus::Tag *tag, const Error &error);
132 void DeferReply(const DBus::Tag *tag);
133 void ReplyNow(const DBus::Tag *tag);
134 void ReplyNowWithError(const DBus::Tag *tag, const DBus::Error &error);
135
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700136 DISALLOW_COPY_AND_ASSIGN(DBusAdaptor);
Chris Masoned7732e42011-05-20 11:08:56 -0700137};
138
139} // namespace shill
140#endif // SHILL_DBUS_ADAPTOR_H_