int __cdecl wmain( int argc, wchar_t * argv[])
{
	xmlrpc_server_httpsys_parms serverparm;
    xmlrpc_registry * registryP;
    xmlrpc_env env;

	xmlrpc_env_init(&env);

	registryP = xmlrpc_registry_new(&env);

    xmlrpc_registry_add_method(
        &env, registryP, NULL, "sample.add", &sample_add, NULL);

    wprintf(L"Starting XML-RPC server...\n");

	//Sets the port number we are listening on
	serverparm.portNum=8080;

	//if this is set, we will use the authorization function
	serverparm.authfn=NULL;
	//serverparm.authfn=&handleAuthorization;

	//set the logging level and log file
	serverparm.logLevel=2;
	serverparm.logFile="C:\\httpsysserverlog.txt";

	//set the use of SSL
	serverparm.useSSL=0;

    serverparm.registryP = registryP;

    xmlrpc_server_httpsys(&env, &serverparm, XMLRPC_HSSIZE(authfn));

	wprintf(L"Stopping XML-RPC server...\n");

	xmlrpc_registry_free(registryP);
	xmlrpc_env_clean(&env);

    return 0;
}
void
xmlrpc_server_httpsys(
    xmlrpc_env *                        const envP,
    const xmlrpc_server_httpsys_parms * const parmsP,
    unsigned int                        const parm_size
    )
{
    ULONG           retCode;
    HANDLE          hReqQueue      = NULL;
    HTTPAPI_VERSION HttpApiVersion = HTTPAPI_VERSION_1;
    WCHAR           wszURL[35];

    XMLRPC_ASSERT_ENV_OK(envP);

    if (parm_size < XMLRPC_HSSIZE(authfn))
    {
        xmlrpc_faultf(envP,
                      "You must specify members at least up through "
                      "'authfn' in the server parameters argument.  "
                      "That would mean the parameter size would be >= %u "
                      "but you specified a size of %u",
                      XMLRPC_HSSIZE(authfn), parm_size);
        return;
    }

    //Set logging options
    if (parmsP->logLevel>0)
        g_bDebug=TRUE;
    else
        g_bDebug=FALSE;

    if (parmsP->logLevel>1)
        g_bDebugString=TRUE;
    else
        g_bDebugString=FALSE;

    if (!parmsP->logFile)
        g_bDebug=FALSE;
    else
        StringCchPrintfA(g_fLogFile,MAX_PATH,parmsP->logFile);

    //construct the URL we are listening on
    if (parmsP->useSSL!=0)
        StringCchPrintf(wszURL,35,L"https://+:%u/RPC2",parmsP->portNum);
    else
        StringCchPrintf(wszURL,35,L"http://+:%u/RPC2",parmsP->portNum);

    global_registryP = parmsP->registryP;

    // Initialize HTTP APIs.
    retCode = HttpInitialize(HttpApiVersion,
                             HTTP_INITIALIZE_SERVER,    // Flags
                             NULL                       // Reserved
        );
    if (retCode != NO_ERROR)
    {
        xmlrpc_faultf(envP, "HttpInitialize failed with %lu",
                      retCode);
        return;
    }

    // Create a Request Queue Handle
    retCode = HttpCreateHttpHandle(&hReqQueue,        // Req Queue
                                   0                  // Reserved
        );
    if (retCode != NO_ERROR)
    { 
        xmlrpc_faultf(envP, "HttpCreateHttpHandle failed with %lu", retCode);
        goto CleanUp;
    }

    retCode = HttpAddUrl(hReqQueue,   // Req Queue
                         wszURL,      // Fully qualified URL
                         NULL         // Reserved
        );

    if (retCode != NO_ERROR)
    {
        xmlrpc_faultf(envP, "HttpAddUrl failed with %lu", retCode);
        goto CleanUp;
    }

    TraceW(L"we are listening for requests on the following url: %ws",
           wszURL);

    // Loop while receiving requests
    for(;;)
    {
        TraceW(L"Calling DoReceiveRequests()");
        retCode = DoReceiveRequests(hReqQueue, parmsP);
        if(NO_ERROR == retCode)
        {
            TraceW(L"DoReceiveRequests() returned NO_ERROR, breaking");
            break;
        }
    }

CleanUp:

    TraceW(L"Tearing down the server.", wszURL);

    // Call HttpRemoveUrl for the URL that we added.
    HttpRemoveUrl( hReqQueue, wszURL );

    // Close the Request Queue handle.
    if(hReqQueue)
        CloseHandle(hReqQueue);

    // Call HttpTerminate.
    HttpTerminate(HTTP_INITIALIZE_SERVER, NULL);
    return;
}