blob: f97c017c380c687b9a03668f1c16667f1959c85b [file] [log] [blame]
// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <iostream>
#include <base/basictypes.h>
#include <base/string_util.h>
#include <chromeos/dbus/dbus.h>
#include <cros/marshal.glibmarshal.h>
#include <dbus/dbus-glib-lowlevel.h>
#include <glib.h>
#include "bindings_client.h"
// This is modified from image_burner_tester.cc.
namespace chromeos {
static const char* kTestSignalInterface =
"org.chromium.TestLibCrosServiceInterface";
static const char* kTestSignalNameNetworkProxyResolved =
"test_network_proxy_resolved";
class TestClient {
public:
TestClient(dbus::Proxy request_proxy, GMainLoop* loop)
: request_proxy_(request_proxy),
loop_(loop),
num_signals_(0) {
}
~TestClient() {
// Remove filter from connection.
DBusConnection* conn = ::dbus_g_connection_get_connection(
dbus::GetSystemBusConnection().g_connection());
::dbus_connection_remove_filter(conn, &TestClient::FilterMessage, this);
}
bool Initialize() {
// Add filter for signal(s).
const std::string filter = StringPrintf("type='signal', interface='%s'",
kTestSignalInterface);
DBusConnection* connection = ::dbus_g_connection_get_connection(
dbus::GetSystemBusConnection().g_connection());
if (!connection) {
std::cout << "Can't get system bus connection" << std::endl;
return false;
}
DBusError error;
::dbus_error_init(&error);
::dbus_bus_add_match(connection, filter.c_str(), &error);
if (::dbus_error_is_set(&error)) {
std::cout << "Failed to add match: " << error.name << ", message="
<< (error.message ? error.message : "unknown error")
<< std::endl;
return false;
}
if (!::dbus_connection_add_filter(connection, &TestClient::FilterMessage,
this, NULL)) {
std::cout << "Failed to add filter." << std::endl;
return false;
}
return true;
}
void ResolveNetworkProxy(const char* source_url) {
glib::ScopedError error;
std::cout << "ResolveNetworkProxy: start" << std::endl;
if (!::dbus_g_proxy_call(request_proxy_.gproxy(),
"ResolveNetworkProxy",
&Resetter(&error).lvalue(),
G_TYPE_STRING, source_url,
G_TYPE_STRING, kTestSignalInterface,
G_TYPE_STRING, kTestSignalNameNetworkProxyResolved,
G_TYPE_INVALID, G_TYPE_INVALID)) {
std::cout << "Resolving failed: " << error->message << std::endl;
} else {
++num_signals_;
std::cout << "Resolving started for " << source_url << "..." << std::endl;
}
std::cout << "ResolveNetworkProxy: end++++++++++++++++\n" << std::endl;
}
void ReceivedSignal() {
--num_signals_;
}
void RunLoopIfNecessary() {
if (num_signals_)
::g_main_loop_run(loop_);
}
void QuitLoopIfNecessary() {
if (!num_signals_)
::g_main_loop_quit(loop_);
}
private:
static DBusHandlerResult FilterMessage(DBusConnection* connection,
DBusMessage* message,
void* object) {
if (dbus_message_is_signal(message, kTestSignalInterface,
kTestSignalNameNetworkProxyResolved)) {
std::cout << "Filter: received signal "
<< kTestSignalNameNetworkProxyResolved << std::endl;
// Retreive arguments from message.
char* source_url = NULL;
char* proxy_list = NULL;
char* error = NULL;
DBusError arg_error;
::dbus_error_init(&arg_error);
if (!::dbus_message_get_args(message, &arg_error,
DBUS_TYPE_STRING, &source_url,
DBUS_TYPE_STRING, &proxy_list,
DBUS_TYPE_STRING, &error,
DBUS_TYPE_INVALID)) {
std::cout << "Error getting args" << std::endl;
} else {
std::cout << "[" << source_url << "] [" << proxy_list << "] [" << error
<< "]\n" << std::endl;
}
TestClient* self = static_cast<TestClient*>(object);
self->ReceivedSignal();
self->QuitLoopIfNecessary();
return DBUS_HANDLER_RESULT_HANDLED;
}
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
dbus::Proxy request_proxy_;
GMainLoop *loop_;
int num_signals_; // Number of signals to wait for.
};
} // namespace chromeos
int main(int argc, char* argv[]) {
::g_type_init();
GMainLoop* loop = ::g_main_loop_new(NULL, true);
chromeos::dbus::Proxy request_proxy(chromeos::dbus::GetSystemBusConnection(),
"org.chromium.LibCrosService",
"/org/chromium/LibCrosService",
"org.chromium.LibCrosServiceInterface");
if (!request_proxy) {
std::cout << "Can't create proxy for LibCrosService" << std::endl;
return -1;
}
chromeos::TestClient test(request_proxy, loop);
if (!test.Initialize())
return -1;
test.ResolveNetworkProxy("http://maps.google.com");
test.ResolveNetworkProxy("http://www.youtube.com");
test.ResolveNetworkProxy("http://127.0.0.1");
// Run glib loop if there're signal(s) to wait for.
test.RunLoopIfNecessary();
return 0;
}