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

📄 srmpsend.cxx

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