I wrote this code for those who may have the need to iterate through all entries in a nVault file. Please let me know if you notice any errors or have any requests/questions.
The below code will display all entries in the server console in the below format.
Code:
nVault | Magic=1851149396 Version=512 Entries=2
Entry=1 KeyLen=22 ValLen=29 TimeStamp=1272719603
Key="This is an example key"
Val="This is the data for this key"
Entry=2 KeyLen=27 ValLen=9 TimeStamp=1272719618
Key="This is another example key"
Val="More data"
PHP Code:
#include <amxmodx>
#include <amxmisc>
// - From nvault.h -
#define VAULT_MAGIC 0x6E564C54 //nVLT
#define VAULT_VERSION 0x0200 //second version
/*
nVault File Format
VAULT_MAGIC (uint32)
VAULT_VERSION (uint16)
ENTRIES (int32)
[
TimeStamp (int32)
KeyLen (uint8)
ValLen (uint16)
KeyData ([])
ValData ([])
]
*/
new const Version[] = "0.1";
const MaxKeyLen = 255; //Max 255
const MaxValLen = 512; //Max 65535
const DataBuffer = 128; //Make this the greater of (MaxKeyLen / 4) or (MaxValLen / 4)
public plugin_init()
{
register_plugin( "nVault File Reader" , Version , "bugsy" );
ReadVault( "TheVaultFile" );
}
public ReadVault( const szVault[] )
{
new szFile[ 64 ] , iFile;
new iVaultMagic , iVaultVersion , iVaultEntries;
new iKeyLen , iValLen , iTimeStamp;
new szKey[ MaxKeyLen + 1 ] , szVal[ MaxValLen + 1 ] , RawData[ DataBuffer ];
formatex( szFile[ get_datadir( szFile , charsmax( szFile ) ) ] , charsmax( szFile ) , "/vault/%s.vault" , szVault );
iFile = fopen( szFile , "rb" );
if ( !iFile )
return 0;
// Vault Magic
fread_raw( iFile , RawData , 1 , BLOCK_INT );
iVaultMagic = RawData[ 0 ];
if ( iVaultMagic != VAULT_MAGIC )
set_fail_state( "Error reading nVault: Vault Magic" );
// Vault Version
fread_raw( iFile , RawData , 1 , BLOCK_SHORT );
iVaultVersion = RawData[ 0 ] & 0xFFFF;
if ( iVaultVersion != VAULT_VERSION )
set_fail_state( "Error reading nVault: Vault Version" );
// Vault Entries
fread_raw( iFile , RawData , 1 , BLOCK_INT );
iVaultEntries = RawData[ 0 ];
server_print( "nVault | Magic=%d Version=%d Entries=%d" , iVaultMagic , iVaultVersion , iVaultEntries );
server_print( " " );
for ( new iEntry = 0 ; iEntry < iVaultEntries ; iEntry++ )
{
// TimeStamp
fread_raw( iFile , RawData , 1 , BLOCK_INT );
iTimeStamp = RawData[ 0 ];
// Key Length
fread_raw( iFile , RawData , 1 , BLOCK_BYTE );
iKeyLen = RawData[ 0 ] & 0xFF;
// Val Length
fread_raw( iFile , RawData , 1 , BLOCK_SHORT );
iValLen = RawData[ 0 ] & 0xFFFF;
// Key Data
fread_raw( iFile , RawData , iKeyLen , BLOCK_CHAR );
ReadString( szKey , iKeyLen , charsmax( szKey ) , RawData );
// Val Data
fread_raw( iFile , RawData , iValLen , BLOCK_CHAR );
ReadString( szVal , iValLen , charsmax( szVal ) , RawData );
server_print( "Entry=%d KeyLen=%d ValLen=%d TimeStamp=%d" , iEntry , iKeyLen , iValLen , iTimeStamp );
server_print( "Key=^"%s^"" , szKey );
server_print( "Val=^"%s^"" , szVal );
server_print( " " );
}
fclose( iFile );
return iVaultEntries;
}
ReadString( szDestString[] , iLen , iMaxLen , SourceData[] )
{
new iStrPos = -1;
new iRawPos = 0;
while ( ( ++iStrPos < iLen ) && ( iStrPos < iMaxLen ) && ( iRawPos < DataBuffer ) )
{
szDestString[ iStrPos ] = ( SourceData[ iRawPos ] >> ( ( iStrPos % 4 ) * 8 ) ) & 0xFF;
if ( iStrPos && ( ( iStrPos % 4 ) == 3 ) )
iRawPos++
}
szDestString[ iStrPos ] = EOS;
}
__________________