//<"LSCH"><CeHeader><CacheKey><ResponseHeader><ResponseBody>
int DirHashCacheEntry::loadCeHeader()
{
    int fd = getFdStore();
    if ( fd == -1 )
    {
        errno = EBADF;
        return -1;
    }
    if ( nio_lseek( fd, getStartOffset(), SEEK_SET ) == -1 )
        return -1;
    char achBuf[4 + sizeof( CeHeader ) ];
    if ( (size_t)nio_read( fd, achBuf, 4 + sizeof( CeHeader ) ) 
                < 4 + sizeof( CeHeader ) )
        return -1;
//  if ( *( uint32_t *)achBuf != CE_ID )
//     return -1;
    if (memcmp(achBuf, CE_ID, 4) != 0)
        return -1;
    
    memmove( &getHeader(), &achBuf[4], sizeof( CeHeader ) );
    int len = getHeader().m_keyLen;
    if ( len > 0 )
    {
        char * p = getKey().prealloc( len+1 );
        if ( !p )   
            return -1;
        if ( nio_read( fd, p, len ) < len )
            return -1;
        *(p+len) = 0;
    }
    
    char tmpBUf[4096];
#ifdef CACHE_RESP_HEADER
    if (getHeader().m_valPart1Len < 4096 ) //< 4K
    {
        if ( nio_read( fd, tmpBUf, getHeader().m_valPart1Len ) < getHeader().m_valPart1Len )
            return -1;
        
        m_sRespHeader.append(tmpBUf, getHeader().m_valPart1Len);
    }
#endif

    //load part3 to buffer
    int part3offset = getHeaderSize() + getContentTotalLen();
    if ( nio_lseek( fd, part3offset, SEEK_SET ) != -1 )
    {
        while((len = nio_read( fd, tmpBUf, 4096 )) > 0)
            m_sPart3Buf.append(tmpBUf, len);
    }
    
    return 0;

}
const char * FileCacheDataEx::getCacheData(
    off_t offset, off_t& wanted, char *pBuf, long len )
{
    if ( isCached() )
    {
        if ( offset > m_lSize )
        {
            wanted = 0;
            return pBuf;
        }
        if ( wanted > m_lSize - offset )
            wanted = m_lSize - offset;
        return m_pCache + offset;
    }
    else
    {
        assert( m_fd != -1 );
        off_t off = nio_lseek( m_fd, offset, SEEK_SET );
/*        if ( D_ENABLED( DL_MORE ))
            LOG_D(( "lseek() return %d", (int)off ));*/
        if ( off == offset )
        {
            wanted = nio_read( m_fd, pBuf, len );
        }
        else
        {
            wanted = -1;
        }
        return pBuf;
    }

}
int DirHashCacheEntry::saveCeHeader()
{
    int fd = getFdStore();
    if ( fd == -1 )
    {
        errno = EBADF;
        return -1;
    }
    if ( nio_lseek( fd, getStartOffset(), SEEK_SET ) == -1 )
        return -1;
    char achBuf[4 + sizeof( CeHeader ) ];
    //*( int *)achBuf = CE_ID;
    memcpy(achBuf, CE_ID, 4);
    memmove( &achBuf[4], &getHeader(), sizeof( CeHeader ) );
    if ( (size_t)nio_write( fd, achBuf, 4 + sizeof( CeHeader ) ) < 
                4 + sizeof( CeHeader ) )
        return -1;
    if ( getHeader().m_keyLen > 0 )
    {
        if ( nio_write( fd, getKey().c_str(), getHeader().m_keyLen ) < 
                getHeader().m_keyLen )
            return -1;
    }
    return 0;
}