146 lines
3.6 KiB
C++
146 lines
3.6 KiB
C++
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
|
|
|
#include "precomp.hxx"
|
|
|
|
APPLICATION::~APPLICATION()
|
|
{
|
|
if (m_pFileWatcherEntry != NULL)
|
|
{
|
|
// Mark the entry as invalid,
|
|
// StopMonitor will close the file handle and trigger a FCN
|
|
// the entry will delete itself when processing this FCN
|
|
m_pFileWatcherEntry->MarkEntryInValid();
|
|
m_pFileWatcherEntry->StopMonitor();
|
|
m_pFileWatcherEntry = NULL;
|
|
}
|
|
|
|
if (m_pProcessManager != NULL)
|
|
{
|
|
m_pProcessManager->ShutdownAllProcesses();
|
|
m_pProcessManager->DereferenceProcessManager();
|
|
m_pProcessManager = NULL;
|
|
}
|
|
}
|
|
|
|
HRESULT
|
|
APPLICATION::Initialize(
|
|
_In_ APPLICATION_MANAGER* pApplicationManager,
|
|
_In_ LPCWSTR pszApplication,
|
|
_In_ LPCWSTR pszPhysicalPath
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DBG_ASSERT(pszPhysicalPath != NULL);
|
|
DBG_ASSERT(pApplicationManager != NULL);
|
|
DBG_ASSERT(pszPhysicalPath != NULL);
|
|
m_strAppPhysicalPath.Copy(pszPhysicalPath);
|
|
|
|
m_pApplicationManager = pApplicationManager;
|
|
|
|
hr = m_applicationKey.Initialize(pszApplication);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Finished;
|
|
}
|
|
|
|
if (m_pProcessManager == NULL)
|
|
{
|
|
m_pProcessManager = new PROCESS_MANAGER;
|
|
if (m_pProcessManager == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Finished;
|
|
}
|
|
|
|
hr = m_pProcessManager->Initialize();
|
|
if (FAILED(hr))
|
|
{
|
|
goto Finished;
|
|
}
|
|
}
|
|
|
|
if (m_pFileWatcherEntry == NULL)
|
|
{
|
|
m_pFileWatcherEntry = new FILE_WATCHER_ENTRY(pApplicationManager->GetFileWatcher());
|
|
if (m_pFileWatcherEntry == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Finished;
|
|
}
|
|
}
|
|
|
|
UpdateAppOfflineFileHandle();
|
|
|
|
Finished:
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
if (m_pFileWatcherEntry != NULL)
|
|
{
|
|
m_pFileWatcherEntry->DereferenceFileWatcherEntry();
|
|
m_pFileWatcherEntry = NULL;
|
|
}
|
|
|
|
if (m_pProcessManager != NULL)
|
|
{
|
|
m_pProcessManager->DereferenceProcessManager();
|
|
m_pProcessManager = NULL;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
APPLICATION::StartMonitoringAppOffline()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = m_pFileWatcherEntry->Create(m_strAppPhysicalPath.QueryStr(), L"app_offline.htm", this, NULL);
|
|
|
|
return hr;
|
|
}
|
|
|
|
VOID
|
|
APPLICATION::UpdateAppOfflineFileHandle()
|
|
{
|
|
STRU strFilePath;
|
|
PATH::ConvertPathToFullPath(L".\\app_offline.htm", m_strAppPhysicalPath.QueryStr(), &strFilePath);
|
|
APP_OFFLINE_HTM *pOldAppOfflineHtm = NULL;
|
|
|
|
if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(strFilePath.QueryStr()) && GetLastError() == ERROR_FILE_NOT_FOUND)
|
|
{
|
|
m_fAppOfflineFound = FALSE;
|
|
}
|
|
else
|
|
{
|
|
m_fAppOfflineFound = TRUE;
|
|
APP_OFFLINE_HTM *pNewAppOfflineHtm = new APP_OFFLINE_HTM(strFilePath.QueryStr());
|
|
|
|
DBG_ASSERT(pNewAppOfflineHtm != NULL);
|
|
|
|
if (pNewAppOfflineHtm->Load())
|
|
{
|
|
//
|
|
// loaded new app offline htm
|
|
//
|
|
pOldAppOfflineHtm = (APP_OFFLINE_HTM *)InterlockedExchangePointer((VOID**)&m_pAppOfflineHtm, pNewAppOfflineHtm);
|
|
|
|
//
|
|
// send shutdown signal to the app
|
|
//
|
|
if (m_pProcessManager != NULL)
|
|
{
|
|
m_pProcessManager->SendShutdownSignal();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pOldAppOfflineHtm != NULL)
|
|
{
|
|
pOldAppOfflineHtm->DereferenceAppOfflineHtm();
|
|
pOldAppOfflineHtm = NULL;
|
|
}
|
|
} |