📄 srmpsend.cxx
字号:
if (pSoapExt->GetRelatesToLengthInWCHARs()) {
if (! pXmlEncode->SetElement(cszRelatesTo,pSoapExt->GetRelatesTo(),pSoapExt->GetRelatesToLengthInWCHARs()))
return FALSE;
}
}
if (pImage->sect.pFwdViaHeader && GetNextHopOnFwdList(pImage)) {
if (! pXmlEncode->StartTag(cszFwd) ||
! CreateViaList(pXmlEncode,pImage->sect.pFwdViaHeader,pImage->flags.fSRMPGenerated) ||
! pXmlEncode->EndTag(cszFwd))
return FALSE;
}
if (pImage->sect.pRevViaHeader) {
if (! pXmlEncode->StartTag(cszRev) ||
! CreateViaList(pXmlEncode,pImage->sect.pRevViaHeader,FALSE) ||
! pXmlEncode->EndTag(cszRev))
return FALSE;
}
// <rev><via>
// messages generated on local device (not routed) use MSMQ msg props
pUserHeader->GetResponseQueue(&qf);
if (qf.GetType() != QUEUE_FORMAT_TYPE_UNKNOWN) {
if (! pXmlEncode->StartTag(cszRev) || ! pXmlEncode->StartTag(cszVia))
return FALSE;
if (!QueueFormatToUri(pXmlEncode,&qf))
return FALSE;
if (! pXmlEncode->EndTag(cszVia) || ! pXmlEncode->EndTag(cszRev))
return FALSE;
}
return pXmlEncode->EndTag(cszPath);
}
//
// <properties> Section.
//
BOOL SendProps(SVSXMLEncode *pXmlEncode, ScPacketImage *pImage) {
CUserHeader *pUserHeader = pImage->sect.pUserHeader;
WCHAR szBuf[MAX_PATH];
DWORD dw;
if (! pXmlEncode->Append((CHAR*)cszPropertiesNS,SVSUTIL_CONSTSTRLEN(cszPropertiesNS)*sizeof(WCHAR)) ||
! pXmlEncode->Append((CHAR*)cszMustUnderstandNS,SVSUTIL_CONSTSTRLEN(cszMustUnderstandNS)*sizeof(WCHAR)))
return FALSE;
// <expiresAt>
dw = GetExpiresFromPacketImage(pImage);
if (! UtlTimeToIso860Time(dw,szBuf,MAX_PATH))
return FALSE;
if (! pXmlEncode->SetElement(cszExpiresAt,szBuf))
return FALSE;
// <sentAt>
if (! UtlTimeToIso860Time(pUserHeader->GetSentTime(),szBuf,MAX_PATH))
return FALSE;
if (! pXmlEncode->SetElement(cszSentAt,szBuf))
return FALSE;
return pXmlEncode->EndTag(cszProperties);
}
//
// <Services> Section
//
BOOL SendServices(SVSXMLEncode *pXmlEncode, ScPacketImage *pImage) {
CPropertyHeader *pPropHeader = pImage->sect.pPropHeader;
CUserHeader *pUserHeader = pImage->sect.pUserHeader;
USHORT ackType = pPropHeader->GetAckType();
QUEUE_FORMAT adminQueue;
QUEUE_FORMAT_TYPE qType;
UCHAR delivery = pUserHeader->GetDelivery();
pUserHeader->GetAdminQueue(&adminQueue);
qType = adminQueue.GetType();
// Do we have required data to fill <services> tag, if not we're done?
if (delivery != MQMSG_DELIVERY_RECOVERABLE &&
(0 == (ackType & (MQMSG_DELIVERY_RECOVERABLE | MQMSG_ACKNOWLEDGMENT_POS_ARRIVAL | MQMSG_ACKNOWLEDGMENT_NEG_RECEIVE)) ||
(qType == QUEUE_FORMAT_TYPE_UNKNOWN)))
return TRUE;
// <services...> root
if (! pXmlEncode->Append((CHAR*)cszServicesNS,SVSUTIL_CONSTSTRLEN(cszServicesNS)*sizeof(WCHAR)) ||
! pXmlEncode->Append((CHAR*)cszMustUnderstandNS,SVSUTIL_CONSTSTRLEN(cszMustUnderstandNS)*sizeof(WCHAR)))
return FALSE;
// <durable>
if (delivery == MQMSG_DELIVERY_RECOVERABLE) {
if (! pXmlEncode->SetEmptyElement(cszDurable))
return FALSE;
}
//
// <deliveryReceiptRequest> section.
//
if ((ackType & MQMSG_ACKNOWLEDGMENT_POS_ARRIVAL) && (qType != QUEUE_FORMAT_TYPE_UNKNOWN)) {
if (! pXmlEncode->StartTag(cszDeliveryReceiptRequest) ||
! pXmlEncode->StartTag(cszSendTo))
return FALSE;
if (! QueueFormatToUri(pXmlEncode,&adminQueue))
return FALSE;
if (! pXmlEncode->EndTag(cszSendTo) ||
! pXmlEncode->EndTag(cszDeliveryReceiptRequest))
return FALSE;
}
//
// <commitReceiptRequest> section.
//
if (ackType & (MQMSG_ACKNOWLEDGMENT_POS_RECEIVE | MQMSG_ACKNOWLEDGMENT_NEG_RECEIVE) && (qType != QUEUE_FORMAT_TYPE_UNKNOWN)) {
if (! pXmlEncode->StartTag(cszCommitmentReceiptRequest))
return FALSE;
if (ackType & MQMSG_ACKNOWLEDGMENT_POS_RECEIVE) {
if (! pXmlEncode->SetEmptyElement(cszPositiveOnly))
return FALSE;
}
if (ackType & MQMSG_ACKNOWLEDGMENT_NEG_RECEIVE) {
if (! pXmlEncode->SetEmptyElement(cszNegativeOnly))
return FALSE;
}
if (! pXmlEncode->StartTag(cszSendTo) ||
! QueueFormatToUri(pXmlEncode,&adminQueue) ||
! pXmlEncode->EndTag(cszSendTo))
return FALSE;
if (! pXmlEncode->EndTag(cszCommitmentReceiptRequest))
return FALSE;
}
return pXmlEncode->EndTag(cszServices);
}
//
// <stream> and <stream><start>
BOOL SendStream(SVSXMLEncode *pXmlEncode, ScPacketImage *pImage) {
CUserHeader *pUserHeader = pImage->sect.pUserHeader;
CXactHeader *pXactHeader = pImage->sect.pXactHeader;
WCHAR szBuf[2000];
const GUID *pGuid = NULL;
if (! pUserHeader->IsOrdered())
return TRUE;
if (! pXmlEncode->Append((CHAR*)cszStreamNS,SVSUTIL_CONSTSTRLEN(cszStreamNS)*sizeof(WCHAR)) ||
! pXmlEncode->Append((CHAR*)cszMustUnderstandNS,SVSUTIL_CONSTSTRLEN(cszMustUnderstandNS)*sizeof(WCHAR)))
return FALSE;
// <streamID>
pGuid = pUserHeader->GetSourceQM();
StringCchPrintfW(szBuf,SVSUTIL_ARRLEN(szBuf),L"uri:" GUID_FORMAT L"\\%I64d",
GUID_ELEMENTS(pGuid),pXactHeader ? pXactHeader->GetSeqID() : 0);
if (! pXmlEncode->SetElement(cszStreamId,szBuf))
return FALSE;
// <current>
wsprintf(szBuf,L"%I64d",pXactHeader ? pXactHeader->GetSeqN() : 0);
if (! pXmlEncode->SetElement(cszCurrent,szBuf))
return FALSE;
// <previous>
wsprintf(szBuf,L"%I64d",pXactHeader ? pXactHeader->GetPrevSeqN() : 0);
if (! pXmlEncode->SetElement(cszPrevious,szBuf))
return FALSE;
//
// <stream><start>
//
if (pXactHeader && (0 == pXactHeader->GetPrevSeqN())) {
static const WCHAR szOrderQueue[] = MSMQ_SC_PATHNAME_PRIVATE L"/" MSMQ_SC_ORDERQUEUENAME;
WCHAR *szURI;
if (! pXmlEncode->StartTag(cszStart))
return FALSE;
gMem->Lock();
const WCHAR *szVroot = gMachine->VRootList[0].wszVRoot ? gMachine->VRootList[0].wszVRoot : cszMSMQVroot;
// Prints out in format http://ceMachineName/MSMQ\PRIVATE$/order_queue$
// VROot is of the form "/VRootName/" so don't add extra "/"'s in sprintf.
StringCchPrintfW(szBuf,SVSUTIL_ARRLEN(szBuf),
L"HTTP://%s%s%s",gMachine->lpszHostName,szVroot,szOrderQueue);
if (! gMachine->RouteLocalReverseLookup((WCHAR*)szBuf,&szURI))
szURI = szBuf;
gMem->Unlock();
if (! pXmlEncode->SetElement(cszSendReceiptsTo,szURI))
return FALSE;
if (! pXmlEncode->EndTag(cszStart))
return FALSE;
}
return pXmlEncode->EndTag(cszStream);
}
//
// <streamReceipt> section.
//
BOOL SendStreamRcpt(SVSXMLEncode *pXmlEncode, ScPacketImage *pImage) {
CUserHeader *pUserHeader = pImage->sect.pUserHeader;
CEodAckHeader *pEodAckHeader = pImage->sect.pEodAckHeader;
WCHAR szBuf[MAX_PATH];
WCHAR *szStreamID = szBuf;
WCHAR *szTrav;
BOOL fRet = FALSE;
if (! pUserHeader->EodAckIsIncluded())
return TRUE;
// <streamReceipt>
if (! pXmlEncode->StartTag(cszStreamReceipt))
goto done;
SVSUTIL_ASSERT(pEodAckHeader->GetStreamIdSizeInBytes() % 2 == 0); // should be even since we're storing UNICODE
if (pEodAckHeader->GetStreamIdSizeInBytes() > sizeof(szBuf)) {
if (NULL == (szStreamID = (WCHAR*) g_funcAlloc(pEodAckHeader->GetStreamIdSizeInBytes() + 1,g_pvAllocData)))
goto done;
}
wcscpy(szStreamID,(WCHAR*)pEodAckHeader->GetPointerToStreamId());
szTrav = szStreamID + (pEodAckHeader->GetStreamIdSizeInBytes() / 2);
if (pEodAckHeader->GetSeqId() != i64NoneMSMQSeqId)
wsprintf(szTrav,L"\\%I64d",pEodAckHeader->GetSeqId());
if (!pXmlEncode->SetElement(cszStreamId,szStreamID))
goto done;
// <lastOrdinal>
wsprintf(szBuf,L"%I64d",pEodAckHeader->GetSeqNum());
if (!pXmlEncode->SetElement(cszlastOrdinal,szBuf))
goto done;
if (! pXmlEncode->EndTag(cszStreamReceipt))
goto done;
fRet = TRUE;
done:
if (szStreamID && szStreamID != szBuf)
g_funcFree(szStreamID,g_pvFreeData);
return fRet;
}
BOOL SetMsgCurrentTime(SVSXMLEncode *pXmlEncode, const WCHAR *szElementName) {
WCHAR szBuf[MAX_PATH];
if (! UtlTimeToIso860Time(scutil_now(),szBuf,MAX_PATH))
return FALSE;
return pXmlEncode->SetElement((WCHAR*)szElementName,szBuf);
}
BOOL SetMsgID(SVSXMLEncode *pXmlEncode, OBJECTID *pMsgId) {
WCHAR szBuf[MAX_PATH];
const GUID *pGuid = &pMsgId->Lineage;
if (FAILED(StringCchPrintfW(szBuf,MAX_PATH,UUIDREFERENCE_PREFIX L"%d" UUIDREFERENCE_SEPERATOR GUID_FORMAT,
pMsgId->Uniquifier,GUID_ELEMENTS(pGuid))))
{
SVSUTIL_ASSERT(0);
return FALSE;
}
return pXmlEncode->SetElement(cszId,szBuf);
}
//
// <deliveryReceipt> section
//
BOOL SendDeliveryRcpt(SVSXMLEncode *pXmlEncode, ScPacketImage *pImage) {
CPropertyHeader *pPropHeader = pImage->sect.pPropHeader;
// cszDeliveryReceipt
if (pPropHeader->GetClass() != MQMSG_CLASS_ACK_REACH_QUEUE)
return TRUE;
if (! pXmlEncode->StartTag(cszDeliveryReceipt))
return FALSE;
// <receivedAt>
if (! SetMsgCurrentTime(pXmlEncode,cszreceivedAt))
return FALSE;
// <id>
if (! SetMsgID(pXmlEncode,(OBJECTID*)pPropHeader->GetCorrelationID()))
return FALSE;
return pXmlEncode->EndTag(cszDeliveryReceipt);
}
//
// <commitReceipt> section
//
BOOL SendCommitRcpt(SVSXMLEncode *pXmlEncode, ScPacketImage *pImage) {
CPropertyHeader *pPropHeader = pImage->sect.pPropHeader;
if (!MQCLASS_RECEIVE(pPropHeader->GetClass()))
return TRUE;
if (! pXmlEncode->StartTag(cszCommitmentReceipt))
return FALSE;
// <decidedAt>
if (!SetMsgCurrentTime(pXmlEncode,cszDecidedAt))
return FALSE;
// <decision>
const WCHAR* szDecideValue = MQCLASS_POS_RECEIVE(pPropHeader->GetClass()) ? cszPositive : cszNegative;
if (! pXmlEncode->SetElement(cszDecision,szDecideValue))
return FALSE;
// <id>
if (! SetMsgID(pXmlEncode,(OBJECTID*)pPropHeader->GetCorrelationID()))
return FALSE;
return pXmlEncode->EndTag(cszCommitmentReceipt);
}
//
// <msmq> section
//
// no <Provider> element since there's no security.
// no <DestinationMqf>, <AdminMqf>, <ResponseMqf> since there's no multiqueues.
//
BOOL SendMsmq(SVSXMLEncode *pXmlEncode, ScPacketImage *pImage) {
CPropertyHeader *pPropHeader = pImage->sect.pPropHeader;
CUserHeader *pUserHeader = pImage->sect.pUserHeader;
CBaseHeader *pBaseHeader = pImage->sect.pBaseHeader;
CXactHeader *pXactHeader = pImage->sect.pXactHeader;
WCHAR szBuf[MAX_PATH];
UCHAR auditing = pUserHeader->GetAuditing();
WCHAR *szCorrelation;
DWORD dw;
const GUID *pGuid;
if (! pXmlEncode->Append((CHAR*)cszMsmqNS,SVSUTIL_CONSTSTRLEN(cszMsmqNS)*sizeof(WCHAR)))
return FALSE;
StringCchPrintfW(szBuf,MAX_PATH,L"%d",pPropHeader->GetClass());
if (! pXmlEncode->SetElement(cszClass,szBuf))
return FALSE;
StringCchPrintfW(szBuf,MAX_PATH,L"%d",pBaseHeader->GetPriority());
if (! pXmlEncode->SetElement(cszPriority,szBuf))
return FALSE;
if (auditing & MQMSG_JOURNAL) {
if (!pXmlEncode->SetEmptyElement(cszJournal))
return FALSE;
}
if (auditing & MQMSG_DEADLETTER) {
if (!pXmlEncode->SetEmptyElement(cszDeadLetter))
return FALSE;
}
if (NULL == (szCorrelation = Octet2Base64W(pPropHeader->GetCorrelationID(),PROPID_M_CORRELATIONID_SIZE,&dw)))
return FALSE;
if (! pXmlEncode->SetElement(cszCorrelation,szCorrelation)) {
g_funcFree(szCorrelation,g_pvFreeData);
return FALSE;
}
g_funcFree(szCorrelation,g_pvFreeData);
if (pBaseHeader->GetTraced() & MQMSG_SEND_ROUTE_TO_REPORT_QUEUE) {
if (! pXmlEncode->SetEmptyElement(cszTrace))
return FALSE;
}
if (pUserHeader->ConnectorTypeIsIncluded()) {
pGuid = pUserHeader->GetConnectorType();
StringCchPrintfW(szBuf,MAX_PATH,GUID_FORMAT,GUID_ELEMENTS(pGuid));
if (! pXmlEncode->SetElement(cszConnectorType,szBuf))
return FALSE;
}
StringCchPrintfW(szBuf,MAX_PATH,L"%d",pPropHeader->GetApplicationTag());
if (! pXmlEncode->SetElement(cszApp,szBuf))
return FALSE;
StringCchPrintfW(szBuf,MAX_PATH,L"%d",pPropHeader->GetBodyType());
if (! pXmlEncode->SetElement(cszBodyType,szBuf))
return FALSE;
StringCchPrintfW(szBuf,MAX_PATH,L"%d",pPropHeader->GetHashAlg());
if (! pXmlEncode->SetElement(cszHashAlgorithm,szBuf))
return FALSE;
// <eod> section
if (pUserHeader->IsOrdered()) {
if (! pXmlEncode->StartTag(cszEod))
return FALSE;
if (pXactHeader->ConnectorQMIncluded()) {
pGuid = pXactHeader->GetConnectorQM();
StringCchPrintfW(szBuf,MAX_PATH,GUID_FORMAT,GUID_ELEMENTS(pGuid));
if (! pXmlEncode->SetElement(cszXConnectorId,szBuf))
return FALSE;
}
if (pXactHeader->GetFirstInXact()) {
if (! pXmlEncode->SetEmptyElement(cszFirst))
return FALSE;
}
if (pXactHeader->GetLastInXact()) {
if (! pXmlEncode->SetEmptyElement(cszLast))
return FALSE;
}
if (! pXmlEncode->EndTag(cszEod))
return FALSE;
}
pGuid = pUserHeader->GetSourceQM();
StringCchPrintfW(szBuf,MAX_PATH,GUID_FORMAT,GUID_ELEMENTS(pGuid));
if (! pXmlEncode->SetElement(cszSourceQmGuid,szBuf))
return FALSE;
dw = min(pBaseHeader->GetAbsoluteTimeToQueue(), LONG_MAX);
if (! UtlTimeToIso860Time(dw,szBuf,MAX_PATH) ||
! pXmlEncode->SetElement(cszTTrq,szBuf))
return FALSE;
return pXmlEncode->EndTag(cszMsmq);
}
// Adds elements set by user.
BOOL SendUserHeader(SVSXMLEncode *pXmlEncode, ScPacketImage *pImage) {
CUserHeader *pUserHeader = pImage->sect.pUserHeader;
CSoapSection *pSoapSection = pImage->sect.pSoapHeaderSection;
if (! pUserHeader->SoapIsIncluded() || !pSoapSection || !pSoapSection->GetPointerToData())
return TRUE;
// do *not* encode the soap section, as it contains XML tags in it already.
// It's application's responsibility to make sure all is encoded correctly, just
// as on the desktop.
// GetDataLengthInWCHARs() returns strlen+1 for \0, don't append this to buffer.
return pXmlEncode->Append((CHAR*)pSoapSection->GetPointerToData(),(pSoapSection->GetDataLengthInWCHARs()-1)*sizeof(WCHAR));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -