コード例 #1
0
/**
 * Converts a byte array into a MessagePartsDescriptor
 * @param blockData byte array to convert
 * @return a MessagePartsDescriptor
 */
SmartPtrCMessagePartDescriptor CMessagePartDescriptor::fromArray(
	SmartPtrCDynamicByteArray& buffer) {
	CAF_CM_STATIC_FUNC("CMessagePartDescriptor", "fromArray");
	CAF_CM_VALIDATE_SMARTPTR(buffer);

	if (buffer->getByteCount() < BLOCK_SIZE) {
		CAF_CM_EXCEPTION_VA1(E_INVALIDARG, "Input data block is too small - %d",
			buffer->getByteCount());
	}

	if (CMessagePartsParser::getByte(buffer) != CAF_MSG_VERSION) {
		CAF_CM_EXCEPTION_VA0(E_INVALIDARG, "Input data block version is incorrect");
	}

	const byte resvd = CMessagePartsParser::getByte(buffer);
	if (resvd != RESERVED) {
		CAF_CM_EXCEPTION_VA0(E_INVALIDARG, "Input data block reserved bits are incorrect");
	}

	const uint16 attachmentNumber = CMessagePartsParser::getUint16(buffer);
	const uint32 partNumber = CMessagePartsParser::getUint32(buffer);
	const uint32 dataSize = CMessagePartsParser::getUint32(buffer);
	const uint32 dataOffset = CMessagePartsParser::getUint32(buffer);
	buffer->verify();

	SmartPtrCMessagePartDescriptor messagePartsDescriptor;
	messagePartsDescriptor.CreateInstance();
	messagePartsDescriptor->initialize(
		attachmentNumber, partNumber, dataSize, dataOffset);

	return messagePartsDescriptor;
}
コード例 #2
0
void CCafMessagePayload::saveToFile(
		const SmartPtrCDynamicByteArray& payload,
		const std::string& payloadPath) {
	CAF_CM_STATIC_FUNC_VALIDATE("CCafMessagePayload", "saveToFile");
	CAF_CM_VALIDATE_SMARTPTR(payload);
	CAF_CM_VALIDATE_STRING(payloadPath);

	FileSystemUtils::saveByteFile(payloadPath,
			payload->getPtr(), payload->getByteCount());
}
コード例 #3
0
/**
 * Converts the BLOCK_SIZE data in a ByteBuffer into a MessagePartsDescriptor
 * <p>
 * The incoming ByteBuffer position will be modified.
 * @param buffer ByteBuffer to convert
 * @return a MessagePartsDescriptor
 */
SmartPtrCMessagePartDescriptor CMessagePartDescriptor::fromByteBuffer(
	SmartPtrCDynamicByteArray& buffer) {
	CAF_CM_STATIC_FUNC("CMessagePartDescriptor", "fromByteBuffer");
	CAF_CM_VALIDATE_SMARTPTR(buffer);

	if (buffer->getByteCountFromCurrentPos() < BLOCK_SIZE) {
		CAF_CM_EXCEPTION_VA2(E_INVALIDARG,
			"Input data block is too small - rem: %d, tot: %d",
			buffer->getByteCountFromCurrentPos(), buffer->getByteCount());
	}

	SmartPtrCDynamicByteArray data;
	data.CreateInstance();
	data->allocateBytes(BLOCK_SIZE);
	data->memCpy(buffer->getPtrAtCurrentPos(), BLOCK_SIZE);

	buffer->incrementCurrentPos(BLOCK_SIZE);
	return fromArray(data);
}
コード例 #4
0
SmartPtrIIntMessage COutgoingMessageHandler::rehydrateMultiPartMessage(
	const SmartPtrCMessageDeliveryRecord& deliveryRecord,
	const IIntMessage::SmartPtrCHeaders& addlHeaders) {
	CAF_CM_STATIC_FUNC_LOG("COutgoingMessageHandler", "rehydrateMultiPartMessage");
	CAF_CM_VALIDATE_SMARTPTR(deliveryRecord);
	// addlHeaders are optional

	uint32 payloadSize = CMessagePartsHeader::BLOCK_SIZE;
	const std::deque<SmartPtrCMessagePartDescriptorSourceRecord> sourceRecords = deliveryRecord->getMessagePartSources();
	for (TConstIterator<std::deque<SmartPtrCMessagePartDescriptorSourceRecord> > sourceRecordIter(sourceRecords);
		sourceRecordIter; sourceRecordIter++) {
		const SmartPtrCMessagePartDescriptorSourceRecord sourceRecord = *sourceRecordIter;
		payloadSize += CMessagePartDescriptor::BLOCK_SIZE + sourceRecord->getDataLength();
	}

	SmartPtrCDynamicByteArray payload;
	payload.CreateInstance();
	payload->allocateBytes(payloadSize);

	const SmartPtrCDynamicByteArray partsHeader = CMessagePartsHeader::toArray(
		deliveryRecord->getCorrelationId(), deliveryRecord->getNumberOfParts());
	payload->memAppend(partsHeader->getPtr(), partsHeader->getByteCount());

	uint32 partNumber = deliveryRecord->getStartingPartNumber();
	if (CAF_CM_IS_LOG_DEBUG_ENABLED) {
		CAF_CM_LOG_DEBUG_VA3("[# sourceRecords=%d][payloadSize=%d][startingPartNumber=%d]",
			sourceRecords.size(), payloadSize, partNumber);
	}

	for (TConstIterator<std::deque<SmartPtrCMessagePartDescriptorSourceRecord> > sourceRecordIter(sourceRecords);
		sourceRecordIter; sourceRecordIter++) {
		const SmartPtrCMessagePartDescriptorSourceRecord sourceRecord = *sourceRecordIter;

		const SmartPtrCDynamicByteArray partDescriptor = CMessagePartDescriptor::toArray(
			sourceRecord->getAttachmentNumber(), partNumber++, sourceRecord->getDataLength(),
			sourceRecord->getDataOffset());
		payload->memAppend(partDescriptor->getPtr(), partDescriptor->getByteCount());

		CAF_CM_LOG_DEBUG_VA3("Reading from file - file: %s, len: %d, offset: %d",
			sourceRecord->getFilePath().c_str(), sourceRecord->getDataLength(),
			sourceRecord->getDataOffset());

		std::ifstream file(sourceRecord->getFilePath().c_str(), std::ios::binary);
		try {
			if (!file.is_open()) {
				CAF_CM_EXCEPTION_VA1(ERROR_FILE_NOT_FOUND,
					"Could not open binary file - %s", sourceRecord->getFilePath().c_str());
			}

			file.seekg(sourceRecord->getDataOffset(), std::ios::beg);
			file.read(reinterpret_cast<char*>(payload->getNonConstPtrAtCurrentPos()),
				sourceRecord->getDataLength());
			payload->verify();
			if (! file) {
				CAF_CM_EXCEPTION_VA3(ERROR_BUFFER_OVERFLOW,
					"Did not read full contents - file: %s, requested: %d, read: %d",
					sourceRecord->getFilePath().c_str(), sourceRecord->getDataLength(),
					file.gcount());
			}

			payload->incrementCurrentPos(sourceRecord->getDataLength());
		}
		CAF_CM_CATCH_ALL;
		file.close();
		CAF_CM_LOG_CRIT_CAFEXCEPTION;
		CAF_CM_THROWEXCEPTION;
	}

	SmartPtrCIntMessage rc;
	rc.CreateInstance();
	rc->initialize(payload, deliveryRecord->getMessageHeaders(), addlHeaders);

	return rc;
}
コード例 #5
0
void CProviderExecutorRequestHandler::processRequest(
		const SmartPtrCProviderExecutorRequest& request) const {
	CAF_CM_FUNCNAME_VALIDATE("processRequest");
	CAF_CM_VALIDATE_SMARTPTR(request);

	const std::string outputDir = request->getOutputDirectory();

	SmartPtrCLoggingSetter loggingSetter;
	loggingSetter.CreateInstance();
	loggingSetter->initialize(outputDir);

	SmartPtrIIntMessage message = request->getInternalRequest();

	const std::string providerRequestPath = FileSystemUtils::buildPath(outputDir, _sProviderRequestFilename);
	const std::string stdoutPath = FileSystemUtils::buildPath(outputDir, _sStdoutFilename);
	const std::string stderrPath = FileSystemUtils::buildPath(outputDir, _sStderrFilename);

	std::string newProviderRequestPath = FileSystemUtils::normalizePathWithForward(
			providerRequestPath);

	// Create temporary request file for use by the provider
	CCafMessagePayload::saveToFile(message->getPayload(), newProviderRequestPath);

	Cdeqstr argv;
	argv.push_back(_providerPath);
	argv.push_back("-r");
	argv.push_back(newProviderRequestPath);

	CAF_CM_LOG_INFO_VA2("Running command - %s -r %s", _providerPath.c_str(),
			newProviderRequestPath.c_str());

	ProcessUtils::Priority priority = ProcessUtils::NORMAL;
	std::string appConfigPriority = AppConfigUtils::getOptionalString(_sManagementAgentArea, "provider_process_priority");
	if (!appConfigPriority.empty()) {
		if (CStringUtils::isEqualIgnoreCase("LOW", appConfigPriority)) {
			priority = ProcessUtils::LOW;
		} else if (CStringUtils::isEqualIgnoreCase("IDLE", appConfigPriority)) {
			priority = ProcessUtils::IDLE;
		}
	}

	// Begin impersonation
	if (!_beginImpersonationTransformer.IsNull()) {
		message = _beginImpersonationTransformer->transformMessage(message);
		if (message.IsNull()) {
			CAF_CM_LOG_WARN_VA0("Begin impersonation transform did not return a message");
		}
	}

	{
		CAF_CM_UNLOCK_LOCK;
		ProcessUtils::runSyncToFiles(argv, stdoutPath, stderrPath, priority);
	}

	// End impersonation
	if (!_endImpersonationTransformer.IsNull()) {
		message = _endImpersonationTransformer->transformMessage(message);
		if (message.IsNull()) {
			CAF_CM_LOG_WARN_VA0("End impersonation transform did not return a message");
		}
	}

	// Delete temporary request file used by the provider
	if (FileSystemUtils::doesFileExist(newProviderRequestPath)) {
		CAF_CM_LOG_INFO_VA1("Removing handler produced request file - %s", newProviderRequestPath.c_str());
		FileSystemUtils::removeFile(newProviderRequestPath);
	}

	// Delete original request
	const std::string originalFile = message->findOptionalHeaderAsString(FileHeaders::_sORIGINAL_FILE);
	if (!originalFile.empty()) {
		if (FileSystemUtils::doesFileExist(originalFile)) {
			CAF_CM_LOG_INFO_VA1("Removing original file - %s", originalFile.c_str());
			FileSystemUtils::removeFile(originalFile);
		}
	}

	// Package response in envelope and write to global response location
	const SmartPtrCProviderRequestDoc providerRequest =
			CCafMessagePayloadParser::getProviderRequest(message->getPayload());
	const SmartPtrCResponseDoc response = CResponseFactory::createResponse(providerRequest, outputDir);

	const std::string relFilename = CStringUtils::createRandomUuid() + "_" + _sResponseFilename;

	SmartPtrIIntMessage responseMessage = CCafMessageCreator::createPayloadEnvelope(
			response, relFilename, message->getHeaders());

	const std::string directory = AppConfigUtils::getRequiredString("response_dir");
	const std::string filePath = FileSystemUtils::buildPath(directory, relFilename);

	const SmartPtrCDynamicByteArray payload = responseMessage->getPayload();
	FileSystemUtils::saveByteFile(filePath, payload->getPtr(), payload->getByteCount(),
			FileSystemUtils::FILE_MODE_REPLACE, ".writing");
}