mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
371 lines
8.1 KiB
371 lines
8.1 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
contain.hxx
|
|
|
|
Abstract:
|
|
|
|
contains class definitions for CONTAINER class objects.
|
|
|
|
Author:
|
|
|
|
Madan Appiah (madana) 28-Dec-1994
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
typedef struct _TREE_ENTRY {
|
|
struct _TREE_ENTRY *Left;
|
|
struct _TREE_ENTRY *Right;
|
|
DWORD Element;
|
|
} TREE_ENTRY, *LPTREE_ENTRY;
|
|
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Class that stores objects/elements in sorted order.
|
|
|
|
NOTE: sorted list is not protected by crit sect. The container
|
|
should be locked externally if it is accessed by multiple thread.
|
|
|
|
Private Member functions:
|
|
|
|
CompareElements : virtual function used to compare two objects.
|
|
|
|
FindFirstFromTree : returns the first object from the order list.
|
|
|
|
FindNextFromTree : returns the next element from the order list.
|
|
|
|
Public Member functions:
|
|
|
|
AddEntry : adds an object to the sorted list.
|
|
|
|
FindEntry : search for a given object.
|
|
|
|
DeleteEntry : Deletes an entry from the list.
|
|
|
|
FindFirst : returns the first object from the order list.
|
|
|
|
FindNext : returns the next element from the order list.
|
|
|
|
IsEmpty : returns TRUE if the list is empty, otherwise FALSE.
|
|
|
|
--*/
|
|
|
|
class SORTED_CONTAINER {
|
|
|
|
private:
|
|
|
|
LPTREE_ENTRY _RootEntry;
|
|
|
|
virtual INT CompareElements( DWORD Element1, DWORD Element2 );
|
|
|
|
BOOL
|
|
FindFirstFromTree(
|
|
LPTREE_ENTRY Root,
|
|
LPDWORD FirstElement
|
|
);
|
|
|
|
BOOL
|
|
FindNextFromTree(
|
|
LPTREE_ENTRY Root,
|
|
DWORD LastElement,
|
|
LPDWORD NextElement,
|
|
LPBOOL Last
|
|
);
|
|
|
|
public:
|
|
|
|
INLINE SORTED_CONTAINER( VOID );
|
|
|
|
BOOL AddEntry( DWORD NewElement );
|
|
BOOL FindEntry( DWORD Element, LPDWORD FoundElement );
|
|
VOID DeleteEntry( DWORD Element );
|
|
|
|
INLINE BOOL FindFirst( LPDWORD FirstElement );
|
|
INLINE BOOL FindNext( DWORD LastElement, LPDWORD NextElement );
|
|
|
|
INLINE BOOL IsEmpty( VOID );
|
|
};
|
|
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Drived class that stores URL objects in the UrlNames sorted order.
|
|
|
|
NOTE: sorted list is not protected by crit sect. The container
|
|
should be locked externally if it is accessed by multiple thread.
|
|
|
|
Private Member functions:
|
|
|
|
CompareElements : virtual function used to compare two URL objects.
|
|
|
|
Public Member functions:
|
|
|
|
AddEntry : adds an URL object to the sorted list.
|
|
|
|
FindEntry : search for an URL object.
|
|
|
|
DeleteEntry : deletes an URL entry from the list.
|
|
|
|
FindFirst : returns the first URL object from the order list.
|
|
|
|
FindNext : returns the next URL element from the order list.
|
|
|
|
IsEmpty : returns TRUE if the list is empty, otherwise FALSE.
|
|
|
|
--*/
|
|
class SORTED_BY_NAME_URL_CONTAINER : public SORTED_CONTAINER {
|
|
|
|
private:
|
|
|
|
virtual INT CompareElements( DWORD Element1, DWORD Element2 );
|
|
|
|
public:
|
|
|
|
INLINE BOOL AddEntry( LPURL_FILEMAP_ENTRY NewUrlEntry );
|
|
INLINE BOOL FindEntry(
|
|
LPURL_FILEMAP_ENTRY UrlEntry,
|
|
LPURL_FILEMAP_ENTRY *FoundUrlEntry );
|
|
|
|
INLINE VOID DeleteEntry( LPURL_FILEMAP_ENTRY UrlEntry );
|
|
|
|
INLINE BOOL FindFirst( LPURL_FILEMAP_ENTRY *FirstEntry );
|
|
INLINE BOOL FindNext(
|
|
LPURL_FILEMAP_ENTRY LastEntry,
|
|
LPURL_FILEMAP_ENTRY *NextEntry );
|
|
};
|
|
|
|
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Drived class that stores URL objects in the sorted SCORE order.
|
|
|
|
NOTE: sorted list is not protected by crit sect. The container
|
|
should be locked externally if it is accessed by multiple thread.
|
|
|
|
Private Member functions:
|
|
|
|
CompareElements : virtual function used to compare two URL objects.
|
|
|
|
Public Member functions:
|
|
|
|
AddEntry : adds an URL object to the sorted list.
|
|
|
|
FindEntry : search for an URL object.
|
|
|
|
DeleteEntry : deletes an URL entry from the list.
|
|
|
|
FindFirst : returns the first URL object from the order list.
|
|
|
|
FindNext : returns the next URL element from the order list.
|
|
|
|
IsEmpty : returns TRUE if the list is empty, otherwise FALSE.
|
|
|
|
--*/
|
|
class SORTED_BY_SCORE_URL_CONTAINER : public SORTED_CONTAINER {
|
|
|
|
private:
|
|
|
|
virtual INT CompareElements( DWORD Element1, DWORD Element2 );
|
|
|
|
public:
|
|
|
|
INLINE BOOL AddEntry( LPURL_FILEMAP_ENTRY NewUrlEntry );
|
|
INLINE BOOL FindEntry(
|
|
LPURL_FILEMAP_ENTRY UrlEntry,
|
|
LPURL_FILEMAP_ENTRY *FoundUrlEntry );
|
|
INLINE VOID DeleteEntry( LPURL_FILEMAP_ENTRY UrlEntry );
|
|
|
|
INLINE BOOL FindFirst( LPURL_FILEMAP_ENTRY *FirstEntry );
|
|
INLINE BOOL FindNext(
|
|
LPURL_FILEMAP_ENTRY LastEntry,
|
|
LPURL_FILEMAP_ENTRY *NextEntry );
|
|
};
|
|
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Class definition that manages the URL objects.
|
|
|
|
Private Member functions:
|
|
|
|
LockContainer : Locks object container.
|
|
|
|
UnlockContainer : Unlocks object container.
|
|
|
|
DeleteUrl : Deletes an url from cache.
|
|
|
|
ComputeUrlScore : Compute the score for an url.
|
|
|
|
LookupUrl : Retrieves URL info.
|
|
|
|
Public Member functions:
|
|
|
|
URL_CONTAINER : constructs an URL container.
|
|
|
|
~URL_CONTAINER : destructs an URL container.
|
|
|
|
GetStatus : Retrieve object status.
|
|
|
|
CleanupUrls : Deletes unused URLs and frees up file system cache
|
|
space.
|
|
|
|
CleanupAllUrls : Deletes all urls from cache. This member function is
|
|
invoked when the global persistent flag is set to FALSE.
|
|
|
|
AddUrl : Adds an URL to the container and copies the cache file.
|
|
|
|
UnlockUrl : Decrements the reference count.
|
|
|
|
GetUrlInfo : Get info of the specified url file.
|
|
|
|
SetUrlInfo : Set info of the specified url file.
|
|
|
|
CreateUrlFile : Creates a file in the cache path for the incoming url
|
|
to store.
|
|
|
|
--*/
|
|
class URL_CONTAINER {
|
|
|
|
private:
|
|
|
|
//
|
|
// Urls b-tree indexed on UrlNames.
|
|
//
|
|
SORTED_BY_NAME_URL_CONTAINER *_UrlsByName;
|
|
|
|
//
|
|
// memory mapped file url object storage.
|
|
//
|
|
MEMMAP_FILE *_UrlObjStorage;
|
|
|
|
//
|
|
// synchronize object.
|
|
//
|
|
CRITICAL_SECTION _ListAccessCritSect;
|
|
|
|
//
|
|
// full path name of the cache storage.
|
|
//
|
|
LPWSTR _CachePath;
|
|
|
|
//
|
|
// maximum allowed size of the cache.
|
|
//
|
|
LONGLONG _CacheLimit;
|
|
|
|
//
|
|
// current cache size.
|
|
//
|
|
LONGLONG _CacheSize;
|
|
|
|
//
|
|
// object status.
|
|
//
|
|
DWORD _Status;
|
|
|
|
VOID LockContainer( VOID ) {
|
|
EnterCriticalSection( &_ListAccessCritSect );
|
|
}
|
|
|
|
VOID UnlockContainer( VOID ) {
|
|
LeaveCriticalSection( &_ListAccessCritSect );
|
|
}
|
|
|
|
DWORD DeleteUrl( LPURL_FILEMAP_ENTRY UrlEntry );
|
|
|
|
VOID ComputeUrlScore(
|
|
LPURL_FILEMAP_ENTRY UrlEntry,
|
|
LONGLONG CurrentGmtTime );
|
|
|
|
LPURL_FILEMAP_ENTRY LookupUrl( LPCSTR UrlName );
|
|
|
|
public:
|
|
|
|
URL_CONTAINER( LPWSTR CachePath, LONGLONG CacheLimit );
|
|
~URL_CONTAINER( VOID );
|
|
|
|
DWORD GetStatus( VOID ) {
|
|
return( _Status );
|
|
};
|
|
|
|
//
|
|
// internal routines called by the cache management.
|
|
//
|
|
|
|
DWORD CleanupUrls( DWORD Factor );
|
|
DWORD CleanupAllUrls( VOID );
|
|
|
|
//
|
|
// external routines called by the cache APIs.
|
|
//
|
|
|
|
DWORD AddUrl(
|
|
LPCSTR UrlName,
|
|
LPCWSTR CacheFileName,
|
|
LONGLONG ExpireTime,
|
|
DWORD cbHeaders );
|
|
|
|
DWORD RetrieveUrl( LPCSTR UrlName,
|
|
LPWSTR FileName,
|
|
BOOL * IsExpired,
|
|
DWORD * pcbHeaders );
|
|
DWORD UnlockUrl( LPCSTR UrlName );
|
|
DWORD GetUrlInfo( LPCSTR UrlName, LPURL_INFO UrlInfo );
|
|
DWORD SetUrlInfo( LPCSTR UrlName, LPURL_INFO UrlInfo );
|
|
|
|
DWORD CreateUrlFile(
|
|
LPCSTR UrlName,
|
|
DWORD ExpectedSize,
|
|
LPWSTR FileName );
|
|
|
|
VOID GetCacheInfo( LPWSTR CachePath,
|
|
LONGLONG *CacheLimit ) {
|
|
LockContainer();
|
|
*CacheLimit = _CacheLimit;
|
|
wcscpy(CachePath, _CachePath);
|
|
UnlockContainer();
|
|
}
|
|
|
|
BOOL SetCacheLimit(
|
|
LPWSTR CachePath,
|
|
LONGLONG CacheLimit ) {
|
|
|
|
BOOL RetValue = FALSE;
|
|
|
|
LockContainer();
|
|
if( wcscmp(CachePath, _CachePath) == 0 ) {
|
|
_CacheLimit = CacheLimit;
|
|
RetValue = TRUE;
|
|
}
|
|
UnlockContainer();
|
|
|
|
return( RetValue );
|
|
}
|
|
};
|
|
|
|
//
|
|
// define strcutures that hold URL containers.
|
|
//
|
|
|
|
typedef URL_CONTAINER *LPURL_CONTAINER;
|
|
|
|
typedef struct _URL_CONTAINERS {
|
|
DWORD NumObjects;
|
|
LPURL_CONTAINER *UrlContainerObjs;
|
|
} URL_CONTAINERS, *LPURL_CONTAINERS;
|
|
|