| // Copyright (c) 2011 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. |
| |
| #ifndef SHILL_ASYNC_CONNECTION_ |
| #define SHILL_ASYNC_CONNECTION_ |
| |
| #include <string> |
| |
| #include <base/callback.h> |
| #include <base/memory/scoped_ptr.h> |
| |
| #include "shill/refptr_types.h" |
| |
| namespace shill { |
| |
| class EventDispatcher; |
| class IOHandler; |
| class IPAddress; |
| class Sockets; |
| |
| // The AsyncConnection class implements an asynchronous |
| // outgoing TCP connection. When passed an IPAddress and |
| // port, and it will notify the caller when the connection |
| // is made. It can also be passed an interface name to |
| // bind the local side of the connection. |
| class AsyncConnection { |
| public: |
| // If non-empty |interface_name| specifies an local interface from which |
| // to originate the connection. |
| AsyncConnection(const std::string &interface_name, |
| EventDispatcher *dispatcher, |
| Sockets *sockets, |
| const base::Callback<void(bool, int)> &callback); |
| virtual ~AsyncConnection(); |
| |
| // Open a connection given an IP address and port (in host order). |
| // When the connection completes, |callback| will be called with the |
| // a boolean (indicating success if true) and an fd of the opened socket |
| // (in the success case). If successful, ownership of this open fd is |
| // passed to the caller on execution of the callback. |
| // |
| // This function (Start) returns true if the connection is in progress, |
| // or if the connection has immediately succeeded (the callback will be |
| // called in this case). On success the callback may be called before |
| // Start() returns to its caller. On failure to start the connection, |
| // this function returns false, but does not execute the callback. |
| // |
| // Calling Start() on an AsyncConnection that is already Start()ed is |
| // an error. |
| virtual bool Start(const IPAddress &address, int port); |
| |
| // Stop the open connection, closing any fds that are still owned. |
| // Calling Stop() on an unstarted or Stop()ped AsyncConnection is |
| // a no-op. |
| virtual void Stop(); |
| |
| std::string error() const { return error_; } |
| |
| private: |
| friend class AsyncConnectionTest; |
| |
| void OnConnectCompletion(int fd); |
| |
| std::string interface_name_; |
| EventDispatcher *dispatcher_; |
| Sockets *sockets_; |
| base::Callback<void(bool, int)> callback_; |
| std::string error_; |
| int fd_; |
| base::Callback<void(int)> connect_completion_callback_; |
| scoped_ptr<IOHandler> connect_completion_handler_; |
| |
| DISALLOW_COPY_AND_ASSIGN(AsyncConnection); |
| }; |
| |
| } // namespace shill |
| |
| #endif // SHILL_ASYNC_CONNECTION_ |