/*
 * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. 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.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. 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.
 */

#include "config.h"
#include "PluginDebug.h"
#include "PlatformString.h"

#if !LOG_DISABLED

namespace WebCore {

static const char* const errorStrings[] = {
    "No errors occurred.", /* NPERR_NO_ERROR */
    "Error with no specific error code occurred.", /* NPERR_GENERIC_ERROR */
    "Invalid instance passed to the plug-in.", /* NPERR_INVALID_INSTANCE_ERROR */
    "Function table invalid.", /* NPERR_INVALID_FUNCTABLE_ERROR */
    "Loading of plug-in failed.", /* NPERR_MODULE_LOAD_FAILED_ERROR */
    "Memory allocation failed.", /* NPERR_OUT_OF_MEMORY_ERROR */
    "Plug-in missing or invalid.", /* NPERR_INVALID_PLUGIN_ERROR */
    "Plug-in directory missing or invalid.", /* NPERR_INVALID_PLUGIN_DIR_ERROR */
    "Versions of plug-in and Communicator do not match.", /* NPERR_INCOMPATIBLE_VERSION_ERROR */
    "Parameter missing or invalid.", /* NPERR_INVALID_PARAM */
    "URL missing or invalid.", /* NPERR_INVALID_URL */
    "File missing or invalid.", /* NPERR_FILE_NOT_FOUND */
    "Stream contains no data.", /* NPERR_NO_DATA */
    "Seekable stream expected.", /* NPERR_STREAM_NOT_SEEKABLE */
    "Unknown error code"
};

#ifdef XP_MACOSX
static const char* const drawingModels[] = {
    "NPDrawingModelQuickDraw",
    "NPDrawingModelCoreGraphics",
    "NPDrawingModelOpenGL",
    "NPDrawingModelCoreAnimation"
};

static const char* const eventModels[] = {
    "NPEventModelCarbon",
    "NPEventModelCocoa"
};
#endif //XP_MACOSX

const char* prettyNameForNPError(NPError error)
{
    return errorStrings[error];
}

#ifdef XP_MACOSX
const char* prettyNameForDrawingModel(NPDrawingModel drawingModel)
{
    return drawingModels[drawingModel];
}

const char* prettyNameForEventModel(NPEventModel eventModel)
{
    return eventModels[eventModel];
}
#endif //XP_MACOSX

CString prettyNameForNPNVariable(NPNVariable variable)
{
    switch (variable) {
    case NPNVxDisplay: return "NPNVxDisplay";
    case NPNVxtAppContext: return "NPNVxtAppContext";
    case NPNVnetscapeWindow: return "NPNVnetscapeWindow";
    case NPNVjavascriptEnabledBool: return "NPNVjavascriptEnabledBool";
    case NPNVasdEnabledBool: return "NPNVasdEnabledBool";
    case NPNVisOfflineBool: return "NPNVisOfflineBool";

    case NPNVserviceManager: return "NPNVserviceManager (not supported)";
    case NPNVDOMElement: return "NPNVDOMElement (not supported)";
    case NPNVDOMWindow: return "NPNVDOMWindow (not supported)";
    case NPNVToolkit: return "NPNVToolkit (not supported)";
    case NPNVSupportsXEmbedBool: return "NPNVSupportsXEmbedBool (not supported)";

    case NPNVWindowNPObject: return "NPNVWindowNPObject";
    case NPNVPluginElementNPObject: return "NPNVPluginElementNPObject";
    case NPNVSupportsWindowless: return "NPNVSupportsWindowless";
    case NPNVprivateModeBool: return "NPNVprivateModeBool";

#ifdef XP_MACOSX
    case NPNVpluginDrawingModel: return "NPNVpluginDrawingModel";
#ifndef NP_NO_QUICKDRAW
    case NPNVsupportsQuickDrawBool: return "NPNVsupportsQuickDrawBool";
#endif
    case NPNVsupportsCoreGraphicsBool: return "NPNVsupportsCoreGraphicsBool";
    case NPNVsupportsOpenGLBool: return "NPNVsupportsOpenGLBool";
    case NPNVsupportsCoreAnimationBool: return "NPNVsupportsCoreAnimationBool";
#ifndef NP_NO_CARBON
    case NPNVsupportsCarbonBool: return "NPNVsupportsCarbonBool";
#endif
    case NPNVsupportsCocoaBool: return "NPNVsupportsCocoaBool";
#endif

    default: return "Unknown variable";
    }
}

CString prettyNameForNPPVariable(NPPVariable variable, void* value)
{
    switch (variable) {
    case NPPVpluginNameString: return "NPPVpluginNameString";
    case NPPVpluginDescriptionString: return "NPPVpluginDescriptionString";
    case NPPVpluginWindowBool: return "NPPVpluginWindowBool";
    case NPPVpluginTransparentBool: return "NPPVpluginTransparentBool";

    case NPPVjavaClass: return "NPPVjavaClass (not supported)";
    case NPPVpluginWindowSize: return "NPPVpluginWindowSize (not supported)";
    case NPPVpluginTimerInterval: return "NPPVpluginTimerInterval (not supported)";
    case NPPVpluginScriptableInstance: return "NPPVpluginScriptableInstance (not supported)";
    case NPPVpluginScriptableIID: return "NPPVpluginScriptableIID (not supported)";
    case NPPVjavascriptPushCallerBool: return "NPPVjavascriptPushCallerBool (not supported)";
    case NPPVpluginKeepLibraryInMemory: return "NPPVpluginKeepLibraryInMemory (not supported)";
    case NPPVpluginNeedsXEmbed: return "NPPVpluginNeedsXEmbed (not supported)";

    case NPPVpluginScriptableNPObject: return "NPPVpluginScriptableNPObject";

    case NPPVformValue: return "NPPVformValue (not supported)";
    case NPPVpluginUrlRequestsDisplayedBool: return "NPPVpluginUrlRequestsDisplayedBool (not supported)";

    case NPPVpluginWantsAllNetworkStreams: return "NPPVpluginWantsAllNetworkStreams";
    case NPPVpluginCancelSrcStream: return "NPPVpluginCancelSrcStream";

#ifdef XP_MACOSX
    case NPPVpluginDrawingModel: {
        String result("NPPVpluginDrawingModel, ");
        result.append(prettyNameForDrawingModel(NPDrawingModel(uintptr_t(value))));
        return result.latin1();
    }
    case NPPVpluginEventModel: {
        String result("NPPVpluginEventModel, ");
        result.append(prettyNameForEventModel(NPEventModel(uintptr_t(value))));
        return result.latin1();
    }
    case NPPVpluginCoreAnimationLayer: return "NPPVpluginCoreAnimationLayer";
#endif

    default: return "Unknown variable";
    }
}

} // namespace WebCore

#endif // !LOG_DISABLED
