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

// messages from the target to the server

module weinre {
    interface WeinreTargetCommands {
    
        void registerTarget(int url, out string targetId);

        void sendClientCallback(string callbackId, Object args);

        void logDebug(   in string message );
        void logInfo(    in string message );
        void logWarning( in string message );
        void logError(   in string message );
    };
}

