/*++

   Copyright    (c)    2000   Microsoft Corporation

   Module Name :
     headerhash.cxx

   Abstract:
     Header hash goo
 
   Author:
     Bilal Alam (balam)             20-Feb-2000

   Environment:
     Win32 - User Mode

   Project:
     ULW3.DLL
--*/

#include "precomp.hxx"

METHOD_HASH *METHOD_HASH::sm_pMethodHash;

HEADER_RECORD METHOD_HASH::sm_rgMethods[] = 
{
    { HttpVerbOPTIONS,   HEADER("OPTIONS") },
    { HttpVerbGET,       HEADER("GET") },
    { HttpVerbHEAD,      HEADER("HEAD") },
    { HttpVerbPOST,      HEADER("POST") },
    { HttpVerbPUT,       HEADER("PUT") },
    { HttpVerbDELETE,    HEADER("DELETE") },
    { HttpVerbTRACE,     HEADER("TRACE") },
    { HttpVerbCONNECT,   HEADER("CONNECT") },
    { HttpVerbTRACK,     HEADER("TRACK") },
    { HttpVerbMOVE,      HEADER("MOVE") },
    { HttpVerbCOPY,      HEADER("COPY") },
    { HttpVerbPROPFIND,  HEADER("PROPFIND") },
    { HttpVerbPROPPATCH, HEADER("PROPPATCH") },
    { HttpVerbMKCOL,     HEADER("MKCOL") },
    { HttpVerbLOCK,      HEADER("LOCK") },
    { HttpVerbUNLOCK,    HEADER("UNLOCK") },
    { HttpVerbSEARCH,    HEADER("SEARCH") },
    { HttpVerbUnknown,   NULL }
};

//static
HRESULT
METHOD_HASH::Initialize(
    VOID
)
/*++

Routine Description:

    Initialize global header hash table

Arguments:

    None

Return Value:

    HRESULT

--*/
{
    HEADER_RECORD *     pRecord;
    LK_RETCODE          lkrc = LK_SUCCESS;
    DWORD               dwNumRecords;
    
    //
    // Add header index/name to hash table
    //
    
    sm_pMethodHash = new METHOD_HASH();
    if ( sm_pMethodHash == NULL )
    {
        return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
    }
    
    //
    // Add every string->routine mapping
    //

    dwNumRecords = sizeof( sm_rgMethods ) / sizeof( HEADER_RECORD ) - 1;
    
    for ( DWORD i = 0; i < dwNumRecords; i++ )
    {
        pRecord = &(sm_rgMethods[ i ]); 
        lkrc = sm_pMethodHash->InsertRecord( pRecord );
        if ( lkrc != LK_SUCCESS )
        {
            break;
        }
    }
    
    //
    // If any insert failed, then fail initialization
    //
    
    if ( lkrc != LK_SUCCESS )
    {
        delete sm_pMethodHash;
        sm_pMethodHash = NULL;
        return HRESULT_FROM_WIN32( lkrc );        // BUGBUG
    }
    else
    {
        return NO_ERROR;
    }
}

//static
VOID
METHOD_HASH::Terminate(
    VOID
)
/*++

Routine Description:

    Global cleanup of header hash table

Arguments:

    None

Return Value:

    None

--*/
{
    if ( sm_pMethodHash != NULL )
    {
        delete sm_pMethodHash;
        sm_pMethodHash = NULL;
    }
}