summaryrefslogtreecommitdiff
path: root/binaryurp/source/writer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binaryurp/source/writer.cxx')
-rw-r--r--binaryurp/source/writer.cxx479
1 files changed, 0 insertions, 479 deletions
diff --git a/binaryurp/source/writer.cxx b/binaryurp/source/writer.cxx
deleted file mode 100644
index c01c56c78..000000000
--- a/binaryurp/source/writer.cxx
+++ /dev/null
@@ -1,479 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
-*
-* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-*
-* Copyright 2000, 2011 Oracle and/or its affiliates.
-*
-* OpenOffice.org - a multi-platform office productivity suite
-*
-* This file is part of OpenOffice.org.
-*
-* OpenOffice.org is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License version 3
-* only, as published by the Free Software Foundation.
-*
-* OpenOffice.org is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Lesser General Public License version 3 for more details
-* (a copy is included in the LICENSE file that accompanied this code).
-*
-* You should have received a copy of the GNU Lesser General Public License
-* version 3 along with OpenOffice.org. If not, see
-* <http://www.openoffice.org/license.html>
-* for a copy of the LGPLv3 License.
-*
-************************************************************************/
-
-#include "sal/config.h"
-
-#include <exception>
-#include <vector>
-
-#include "com/sun/star/connection/XConnection.hpp"
-#include "com/sun/star/lang/WrappedTargetRuntimeException.hpp"
-#include "com/sun/star/uno/XCurrentContext.hpp"
-#include "cppuhelper/exc_hlp.hxx"
-#include "osl/mutex.hxx"
-#include "rtl/memory.h"
-#include "uno/dispatcher.hxx"
-
-#include "binaryany.hxx"
-#include "bridge.hxx"
-#include "currentcontext.hxx"
-#include "specialfunctionids.hxx"
-#include "writer.hxx"
-
-namespace binaryurp {
-
-namespace {
-
-namespace css = com::sun::star;
-
-bool isProtocolPropertyMessage(rtl::OUString const & oid) {
- return oid.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("UrpProtocolProperties"));
-}
-
-}
-
-Writer::Item::Item() {}
-
-Writer::Item::Item(
- rtl::ByteSequence const & theTid, rtl::OUString const & theOid,
- css::uno::TypeDescription const & theType,
- css::uno::TypeDescription const & theMember,
- std::vector< BinaryAny > const & inArguments,
- css::uno::UnoInterfaceReference const & theCurrentContext):
- request(true), tid(theTid), oid(theOid), type(theType), member(theMember),
- arguments(inArguments), currentContext(theCurrentContext)
-{}
-
-Writer::Item::Item(
- rtl::ByteSequence const & theTid,
- css::uno::TypeDescription const & theMember, bool theSetter,
- bool theException, BinaryAny const & theReturnValue,
- std::vector< BinaryAny > const & outArguments,
- bool theSetCurrentContextMode):
- request(false), tid(theTid), member(theMember), setter(theSetter),
- arguments(outArguments), exception(theException),
- returnValue(theReturnValue), setCurrentContextMode(theSetCurrentContextMode)
-{}
-
-Writer::Writer(rtl::Reference< Bridge > const & bridge):
- bridge_(bridge), marshal_(bridge, state_), stop_(false)
-{
- OSL_ASSERT(bridge.is());
- acquire();
-}
-
-void Writer::sendDirectRequest(
- rtl::ByteSequence const & tid, rtl::OUString const & oid,
- css::uno::TypeDescription const & type,
- css::uno::TypeDescription const & member,
- std::vector< BinaryAny > const & inArguments)
-{
- OSL_ASSERT(!unblocked_.check());
- sendRequest(
- tid, oid, type, member, inArguments, false,
- css::uno::UnoInterfaceReference());
-}
-
-void Writer::sendDirectReply(
- rtl::ByteSequence const & tid, css::uno::TypeDescription const & member,
- bool exception, BinaryAny const & returnValue,
- std::vector< BinaryAny > const & outArguments)
-{
- OSL_ASSERT(!unblocked_.check());
- sendReply(tid, member, false, exception, returnValue,outArguments);
-}
-
-void Writer::queueRequest(
- rtl::ByteSequence const & tid, rtl::OUString const & oid,
- css::uno::TypeDescription const & type,
- css::uno::TypeDescription const & member,
- std::vector< BinaryAny > const & inArguments)
-{
- css::uno::UnoInterfaceReference cc(current_context::get());
- osl::MutexGuard g(mutex_);
- queue_.push_back(Item(tid, oid, type, member, inArguments, cc));
- items_.set();
-}
-
-void Writer::queueReply(
- rtl::ByteSequence const & tid,
- com::sun::star::uno::TypeDescription const & member, bool setter,
- bool exception, BinaryAny const & returnValue,
- std::vector< BinaryAny > const & outArguments, bool setCurrentContextMode)
-{
- osl::MutexGuard g(mutex_);
- queue_.push_back(
- Item(
- tid, member, setter, exception, returnValue, outArguments,
- setCurrentContextMode));
- items_.set();
-}
-
-void Writer::unblock() {
- // Assumes that osl::Condition::set works as a memory barrier, so that
- // changes made by preceeding sendDirectRequest/Reply calls are visible to
- // subsequent sendRequest/Reply calls:
- unblocked_.set();
-}
-
-void Writer::stop() {
- {
- osl::MutexGuard g(mutex_);
- stop_ = true;
- }
- unblocked_.set();
- items_.set();
-}
-
-Writer::~Writer() {}
-
-void Writer::run() {
- setName("binaryurpWriter");
- try {
- unblocked_.wait();
- for (;;) {
- items_.wait();
- Item item;
- {
- osl::MutexGuard g(mutex_);
- if (stop_) {
- return;
- }
- OSL_ASSERT(!queue_.empty());
- item = queue_.front();
- queue_.pop_front();
- if (queue_.empty()) {
- items_.reset();
- }
- }
- if (item.request) {
- sendRequest(
- item.tid, item.oid, item.type, item.member, item.arguments,
- (!item.oid.equalsAsciiL(
- RTL_CONSTASCII_STRINGPARAM("UrpProtocolProperties")) &&
- !item.member.equals(
- css::uno::TypeDescription(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "com.sun.star.uno.XInterface::"
- "release")))) &&
- bridge_->isCurrentContextMode()),
- item.currentContext);
- } else {
- sendReply(
- item.tid, item.member, item.setter, item.exception,
- item.returnValue, item.arguments);
- if (item.setCurrentContextMode) {
- bridge_->setCurrentContextMode();
- }
- }
- }
- } catch (css::uno::Exception & e) {
- OSL_TRACE(
- OSL_LOG_PREFIX "caught UNO exception '%s'",
- rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
- } catch (std::exception & e) {
- OSL_TRACE(OSL_LOG_PREFIX "caught C++ exception '%s'", e.what());
- }
- bridge_->terminate();
-}
-
-void Writer::onTerminated() {
- release();
-}
-
-void Writer::sendRequest(
- rtl::ByteSequence const & tid, rtl::OUString const & oid,
- css::uno::TypeDescription const & type,
- css::uno::TypeDescription const & member,
- std::vector< BinaryAny > const & inArguments, bool currentContextMode,
- css::uno::UnoInterfaceReference const & currentContext)
-{
- OSL_ASSERT(tid.getLength() != 0 && oid.getLength() != 0 && member.is());
- css::uno::TypeDescription t(type);
- sal_Int32 functionId = 0;
- bool forceSynchronous = false;
- member.makeComplete();
- switch (member.get()->eTypeClass) {
- case typelib_TypeClass_INTERFACE_ATTRIBUTE:
- {
- typelib_InterfaceAttributeTypeDescription * atd =
- reinterpret_cast< typelib_InterfaceAttributeTypeDescription * >(
- member.get());
- OSL_ASSERT(atd->pInterface != 0);
- if (!t.is()) {
- t = css::uno::TypeDescription(&atd->pInterface->aBase);
- }
- t.makeComplete();
- functionId = atd->pInterface->pMapMemberIndexToFunctionIndex[
- atd->aBase.nPosition];
- if (!inArguments.empty()) { // setter
- ++functionId;
- }
- break;
- }
- case typelib_TypeClass_INTERFACE_METHOD:
- {
- typelib_InterfaceMethodTypeDescription * mtd =
- reinterpret_cast< typelib_InterfaceMethodTypeDescription * >(
- member.get());
- OSL_ASSERT(mtd->pInterface != 0);
- if (!t.is()) {
- t = css::uno::TypeDescription(&mtd->pInterface->aBase);
- }
- t.makeComplete();
- functionId = mtd->pInterface->pMapMemberIndexToFunctionIndex[
- mtd->aBase.nPosition];
- forceSynchronous = mtd->bOneWay &&
- functionId != SPECIAL_FUNCTION_ID_RELEASE;
- break;
- }
- default:
- OSL_ASSERT(false); // this cannot happen
- break;
- }
- OSL_ASSERT(functionId >= 0);
- if (functionId > SAL_MAX_UINT16) {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("function ID too large for URP")),
- css::uno::Reference< css::uno::XInterface >());
- }
- std::vector< unsigned char > buf;
- bool newType = !(lastType_.is() && t.equals(lastType_));
- bool newOid = oid != lastOid_;
- bool newTid = tid != lastTid_;
- if (newType || newOid || newTid || forceSynchronous || functionId > 0x3FFF)
- // > 14 bit function ID
- {
- Marshal::write8(
- &buf,
- (0xC0 | (newType ? 0x20 : 0) | (newOid ? 0x10 : 0) |
- (newTid ? 0x08 : 0) | (functionId > 0xFF ? 0x04 : 0) |
- (forceSynchronous ? 0x01 : 0)));
- // bit 7: LONGHEADER, bit 6: REQUEST, bit 5: NEWTYPE, bit 4: NEWOID,
- // bit 3: NEWTID, bit 2: FUNCTIONID16, bit 0: MOREFLAGS
- if (forceSynchronous) {
- Marshal::write8(&buf, 0xC0); // bit 7: MUSTREPLY, bit 6: SYNCHRONOUS
- }
- if (functionId <= 0xFF) {
- Marshal::write8(&buf, static_cast< sal_uInt8 >(functionId));
- } else {
- Marshal::write16(&buf, static_cast< sal_uInt16 >(functionId));
- }
- if (newType) {
- marshal_.writeType(&buf, t);
- }
- if (newOid) {
- marshal_.writeOid(&buf, oid);
- }
- if (newTid) {
- marshal_.writeTid(&buf, tid);
- }
- } else if (functionId <= 0x3F) { // <= 6 bit function ID
- Marshal::write8(&buf, static_cast< sal_uInt8 >(functionId));
- // bit 7: !LONGHEADER, bit 6: !FUNCTIONID14
- } else {
- Marshal::write8(
- &buf, static_cast< sal_uInt8 >(0x40 | (functionId >> 8)));
- // bit 7: !LONGHEADER, bit 6: FUNCTIONID14
- Marshal::write8(&buf, functionId & 0xFF);
- }
- if (currentContextMode) {
- css::uno::UnoInterfaceReference cc(currentContext);
- marshal_.writeValue(
- &buf,
- css::uno::TypeDescription(
- cppu::UnoType<
- css::uno::Reference< css::uno::XCurrentContext > >::get()),
- BinaryAny(
- css::uno::TypeDescription(
- cppu::UnoType<
- css::uno::Reference<
- css::uno::XCurrentContext > >::get()),
- &cc.m_pUnoI));
- }
- switch (member.get()->eTypeClass) {
- case typelib_TypeClass_INTERFACE_ATTRIBUTE:
- if (!inArguments.empty()) { // setter
- OSL_ASSERT(inArguments.size() == 1);
- marshal_.writeValue(
- &buf,
- css::uno::TypeDescription(
- reinterpret_cast<
- typelib_InterfaceAttributeTypeDescription * >(
- member.get())->
- pAttributeTypeRef),
- inArguments.front());
- }
- break;
- case typelib_TypeClass_INTERFACE_METHOD:
- {
- typelib_InterfaceMethodTypeDescription * mtd =
- reinterpret_cast< typelib_InterfaceMethodTypeDescription * >(
- member.get());
- std::vector< BinaryAny >::const_iterator i(inArguments.begin());
- for (sal_Int32 j = 0; j != mtd->nParams; ++j) {
- if (mtd->pParams[j].bIn) {
- marshal_.writeValue(
- &buf,
- css::uno::TypeDescription(mtd->pParams[j].pTypeRef),
- *i++);
- }
- }
- OSL_ASSERT(i == inArguments.end());
- break;
- }
- default:
- OSL_ASSERT(false); // this cannot happen
- break;
- }
- sendMessage(buf);
- lastType_ = t;
- lastOid_ = oid;
- lastTid_ = tid;
-}
-
-void Writer::sendReply(
- rtl::ByteSequence const & tid,
- com::sun::star::uno::TypeDescription const & member, bool setter,
- bool exception, BinaryAny const & returnValue,
- std::vector< BinaryAny > const & outArguments)
-{
- OSL_ASSERT(tid.getLength() != 0 && member.is() && member.get()->bComplete);
- std::vector< unsigned char > buf;
- bool newTid = tid != lastTid_;
- Marshal::write8(&buf, 0x80 | (exception ? 0x20 : 0) | (newTid ? 0x08 : 0));
- // bit 7: LONGHEADER; bit 6: !REQUEST; bit 5: EXCEPTION; bit 3: NEWTID
- if (newTid) {
- marshal_.writeTid(&buf, tid);
- }
- if (exception) {
- marshal_.writeValue(
- &buf,
- css::uno::TypeDescription(cppu::UnoType< css::uno::Any >::get()),
- returnValue);
- } else {
- switch (member.get()->eTypeClass) {
- case typelib_TypeClass_INTERFACE_ATTRIBUTE:
- if (!setter) {
- marshal_.writeValue(
- &buf,
- css::uno::TypeDescription(
- reinterpret_cast<
- typelib_InterfaceAttributeTypeDescription * >(
- member.get())->
- pAttributeTypeRef),
- returnValue);
- }
- break;
- case typelib_TypeClass_INTERFACE_METHOD:
- {
- typelib_InterfaceMethodTypeDescription * mtd =
- reinterpret_cast<
- typelib_InterfaceMethodTypeDescription * >(
- member.get());
- marshal_.writeValue(
- &buf, css::uno::TypeDescription(mtd->pReturnTypeRef),
- returnValue);
- std::vector< BinaryAny >::const_iterator i(
- outArguments.begin());
- for (sal_Int32 j = 0; j != mtd->nParams; ++j) {
- if (mtd->pParams[j].bOut) {
- marshal_.writeValue(
- &buf,
- css::uno::TypeDescription(mtd->pParams[j].pTypeRef),
- *i++);
- }
- }
- OSL_ASSERT(i == outArguments.end());
- break;
- }
- default:
- OSL_ASSERT(false); // this cannot happen
- break;
- }
- }
- sendMessage(buf);
- lastTid_ = tid;
- bridge_->decrementCalls();
-}
-
-void Writer::sendMessage(std::vector< unsigned char > const & buffer) {
- std::vector< unsigned char > header;
- if (buffer.size() > SAL_MAX_UINT32) {
- throw css::uno::RuntimeException(
- rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM("message too large for URP")),
- css::uno::Reference< css::uno::XInterface >());
- }
- Marshal::write32(&header, static_cast< sal_uInt32 >(buffer.size()));
- Marshal::write32(&header, 1);
- OSL_ASSERT(!buffer.empty());
- unsigned char const * p = &buffer[0];
- std::vector< unsigned char >::size_type n = buffer.size();
- OSL_ASSERT(header.size() <= SAL_MAX_INT32 && SAL_MAX_INT32 <= SAL_MAX_SIZE);
- sal_Size k = SAL_MAX_INT32 - header.size();
- if (n < k) {
- k = static_cast< sal_Size >(n);
- }
- css::uno::Sequence< sal_Int8 > s(
- static_cast< sal_Int32 >(header.size() + k));
- OSL_ASSERT(!header.empty());
- rtl_copyMemory(
- s.getArray(), &header[0], static_cast< sal_Size >(header.size()));
- for (;;) {
- rtl_copyMemory(s.getArray() + s.getLength() - k, p, k);
- try {
- bridge_->getConnection()->write(s);
- } catch (css::io::IOException & e) {
- css::uno::Any exc(cppu::getCaughtException());
- throw css::lang::WrappedTargetRuntimeException(
- (rtl::OUString(
- RTL_CONSTASCII_USTRINGPARAM(
- "Binary URP write raised IO exception: ")) +
- e.Message),
- css::uno::Reference< css::uno::XInterface >(), exc);
- }
- n = static_cast< std::vector< unsigned char >::size_type >(n - k);
- if (n == 0) {
- break;
- }
- p += k;
- k = SAL_MAX_INT32;
- if (n < k) {
- k = static_cast< sal_Size >(n);
- }
- s.realloc(k);
- }
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */