/*
 * WININET - Gopher implementation
 *
 * Copyright 2003 Kirill Smelkov
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "config.h"

#include <stdarg.h>

#include "windef.h"
#include "winbase.h"
#include "wininet.h"

#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(wininet);

/***********************************************************************
 *           GopherCreateLocatorA (WININET.@)
 *
 * Create a Gopher locator string from its component parts
 *
 * PARAMS
 *  lpszHost            [I] host name
 *  nServerPort         [I] port in host byteorder or INTERNET_INVALID_PORT_NUMBER for default
 *  lpszDisplayString   [I] document/directory to display (NULL - default directory)
 *  lpszSelectorString  [I] selector string for server (NULL - none)
 *  dwGopherType        [I] selector type (see GOPHER_TYPE_xxx)
 *  lpszLocator         [O] buffer for locator string
 *  lpdwBufferLength    [I] locator buffer length
 *
 * RETURNS
 *  TRUE  on success
 *  FALSE on failure
 *
 */
BOOL WINAPI GopherCreateLocatorA(
 LPCSTR        lpszHost,
 INTERNET_PORT nServerPort,
 LPCSTR        lpszDisplayString,
 LPCSTR        lpszSelectorString,
 DWORD         dwGopherType,
 LPSTR         lpszLocator,
 LPDWORD       lpdwBufferLength
)
{
    FIXME("stub\n");
    return FALSE;
}

/***********************************************************************
 *           GopherCreateLocatorW (WININET.@)
 * 
 * Unicode version of GopherCreateLocatorA
 */
BOOL WINAPI GopherCreateLocatorW(
 LPCWSTR       lpszHost,
 INTERNET_PORT nServerPort,
 LPCWSTR       lpszDisplayString,
 LPCWSTR       lpszSelectorString,
 DWORD         dwHopherType,
 LPWSTR        lpszLocator,
 LPDWORD       lpdwBufferLength
)
{
    FIXME("stub\n");
    return FALSE;
}

/***********************************************************************
 *           GopherFindFirstFileA (WININET.@)
 *
 * Create a session and locate the requested documents
 *
 * PARAMS
 *  hConnect        [I] Handle to a Gopher session returned by InternetConnect
 *  lpszLocator     [I] - address of a string containing the name of the item to locate.
 *                      - Locator created by the GopherCreateLocator function.
 * lpszSearchString [I] what to search for if this request is to an index server.
 *                      Otherwise, this parameter should be NULL.
 * lpFindData       [O] retrived information
 * dwFlags          [I] INTERNET_FLAG_{HYPERLINK, NEED_FILE, NO_CACHE_WRITE, RELOAD, RESYNCHRONIZE}
 * dwContext        [I] application private value
 *
 * RETURNS
 *  HINTERNET handle on success
 *  NULL on error
 */
HINTERNET WINAPI GopherFindFirstFileA(
 HINTERNET hConnect,
 LPCSTR    lpszLocator,
 LPCSTR    lpszSearchString,
 LPGOPHER_FIND_DATAA
           lpFindData,
 DWORD     dwFlags,
 DWORD     dwContext
)
{
    FIXME("stub\n");
    return NULL;
}

/***********************************************************************
 *           GopherFindFirstFileW (WININET.@)
 *
 * Unicode version of GopherFindFirstFileA
 */
HINTERNET WINAPI GopherFindFirstFileW(
 HINTERNET hConnect,
 LPCWSTR   lpszLocator,
 LPCWSTR   lpszSearchString,
 LPGOPHER_FIND_DATAW
           lpFindData,
 DWORD     dwFlags,
 DWORD     dwContext
)
{
    FIXME("stub\n");
    return NULL;
}

/***********************************************************************
 *           GopherGetAttributeA (WININET.@)
 *
 * Retrieves the specific attribute information from the server.
 * 
 * RETURNS
 *  TRUE on success
 *  FALSE on failure
 */
BOOL WINAPI GopherGetAttributeA(
 HINTERNET hConnect,
 LPCSTR    lpszLocator,
 LPCSTR    lpszAttributeName,
 LPBYTE    lpBuffer,
 DWORD     dwBufferLength,
 LPDWORD   lpdwCharactersReturned,
 GOPHER_ATTRIBUTE_ENUMERATORA
           lpfnEnumerator,
 DWORD     dwContext
)
{
    FIXME("stub\n");
    return FALSE;
}

/***********************************************************************
 *           GopherGetAttributeW (WININET.@)
 *
 * Unicode version of GopherGetAttributeA
 */
BOOL WINAPI GopherGetAttributeW(
 HINTERNET hConnect,
 LPCWSTR   lpszLocator,
 LPCWSTR   lpszAttributeName,
 LPBYTE    lpBuffer,
 DWORD     dwBufferLength,
 LPDWORD   lpdwCharactersReturned,
 GOPHER_ATTRIBUTE_ENUMERATORW
           lpfnEnumerator,
 DWORD     dwContext
)
{
    FIXME("stub\n");
    return FALSE;
}

/***********************************************************************
 *           GopherGetLocatorTypeA (WININET.@)
 *
 * Parses a Gopher locator and determines its attributes.
 *
 * PARAMS
 *  lpszLocator     [I] Address of the Gopher locator string to parse
 *  lpdwGopherType  [O] destination for bitmasked type of locator
 *
 * RETURNS
 *  TRUE  on success
 *  FALSE on failure
 */
BOOL WINAPI GopherGetLocatorTypeA(LPCSTR lpszLocator, LPDWORD lpdwGopherType)
{
    FIXME("stub\n");
    return FALSE;
}

/***********************************************************************
 *           GopherGetLocatorTypeW (WININET.@)
 *
 * Unicode version of GopherGetLocatorTypeA
 */
BOOL WINAPI GopherGetLocatorTypeW(LPCWSTR lpszLocator, LPDWORD lpdwGopherType)
{
    FIXME("stub\n");
    return FALSE;
}

/***********************************************************************
 *           GopherOpenFileA (WININET.@)
 *
 * Begins reading a Gopher data file from a Gopher server.
 *
 * PARAMS
 *  hConnect    [I] handle to a Gopher session
 *  lpszLocator [I] file locator
 *  lpszView    [I] file view (or default if NULL)
 *  dwFlags     [I] INTERNET_FLAG_{HYPERLINK, NEED_FILE, NO_CACHE_WRITE, RELOAD, RESYNCHRONIZE}
 *  dwContext   [I] application private value
 *
 * RETURNS
 *  handle  on success
 *  NULL    on error
 */
HINTERNET WINAPI GopherOpenFileA(
 HINTERNET hConnect,
 LPCSTR    lpszLocator,
 LPCSTR    lpszView,
 DWORD     dwFlags,
 DWORD     dwContext
)
{
    FIXME("stub\n");
    return NULL;
}

/***********************************************************************
 *           GopherOpenFileW (WININET.@)
 *
 * Unicode version of GopherOpenFileA
 */
HINTERNET WINAPI GopherOpenFileW(
 HINTERNET hConnect,
 LPCWSTR   lpszLocator,
 LPCWSTR   lpszView,
 DWORD     dwFlags,
 DWORD     dwContext
)
{
    FIXME("stub\n");
    return NULL;
}
