/*******************************************************************************
 * Copyright (c) 2009 Nokia and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Nokia - Initial API and implementation
 *******************************************************************************/
#include <stdio.h>
#include <stdlib.h>

#include "ProcessService.h"
#include "WindowsOSDataService.h"
#include "RunControlService.h"
#include "SimpleRegistersService.h"
#include "RegistersService.h"
#include "MemoryService.h"
#include "LoggingService.h"
#include "SettingsService.h"
#include "BreakpointsService.h"

#include "EventClientNotifier.h"
#include "Logger.h"

#include "TCFHeaders.h"

static Protocol * proto;
static ChannelServer * serv;
static TCFBroadcastGroup * bcg;

static long channelCount = 0;

static void channel_server_connecting(Channel * c) {
	trace(LOG_PROTOCOL, "channel server connecting");

	send_hello_message(c);
}

static void channel_server_connected(Channel * c) {
	channelCount++;
	int i;

	trace(LOG_PROTOCOL, "channel server connected, peer services:");
	for (i = 0; i < c->peer_service_cnt; i++) {
		trace(LOG_PROTOCOL, "  %s", c->peer_service_list[i]);
	}
}

static void channel_server_receive(Channel * c) {
	handle_protocol_message(c);
}

static void channel_server_disconnected(Channel * c) {
	trace(LOG_PROTOCOL, "channel server disconnected");
    protocol_release(c->protocol);
	channelCount--;
}

static void channel_new_connection(ChannelServer * serv, Channel * c) {
	protocol_reference(proto);
    c->protocol = proto;
	c->connecting = channel_server_connecting;
	c->connected = channel_server_connected;
	c->receive = channel_server_receive;
	c->disconnected = channel_server_disconnected;
	channel_set_broadcast_group(c, bcg);
	channel_start(c);
}

static void check_for_shutdown(void *x) {

	if (channelCount <= 0) {
		trace(LOG_PROTOCOL, "check_for_shutdown");
		cancel_event_loop();
	}

	post_event_with_delay(check_for_shutdown, NULL, 120 * 1000000);
}

/*
 * Central point for cleanup after debug session ends.
 */
void debug_session_ends() {
	SettingsService::debugSessionEnds();
}

// override this so we can actually break on it
_CRTIMP void __cdecl __MINGW_NOTHROW _assert (const char* error, const char* file, int line)
{
	char message[256];
	snprintf(message, sizeof(message),
			"Fatal error: assertion failed at file=%s, line=%d: %s\n",
			file ,line, error);
	fputs(message, stderr);
	trace(LOG_ALWAYS, message);
	exit(3);
}

int main(int argc, char* argv[]) {
#ifdef _DEBUG
	static const char* log_name = "C:\\WindowsDebugAgentLog.txt";
    log_mode = LOG_EVENTS | LOG_CHILD | LOG_WAITPID | LOG_CONTEXT | LOG_PROTOCOL | LOG_ASYNCREQ;
    open_log_file(log_name);
#endif

	try {
	// For interim test purpose only:
	// Use this unpublished option to turn off BreakpointsService,
	// namely use EDC generic breakpoints mechanism.
	//
	bool installBpService = true;
	if (argc > 1 && strcmp(argv[1], "-nobpservice") == 0)
		installBpService = false;

	static const char * url = "TCP:";
	PeerServer * ps = NULL;
	ini_mdep();
	ini_trace();
	ini_asyncreq();

	ini_events_queue();

	bcg = broadcast_group_alloc();
	proto = protocol_alloc();

	LogTrace("Starting up");
	EventClientNotifier::broadcastGroup = bcg;
	
	new ProcessService(proto);
	new RunControlService(proto);
	new WindowsOSDataService(proto);
	new RegistersService(proto);
	new MemoryService(proto);
	new LoggingService(proto);
	new SettingsService(proto);
	if (installBpService)
		new BreakpointsService(proto);
	
	ps = channel_peer_from_url(url);

	peer_server_addprop(ps, loc_strdup("Name"), loc_strdup("Win32 Debug Agent"));
	peer_server_addprop(ps, loc_strdup("DebugSupport"), loc_strdup(
			"Win32 Debug API"));

	LPTSTR lpNameBuffer = NULL;
	DWORD lpnSize = 0;
	GetComputerName(lpNameBuffer, &lpnSize);
	if (lpnSize == 0) // On Win XP this may return zero even if there is a valid name
		lpnSize = 1024;
	lpNameBuffer = new char[++lpnSize];
	GetComputerName(lpNameBuffer, &lpnSize);
	peer_server_addprop(ps, loc_strdup("Description"), loc_strdup(lpNameBuffer));
	delete [] lpNameBuffer;

	if (ps == NULL) {
			LogTrace("invalid server URL");
		exit(1);
	}
	serv = channel_server(ps);
	if (serv == NULL) {
			LogTrace("cannot create TCF server\n");
		exit(1);
	}
	serv->new_conn = channel_new_connection;

	discovery_start();

#ifdef _DEBUG
#else
	post_event_with_delay(check_for_shutdown, NULL, 30 * 1000000);
#endif

	run_event_loop();
	} catch (...) {
		LogTrace("Exception thrown, caught at main");
	}
	return 0;
}
