2009年12月18日 星期五

Enumeration of the Internet cache - CuUrlCacheEntry

// Enumeration of the Internet cache.

CuUrlCacheEntry UrlCacheEntry;
UrlCacheEntry.ProcessEnumCacheEntry();

INTERNET_CACHE_ENTRY_INFO* lpEntry = NULL;
for( int i = 0 ; i < UrlCacheEntry.size() ; i++ )
{
    lpEntry = UrlCacheEntry.at(i);
}

// CuUrlCacheEntry.h

class CuUrlCacheEntry
{
    HANDLE m_hEnumHandle;
    vector<INTERNET_CACHE_ENTRY_INFO*> m_vecCacheEntryInfo;

public:
    CuUrlCacheEntry(void);
    ~CuUrlCacheEntry(void);

    UINT size(){ return m_vecCacheEntryInfo.size(); };
    INTERNET_CACHE_ENTRY_INFO* at(UINT i){ return m_vecCacheEntryInfo.at(i); };

public:
    void ProcessEnumCacheEntry();

private:
    HANDLE FindFirstEntry( LPCTSTR lpszUrlSearchPattern,  LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo, LPDWORD lpcbCacheEntryInfo );
    BOOL FindNextEntry( LPINTERNET_CACHE_ENTRY_INFO lpNextCacheEntryInfo, LPDWORD lpcbCacheEntryInfo );
    BOOL FindCloseUrlCache();

    void Clear();
    BOOL CacheFirstEntry();
    BOOL CacheNextEntry();

};


// CuUrlCacheEntry.cpp

CuUrlCacheEntry::CuUrlCacheEntry(void)
:m_hEnumHandle(NULL)
{
}

CuUrlCacheEntry::~CuUrlCacheEntry(void)
{
    FindCloseUrlCache();
    this->Clear();
}

void CuUrlCacheEntry::ProcessEnumCacheEntry()
{

    BOOL bResult = CacheFirstEntry();
    if( bResult == FALSE )
        return;
    do 
    {
        bResult = CacheNextEntry();
    } while (bResult);

    FindCloseUrlCache();
}



HANDLE CuUrlCacheEntry::FindFirstEntry( LPCTSTR lpszUrlSearchPattern,  LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo, LPDWORD lpcbCacheEntryInfo )
{
    FindCloseUrlCache();
    this->Clear();

    m_hEnumHandle = ::FindFirstUrlCacheEntry(lpszUrlSearchPattern, lpFirstCacheEntryInfo, lpcbCacheEntryInfo );
    return m_hEnumHandle;
}


BOOL CuUrlCacheEntry::FindNextEntry( LPINTERNET_CACHE_ENTRY_INFO lpNextCacheEntryInfo, LPDWORD lpcbCacheEntryInfo )
{
    return ::FindNextUrlCacheEntry(m_hEnumHandle, lpNextCacheEntryInfo, lpcbCacheEntryInfo  );
}


BOOL CuUrlCacheEntry::FindCloseUrlCache( )
{
    BOOL bResult = ::FindCloseUrlCache( m_hEnumHandle );
    m_hEnumHandle = NULL;
    return bResult;
}

void CuUrlCacheEntry::Clear()
{

    TCHAR* szBuffer = NULL;
    vector<INTERNET_CACHE_ENTRY_INFO*>::iterator iter;
    for( iter = m_vecCacheEntryInfo.begin() ; iter < m_vecCacheEntryInfo.end() ; iter++)
    {
        szBuffer = (TCHAR*)(*iter);
        delete [] szBuffer;
    }

    m_vecCacheEntryInfo.clear();

}

BOOL CuUrlCacheEntry::CacheFirstEntry()
{

    DWORD dwEntrySize = 0;

    BOOL bResult = (BOOL)FindFirstEntry(NULL, NULL, &dwEntrySize);
    if( (GetLastError() == ERROR_INSUFFICIENT_BUFFER) )
    {   
        INTERNET_CACHE_ENTRY_INFO * lpEntry = (INTERNET_CACHE_ENTRY_INFO * )new TCHAR[dwEntrySize];
        bResult = (BOOL)FindFirstEntry(NULL, lpEntry, &dwEntrySize);
        m_vecCacheEntryInfo.push_back(lpEntry);
    }

    return bResult;
}

BOOL CuUrlCacheEntry::CacheNextEntry()
{

    DWORD dwEntrySize = 0;

    BOOL bResult = (BOOL)FindNextEntry(NULL, &dwEntrySize);
    if( (GetLastError() == ERROR_INSUFFICIENT_BUFFER) )
    {   
        INTERNET_CACHE_ENTRY_INFO * lpEntry = (INTERNET_CACHE_ENTRY_INFO * )new TCHAR[dwEntrySize];
        bResult = FindNextEntry(lpEntry, &dwEntrySize);
        m_vecCacheEntryInfo.push_back(lpEntry);
    }

    return bResult;
}


沒有留言:

張貼留言