Home | History | Annotate | Download | only in wds
      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