/**
* Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/


package org.eclipse.cdt.debug.edc.tests.tcfagent;

import java.io.IOException;

import org.eclipse.cdt.debug.edc.tcf.extension.AgentUtils;
import org.eclipse.cdt.debug.edc.tcf.extension.services.AbstractTCFService;
import org.eclipse.cdt.debug.edc.tcf.extension.services.ILogging;
import org.eclipse.tm.tcf.core.AbstractChannel;
import org.eclipse.tm.tcf.protocol.IChannel;
import org.eclipse.tm.tcf.protocol.IChannel.ICommandServer;
import org.eclipse.tm.tcf.protocol.IToken;
import org.eclipse.tm.tcf.protocol.JSON;
import org.eclipse.tm.tcf.protocol.Protocol;

/**
 * {@link ILogging} service implementation in test agent.
 */
public class LoggingService extends AbstractTCFService {

	public LoggingService(IChannel channel) {
		super(channel);
	}

	public static final String CONSOLE_LOGGER_ID = "ProgramOutputConsoleLogger";

	private static final String WRITELN_EVENT = "writeln";
	private static final String WRITE_EVENT = "write";
	private static final String DIALOG_EVENT = "dialog";
	private int numProgramOuputListeners = 0;
		
	public class CommandServer extends AbstractCommandServer {
		public void addListener(IToken token, String name, Object[] args) throws IOException {
			if (!AgentUtils.checkNumArgs(token, getChannel(), args.length, 1))
				return;
			String id = (String) args[0];				
			if (CONSOLE_LOGGER_ID.equals(id))
				numProgramOuputListeners++;
			
			getChannel().sendResult(token, JSON.toJSONSequence( new Object[] { null }));
		}

		public void removeListener(IToken token, String name, Object[] args) throws IOException {
			if (!AgentUtils.checkNumArgs(token, getChannel(), args.length, 1))
				return;
			String id = (String) args[0];
			if (CONSOLE_LOGGER_ID.equals(id)) {
				numProgramOuputListeners--;
				if (numProgramOuputListeners < 0)
					numProgramOuputListeners = 0;
			}
					
			getChannel().sendResult(token, JSON.toJSONSequence( new Object[] { null }));
		}
	}

	public void sendEvent(final String name, final Object[] args) {
		Protocol.invokeLater(new Runnable() {
			public void run() {
				try {
					((AbstractChannel) getChannel()).sendEvent(LoggingService.this, name, 
														   JSON.toJSONSequence(args));
				} catch (IOException e) {
					getChannel().terminate(e);
				}
			}
		});
	}

	public void write(String message) {
		if (numProgramOuputListeners > 0) {
			sendEvent(WRITE_EVENT, new Object[] { CONSOLE_LOGGER_ID, message });
		}
	}
	
	public void writeln(String message){
		if (numProgramOuputListeners > 0) {
			sendEvent(WRITELN_EVENT, new Object[] { CONSOLE_LOGGER_ID, message });
		}
	}

	public void dialog(int severity, String summary, String details) {
		sendEvent(DIALOG_EVENT, new Object[] { CONSOLE_LOGGER_ID, severity, summary, details });
	}

	public String getName() {
		return ILogging.NAME;
	}

	@Override
	protected ICommandServer getCommandServer() {
		return new CommandServer();
	}
}
