/*-----------------------------------------------------------------------------
Microsoft Denali

Microsoft Confidential
Copyright 1997 Microsoft Corporation. All Rights Reserved.

Component: File/Application mapping

File: CFileApp.h

Owner: CGrant

File/Application mapping definition
-----------------------------------------------------------------------------*/

#ifndef _CFILEAPP_H
#define _CFILEAPP_H

// Includes -------------------------------------------------------------------
#include "applmgr.h"
#include "hashing.h"
#include "idhash.h"
#include "memcls.h"

#define    NUM_FILEAPP_HASHING_BUCKETS	17

/*****************************************************************************
Class:  CFileApplicationMap
Synopsis:   Maintains a database relating files to the applications that
            must be shut down if the file changes. The key for the hash table
            is the full file name
*/  
class CFileApplicationMap : public CHashTable
{
    // Flags
    DWORD m_fInited : 1;                // Are we initialized?
    DWORD m_fHashTableInited : 1;       // Need to UnInit hash table?
    DWORD m_fCriticalSectionInited : 1; // Need to delete CS?

    // Critical section for locking
    CRITICAL_SECTION m_csLock;

public:

    CFileApplicationMap();
    ~CFileApplicationMap();
    void Lock();
    void UnLock();
    HRESULT Init();
    HRESULT UnInit();
    HRESULT AddFileApplication(const TCHAR *pszFileName, CAppln *pAppln);
    BOOL ShutdownApplications(const TCHAR *pszFile);
};

inline void CFileApplicationMap::Lock()
    {
    Assert(m_fInited);
    EnterCriticalSection(&m_csLock);
    }
    
inline void CFileApplicationMap::UnLock()
    {
    Assert(m_fInited);
    LeaveCriticalSection( &m_csLock ); 
    }
    
/*****************************************************************************
Class:  CFileApplnList
Synopsis:   Maintains a list of applications that
            must be shut down if a file changes
*/
class CFileApplnList : public CLinkElem
{

friend class CFileApplicationMap;

    TCHAR*      m_pszFilename;
    CPtrArray   m_rgpvApplications; // the list of applications
    BOOL        m_fInited;          // flag indicating initialization

public:

    CFileApplnList();
    ~CFileApplnList();

    HRESULT Init(const TCHAR* pszFilename);
    HRESULT UnInit();

    HRESULT AddApplication(void *pApplication);
    HRESULT RemoveApplication(void *pApplication);
    VOID    GetShutdownApplications(CPtrArray *prgpapplnRestartList);

    // Cache on per-class basis
    ACACHE_INCLASS_DEFINITIONS()
};

/*===================================================================
  Globals
===================================================================*/

extern CFileApplicationMap    g_FileAppMap;

#endif // _CFILEAPP_H