blob: 998d0c8158ce42d7079b861c9f24f9b14fe4ffc2 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_ASYNC_SOCKET_CONNECTOR_H_
#define ANDROID_ASYNC_SOCKET_CONNECTOR_H_
/*
* Contains declaration of an API that allows asynchronous connection to a
* socket with retries.
*
* The typical usage of this API is as such:
*
* 1. The client creates an async connector instance by calling async_socket_connector_new
* routine, supplying there address of the socket to connect, and a callback
* to invoke on connection events.
* 2. The client then proceeds with calling async_socket_connector_connect that
* would initiate connection attempts.
*
* The main job on the client side falls on the client's callback routine that
* serves the connection events. Once connection has been initiated, the connector
* will invoke that callback to report current connection status.
*
* In general, there are three connection events passed to the callback:
* 1. Success.
* 2. Failure.
* 3. Retry.
*
* Typically, when client's callback is called for successful connection, the
* client will pull connected socket's FD from the connector, and then this FD
* will be used by the client for I/O on the connected socket. If socket's FD
* is pulled by the client, it must return ASC_CB_KEEP from the callback.
*
* When client's callback is invoked with an error (ASC_CONNECTION_FAILED event),
* the client has an opportunity to review the error (available in 'errno'), and
* either abort the connection by returning ASC_CB_ABORT, or schedule a retry
* by returning ASC_CB_RETRY from the callback. If client returns ASC_CB_ABORT
* from the callback, the connector will stop connection attempts, and will
* self-destruct. If ASC_CB_RETRY is returned from the callback, the connector
* will retry connection attempt after timeout that was set by the caller in the
* call to async_socket_connector_new routine.
*
* When client's callback is invoked with ASC_CONNECTION_RETRY, the client has an
* opportunity to cancel further connection attempts by returning ASC_CB_ABORT,
* or it can allow another connection attempt by returning ASC_CB_RETRY.
*
* The client has no control over the lifespan of initialized connector instance.
* It always self-destructs after client's cllback returns with a status other
* than ASC_CB_RETRY.
*/
/* Declares async socket connector descriptor. */
typedef struct AsyncSocketConnector AsyncSocketConnector;
/* Enumerates connection events.
* Values from this enum are passed to the callback that connector's client uses
* to monitor connection status / progress.
*/
typedef enum ASCEvent {
/* Connection with the socket has been successfuly established. */
ASC_CONNECTION_SUCCEEDED,
/* A failure has occured while establising connection, with errno containing
* the actual error. */
ASC_CONNECTION_FAILED,
/* Async socket connector is about to retry the connection. */
ASC_CONNECTION_RETRY,
} ASCEvent;
/* Enumerates return values from the callback to the connector's client.
*/
typedef enum ASCCbRes {
/* Keep established connection. */
ASC_CB_KEEP,
/* Abort connection attempts. */
ASC_CB_ABORT,
/* Retry connection attempt. */
ASC_CB_RETRY,
} ASCCbRes;
/* Enumerates values returned from the connector routine.
*/
typedef enum ASCConnectRes {
/* Connection has succeeded in the connector routine. */
ASC_CONNECT_SUCCEEDED,
/* Connection has failed in the connector routine. */
ASC_CONNECT_FAILED,
/* Connection is in progress, and will be completed asynchronously. */
ASC_CONNECT_IN_PROGRESS,
} ASCConnectRes;
/* Declares callback that connector's client uses to monitor connection
* status / progress.
* Param:
* opaque - An opaque pointer associated with the client.
* connector - Connector instance for thecallback.
* event - Event that has occured. If event is set to ASC_CONNECTION_FAILED,
* errno contains connection error.
* Return:
* One of ASCCbRes values.
*/
typedef ASCCbRes (*asc_event_cb)(void* opaque,
AsyncSocketConnector* connector,
ASCEvent event);
/* Creates and initializes AsyncSocketConnector instance.
* Param:
* address - Initialized socket address to connect to.
* retry_to - Retry timeout in milliseconds.
* cb, cb_opaque - Callback to invoke on connection events. This callback is
* required, and must not be NULL.
* Return:
* Initialized AsyncSocketConnector instance. Note that AsyncSocketConnector
* instance returned from this routine will be destroyed by the connector itself,
* when its work on connecting to the socket is completed. Typically, the
* connector wil destroy the descriptor after client's callback routine returns
* with the status other than ASC_CB_RETRY.
*/
extern AsyncSocketConnector* async_socket_connector_new(const SockAddress* address,
int retry_to,
asc_event_cb cb,
void* cb_opaque);
/* Initiates asynchronous connection.
* Param:
* connector - Initialized AsyncSocketConnector instance.
* Return:
* Status indicating state of the connection: completed, failed, or in progress.
* Note that the connector will always invoke a callback passed to the
* async_socket_connector_new routine prior to exiting from this routine with
* statuses other ASC_CONNECT_IN_PROGRESS.
*/
extern ASCConnectRes async_socket_connector_connect(AsyncSocketConnector* connector);
/* Pulls socket's file descriptor from the connector.
* This routine should be called from the connection callback on successful
* connection status. This will provide the connector's client with operational
* socket FD, and at the same time this will tell the connector not to close
* the FD when connector descriptor gets destroyed.
* Param:
* connector - Initialized AsyncSocketConnector instance.
* Return:
* File descriptor for the connected socket.
*/
extern int async_socket_connector_pull_fd(AsyncSocketConnector* connector);
#endif /* ANDROID_ASYNC_SOCKET_CONNECTOR_H_ */