Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / remoting / host / it2me / it2me_native_messaging_host.cc
index 11d447c..6fb65df 100644 (file)
@@ -42,7 +42,7 @@ const remoting::protocol::NameMapElement<It2MeHostState> kIt2MeHostStates[] = {
 
 It2MeNativeMessagingHost::It2MeNativeMessagingHost(
     scoped_refptr<AutoThreadTaskRunner> task_runner,
-    scoped_ptr<NativeMessagingChannel> channel,
+    scoped_ptr<extensions::NativeMessagingChannel> channel,
     scoped_ptr<It2MeHostFactory> factory)
     : channel_(channel.Pass()),
       factory_(factory.Pass()),
@@ -75,28 +75,30 @@ It2MeNativeMessagingHost::~It2MeNativeMessagingHost() {
   }
 }
 
-void It2MeNativeMessagingHost::Start(const base::Closure& quit_closure) const {
+void It2MeNativeMessagingHost::Start(const base::Closure& quit_closure) {
   DCHECK(task_runner()->BelongsToCurrentThread());
+  DCHECK(!quit_closure.is_null());
 
-  channel_->Start(
-      base::Bind(&It2MeNativeMessagingHost::ProcessMessage, weak_ptr_),
-      quit_closure);
+  quit_closure_ = quit_closure;
+
+  channel_->Start(this);
 }
 
-void It2MeNativeMessagingHost::ProcessMessage(
-    scoped_ptr<base::DictionaryValue> message) {
+void It2MeNativeMessagingHost::OnMessage(scoped_ptr<base::Value> message) {
   DCHECK(task_runner()->BelongsToCurrentThread());
 
+  scoped_ptr<base::DictionaryValue> message_dict(
+      static_cast<base::DictionaryValue*>(message.release()));
   scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue());
 
   // If the client supplies an ID, it will expect it in the response. This
   // might be a string or a number, so cope with both.
   const base::Value* id;
-  if (message->Get("id", &id))
+  if (message_dict->Get("id", &id))
     response->Set("id", id->DeepCopy());
 
   std::string type;
-  if (!message->GetString("type", &type)) {
+  if (!message_dict->GetString("type", &type)) {
     SendErrorAndExit(response.Pass(), "'type' not found in request.");
     return;
   }
@@ -104,16 +106,21 @@ void It2MeNativeMessagingHost::ProcessMessage(
   response->SetString("type", type + "Response");
 
   if (type == "hello") {
-    ProcessHello(*message, response.Pass());
+    ProcessHello(*message_dict, response.Pass());
   } else if (type == "connect") {
-    ProcessConnect(*message, response.Pass());
+    ProcessConnect(*message_dict, response.Pass());
   } else if (type == "disconnect") {
-    ProcessDisconnect(*message, response.Pass());
+    ProcessDisconnect(*message_dict, response.Pass());
   } else {
     SendErrorAndExit(response.Pass(), "Unsupported request type: " + type);
   }
 }
 
+void It2MeNativeMessagingHost::OnDisconnect() {
+  if (!quit_closure_.is_null())
+    base::ResetAndReturn(&quit_closure_).Run();
+}
+
 void It2MeNativeMessagingHost::ProcessHello(
     const base::DictionaryValue& message,
     scoped_ptr<base::DictionaryValue> response) const {
@@ -125,7 +132,7 @@ void It2MeNativeMessagingHost::ProcessHello(
   scoped_ptr<base::ListValue> supported_features_list(new base::ListValue());
   response->Set("supportedFeatures", supported_features_list.release());
 
-  channel_->SendMessage(response.Pass());
+  channel_->SendMessage(response.PassAs<base::Value>());
 }
 
 void It2MeNativeMessagingHost::ProcessConnect(
@@ -199,7 +206,7 @@ void It2MeNativeMessagingHost::ProcessConnect(
                                           directory_bot_jid_);
   it2me_host_->Connect();
 
-  channel_->SendMessage(response.Pass());
+  channel_->SendMessage(response.PassAs<base::Value>());
 }
 
 void It2MeNativeMessagingHost::ProcessDisconnect(
@@ -211,7 +218,7 @@ void It2MeNativeMessagingHost::ProcessDisconnect(
     it2me_host_->Disconnect();
     it2me_host_ = NULL;
   }
-  channel_->SendMessage(response.Pass());
+  channel_->SendMessage(response.PassAs<base::Value>());
 }
 
 void It2MeNativeMessagingHost::SendErrorAndExit(
@@ -223,10 +230,10 @@ void It2MeNativeMessagingHost::SendErrorAndExit(
 
   response->SetString("type", "error");
   response->SetString("description", description);
-  channel_->SendMessage(response.Pass());
+  channel_->SendMessage(response.PassAs<base::Value>());
 
   // Trigger a host shutdown by sending a NULL message.
-  channel_->SendMessage(scoped_ptr<base::DictionaryValue>());
+  channel_->SendMessage(scoped_ptr<base::Value>());
 }
 
 void It2MeNativeMessagingHost::OnStateChanged(It2MeHostState state) {
@@ -259,7 +266,7 @@ void It2MeNativeMessagingHost::OnStateChanged(It2MeHostState state) {
       ;
   }
 
-  channel_->SendMessage(message.Pass());
+  channel_->SendMessage(message.PassAs<base::Value>());
 }
 
 void It2MeNativeMessagingHost::OnNatPolicyChanged(bool nat_traversal_enabled) {
@@ -269,7 +276,7 @@ void It2MeNativeMessagingHost::OnNatPolicyChanged(bool nat_traversal_enabled) {
 
   message->SetString("type", "natPolicyChanged");
   message->SetBoolean("natTraversalEnabled", nat_traversal_enabled);
-  channel_->SendMessage(message.Pass());
+  channel_->SendMessage(message.PassAs<base::Value>());
 }
 
 // Stores the Access Code for the web-app to query.