blob: 109c0950fd1f2b7796b1ca27a81641cdeb46dda7 [file] [log] [blame]
Chris Masoned7732e42011-05-20 11:08:56 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// 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>
Chris Masoned7732e42011-05-20 11:08:56 -070013#include <dbus-c++/dbus.h>
14
Chris Masone889666b2011-07-03 12:58:50 -070015#include "shill/accessor_interface.h"
Darin Petkove5bc2cb2011-12-07 14:47:32 +010016#include "shill/adaptor_interfaces.h"
17#include "shill/error.h"
Chris Masone889666b2011-07-03 12:58:50 -070018
Chris Masoned7732e42011-05-20 11:08:56 -070019namespace shill {
20
21#define SHILL_INTERFACE "org.chromium.flimflam"
22#define SHILL_PATH "/org/chromium/flimflam"
23
mukesh agrawal7a4e4002011-09-06 11:26:05 -070024class KeyValueStore;
Chris Masoneb925cc82011-06-22 15:39:57 -070025class PropertyStore;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070026
Chris Masoned7732e42011-05-20 11:08:56 -070027// Superclass for all DBus-backed Adaptor objects
mukesh agrawalf1f490c2011-09-06 15:20:22 -070028class DBusAdaptor : public DBus::ObjectAdaptor,
29 public DBus::IntrospectableAdaptor {
Chris Masoned7732e42011-05-20 11:08:56 -070030 public:
Chris Masoneb925cc82011-06-22 15:39:57 -070031 DBusAdaptor(DBus::Connection* conn, const std::string &object_path);
Chris Masoned0ceb8c2011-06-02 10:05:39 -070032 virtual ~DBusAdaptor();
33
Chris Masoneb925cc82011-06-22 15:39:57 -070034 static bool DispatchOnType(PropertyStore *store,
35 const std::string &name,
36 const ::DBus::Variant &value,
Chris Masonea8a2c252011-06-27 22:16:30 -070037 ::DBus::Error *error);
mukesh agrawalde29fa82011-09-16 16:16:36 -070038 static bool GetProperties(const PropertyStore &store,
Chris Masonea8a2c252011-06-27 22:16:30 -070039 std::map<std::string, ::DBus::Variant> *out,
40 ::DBus::Error *error);
mukesh agrawal7a4e4002011-09-06 11:26:05 -070041 static void ArgsToKeyValueStore(
42 const std::map<std::string, ::DBus::Variant> &args,
43 KeyValueStore *out,
44 Error *error);
Chris Masoned0ceb8c2011-06-02 10:05:39 -070045
Chris Masone8fe2c7e2011-06-09 15:51:19 -070046 static ::DBus::Variant BoolToVariant(bool value);
Paul Stewartced6a0b2011-11-08 15:32:04 -080047 static ::DBus::Variant ByteArraysToVariant(const ByteArrays &value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070048 static ::DBus::Variant ByteToVariant(uint8 value);
49 static ::DBus::Variant Int16ToVariant(int16 value);
50 static ::DBus::Variant Int32ToVariant(int32 value);
Chris Masoneb925cc82011-06-22 15:39:57 -070051 static ::DBus::Variant PathToVariant(const ::DBus::Path &value);
mukesh agrawal32399322011-09-01 10:53:43 -070052 static ::DBus::Variant PathArrayToVariant(
53 const std::vector< ::DBus::Path> &value);
Chris Masoneb925cc82011-06-22 15:39:57 -070054 static ::DBus::Variant StringToVariant(const std::string &value);
Chris Masone889666b2011-07-03 12:58:50 -070055 static ::DBus::Variant StringmapToVariant(const Stringmap &value);
56 static ::DBus::Variant StringmapsToVariant(const Stringmaps &value);
57 static ::DBus::Variant StringsToVariant(const Strings &value);
58 static ::DBus::Variant StrIntPairToVariant(const StrIntPair &value);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070059 static ::DBus::Variant Uint16ToVariant(uint16 value);
60 static ::DBus::Variant Uint32ToVariant(uint32 value);
61
62 static bool IsBool(::DBus::Signature signature);
63 static bool IsByte(::DBus::Signature signature);
Paul Stewartced6a0b2011-11-08 15:32:04 -080064 static bool IsByteArrays(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070065 static bool IsInt16(::DBus::Signature signature);
66 static bool IsInt32(::DBus::Signature signature);
Chris Masone3bd3c8c2011-06-13 08:20:26 -070067 static bool IsPath(::DBus::Signature signature);
mukesh agrawal32399322011-09-01 10:53:43 -070068 static bool IsPathArray(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070069 static bool IsString(::DBus::Signature signature);
70 static bool IsStringmap(::DBus::Signature signature);
Chris Masone27c4aa52011-07-02 13:10:14 -070071 static bool IsStringmaps(::DBus::Signature signature);
Chris Masone8fe2c7e2011-06-09 15:51:19 -070072 static bool IsStrings(::DBus::Signature signature);
73 static bool IsUint16(::DBus::Signature signature);
74 static bool IsUint32(::DBus::Signature signature);
75
Darin Petkove5bc2cb2011-12-07 14:47:32 +010076 protected:
77 class Returner : public DBus::Tag,
78 public ReturnerInterface {
79 public:
80 // Creates a new returner instance associated with |adaptor|.
81 static Returner *Create(DBusAdaptor *adaptor);
82
83 // Used by the adaptor to initiate or delay the return, depending on the
84 // state of the returner. A call to this method should be the last statement
85 // in the adaptor method. If none of the interface Return* methods has been
86 // called yet, DelayOrReturn exits to the dbus-c++ message handler by
87 // throwing an exception. Otherwise, it initializes |error|, completes the
88 // RPC call right away and destroys |this|.
89 void DelayOrReturn(DBus::Error *error);
90
91 // Inherited from ReturnerInterface. These methods complete the RPC call
92 // right away and destroy the object if DelayOrReturn has been called
93 // already. Otherwise, they allow DelayOrReturn to complete the call.
94 virtual void Return();
95 virtual void ReturnError(const Error &error);
96
97 private:
98 // The returner transitions through the following states:
99 //
100 // Initialized -> [Delayed|Returned] -> Destroyed.
101 enum State {
102 kStateInitialized, // No *Return* methods called yet.
103 kStateDelayed, // DelayOrReturn called, Return* not.
104 kStateReturned, // Return* called, DelayOrReturn not.
105 kStateDestroyed // Return complete, returner destroyed.
106 };
107
108 explicit Returner(DBusAdaptor *adaptor);
109
110 // Destruction happens through the *Return* methods.
111 virtual ~Returner();
112
113 DBusAdaptor *adaptor_;
114 Error error_;
115 State state_;
116
117 DISALLOW_COPY_AND_ASSIGN(Returner);
118 };
119
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700120 private:
Paul Stewartced6a0b2011-11-08 15:32:04 -0800121 static const char kByteArraysSig[];
mukesh agrawal32399322011-09-01 10:53:43 -0700122 static const char kPathArraySig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700123 static const char kStringmapSig[];
Chris Masone27c4aa52011-07-02 13:10:14 -0700124 static const char kStringmapsSig[];
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700125 static const char kStringsSig[];
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100126
Chris Masone8fe2c7e2011-06-09 15:51:19 -0700127 DISALLOW_COPY_AND_ASSIGN(DBusAdaptor);
Chris Masoned7732e42011-05-20 11:08:56 -0700128};
129
130} // namespace shill
131#endif // SHILL_DBUS_ADAPTOR_H_