Skip to content

Commit 097a970

Browse files
committed
added:webdav session
added:webdav lock packet and parse protocol support
1 parent 7c7aa22 commit 097a970

20 files changed

+543
-18
lines changed

XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ bool CConfig_Json::Config_Json_LoadBalance(LPCXSTR lpszConfigFile, XENGINE_LBCON
446446
st_Bucket.st_PermissionFlags.bCreateDir = st_JsonPermission["CreateDir"].asBool();
447447
st_Bucket.st_PermissionFlags.bRewrite = st_JsonPermission["Rewrite"].asBool();
448448
st_Bucket.st_PermissionFlags.bUPLimit = st_JsonPermission["UPLimit"].asBool();
449-
st_Bucket.st_PermissionFlags.bUPReady = st_JsonPermission["bUPReady"].asBool();
449+
st_Bucket.st_PermissionFlags.bUPReady = st_JsonPermission["UPReady"].asBool();
450450

451451
pSt_ServerConfig->st_LoadBalance.pStl_ListBucket->push_back(st_Bucket);
452452
}

XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp

Lines changed: 105 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer
521521
return true;
522522
}
523523
/********************************************************************
524-
函数名称:Protocol_StoragePacket_Propfind
524+
函数名称:Protocol_StoragePacket_WDPropfind
525525
函数功能:propfind协议打包处理函数
526526
参数.一:ptszMsgBuffer
527527
In/Out:Out
@@ -558,7 +558,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer
558558
意思:是否成功
559559
备注:
560560
*********************************************************************/
561-
bool CProtocol_StoragePacket::Protocol_StoragePacket_Propfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey)
561+
bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey)
562562
{
563563
Protocol_IsErrorOccur = false;
564564

@@ -651,4 +651,107 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_Propfind(XCHAR* ptszMsgBuff
651651
*pInt_MsgLen = m_XMLPrinter.CStrSize();
652652
memcpy(ptszMsgBuffer, m_XMLPrinter.CStr(), m_XMLPrinter.CStrSize());
653653
return true;
654+
}
655+
/********************************************************************
656+
函数名称:Protocol_StoragePacket_WDLock
657+
函数功能:webdav锁协议封装
658+
参数.一:ptszMsgBuffer
659+
In/Out:Out
660+
类型:字符指针
661+
可空:N
662+
意思:输出组好包的请求缓冲区
663+
参数.二:pInt_MsgLen
664+
In/Out:Out
665+
类型:整数型指针
666+
可空:N
667+
意思:输出缓冲区大小
668+
参数.三:pSt_WDLock
669+
In/Out:In
670+
类型:数据结构指针
671+
可空:N
672+
意思:输入要打包的信息
673+
返回值
674+
类型:逻辑型
675+
意思:是否成功
676+
备注:
677+
*********************************************************************/
678+
bool CProtocol_StoragePacket::Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock)
679+
{
680+
Protocol_IsErrorOccur = false;
681+
682+
if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen))
683+
{
684+
Protocol_IsErrorOccur = true;
685+
Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT;
686+
return false;
687+
}
688+
// 创建一个 XML 文档
689+
XMLDocument m_XMLDocument;
690+
// XML 声明
691+
XMLDeclaration* pSt_XMLDeclaration = m_XMLDocument.NewDeclaration(R"(xml version="1.0" encoding="utf-8")");
692+
m_XMLDocument.InsertFirstChild(pSt_XMLDeclaration);
693+
694+
// 根元素 <multistatus>
695+
XMLElement* pSt_XMLRoot = m_XMLDocument.NewElement("d:prop");
696+
pSt_XMLRoot->SetAttribute("xmlns:d", "DAV:");
697+
m_XMLDocument.InsertEndChild(pSt_XMLRoot);
698+
// 子元素 <lockdiscovery>
699+
XMLElement* pSt_XMLLockDiscovery = m_XMLDocument.NewElement("D:lockdiscovery");
700+
pSt_XMLRoot->InsertEndChild(pSt_XMLLockDiscovery);
701+
// 子元素 <activelock>
702+
XMLElement* pSt_XMLLockActive = m_XMLDocument.NewElement("D:activelock");
703+
pSt_XMLLockDiscovery->InsertEndChild(pSt_XMLLockActive);
704+
// 子元素 <locktype>
705+
XMLElement* pSt_XMLLockType = m_XMLDocument.NewElement("D:locktype");
706+
pSt_XMLLockActive->InsertEndChild(pSt_XMLLockType);
707+
if (1 == pSt_WDLock->byLockOP)
708+
{
709+
XMLElement* pSt_XMLLockWrite = m_XMLDocument.NewElement("D:write");
710+
pSt_XMLLockType->InsertEndChild(pSt_XMLLockWrite);
711+
}
712+
else if (2 == pSt_WDLock->byLockOP)
713+
{
714+
XMLElement* pSt_XMLLockRead = m_XMLDocument.NewElement("D:read");
715+
pSt_XMLLockType->InsertEndChild(pSt_XMLLockRead);
716+
}
717+
// 子元素 <lockscope>
718+
XMLElement* pSt_XMLLockScope = m_XMLDocument.NewElement("D:lockscope");
719+
pSt_XMLLockActive->InsertEndChild(pSt_XMLLockScope);
720+
if (1 == pSt_WDLock->byLockType)
721+
{
722+
XMLElement* pSt_XMLLockExclusive = m_XMLDocument.NewElement("D:exclusive");
723+
pSt_XMLLockScope->InsertEndChild(pSt_XMLLockExclusive);
724+
}
725+
else if (2 == pSt_WDLock->byLockType)
726+
{
727+
XMLElement* pSt_XMLLockShared = m_XMLDocument.NewElement("D:shared");
728+
pSt_XMLLockScope->InsertEndChild(pSt_XMLLockShared);
729+
}
730+
// 子元素 <depth>
731+
XMLElement* pSt_XMLDepth = m_XMLDocument.NewElement("D:depth");
732+
pSt_XMLDepth->SetText(_X("Infinity"));
733+
pSt_XMLLockActive->InsertEndChild(pSt_XMLDepth);
734+
// 子元素 <owner>
735+
XMLElement* pSt_XMLOwner = m_XMLDocument.NewElement("D:owner");
736+
pSt_XMLLockActive->InsertEndChild(pSt_XMLOwner);
737+
XMLElement* pSt_XMHRef = m_XMLDocument.NewElement("D:href");
738+
pSt_XMHRef->SetText(pSt_WDLock->tszOwner);
739+
pSt_XMLOwner->InsertEndChild(pSt_XMHRef);
740+
// 子元素 <timeout>
741+
XMLElement* pSt_XMLTimeout = m_XMLDocument.NewElement("D:timeout");
742+
pSt_XMLTimeout->SetText(pSt_WDLock->tszTimeout);
743+
pSt_XMLLockActive->InsertEndChild(pSt_XMLTimeout);
744+
// 子元素 <locktoken>
745+
XMLElement* pSt_XMLLockToken = m_XMLDocument.NewElement("D:locktoken");
746+
pSt_XMLLockActive->InsertEndChild(pSt_XMLLockToken);
747+
XMLElement* pSt_XMHTokenRef = m_XMLDocument.NewElement("D:href");
748+
pSt_XMHTokenRef->SetText(pSt_WDLock->tszToken);
749+
pSt_XMLLockToken->InsertEndChild(pSt_XMHTokenRef);
750+
// 将 XML 数据保存到字符串
751+
XMLPrinter m_XMLPrinter;
752+
m_XMLDocument.Print(&m_XMLPrinter);
753+
754+
*pInt_MsgLen = m_XMLPrinter.CStrSize();
755+
memcpy(ptszMsgBuffer, m_XMLPrinter.CStr(), m_XMLPrinter.CStrSize());
756+
return true;
654757
}

XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ class CProtocol_StoragePacket
2525
bool Protocol_StoragePacket_REQFile(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL, XNETHANDLE xhToken = 0);
2626
bool Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XNETHANDLE xhToken, XENGINE_ACTIONINFO* pSt_ActionInfo);
2727
public:
28-
bool Protocol_StoragePacket_Propfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey);
28+
bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey);
29+
bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
2930
};

XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,10 +545,88 @@ bool CProtocol_StorageParse::Protocol_StorageParse_Action(LPCXSTR lpszMsgBuffer,
545545
_tcsxcpy(pSt_ActionInfo->tszFileUrl, st_JsonRoot["tszFileUrl"].asCString());
546546
return true;
547547
}
548-
bool CProtocol_StorageParse::Protocol_StorageParse_Propfind(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_ACTIONINFO* pSt_ActionInfo)
548+
/********************************************************************
549+
函数名称:Protocol_StorageParse_WDLock
550+
函数功能:WEBDAV加锁协议解析函数
551+
参数.一:lpszMsgBuffer
552+
In/Out:In
553+
类型:常量字符指针
554+
可空:N
555+
意思:输入要解析的内容
556+
参数.二:nMsgLen
557+
In/Out:In
558+
类型:整数型
559+
可空:N
560+
意思:输入要解析的大小
561+
参数.三:pSt_WDLock
562+
In/Out:Out
563+
类型:数据结构指针
564+
可空:N
565+
意思:输出解析的数据
566+
返回值
567+
类型:逻辑型
568+
意思:是否成功
569+
备注:
570+
*********************************************************************/
571+
bool CProtocol_StorageParse::Protocol_StorageParse_WDLock(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock)
549572
{
550573
Protocol_IsErrorOccur = false;
551574

552-
575+
XMLDocument m_XMLDocument;
576+
XMLError m_XMLResult = m_XMLDocument.Parse(lpszMsgBuffer);
577+
if (XML_SUCCESS != m_XMLResult)
578+
{
579+
Protocol_IsErrorOccur = true;
580+
Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE;
581+
return false;
582+
}
583+
//获取根元素
584+
XMLElement* pSt_XMLRoot = m_XMLDocument.RootElement();
585+
if (NULL == pSt_XMLRoot)
586+
{
587+
Protocol_IsErrorOccur = true;
588+
Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_ROOT;
589+
return false;
590+
}
591+
//解析lockscope
592+
XMLElement* pSt_XMLLockScope = pSt_XMLRoot->FirstChildElement("D:lockscope");
593+
if (NULL != pSt_XMLLockScope)
594+
{
595+
XMLElement* pSt_XMLExclusive = pSt_XMLLockScope->FirstChildElement("D:exclusive");
596+
if (NULL != pSt_XMLExclusive)
597+
{
598+
pSt_WDLock->byLockType = 1;
599+
}
600+
XMLElement* pSt_XMLShared = pSt_XMLLockScope->FirstChildElement("D:shared");
601+
if (NULL != pSt_XMLShared)
602+
{
603+
pSt_WDLock->byLockType = 2;
604+
}
605+
}
606+
//解析locktype
607+
XMLElement* pSt_XMLLockType = pSt_XMLRoot->FirstChildElement("D:locktype");
608+
if (NULL != pSt_XMLLockType)
609+
{
610+
XMLElement* pSt_XMLTypeWrite = pSt_XMLLockType->FirstChildElement("D:write");
611+
if (NULL != pSt_XMLTypeWrite)
612+
{
613+
pSt_WDLock->byLockOP = 1;
614+
}
615+
XMLElement* pSt_XMLTypeRead = pSt_XMLLockType->FirstChildElement("D:read");
616+
if (NULL != pSt_XMLTypeRead)
617+
{
618+
pSt_WDLock->byLockOP = 2;
619+
}
620+
}
621+
// 解析owner
622+
XMLElement* pSt_XMLLockOwner = pSt_XMLRoot->FirstChildElement("D:owner");
623+
if (NULL != pSt_XMLLockOwner)
624+
{
625+
XMLElement* pSt_XMLHRef = pSt_XMLLockOwner->FirstChildElement("D:href");
626+
if (NULL != pSt_XMLHRef)
627+
{
628+
_tcsxcpy(pSt_WDLock->tszOwner, pSt_XMLHRef->GetText());
629+
}
630+
}
553631
return true;
554632
}

XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ class CProtocol_StorageParse
2525
bool Protocol_StorageParse_P2PToken(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken);
2626
bool Protocol_StorageParse_Action(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_ACTIONINFO* pSt_ActionInfo);
2727
public:
28-
bool Protocol_StorageParse_Propfind(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_ACTIONINFO* pSt_ActionInfo);
28+
bool Protocol_StorageParse_WDLock(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
2929
};

XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ EXPORTS
1111
Protocol_StorageParse_SpeedLimit
1212
Protocol_StorageParse_P2PToken
1313
Protocol_StorageParse_Action
14+
Protocol_StorageParse_WDLock
1415

1516
Protocol_StoragePacket_BasicAuth
1617
Protocol_StoragePacket_UPDown
@@ -19,4 +20,5 @@ EXPORTS
1920
Protocol_StoragePacket_DirOperator
2021
Protocol_StoragePacket_REQFile
2122
Protocol_StoragePacket_Action
22-
Protocol_StoragePacket_Propfind
23+
Protocol_StoragePacket_WDPropfind
24+
Protocol_StoragePacket_WDLock

XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,30 @@ extern "C" bool Protocol_StorageParse_P2PToken(LPCXSTR lpszMsgBuffer, int nMsgLe
245245
备注:
246246
*********************************************************************/
247247
extern "C" bool Protocol_StorageParse_Action(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_ACTIONINFO * pSt_ActionInfo);
248+
/********************************************************************
249+
函数名称:Protocol_StorageParse_WDLock
250+
函数功能:WEBDAV加锁协议解析函数
251+
参数.一:lpszMsgBuffer
252+
In/Out:In
253+
类型:常量字符指针
254+
可空:N
255+
意思:输入要解析的内容
256+
参数.二:nMsgLen
257+
In/Out:In
258+
类型:整数型
259+
可空:N
260+
意思:输入要解析的大小
261+
参数.三:pSt_WDLock
262+
In/Out:Out
263+
类型:数据结构指针
264+
可空:N
265+
意思:输出解析的数据
266+
返回值
267+
类型:逻辑型
268+
意思:是否成功
269+
备注:
270+
*********************************************************************/
271+
extern "C" bool Protocol_StorageParse_WDLock(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
248272
/************************************************************************/
249273
/* 打包协议导出 */
250274
/************************************************************************/
@@ -517,7 +541,7 @@ extern "C" bool Protocol_StoragePacket_REQFile(XCHAR * ptszMsgBuffer, int* pInt_
517541
*********************************************************************/
518542
extern "C" bool Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XNETHANDLE xhToken, XENGINE_ACTIONINFO* pSt_ActionInfo);
519543
/********************************************************************
520-
函数名称:Protocol_StoragePacket_Propfind
544+
函数名称:Protocol_StoragePacket_WDPropfind
521545
函数功能:propfind协议打包处理函数
522546
参数.一:ptszMsgBuffer
523547
In/Out:Out
@@ -554,4 +578,28 @@ extern "C" bool Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer, int* pInt_Ms
554578
意思:是否成功
555579
备注:
556580
*********************************************************************/
557-
extern "C" bool Protocol_StoragePacket_Propfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey);
581+
extern "C" bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey);
582+
/********************************************************************
583+
函数名称:Protocol_StoragePacket_WDLock
584+
函数功能:webdav锁协议封装
585+
参数.一:ptszMsgBuffer
586+
In/Out:Out
587+
类型:字符指针
588+
可空:N
589+
意思:输出组好包的请求缓冲区
590+
参数.二:pInt_MsgLen
591+
In/Out:Out
592+
类型:整数型指针
593+
可空:N
594+
意思:输出缓冲区大小
595+
参数.三:pSt_WDLock
596+
In/Out:In
597+
类型:数据结构指针
598+
可空:N
599+
意思:输入要打包的信息
600+
返回值
601+
类型:逻辑型
602+
意思:是否成功
603+
备注:
604+
*********************************************************************/
605+
extern "C" bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);

XEngine_Source/StorageModule_Protocol/StorageProtocol_Error.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@
1212
*********************************************************************/
1313
#define ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT 0xB0F1001
1414
#define ERROR_XENGINE_STORAGE_PROTOCOL_PARSE 0xB0F1002
15-
#define ERROR_XENGINE_STORAGE_PROTOCOL_TOKEN 0xB0F1003
15+
#define ERROR_XENGINE_STORAGE_PROTOCOL_TOKEN 0xB0F1003
16+
#define ERROR_XENGINE_STORAGE_PROTOCOL_ROOT 0xB0F1004

XEngine_Source/StorageModule_Protocol/pch.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ extern "C" bool Protocol_StorageParse_Action(LPCXSTR lpszMsgBuffer, int nMsgLen,
5757
{
5858
return m_StorageParse.Protocol_StorageParse_Action(lpszMsgBuffer, nMsgLen, pSt_ActionInfo);
5959
}
60+
extern "C" bool Protocol_StorageParse_WDLock(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock)
61+
{
62+
return m_StorageParse.Protocol_StorageParse_WDLock(lpszMsgBuffer, nMsgLen, pSt_WDLock);
63+
}
6064
/************************************************************************/
6165
/* 打包协议导出 */
6266
/************************************************************************/
@@ -88,7 +92,11 @@ extern "C" bool Protocol_StoragePacket_Action(XCHAR * ptszMsgBuffer, int* pInt_M
8892
{
8993
return m_StoragePacket.Protocol_StoragePacket_Action(ptszMsgBuffer, pInt_MsgLen, xhToken, pSt_ActionInfo);
9094
}
91-
extern "C" bool Protocol_StoragePacket_Propfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey)
95+
extern "C" bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey)
96+
{
97+
return m_StoragePacket.Protocol_StoragePacket_WDPropfind(ptszMsgBuffer, pInt_MsgLen, ppptszListFile, nFileCount, lpszBucketPath, lpszBucketKey);
98+
}
99+
extern "C" bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock)
92100
{
93-
return m_StoragePacket.Protocol_StoragePacket_Propfind(ptszMsgBuffer, pInt_MsgLen, ppptszListFile, nFileCount, lpszBucketPath, lpszBucketKey);
101+
return m_StoragePacket.Protocol_StoragePacket_WDLock(ptszMsgBuffer, pInt_MsgLen, pSt_WDLock);
94102
}

0 commit comments

Comments
 (0)