1 /* 2 * Copyright 2008, The Android Open Source Project 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef Command_h 27 #define Command_h 28 29 #include "wtf/MainThread.h" 30 #include "wtf/Vector.h" 31 32 namespace WebCore { 33 class Frame; 34 } 35 36 using namespace WTF; 37 using namespace WebCore; 38 39 namespace android { 40 41 // WebCore Debug Server 42 namespace WDS { 43 44 class Connection; 45 46 // Command identifier length 47 #define COMMAND_LENGTH 4 48 49 // The dispatcher function called with a Frame for context and the established 50 // connection to the client. The connection can be used to read and write to the 51 // client application. Return true on successful completion of the command, 52 // return false to indicate failure. 53 typedef bool (*DispatchFunction)(const Frame*, const Connection*); 54 55 // Note: Although the type is named MainThreadFunction, it may not always be 56 // the main thread. The type is generic enough to reuse here but named 57 // something more appropriate. 58 typedef MainThreadFunction TargetThreadFunction; 59 60 // Helper class to dipatch functions on a particular thread. 61 class Handler { 62 public: 63 virtual ~Handler() {} 64 virtual void post(TargetThreadFunction, void*) const = 0; 65 }; 66 67 // Class for containing information about particular commands. 68 class Command { 69 public: 70 Command(const char* name, const char* desc, const DispatchFunction func, 71 const Handler& handler) 72 : m_name(name) 73 , m_description(desc) 74 , m_dispatch(func) 75 , m_handler(handler) {} 76 Command(const Command& comm) 77 : m_name(comm.m_name) 78 , m_description(comm.m_description) 79 , m_dispatch(comm.m_dispatch) 80 , m_handler(comm.m_handler) {} 81 virtual ~Command() {} 82 83 // Initialize the debug server commands 84 static void Init(); 85 86 // Find the command specified by the client request. 87 static Command* Find(const Connection* conn); 88 89 // Dispatch this command 90 void dispatch(); 91 92 const char* name() const { return m_name; } 93 94 protected: 95 const char* m_name; 96 const char* m_description; 97 const DispatchFunction m_dispatch; 98 99 private: 100 const Handler& m_handler; 101 static Vector<const Command*>* s_commands; 102 }; 103 104 } // end namespace WDS 105 106 } // end namespace android 107 108 #endif 109