/*
 * Copyright 2008, The Android Open Source Project
 *
 * 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.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 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.
 */

#ifndef Command_h
#define Command_h

#include "wtf/MainThread.h"
#include "wtf/Vector.h"

namespace WebCore {
class Frame;
}

using namespace WTF;
using namespace WebCore;

namespace android {

// WebCore Debug Server
namespace WDS {

class Connection;

// Command identifier length
#define COMMAND_LENGTH 4

// The dispatcher function called with a Frame for context and the established
// connection to the client. The connection can be used to read and write to the
// client application. Return true on successful completion of the command,
// return false to indicate failure.
typedef bool (*DispatchFunction)(const Frame*, const Connection*);

// Note: Although the type is named MainThreadFunction, it may not always be
// the main thread. The type is generic enough to reuse here but named
// something more appropriate.
typedef MainThreadFunction TargetThreadFunction;

// Helper class to dipatch functions on a particular thread.
class Handler {
public:
    virtual ~Handler() {}
    virtual void post(TargetThreadFunction, void*) const = 0;
};

// Class for containing information about particular commands.
class Command {
public:
    Command(const char* name, const char* desc, const DispatchFunction func,
            const Handler& handler)
        : m_name(name)
        , m_description(desc)
        , m_dispatch(func)
        , m_handler(handler) {}
    Command(const Command& comm)
        : m_name(comm.m_name)
        , m_description(comm.m_description)
        , m_dispatch(comm.m_dispatch)
        , m_handler(comm.m_handler) {}
    virtual ~Command() {}

    // Initialize the debug server commands
    static void Init();

    // Find the command specified by the client request.
    static Command* Find(const Connection* conn);

    // Dispatch this command
    void dispatch();

    const char* name() const { return m_name; }

protected:
    const char* m_name;
    const char* m_description;
    const DispatchFunction m_dispatch;

private:
    const Handler& m_handler;
    static Vector<const Command*>* s_commands;
};

} // end namespace WDS

} // end namespace android

#endif
