/*
 * Copyright (C) 2008 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.
 */
/*
 * String constants to go along with enumerated values.  (Pity we don't
 * have enumerated constant reflection in C.)  These are only needed for
 * making the output human-readable.
 */
#include "jdwp/JdwpConstants.h"

/*
 * Return a string for the error code.
 */
const char* dvmJdwpErrorStr(JdwpError error)
{
    switch (error) {
    case ERR_NONE:
        return "NONE";
    case ERR_INVALID_THREAD:
        return "INVALID_THREAD";
    case ERR_INVALID_THREAD_GROUP:
        return "INVALID_THREAD_GROUP";
    case ERR_INVALID_PRIORITY:
        return "INVALID_PRIORITY";
    case ERR_THREAD_NOT_SUSPENDED:
        return "THREAD_NOT_SUSPENDED";
    case ERR_THREAD_SUSPENDED:
        return "THREAD_SUSPENDED";
    case ERR_INVALID_OBJECT:
        return "INVALID_OBJEC";
    case ERR_INVALID_CLASS:
        return "INVALID_CLASS";
    case ERR_CLASS_NOT_PREPARED:
        return "CLASS_NOT_PREPARED";
    case ERR_INVALID_METHODID:
        return "INVALID_METHODID";
    case ERR_INVALID_LOCATION:
        return "INVALID_LOCATION";
    case ERR_INVALID_FIELDID:
        return "INVALID_FIELDID";
    case ERR_INVALID_FRAMEID:
        return "INVALID_FRAMEID";
    case ERR_NO_MORE_FRAMES:
        return "NO_MORE_FRAMES";
    case ERR_OPAQUE_FRAME:
        return "OPAQUE_FRAME";
    case ERR_NOT_CURRENT_FRAME:
        return "NOT_CURRENT_FRAME";
    case ERR_TYPE_MISMATCH:
        return "TYPE_MISMATCH";
    case ERR_INVALID_SLOT:
        return "INVALID_SLOT";
    case ERR_DUPLICATE:
        return "DUPLICATE";
    case ERR_NOT_FOUND:
        return "NOT_FOUND";
    case ERR_INVALID_MONITOR:
        return "INVALID_MONITOR";
    case ERR_NOT_MONITOR_OWNER:
        return "NOT_MONITOR_OWNER";
    case ERR_INTERRUPT:
        return "INTERRUPT";
    case ERR_INVALID_CLASS_FORMAT:
        return "INVALID_CLASS_FORMAT";
    case ERR_CIRCULAR_CLASS_DEFINITION:
        return "CIRCULAR_CLASS_DEFINITION";
    case ERR_FAILS_VERIFICATION:
        return "FAILS_VERIFICATION";
    case ERR_ADD_METHOD_NOT_IMPLEMENTED:
        return "ADD_METHOD_NOT_IMPLEMENTED";
    case ERR_SCHEMA_CHANGE_NOT_IMPLEMENTED:
        return "SCHEMA_CHANGE_NOT_IMPLEMENTED";
    case ERR_INVALID_TYPESTATE:
        return "INVALID_TYPESTATE";
    case ERR_HIERARCHY_CHANGE_NOT_IMPLEMENTED:
        return "HIERARCHY_CHANGE_NOT_IMPLEMENTED";
    case ERR_DELETE_METHOD_NOT_IMPLEMENTED:
        return "DELETE_METHOD_NOT_IMPLEMENTED";
    case ERR_UNSUPPORTED_VERSION:
        return "UNSUPPORTED_VERSION";
    case ERR_NAMES_DONT_MATCH:
        return "NAMES_DONT_MATCH";
    case ERR_CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED:
        return "CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED";
    case ERR_METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED:
        return "METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED";
    case ERR_NOT_IMPLEMENTED:
        return "NOT_IMPLEMENTED";
    case ERR_NULL_POINTER:
        return "NULL_POINTER";
    case ERR_ABSENT_INFORMATION:
        return "ABSENT_INFORMATION";
    case ERR_INVALID_EVENT_TYPE:
        return "INVALID_EVENT_TYPE";
    case ERR_ILLEGAL_ARGUMENT:
        return "ILLEGAL_ARGUMENT";
    case ERR_OUT_OF_MEMORY:
        return "OUT_OF_MEMORY";
    case ERR_ACCESS_DENIED:
        return "ACCESS_DENIED";
    case ERR_VM_DEAD:
        return "VM_DEAD";
    case ERR_INTERNAL:
        return "INTERNAL";
    case ERR_UNATTACHED_THREAD:
        return "UNATTACHED_THREAD";
    case ERR_INVALID_TAG:
        return "INVALID_TAG";
    case ERR_ALREADY_INVOKING:
        return "ALREADY_INVOKING";
    case ERR_INVALID_INDEX:
        return "INVALID_INDEX";
    case ERR_INVALID_LENGTH:
        return "INVALID_LENGTH";
    case ERR_INVALID_STRING:
        return "INVALID_STRING";
    case ERR_INVALID_CLASS_LOADER:
        return "INVALID_CLASS_LOADER";
    case ERR_INVALID_ARRAY:
        return "INVALID_ARRAY";
    case ERR_TRANSPORT_LOAD:
        return "TRANSPORT_LOAD";
    case ERR_TRANSPORT_INIT:
        return "TRANSPORT_INIT";
    case ERR_NATIVE_METHOD:
        return "NATIVE_METHOD";
    case ERR_INVALID_COUNT:
        return "INVALID_COUNT";
    default:
        return "?UNKNOWN?";
    }
}

/*
 * Return a string for the EventKind.
 */
const char* dvmJdwpEventKindStr(JdwpEventKind kind)
{
    switch (kind) {
    case EK_SINGLE_STEP:        return "SINGLE_STEP";
    case EK_BREAKPOINT:         return "BREAKPOINT";
    case EK_FRAME_POP:          return "FRAME_POP";
    case EK_EXCEPTION:          return "EXCEPTION";
    case EK_USER_DEFINED:       return "USER_DEFINED";
    case EK_THREAD_START:       return "THREAD_START";
    /*case EK_THREAD_END:         return "THREAD_END";*/
    case EK_CLASS_PREPARE:      return "CLASS_PREPARE";
    case EK_CLASS_UNLOAD:       return "CLASS_UNLOAD";
    case EK_CLASS_LOAD:         return "CLASS_LOAD";
    case EK_FIELD_ACCESS:       return "FIELD_ACCESS";
    case EK_FIELD_MODIFICATION: return "FIELD_MODIFICATION";
    case EK_EXCEPTION_CATCH:    return "EXCEPTION_CATCH";
    case EK_METHOD_ENTRY:       return "METHOD_ENTRY";
    case EK_METHOD_EXIT:        return "METHOD_EXIT";
    case EK_VM_INIT:            return "VM_INIT";
    case EK_VM_DEATH:           return "VM_DEATH";
    case EK_VM_DISCONNECTED:    return "VM_DISCONNECTED";
    /*case EK_VM_START:           return "VM_START";*/
    case EK_THREAD_DEATH:       return "THREAD_DEATH";
    default:                    return "?UNKNOWN?";
    }
}

/*
 * Return a string for the ModKind.
 */
const char* dvmJdwpModKindStr(JdwpModKind kind)
{
    switch (kind) {
    case MK_COUNT:              return "COUNT";
    case MK_CONDITIONAL:        return "CONDITIONAL";
    case MK_THREAD_ONLY:        return "THREAD_ONLY";
    case MK_CLASS_ONLY:         return "CLASS_ONLY";
    case MK_CLASS_MATCH:        return "CLASS_MATCH";
    case MK_CLASS_EXCLUDE:      return "CLASS_EXCLUDE";
    case MK_LOCATION_ONLY:      return "LOCATION_ONLY";
    case MK_EXCEPTION_ONLY:     return "EXCEPTION_ONLY";
    case MK_FIELD_ONLY:         return "FIELD_ONLY";
    case MK_STEP:               return "STEP";
    case MK_INSTANCE_ONLY:      return "INSTANCE_ONLY";
    default:                    return "?UNKNOWN?";
    }
}

/*
 * Return a string for the StepDepth.
 */
const char* dvmJdwpStepDepthStr(JdwpStepDepth depth)
{
    switch (depth) {
    case SD_INTO:               return "INTO";
    case SD_OVER:               return "OVER";
    case SD_OUT:                return "OUT";
    default:                    return "?UNKNOWN?";
    }
}

/*
 * Return a string for the StepSize.
 */
const char* dvmJdwpStepSizeStr(JdwpStepSize size)
{
    switch (size) {
    case SS_MIN:                return "MIN";
    case SS_LINE:               return "LINE";
    default:                    return "?UNKNOWN?";
    }
}

/*
 * Return a string for the SuspendPolicy.
 */
const char* dvmJdwpSuspendPolicyStr(JdwpSuspendPolicy policy)
{
    switch (policy) {
    case SP_NONE:               return "NONE";
    case SP_EVENT_THREAD:       return "EVENT_THREAD";
    case SP_ALL:                return "ALL";
    default:                    return "?UNKNOWN?";
    }
}

/*
 * Return a string for the SuspendStatus.
 */
const char* dvmJdwpSuspendStatusStr(JdwpSuspendStatus status)
{
    switch (status) {
    case SUSPEND_STATUS_NOT_SUSPENDED: return "Not SUSPENDED";
    case SUSPEND_STATUS_SUSPENDED:     return "SUSPENDED";
    default:                           return "?UNKNOWN?";
    }
}

/*
 * Return a string for the ThreadStatus.
 */
const char* dvmJdwpThreadStatusStr(JdwpThreadStatus status)
{
    switch (status) {
    case TS_ZOMBIE:             return "ZOMBIE";
    case TS_RUNNING:            return "RUNNING";
    case TS_SLEEPING:           return "SLEEPING";
    case TS_MONITOR:            return "MONITOR";
    case TS_WAIT:               return "WAIT";
    default:                    return "?UNKNOWN?";
    }
};