/* * 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* s_commands; }; } // end namespace WDS } // end namespace android #endif