323 lines
9.7 KiB
C++
323 lines
9.7 KiB
C++
|
// Copyright 1995-1997 Microsoft Corporation. All Rights Reserved.
|
||
|
|
||
|
// itssini.cpp : INI file support for InfoTech Structured Storage files
|
||
|
|
||
|
// need for those pesky pre-compiled headers
|
||
|
#include "header.h"
|
||
|
|
||
|
#include "itssini.h"
|
||
|
|
||
|
// InfoTech Include Files
|
||
|
#include "fsclient.h"
|
||
|
|
||
|
// macros
|
||
|
#define upper(x) ( ((x) >= 'a' && (x) <= 'z') ? (x)-'a'+'A' : (x) )
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* CreateStorageFileBuffer()
|
||
|
*
|
||
|
* Function reads in the specified initialization file inside of an
|
||
|
* InfoTech Structured Storage file and buffers it
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* lpFileName - Pointer to the file that contains the initialization
|
||
|
* file.
|
||
|
* pStorage - Pointer to InfoTech Structured Storage file.
|
||
|
*
|
||
|
* EXIT:
|
||
|
* LPCTSTR - The returned buffer.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
LPCSTR CreateStorageFileBuffer( LPCTSTR lpFileName, IStorage* pStorage )
|
||
|
{
|
||
|
LPCSTR lpBuffer = NULL;
|
||
|
|
||
|
if( lpFileName && pStorage ) {
|
||
|
IStream* pStream = NULL;
|
||
|
CWStr cszw(lpFileName);
|
||
|
HRESULT hr;
|
||
|
if( (hr = pStorage->OpenStream(cszw, 0, STGM_READ, 0, &pStream )) == S_OK ) {
|
||
|
STATSTG StatStg;
|
||
|
if ((hr = pStream->Stat(&StatStg, STATFLAG_NONAME)) == S_OK) {
|
||
|
lpBuffer = (LPCSTR) lcMalloc(StatStg.cbSize.LowPart);
|
||
|
ULONG cbRead;
|
||
|
hr = pStream->Read((void*) lpBuffer, StatStg.cbSize.LowPart, &cbRead );
|
||
|
if (FAILED(hr) || cbRead != StatStg.cbSize.LowPart) {
|
||
|
lcFree(lpBuffer);
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return lpBuffer;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* GetStorageProfileString()
|
||
|
*
|
||
|
* Function reads a string from an initialization file inside of an
|
||
|
* InfoTech Structured Storage file
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* lpSectionName - Identifies the section to search.
|
||
|
* lpKeyName - Identifies the "Key" tp search for.
|
||
|
* lpDefault - Default return string if the read fails.
|
||
|
* lpReturnedString - Destination buffer.
|
||
|
* nSize - Specifies the size, in characters, of the buffer
|
||
|
* pointed to by the lpReturnedString parameter.
|
||
|
* lpFileName - Pointer to the file that contains the initialization
|
||
|
* file.
|
||
|
* pStorage - Pointer to InfoTech Structured Storage file.
|
||
|
*
|
||
|
* EXIT:
|
||
|
* DWORD - The return value is the number of characters copied to the
|
||
|
* buffer, not including the terminating null character.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
DWORD GetStorageProfileString( LPCTSTR lpSectionName, LPCTSTR lpKeyName, LPCTSTR lpDefault,
|
||
|
LPSTR lpReturnedString, INT nSize, LPCSTR lpFileName,
|
||
|
IStorage* pStorage )
|
||
|
{
|
||
|
// buffer the initialization file
|
||
|
LPCSTR lpBuffer = CreateStorageFileBuffer( lpFileName, pStorage );
|
||
|
if (!lpBuffer)
|
||
|
return 0;
|
||
|
|
||
|
// get the value of the specified key
|
||
|
DWORD dwReturn = GetBufferProfileString( lpSectionName, lpKeyName, lpDefault,
|
||
|
lpReturnedString, nSize, lpBuffer );
|
||
|
|
||
|
// free the initialization file buffer
|
||
|
DestroyStorageFileBuffer(lpBuffer);
|
||
|
|
||
|
return dwReturn;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* GetStorageProfileInt()
|
||
|
*
|
||
|
* Function reads an unsigned integer from an initialization file inside of an
|
||
|
* InfoTech Structured Storage file
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* lpSectionName - Identifies the section to search.
|
||
|
* lpKeyName - Identifies the "Key" tp search for.
|
||
|
* lpDefault - Default return value if read fails.
|
||
|
* lpFileName - Pointer to the file that contains the initialization
|
||
|
* file.
|
||
|
* pStorage - Pointer to InfoTech Structured Storage file.
|
||
|
*
|
||
|
* EXIT:
|
||
|
* UINT - The return value is the integer equivalent of the string
|
||
|
* following the specified key name in the specified initialization
|
||
|
* file. If the key is not found, the return value is the specified
|
||
|
* default value. If the value of the key is less than zero, the
|
||
|
* return value is zero.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
UINT GetStorageProfileInt( LPCTSTR lpSectionName, LPCTSTR lpKeyName,
|
||
|
INT nDefault, LPCTSTR lpFileName,
|
||
|
IStorage* pStorage )
|
||
|
{
|
||
|
// buffer the initialization file
|
||
|
LPCSTR lpBuffer = CreateStorageFileBuffer( lpFileName, pStorage );
|
||
|
if (!lpBuffer)
|
||
|
return 0;
|
||
|
|
||
|
// get the value of the specified key
|
||
|
DWORD dwReturn = GetBufferProfileInt( lpSectionName, lpKeyName, nDefault, lpBuffer );
|
||
|
|
||
|
// free the initialization file buffer
|
||
|
DestroyStorageFileBuffer( (LPCSTR) lpBuffer );
|
||
|
|
||
|
return dwReturn;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* GetBufferProfileString()
|
||
|
*
|
||
|
* Function reads a string from an initialization file buffer
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* lpSectionName - Identifies the section to search.
|
||
|
* lpKeyName - Identifies the "Key" tp search for.
|
||
|
* lpDefault - Default return string if the read fails.
|
||
|
* lpReturnedString - Destination buffer.
|
||
|
* nSize - Specifies the size, in characters, of the buffer
|
||
|
* pointed to by the lpReturnedString parameter.
|
||
|
* lpBuffer - Pointer to the buffer that contains the initialization
|
||
|
* file.
|
||
|
*
|
||
|
* EXIT:
|
||
|
* DWORD - The return value is the number of characters copied to the
|
||
|
* buffer, not including the terminating null character.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
DWORD GetBufferProfileString( LPCTSTR lpSectionName, LPCTSTR lpKeyName,
|
||
|
LPCTSTR lpDefault, LPSTR lpReturnedString,
|
||
|
INT nSize, LPCSTR lpBuffer )
|
||
|
{
|
||
|
INT count, i;
|
||
|
LPCSTR lpS;
|
||
|
LPCSTR lpT;
|
||
|
|
||
|
if (!lpBuffer)
|
||
|
goto getdef;
|
||
|
|
||
|
for (lpS = lpBuffer; *lpS; lpS++)
|
||
|
{
|
||
|
while (*lpS && *lpS <= ' ')
|
||
|
lpS++;
|
||
|
|
||
|
if (*lpS == '[')
|
||
|
{
|
||
|
lpS++;
|
||
|
while (*lpS == ' ' || *lpS == '\t')
|
||
|
lpS++;
|
||
|
|
||
|
for (lpT = lpSectionName; *lpT && upper(*lpT) == upper(*lpS); lpT++, lpS++)
|
||
|
;
|
||
|
|
||
|
while (*lpS == ' ' || *lpS == '\t')
|
||
|
lpS++;
|
||
|
|
||
|
if (!*lpT && *lpS == ']')
|
||
|
goto foundsec;
|
||
|
}
|
||
|
|
||
|
while (*lpS && *lpS != '\r' && *lpS != '\n')
|
||
|
lpS++;
|
||
|
|
||
|
// break out once we reach the end
|
||
|
if( !*lpS )
|
||
|
break;
|
||
|
}
|
||
|
goto getdef;
|
||
|
|
||
|
foundsec:
|
||
|
while (*lpS && *lpS != '\r' && *lpS != '\n')
|
||
|
lpS++;
|
||
|
|
||
|
count = 0;
|
||
|
while (*lpS)
|
||
|
{
|
||
|
while (*lpS && *lpS <= ' ')
|
||
|
lpS++;
|
||
|
if (*lpS == '[')
|
||
|
break;
|
||
|
|
||
|
if (*lpS != ';')
|
||
|
{
|
||
|
if (lpKeyName)
|
||
|
{
|
||
|
for (lpT = lpKeyName; *lpT && upper(*lpT) == upper(*lpS); lpT++, lpS++)
|
||
|
;
|
||
|
while (*lpS == ' ' || *lpS == '\t')
|
||
|
lpS++;
|
||
|
|
||
|
if (!*lpT && *lpS == '=')
|
||
|
{
|
||
|
lpS++;
|
||
|
while (*lpS == ' ' || *lpS == '\t')
|
||
|
lpS++;
|
||
|
while (count < nSize-1 && *lpS && *lpS != ';' && *lpS != '\r' && *lpS != '\n')
|
||
|
{
|
||
|
*lpReturnedString++ = *lpS++;
|
||
|
count++;
|
||
|
}
|
||
|
*lpReturnedString = 0;
|
||
|
return(count);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
while (*lpS && *lpS != '=' && *lpS != '\r' && *lpS != '\n')
|
||
|
{
|
||
|
if (count >= nSize-3)
|
||
|
{
|
||
|
*lpReturnedString++ = 0;
|
||
|
*lpReturnedString++ = 0;
|
||
|
return(count);
|
||
|
}
|
||
|
*lpReturnedString++ = *lpS++;
|
||
|
count++;
|
||
|
}
|
||
|
*lpReturnedString++ = 0;
|
||
|
count++;
|
||
|
}
|
||
|
}
|
||
|
while (*lpS && *lpS != '\r' && *lpS != '\n')
|
||
|
lpS++;
|
||
|
}
|
||
|
|
||
|
if (!lpKeyName)
|
||
|
{
|
||
|
*lpReturnedString++ = 0;
|
||
|
return(count);
|
||
|
}
|
||
|
|
||
|
getdef:
|
||
|
count = lstrlen(lpDefault);
|
||
|
if (nSize < count)
|
||
|
count = nSize-1;
|
||
|
|
||
|
for (i = 0; i < count; i++)
|
||
|
lpReturnedString[i] = lpDefault[i];
|
||
|
lpReturnedString[i] = 0;
|
||
|
return(count);
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* GetBufferProfileInt()
|
||
|
*
|
||
|
* Function reads an unsigned integer from an initialization file buffer
|
||
|
*
|
||
|
* ENTRY:
|
||
|
* lpSectionName - Identifies the section to search.
|
||
|
* lpKeyName - Identifies the "Key" tp search for.
|
||
|
* lpDefault - Default return value if read fails.
|
||
|
* lpBuffer - Pointer to the buffer that contains the initialization
|
||
|
* file.
|
||
|
*
|
||
|
* EXIT:
|
||
|
* UINT - The return value is the integer equivalent of the string
|
||
|
* following the specified key name in the specified initialization
|
||
|
* file. If the key is not found, the return value is the specified
|
||
|
* default value. If the value of the key is less than zero, the
|
||
|
* return value is zero.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
UINT GetBufferProfileInt( LPCTSTR lpSectionName, LPCTSTR lpKeyName,
|
||
|
INT nDefault, LPCTSTR lpBuffer )
|
||
|
{
|
||
|
char sz[20];
|
||
|
INT k = 0;
|
||
|
LPSTR lpT;
|
||
|
INT sign = 1;
|
||
|
|
||
|
if (!GetBufferProfileString(lpSectionName,lpKeyName,"",sz,sizeof(sz),lpBuffer))
|
||
|
return(nDefault);
|
||
|
|
||
|
lpT = sz;
|
||
|
|
||
|
while (*lpT && *lpT <= ' ')
|
||
|
lpT++;
|
||
|
|
||
|
if (*lpT == '-')
|
||
|
{
|
||
|
sign = -1;
|
||
|
lpT++;
|
||
|
}
|
||
|
|
||
|
for (; *lpT >= '0' && *lpT <= '9'; lpT++)
|
||
|
k *= 10, k += *lpT - '0';
|
||
|
|
||
|
return(sign * k);
|
||
|
}
|