/*******************************************************************************
 * Copyright (C) 2004-2006 Intel Corp. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 *  - Neither the name of Intel Corp. nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

/**
 * @author Anas Nashif
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>


#include "wsman-api.h"

#define RESOURCE_URI "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service"
#define CLASSNAME "Win32_Service"

/*
   boolean AcceptPause;
   boolean AcceptStop;
   string Caption;
   uint32 CheckPoint;
   string CreationClassName;
   string Description;
   boolean DesktopInteract;
   string DisplayName;
   string ErrorControl;
   uint32 ExitCode;
   datetime InstallDate;
   string Name;
   string PathName;
   uint32 ProcessId;
   uint32 ServiceSpecificExitCode;
   string ServiceType;
   boolean Started;
   string StartMode;
   string StartName;
   string State;
   string Status;
   string SystemCreationClassName;
   string SystemName;
   uint32 TagId;
   uint32 WaitHint;

*/


struct __CIM_Servie
{
	XML_TYPE_BOOL AcceptPause;
	XML_TYPE_BOOL AcceptStop;
	XML_TYPE_STR Caption;
	XML_TYPE_UINT32 CheckPoint;
	XML_TYPE_STR CreationClassName;
	XML_TYPE_STR Description;
	XML_TYPE_BOOL DesktopInteract;
	XML_TYPE_STR  DisplayName;
	XML_TYPE_STR ErrorControl;
	XML_TYPE_UINT32 ExitCode;
	XML_TYPE_STR InstallDate;
	XML_TYPE_STR Name;
	XML_TYPE_STR PathName;
	XML_TYPE_UINT32 ProcessId;
	XML_TYPE_UINT32 ServiceSpecificExitCode;
	XML_TYPE_STR ServiceType;
	XML_TYPE_BOOL Started;
	XML_TYPE_STR StartMode;
	XML_TYPE_STR StartName;
	XML_TYPE_STR State;
	XML_TYPE_STR Status;
	XML_TYPE_STR SystemCreationClassName;
	XML_TYPE_STR SystemName;
	XML_TYPE_UINT32 TagId;
	XML_TYPE_UINT32 WaitHint;
};
typedef struct __CIM_Servie CIM_Servie;

SER_START_ITEMS(CIM_Servie)
SER_NS_BOOL(RESOURCE_URI,"AcceptPause", 1),
SER_NS_BOOL(RESOURCE_URI,"AcceptStop", 1),
SER_NS_STR(RESOURCE_URI,"Caption", 1),
SER_NS_UINT32(RESOURCE_URI,"CheckPoint", 1),
SER_NS_STR(RESOURCE_URI,"CreationClassName", 1),
SER_NS_STR(RESOURCE_URI,"Description", 1),
SER_NS_BOOL(RESOURCE_URI,"DesktopInteract", 1),
SER_NS_STR(RESOURCE_URI,"DisplayName", 1),
SER_NS_STR(RESOURCE_URI,"ErrorControl", 1),
SER_NS_UINT32(RESOURCE_URI,"ExitCode", 1),
SER_NS_STR(RESOURCE_URI,"InstallDate", 1),
SER_NS_STR(RESOURCE_URI,"Name", 1),
SER_NS_STR(RESOURCE_URI,"PathName", 1),
SER_NS_UINT32(RESOURCE_URI,"ProcessId", 1),
SER_NS_UINT32(RESOURCE_URI,"ServiceSpecificExitCode", 1),
SER_NS_STR(RESOURCE_URI,"ServiceType", 1),
SER_NS_BOOL(RESOURCE_URI,"Started", 1),
SER_NS_STR(RESOURCE_URI,"StartMode", 1),
SER_NS_STR(RESOURCE_URI,"StartName", 1),
SER_NS_STR(RESOURCE_URI,"State", 1),
SER_NS_STR(RESOURCE_URI,"Status", 1),
SER_NS_STR(RESOURCE_URI,"SystemCreationClassName", 1),
SER_NS_STR(RESOURCE_URI,"SystemName", 1),
SER_NS_UINT32(RESOURCE_URI,"TagId", 1),
SER_NS_UINT32(RESOURCE_URI,"WaitHint", 1),
SER_END_ITEMS(CIM_Servie);

static char *endpoint = NULL;
char listall = 0;
char stop = 0;
char start = 0;
char desc = 0;
char status = 0;
char dump = 0;




static void print_info(CIM_Servie *service)
{
	if (service->Name) {
		printf("%s\n", service->Name );
	} else {
		printf("Error\n");
		return;
	}
	if (status)
		printf("\tState: %s\n", service->State );
	if (desc)
		printf("\tDescription: %s\n\n", service->Description );
}

static int list_services(WsManClient *cl, WsXmlDocH doc, void *data)
{
	if (!doc) {
		return 0;
	}
	if (dump)
		ws_xml_dump_node_tree(stdout, ws_xml_get_doc_root(doc));
	WsXmlNodeH node = ws_xml_get_soap_body(doc);
	node = ws_xml_get_child(node, 0,  XML_NS_ENUMERATION, WSENUM_PULL_RESP);
	node = ws_xml_get_child(node, 0,  XML_NS_ENUMERATION, WSENUM_ITEMS);
	if (ws_xml_get_child(node, 0, RESOURCE_URI , CLASSNAME )) {
		CIM_Servie *service = ws_deserialize( wsmc_get_serialization_context( cl ),
				node,
				CIM_Servie_TypeInfo, CLASSNAME,
				RESOURCE_URI, NULL,
				0, 0);
		print_info(service);
		return 1;
	}
	return 0;
}



int main(int argc, char** argv)
{
	WsManClient *cl;
	WsXmlDocH doc;
	client_opt_t *options;
	char retval = 0;
	u_error_t *error = NULL;


	u_option_entry_t opt[] = {
		{ "endpoint",	'u',	U_OPTION_ARG_STRING,	&endpoint,
			"Endpoint in form of a URL", "<uri>" },
		{ "list-all", 'l',	U_OPTION_ARG_NONE,	&listall,
			"List all services", NULL },
		{ "desc", 'd',	U_OPTION_ARG_NONE,	&desc,
			"Show service description", NULL },
		{ "stop", 's',	U_OPTION_ARG_NONE,	&stop,
			"Stop service", NULL },
		{ "start", 'S',	U_OPTION_ARG_NONE,	&start,
			"Start service", NULL },
		{ "status", 'X',	U_OPTION_ARG_NONE,	&status,
			"Get service status", NULL },
		{ "dump", 'D',	U_OPTION_ARG_NONE,	&dump,
			"Dump request", NULL },
		{ NULL }
	};

	u_option_context_t *opt_ctx;
	opt_ctx = u_option_context_new("");
	u_option_context_set_ignore_unknown_options(opt_ctx, FALSE);
	u_option_context_add_main_entries(opt_ctx, opt, "Win32 Service");
	retval = u_option_context_parse(opt_ctx, &argc, &argv, &error);

	u_option_context_free(opt_ctx);

	if (error) {
		if (error->message)
			printf ("%s\n", error->message);
		u_error_free(error);
		return 1;
	}
	u_error_free(error);


	u_uri_t *uri;
	if (endpoint) {
		u_uri_parse((const char *)endpoint, &uri);
	}
	if (!endpoint || !uri) {
		fprintf(stderr, "endpoint option required\n");
		return 1;
	}


	cl = wsmc_create( uri->host,
			uri->port,
			uri->path,
			uri->scheme,
			uri->user,
			uri->pwd);
	wsmc_transport_init(cl, NULL);
	options = wsmc_options_init();

	if (listall) {
		if (dump) wsmc_set_action_option(options,FLAG_DUMP_REQUEST );
		wsmc_action_enumerate_and_pull(cl, RESOURCE_URI, options, NULL, list_services, NULL );
	} else if (start && argv[1]) {
		if (dump) wsmc_set_action_option(options,FLAG_DUMP_REQUEST );
		wsmc_add_selector(options, "Name", argv[1]);
		doc = wsmc_action_invoke(cl, RESOURCE_URI, options,
				"StartService", NULL);
		ws_xml_dump_node_tree(stdout, ws_xml_get_doc_root(doc));
		ws_xml_destroy_doc(doc);
	} else if (stop && argv[1]) {
		if (dump) wsmc_set_action_option(options,FLAG_DUMP_REQUEST );
		wsmc_add_selector(options, "Name", argv[1]);
		doc = wsmc_action_invoke(cl, RESOURCE_URI, options,
				"StopService", NULL);
		ws_xml_dump_node_tree(stdout, ws_xml_get_doc_root(doc));
		ws_xml_destroy_doc(doc);
	} else if ( argv[1] ) {
		if (dump) wsmc_set_action_option(options,FLAG_DUMP_REQUEST );
		wsmc_add_selector(options, "Name", argv[1]);
		doc = wsmc_action_get(cl, RESOURCE_URI,
				options);
		if (doc) {
			WsXmlNodeH node = ws_xml_get_soap_body(doc);
			if (ws_xml_get_child(node, 0, RESOURCE_URI , CLASSNAME )) {
				CIM_Servie *service = ws_deserialize( wsmc_get_serialization_context( cl ),
						node,
						CIM_Servie_TypeInfo, CLASSNAME,
						RESOURCE_URI, NULL,
						0, 0);
				desc = 1;
				status = 1;
				print_info(service);
			}
		}
		ws_xml_destroy_doc(doc);
	}

	if (uri) {
		u_uri_free(uri);
	}

	wsmc_options_destroy(options);
	wsmc_release(cl);
	return 0;
}


