
/*
 * 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
 */

requireClass ../common/Ex
requireClass ../common/IDLTools
requireClass ../common/MessageDispatcher
requireClass ../common/Weinre

//-----------------------------------------------------------------------------
class InspectorBackendImpl
    this.registeredDomainDispatchers = {}
    MessageDispatcher.setInspectorBackend(this)

//-----------------------------------------------------------------------------
static method setupProxies

    var intfNames = [
        "ApplicationCache",
        "BrowserDebugger",
        "CSS",
        "Console",
        "DOM",
        "DOMStorage",
        "Database",
        "Debugger",
        "InjectedScript",
        "Inspector",
        "Network",
        "Profiler",
        "Runtime"
    ]

    intfNames.forEach(function(intfName) {
        var proxy = Weinre.messageDispatcher.createProxy(intfName)
        if (window[intfName]) {
            throw new Ex(arguments, "backend interface '" + intfName + "' already created")
        }
        
        var intf = IDLTools.getIDL(intfName)
        if (!intf) {
            throw new Ex(arguments, "interface not registered: '" + intfName + "'")
        }

        window[intfName] = {}
        
        intf.methods.forEach(function(method) {
            var proxyMethod = InspectorBackendImpl.getProxyMethod(proxy, method)
            InspectorBackendImpl.prototype[method.name] = proxyMethod
            window[intfName][method.name] = proxyMethod
        })
    })
    

//-----------------------------------------------------------------------------
static method getProxyMethod(proxy, method)
    return function() {
        return proxy[method.name].apply(proxy, arguments)
    }

//-----------------------------------------------------------------------------
method registerDomainDispatcher(name, intf)
    this.registeredDomainDispatchers[name] = intf
    
//-----------------------------------------------------------------------------
method getRegisteredDomainDispatcher(name)
    if (!this.registeredDomainDispatchers.hasOwnProperty(name)) return null
    
    return this.registeredDomainDispatchers[name]
