/**************************************************************************
   THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
   ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
   PARTICULAR PURPOSE.

   Copyright 1998 Microsoft Corporation.  All Rights Reserved.
**************************************************************************/

/**************************************************************************

   File:          strblock.h

   Description:   Programmer's interface to manipulate a block of string
				  resources. It defines an API with functions to Create,
				  Access, Modify & Destroy a string block.

**************************************************************************/

#ifndef	_STRBLOCK_H
#define _STRBLOCK_H

#include <windows.h>

// The number of strings in a block. The string resource is internally
// stored as blocks of NO_OF_STRINGS_PER_BLOCK ( = 16) strings. A block
// is the smallest granularity for manipulating a string resource.
#define		NO_OF_STRINGS_PER_BLOCK		16

// Error codes for operations on a string block.
typedef enum {
	STRBLOCKERR_OK,				// The last operation was successful.
	STRBLOCKERR_NOMEMORY,		// The last operation on the block failed due to inadequate memory.
	STRBLOCKERR_INVALIDINDEX,	// The index passed was incorrect.
	STRBLOCKERR_UPDATEFAILED,	// The specified app could not be updated.
	STRBLOCKERR_APPLOADFAILED,	// The specified app could not be loaded.
	STRBLOCKERR_RESNOTFOUND,	// The specified resource could not be located.
	STRBLOCKERR_LOADRESFAILED,	// The specified resource could not be loaded.
	STRBLOCKERR_INVALIDBLOCK,	// The specified block handle is invalid.
	STRBLOCKERR_STRINVALID,		// The string pointer passed was invalid.
	STRBLOCKERR_UPDATENOTIMPLEMENTED,	// UpdateResource not implemented.
	STRBLOCKERR_UNKNOWN			// An unspecified error.
} STRBLOCKERR;


// Handle to a block of string. We hide the internal format we use for manipulating
// a string resource by providing access to it through a handle.

DECLARE_HANDLE(HSTRBLOCK);


// Methods to access a string block.

// Function:			HSTRBLOCK WINAPI GetStringBlockA( LPCSTR strAppName, UINT nBlockID, 
//														  WORD wLangID );
// Purpose:				Get the block of string with the specified ID & language from the 
//						specified application (ANSI version). 
// LPCSTR	strAppName:	The name of the application.
// UINT		nBlockID:	The ID of the block.
// WORD		wLangID:	The language identifier. You can create a language
//						identifier using the macro, MAKELANGID.
// Returns:				Handle to a string block if successful, NULL otherwise.
// Comments:			This function creates a string block. Call DeleteStringBlock()
//						when you no longer need the block.
HSTRBLOCK WINAPI GetStringBlockA( LPCSTR strAppName, UINT nBlockID, WORD wLangID );


// Function:			HSTRBLOCK WINAPI GetStringBlockW( LPCWSTR strAppName, UINT nBlockID, 
//														  WORD wLangID );
// Purpose:				Get the block of string with the specified ID & language from the 
//						specified application (UNICODE version). 
// LPCWSTR	strAppName:	The name of the application.
// UINT		nBlockID:	The ID of the block.
// WORD		wLangID:	The language identifier. You can create a language
//						identifier using the macro, MAKELANGID.
// Returns:				Handle to a string block if successful, NULL otherwise.
// Comments:			This function creates a string block. Call DeleteStringBlock()
//						when you no longer need the block.
HSTRBLOCK WINAPI GetStringBlockW( LPCWSTR strAppName, UINT nBlockID, WORD wLangID );


// Function:			BOOL WINAPI DeleteStringBlock( HSTRBLOCK hStrBlock );
// Purpose:				Delete a block of string.
// HSTRBLOCK hStrBlock: The handle to the block.
// Returns:				TRUE if successful, FALSE on failure.
// Comments:			Call this function when you no longer need a block. Calling this function
//						frees the memory occupied by the block. Failure to delete a block
//						results in memory leaks.
BOOL WINAPI DeleteStringBlock( HSTRBLOCK hStrBlock );


// Function:			int WINAPI GetStringLength( HSTRBLOCK hStrBlock, UINT nIndex );
// Purpose:				Get the length of a string in the block.
// HSTRBLOCK hStrBlock:	The handle to the string block.
// UINT nIndex:			The zero-based index of the string in the block. The index can be
//						any value from 0 thru' (NO_OF_STRINGS_PER_BLOCK - 1).
// Returns:				If successful, the string length in number of characters, excluding the terminating 
//						NULL character; -1 if the function fails.
// Comments:			Call this function to get the string length before calling GetString.
int WINAPI GetStringLength( HSTRBLOCK hStrBlock, UINT nIndex );


// Function:			BOOL WINAPI GetStringA( HSTRBLOCK hStrBlock, UINT nIndex, LPSTR pszStr );
// Purpose:				Get the string at the specified index in the block (ANSI version).
// HSTRBLOCK hStrBlock: The handle to the string block.
// UINT nIndex:			The zero-based index of the string in the block. The index can be a value
//						from 0 through (NO_OF_STRINGS_PER_BLOCK - 1).
// LPSTR pszStr:		The pointer to the memory to which the string requested will be copied.
//						This memory should be large enough to contain the string. 			
// Returns:				TRUE on success, FALSE otherwise. 
// Comments:			Before calling this function, call GetStringLength() to get the string length.
BOOL WINAPI GetStringA( HSTRBLOCK hStrBlock, UINT nIndex, LPSTR pszStr );


// Function:			BOOL WINAPI GetStringW( HSTRBLOCK hStrBlock, UINT nIndex, LPWSTR pszStr );
// Purpose:				Get the string at the specified index in the block (UNICODE version).
// HSTRBLOCK hStrBlock: The handle to the string block.
// UINT nIndex:			The zero-based index of the string in the block. The index can be a value
//						from 0 through (NO_OF_STRINGS_PER_BLOCK - 1).
// LPSTR pszStr:		The pointer to the memory to which the string requested will be copied.
//						This memory should be large enough to contain the string. 			
// Returns:				TRUE on success, FALSE otherwise. 
// Comments:			Before calling this function, call GetStringLength() to get the string length.
BOOL WINAPI GetStringW( HSTRBLOCK hStrBlock, UINT nIndex, LPWSTR pszStr );


// Function:			BOOL WINAPI SetStringA( HSTRBLOCK hStrBlock, UINT nIndex, LPCSTR pszText );
// Purpose:				Change the string at the specified index in the block (ANSI version).
// HSTRBLOCK hStrBlock: The handle to the string block.
// UINT nIndex:			The zero-based index of the string in the block. The index can be a value
//						from 0 through (NO_OF_STRINGS_PER_BLOCK - 1).
// LPCSTR pszText:		The pointer to the new string. 			
// Returns:				TRUE on success, FALSE otherwise. 
BOOL WINAPI SetStringA( HSTRBLOCK hStrBlock, UINT nIndex, LPCSTR pszText );


// Function:			BOOL WINAPI SetStringW( HSTRBLOCK hStrBlock, UINT nIndex, LPCWSTR pszStr );
// Purpose:				Change the string at the specified index in the block (UNICODE version).
// HSTRBLOCK hStrBlock: The handle to the string block.
// UINT nIndex:			The zero-based index of the string in the block. The index can be a value
//						from 0 through (NO_OF_STRINGS_PER_BLOCK - 1).
// LPCWSTR pszText:		The pointer to the new string. 	 			
// Returns:				TRUE on success, FALSE otherwise. 
BOOL WINAPI SetStringW( HSTRBLOCK hStrBlock, UINT nIndex, LPCWSTR pszText );


// Function:			int WINAPI GetFirstStringID( HSTRBLOCK hStrBlock );
// Purpose:				Get the ID of the first string in the block.
// HSTRBLOCK hStrBlock: The handle to the string block.
// Returns:				The ID of the first string in the block. -1 if the function fails.
int WINAPI GetFirstStringID( HSTRBLOCK hStrBlock );


// Function:			int WINAPI GetBlockID( HSTRBLOCK hStrBlock );
// Purpose:				Get the ID of the string block. This is the ID of the string block that was 
//						specified when the block was created.
// HSTRBLOCK hStrBlock:	The handle to the string block.
// Returns:				The block ID, if sucessful, or -1 on failure.
int WINAPI GetBlockID( HSTRBLOCK hStrBlock );


// Function:			WORD WINAPI GetBlockLanguage( HSTRBLOCK hStrBlock );
// Purpose:				Get the identifier of the language for the string block. This is the language ID 
//						specified when the block was created.
// HSTRBLOCK hStrBlock:	The handle to the string block.
// Returns:				The language ID of the block, if successful; 0 on failure.
// Comments:			For info on language IDs, refer help of MAKELANGID.
WORD WINAPI GetBlockLanguage( HSTRBLOCK hStrBlock );


// Function:			BOOL WINAPI UpdateStringBlockA( LPCSTR strAppName, HSTRBLOCK hStrBlock, 
//														int nBlockID, WORD wLangID );
// Purpose:				Update the block of string resource in the specified application 
//						(ANSI version). 
// LPCTSTR strAppName:	The name of the application whose string resource has to be updated.
// HSTRBLOCK hStrBlock: The handle to the block that contains the new strings.
// int nBlockID:		The ID of the block to update in the app. If it is -1, use the same block
//						ID as that of hStrBlock.
// WORD wLangID:		The identifier of the language whaose string block has to be updated. If this 
//						value is 0, use the same language as that of hStrBlock.
// Returns:				TRUE on success, FALSE on failure.
BOOL WINAPI UpdateStringBlockA( LPCSTR strAppName, HSTRBLOCK hStrBlock, int nBlockID, WORD wLangID );


// Function:			BOOL WINAPI UpdateStringBlockW( LPCWTR strAppName, HSTRBLOCK hStrBlock,
//														int nBlockID, WORD wLangID );
// Purpose:				Update the block of string resource in the specified application 
//						(UNICODE version). 
// LPCTSTR strAppName:	The name of the application whose string resource has to be updated.
// HSTRBLOCK hStrBlock: The handle to the block that contains the new strings.
// int nBlockID:		The ID of the block to update in the app. If it is -1, use the same block
//						ID as that of hStrBlock.
// WORD wLangID:		The identifier of the language whaose string block has to be updated. If this 
//						value is 0, use the same language as that of hStrBlock.
// Returns:				TRUE on success, FALSE on failure.
BOOL WINAPI UpdateStringBlockW( LPCWSTR strAppName, HSTRBLOCK hStrBlock, int nBlockID, WORD wLangID );


// Function:			STRBLOCKERR WINAPI GetStringBlockError();
// Purpose:				Get the error status of the last string block action.
// Returns:				The error status of the last operation on the specified block.
// Comments:			The error code is maintained on a per-thread basis. Multiple threads do not
//						overwrite each other's last block error code.
STRBLOCKERR WINAPI GetStringBlockError();


#ifdef UNICODE
#define		GetStringBlock		GetStringBlockW
#define		GetString			GetStringW
#define		SetString			SetStringW
#define		UpdateStringBlock	UpdateStringBlockW
#else	
#define		GetStringBlock		GetStringBlockA
#define		GetString			GetStringA
#define		SetString			SetStringA
#define		UpdateStringBlock	UpdateStringBlockA
#endif // UNICODE

#endif // _STRBLOCK_H