/*
 * 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 client to the server

module weinre {
    interface WeinreClientCommands {
    
        void registerClient(out string clientId);

        void getTargets(out Object[] targets);
        void getClients(out Object[] clients);

        void connectTarget(in string clientId, in string targetId);
        void disconnectTarget(in string clientId);
        
        void getExtensions(out string[] extensions)
        
        void logDebug(   in string message );
        void logInfo(    in string message );
        void logWarning( in string message );
        void logError(   in string message );
    };
}

