Leaked source code of windows server 2003
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.
 
 
 
 
 
 

157 lines
3.8 KiB

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// S H L K M G R . C P P
//
// HTTP 1.1/DAV 1.0 request handling via ISAPI
//
// This file contains the CSharedLockMgr class that handles the shared
// memory mapped file implementation of the lock cache. It is used by
// HTTPEXT only.
//
// Copyright 2000 Microsoft Corporation, All Rights Reserved
//
#include <_davfs.h>
#include <xlock.h>
#include "_shlkmgr.h"
HRESULT HrGetUsableHandle(HANDLE hFile, DWORD dwProcessID, HANDLE * phFile)
{
HRESULT hr = S_OK;
HANDLE hFileT;
Assert(phFile);
*phFile = NULL;
{
safe_revert_self s;
auto_handle<HANDLE> a_hProcT;
a_hProcT = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessID);
if (NULL == a_hProcT.get())
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto ret;
}
if (!DuplicateHandle(a_hProcT.get(),
hFile,
GetCurrentProcess(),
&hFileT,
0,
FALSE,
DUPLICATE_SAME_ACCESS))
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto ret;
}
}
*phFile = hFileT;
ret:
return hr;
}
// ========================================================================
// CLASS CSharedLockMgr (Public Functions - inherited from ILockCache)
// =========================================================================
//
// Print out all lock token information for locks of this type on this resource.
// If the fEmitXML is false, just return if there are any locks.
//
BOOL CSharedLockMgr::FGetLockOnError( IMethUtil * pmu,
LPCWSTR pwszResource,
DWORD dwLockType,
BOOL fEmitXML,
CXMLEmitter * pemitter,
CXNode * pxnParent)
{
BOOL fRet = FALSE;
HRESULT hr = S_OK;
CEmitterNode enLockDiscovery;
DWORD dw = 0;
DWORD dwLocksFound = 0;
auto_co_task_mem<SNewLockData> a_pNewLockDatas;
auto_co_task_mem<LPWSTR> a_ppwszLockTokens;
{
safe_revert sr(pmu->HitUser());
hr = m_pFileHandleCache->HrGetAllLockDataForName(pwszResource,
dwLockType,
&dwLocksFound,
a_pNewLockDatas.load(),
a_ppwszLockTokens.load());
if (FAILED(hr))
{
goto ret;
}
}
if (fEmitXML)
{
for (dw = 0; dw < dwLocksFound; dw++)
{
// Construct the 'DAV:lockdiscovery' node
//
hr = enLockDiscovery.ScConstructNode (*pemitter, pxnParent, gc_wszLockDiscovery);
if (FAILED(hr))
{
goto ret;
}
// Add the 'DAV:activelock' property for this plock.
//$HACK:ROSEBUD_TIMEOUT_HACK
// For the bug where rosebud waits until the last second
// before issueing the refresh. Need to filter out this check with
// the user agent string. The hack is to increase the timeout
// by 30 seconds and return the actual timeout. So we
// need the ecb/pmu to findout the user agent. At this point
// we do not know. So we pass NULL. If we remove this
// hack ever (I doubt if we can ever do that), then
// change the interface of ScLockDiscoveryFromSNewLockData.
//
hr = ScLockDiscoveryFromSNewLockData(pmu,
*pemitter,
enLockDiscovery,
a_pNewLockDatas.get() + dw,
*(a_ppwszLockTokens.get() + dw));
//$HACK:END ROSEBUD_TIMEOUT_HACK
//
if (FAILED(hr))
{
goto ret;
}
hr = enLockDiscovery.ScDone();
if (FAILED(hr))
{
goto ret;
}
}
}
fRet = (0 != dwLocksFound);
ret:
if (dwLocksFound)
{
for (dw = 0; dw < dwLocksFound; dw++)
{
SNewLockData * pnld = a_pNewLockDatas.get() + dw;
CoTaskMemFree(pnld->m_pwszResourceString);
CoTaskMemFree(pnld->m_pwszOwnerComment);
CoTaskMemFree(*(a_ppwszLockTokens.get() + dw));
}
}
return fRet;
}