/**
* Copyright (c) 2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*     * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above
*       copyright notice, this list of conditions and the following
*       disclaimer in the documentation and/or other materials provided
*       with the distribution.
*     * Neither the name of The Linux Foundation nor the names of its
*       contributors may be used to endorse or promote products derived
*       from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
This file provide text strings for OI_STATUS values.
*/

#define __OI_MODULE__ OI_MODULE_SUPPORT

#include "oi_debug.h"
#include "oi_status.h"
#include "oi_statustext.h"


/*
 * define a macro to help us turn OI_STATUS values into text
 */

#define    OI_CASE(a) case a: return(#a) ;

/*
 * Compose a string for status
 */

static OI_CHAR fmtBuf[22];  /* must be big enough for 10 digits + text */
static OI_CHAR* OI_StatusNum(OI_STATUS value)
{
    static const OI_CHAR dig[] = "0123456789";
    OI_CHAR* c = fmtBuf + OI_ARRAYSIZE(fmtBuf);
    OI_UINT32 uval = (OI_UINT32) value;

    if (value == OI_OK) {
        return "OI_OK";
    } else if (value == OI_STATUS_NONE) {
        return "OI_STATUS_NONE";
    }

    *(--c) = 0;
    while (uval != 0) {
        OI_UINT v = uval / 10;
        OI_UINT r = uval%10;
        *(--c) = dig[r];
        uval = v;
    }
    /* Prefix " STATUS " */
    *(--c) = ' ';
    *(--c) = 'S';
    *(--c) = 'U';
    *(--c) = 'T';
    *(--c) = 'A';
    *(--c) = 'T';
    *(--c) = 'S';
    *(--c) = ' ';
    if (value <= OI_MAX_BM3_STATUS_VAL) {
        /* Prefix "BM3" */
        *(--c) = '3';
        *(--c) = 'M';
        *(--c) = 'B';
    } else if (value >= OI_STATUS_RESERVED_FOR_APPS) {
            /* Prefix "APP" */
            *(--c) = 'P';
            *(--c) = 'P';
            *(--c) = 'A';
    } else {
        /* Prefix nothing.  We could test for each of the internal product
            status codes (soundabout, etc), but want to avoid code bloat */
    }
    return c;
}

/*
 * text strings only provided for debug build
 */

#if !(defined(OI_DEBUG) || defined(OI_ENABLE_SLOG_ERROR) || defined(OI_ENABLE_SLOG_WARNING))

OI_CHAR* OI_StatusText(OI_STATUS value)
{
    return OI_StatusNum(value);
}

#else

static OI_CHAR* OI_BM3StatusText(OI_STATUS value)
{
    switch (value) {

        OI_CASE(OI_OK);

        OI_CASE(OI_STATUS_INVALID_PARAMETERS);
        OI_CASE(OI_STATUS_NOT_IMPLEMENTED);
        OI_CASE(OI_STATUS_NOT_INITIALIZED);
        OI_CASE(OI_STATUS_NO_RESOURCES);
        OI_CASE(OI_STATUS_INTERNAL_ERROR);
        OI_CASE(OI_STATUS_OUT_OF_MEMORY);
        OI_CASE(OI_ILLEGAL_REENTRANT_CALL);
        OI_CASE(OI_STATUS_INITIALIZATION_FAILED);
        OI_CASE(OI_STATUS_INITIALIZATION_PENDING);
        OI_CASE(OI_STATUS_NO_SCO_SUPPORT);
        OI_CASE(OI_STATUS_OUT_OF_STATIC_MEMORY);
        OI_CASE(OI_TIMEOUT);
        OI_CASE(OI_OS_ERROR);
        OI_CASE(OI_FAIL);
        OI_CASE(OI_STRING_FORMAT_ERROR);
        OI_CASE(OI_STATUS_PENDING);
        OI_CASE(OI_STATUS_INVALID_COMMAND);
        OI_CASE(OI_BUSY_FAIL);
        OI_CASE(OI_STATUS_ALREADY_REGISTERED);
        OI_CASE(OI_STATUS_NOT_FOUND);
        OI_CASE(OI_STATUS_NOT_REGISTERED);
        OI_CASE(OI_STATUS_NOT_CONNECTED);
        OI_CASE(OI_CALLBACK_FUNCTION_REQUIRED);
        OI_CASE(OI_STATUS_MBUF_OVERFLOW);
        OI_CASE(OI_STATUS_MBUF_UNDERFLOW);
        OI_CASE(OI_STATUS_CONNECTION_EXISTS);
        OI_CASE(OI_STATUS_NOT_CONFIGURED);
        OI_CASE(OI_LOWER_STACK_ERROR);
        OI_CASE(OI_STATUS_RESET_IN_PROGRESS);
        OI_CASE(OI_STATUS_ACCESS_DENIED);
        OI_CASE(OI_STATUS_DATA_ERROR);
        OI_CASE(OI_STATUS_INVALID_ROLE);
        OI_CASE(OI_STATUS_ALREADY_CONNECTED);
        OI_CASE(OI_STATUS_PARSE_ERROR);
        OI_CASE(OI_STATUS_END_OF_FILE);
        OI_CASE(OI_STATUS_READ_ERROR);
        OI_CASE(OI_STATUS_WRITE_ERROR);
        OI_CASE(OI_STATUS_NEGOTIATION_FAILURE);
        OI_CASE(OI_STATUS_READ_IN_PROGRESS);
        OI_CASE(OI_STATUS_ALREADY_INITIALIZED);
        OI_CASE(OI_STATUS_STILL_CONNECTED);
        OI_CASE(OI_STATUS_MTU_EXCEEDED);
        OI_CASE(OI_STATUS_LINK_TERMINATED);
        OI_CASE(OI_STATUS_PIN_CODE_TOO_LONG);
        OI_CASE(OI_STATUS_STILL_REGISTERED);
        OI_CASE(OI_STATUS_SPEC_VIOLATION);

        OI_CASE(OI_STATUS_PSM_ALREADY_REGISTERED);
        OI_CASE(OI_STATUS_INVALID_CID);
        OI_CASE(OI_STATUS_CID_NOT_FOUND);
        OI_CASE(OI_STATUS_CHANNEL_NOT_FOUND);
        OI_CASE(OI_STATUS_PSM_NOT_FOUND);
        OI_CASE(OI_STATUS_INVALID_STATE);
        OI_CASE(OI_STATUS_WRITE_IN_PROGRESS);
        OI_CASE(OI_STATUS_INVALID_PACKET);
        OI_CASE(OI_STATUS_SEND_COMPLETE);
        OI_CASE(OI_STATUS_INVALID_HANDLE);
        OI_CASE(OI_STATUS_GROUP_FULL);
        OI_CASE(OI_STATUS_DEVICE_ALREADY_IN_GROUP);
        OI_CASE(OI_STATUS_DUPLICATE_GROUP);
        OI_CASE(OI_STATUS_EMPTY_GROUP);
        OI_CASE(OI_STATUS_PACKET_NOT_FOUND);
        OI_CASE(OI_STATUS_BUFFER_TOO_SMALL);
        OI_CASE(OI_STATUS_IDENTIFIER_NOT_FOUND);

        OI_CASE(OI_L2CAP_DISCONNECT_LOWER_LAYER);
        OI_CASE(OI_L2CAP_DISCONNECT_REMOTE_REQUEST);
        OI_CASE(OI_L2CAP_GROUP_ADD_CONNECT_FAIL);
        OI_CASE(OI_L2CAP_GROUP_REMOVE_FAILURE);
        OI_CASE(OI_L2CAP_DATA_WRITE_ERROR_LINK_TERM);
        OI_CASE(OI_L2CAP_DISCONNECT_LOCAL_REQUEST);
        /* Timeouts */
        OI_CASE(OI_L2CAP_CONNECT_TIMEOUT);
        OI_CASE(OI_L2CAP_DISCONNECT_TIMEOUT);
        OI_CASE(OI_L2CAP_PING_TIMEOUT);
        OI_CASE(OI_L2CAP_GET_INFO_TIMEOUT);
        OI_CASE(OI_L2CAP_INVALID_ADDRESS);
        OI_CASE(OI_L2CAP_CMD_REJECT_RCVD);
        /* Spec Connect errors */
        OI_CASE(OI_L2CAP_CONNECT_BASE);
        OI_CASE(OI_L2CAP_CONNECT_PENDING);
        OI_CASE(OI_L2CAP_CONNECT_REFUSED_INVALID_PSM);
        OI_CASE(OI_L2CAP_CONNECT_REFUSED_SECURITY);
        OI_CASE(OI_L2CAP_CONNECT_REFUSED_NO_RESOURCES);
        /* Spec Config errors */
        OI_CASE(OI_L2CAP_CONFIG_BASE);
        OI_CASE(OI_L2CAP_CONFIG_FAIL_UNKNOWN_OPTIONS);
        /* Spec GetInfo errors */
        OI_CASE(OI_L2CAP_GET_INFO_BASE);
        OI_CASE(OI_L2CAP_GET_INFO_NOT_SUPPORTED);
        OI_CASE(OI_L2CAP_MTU_EXCEEDED);
        OI_CASE(OI_L2CAP_INVALID_PSM);
        OI_CASE(OI_L2CAP_INVALID_MTU);
        OI_CASE(OI_L2CAP_INVALID_FLUSHTO);

        /* HCI internal errors and warnings */
        OI_CASE(OI_HCI_NO_SUCH_CONNECTION);
        OI_CASE(OI_HCI_CB_LIST_FULL);
        OI_CASE(OI_HCI_EVENT_UNDERRUN);
        OI_CASE(OI_HCI_UNKNOWN_EVENT_CODE);
        OI_CASE(OI_HCI_BAD_EVENT_PARM_LEN);
        OI_CASE(OI_HCI_CMD_QUEUE_FULL);
        OI_CASE(OI_HCI_SHORT_EVENT);
        OI_CASE(OI_HCI_TRANSMIT_NOT_READY);
        OI_CASE(OI_HCI_ORPHAN_SENT_EVENT);
        OI_CASE(OI_HCI_CMD_TABLE_ERROR);
        OI_CASE(OI_HCI_UNKNOWN_CMD_ID);
        OI_CASE(OI_HCI_UNEXPECTED_EVENT);
        OI_CASE(OI_HCI_EVENT_TABLE_ERROR);
        OI_CASE(OI_HCI_EXPECTED_EVENT_TIMOUT);
        OI_CASE(OI_HCI_NO_CMD_DESC_FOR_OPCODE);
        OI_CASE(OI_HCI_INVALID_OPCODE_ERROR);
        OI_CASE(OI_HCI_FLOW_CONTROL_DISABLED);
        OI_CASE(OI_HCI_TX_COMPLETE);
        OI_CASE(OI_HCI_TX_ERROR);
        OI_CASE(OI_HCI_DEVICE_NOT_INITIALIZED);
        OI_CASE(OI_HCI_UNSUPPORTED_COMMAND);
        OI_CASE(OI_HCI_PASSTHROUGH_ERROR);
        OI_CASE(OI_HCI_PASSTHROUGH_ALREADY_SET);
        OI_CASE(OI_HCI_RESET_FAILURE);
        OI_CASE(OI_HCI_TRANSPORT_RESET);
        /* HCI command and event errors */
        OI_CASE(OI_HCIERR_UNKNOWN_HCI_COMMAND);
        OI_CASE(OI_HCIERR_NO_CONNECTION);
        OI_CASE(OI_HCIERR_HARDWARE_FAILURE);
        OI_CASE(OI_HCIERR_PAGE_TIMEOUT);
        OI_CASE(OI_HCIERR_AUTHENTICATION_FAILURE);
        OI_CASE(OI_HCIERR_KEY_MISSING);
        OI_CASE(OI_HCIERR_MEMORY_FULL);
        OI_CASE(OI_HCIERR_CONNECTION_TIMEOUT);
        OI_CASE(OI_HCIERR_MAX_NUM_OF_CONNECTIONS);
        OI_CASE(OI_HCIERR_MAX_NUM_OF_SCO_CONNECTIONS);
        OI_CASE(OI_HCIERR_ACL_CONNECTION_ALREADY_EXISTS);
        OI_CASE(OI_HCIERR_COMMAND_DISALLOWED);
        OI_CASE(OI_HCIERR_HOST_REJECTED_RESOURCES);
        OI_CASE(OI_HCIERR_HOST_REJECTED_SECURITY);
        OI_CASE(OI_HCIERR_HOST_REJECTED_PERSONAL_DEVICE);
        OI_CASE(OI_HCIERR_HOST_TIMEOUT);
        OI_CASE(OI_HCIERR_UNSUPPORTED);
        OI_CASE(OI_HCIERR_INVALID_PARAMETERS);
        OI_CASE(OI_HCIERR_OTHER_END_USER_DISCONNECT);
        OI_CASE(OI_HCIERR_OTHER_END_LOW_RESOURCES);
        OI_CASE(OI_HCIERR_OTHER_END_POWERING_OFF);
        OI_CASE(OI_HCIERR_CONNECTION_TERMINATED_LOCALLY);
        OI_CASE(OI_HCIERR_REPEATED_ATTEMPTS);
        OI_CASE(OI_HCIERR_PAIRING_NOT_ALLOWED);
        OI_CASE(OI_HCIERR_UNKNOWN_LMP_PDU);
        OI_CASE(OI_HCIERR_UNSUPPORTED_REMOTE_FEATURE);
        OI_CASE(OI_HCIERR_SCO_OFFSET_REJECTED);
        OI_CASE(OI_HCIERR_SCO_INTERVAL_REJECTED);
        OI_CASE(OI_HCIERR_SCO_AIR_MODE_REJECTED);
        OI_CASE(OI_HCIERR_INVALID_LMP_PARMS);
        OI_CASE(OI_HCIERR_UNSPECIFIED_ERROR);
        OI_CASE(OI_HCIERR_UNSUPPORTED_LMP_PARAMETERS);
        OI_CASE(OI_HCIERR_ROLE_CHANGE_NOT_ALLOWED);
        OI_CASE(OI_HCIERR_LMP_RESPONSE_TIMEOUT);
        OI_CASE(OI_HCIERR_LMP_ERROR_TRANS_COLLISION);
        OI_CASE(OI_HCIERR_LMP_PDU_NOT_ALLOWED);
        OI_CASE(OI_HCIERR_ENCRYPTION_MODE_NOT_ACCEPTABLE);
        OI_CASE(OI_HCIERR_UNIT_KEY_USED);
        OI_CASE(OI_HCIERR_QOS_NOT_SUPPORTED);
        OI_CASE(OI_HCIERR_INSTANT_PASSED);
        OI_CASE(OI_HCIERR_UNIT_KEY_PAIRING_UNSUPPORTED);
        OI_CASE(OI_HCIERR_DIFFERENT_TRANS_COLLISION);
        OI_CASE(OI_HCIERR_RESERVED_2B);
        OI_CASE(OI_HCIERR_QOS_UNACCEPTABLE_PARAMETER);
        OI_CASE(OI_HCIERR_QOS_REJECTED);
        OI_CASE(OI_HCIERR_CHANNEL_CLASSIFICATION_NS);
        OI_CASE(OI_HCIERR_INSUFFICIENT_SECURITY);
        OI_CASE(OI_HCIERR_PARM_OUT_OF_MANDATORY_RANGE);
        OI_CASE(OI_HCIERR_RESERVED_31);
        OI_CASE(OI_HCIERR_ROLE_SWITCH_PENDING);
        OI_CASE(OI_HCIERR_RESERVED_33);
        OI_CASE(OI_HCIERR_RESERVED_SLOT_VIOLATION);
        OI_CASE(OI_HCIERR_ROLE_SWITCH_FAILED);
        OI_CASE(OI_HCIERR_EIR_TOO_LARGE);
        OI_CASE(OI_HCIERR_SSP_NOT_SUPPORTED_BY_HOST);
        OI_CASE(OI_HCIERR_HOST_BUSY_PAIRING);
        OI_CASE(OI_HCIERR_UNKNOWN_ERROR);

        OI_CASE(OI_SDP_SPEC_ERROR);
        OI_CASE(OI_SDP_INVALID_SERVICE_RECORD_HANDLE);
        OI_CASE(OI_SDP_INVALID_REQUEST_SYNTAX);
        OI_CASE(OI_SDP_INVALID_PDU_SIZE);
        OI_CASE(OI_SDP_INVALID_CONTINUATION_STATE);
        OI_CASE(OI_SDP_INSUFFICIENT_RESOURCES);
        OI_CASE(OI_SDP_ERROR);
        OI_CASE(OI_SDP_CORRUPT_DATA_ELEMENT);
        OI_CASE(OI_SDP_SERVER_NOT_CONNECTED);
        OI_CASE(OI_SDP_ACCESS_DENIED);
        OI_CASE(OI_SDP_ATTRIBUTES_OUT_OF_ORDER);
        OI_CASE(OI_SDP_DEVICE_DOES_NOT_SUPPORT_SDP);
        OI_CASE(OI_SDP_NO_MORE_DATA);
        OI_CASE(OI_SDP_REQUEST_PARAMS_TOO_LONG);
        OI_CASE(OI_SDP_REQUEST_PENDING);
        OI_CASE(OI_SDP_SERVER_CONNECT_FAILED);
        OI_CASE(OI_SDP_SERVER_TOO_MANY_CONNECTIONS);
        OI_CASE(OI_SDP_NO_MATCHING_SERVICE_RECORD);
        OI_CASE(OI_SDP_PARTIAL_RESPONSE);
        OI_CASE(OI_SDP_ILLEGAL_ARGUMENT);
        OI_CASE(OI_SDP_ATTRIBUTE_NOT_FOUND);
        OI_CASE(OI_SDP_DATABASE_OUT_OF_RESOURCES);
        OI_CASE(OI_SDP_SHORT_PDU);
        OI_CASE(OI_SDP_TRANSACTION_ID_MISMATCH);
        OI_CASE(OI_SDP_UNEXPECTED_RESPONSE_PDU_ID);
        OI_CASE(OI_SDP_REQUEST_TIMEOUT);
        OI_CASE(OI_SDP_INVALID_RESPONSE_SYNTAX);
        OI_CASE(OI_SDP_CONNECTION_TIMEOUT);
        OI_CASE(OI_SDP_RESPONSE_DATA_ERROR);
        OI_CASE(OI_SDP_TOO_MANY_ATTRIBUTE_BYTES);
        OI_CASE(OI_SDP_TOO_MANY_SERVICE_RECORDS);
        OI_CASE(OI_SDP_INVALID_CONNECTION_ID);
        OI_CASE(OI_SDP_CANNOT_SET_ATTRIBUTE);
        OI_CASE(OI_SDP_BADLY_FORMED_ATTRIBUTE_VALUE);
        OI_CASE(OI_SDP_NO_ATTRIBUTE_LIST_TO_REMOVE);
        OI_CASE(OI_SDP_ATTRIBUTE_LIST_ALREADY_ADDED);
        OI_CASE(OI_SDP_DATA_ELEMENT_TRUNCATED);

        OI_CASE(OI_RFCOMM_WRITE_IN_PROGRESS);
        OI_CASE(OI_RFCOMM_INVALID_BAUDRATE);
        OI_CASE(OI_RFCOMM_INVALID_DATABIT);
        OI_CASE(OI_RFCOMM_INVALID_STOPBIT);
        OI_CASE(OI_RFCOMM_INVALID_PARITY);
        OI_CASE(OI_RFCOMM_INVALID_PARITYTYPE);
        OI_CASE(OI_RFCOMM_INVALID_FLOWCONTROL);
        OI_CASE(OI_RFCOMM_SESSION_EXISTS);
        OI_CASE(OI_RFCOMM_INVALID_CHANNEL);
        OI_CASE(OI_RFCOMM_DLCI_EXISTS);
        OI_CASE(OI_RFCOMM_LINK_NOT_FOUND);
        OI_CASE(OI_RFCOMM_REMOTE_REJECT);
        OI_CASE(OI_RFCOMM_TEST_IN_PROGRESS);
        OI_CASE(OI_RFCOMM_SESSION_NOT_FOUND);
        OI_CASE(OI_RFCOMM_INVALID_PACKET);
        OI_CASE(OI_RFCOMM_FRAMESIZE_EXCEEDED);
        OI_CASE(OI_RFCOMM_INVALID_DLCI);
        OI_CASE(OI_RFCOMM_SERVER_NOT_REGISTERED);
        OI_CASE(OI_RFCOMM_CREDIT_ERROR);
        OI_CASE(OI_RFCOMM_NO_CHANNEL_NUMBER);
        OI_CASE(OI_RFCOMM_QUERY_IN_PROGRESS);
        OI_CASE(OI_RFCOMM_SESSION_SHUTDOWN);
        OI_CASE(OI_RFCOMM_LOCAL_DEVICE_DISCONNECTED);
        OI_CASE(OI_RFCOMM_REMOTE_DEVICE_DISCONNECTED);
        OI_CASE(OI_RFCOMM_OUT_OF_SERVER_CHANNELS);

        OI_CASE(OI_DISPATCH_INVALID_CB_HANDLE);
        OI_CASE(OI_DISPATCH_TABLE_OVERFLOW);

        OI_CASE(OI_TEST_UNKNOWN_TEST);
        OI_CASE(OI_TEST_FAIL);

        OI_CASE(OI_HCITRANS_CANNOT_CONNECT_TO_DEVICE);
        OI_CASE(OI_HCITRANS_BUFFER_TOO_SMALL);
        OI_CASE(OI_HCITRANS_NULL_DEVICE_HANDLE);
        OI_CASE(OI_HCITRANS_IO_ERROR);
        OI_CASE(OI_HCITRANS_DEVICE_NOT_READY);
        OI_CASE(OI_HCITRANS_FUNCTION_NOT_SUPPORTED);
        OI_CASE(OI_HCITRANS_ACCESS_DENIED);
        OI_CASE(OI_HCITRANS_ACL_DATA_ERROR);
        OI_CASE(OI_HCITRANS_SCO_DATA_ERROR);
        OI_CASE(OI_HCITRANS_EVENT_DATA_ERROR);
        OI_CASE(OI_HCITRANS_INTERNAL_ERROR);
        OI_CASE(OI_HCITRANS_LINK_NOT_ACTIVE);
        OI_CASE(OI_HCITRANS_INITIALIZING);

        OI_CASE(OI_DEVMGR_NO_CONNECTION);
        OI_CASE(OI_DEVMGR_HARDWARE_ERROR);
        OI_CASE(OI_DEVMGR_PENDING_CONNECT_LIST_FULL);
        OI_CASE(OI_DEVMGR_CONNECTION_LIST_FULL);
        OI_CASE(OI_DEVMGR_NO_SUCH_CONNECTION);
        OI_CASE(OI_DEVMGR_INQUIRY_IN_PROGRESS);
        OI_CASE(OI_DEVMGR_PERIODIC_INQUIRY_ACTIVE);
        OI_CASE(OI_DEVMGR_NO_INQUIRIES_ACTIVE);
        OI_CASE(OI_DEVMGR_DUPLICATE_CONNECTION);
        OI_CASE(OI_DEVMGR_DUPLICATE_EVENT_CALLBACK);
        OI_CASE(OI_DEVMGR_EVENT_CALLBACK_LIST_FULL);
        OI_CASE(OI_DEVMGR_EVENT_CALLBACK_NOT_FOUND);
        OI_CASE(OI_DEVMGR_BUSY);
        OI_CASE(OI_DEVMGR_ENUM_UNEXPECTED_INQ_COMPLETE);
        OI_CASE(OI_DEVMGR_ENUM_UNEXPECTED_INQ_RESULT);
        OI_CASE(OI_DEVMGR_ENUM_DATABASE_FULL);
        OI_CASE(OI_DEVMGR_ENUM_INQUIRIES_OVERLAP);
        OI_CASE(OI_DEVMGR_UNKNOWN_LINK_TYPE);
        OI_CASE(OI_DEVMGR_PARAM_IO_ACTIVE);
        OI_CASE(OI_DEVMGR_UNKNOWN_IAC_LAP);
        OI_CASE(OI_DEVMGR_SCO_ALREADY_REGISTERED);
        OI_CASE(OI_DEVMGR_SCO_NOT_REGISTERED);
        OI_CASE(OI_DEVMGR_SCO_WITHOUT_ACL);
        OI_CASE(OI_DEVMGR_NO_SUPPORT);
        OI_CASE(OI_DEVMGR_WRITE_POLICY_FAILED);
        OI_CASE(OI_DEVMGR_NOT_IN_MASTER_MODE);
        OI_CASE(OI_DEVMGR_POLICY_VIOLATION);
        OI_CASE(OI_DEVMGR_BUSY_TIMEOUT);
        OI_CASE(OI_DEVMGR_REENCRYPT_FAILED);
        OI_CASE(OI_DEVMGR_ROLE_POLICY_CONFLICT);
        OI_CASE(OI_DEVMGR_BAD_INTERVAL);
        OI_CASE(OI_DEVMGR_INVALID_SCO_HANDLE);
        OI_CASE(OI_DEVMGR_CONNECTION_OVERLAP);
        OI_CASE(OI_DEVMGR_ORPHAN_SUBRATE_COMPLETE);
        OI_CASE(OI_DEVMGR_EIR_RESPONSE_2_LARGE);

        OI_CASE(OI_SECMGR_NO_POLICY);
        OI_CASE(OI_SECMGR_INTERNAL_ERROR);
        OI_CASE(OI_SECMGR_ORPHANED_CALLBACK);
        OI_CASE(OI_SECMGR_BUSY);
        OI_CASE(OI_SECMGR_DEVICE_NOT_TRUSTED);
        OI_CASE(OI_SECMGR_DEVICE_ENCRYPT_FAIL);
        OI_CASE(OI_SECMGR_DISCONNECTED_FAIL);
        OI_CASE(OI_SECMGR_ACCESS_PENDING);
        OI_CASE(OI_SECMGR_PIN_CODE_TOO_SHORT);
        OI_CASE(OI_SECMGR_UNKNOWN_ENCRYPT_VALUE);
        OI_CASE(OI_SECMGR_INVALID_POLICY);
        OI_CASE(OI_SECMGR_AUTHORIZATION_FAILED);
        OI_CASE(OI_SECMGR_ENCRYPTION_FAILED);
        OI_CASE(OI_SECMGR_UNIT_KEY_UNSUPPORTED);
        OI_CASE(OI_SECMGR_NOT_REGISTERED);
        OI_CASE(OI_SECMGR_ILLEGAL_WRITE_SSP_MODE);
        OI_CASE(OI_SECMGR_INVALID_SEC_LEVEL);
        OI_CASE(OI_SECMGR_INSUFFICIENT_LINK_KEY);
        OI_CASE(OI_SECMGR_INVALID_KEY_TYPE);
        OI_CASE(OI_SECMGR_SSP_NOT_ENCRYPTED);
        OI_CASE(OI_SECMGR_ORPHAN_EVENT);
        OI_CASE(OI_SECMGR_NOT_BONDABLE);

        OI_CASE(OI_TCS_INVALID_ELEMENT_TYPE);
        OI_CASE(OI_TCS_INVALID_PACKET);
        OI_CASE(OI_TCS_CALL_IN_PROGRESS);
        OI_CASE(OI_TCS_NO_CALL_IN_PROGRESS);

        OI_CASE(OI_OBEX_CONTINUE);
        OI_CASE(OI_OBEX_COMMAND_ERROR);
        OI_CASE(OI_OBEX_CONNECTION_TIMEOUT);
        OI_CASE(OI_OBEX_CONNECT_FAILED);
        OI_CASE(OI_OBEX_DISCONNECT_FAILED);
        OI_CASE(OI_OBEX_ERROR);
        OI_CASE(OI_OBEX_INCOMPLETE_PACKET);
        OI_CASE(OI_OBEX_LENGTH_REQUIRED);
        OI_CASE(OI_OBEX_NOT_CONNECTED);
        OI_CASE(OI_OBEX_NO_MORE_CONNECTIONS);
        OI_CASE(OI_OBEX_OPERATION_IN_PROGRESS);
        OI_CASE(OI_OBEX_PUT_RESPONSE_ERROR);
        OI_CASE(OI_OBEX_GET_RESPONSE_ERROR);
        OI_CASE(OI_OBEX_REQUIRED_HEADER_NOT_FOUND);
        OI_CASE(OI_OBEX_SERVICE_UNAVAILABLE);
        OI_CASE(OI_OBEX_TOO_MANY_HEADER_BYTES);
        OI_CASE(OI_OBEX_UNKNOWN_COMMAND);
        OI_CASE(OI_OBEX_UNSUPPORTED_VERSION);
        OI_CASE(OI_OBEX_CLIENT_ABORTED_COMMAND);
        OI_CASE(OI_OBEX_BAD_PACKET);
        OI_CASE(OI_OBEX_BAD_REQUEST);
        OI_CASE(OI_OBEX_OBJECT_OVERFLOW);
        OI_CASE(OI_OBEX_NOT_FOUND);
        OI_CASE(OI_OBEX_ACCESS_DENIED);
        OI_CASE(OI_OBEX_VALUE_NOT_ACCEPTABLE);
        OI_CASE(OI_OBEX_PACKET_OVERFLOW);
        OI_CASE(OI_OBEX_NO_SUCH_FOLDER);
        OI_CASE(OI_OBEX_NAME_REQUIRED);
        OI_CASE(OI_OBEX_PASSWORD_TOO_LONG);
        OI_CASE(OI_OBEX_PRECONDITION_FAILED);
        OI_CASE(OI_OBEX_UNAUTHORIZED);
        OI_CASE(OI_OBEX_CONFLICT);
        OI_CASE(OI_OBEX_NOT_IMPLEMENTED);
        OI_CASE(OI_OBEX_INVALID_AUTH_DIGEST);
        OI_CASE(OI_OBEX_INVALID_OPERATION);
        OI_CASE(OI_OBEX_DATABASE_FULL);
        OI_CASE(OI_OBEX_DATABASE_LOCKED);
        OI_CASE(OI_OBEX_INTERNAL_SERVER_ERROR);
        OI_CASE(OI_OBEX_UNSUPPORTED_MEDIA_TYPE);
        OI_CASE(OI_OBEX_PARTIAL_CONTENT);
        OI_CASE(OI_OBEX_METHOD_NOT_ALLOWED);
        OI_CASE(OI_OBEXSRV_INCOMPLETE_GET);
        OI_CASE(OI_OBEX_FOLDER_BROWSING_NOT_ALLOWED);
        OI_CASE(OI_OBEX_SERVER_FORCED_DISCONNECT);
        OI_CASE(OI_OBEX_OFS_ERROR);
        OI_CASE(OI_OBEX_FILEOP_ERROR);
        OI_CASE(OI_OBEX_USERID_TOO_LONG);
        OI_CASE(OI_OBEX_NOT_READY);
        OI_CASE(OI_OBEX_NOT_MODIFIED);
        OI_CASE(OI_OBEX_FORBIDDEN);
        OI_CASE(OI_OBEX_CLEANUP);
        OI_CASE(OI_OBEX_CONNECT_IN_PROGRESS);

        OI_CASE(OI_HANDSFREE_EVENT_REPORTING_DISABLED);
        OI_CASE(OI_HANDSFREE_NOT_CONNECTED);
        OI_CASE(OI_HANDSFREE_SERVICE_NOT_STARTED);
        OI_CASE(OI_HANDSFREE_AG_SERVICE_NOT_STARTED);
        OI_CASE(OI_HANDSFREE_COMMAND_IN_PROGRESS);
        OI_CASE(OI_HANDSFREE_AUDIO_ALREADY_CONNECTED);
        OI_CASE(OI_HANDSFREE_AUDIO_NOT_CONNECTED);
        OI_CASE(OI_HANDSFREE_FEATURE_NOT_SUPPORTED);

        OI_CASE(OI_HEADSET_SERVICE_NOT_STARTED);
        OI_CASE(OI_HEADSET_AG_SERVICE_NOT_STARTED);
        OI_CASE(OI_HEADSET_COMMAND_IN_PROGRESS);

        OI_CASE(OI_BNEP_INVALID_MTU);
        OI_CASE(OI_BNEP_SETUP_TIMEOUT);
        OI_CASE(OI_BNEP_SERVICE_NOT_REGISTERED);
        OI_CASE(OI_BNEP_INVALID_HANDLE);
        OI_CASE(OI_BNEP_RESPONSE_TIMEOUT);
        OI_CASE(OI_BNEP_INVALID_CONNECTION);
        OI_CASE(OI_BNEP_INVALID_FILTER);
        OI_CASE(OI_BNEP_CONNECTION_EXISTS);
        OI_CASE(OI_BNEP_NOT_INITIALIZED);
        OI_CASE(OI_BNEP_CONNECT_BASE);
        OI_CASE(OI_BNEP_CONNECT_FAILED_INVALID_DEST_UUID);
        OI_CASE(OI_BNEP_CONNECT_FAILED_INVALID_SOURCE_UUID);
        OI_CASE(OI_BNEP_CONNECT_FAILED_INVALID_UUID_SIZE);
        OI_CASE(OI_BNEP_CONNECT_FAILED_NOT_ALLOWED);
        OI_CASE(OI_BNEP_FILTER_NET_BASE);
        OI_CASE(OI_BNEP_FILTER_NET_UNSUPPORTED_REQUEST);
        OI_CASE(OI_BNEP_FILTER_NET_FAILED_INVALID_PROTOCOL_TYPE);
        OI_CASE(OI_BNEP_FILTER_NET_FAILED_MAX_LIMIT_REACHED);
        OI_CASE(OI_BNEP_FILTER_NET_FAILED_SECURITY);
        OI_CASE(OI_BNEP_FILTER_MULTI_BASE);
        OI_CASE(OI_BNEP_FILTER_MULTI_UNSUPPORTED_REQUEST);
        OI_CASE(OI_BNEP_FILTER_MULTI_FAILED_INVALID_ADDRESS);
        OI_CASE(OI_BNEP_FILTER_MULTI_FAILED_MAX_LIMIT_REACHED);
        OI_CASE(OI_BNEP_FILTER_MULTI_FAILED_SECURITY);
        OI_CASE(OI_BNEP_LOCAL_DEVICE_MUST_BE_MASTER);
        OI_CASE(OI_BNEP_PACKET_FILTERED_OUT);

        OI_CASE(OI_NETIFC_UP_FAILED);
        OI_CASE(OI_NETIFC_COULD_NOT_CREATE_THREAD);
        OI_CASE(OI_NETIFC_INITIALIZATION_FAILED);
        OI_CASE(OI_NETIFC_INTERFACE_ALREADY_UP);
        OI_CASE(OI_NETIFC_INTERFACE_NOT_UP);
        OI_CASE(OI_NETIFC_PACKET_TOO_BIG);

        OI_CASE(OI_PAN_ROLE_ALREADY_REGISTERED);
        OI_CASE(OI_PAN_ROLE_NOT_ALLOWED);
        OI_CASE(OI_PAN_INCOMPATIBLE_ROLES);
        OI_CASE(OI_PAN_INVALID_ROLE);
        OI_CASE(OI_PAN_CONNECTION_IN_PROGRESS);
        OI_CASE(OI_PAN_USER_ALREADY_CONNECTED);
        OI_CASE(OI_PAN_DEVICE_CONNECTED);

        OI_CASE(OI_CODEC_SBC_NO_SYNCWORD);
        OI_CASE(OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA);
        OI_CASE(OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA);
        OI_CASE(OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA);
        OI_CASE(OI_CODEC_SBC_CHECKSUM_MISMATCH);
        OI_CASE(OI_CODEC_SBC_PARTIAL_DECODE);

        OI_CASE(OI_FIFOQ_QUEUE_NOT_ALIGNED);
        OI_CASE(OI_FIFOQ_INVALID_Q);
        OI_CASE(OI_FIFOQ_BUF_TOO_LARGE);
        OI_CASE(OI_FIFOQ_FULL);
        OI_CASE(OI_FIFOQ_NOT_ALLOCATED);
        OI_CASE(OI_FIFOQ_INVALID_DATA_PTR);

        OI_CASE(OI_HID_HOST_SERVICE_NOT_STARTED);
        OI_CASE(OI_HID_DEVICE_SERVICE_NOT_STARTED);

        OI_CASE(OI_AT_ERROR);
        OI_CASE(OI_AT_NO_CARRIER);
        OI_CASE(OI_AT_BUSY);
        OI_CASE(OI_AT_NO_ANSWER);
        OI_CASE(OI_AT_DELAYED);
        OI_CASE(OI_AT_BLACKLISTED);
        OI_CASE(OI_AT_CMS_ERROR);
        OI_CASE(OI_AT_CME_ERROR);

        OI_CASE(OI_AVDTP_CONNECTION_SEQ_ERROR);
        OI_CASE(OI_AVDTP_OUT_OF_RESOURCES);

        OI_CASE(OI_PBAP_REPOSITORY_NOT_SET);
        OI_CASE(OI_PBAP_PHONEBOOK_NOT_SET);

        OI_CASE(OI_AADP_BAD_ENDPOINT);
        OI_CASE(OI_AADP_BAD_STATE);

        OI_CASE(OI_UNICODE_INVALID_SOURCE);
        OI_CASE(OI_UNICODE_SOURCE_EXHAUSTED);
        OI_CASE(OI_UNICODE_DESTINATION_EXHAUSTED);

        OI_CASE(OI_AVRCP_TOO_MANY_CONNECTIONS);
        OI_CASE(OI_AVRCP_NOT_IMPLEMENTED);
        OI_CASE(OI_AVRCP_REJECTED);
        OI_CASE(OI_AVRCP_INVALID_RESPONSE);
        OI_CASE(OI_AVRCP_RESPONSE_PACKET_OVERFLOW);
        OI_CASE(OI_AVRCP_RESPONSE_INVALID_PDU);
        OI_CASE(OI_AVRCP_RESPONSE_INVALID_PARAMETER);
        OI_CASE(OI_AVRCP_RESPONSE_PARAMETER_NOT_FOUND);
        OI_CASE(OI_AVRCP_RESPONSE_INTERNAL_ERROR);

        OI_CASE(OI_STATUS_NONE);

        default:
        return NULL;
    }
}

/**
 * The list of status text filters, pre-initialized with the BM3 status text
 * filter.
 */
static OI_APP_STATUS_TEXT_FILTER StatusTextFilterList[OI_NUM_RESERVED_STATUS_BLOCKS + 1] = { OI_BM3StatusText };


OI_CHAR* OI_StatusText(OI_STATUS value)
{
    OI_UINT i;
    OI_CHAR *text = NULL;

    for (i = 0; (text == NULL) && (i < OI_ARRAYSIZE(StatusTextFilterList)) && (StatusTextFilterList[i]) ; i++) {
        if (StatusTextFilterList[i]) {
            text = StatusTextFilterList[i](value);
        }
    }

    if (text) {
        return text;
    } else {
        return OI_StatusNum(value);
    }
}

void OI_RegisterAppStatusTextFilter(OI_APP_STATUS_TEXT_FILTER filter)
{
    OI_UINT i;

    for (i = 0; i < OI_ARRAYSIZE(StatusTextFilterList); i++) {
        if (StatusTextFilterList[i] == filter) {
            OI_SLOG_WARNING(OI_STATUS_ALREADY_REGISTERED, ("Filter (0x%08x) already registered",
                                                           filter));
            return;
        }
        if (StatusTextFilterList[i] == NULL) {
            StatusTextFilterList[i] = filter;
            return;
        }
    }

    OI_SLOG_WARNING(OI_STATUS_NO_RESOURCES, ("Too many filters registered"));
}

#endif    /* OI_DEBUG */

/*****************************************************************************/
