/*
 * WSOCK32 specific functions
 *
 * Copyright (C) 2002 Andrew Hughes
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "config.h"

#include <stdarg.h>

#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winsock2.h"
#include "wtypes.h"
#include "nspapi.h"

#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(winsock);

INT WINAPI GetAddressByNameA(DWORD dwNameSpace, LPGUID lpServiceType, LPSTR lpServiceName,
    LPINT lpiProtocols, DWORD dwResolution, LPSERVICE_ASYNC_INFO lpServiceAsyncInfo,
    LPVOID lpCsaddrBuffer, LPDWORD lpdwBufferLength, LPSTR lpAliasBuffer,
    LPDWORD lpdwAliasBufferLength)
{
    FIXME("(0x%08x, %s, %s, %p, 0x%08x, %p, %p, %p, %p, %p) stub\n", dwNameSpace,
          debugstr_guid(lpServiceType), debugstr_a(lpServiceName), lpiProtocols,
          dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength,
          lpAliasBuffer, lpdwAliasBufferLength);
 
    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
    return SOCKET_ERROR;
}

INT WINAPI GetAddressByNameW(DWORD dwNameSpace, LPGUID lpServiceType, LPWSTR lpServiceName,
    LPINT lpiProtocols, DWORD dwResolution, LPSERVICE_ASYNC_INFO lpServiceAsyncInfo,
    LPVOID lpCsaddrBuffer, LPDWORD lpdwBufferLength, LPWSTR lpAliasBuffer,
    LPDWORD lpdwAliasBufferLength)
{
    FIXME("(0x%08x, %s, %s, %p, 0x%08x, %p, %p, %p, %p, %p) stub\n", dwNameSpace,
          debugstr_guid(lpServiceType), debugstr_w(lpServiceName), lpiProtocols,
          dwResolution, lpServiceAsyncInfo, lpCsaddrBuffer, lpdwBufferLength,
          lpAliasBuffer, lpdwAliasBufferLength);

    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
    return SOCKET_ERROR;
}

/******************************************************************************
 *          GetTypeByNameA     [WSOCK32.1113]
 *
 * Retrieve a service type GUID for a network service specified by name.
 *
 * PARAMETERS
 *      lpServiceName [I] NUL-terminated ASCII string that uniquely represents the name of the service
 *      lpServiceType [O] Destination for the service type GUID
 *
 * RETURNS
 *      Success: 0. lpServiceType contains the requested GUID
 *      Failure: SOCKET_ERROR. GetLastError() can return ERROR_SERVICE_DOES_NOT_EXIST
 *
 * NOTES
 *      Obsolete Microsoft-specific extension to Winsock 1.1.
 *      Protocol-independent name resolution provides equivalent functionality in Winsock 2.
 *
 * BUGS
 *      Unimplemented
 */
INT WINAPI GetTypeByNameA(LPSTR lpServiceName, LPGUID lpServiceType)
{
   /* tell the user they've got a substandard implementation */
   FIXME("wsock32: GetTypeByNameA(%p, %p): stub\n", lpServiceName, lpServiceType);
   
   /* some programs may be able to compensate if they know what happened */
   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
   return SOCKET_ERROR; /* error value */
}


/******************************************************************************
 *          GetTypeByNameW     [WSOCK32.1114]
 *
 * See GetTypeByNameA.
 */
INT WINAPI GetTypeByNameW(LPWSTR lpServiceName, LPGUID lpServiceType)
{
    /* tell the user they've got a substandard implementation */
    FIXME("wsock32: GetTypeByNameW(%p, %p): stub\n", lpServiceName, lpServiceType);
    
    /* some programs may be able to compensate if they know what happened */
    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
    return SOCKET_ERROR; /* error value */
}

/******************************************************************************
 *          SetServiceA     [WSOCK32.1117]
 *
 * Register or unregister a network service with one or more namespaces.
 *
 * PARAMETERS
 *      dwNameSpace        [I] Name space or set of name spaces within which the function will operate
 *      dwOperation        [I] Operation to perform
 *      dwFlags            [I] Flags to modify the function's operation
 *      lpServiceInfo      [I] Pointer to a ASCII SERVICE_INFO structure
 *      lpServiceAsyncInfo [I] Reserved for future use.  Must be NULL.
 *      lpdwStatusFlags    [O] Destination for function status information
 *
 * RETURNS
 *      Success: 0.
 *      Failure: SOCKET_ERROR. GetLastError() can return ERROR_ALREADY_REGISTERED
 *
 * NOTES
 *      Obsolete Microsoft-specific extension to Winsock 1.1,
 *      Protocol-independent name resolution provides equivalent functionality in Winsock 2.
 *
 * BUGS
 *      Unimplemented.
 */
INT WINAPI SetServiceA(DWORD dwNameSpace, DWORD dwOperation, DWORD dwFlags, LPSERVICE_INFOA lpServiceInfo,
                       LPSERVICE_ASYNC_INFO lpServiceAsyncInfo, LPDWORD lpdwStatusFlags)
{
   /* tell the user they've got a substandard implementation */
   FIXME("wsock32: SetServiceA(%u, %u, %u, %p, %p, %p): stub\n", dwNameSpace, dwOperation, dwFlags,
           lpServiceInfo, lpServiceAsyncInfo, lpdwStatusFlags);
    
   /* some programs may be able to compensate if they know what happened */
   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
   return SOCKET_ERROR; /* error value */ 
}

/******************************************************************************
 *          SetServiceW     [WSOCK32.1118]
 *
 * See SetServiceA.
 */
INT WINAPI SetServiceW(DWORD dwNameSpace, DWORD dwOperation, DWORD dwFlags, LPSERVICE_INFOW lpServiceInfo,
                       LPSERVICE_ASYNC_INFO lpServiceAsyncInfo, LPDWORD lpdwStatusFlags)
{
   /* tell the user they've got a substandard implementation */
   FIXME("wsock32: SetServiceW(%u, %u, %u, %p, %p, %p): stub\n", dwNameSpace, dwOperation, dwFlags,
           lpServiceInfo, lpServiceAsyncInfo, lpdwStatusFlags);
    
   /* some programs may be able to compensate if they know what happened */
   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
   return SOCKET_ERROR; /* error value */ 
}

/******************************************************************************
 *          GetServiceA     [WSOCK32.1119]
 *
 * Get information about a network service.
 *
 * PARAMETERS
 *      dwNameSpace        [I] Name space or set of name spaces within which the function 
 *                             will operate.
 *      lpGuid             [I] Pointer to GUID of network service type.
 *      lpServiceName      [I] NUL-terminated ASCII string that uniquely represents the name 
 *                             of the service.
 *      dwProperties       [I] Flags specifying which information to return in lpBuffer.
 *      lpBuffer           [O] Pointer to buffer where the function returns an array
 *                             of NS_SERVICE_INFO.
 *      lpdwBufferSize     [I/O] Size of lpBuffer.  A greater number on output
 *                               indicates an error.
 *      lpServiceAsyncInfo [O] Reserved.  Set to NULL.
 *
 * RETURNS
 *      Success: 0.
 *      Failure: SOCKET_ERROR. GetLastError() returns ERROR_INSUFFICIENT_BUFFER
 *               or ERROR_SERVICE_NOT_FOUND.
 *
 * NOTES
 *      Obsolete Microsoft-specific extension to Winsock 1.1,
 *      Protocol-independent name resolution provides equivalent functionality in Winsock 2.
 *
 * BUGS
 *      Unimplemented.
 */
INT WINAPI GetServiceA(DWORD dwNameSpace, LPGUID lpGuid, LPSTR lpServiceName,
                       DWORD dwProperties, LPVOID lpBuffer, LPDWORD lpdwBufferSize,
                       LPSERVICE_ASYNC_INFO lpServiceAsyncInfo)
{
   FIXME("(%u, %p, %s, %u, %p, %p, %p): stub\n", dwNameSpace,
         lpGuid, lpServiceName, dwProperties, lpBuffer, lpdwBufferSize, lpServiceAsyncInfo);

   /* some programs may be able to compensate if they know what happened */
   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
   return SOCKET_ERROR;
}

/******************************************************************************
 *          GetServiceW     [WSOCK32.1120]
 *
 * See GetServiceA.
 */
INT WINAPI GetServiceW(DWORD dwNameSpace, LPGUID lpGuid, LPSTR lpServiceName,
                       DWORD dwProperties, LPVOID lpBuffer, LPDWORD lpdwBufferSize,
                       LPSERVICE_ASYNC_INFO lpServiceAsyncInfo)
{
   FIXME("(%u, %p, %s, %u, %p, %p, %p): stub\n", dwNameSpace,
         lpGuid, lpServiceName, dwProperties, lpBuffer, lpdwBufferSize, lpServiceAsyncInfo);

   /* some programs may be able to compensate if they know what happened */
   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
   return SOCKET_ERROR;
}
