#ifdef HAVE_CONFIG_H #include #endif // STD #include // local #include "TestApp.h" #include "TestAppIntro.h" using namespace std; DBus::BusDispatcher dispatcher; TestAppIntro *g_testComIntro; DBus::Pipe *mTestToDBusPipe; bool testResult = false; std::list testList; pthread_mutex_t clientMutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t clientCondition = PTHREAD_COND_INITIALIZER; TestApp::TestApp() { testList.push_back("test1"); testList.push_back("testByte"); cout << "initialize DBus..." << endl; initDBus(); } void TestApp::initDBus() { DBus::_init_threading(); DBus::default_dispatcher = &dispatcher; new DBus::DefaultTimeout(100, false, &dispatcher); DBus::Connection conn = DBus::Connection::SessionBus(); TestAppIntro testComIntro(conn, clientCondition, testResult); g_testComIntro = &testComIntro; cout << "Start server..." << endl; TestAppIntroProvider testComProviderIntro(conn, &testComIntro); conn.request_name("DBusCpp.Test.Com.Intro"); mTestToDBusPipe = dispatcher.add_pipe(TestApp::testHandler, NULL); cout << "Start client thread..." << endl; pthread_create(&testThread, NULL, TestApp::testThreadRunner, &conn); dispatcher.enter(); pthread_join(testThread, NULL); cout << "Testresult = " << string(testResult ? "OK" : "NOK") << endl; } void *TestApp::testThreadRunner(void *arg) { for (std::list ::const_iterator tl_it = testList.begin(); tl_it != testList.end(); ++tl_it) { const string &testString = *tl_it; cout << "write to pipe" << endl; mTestToDBusPipe->write(testString.c_str(), testString.length() + 1); struct timespec abstime; clock_gettime(CLOCK_REALTIME, &abstime); abstime.tv_sec += 1; pthread_mutex_lock(&clientMutex); if (pthread_cond_timedwait(&clientCondition, &clientMutex, &abstime) == ETIMEDOUT) { cout << "client timeout!" << endl; testResult = false; } pthread_mutex_unlock(&clientMutex); } cout << "leave!" << endl; dispatcher.leave(); return NULL; } void TestApp::testHandler(const void *data, void *buffer, unsigned int nbyte) { char *str = (char *) buffer; cout << "buffer1: " << str << ", size: " << nbyte << endl; cout << "run it!" << endl; if (string(str) == "test1") { g_testComIntro->test1(); } else if (string(str) == "testByte") { g_testComIntro->testByte(4); } }