/*
 * 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.
 */

#pragma once

#include "android/utils/compiler.h"

ANDROID_BEGIN_HEADER

/*
 * 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,
    /* Asynchronous I/O is finished and is about to be discarder. This state is
     * useful in case there is an association between an I/O and some client's
     * component, that holds a reference associated with this I/O. When callback
     * is invoked with this state, it means that it's safe to drop that extra
     * reference associated with the I/O                (8) */
    ASIO_STATE_FINISHED,
} 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;

ANDROID_END_HEADER
