Home | History | Annotate | Download | only in android
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_ASYNC_SOCKET_H_
     18 #define ANDROID_ASYNC_SOCKET_H_
     19 
     20 #include "qemu-common.h"
     21 #include "android/async-io-common.h"
     22 #include "android/async-utils.h"
     23 
     24 /*
     25  * Contains declaration of an API that encapsulates communication via an
     26  * asynchronous socket.
     27  *
     28  * This is pretty basic API that allows asynchronous connection to a socket,
     29  * and asynchronous read from / write to the connected socket.
     30  *
     31  * Since all the operations (including connection) are asynchronous, all the
     32  * operation results are reported back to the client of this API via set of
     33  * callbacks that client supplied to this API.
     34  *
     35  * Since it's hard to control lifespan of an object in asynchronous environment,
     36  * we make AsyncSocketConnector a referenced object, that will self-destruct when
     37  * its reference count drops to zero, indicating that the last client has
     38  * abandoned that object.
     39  */
     40 
     41 /* Declares asynchronous socket descriptor. */
     42 typedef struct AsyncSocket AsyncSocket;
     43 
     44 /* Asynchronous socket I/O (reader, or writer) descriptor. */
     45 typedef struct AsyncSocketIO AsyncSocketIO;
     46 
     47 /* Defines client's callback set to monitor socket connection.
     48  * Param:
     49  *  client_opaque - An opaque pointer associated with the client.
     50  *  as - Initialized AsyncSocket instance.
     51  *  status - Socket connection status.
     52  * Return:
     53  *  One of the AsyncIOAction values.
     54  */
     55 typedef AsyncIOAction (*on_as_connection_cb)(void* client_opaque,
     56                                              AsyncSocket* as,
     57                                              AsyncIOState status);
     58 
     59 /* Defines client's callback set to monitor I/O progress.
     60  * Param:
     61  *  io_opaque - An opaque pointer associated with the I/O.
     62  *  asio - Async I/O in progress.
     63  *  status - Status of the I/O.
     64  * Return:
     65  *  One of the AsyncIOAction values.
     66  */
     67 typedef AsyncIOAction (*on_as_io_cb)(void* io_opaque,
     68                                      AsyncSocketIO* asio,
     69                                      AsyncIOState status);
     70 
     71 /********************************************************************************
     72  *                          AsyncSocketIO API
     73  *******************************************************************************/
     74 
     75 /* References AsyncSocketIO object.
     76  * Param:
     77  *  asio - Initialized AsyncSocketIO instance.
     78  * Return:
     79  *  Number of outstanding references to the object.
     80  */
     81 extern int async_socket_io_reference(AsyncSocketIO* asio);
     82 
     83 /* Releases AsyncSocketIO object.
     84  * Note that upon exit from this routine the object might be destroyed, even if
     85  * the routine returns value other than zero.
     86  * Param:
     87  *  asio - Initialized AsyncSocketIO instance.
     88  * Return:
     89  *  Number of outstanding references to the object.
     90  */
     91 extern int async_socket_io_release(AsyncSocketIO* asio);
     92 
     93 /* Gets AsyncSocket instance for an I/O. Note that this routine will reference
     94  * AsyncSocket instance before returning it to the caller. */
     95 extern AsyncSocket* async_socket_io_get_socket(const AsyncSocketIO* asio);
     96 
     97 /* Cancels time out set for an I/O */
     98 extern void async_socket_io_cancel_time_out(AsyncSocketIO* asio);
     99 
    100 /* Gets an opaque pointer associated with an I/O */
    101 extern void* async_socket_io_get_io_opaque(const AsyncSocketIO* asio);
    102 
    103 /* Gets an opaque pointer associated with the client that has requested I/O */
    104 extern void* async_socket_io_get_client_opaque(const AsyncSocketIO* asio);
    105 
    106 /* Gets I/O buffer information.
    107  * Param:
    108  *  asio - I/O descriptor.
    109  *  transferred - Optional pointer to receive number of bytes transferred with
    110  *      this I/O. Can be NULL.
    111  *  to_transfer - Optional pointer to receive number of bytes requested to
    112  *      transfer with this I/O. Can be NULL.
    113  * Return:
    114  *  I/O buffer.
    115  */
    116 extern void* async_socket_io_get_buffer_info(const AsyncSocketIO* asio,
    117                                              uint32_t* transferred,
    118                                              uint32_t* to_transfer);
    119 
    120 /* Gets I/O buffer. */
    121 extern void* async_socket_io_get_buffer(const AsyncSocketIO* asio);
    122 
    123 /* Gets number of bytes transferred with this I/O. */
    124 extern uint32_t async_socket_io_get_transferred(const AsyncSocketIO* asio);
    125 
    126 /* Gets number of bytes requested to transfer with this I/O. */
    127 extern uint32_t async_socket_io_get_to_transfer(const AsyncSocketIO* asio);
    128 
    129 /* Gets I/O type: read (returns 1), or write (returns 0). */
    130 extern int async_socket_io_is_read(const AsyncSocketIO* asio);
    131 
    132 /********************************************************************************
    133  *                            AsyncSocket API
    134  *******************************************************************************/
    135 
    136 /* Creates an asynchronous socket descriptor.
    137  * Param:
    138  *  port - TCP port to connect the socket to.
    139  *  reconnect_to - Timeout before trying to reconnect after disconnection.
    140  *  connect_cb - Client callback to monitor connection state (must not be NULL).
    141  *  client_opaque - An opaque pointer to associate with the socket client.
    142  *  looper - An optional (can be NULL) I/O looper to use for socket I/O. If
    143  *      this parameter is NULL, the socket will create its own looper.
    144  * Return:
    145  *  Initialized AsyncSocket instance on success, or NULL on failure.
    146  */
    147 extern AsyncSocket* async_socket_new(int port,
    148                                      int reconnect_to,
    149                                      on_as_connection_cb connect_cb,
    150                                      void* client_opaque,
    151                                      Looper* looper);
    152 
    153 /* References AsyncSocket object.
    154  * Param:
    155  *  as - Initialized AsyncSocket instance.
    156  * Return:
    157  *  Number of outstanding references to the object.
    158  */
    159 extern int async_socket_reference(AsyncSocket* as);
    160 
    161 /* Releases AsyncSocket object.
    162  * Note that upon exit from this routine the object might be destroyed, even if
    163  * the routine returns value other than zero.
    164  * Param:
    165  *  as - Initialized AsyncSocket instance.
    166  * Return:
    167  *  Number of outstanding references to the object.
    168  */
    169 extern int async_socket_release(AsyncSocket* as);
    170 
    171 /* Asynchronously connects to an asynchronous socket.
    172  * Note that connection result will be reported via callback passed to the
    173  * async_socket_new routine.
    174  * Param:
    175  *  as - Initialized AsyncSocket instance.
    176  *  retry_to - Number of milliseconds to wait before retrying a failed
    177  *      connection attempt.
    178  */
    179 extern void async_socket_connect(AsyncSocket* as, int retry_to);
    180 
    181 /* Disconnects from an asynchronous socket.
    182  * NOTE: AsyncSocket instance referenced in this call will be destroyed in this
    183  *  routine.
    184  * Param:
    185  *  as - Initialized and connected AsyncSocket instance.
    186  */
    187 extern void async_socket_disconnect(AsyncSocket* as);
    188 
    189 /* Asynchronously reconnects to an asynchronous socket.
    190  * Note that connection result will be reported via callback passed to the
    191  * async_socket_new routine.
    192  * Param:
    193  *  as - Initialized AsyncSocket instance.
    194  *  retry_to - Number of milliseconds to wait before trying to reconnect.
    195  */
    196 extern void async_socket_reconnect(AsyncSocket* as, int retry_to);
    197 
    198 /* Asynchronously reads data from an asynchronous socket with a deadline.
    199  * Param:
    200  *  as - Initialized and connected AsyncSocket instance.
    201  *  buffer, len - Buffer where to read data.
    202  *  reader_cb - Callback to monitor I/O progress (must not be NULL).
    203  *  reader_opaque - An opaque pointer associated with the reader.
    204  *  deadline - Deadline to complete the read.
    205  */
    206 extern void async_socket_read_abs(AsyncSocket* as,
    207                                   void* buffer, uint32_t len,
    208                                   on_as_io_cb reader_cb,
    209                                   void* reader_opaque,
    210                                   Duration deadline);
    211 
    212 /* Asynchronously reads data from an asynchronous socket with a relative timeout.
    213  * Param:
    214  *  as - Initialized and connected AsyncSocket instance.
    215  *  buffer, len - Buffer where to read data.
    216  *  reader_cb - Callback to monitor I/O progress (must not be NULL).
    217  *  reader_opaque - An opaque pointer associated with the reader.
    218  *  to - Milliseconds to complete the read. to < 0 indicates "no timeout"
    219  */
    220 extern void async_socket_read_rel(AsyncSocket* as,
    221                                   void* buffer, uint32_t len,
    222                                   on_as_io_cb reader_cb,
    223                                   void* reader_opaque,
    224                                   int to);
    225 
    226 /* Asynchronously writes data to an asynchronous socket with a deadline.
    227  * Param:
    228  *  as - Initialized and connected AsyncSocket instance.
    229  *  buffer, len - Buffer with writing data.
    230  *  writer_cb - Callback to monitor I/O progress (must not be NULL).
    231  *  writer_opaque - An opaque pointer associated with the writer.
    232  *  deadline - Deadline to complete the write.
    233  */
    234 extern void async_socket_write_abs(AsyncSocket* as,
    235                                    const void* buffer, uint32_t len,
    236                                    on_as_io_cb writer_cb,
    237                                    void* writer_opaque,
    238                                    Duration deadline);
    239 
    240 /* Asynchronously writes data to an asynchronous socket with a relative timeout.
    241  * Param:
    242  *  as - Initialized and connected AsyncSocket instance.
    243  *  buffer, len - Buffer with writing data.
    244  *  writer_cb - Callback to monitor I/O progress (must not be NULL)
    245  *  writer_opaque - An opaque pointer associated with the writer.
    246  *  to - Milliseconds to complete the write. to < 0 indicates "no timeout"
    247  */
    248 extern void async_socket_write_rel(AsyncSocket* as,
    249                                    const void* buffer, uint32_t len,
    250                                    on_as_io_cb writer_cb,
    251                                    void* writer_opaque,
    252                                    int to);
    253 
    254 /* Get a deadline for the given time interval relative to "now".
    255  * Param:
    256  *  as - Initialized AsyncSocket instance.
    257  *  rel - Time interval. If < 0 an infinite duration will be returned.
    258  * Return:
    259  *  A deadline for the given time interval relative to "now".
    260  */
    261 extern Duration async_socket_deadline(AsyncSocket* as, int rel);
    262 
    263 /* Gets an opaque pointer associated with the socket's client */
    264 extern void* async_socket_get_client_opaque(const AsyncSocket* as);
    265 
    266 /* Gets TCP port for the socket. */
    267 extern int async_socket_get_port(const AsyncSocket* as);
    268 
    269 /* Checks if socket is connected.
    270  * Return:
    271  *  Boolean: 1 - socket is connected, 0 - socket is not connected.
    272  */
    273 extern int async_socket_is_connected(const AsyncSocket* as);
    274 
    275 #endif  /* ANDROID_ASYNC_SOCKET_H_ */
    276