/*
 * 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_IO_COMMON_H_
#define ANDROID_ASYNC_IO_COMMON_H_

/*
 * Contains declarations common for asynchronous socket I/O
 */

/* Enumerates asynchronous I/O states.
 * Values from this enum are passed to callbacks associated with an I/O,
 * indicating at what state the I/O is. */
typedef enum AsyncIOState {
    /* Asynchronous I/O has been queued.                (0) */
    ASIO_STATE_QUEUED,
    /* Asynchronous I/O has started. This state indicates that I/O has been
     * performed for the first time.                    (1) */
    ASIO_STATE_STARTED,
    /* Asynchronous I/O is continuing. This state indicates that I/O has been
     * invoked for the second (or more) time.           (2) */
    ASIO_STATE_CONTINUES,
    /* Asynchronous I/O is about to be retried.         (3) */
    ASIO_STATE_RETRYING,
    /* Asynchronous I/O has been successfuly completed. (4) */
    ASIO_STATE_SUCCEEDED,
    /* Asynchronous I/O has failed.                     (5) */
    ASIO_STATE_FAILED,
    /* Asynchronous I/O has timed out.                  (6) */
    ASIO_STATE_TIMED_OUT,
    /* Asynchronous I/O has been cancelled (due to disconnect, for
     * instance).                                       (7) */
    ASIO_STATE_CANCELLED,
} AsyncIOState;

/* Enumerates actions to perform with an I/O on state transition.
 * Values from this enum are returned from async I/O callbacks, indicating what
 * action should be performed with the I/O by I/O handler. */
typedef enum AsyncIOAction {
    /* I/O is done. Perform default action depending on I/O type. */
    ASIO_ACTION_DONE,
    /* Abort the I/O. */
    ASIO_ACTION_ABORT,
    /* Retry the I/O. */
    ASIO_ACTION_RETRY,
} AsyncIOAction;

#endif  /* ANDROID_ASYNC_IO_COMMON_H_ */
