|
From: Giusti, G. <gis...@in...> - 2010-08-17 16:19:17
|
Hi!
I am very new at dbus, so my doubts could be very basics... sorry for that.
I tried a couple of c++ examples using dbus-c++ bindings. I'm using dbus-c++-devel v0.5.0 package in a meego V1.0 release.
I coded a simple client-server from scratch in order to understand the functionality of DBus signals.
Here is my code:
Test.xml:
I have a method (Subscribe) and a signal (DataChanged)
<?xml version="1.0" ?>
<node name="/org/freedesktop/DBus/Test">
<interface name="org.freedesktop.DBus.Test">
<signal name="DataChanged">
<arg name="Data" type="s"/>
</signal>
<method name="Subscribe">
<arg type="s" name="DataName" direction="in"/>
</method>
</interface>
</node>
TestServer class:
class TestServer
: public org::freedesktop::DBus::Test_adaptor,
public DBus::ObjectAdaptor,
{
public:
TestServer(DBus::Connection &connection);
void Subscribe(const std::string& DataName);
};
And TestClient class:
class TestClient
: public DBus::ObjectProxy,
public org::freedesktop::DBus::Test_proxy
{
public:
TestClient(DBus::Connection& connection, const char * path, const char * name);
void DataChanged(const std::string& data);
};
TestServer implementation: Because I was trying to test signals, I emit the signal when the subscribe method is called. Also, I create another method, sendSignal to emit the signal and I attached it to SIGUSR1, this allows me to send the signal manually with the kill -10 <serverpid> command.
static const char *TEST_SERVER_NAME = "org.freedesktop.DBus.Test";
static const char *TEST_SERVER_PATH = "/org/freedesktop/DBus/Test";
TestServer::TestServer(DBus::Connection &connection)
: DBus::ObjectAdaptor(connection, TEST_SERVER_PATH)
{
}
TestServer * g_server;
DBus::BusDispatcher dispatcher;
void TestServer::Subscribe(const std::string& DataName)
{
std::cout<<DataName<<"has been subscribed"std::endl;
//Emiting the signal
g_server->DataChanged("subscription signal...");
}
void niam(int sig)
{
dispatcher.leave();
}
void sendSignal(int sig)
{
std::cout<<"Sending signal"<<std::endl;
g_server->DataChanged("something happens...");
}
int main()
{
signal(SIGTERM, niam);
signal(SIGINT, niam);
signal(SIGUSR1, sendSignal);
DBus::default_dispatcher = &dispatcher;
DBus::Connection conn = DBus::Connection::SessionBus();
conn.request_name(TEST_SERVER_NAME);
TestServer server(conn);
g_server = &server;
dispatcher.enter();
return 0;
}
Finally, this is the client code:
static const char *TEST_SERVER_NAME = "org.freedesktop.DBus.Test";
static const char *TEST_SERVER_PATH = "/org/freedesktop/DBus/Test";
TestClient::TestClient(DBus::Connection& connection, const char * path, const char * name):
DBus::ObjectProxy(connection,path,name)
{}
void TestClient::DataChanged(const std::string& data)
{
std::cout<<"Changed!"<<std::endl;
}
DBus::BusDispatcher dispatcher;
void niam(int sig)
{
dispatcher.leave();
}
int main()
{
signal(SIGTERM, niam);
signal(SIGINT, niam);
DBus::default_dispatcher = &dispatcher;
DBus::Connection conn = DBus::Connection::SessionBus();
//Why I need to match signals by hand???
conn.add_match("type='signal'");
TestClient client (conn, TEST_SERVER_PATH, TEST_SERVER_NAME);
client.Subscribe("Client0001");
dispatcher.enter();
return 0;
}
The thing is, if I didn't include the line conn.add_match("type='signal') the signal was not catched by the client (although it has been emited by the server). Im a bit confused because if you follow the Echo example in DBus sources, the add_match is never call, and it seems that the client part where the signal is catched is never executed. Is this because the binding is still incomplete? Calling the add_match("type='signal') is the right way if you want your client be notified of a server signal?
Thanks in advance!
Gisela
_______________________________________________
dbus mailing list
db...@li...
http://lists.freedesktop.org/mailman/listinfo/dbus
|
|
From: Andreas V. <li...@br...> - 2010-09-02 21:50:10
|
Am Tue, 17 Aug 2010 10:18:54 -0600 schrieb Giusti, Gisela:
Hello Gisela,
could you provide your example as C++ files with GNU Makefile? Then
I'll spend some more time in figuring it out...
regards
Andreas
> Hi!
> I am very new at dbus, so my doubts could be very basics... sorry for
> that. I tried a couple of c++ examples using dbus-c++ bindings. I'm
> using dbus-c++-devel v0.5.0 package in a meego V1.0 release. I coded
> a simple client-server from scratch in order to understand the
> functionality of DBus signals.
>
> Here is my code:
> Test.xml:
> I have a method (Subscribe) and a signal (DataChanged)
>
>
> <?xml version="1.0" ?>
> <node name="/org/freedesktop/DBus/Test">
> <interface name="org.freedesktop.DBus.Test">
> <signal name="DataChanged">
> <arg name="Data" type="s"/>
> </signal>
> <method name="Subscribe">
> <arg type="s" name="DataName" direction="in"/>
> </method>
> </interface>
> </node>
>
>
> TestServer class:
>
> class TestServer
> : public org::freedesktop::DBus::Test_adaptor,
> public DBus::ObjectAdaptor,
> {
> public:
> TestServer(DBus::Connection &connection);
> void Subscribe(const std::string& DataName);
>
> };
>
> And TestClient class:
>
> class TestClient
> : public DBus::ObjectProxy,
> public org::freedesktop::DBus::Test_proxy
> {
> public:
> TestClient(DBus::Connection& connection, const char * path,
> const char * name); void DataChanged(const std::string& data);
> };
>
>
> TestServer implementation: Because I was trying to test signals, I
> emit the signal when the subscribe method is called. Also, I create
> another method, sendSignal to emit the signal and I attached it to
> SIGUSR1, this allows me to send the signal manually with the kill -10
> <serverpid> command.
>
>
> static const char *TEST_SERVER_NAME = "org.freedesktop.DBus.Test";
> static const char *TEST_SERVER_PATH = "/org/freedesktop/DBus/Test";
>
>
> TestServer::TestServer(DBus::Connection &connection)
> : DBus::ObjectAdaptor(connection, TEST_SERVER_PATH)
> {
> }
>
> TestServer * g_server;
> DBus::BusDispatcher dispatcher;
>
> void TestServer::Subscribe(const std::string& DataName)
> {
> std::cout<<DataName<<"has been subscribed"std::endl;
> //Emiting the signal
> g_server->DataChanged("subscription signal...");
> }
>
>
> void niam(int sig)
> {
> dispatcher.leave();
> }
>
> void sendSignal(int sig)
> {
> std::cout<<"Sending signal"<<std::endl;
> g_server->DataChanged("something happens...");
> }
>
> int main()
> {
> signal(SIGTERM, niam);
> signal(SIGINT, niam);
> signal(SIGUSR1, sendSignal);
>
> DBus::default_dispatcher = &dispatcher;
>
>
> DBus::Connection conn = DBus::Connection::SessionBus();
> conn.request_name(TEST_SERVER_NAME);
>
> TestServer server(conn);
> g_server = &server;
>
> dispatcher.enter();
>
> return 0;
>
> }
>
> Finally, this is the client code:
>
> static const char *TEST_SERVER_NAME = "org.freedesktop.DBus.Test";
> static const char *TEST_SERVER_PATH = "/org/freedesktop/DBus/Test";
>
>
> TestClient::TestClient(DBus::Connection& connection, const char *
> path, const char * name): DBus::ObjectProxy(connection,path,name)
> {}
>
> void TestClient::DataChanged(const std::string& data)
> {
> std::cout<<"Changed!"<<std::endl;
>
> }
>
> DBus::BusDispatcher dispatcher;
>
> void niam(int sig)
> {
>
> dispatcher.leave();
> }
>
> int main()
> {
> signal(SIGTERM, niam);
> signal(SIGINT, niam);
>
>
> DBus::default_dispatcher = &dispatcher;
>
> DBus::Connection conn = DBus::Connection::SessionBus();
> //Why I need to match signals by hand???
> conn.add_match("type='signal'");
>
> TestClient client (conn, TEST_SERVER_PATH, TEST_SERVER_NAME);
> client.Subscribe("Client0001");
> dispatcher.enter();
>
>
> return 0;
> }
>
> The thing is, if I didn't include the line
> conn.add_match("type='signal') the signal was not catched by the
> client (although it has been emited by the server). Im a bit confused
> because if you follow the Echo example in DBus sources, the add_match
> is never call, and it seems that the client part where the signal is
> catched is never executed. Is this because the binding is still
> incomplete? Calling the add_match("type='signal') is the right way if
> you want your client be notified of a server signal?
>
> Thanks in advance!
>
> Gisela
>
> _______________________________________________
> dbus mailing list
> db...@li...
> http://lists.freedesktop.org/mailman/listinfo/dbus
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by
>
> Make an app they can't live without
> Enter the BlackBerry Developer Challenge
> http://p.sf.net/sfu/RIM-dev2dev
> _______________________________________________
> dbus-cplusplus-devel mailing list
> dbu...@li...
> https://lists.sourceforge.net/lists/listinfo/dbus-cplusplus-devel
>
|