/*
 * Xailer source code:
 *
 * Resources.c
 * Funciones para recursos
 *
 * Copyright 2003, 2007 Ignacio Ortiz de Zuņiga
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include <windows.h>
#include <xailer.h>


//--------------------------------------------------------------------------

XA_FUNC( LOADSTRING )   // LoadString( [<hInstance>], <nId> ) --> cString
{
   char szBuffer[ 256 ];
   int iLen;

   iLen = LoadString( HB_ISNUM( 1 ) ? (HINSTANCE) hb_parnl( 1 ) : GetModuleHandle( NULL ),
                      hb_parnl( 2 ), szBuffer, 255 );

   if( iLen )
      hb_retclen( szBuffer, iLen );
   else
      hb_retc( "" );
}

//--------------------------------------------------------------------------

XA_FUNC( FINDRESOURCE ) // FindResource( <hModule>, <cName>, <cType> | <nType> ) --> hResource
{
   hb_retnl( (LONG) FindResource( (HMODULE) hb_parnl( 1 ), hb_parc( 2 ), HB_ISNUM( 3 ) ? (LPSTR) hb_parnl( 3 ) : hb_parc( 3 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( FINDRESOURCEEX )  // FindResourceEx( <hModule>, <cName>, <cType> | <nType>, <nLanguage> ) --> hResource
{
   hb_retnl( (LONG) FindResourceEx( (HMODULE) hb_parnl( 1 ), hb_parc( 2 ),
                                    HB_ISNUM( 3 ) ? (LPSTR) hb_parnl( 3 ) : hb_parc( 3 ), hb_parni( 4 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( LOADRESOURCE ) // LoadResource( <hModule>, <hResource> ) --> cData
{
   HMODULE hModule = (HMODULE) hb_parnl( 1 );
   HRSRC hRes = (HRSRC) hb_parnl( 2 );
   int nLen = SizeofResource( hModule, hRes );

   hb_retclen( LoadResource( hModule, hRes ), nLen );
}

//--------------------------------------------------------------------------

XA_FUNC( LOCKRESOURCE ) // LockResource( <hGlobal> ) --> pResource
{
   hb_retnl( (LONG) LockResource( (HGLOBAL) hb_parnl( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( SIZEOFRESOURCE )  // SizeOfResource( <hModule>, <hResource> ) --> nResult
{
   hb_retnl( SizeofResource( (HMODULE) hb_parnl( 1 ), (HRSRC) hb_parnl( 2 ) ) );
}

//--------------------------------------------------------------------------

static BOOL CALLBACK _EnumResourceNames( HMODULE hModule, LPCTSTR szType, LPTSTR szName, LONG_PTR lParam )
{
   PHB_ITEM pItem;

   XA_SYMBOL_UNUSED( hModule );
   XA_SYMBOL_UNUSED( szType );

   pItem = hb_itemPutC( NULL, szName );
   hb_arrayAdd( (PHB_ITEM) lParam, pItem );
   hb_itemRelease( pItem );

   return TRUE;
}

//--------------------------------------------------------------------------

XA_FUNC( ENUMRESOURCENAMES ) // EnumResourceNames( <hModule>, <cType> | <nType> ) --> aResourceNames
{
   PHB_ITEM aResources = hb_itemArrayNew( 0 );

   EnumResourceNames( (HMODULE) hb_parnl( 1 ), HB_ISNUM( 2 ) ? (LPSTR) hb_parnl( 2 ) : hb_parc( 2 ), _EnumResourceNames, (LPARAM) aResources );

   hb_itemReturn( aResources );
   hb_itemRelease( aResources );
}

//--------------------------------------------------------------------------
