⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 davxml.cpp

📁 Windows CE 6.0 Server 源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -