
/*
 * weinre is available under *either* the terms of the modified BSD license *or* the
 * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
 * 
 * Copyright (c) 2010, 2011 IBM Corporation
 */

require ../common/Weinre

//-----------------------------------------------------------------------------
// 
//-----------------------------------------------------------------------------
class WebInspectorBackendHandlerImpl

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
method enableDebugger(/*boolean*/ always, callback)
    // callback: function()
    Weinre.notImplemented('WebInspectorBackendHandler::enableDebugger()')

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
method setInjectedScriptSource(/*string*/ scriptSource, callback)
    // callback: function()
    Weinre.notImplemented('WebInspectorBackendHandler::setInjectedScriptSource()')

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
method dispatchOnInjectedScript(/*int*/ injectedScriptId, /*string*/ methodName, /*string*/ arguments, callback)
    var func = Weinre.injectedScript[methodName]
    if (null == func) {
          console.log(arguments.callee.signature + ": no method '" + methodName + "' on injectedScript")
    }

    var isException = false
    try {
        var result = func.apply(Weinre.injectedScript, JSON.parse(arguments))
    }
    catch(e) {
        result = e
        isException = true
    }
    
    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result, isException])
    }

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
method releaseWrapperObjectGroup(/*int*/ injectedScriptId, /*string*/ objectGroup, callback)
    // callback: function()
    Weinre.notImplemented('WebInspectorBackendHandler::releaseWrapperObjectGroup()')

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
method getDatabaseTableNames(/*int*/ databaseId, callback)
    // callback: function()
    Weinre.notImplemented('WebInspectorBackendHandler::getDatabaseTableNames()')

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
method executeSQL(/*int*/ databaseId, /*string*/ query, callback)
    // callback: function()
    Weinre.notImplemented('WebInspectorBackendHandler::executeSQL() not implemented')


