blob: c43b080cb38bc8ff255b368ca98e0503054e6861 [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);
75
76 static bool IsBool(::DBus::Signature signature);
77 static bool IsByte(::DBus::Signature signature);
Paul Stewartced6a0b2011-11-08 15:32:04 -080078 static bool IsByteArrays(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070079 static bool IsInt16(::DBus::Signature signature);
80 static bool IsInt32(::DBus::Signature signature);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070081 static bool IsPath(::DBus::Signature signature);
mukesh agrawal2366eed2012-03-20 18:21:50 -070082 static bool IsPaths(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070083 static bool IsString(::DBus::Signature signature);
84 static bool IsStringmap(::DBus::Signature signature);
Chris Masone27c4aa52011-07-02 13:10:14 -070085 static bool IsStringmaps(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070086 static bool IsStrings(::DBus::Signature signature);
87 static bool IsUint16(::DBus::Signature signature);
88 static bool IsUint32(::DBus::Signature signature);
Eric Shienbroodb23d4b92012-02-16 12:32:42 -050089 static bool IsKeyValueStore(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070090
Darin Petkove5bc2cb2011-12-07 14:47:32 +010091 protected:
Eric Shienbrood9a245532012-03-07 14:20:39 -050092 ResultCallback GetMethodReplyCallback(const DBus::Tag *tag);
93 // Adaptors call this method just before returning. If |error|
94 // indicates that the operation has completed, with no asynchronously
95 // delivered result expected, then a DBus method reply is immediately
96 // sent to the client that initiated the method invocation. Otherwise,
97 // the operation is ongoing, and the result will be sent to the client
98 // when the operation completes at some later time.
99 //
100 // Adaptors should always construct an Error initialized to the value
101 // Error::kOperationInitiated. A pointer to this Error is passed down
102 // through the call stack. Any layer that determines that the operation
103 // has completed, either because of a failure that prevents carrying it
104 // out, or because it was possible to complete it without sending a request
105 // to an external server, should call error.Reset() to indicate success,
106 // or to some error type to reflect the kind of failure that occurred.
107 // Otherwise, they should leave the Error alone.
108 //
109 // The general structure of an adaptor method is
110 //
111 // void XXXXDBusAdaptor::SomeMethod(<args...>, DBus::Error &error) {
112 // Error e(Error::kOperationInitiated);
113 // DBus::Tag *tag = new DBus::Tag();
114 // xxxx_->SomeMethod(<args...>, &e, GetMethodReplyCallback(tag));
115 // ReturnResultOrDefer(tag, e, &error);
116 // }
117 //
118 void ReturnResultOrDefer(const DBus::Tag *tag,
119 const Error &error,
120 DBus::Error *dberror);
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100121
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700122 private:
Paul Stewartced6a0b2011-11-08 15:32:04 -0800123 static const char kByteArraysSig[];
mukesh agrawal2366eed2012-03-20 18:21:50 -0700124 static const char kPathsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700125 static const char kStringmapSig[];
Chris Masone27c4aa52011-07-02 13:10:14 -0700126 static const char kStringmapsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700127 static const char kStringsSig[];
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100128
Eric Shienbrood9a245532012-03-07 14:20:39 -0500129 void MethodReplyCallback(const DBus::Tag *tag, const Error &error);
130 void DeferReply(const DBus::Tag *tag);
131 void ReplyNow(const DBus::Tag *tag);
132 void ReplyNowWithError(const DBus::Tag *tag, const DBus::Error &error);
133
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700134 DISALLOW_COPY_AND_ASSIGN(DBusAdaptor);
Chris Masoned7732e42011-05-20 11:08:56 -0700135};
136
137} // namespace shill
138#endif // SHILL_DBUS_ADAPTOR_H_