Commit 81d4ea28 authored by adamk@chromium.org's avatar adamk@chromium.org

Fix initial offline state response handling

to read a Variant of uint32 instead of a uint32,
as specified by the Properties.Get interface.

R=satorux@chromium.org,willchan@chromium.org
BUG=104637

Review URL: http://codereview.chromium.org/8591021

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110569 0039d316-1c4b-4281-b951-d872f2087c98
parent f6d2a3ea
......@@ -88,16 +88,12 @@ class NetworkManagerApi {
private:
// Callbacks for D-Bus API.
void OnStateChanged(dbus::Message* message);
void OnResponse(dbus::Response* response) {
OnStateChanged(response);
void OnInitialResponse(dbus::Response* response) {
HandleResponse(response);
offline_state_initialized_.Signal();
}
void OnSignaled(dbus::Signal* signal) {
OnStateChanged(signal);
}
void OnSignaled(dbus::Signal* signal);
void OnConnected(const std::string&, const std::string&, bool success) {
if (!success) {
......@@ -106,6 +102,9 @@ class NetworkManagerApi {
}
}
// Helper for OnInitialResponse.
void HandleResponse(dbus::Response* response);
// Converts a NetworkManager state uint to a bool.
static bool StateIsOffline(uint32 state);
......@@ -147,7 +146,8 @@ void NetworkManagerApi::Init() {
builder.AppendString("State");
proxy->CallMethod(
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::Bind(&NetworkManagerApi::OnResponse, ptr_factory_.GetWeakPtr()));
base::Bind(&NetworkManagerApi::OnInitialResponse,
ptr_factory_.GetWeakPtr()));
// And sign up for notifications.
proxy->ConnectToSignal(
......@@ -162,17 +162,32 @@ void NetworkManagerApi::CleanUp() {
ptr_factory_.InvalidateWeakPtrs();
}
void NetworkManagerApi::OnStateChanged(dbus::Message* message) {
void NetworkManagerApi::HandleResponse(dbus::Response* response) {
DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId());
if (!message) {
if (!response) {
DLOG(WARNING) << "No response received for initial state request";
return;
}
dbus::MessageReader reader(message);
dbus::MessageReader reader(response);
uint32 state = 0;
if (!reader.HasMoreData() || !reader.PopUint32(&state)) {
if (!reader.PopVariantOfUint32(&state)) {
DLOG(WARNING) << "Unexpected response for NetworkManager State request: "
<< message->ToString();
<< response->ToString();
return;
}
{
base::AutoLock lock(is_offline_lock_);
is_offline_ = StateIsOffline(state);
}
}
void NetworkManagerApi::OnSignaled(dbus::Signal* signal) {
DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId());
dbus::MessageReader reader(signal);
uint32 state = 0;
if (!reader.PopUint32(&state)) {
DLOG(WARNING) << "Unexpected signal for NetworkManager StateChanged: "
<< signal->ToString();
return;
}
bool new_is_offline = StateIsOffline(state);
......@@ -183,8 +198,7 @@ void NetworkManagerApi::OnStateChanged(dbus::Message* message) {
else
return;
}
if (offline_state_initialized_.IsSignaled())
notification_callback_.Run();
notification_callback_.Run();
}
bool NetworkManagerApi::StateIsOffline(uint32 state) {
......
......@@ -80,7 +80,7 @@ class NetworkChangeNotifierLinuxTest : public testing::Test {
void SendResponse(uint32 state) {
scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
dbus::MessageWriter writer(response.get());
writer.AppendUint32(state);
writer.AppendVariantOfUint32(state);
RunOnNotifierThread(base::Bind(response_callback_, response.get()));
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment