📄 davxml.cpp
字号:
case PROPFIND_STATE_CONTENT_TYPE:
m_dwDavProperties |= DAV_PROP_GET_CONTENT_TYPE;
m_State = PROPFIND_STATE_PROP;
break;
case DAV_STATE_UNRECOGNIZED_TAG:
RestoreUnknownTagState();
break;
default:
DEBUGCHK(0);
return E_FAIL;
break;
}
return fRet ? S_OK : E_FAIL;
}
//
// PROPPATCH
//
const CHAR cszPropertyUpdate[] = "propertyupdate";
const DWORD ccPropertyUpdate = SVSUTIL_CONSTSTRLEN(cszPropertyUpdate);
const CHAR cszSet[] = "set";
const DWORD ccSet = SVSUTIL_CONSTSTRLEN(cszSet);
// const WCHAR cszRemove[] = "remove";
HRESULT STDMETHODCALLTYPE CPropPatchParse::startElement(const wchar_t * pwchNamespaceUri, int cchNamespaceUri, const wchar_t * pwchLocalName,
int cchLocalName, const wchar_t * pwchQName, int cchQName, ISAXAttributes * pAttributes) {
m_Chars.Reset();
CHAR szLocalName[LOCAL_NAME_SIZE];
if (! ConvertXMLTagToANSI(pwchLocalName,cchLocalName,szLocalName))
return E_FAIL;
switch (m_State) {
case DAV_STATE_UNKNOWN:
DebugOutUnknown();
return E_FAIL;
break;
case DAV_STATE_UNINITAILIZED:
if (! VerifyNS(NAMESPACE_DAV,pwchNamespaceUri,cchNamespaceUri) ||
! VerifyRequiredTag(cszPropertyUpdate,ccPropertyUpdate,szLocalName,cchLocalName))
return E_FAIL;
m_State = PROPPATCH_STATE_PROPERTYUPDATE;
break;
case PROPPATCH_STATE_PROPERTYUPDATE:
if (! VerifyNS(NAMESPACE_DAV,pwchNamespaceUri,cchNamespaceUri))
return E_FAIL;
if (TokensEqualAC(szLocalName,Set,cchLocalName))
m_State = PROPPATCH_STATE_SET;
// else if (TokensEqualAC(szLocalName,Remove,cchLocalName)) // remove currently unsupported
// m_State = PROPPATCH_STATE_REMOVE;
else {
DebugOutUnexpectedToken("set or remove",szLocalName,cchLocalName);
return E_FAIL;
}
break;
case PROPPATCH_STATE_SET:
if (! VerifyNS(NAMESPACE_DAV,pwchNamespaceUri,cchNamespaceUri) ||
! VerifyRequiredTag(cszProp,ccProp,szLocalName,cchLocalName))
return E_FAIL;
m_State = PROPPATCH_STATE_PROP;
break;
case PROPPATCH_STATE_PROP:
if (TokensEqualAC(szLocalName,Win32FileAttribs,cchLocalName)) {
m_pWebDav->m_dwPropPatchUpdate |= DAV_PROP_W32_FILE_ATTRIBUTES;
m_State = PROPPATCH_STATE_WIN32_FILE_ATTRIBS;
}
else if (TokensEqualAC(szLocalName,Win32LastModifiedTime,cchLocalName)) {
m_pWebDav->m_dwPropPatchUpdate |= DAV_PROP_W32_LAST_MODIFY_TIME;
m_State = PROPPATCH_STATE_WIN32_LAST_MODIFIED;
}
else if (TokensEqualAC(szLocalName,Win32CreationTime,cchLocalName)) {
m_pWebDav->m_dwPropPatchUpdate |= DAV_PROP_W32_CREATION_TIME;
m_State = PROPPATCH_STATE_WIN32_CREATION_TIME;
}
else if (TokensEqualAC(szLocalName,Win32LastAccessTime,cchLocalName)) {
m_pWebDav->m_dwPropPatchUpdate |= DAV_PROP_W32_LAST_ACCESS_TIME;
m_State = PROPPATCH_STATE_WIN32_LAST_ACCESS;
}
else {
DebugOutUnexpectedToken("Win32(FileAttributes, LastAccessTime, LastModifiedTime, CreationTime",szLocalName,cchLocalName);
if ((m_iUnknownDepth == 0) && !m_pWebDav->AddUnknownXMLElement(pwchQName,cchQName))
return E_FAIL;
SetUnknownTag();
}
break;
case PROPPATCH_STATE_WIN32_FILE_ATTRIBS:
DebugOutInvalidChild(cszWin32FileAttribs);
return E_FAIL;
break;
default:
DebugOutUnexpectedToken("???",szLocalName,cchLocalName);
// SetUnknownTag();
return E_FAIL;
break;
}
return S_OK;
}
HRESULT STDMETHODCALLTYPE CPropPatchParse::endElement(const wchar_t *pwchNamespaceUri, int cchNamespaceUri, const wchar_t *pwchLocalName,
int cchLocalName, const wchar_t *pwchQName, int cchQName) {
switch (m_State) {
case PROPPATCH_STATE_PROPERTYUPDATE:
m_State = DAV_STATE_UNKNOWN;
break;
case PROPPATCH_STATE_SET:
m_State = PROPPATCH_STATE_PROPERTYUPDATE;
break;
case PROPPATCH_STATE_PROP:
m_State = PROPPATCH_STATE_SET;
break;
case PROPPATCH_STATE_WIN32_LAST_MODIFIED:
case PROPPATCH_STATE_WIN32_CREATION_TIME:
case PROPPATCH_STATE_WIN32_LAST_ACCESS:
m_State = PROPPATCH_STATE_PROP;
break;
case PROPPATCH_STATE_WIN32_FILE_ATTRIBS:
if (! PrepareNonEmptyBuf())
return E_FAIL;
m_State = PROPPATCH_STATE_PROP;
return m_pWebDav->ProcessWin32FileAttribs(&m_Chars);
break;
case DAV_STATE_UNRECOGNIZED_TAG:
RestoreUnknownTagState();
break;
default:
DEBUGCHK(0);
return E_FAIL;
break;
}
return S_OK;
}
// Win32FileAttributes contains a 32 bit hex # (with no preceeding 0x)
#define WIN32_DATA_LEN (8*sizeof(WCHAR))
HRESULT CWebDav::ProcessWin32FileAttribs(SVSSimpleBuffer *pBuf) {
DWORD dwFileAttrib;
HRESULT hr = E_FAIL;
if (pBuf->uiNextIn != (WIN32_DATA_LEN+sizeof(WCHAR))) {
DEBUGMSG(ZONE_ERROR,(L"HTTPD: Dav request to set <Win32FileAttributes> failed, length=%d, should be %d\r\n",pBuf->uiNextIn,WIN32_DATA_LEN));
return E_FAIL;
}
if (1 != swscanf((WCHAR*)pBuf->pBuffer,L"%x",&dwFileAttrib)) {
DEBUGMSG(ZONE_ERROR,(L"HTTPD: Dav request to set <Win32FileAttributes> failed, cannot parse hex value\r\n"));
return E_FAIL;
}
DEBUGMSG(ZONE_WEBDAV_VERBOSE,(L"HTTPD: WebDav calls SetFileAttributes(%s,%d)\r\n",m_pRequest->m_wszPath,dwFileAttrib));
if (! SetFileAttributes(m_pRequest->m_wszPath,dwFileAttrib)) {
DEBUGMSG(ZONE_ERROR,(L"HTTPD: SetFileAttributes(%s,0x%08x) failed,GLE=0x%08x\r\n",m_pRequest->m_wszPath,dwFileAttrib,GetLastError()));
SetStatus(STATUS_CONFLICT);
return E_FAIL;
}
return S_OK;
}
//
// LOCK
//
const char cszLockInfoTag[] = "lockinfo";
const DWORD ccLockInfoTag = SVSUTIL_CONSTSTRLEN(cszLockInfoTag);
HRESULT STDMETHODCALLTYPE CLockParse::startElement(const wchar_t * pwchNamespaceUri, int cchNamespaceUri, const wchar_t * pwchLocalName,
int cchLocalName, const wchar_t * pwchQName, int cchQName, ISAXAttributes * pAttributes)
{
//if (m_iUnknownDepth == 0)
// m_Chars.Reset();
CHAR szLocalName[LOCAL_NAME_SIZE];
if (! ConvertXMLTagToANSI(pwchLocalName,cchLocalName,szLocalName))
return E_FAIL;
switch (m_State) {
case DAV_STATE_UNKNOWN:
DebugOutUnknown();
return E_FAIL;
break;
case DAV_STATE_UNINITAILIZED:
if (! VerifyNS(NAMESPACE_DAV,pwchNamespaceUri,cchNamespaceUri) ||
! VerifyRequiredTag(cszLockInfoTag,ccLockInfoTag,szLocalName,cchLocalName))
return E_FAIL;
m_State = LOCK_STATE_LOCKINFO;
break;
case LOCK_STATE_LOCKINFO:
if (! VerifyNS(NAMESPACE_DAV,pwchNamespaceUri,cchNamespaceUri))
return E_FAIL;
if (TokensEqualAC(szLocalName,LockScope,cchLocalName))
m_State = LOCK_STATE_LOCKSCOPE;
else if (TokensEqualAC(szLocalName,LockType,cchLocalName))
m_State = LOCK_STATE_LOCKTYPE;
else if (TokensEqualAC(szLocalName,Owner,cchLocalName)) {
DEBUGCHK(m_iUnknownDepth == 0);
m_iUnknownDepth = 1;
m_State = LOCK_STATE_OWNER;
}
else {
DebugOutUnexpectedToken("lockscope, locktype, or owner",szLocalName,cchLocalName);
return E_FAIL;
}
break;
case LOCK_STATE_LOCKSCOPE:
if (TokensEqualAC(szLocalName,Exclusive,cchLocalName))
m_State = LOCK_STATE_EXCLUSIVE;
else if (TokensEqualAC(szLocalName,Shared,cchLocalName))
m_State = LOCK_STATE_SHARED;
else {
DebugOutUnexpectedToken("shared or exclusive",szLocalName,cchLocalName);
return E_FAIL;
}
break;
case LOCK_STATE_LOCKTYPE:
if (! VerifyNS(NAMESPACE_DAV,pwchNamespaceUri,cchNamespaceUri) ||
! VerifyRequiredTag(cszWrite,ccWrite,szLocalName,cchLocalName))
return E_FAIL;
m_State = LOCK_STATE_WRITE;
break;
case LOCK_STATE_OWNER:
// Once we're in Owner state, record everything.
if ( ! WriteXMLTagToBuffer(pwchNamespaceUri, cchNamespaceUri, pwchLocalName,
cchLocalName, pwchQName, cchQName, pAttributes,TRUE))
return E_FAIL;
// After this point, any new name space mappings in <owner> will be added automatically
// because they are attributes of the nodes we run across.
m_fReadNameSpaceMap = FALSE;
m_iUnknownDepth++;
;
break;
default:
DebugOutUnexpectedToken("???",szLocalName,cchLocalName);
// SetUnknownTag();
return E_FAIL;
break;
}
return S_OK;
}
HRESULT STDMETHODCALLTYPE CLockParse::endElement(const wchar_t *pwchNamespaceUri, int cchNamespaceUri, const wchar_t *pwchLocalName,
int cchLocalName, const wchar_t *pwchQName, int cchQName)
{
switch (m_State) {
case LOCK_STATE_LOCKINFO:
m_State = DAV_STATE_UNKNOWN;
break;
case LOCK_STATE_LOCKSCOPE:
m_State = LOCK_STATE_LOCKINFO;
break;
case LOCK_STATE_LOCKTYPE:
m_State = LOCK_STATE_LOCKINFO;
break;
case LOCK_STATE_OWNER:
m_iUnknownDepth--;
DEBUGCHK(m_iUnknownDepth >= 0);
if (m_iUnknownDepth != 0) {
if ( ! WriteXMLTagToBuffer(pwchNamespaceUri, cchNamespaceUri, pwchLocalName,
cchLocalName, pwchQName, cchQName, NULL,FALSE))
return E_FAIL;
}
else {
// if (! PrepareNonEmptyBuf())
// return E_FAIL;
m_State = LOCK_STATE_LOCKINFO;
return (SetLockOwner() ? S_OK : E_FAIL);
}
break;
case LOCK_STATE_WRITE:
SetWriteLockType();
m_State = LOCK_STATE_LOCKTYPE;
break;
case LOCK_STATE_SHARED:
SetSharedLock();
m_State = LOCK_STATE_LOCKSCOPE;
break;
case LOCK_STATE_EXCLUSIVE:
SetExclusiveLock();
m_State = LOCK_STATE_LOCKSCOPE;
break;
case DAV_STATE_UNRECOGNIZED_TAG:
RestoreUnknownTagState();
break;
default:
DEBUGCHK(0);
return E_FAIL;
break;
}
return S_OK;
}
HRESULT STDMETHODCALLTYPE CLockParse::startPrefixMapping(const wchar_t __RPC_FAR *pwchPrefix, int cchPrefix,
const wchar_t __RPC_FAR *pwchUri, int cchUri)
{
if (!m_fReadNameSpaceMap)
return S_OK;
CNameSpaceMap *pTrav = m_NSList;
CNameSpaceMap *pNew = (CNameSpaceMap *)svsutil_GetFixed(m_NSDescr);
if (!pNew)
return E_FAIL;
while (pTrav) {
if (0 == wcsncmp(pwchPrefix,pTrav->m_szPrefix,cchPrefix)) {
// We've found the root node, now traverse down its children and add it to last spot.
while (pTrav->m_pChild)
pTrav = pTrav->m_pChild;
if (! pNew->Init(NULL,pwchUri)) {
svsutil_FreeFixed(pNew,m_NSDescr);
return E_FAIL;
}
pTrav->m_pChild = pNew;
return S_OK;
}
pTrav = pTrav->m_pNext;
}
// We're adding completly new Namespace prefix to the list.
if (! pNew->Init(pwchPrefix,pwchUri)) {
svsutil_FreeFixed(pNew,m_NSDescr);
return E_FAIL;
}
pNew->m_pNext = m_NSList;
m_NSList = pNew;
return S_OK;
}
HRESULT STDMETHODCALLTYPE CLockParse::endPrefixMapping(const wchar_t __RPC_FAR *pwchPrefix, int cchPrefix)
{
if (!m_fReadNameSpaceMap)
return S_OK;
CNameSpaceMap *pTrav = m_NSList;
CNameSpaceMap *pFollow = NULL;
while (pTrav) {
if (0 == wcsncmp(pwchPrefix,pTrav->m_szPrefix,cchPrefix)) {
if (pTrav->m_pChild) {
// Case where there are multiple URI's with same NS.
// Remove the last child in this case, but leave other elements alone.
while (pTrav->m_pChild) {
pFollow = pTrav;
pTrav = pTrav->m_pChild;
}
pFollow->m_pChild = NULL;
}
else {
// Case where this is the only NS entry, in which case remove it from the list.
if (pFollow) {
pFollow->m_pNext = pTrav;
}
else {
DEBUGCHK(pTrav == m_NSList);
m_NSList = pTrav->m_pNext;
}
}
pTrav->DeInit();
svsutil_FreeFixed(pTrav,m_NSDescr);
return S_OK;
}
pTrav = pTrav->m_pNext;
}
DEBUGCHK(0); // should always find element in the list.
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -