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

📄 webdav.h

📁 Windows CE 6.0 Server 源码
💻 H
📖 第 1 页 / 共 2 页
字号:
	}

	// Is file locked and if so, do we have tokens corresponding to it?
	BOOL CheckLockTokens(void)       { 
		return (m_nLockTokens && IsGLELocked()); 
	}

	BOOL SetMultiStatusResponse(void) { return SetStatusAndXMLBody(STATUS_MULTISTATUS); }
	BOOL SetMultiStatusErrorFromDestinationPath(RESPONSESTATUS rs, WIN32_FIND_DATA *pFindData, WCHAR *szDirectory, BOOL fRootDir, PCSTR szRootURL=NULL,BOOL fSkipFileMunge=FALSE);
	BOOL SetMultiStatusErrorFromURL(RESPONSESTATUS rs, PCSTR szRootURL);

	BOOL GetDepth(DEPTH_TYPE depthDefault=DEPTH_INFINITY);
	void GetOverwrite(void);
	BOOL AddContentLocationHeaderIfNeeded(void);
	BOOL AddContentLocationHeader(void);

	BOOL BuildBaseURLFromSourceURL(BOOL fHttpHeader=FALSE);
	BOOL BuildBaseURL(PCSTR szRoot, BOOL fHttpHeader, BOOL fAppendSlash);
	BOOL SetHREFTagFromDestinationPath(WIN32_FIND_DATA *pFindData, WCHAR *szDirectory, BOOL fRootDir, PCSTR szRootURL=NULL, BOOL fSkipFileMunge=FALSE);
	BOOL RecursiveVisitDirs(WCHAR *szPath, DWORD dwContext, PFN_RECURSIVE_VISIT pfnVisit, BOOL fDeferDirectoryProcess);

	BOOL DavGetFileAttributesEx(void);
	BOOL SendLockErrorInfoIfNeeded(WCHAR *szPath);
	void SendLockedConflictOrErr(WCHAR *szPath, WCHAR *szAlternatPath=NULL);

	// ******************************************************
	// Routines tightly bound to VERB implementation
	// ******************************************************

	// PROPFIND
public:
	BOOL SendProperties(DWORD dwDavPropFlags,BOOL fSendNamesOnly);
	BOOL AddUnknownXMLElement(const WCHAR *wszTagName, const DWORD ccTagName);
private:
	BOOL SendSubsetOfProperties(void);

	// PROPPATCH
	BOOL SendPropPatchResponse(RESPONSESTATUS rs);
	BOOL SendUnknownXMLElementsIfNeeded(RESPONSESTATUS rs);

	// OPTIONS
	void WriteSupportedVerb(VERB v, BOOL fFirstVerbInList=FALSE);
	void WritePublicOptions(void);

	// PROPPUT
	BOOL WriteBodyToFile(HANDLE hFile, BOOL fChunked);
	BOOL ReadNextBodySegment(PSTR szBuf, DWORD *pcbRead);

	// DELETE
	BOOL DeleteCollection(WCHAR *szPath, CHAR *szURL);

	// MOVE+COPY
	BOOL MoveCopyResource(BOOL fDeleteSrc);
	PSTR GetDestinationHeader(PSTR *ppszDestinationPrefix, PSTR *ppszDestinationURL, PSTR *ppszSave);
	BOOL HasAccessToDestVRoot(CHAR *szDestURL, WCHAR *szPath, PVROOTINFO pVRoot);
	BOOL MoveCopyCollection(CMoveCopyContext *pcContext);
	BOOL MoveCopyFile(BOOL fDeleteSrc, WCHAR *wszSrcPath, WCHAR *wszDestPath);

	// LOCK+UNLOCK
	BOOL CheckIfHeaders(void);
	BOOL CheckLockHeader(void);
	__int64 CheckLockTokenHeader(void);
	BOOL CheckTokenExpression(PSTR szToken, WCHAR *szPath);
	BOOL CheckETagExpression(PSTR szToken, WCHAR *szPath);
	BOOL SendLockTags(CWebDavFileNode *pLockedNode, BOOL fPrintPropTag=TRUE);

	BOOL GetLockTimeout(DWORD *pdwTimeout);

	// When building up URLs based on current, do we do http:// or https:// ?
	PCSTR GetHttpPrefix()     { return m_pRequest->IsSecure() ? cszHttpsPrefix : cszHttpPrefix ; }
	DWORD GetHttpPrefixLen()  { return m_pRequest->IsSecure() ? ccHttpsPrefix  : ccHttpPrefix; }

	BOOL  IsContentTypeXML(void);
	BOOL  HasServerReadAllData(void) { return (m_pRequest->m_bufRequest.Count() == m_pRequest->m_dwContentLength); }
	
	RESPONSESTATUS VerifyXMLBody(void);
	BOOL ParseXMLBody(ISAXContentHandler *pParser, BOOL fSetDefaultStatus=TRUE);

	BOOL SetHREFTag(PCSTR szURL=NULL);
	BOOL SetResponseTag(PCSTR szURL, RESPONSESTATUS rs);

	// Wrap filesystem calls in event we need to unlock
	BOOL DavDeleteFile(WCHAR *szFile);

public:
	CWebDav(CHttpRequest *pRequest) : m_bufResp(pRequest) {
		m_pRequest = pRequest;

		if (pRequest->m_dwFileAttributes == (-1))
			m_rt = RT_NULL;
		else if (IsDirectory(pRequest->m_dwFileAttributes))
			m_rt = RT_COLLECTION;
		else
			m_rt = RT_DOCUMENT;

		m_Depth           = DEPTH_UNKNOWN;
		m_ccHostName      = 0;
		m_fSetStatus      = FALSE;
		m_fXMLBody        = FALSE;
		m_nLockTokens     = 0;
		m_fRetrievedFileAttribs = FALSE;
		m_Overwrite = OVERWRITE_YES;

		m_dwPropPatchUpdate = 0;
	}

	~CWebDav() {
		;
	}

	void SetStatus(DWORD dw) {
		m_pRequest->m_rs = (RESPONSESTATUS) dw;
		m_fSetStatus = TRUE;
	}
	BOOL SetStatusAndXMLBody(RESPONSESTATUS rs);

	BOOL FinalizeMultiStatusResponse(void);

	void FinalConsistencyCheck(BOOL fCodeReturnedToWebServer) {
#if defined (DEBUG)
		m_bufResp.FinalBufferConsistencyCheck();

		// If we're not using multistatus XML response, then nothing 
		// better have written to the buffer (data isn't flushed in this case).
		if (!m_fXMLBody)
			DEBUGCHK(m_bufResp.IsEmpty());

		// If we return TRUE to HTTPD, then we better be a 2XX status code.
		// Similiarly, if we return FALSE we better not be a 2XX status.
		DEBUG_CHECK_ERRCODE(fCodeReturnedToWebServer);
#endif
	}

	// Simple accessors
	BOOL IsCollection(void)  { return (m_rt==RT_COLLECTION); }
	BOOL IsDocument(void)    { return (m_rt==RT_DOCUMENT);   }
	BOOL IsNull(void)        { return (m_rt==RT_NULL);       }
	BOOL HasBody(void)       { return (m_pRequest->m_dwContentLength != 0) ; }

	// recursive directory helpers
	BOOL SendPropertiesVisitFcn(WIN32_FIND_DATA *pFindData, DWORD dwContext, WCHAR *szPhysicalPath, BOOL fRootDir);
	BOOL SendPropertyNamesVisitFcn(WIN32_FIND_DATA *pFindData, DWORD dwContext, WCHAR *szTraversalPath, BOOL fRootDir);
	BOOL DeleteVisitFcn(WIN32_FIND_DATAW *pFindData, DWORD dwContext, WCHAR *szPath, BOOL fIsRoot);
	BOOL MoveCopyVisitFcn(WIN32_FIND_DATAW *pFindData, DWORD dwContext, WCHAR *szPath, BOOL fIsRoot);

	// shared mode

	// HTTP VERB handeler routines
	// These functions return TRUE if they returned everything they needed
	// to to client, FALSE if they've set an error code that HandleRequest needs to 
	// process and send back.
	
	BOOL DavUnsupported(void);
	BOOL DavOptions(void);
	BOOL DavPut(void);
	BOOL DavMove(void);
	BOOL DavCopy(void);
	BOOL DavDelete(void);
	BOOL DavMkcol(void);
	BOOL DavPropfind(void);
	BOOL DavProppatch(void);
//	BOOL DavSearch(void);
	BOOL DavLock(void);
	BOOL DavUnlock(void);

#if 0
	BOOL DavSubscribe(void)
	BOOL DavUnsubscribe(void);
	BOOL DavPoll(void);
	BOOL DavBDelete(void);
	BOOL DavBCopy(void);
	BOOL DavBMove(void);
	BOOL DavBProppatch(void);
	BOOL DavBPropfind(void);
	BOOL DavX_MS_Enumatts(void);
#endif // 0

	//
	// Functions to process SAX data of selected nodes.  The functions return
	// HRESULTs because the value is directly returned to the SAX processor.
	//
	HRESULT ProcessWin32FileAttribs(SVSSimpleBuffer *pBuf);

	BOOL IsFileNameTooLongForFilesys(const WCHAR *szFile) {
		return (wcslen(szFile) > (MAX_PATH-1));
	}

	BOOL IsSrcFileNameLenTooLong(void) {
		return IsFileNameTooLongForFilesys(m_pRequest->m_wszPath);
	}

	BOOL IsFileLocked(const WCHAR *szPath);

	// When directory is non-empty, then deleting a file recursively failed, which means
	// that it set the error for us.
	BOOL SendErrorOnRemoveDirectoryFailure(void) {
		return (GetLastError() != ERROR_DIR_NOT_EMPTY);
	}
};


//
//  Utility functions
//

void GetEndOfFileWithNoSlashes(PSTR *ppszStart, PSTR *ppszSave, CHAR *pcSave);
PSTR SkipHTTPPrefixAndHostName(PSTR szURL);
BOOL IsPathSubDir(WCHAR *szSrc, DWORD ccSrc, WCHAR *szDest, DWORD ccDest);
void GetCurrentFileTime(FILETIME *pft);
void BuildFileName(WCHAR *szWriteBuf, WCHAR *szPath, WCHAR *szFileName);


BOOL SetEmptyTagWin32NS(CXMLBuffer *pBuffer, PCSTR pszElement, DWORD ccElement);
BOOL SetTagWin32NS(CXMLBuffer *pBuffer, PCSTR pszName, DWORD ccName, PCSTR szValue);

//
// DAV constant strings and #defines
//

// DAV XML strings
extern const CHAR  cszXMLVersionA[];
extern const DWORD ccXMLVersionA;
extern const CHAR  cszMultiStatusNS[];
extern const DWORD ccMultiStatusNS;
extern const CHAR  cszMultiStatus[];
extern const DWORD ccMultiStatus;
extern const CHAR  cszResponse[];
extern const DWORD ccResponse;
extern const CHAR  cszHref[];
extern const DWORD ccHref;
extern const CHAR  cszPropstat[];
extern const DWORD ccPropstat;
extern const CHAR  cszProp[];
extern const DWORD ccProp;
extern const CHAR  cszPropNS[];
extern const DWORD ccPropNS;
extern const CHAR  cszStatus[];
extern const DWORD ccStatus;
extern const CHAR  cszGetcontentLengthNS[];
extern const DWORD ccGetcontentLengthNS;
extern const CHAR  cszGetcontentLength[];
extern const DWORD ccGetcontentLength;
extern const CHAR  cszDisplayName[];
extern const DWORD ccDisplayName;
extern const CHAR  cszCreationDateNS[];
extern const DWORD ccCreationDateNS;
extern const CHAR  cszCreationDate[];
extern const DWORD ccCreationDate;
extern const CHAR  cszGetETag[];
extern const DWORD ccGetETag;
extern const CHAR  cszLastModifiedNS[];
extern const DWORD ccLastModifiedNS;
extern const CHAR  cszLastModified[];
extern const DWORD ccLastModified;
extern const CHAR  cszResourceType[];
extern const DWORD ccResourceType;
extern const CHAR  cszCollection[];
extern const DWORD ccCollection;
extern const CHAR  cszIsHiddenNS[];
extern const DWORD ccIsHiddenNS;
extern const CHAR  cszIsHidden[];
extern const DWORD ccIsHidden;
extern const CHAR  cszIsCollectionNS[];
extern const DWORD ccIsCollectionNS;
extern const CHAR  cszIsCollection[];
extern const DWORD ccIsCollection;
extern const CHAR  cszTextXML[];
extern const DWORD ccTextXML;
extern const CHAR  cszApplicationXML[];
extern const DWORD ccApplicationXML;
extern const CHAR  cszGetcontentType[];
extern const DWORD ccGetcontentType;

extern const CHAR  cszSupportedLock[];
extern const DWORD ccSupportedLock;
extern const CHAR  cszLockEntry[];
extern const DWORD ccLockEntry;

extern const CHAR  cszMSNamespace[];
extern const DWORD ccMSNamespace;
extern const CHAR  cszWin32FileAttribs[];
extern const DWORD ccWin32FileAttribs;
extern const CHAR  cszWin32LastAccessTime[];
extern const DWORD ccWin32LastAccessTime;
extern const CHAR  cszWin32LastModifiedTime[];
extern const DWORD ccWin32LastModifiedTime;
extern const CHAR  cszWin32CreationTime[];
extern const DWORD ccWin32CreationTime;

// LOCK XML strings
extern const CHAR  cszLockDiscovery[];
extern const DWORD ccLockDiscovery;
extern const CHAR  cszActiveLock[];
extern const DWORD ccActiveLock;
extern const CHAR  cszLockType[];
extern const DWORD ccLockType;
extern const CHAR  cszWrite[];
extern const DWORD ccWrite;
extern const CHAR  cszLockScope[];
extern const DWORD ccLockScope;
extern const CHAR  cszShared[];
extern const DWORD ccShared;
extern const CHAR  cszExclusive[];
extern const DWORD ccExclusive;
extern const CHAR  cszLockTokenTag[];
extern const DWORD ccLockTokenTag;
extern const CHAR  cszOwner[];
extern const DWORD ccOwner;
extern const CHAR  cszTimeoutTag[];
extern const DWORD ccTimeoutTag;
extern const CHAR  cszDepthTag[];
extern const DWORD ccDepthTag;

extern const CHAR  cszSecond[];
extern const DWORD ccSecond;
extern const CHAR  cszInfinite[];
extern const DWORD ccInfinite;

extern const CHAR  cszNot[];
extern const DWORD ccNot;


// DAV header data
extern const CHAR  csz0[];
extern const DWORD cc0;
extern const CHAR  csz1[];
extern const DWORD cc1;
extern const CHAR  cszInfinity[];
extern const DWORD ccInfinity;
extern const CHAR  csz1NoRoot[];
extern const DWORD cc1NoRoot;


// DAV properties that can be requested on PROPFIND
#define  DAV_PROP_CONTENT_LENGTH        0x00000001
#define  DAV_PROP_CREATION_DATE         0x00000002
#define  DAV_PROP_DISPLAY_NAME          0x00000004
#define  DAV_PROP_GET_ETAG              0x00000008
#define  DAV_PROP_GET_LAST_MODIFIED     0x00000010
#define  DAV_PROP_RESOURCE_TYPE         0x00000020
#define  DAV_PROP_SUPPORTED_LOCK        0x00000040
#define  DAV_PROP_IS_HIDDEN             0x00000080
#define  DAV_PROP_IS_COLLECTION         0x00000100
#define  DAV_PROP_LOCK_DISCOVERY        0x00000200
#define  DAV_PROP_GET_CONTENT_TYPE      0x00000400
#define  DAV_PROP_W32_FILE_ATTRIBUTES   0x00000800
#define  DAV_PROP_W32_CREATION_TIME     0x00001000
#define  DAV_PROP_W32_LAST_ACCESS_TIME  0x00002000
#define  DAV_PROP_W32_LAST_MODIFY_TIME  0x00004000
#define  DAV_PROP_ALL                   0xFFFFFFFF


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -