property.cpp

Go to the documentation of this file.
00001 /*
00002  *
00003  *  D-Bus++ - C++ bindings for D-Bus
00004  *
00005  *  Copyright (C) 2005-2007  Paolo Durante <shackan@gmail.com>
00006  *
00007  *
00008  *  This library is free software; you can redistribute it and/or
00009  *  modify it under the terms of the GNU Lesser General Public
00010  *  License as published by the Free Software Foundation; either
00011  *  version 2.1 of the License, or (at your option) any later version.
00012  *
00013  *  This library is distributed in the hope that it will be useful,
00014  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  *  Lesser General Public License for more details.
00017  *
00018  *  You should have received a copy of the GNU Lesser General Public
00019  *  License along with this library; if not, write to the Free Software
00020  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  *
00022  */
00023 
00024 #ifdef HAVE_CONFIG_H
00025 #include <config.h>
00026 #endif
00027 
00028 #include <dbus-c++/debug.h>
00029 #include <dbus-c++/property.h>
00030 
00031 #include <dbus-c++/introspection.h>
00032 
00033 using namespace DBus;
00034 
00035 static const char *properties_name = "org.freedesktop.DBus.Properties";
00036 
00037 PropertiesAdaptor::PropertiesAdaptor()
00038   : InterfaceAdaptor(properties_name)
00039 {
00040   register_method(PropertiesAdaptor, Get, Get);
00041   register_method(PropertiesAdaptor, Set, Set);
00042 }
00043 
00044 Message PropertiesAdaptor::Get(const CallMessage &call)
00045 {
00046   MessageIter ri = call.reader();
00047 
00048   std::string iface_name;
00049   std::string property_name;
00050 
00051   ri >> iface_name >> property_name;
00052 
00053   debug_log("requesting property %s on interface %s", property_name.c_str(), iface_name.c_str());
00054 
00055   InterfaceAdaptor *interface = (InterfaceAdaptor *) find_interface(iface_name);
00056 
00057   if (!interface)
00058     throw ErrorFailed("requested interface not found");
00059 
00060   Variant *value = interface->get_property(property_name);
00061 
00062   if (!value)
00063     throw ErrorFailed("requested property not found");
00064 
00065   on_get_property(*interface, property_name, *value);
00066 
00067   ReturnMessage reply(call);
00068 
00069   MessageIter wi = reply.writer();
00070 
00071   wi << *value;
00072   return reply;
00073 }
00074 
00075 Message PropertiesAdaptor::Set(const CallMessage &call)
00076 {
00077   MessageIter ri = call.reader();
00078 
00079   std::string iface_name;
00080   std::string property_name;
00081   Variant value;
00082 
00083   ri >> iface_name >> property_name >> value;
00084 
00085   InterfaceAdaptor *interface = (InterfaceAdaptor *) find_interface(iface_name);
00086 
00087   if (!interface)
00088     throw ErrorFailed("requested interface not found");
00089 
00090   on_set_property(*interface, property_name, value);
00091 
00092   interface->set_property(property_name, value);
00093 
00094   ReturnMessage reply(call);
00095 
00096   return reply;
00097 }
00098 
00099 IntrospectedInterface *PropertiesAdaptor::introspect() const
00100 {
00101   static IntrospectedArgument Get_args[] =
00102   {
00103     { "interface_name", "s", true },
00104     { "property_name", "s", true },
00105     { "value", "v", false },
00106     { 0, 0, 0 }
00107   };
00108   static IntrospectedArgument Set_args[] =
00109   {
00110     { "interface_name", "s", true },
00111     { "property_name", "s", true },
00112     { "value", "v", true },
00113     { 0, 0, 0 }
00114   };
00115   static IntrospectedMethod Properties_methods[] =
00116   {
00117     { "Get", Get_args },
00118     { "Set", Set_args },
00119     { 0, 0 }
00120   };
00121   static IntrospectedMethod Properties_signals[] =
00122   {
00123     { 0, 0 }
00124   };
00125   static IntrospectedProperty Properties_properties[] =
00126   {
00127     { 0, 0, 0, 0 }
00128   };
00129   static IntrospectedInterface Properties_interface =
00130   {
00131     properties_name,
00132     Properties_methods,
00133     Properties_signals,
00134     Properties_properties
00135   };
00136   return &Properties_interface;
00137 }
00138 
00139 PropertiesProxy::PropertiesProxy()
00140   : InterfaceProxy(properties_name)
00141 {
00142 }
00143 
00144 Variant PropertiesProxy::Get(const std::string &iface, const std::string &property)
00145 {
00146 //todo
00147   Variant v;
00148   return v;
00149 }
00150 
00151 void PropertiesProxy::Set(const std::string &iface, const std::string &property, const Variant &value)
00152 {
00153 //todo
00154 }
00155