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

//-----------------------------------------------------------------------------
class Callback
    throw new Ex(arguments, "this class is not intended to be instantiated")

//-----------------------------------------------------------------------------
init 
    var CallbackTable    = {}
    var CallbackIndex    = 1
    var ConnectorChannel = "???"

//-----------------------------------------------------------------------------
static method setConnectorChannel(connectorChannel)
    ConnectorChannel = ""  + connectorChannel

//-----------------------------------------------------------------------------
static method register(callback)
    if (typeof callback == "function") callback = [null, callback]
    if (typeof callback.slice != "function") throw new Ex(arguments, "callback must be an array or function")
    
    var receiver = callback[0]
    var func     = callback[1]
    var data     = callback.slice(2)
    
    if (typeof func == "string") func = receiver.func
    if (typeof func != "function") throw new Ex(arguments, "callback function was null or not found")

    var index = ConnectorChannel + "::" + CallbackIndex
    
    CallbackIndex++
    if (CallbackIndex >= 65536 * 65536) CallbackIndex = 1
    
    CallbackTable[index] = [receiver, func, data]
    
    return index

//-----------------------------------------------------------------------------
static method deregister(index)
    delete CallbackTable[index]

//-----------------------------------------------------------------------------
static method invoke(index, args)
    var callback = CallbackTable[index]
    if (!callback) throw new Ex(arguments, "callback " + index + " not registered or already invoked")
    
    var receiver = callback[0]
    var func     = callback[1]
    var args     = callback[2].concat(args)
    
    try {
        func.apply(receiver,args)
    }
    catch (e) {
        var funcName = func.name
        if (!funcName) funcName = "<unnamed>"
        require("./Weinre").getClass().logError(arguments.callee.signature + " exception invoking callback: " + funcName + "(" + args.join(",") + "): " + e)
    }
    finally {
        Callback.deregister(index)
    }
