Windows NT 4.0 source code leak
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

/*++
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;