// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef REMOTING_HOST_NATIVE_MESSAGING_NATIVE_MESSAGING_CHANNEL_H_ #define REMOTING_HOST_NATIVE_MESSAGING_NATIVE_MESSAGING_CHANNEL_H_ #include "base/callback.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/platform_file.h" #include "base/threading/non_thread_safe.h" #include "remoting/host/native_messaging/native_messaging_reader.h" #include "remoting/host/native_messaging/native_messaging_writer.h" namespace base { class DictionaryValue; class Value; } // namespace base namespace remoting { // Implements reading messages and sending responses across the native messaging // host pipe. class NativeMessagingChannel : public base::NonThreadSafe { public: // Used to send a message to the client app. typedef base::Callback<void(scoped_ptr<base::DictionaryValue> message)> SendMessageCallback; // Constructs an object taking the ownership of |input| and |output|. Closes // |input| and |output| to prevent the caller from using them. NativeMessagingChannel(base::PlatformFile input, base::PlatformFile output); ~NativeMessagingChannel(); // Starts reading and processing messages. void Start(const SendMessageCallback& received_message, const base::Closure& quit_closure); // Sends a message to the client app. void SendMessage(scoped_ptr<base::DictionaryValue> message); private: // Processes a message received from the client app. void ProcessMessage(scoped_ptr<base::Value> message); // Initiates shutdown and runs |quit_closure| if there are no pending requests // left. void Shutdown(); base::Closure quit_closure_; NativeMessagingReader native_messaging_reader_; scoped_ptr<NativeMessagingWriter> native_messaging_writer_; // The callback to invoke when a message is received. SendMessageCallback received_message_; base::WeakPtr<NativeMessagingChannel> weak_ptr_; base::WeakPtrFactory<NativeMessagingChannel> weak_factory_; DISALLOW_COPY_AND_ASSIGN(NativeMessagingChannel); }; } // namespace remoting #endif // REMOTING_HOST_NATIVE_MESSAGING_NATIVE_MESSAGING_CHANNEL_H_