/*
 * SetupX .inf file parsing functions
 *
 * FIXME: return values ???
 */

#include "debugtools.h"
#include "windef.h"
#include "winbase.h"
#include "heap.h"
#include "wine/winbase16.h"
#include "setupx16.h"

DEFAULT_DEBUG_CHANNEL(setupx);

WORD InfNumEntries = 0;
INF_FILE *InfList = NULL;
HINF16 IP_curr_handle = 0;

RETERR16 IP_OpenInf(LPCSTR lpInfFileName, HINF16 *lphInf)
{
    HFILE hFile = _lopen(lpInfFileName, OF_READ);

    if (!lphInf)
	return IP_ERROR;

    /* this could be improved by checking for already freed handles */
    if (IP_curr_handle == 0xffff) 
	return ERR_IP_OUT_OF_HANDLES; 

    if (hFile != HFILE_ERROR)
    {
	InfList = HeapReAlloc(GetProcessHeap(), 0, InfList, InfNumEntries+1);
	InfList[InfNumEntries].hInf = IP_curr_handle++;
	InfList[InfNumEntries].hInfFile = hFile;
	InfList[InfNumEntries].lpInfFileName = HeapAlloc( GetProcessHeap(), 0,
                                                          strlen(lpInfFileName)+1);
        strcpy( InfList[InfNumEntries].lpInfFileName, lpInfFileName );
        *lphInf = InfList[InfNumEntries].hInf;
	InfNumEntries++;
	TRACE("ret handle %d.\n", *lphInf);
	return OK;
    }
    *lphInf = 0xffff;
    return ERR_IP_INVALID_INFFILE;
}

BOOL IP_FindInf(HINF16 hInf, WORD *ret)
{
    WORD n;

    for (n=0; n < InfNumEntries; n++)
	if (InfList[n].hInf == hInf)
	{
	    *ret = n;
	    return TRUE;
	}
    return FALSE;
}
	

LPCSTR IP_GetFileName(HINF16 hInf)
{
    WORD n;
    if (IP_FindInf(hInf, &n))
    {
	return InfList[n].lpInfFileName;
    }
    return NULL;
}

RETERR16 IP_CloseInf(HINF16 hInf)
{
    int i;
    WORD n;
    RETERR16 res = ERR_IP_INVALID_HINF;

    if (IP_FindInf(hInf, &n))
    {
	_lclose(InfList[n].hInfFile);
	HeapFree(GetProcessHeap(), 0, InfList[n].lpInfFileName);
	for (i=n; i < InfNumEntries-1; i++)
	    InfList[i] = InfList[i+1];
	InfNumEntries--;
	InfList = HeapReAlloc(GetProcessHeap(), 0, InfList, InfNumEntries);
	res = OK;
    }
    return res;
}

/***********************************************************************
 *		IpOpen16
 *
 */
RETERR16 WINAPI IpOpen16(LPCSTR lpInfFileName, HINF16 *lphInf)
{
    TRACE("('%s', %p)\n", lpInfFileName, lphInf);
    return IP_OpenInf(lpInfFileName, lphInf);
}

/***********************************************************************
 *		IpClose16
 */
RETERR16 WINAPI IpClose16(HINF16 hInf)
{
    return IP_CloseInf(hInf);
}

/***********************************************************************
 *		IpGetProfileString16
 */
RETERR16 WINAPI IpGetProfileString16(HINF16 hInf, LPCSTR section, LPCSTR entry, LPSTR buffer, WORD buflen) 
{
    TRACE("'%s': section '%s' entry '%s'\n", IP_GetFileName(hInf), section, entry);
    GetPrivateProfileStringA(section, entry, "", buffer, buflen, IP_GetFileName(hInf));
    return 0;
}
