zeroc-ice 3.6b1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ICE_LICENSE +54 -0
- data/LICENSE +339 -0
- data/bin/slice2rb +17 -0
- data/ext/Communicator.cpp +596 -0
- data/ext/Communicator.h +25 -0
- data/ext/Config.h +111 -0
- data/ext/Connection.cpp +381 -0
- data/ext/Connection.h +26 -0
- data/ext/Endpoint.cpp +311 -0
- data/ext/Endpoint.h +27 -0
- data/ext/ImplicitContext.cpp +152 -0
- data/ext/ImplicitContext.h +25 -0
- data/ext/Init.cpp +52 -0
- data/ext/Logger.cpp +151 -0
- data/ext/Logger.h +28 -0
- data/ext/ObjectFactory.cpp +140 -0
- data/ext/ObjectFactory.h +50 -0
- data/ext/Operation.cpp +676 -0
- data/ext/Operation.h +36 -0
- data/ext/Properties.cpp +369 -0
- data/ext/Properties.h +25 -0
- data/ext/Proxy.cpp +1354 -0
- data/ext/Proxy.h +27 -0
- data/ext/Slice.cpp +223 -0
- data/ext/Slice.h +22 -0
- data/ext/Types.cpp +3160 -0
- data/ext/Types.h +545 -0
- data/ext/Util.cpp +792 -0
- data/ext/Util.h +511 -0
- data/ext/extconf.rb +118 -0
- data/ext/ice/BZIP_LICENSE +42 -0
- data/ext/ice/MCPP_LICENSE +36 -0
- data/ext/ice/bzip2/blocksort.c +1094 -0
- data/ext/ice/bzip2/bzlib.c +1572 -0
- data/ext/ice/bzip2/bzlib.h +282 -0
- data/ext/ice/bzip2/bzlib_private.h +509 -0
- data/ext/ice/bzip2/compress.c +672 -0
- data/ext/ice/bzip2/crctable.c +104 -0
- data/ext/ice/bzip2/decompress.c +646 -0
- data/ext/ice/bzip2/huffman.c +205 -0
- data/ext/ice/bzip2/randtable.c +84 -0
- data/ext/ice/cpp/include/Ice/ACMF.h +30 -0
- data/ext/ice/cpp/include/Ice/Application.h +156 -0
- data/ext/ice/cpp/include/Ice/AsyncResult.h +363 -0
- data/ext/ice/cpp/include/Ice/AsyncResultF.h +26 -0
- data/ext/ice/cpp/include/Ice/BasicStream.h +1315 -0
- data/ext/ice/cpp/include/Ice/Buffer.h +159 -0
- data/ext/ice/cpp/include/Ice/BuiltinSequences.h +74 -0
- data/ext/ice/cpp/include/Ice/Communicator.h +194 -0
- data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/CommunicatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/Config.h +97 -0
- data/ext/ice/cpp/include/Ice/Connection.h +495 -0
- data/ext/ice/cpp/include/Ice/ConnectionAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/ConnectionF.h +72 -0
- data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +30 -0
- data/ext/ice/cpp/include/Ice/ConnectionIF.h +37 -0
- data/ext/ice/cpp/include/Ice/Current.h +94 -0
- data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +48 -0
- data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +62 -0
- data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +33 -0
- data/ext/ice/cpp/include/Ice/Dispatcher.h +51 -0
- data/ext/ice/cpp/include/Ice/DynamicLibrary.h +105 -0
- data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +29 -0
- data/ext/ice/cpp/include/Ice/Endpoint.h +350 -0
- data/ext/ice/cpp/include/Ice/EndpointF.h +97 -0
- data/ext/ice/cpp/include/Ice/EndpointTypes.h +74 -0
- data/ext/ice/cpp/include/Ice/Exception.h +114 -0
- data/ext/ice/cpp/include/Ice/FacetMap.h +56 -0
- data/ext/ice/cpp/include/Ice/FactoryTable.h +69 -0
- data/ext/ice/cpp/include/Ice/FactoryTableInit.h +87 -0
- data/ext/ice/cpp/include/Ice/Format.h +39 -0
- data/ext/ice/cpp/include/Ice/Functional.h +138 -0
- data/ext/ice/cpp/include/Ice/GCObject.h +73 -0
- data/ext/ice/cpp/include/Ice/Handle.h +192 -0
- data/ext/ice/cpp/include/Ice/Ice.h +54 -0
- data/ext/ice/cpp/include/Ice/Identity.h +160 -0
- data/ext/ice/cpp/include/Ice/ImplicitContext.h +96 -0
- data/ext/ice/cpp/include/Ice/ImplicitContextF.h +60 -0
- data/ext/ice/cpp/include/Ice/Incoming.h +131 -0
- data/ext/ice/cpp/include/Ice/IncomingAsync.h +108 -0
- data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +35 -0
- data/ext/ice/cpp/include/Ice/Initialize.h +141 -0
- data/ext/ice/cpp/include/Ice/InstanceF.h +26 -0
- data/ext/ice/cpp/include/Ice/Instrumentation.h +377 -0
- data/ext/ice/cpp/include/Ice/InstrumentationF.h +71 -0
- data/ext/ice/cpp/include/Ice/LocalException.h +1022 -0
- data/ext/ice/cpp/include/Ice/LocalObject.h +36 -0
- data/ext/ice/cpp/include/Ice/LocalObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/Locator.h +2191 -0
- data/ext/ice/cpp/include/Ice/LocatorF.h +89 -0
- data/ext/ice/cpp/include/Ice/Logger.h +94 -0
- data/ext/ice/cpp/include/Ice/LoggerF.h +60 -0
- data/ext/ice/cpp/include/Ice/LoggerUtil.h +153 -0
- data/ext/ice/cpp/include/Ice/Makefile +26 -0
- data/ext/ice/cpp/include/Ice/Metrics.h +2989 -0
- data/ext/ice/cpp/include/Ice/MetricsAdminI.h +662 -0
- data/ext/ice/cpp/include/Ice/MetricsFunctional.h +144 -0
- data/ext/ice/cpp/include/Ice/MetricsObserverI.h +576 -0
- data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +55 -0
- data/ext/ice/cpp/include/Ice/Object.h +165 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapter.h +162 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectFactory.h +86 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObserverHelper.h +177 -0
- data/ext/ice/cpp/include/Ice/Outgoing.h +197 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsync.h +264 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +38 -0
- data/ext/ice/cpp/include/Ice/Plugin.h +121 -0
- data/ext/ice/cpp/include/Ice/PluginF.h +66 -0
- data/ext/ice/cpp/include/Ice/Process.h +568 -0
- data/ext/ice/cpp/include/Ice/ProcessF.h +77 -0
- data/ext/ice/cpp/include/Ice/Properties.h +130 -0
- data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +824 -0
- data/ext/ice/cpp/include/Ice/PropertiesF.h +83 -0
- data/ext/ice/cpp/include/Ice/Protocol.h +242 -0
- data/ext/ice/cpp/include/Ice/Proxy.h +2448 -0
- data/ext/ice/cpp/include/Ice/ProxyF.h +78 -0
- data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ProxyHandle.h +330 -0
- data/ext/ice/cpp/include/Ice/ReferenceF.h +34 -0
- data/ext/ice/cpp/include/Ice/RemoteLogger.h +1496 -0
- data/ext/ice/cpp/include/Ice/RequestHandlerF.h +29 -0
- data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +25 -0
- data/ext/ice/cpp/include/Ice/Router.h +1155 -0
- data/ext/ice/cpp/include/Ice/RouterF.h +77 -0
- data/ext/ice/cpp/include/Ice/ServantLocator.h +90 -0
- data/ext/ice/cpp/include/Ice/ServantLocatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/ServantManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/Service.h +260 -0
- data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +56 -0
- data/ext/ice/cpp/include/Ice/SliceChecksums.h +34 -0
- data/ext/ice/cpp/include/Ice/SlicedData.h +103 -0
- data/ext/ice/cpp/include/Ice/SlicedDataF.h +34 -0
- data/ext/ice/cpp/include/Ice/Stream.h +449 -0
- data/ext/ice/cpp/include/Ice/StreamF.h +30 -0
- data/ext/ice/cpp/include/Ice/StreamHelpers.h +877 -0
- data/ext/ice/cpp/include/Ice/ThreadPoolF.h +28 -0
- data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +56 -0
- data/ext/ice/cpp/include/Ice/Version.h +254 -0
- data/ext/ice/cpp/include/IceSSL/Config.h +23 -0
- data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +119 -0
- data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +101 -0
- data/ext/ice/cpp/include/IceSSL/IceSSL.h +22 -0
- data/ext/ice/cpp/include/IceSSL/Makefile +26 -0
- data/ext/ice/cpp/include/IceSSL/Plugin.h +558 -0
- data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +119 -0
- data/ext/ice/cpp/include/IceUtil/Cache.h +362 -0
- data/ext/ice/cpp/include/IceUtil/Cond.h +323 -0
- data/ext/ice/cpp/include/IceUtil/Config.h +234 -0
- data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +50 -0
- data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +70 -0
- data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +45 -0
- data/ext/ice/cpp/include/IceUtil/Exception.h +184 -0
- data/ext/ice/cpp/include/IceUtil/Functional.h +389 -0
- data/ext/ice/cpp/include/IceUtil/Handle.h +266 -0
- data/ext/ice/cpp/include/IceUtil/IceUtil.h +51 -0
- data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +302 -0
- data/ext/ice/cpp/include/IceUtil/InputUtil.h +47 -0
- data/ext/ice/cpp/include/IceUtil/Iterator.h +36 -0
- data/ext/ice/cpp/include/IceUtil/Lock.h +135 -0
- data/ext/ice/cpp/include/IceUtil/Makefile +26 -0
- data/ext/ice/cpp/include/IceUtil/Monitor.h +249 -0
- data/ext/ice/cpp/include/IceUtil/Mutex.h +357 -0
- data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +28 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +83 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +82 -0
- data/ext/ice/cpp/include/IceUtil/Optional.h +322 -0
- data/ext/ice/cpp/include/IceUtil/Options.h +141 -0
- data/ext/ice/cpp/include/IceUtil/OutputUtil.h +362 -0
- data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +19 -0
- data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +26 -0
- data/ext/ice/cpp/include/IceUtil/Random.h +24 -0
- data/ext/ice/cpp/include/IceUtil/RecMutex.h +113 -0
- data/ext/ice/cpp/include/IceUtil/SHA1.h +65 -0
- data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +44 -0
- data/ext/ice/cpp/include/IceUtil/ScopedArray.h +97 -0
- data/ext/ice/cpp/include/IceUtil/Shared.h +168 -0
- data/ext/ice/cpp/include/IceUtil/StringConverter.h +175 -0
- data/ext/ice/cpp/include/IceUtil/StringUtil.h +91 -0
- data/ext/ice/cpp/include/IceUtil/Thread.h +181 -0
- data/ext/ice/cpp/include/IceUtil/ThreadException.h +108 -0
- data/ext/ice/cpp/include/IceUtil/Time.h +209 -0
- data/ext/ice/cpp/include/IceUtil/Timer.h +143 -0
- data/ext/ice/cpp/include/IceUtil/UUID.h +22 -0
- data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +42 -0
- data/ext/ice/cpp/include/IceUtil/UniquePtr.h +101 -0
- data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/Checksum.h +26 -0
- data/ext/ice/cpp/include/Slice/CsUtil.h +92 -0
- data/ext/ice/cpp/include/Slice/DotNetNames.h +34 -0
- data/ext/ice/cpp/include/Slice/FileTracker.h +71 -0
- data/ext/ice/cpp/include/Slice/JavaUtil.h +277 -0
- data/ext/ice/cpp/include/Slice/Makefile +26 -0
- data/ext/ice/cpp/include/Slice/PHPUtil.h +50 -0
- data/ext/ice/cpp/include/Slice/Parser.h +1116 -0
- data/ext/ice/cpp/include/Slice/Preprocessor.h +68 -0
- data/ext/ice/cpp/include/Slice/PythonUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/RubyUtil.h +54 -0
- data/ext/ice/cpp/include/Slice/Util.h +33 -0
- data/ext/ice/cpp/src/Ice/ACM.cpp +343 -0
- data/ext/ice/cpp/src/Ice/ACM.h +117 -0
- data/ext/ice/cpp/src/Ice/Acceptor.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Acceptor.h +41 -0
- data/ext/ice/cpp/src/Ice/AcceptorF.h +30 -0
- data/ext/ice/cpp/src/Ice/Application.cpp +760 -0
- data/ext/ice/cpp/src/Ice/AsyncResult.cpp +599 -0
- data/ext/ice/cpp/src/Ice/Base64.cpp +269 -0
- data/ext/ice/cpp/src/Ice/Base64.h +36 -0
- data/ext/ice/cpp/src/Ice/BasicStream.cpp +3393 -0
- data/ext/ice/cpp/src/Ice/Buffer.cpp +98 -0
- data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +34 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +718 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +106 -0
- data/ext/ice/cpp/src/Ice/Communicator.cpp +45 -0
- data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +386 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.h +112 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +546 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +97 -0
- data/ext/ice/cpp/src/Ice/Connection.cpp +58 -0
- data/ext/ice/cpp/src/Ice/ConnectionF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +1639 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.h +236 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.cpp +3876 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.h +364 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +115 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +50 -0
- data/ext/ice/cpp/src/Ice/Connector.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Connector.h +36 -0
- data/ext/ice/cpp/src/Ice/ConnectorF.h +26 -0
- data/ext/ice/cpp/src/Ice/Current.cpp +38 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +168 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +57 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +26 -0
- data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +60 -0
- data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +49 -0
- data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +281 -0
- data/ext/ice/cpp/src/Ice/Endpoint.cpp +53 -0
- data/ext/ice/cpp/src/Ice/EndpointF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +25 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.h +44 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +208 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +46 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointI.cpp +87 -0
- data/ext/ice/cpp/src/Ice/EndpointI.h +165 -0
- data/ext/ice/cpp/src/Ice/EndpointIF.h +41 -0
- data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EventHandler.cpp +35 -0
- data/ext/ice/cpp/src/Ice/EventHandler.h +78 -0
- data/ext/ice/cpp/src/Ice/EventHandlerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +53 -0
- data/ext/ice/cpp/src/Ice/Exception.cpp +832 -0
- data/ext/ice/cpp/src/Ice/FacetMap.cpp +34 -0
- data/ext/ice/cpp/src/Ice/FactoryTable.cpp +158 -0
- data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +95 -0
- data/ext/ice/cpp/src/Ice/GCObject.cpp +444 -0
- data/ext/ice/cpp/src/Ice/HashUtil.h +59 -0
- data/ext/ice/cpp/src/Ice/HttpParser.cpp +680 -0
- data/ext/ice/cpp/src/Ice/HttpParser.h +124 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +733 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.h +157 -0
- data/ext/ice/cpp/src/Ice/IPEndpointIF.h +29 -0
- data/ext/ice/cpp/src/Ice/Identity.cpp +42 -0
- data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +639 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.h +51 -0
- data/ext/ice/cpp/src/Ice/Incoming.cpp +757 -0
- data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +340 -0
- data/ext/ice/cpp/src/Ice/IncomingRequest.h +37 -0
- data/ext/ice/cpp/src/Ice/Initialize.cpp +401 -0
- data/ext/ice/cpp/src/Ice/Instance.cpp +1928 -0
- data/ext/ice/cpp/src/Ice/Instance.h +198 -0
- data/ext/ice/cpp/src/Ice/Instrumentation.cpp +68 -0
- data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +43 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1083 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.h +262 -0
- data/ext/ice/cpp/src/Ice/LocalException.cpp +2091 -0
- data/ext/ice/cpp/src/Ice/LocalObject.cpp +29 -0
- data/ext/ice/cpp/src/Ice/Locator.cpp +1946 -0
- data/ext/ice/cpp/src/Ice/LocatorF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +917 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.h +193 -0
- data/ext/ice/cpp/src/Ice/LocatorInfoF.h +34 -0
- data/ext/ice/cpp/src/Ice/Logger.cpp +40 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +862 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.h +46 -0
- data/ext/ice/cpp/src/Ice/LoggerF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/LoggerI.cpp +199 -0
- data/ext/ice/cpp/src/Ice/LoggerI.h +57 -0
- data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +107 -0
- data/ext/ice/cpp/src/Ice/Makefile +190 -0
- data/ext/ice/cpp/src/Ice/Metrics.cpp +2159 -0
- data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +669 -0
- data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +14 -0
- data/ext/ice/cpp/src/Ice/Network.cpp +2694 -0
- data/ext/ice/cpp/src/Ice/Network.h +291 -0
- data/ext/ice/cpp/src/Ice/NetworkF.h +28 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +325 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.h +74 -0
- data/ext/ice/cpp/src/Ice/NetworkProxyF.h +26 -0
- data/ext/ice/cpp/src/Ice/Object.cpp +440 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +241 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +52 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +1498 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +155 -0
- data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +140 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +43 -0
- data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +84 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +407 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +70 -0
- data/ext/ice/cpp/src/Ice/Outgoing.cpp +737 -0
- data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +874 -0
- data/ext/ice/cpp/src/Ice/Plugin.cpp +43 -0
- data/ext/ice/cpp/src/Ice/PluginF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +503 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.h +67 -0
- data/ext/ice/cpp/src/Ice/Process.cpp +299 -0
- data/ext/ice/cpp/src/Ice/ProcessF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/Properties.cpp +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +555 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +207 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.cpp +759 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.h +78 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.cpp +1293 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.h +81 -0
- data/ext/ice/cpp/src/Ice/Protocol.cpp +137 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +98 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.h +91 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +26 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +51 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +67 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +26 -0
- data/ext/ice/cpp/src/Ice/Proxy.cpp +1810 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +305 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.h +57 -0
- data/ext/ice/cpp/src/Ice/Reference.cpp +1947 -0
- data/ext/ice/cpp/src/Ice/Reference.h +305 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +937 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.h +81 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +24 -0
- data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +958 -0
- data/ext/ice/cpp/src/Ice/ReplyStatus.h +29 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.cpp +40 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.h +90 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +70 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +41 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +20 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.h +39 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.cpp +154 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.h +69 -0
- data/ext/ice/cpp/src/Ice/RetryQueueF.h +24 -0
- data/ext/ice/cpp/src/Ice/Router.cpp +849 -0
- data/ext/ice/cpp/src/Ice/RouterF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.cpp +381 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.h +148 -0
- data/ext/ice/cpp/src/Ice/RouterInfoF.h +30 -0
- data/ext/ice/cpp/src/Ice/Selector.cpp +926 -0
- data/ext/ice/cpp/src/Ice/Selector.h +231 -0
- data/ext/ice/cpp/src/Ice/ServantLocator.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ServantManager.cpp +495 -0
- data/ext/ice/cpp/src/Ice/ServantManager.h +74 -0
- data/ext/ice/cpp/src/Ice/Service.cpp +1897 -0
- data/ext/ice/cpp/src/Ice/SharedContext.h +51 -0
- data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +34 -0
- data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +80 -0
- data/ext/ice/cpp/src/Ice/SlicedData.cpp +80 -0
- data/ext/ice/cpp/src/Ice/Stream.cpp +53 -0
- data/ext/ice/cpp/src/Ice/StreamI.cpp +832 -0
- data/ext/ice/cpp/src/Ice/StreamI.h +198 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.cpp +521 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.h +85 -0
- data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +145 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +167 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.h +43 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +235 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.h +67 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.cpp +133 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +397 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.h +93 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +127 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.h +61 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.cpp +1357 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.h +399 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.cpp +43 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.h +50 -0
- data/ext/ice/cpp/src/Ice/TraceLevelsF.h +26 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.cpp +452 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.h +28 -0
- data/ext/ice/cpp/src/Ice/Transceiver.cpp +24 -0
- data/ext/ice/cpp/src/Ice/Transceiver.h +52 -0
- data/ext/ice/cpp/src/Ice/TransceiverF.h +38 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.cpp +144 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +483 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.h +95 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +1156 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.h +123 -0
- data/ext/ice/cpp/src/Ice/Version.cpp +46 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +103 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.h +61 -0
- data/ext/ice/cpp/src/Ice/WSConnector.cpp +113 -0
- data/ext/ice/cpp/src/Ice/WSConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +441 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.h +97 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +1728 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.h +149 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +594 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +1035 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +208 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +78 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +308 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.h +183 -0
- data/ext/ice/cpp/src/IceDiscovery/Makefile +61 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +148 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.h +39 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +258 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.h +66 -0
- data/ext/ice/cpp/src/IceSSL/Certificate.cpp +1334 -0
- data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +42 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +151 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +397 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.h +96 -0
- data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +41 -0
- data/ext/ice/cpp/src/IceSSL/Instance.cpp +38 -0
- data/ext/ice/cpp/src/IceSSL/Instance.h +42 -0
- data/ext/ice/cpp/src/IceSSL/InstanceF.h +34 -0
- data/ext/ice/cpp/src/IceSSL/Makefile +82 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +1001 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +607 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +75 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.cpp +102 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +541 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.h +67 -0
- data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +729 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +1062 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +130 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +291 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.h +264 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +41 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +1514 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +609 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +91 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +246 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.h +51 -0
- data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +26 -0
- data/ext/ice/cpp/src/IceSSL/Util.cpp +1423 -0
- data/ext/ice/cpp/src/IceSSL/Util.h +136 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +65 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.h +41 -0
- data/ext/ice/cpp/src/IceUtil/Cond.cpp +386 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +477 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +144 -0
- data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +184 -0
- data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +273 -0
- data/ext/ice/cpp/src/IceUtil/Exception.cpp +782 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +532 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.h +159 -0
- data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +41 -0
- data/ext/ice/cpp/src/IceUtil/Makefile +68 -0
- data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +24 -0
- data/ext/ice/cpp/src/IceUtil/Options.cpp +1049 -0
- data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +591 -0
- data/ext/ice/cpp/src/IceUtil/Random.cpp +185 -0
- data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +257 -0
- data/ext/ice/cpp/src/IceUtil/SHA1.cpp +126 -0
- data/ext/ice/cpp/src/IceUtil/Shared.cpp +200 -0
- data/ext/ice/cpp/src/IceUtil/StopWatch.h +54 -0
- data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +450 -0
- data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +842 -0
- data/ext/ice/cpp/src/IceUtil/Thread.cpp +809 -0
- data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +172 -0
- data/ext/ice/cpp/src/IceUtil/Time.cpp +306 -0
- data/ext/ice/cpp/src/IceUtil/Timer.cpp +251 -0
- data/ext/ice/cpp/src/IceUtil/UUID.cpp +174 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.cpp +131 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.h +49 -0
- data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +1139 -0
- data/ext/ice/cpp/src/Slice/Checksum.cpp +452 -0
- data/ext/ice/cpp/src/Slice/CsUtil.cpp +2650 -0
- data/ext/ice/cpp/src/Slice/DotNetNames.cpp +146 -0
- data/ext/ice/cpp/src/Slice/FileTracker.cpp +203 -0
- data/ext/ice/cpp/src/Slice/Grammar.cpp +4755 -0
- data/ext/ice/cpp/src/Slice/Grammar.h +98 -0
- data/ext/ice/cpp/src/Slice/GrammarUtil.h +234 -0
- data/ext/ice/cpp/src/Slice/JavaUtil.cpp +4376 -0
- data/ext/ice/cpp/src/Slice/MD5.cpp +57 -0
- data/ext/ice/cpp/src/Slice/MD5.h +44 -0
- data/ext/ice/cpp/src/Slice/MD5I.cpp +385 -0
- data/ext/ice/cpp/src/Slice/MD5I.h +91 -0
- data/ext/ice/cpp/src/Slice/Makefile +65 -0
- data/ext/ice/cpp/src/Slice/PHPUtil.cpp +156 -0
- data/ext/ice/cpp/src/Slice/Parser.cpp +6386 -0
- data/ext/ice/cpp/src/Slice/Preprocessor.cpp +686 -0
- data/ext/ice/cpp/src/Slice/Python.cpp +675 -0
- data/ext/ice/cpp/src/Slice/PythonUtil.cpp +2614 -0
- data/ext/ice/cpp/src/Slice/Ruby.cpp +317 -0
- data/ext/ice/cpp/src/Slice/RubyUtil.cpp +1774 -0
- data/ext/ice/cpp/src/Slice/Scanner.cpp +2426 -0
- data/ext/ice/cpp/src/Slice/Util.cpp +325 -0
- data/ext/ice/mcpp/config.h.Darwin +227 -0
- data/ext/ice/mcpp/config.h.Linux +227 -0
- data/ext/ice/mcpp/config.h.MINGW +7 -0
- data/ext/ice/mcpp/configed.H +382 -0
- data/ext/ice/mcpp/directive.c +1699 -0
- data/ext/ice/mcpp/eval.c +1673 -0
- data/ext/ice/mcpp/expand.c +2980 -0
- data/ext/ice/mcpp/internal.H +564 -0
- data/ext/ice/mcpp/main.c +1131 -0
- data/ext/ice/mcpp/mbchar.c +869 -0
- data/ext/ice/mcpp/mcpp_lib.h +31 -0
- data/ext/ice/mcpp/mcpp_out.h +13 -0
- data/ext/ice/mcpp/support.c +2811 -0
- data/ext/ice/mcpp/system.H +396 -0
- data/ext/ice/mcpp/system.c +4940 -0
- data/ice.gemspec +41 -0
- data/lib/Glacier2.rb +12 -0
- data/lib/Glacier2/Metrics.rb +99 -0
- data/lib/Glacier2/PermissionsVerifier.rb +168 -0
- data/lib/Glacier2/PermissionsVerifierF.rb +34 -0
- data/lib/Glacier2/Router.rb +141 -0
- data/lib/Glacier2/RouterF.rb +29 -0
- data/lib/Glacier2/SSLInfo.rb +79 -0
- data/lib/Glacier2/Session.rb +470 -0
- data/lib/Ice.rb +659 -0
- data/lib/Ice/BuiltinSequences.rb +64 -0
- data/lib/Ice/Communicator.rb +93 -0
- data/lib/Ice/CommunicatorF.rb +28 -0
- data/lib/Ice/Connection.rb +414 -0
- data/lib/Ice/ConnectionF.rb +36 -0
- data/lib/Ice/Current.rb +152 -0
- data/lib/Ice/Endpoint.rb +265 -0
- data/lib/Ice/EndpointF.rb +52 -0
- data/lib/Ice/EndpointTypes.rb +77 -0
- data/lib/Ice/FacetMap.rb +28 -0
- data/lib/Ice/Identity.rb +70 -0
- data/lib/Ice/ImplicitContext.rb +59 -0
- data/lib/Ice/ImplicitContextF.rb +28 -0
- data/lib/Ice/Instrumentation.rb +425 -0
- data/lib/Ice/InstrumentationF.rb +35 -0
- data/lib/Ice/LocalException.rb +1081 -0
- data/lib/Ice/Locator.rb +314 -0
- data/lib/Ice/LocatorF.rb +34 -0
- data/lib/Ice/Logger.rb +57 -0
- data/lib/Ice/LoggerF.rb +28 -0
- data/lib/Ice/Metrics.rb +696 -0
- data/lib/Ice/ObjectAdapterF.rb +28 -0
- data/lib/Ice/ObjectFactory.rb +53 -0
- data/lib/Ice/ObjectFactoryF.rb +28 -0
- data/lib/Ice/Plugin.rb +87 -0
- data/lib/Ice/PluginF.rb +32 -0
- data/lib/Ice/Process.rb +93 -0
- data/lib/Ice/ProcessF.rb +29 -0
- data/lib/Ice/Properties.rb +65 -0
- data/lib/Ice/PropertiesAdmin.rb +104 -0
- data/lib/Ice/PropertiesF.rb +33 -0
- data/lib/Ice/Router.rb +163 -0
- data/lib/Ice/RouterF.rb +29 -0
- data/lib/Ice/SliceChecksumDict.rb +28 -0
- data/lib/Ice/Version.rb +100 -0
- data/lib/IceBox.rb +10 -0
- data/lib/IceBox/IceBox.rb +272 -0
- data/lib/IceGrid.rb +17 -0
- data/lib/IceGrid/Admin.rb +1076 -0
- data/lib/IceGrid/Descriptor.rb +1505 -0
- data/lib/IceGrid/Exception.rb +401 -0
- data/lib/IceGrid/FileParser.rb +105 -0
- data/lib/IceGrid/Locator.rb +105 -0
- data/lib/IceGrid/Observer.rb +571 -0
- data/lib/IceGrid/Query.rb +168 -0
- data/lib/IceGrid/Registry.rb +120 -0
- data/lib/IceGrid/Session.rb +114 -0
- data/lib/IceGrid/UserAccountMapper.rb +101 -0
- data/lib/IcePatch2.rb +10 -0
- data/lib/IcePatch2/FileInfo.rb +75 -0
- data/lib/IcePatch2/FileServer.rb +141 -0
- data/lib/IceStorm.rb +11 -0
- data/lib/IceStorm/IceStorm.rb +463 -0
- data/lib/IceStorm/Metrics.rb +155 -0
- data/slice/Freeze/BackgroundSaveEvictor.ice +111 -0
- data/slice/Freeze/CatalogData.ice +49 -0
- data/slice/Freeze/Connection.ice +111 -0
- data/slice/Freeze/ConnectionF.ice +20 -0
- data/slice/Freeze/DB.ice +37 -0
- data/slice/Freeze/Evictor.ice +339 -0
- data/slice/Freeze/EvictorF.ice +22 -0
- data/slice/Freeze/EvictorStorage.ice +72 -0
- data/slice/Freeze/Exception.ice +100 -0
- data/slice/Freeze/Transaction.ice +57 -0
- data/slice/Freeze/TransactionalEvictor.ice +50 -0
- data/slice/Glacier2/Metrics.ice +77 -0
- data/slice/Glacier2/PermissionsVerifier.ice +105 -0
- data/slice/Glacier2/PermissionsVerifierF.ice +21 -0
- data/slice/Glacier2/Router.ice +178 -0
- data/slice/Glacier2/RouterF.ice +20 -0
- data/slice/Glacier2/SSLInfo.ice +50 -0
- data/slice/Glacier2/Session.ice +273 -0
- data/slice/Ice/BuiltinSequences.ice +48 -0
- data/slice/Ice/Communicator.ice +567 -0
- data/slice/Ice/CommunicatorF.ice +20 -0
- data/slice/Ice/Connection.ice +323 -0
- data/slice/Ice/ConnectionF.ice +22 -0
- data/slice/Ice/Current.ice +160 -0
- data/slice/Ice/Endpoint.ice +227 -0
- data/slice/Ice/EndpointF.ice +32 -0
- data/slice/Ice/EndpointTypes.ice +38 -0
- data/slice/Ice/FacetMap.ice +25 -0
- data/slice/Ice/Identity.ice +59 -0
- data/slice/Ice/ImplicitContext.ice +109 -0
- data/slice/Ice/ImplicitContextF.ice +20 -0
- data/slice/Ice/Instrumentation.ice +499 -0
- data/slice/Ice/InstrumentationF.ice +26 -0
- data/slice/Ice/LocalException.ice +1015 -0
- data/slice/Ice/Locator.ice +227 -0
- data/slice/Ice/LocatorF.ice +21 -0
- data/slice/Ice/Logger.ice +86 -0
- data/slice/Ice/LoggerF.ice +20 -0
- data/slice/Ice/Metrics.ice +422 -0
- data/slice/Ice/ObjectAdapter.ice +673 -0
- data/slice/Ice/ObjectAdapterF.ice +20 -0
- data/slice/Ice/ObjectFactory.ice +60 -0
- data/slice/Ice/ObjectFactoryF.ice +20 -0
- data/slice/Ice/Plugin.ice +117 -0
- data/slice/Ice/PluginF.ice +21 -0
- data/slice/Ice/Process.ice +54 -0
- data/slice/Ice/ProcessF.ice +20 -0
- data/slice/Ice/Properties.ice +228 -0
- data/slice/Ice/PropertiesAdmin.ice +75 -0
- data/slice/Ice/PropertiesF.ice +21 -0
- data/slice/Ice/RemoteLogger.ice +232 -0
- data/slice/Ice/Router.ice +83 -0
- data/slice/Ice/RouterF.ice +20 -0
- data/slice/Ice/ServantLocator.ice +117 -0
- data/slice/Ice/ServantLocatorF.ice +20 -0
- data/slice/Ice/SliceChecksumDict.ice +25 -0
- data/slice/Ice/Version.ice +39 -0
- data/slice/IceBox/IceBox.ice +194 -0
- data/slice/IceDiscovery/IceDiscovery.ice +32 -0
- data/slice/IceGrid/Admin.ice +1578 -0
- data/slice/IceGrid/Descriptor.ice +1079 -0
- data/slice/IceGrid/Discovery.ice +73 -0
- data/slice/IceGrid/Exception.ice +383 -0
- data/slice/IceGrid/FileParser.ice +61 -0
- data/slice/IceGrid/Locator.ice +56 -0
- data/slice/IceGrid/Observer.ice +394 -0
- data/slice/IceGrid/PluginFacade.ice +316 -0
- data/slice/IceGrid/Query.ice +130 -0
- data/slice/IceGrid/Registry.ice +138 -0
- data/slice/IceGrid/Session.ice +124 -0
- data/slice/IceGrid/UserAccountMapper.ice +58 -0
- data/slice/IcePatch2/FileInfo.ice +49 -0
- data/slice/IcePatch2/FileServer.ice +129 -0
- data/slice/IceSSL/ConnectionInfo.ice +34 -0
- data/slice/IceSSL/EndpointInfo.ice +41 -0
- data/slice/IceStorm/IceStorm.ice +405 -0
- data/slice/IceStorm/Metrics.ice +71 -0
- metadata +737 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#include <Ice/Base64.h>
|
|
11
|
+
#include <iterator>
|
|
12
|
+
|
|
13
|
+
using namespace std;
|
|
14
|
+
|
|
15
|
+
string
|
|
16
|
+
IceInternal::Base64::encode(const vector<unsigned char>& plainSeq)
|
|
17
|
+
{
|
|
18
|
+
string retval;
|
|
19
|
+
|
|
20
|
+
if(plainSeq.size() == 0)
|
|
21
|
+
{
|
|
22
|
+
return retval;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Reserve enough space for the returned base64 string
|
|
26
|
+
size_t base64Bytes = (((plainSeq.size() * 4) / 3) + 1);
|
|
27
|
+
size_t newlineBytes = (((base64Bytes * 2) / 76) + 1);
|
|
28
|
+
size_t totalBytes = base64Bytes + newlineBytes;
|
|
29
|
+
|
|
30
|
+
retval.reserve(totalBytes);
|
|
31
|
+
|
|
32
|
+
unsigned char by1 = 0;
|
|
33
|
+
unsigned char by2 = 0;
|
|
34
|
+
unsigned char by3 = 0;
|
|
35
|
+
unsigned char by4 = 0;
|
|
36
|
+
unsigned char by5 = 0;
|
|
37
|
+
unsigned char by6 = 0;
|
|
38
|
+
unsigned char by7 = 0;
|
|
39
|
+
|
|
40
|
+
for(size_t i = 0; i < plainSeq.size(); i += 3)
|
|
41
|
+
{
|
|
42
|
+
by1 = plainSeq[i];
|
|
43
|
+
by2 = 0;
|
|
44
|
+
by3 = 0;
|
|
45
|
+
|
|
46
|
+
if((i + 1) < plainSeq.size())
|
|
47
|
+
{
|
|
48
|
+
by2 = plainSeq[i+1];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if((i + 2) < plainSeq.size())
|
|
52
|
+
{
|
|
53
|
+
by3 = plainSeq[i+2];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
by4 = by1 >> 2;
|
|
57
|
+
by5 = ((by1 & 0x3) << 4) | (by2 >> 4);
|
|
58
|
+
by6 = ((by2 & 0xf) << 2) | (by3 >> 6);
|
|
59
|
+
by7 = by3 & 0x3f;
|
|
60
|
+
|
|
61
|
+
retval += encode(by4);
|
|
62
|
+
retval += encode(by5);
|
|
63
|
+
|
|
64
|
+
if((i + 1) < plainSeq.size())
|
|
65
|
+
{
|
|
66
|
+
retval += encode(by6);
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
{
|
|
70
|
+
retval += "=";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if((i + 2) < plainSeq.size())
|
|
74
|
+
{
|
|
75
|
+
retval += encode(by7);
|
|
76
|
+
}
|
|
77
|
+
else
|
|
78
|
+
{
|
|
79
|
+
retval += "=";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
string outString;
|
|
84
|
+
outString.reserve(totalBytes);
|
|
85
|
+
string::iterator iter = retval.begin();
|
|
86
|
+
|
|
87
|
+
while((retval.end() - iter) > 76)
|
|
88
|
+
{
|
|
89
|
+
copy(iter, iter+76, back_inserter(outString));
|
|
90
|
+
outString += "\r\n";
|
|
91
|
+
iter += 76;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
copy(iter, retval.end(), back_inserter(outString));
|
|
95
|
+
|
|
96
|
+
return outString;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
vector<unsigned char>
|
|
100
|
+
IceInternal::Base64::decode(const string& str)
|
|
101
|
+
{
|
|
102
|
+
string newStr;
|
|
103
|
+
|
|
104
|
+
newStr.reserve(str.length());
|
|
105
|
+
|
|
106
|
+
for(size_t j = 0; j < str.length(); j++)
|
|
107
|
+
{
|
|
108
|
+
if(isBase64(str[j]))
|
|
109
|
+
{
|
|
110
|
+
newStr += str[j];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
vector<unsigned char> retval;
|
|
115
|
+
|
|
116
|
+
if(newStr.length() == 0)
|
|
117
|
+
{
|
|
118
|
+
return retval;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Note: This is how we were previously computing the size of the return
|
|
122
|
+
// sequence. The method below is more efficient (and correct).
|
|
123
|
+
// size_t lines = str.size() / 78;
|
|
124
|
+
// size_t totalBytes = (lines * 76) + (((str.size() - (lines * 78)) * 3) / 4);
|
|
125
|
+
|
|
126
|
+
// Figure out how long the final sequence is going to be.
|
|
127
|
+
size_t totalBytes = (newStr.size() * 3 / 4) + 1;
|
|
128
|
+
|
|
129
|
+
retval.reserve(totalBytes);
|
|
130
|
+
|
|
131
|
+
unsigned char by1 = 0;
|
|
132
|
+
unsigned char by2 = 0;
|
|
133
|
+
unsigned char by3 = 0;
|
|
134
|
+
unsigned char by4 = 0;
|
|
135
|
+
|
|
136
|
+
char c1, c2, c3, c4;
|
|
137
|
+
|
|
138
|
+
for(size_t i = 0; i < newStr.length(); i += 4)
|
|
139
|
+
{
|
|
140
|
+
c1 = 'A';
|
|
141
|
+
c2 = 'A';
|
|
142
|
+
c3 = 'A';
|
|
143
|
+
c4 = 'A';
|
|
144
|
+
|
|
145
|
+
c1 = newStr[i];
|
|
146
|
+
|
|
147
|
+
if((i + 1) < newStr.length())
|
|
148
|
+
{
|
|
149
|
+
c2 = newStr[i + 1];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if((i + 2) < newStr.length())
|
|
153
|
+
{
|
|
154
|
+
c3 = newStr[i + 2];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if((i + 3) < newStr.length())
|
|
158
|
+
{
|
|
159
|
+
c4 = newStr[i + 3];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
by1 = decode(c1);
|
|
163
|
+
by2 = decode(c2);
|
|
164
|
+
by3 = decode(c3);
|
|
165
|
+
by4 = decode(c4);
|
|
166
|
+
|
|
167
|
+
retval.push_back((by1 << 2) | (by2 >> 4));
|
|
168
|
+
|
|
169
|
+
if(c3 != '=')
|
|
170
|
+
{
|
|
171
|
+
retval.push_back(((by2 & 0xf) << 4) | (by3 >> 2));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if(c4 != '=')
|
|
175
|
+
{
|
|
176
|
+
retval.push_back(((by3 & 0x3) << 6) | by4);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return retval;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
bool
|
|
184
|
+
IceInternal::Base64::isBase64(char c)
|
|
185
|
+
{
|
|
186
|
+
if(c >= 'A' && c <= 'Z')
|
|
187
|
+
{
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if(c >= 'a' && c <= 'z')
|
|
192
|
+
{
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if(c >= '0' && c <= '9')
|
|
197
|
+
{
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if(c == '+')
|
|
202
|
+
{
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if(c == '/')
|
|
207
|
+
{
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if(c == '=')
|
|
212
|
+
{
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
char
|
|
220
|
+
IceInternal::Base64::encode(unsigned char uc)
|
|
221
|
+
{
|
|
222
|
+
if(uc < 26)
|
|
223
|
+
{
|
|
224
|
+
return 'A' + uc;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if(uc < 52)
|
|
228
|
+
{
|
|
229
|
+
return 'a' + (uc - 26);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if(uc < 62)
|
|
233
|
+
{
|
|
234
|
+
return '0' + (uc - 52);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if(uc == 62)
|
|
238
|
+
{
|
|
239
|
+
return '+';
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return '/';
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
unsigned char
|
|
246
|
+
IceInternal::Base64::decode(char c)
|
|
247
|
+
{
|
|
248
|
+
if(c >= 'A' && c <= 'Z')
|
|
249
|
+
{
|
|
250
|
+
return c - 'A';
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if(c >= 'a' && c <= 'z')
|
|
254
|
+
{
|
|
255
|
+
return c - 'a' + 26;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if(c >= '0' && c <= '9')
|
|
259
|
+
{
|
|
260
|
+
return c - '0' + 52;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if(c == '+')
|
|
264
|
+
{
|
|
265
|
+
return 62;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return 63;
|
|
269
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#ifndef ICE_BASE_64_H
|
|
11
|
+
#define ICE_BASE_64_H
|
|
12
|
+
|
|
13
|
+
#include <Ice/Config.h>
|
|
14
|
+
#include <string>
|
|
15
|
+
#include <vector>
|
|
16
|
+
|
|
17
|
+
namespace IceInternal
|
|
18
|
+
{
|
|
19
|
+
|
|
20
|
+
class ICE_API Base64
|
|
21
|
+
{
|
|
22
|
+
public:
|
|
23
|
+
|
|
24
|
+
static std::string encode(const std::vector<unsigned char>&);
|
|
25
|
+
static std::vector<unsigned char> decode(const std::string&);
|
|
26
|
+
static bool isBase64(char);
|
|
27
|
+
|
|
28
|
+
private:
|
|
29
|
+
|
|
30
|
+
static char encode(unsigned char);
|
|
31
|
+
static unsigned char decode(char);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
#endif
|
|
@@ -0,0 +1,3393 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#include <IceUtil/DisableWarnings.h>
|
|
11
|
+
#include <Ice/BasicStream.h>
|
|
12
|
+
#include <Ice/DefaultsAndOverrides.h>
|
|
13
|
+
#include <Ice/Instance.h>
|
|
14
|
+
#include <Ice/Object.h>
|
|
15
|
+
#include <Ice/Proxy.h>
|
|
16
|
+
#include <Ice/ProxyFactory.h>
|
|
17
|
+
#include <Ice/ObjectFactory.h>
|
|
18
|
+
#include <Ice/ObjectFactoryManager.h>
|
|
19
|
+
#include <Ice/UserExceptionFactory.h>
|
|
20
|
+
#include <Ice/LocalException.h>
|
|
21
|
+
#include <Ice/Protocol.h>
|
|
22
|
+
#include <Ice/FactoryTableInit.h>
|
|
23
|
+
#include <Ice/TraceUtil.h>
|
|
24
|
+
#include <Ice/TraceLevels.h>
|
|
25
|
+
#include <Ice/LoggerUtil.h>
|
|
26
|
+
#include <Ice/SlicedData.h>
|
|
27
|
+
#include <IceUtil/StringConverter.h>
|
|
28
|
+
#include <iterator>
|
|
29
|
+
|
|
30
|
+
using namespace std;
|
|
31
|
+
using namespace Ice;
|
|
32
|
+
using namespace IceInternal;
|
|
33
|
+
|
|
34
|
+
namespace
|
|
35
|
+
{
|
|
36
|
+
|
|
37
|
+
class StreamUTF8BufferI : public IceUtil::UTF8Buffer
|
|
38
|
+
{
|
|
39
|
+
public:
|
|
40
|
+
|
|
41
|
+
StreamUTF8BufferI(BasicStream& stream) :
|
|
42
|
+
_stream(stream)
|
|
43
|
+
{
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
Ice::Byte*
|
|
47
|
+
getMoreBytes(size_t howMany, Ice::Byte* firstUnused)
|
|
48
|
+
{
|
|
49
|
+
assert(howMany > 0);
|
|
50
|
+
|
|
51
|
+
if(firstUnused != 0)
|
|
52
|
+
{
|
|
53
|
+
//
|
|
54
|
+
// Return unused bytes
|
|
55
|
+
//
|
|
56
|
+
_stream.resize(firstUnused - _stream.b.begin());
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
//
|
|
60
|
+
// Index of first unused byte
|
|
61
|
+
//
|
|
62
|
+
Buffer::Container::size_type pos = _stream.b.size();
|
|
63
|
+
|
|
64
|
+
//
|
|
65
|
+
// Since resize may reallocate the buffer, when firstUnused != 0, the
|
|
66
|
+
// return value can be != firstUnused
|
|
67
|
+
//
|
|
68
|
+
_stream.resize(pos + howMany);
|
|
69
|
+
|
|
70
|
+
return &_stream.b[pos];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private:
|
|
74
|
+
|
|
75
|
+
BasicStream& _stream;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const Byte OPTIONAL_END_MARKER = 0xFF;
|
|
79
|
+
|
|
80
|
+
const Byte FLAG_HAS_TYPE_ID_STRING = (1<<0);
|
|
81
|
+
const Byte FLAG_HAS_TYPE_ID_INDEX = (1<<1);
|
|
82
|
+
const Byte FLAG_HAS_TYPE_ID_COMPACT = (1<<0) | (1<<1);
|
|
83
|
+
const Byte FLAG_HAS_OPTIONAL_MEMBERS = (1<<2);
|
|
84
|
+
const Byte FLAG_HAS_INDIRECTION_TABLE = (1<<3);
|
|
85
|
+
const Byte FLAG_HAS_SLICE_SIZE = (1<<4);
|
|
86
|
+
const Byte FLAG_IS_LAST_SLICE = (1<<5);
|
|
87
|
+
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
IceInternal::BasicStream::BasicStream(Instance* instance, const EncodingVersion& encoding) :
|
|
92
|
+
_instance(instance),
|
|
93
|
+
_closure(0),
|
|
94
|
+
_encoding(encoding),
|
|
95
|
+
_currentReadEncaps(0),
|
|
96
|
+
_currentWriteEncaps(0),
|
|
97
|
+
_sliceObjects(true),
|
|
98
|
+
_stringConverter(instance->getStringConverter()),
|
|
99
|
+
_wstringConverter(instance->getWstringConverter()),
|
|
100
|
+
_startSeq(-1)
|
|
101
|
+
{
|
|
102
|
+
//
|
|
103
|
+
// Initialize the encoding members of our pre-allocated encapsulations, in case
|
|
104
|
+
// this stream is used without an explicit encapsulation.
|
|
105
|
+
//
|
|
106
|
+
_preAllocatedReadEncaps.encoding = encoding;
|
|
107
|
+
_preAllocatedWriteEncaps.encoding = encoding;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
IceInternal::BasicStream::BasicStream(Instance* instance, const EncodingVersion& encoding, const Byte* begin,
|
|
111
|
+
const Byte* end) :
|
|
112
|
+
IceInternal::Buffer(begin, end),
|
|
113
|
+
_instance(instance),
|
|
114
|
+
_closure(0),
|
|
115
|
+
_encoding(encoding),
|
|
116
|
+
_currentReadEncaps(0),
|
|
117
|
+
_currentWriteEncaps(0),
|
|
118
|
+
_sliceObjects(true),
|
|
119
|
+
_stringConverter(instance->getStringConverter()),
|
|
120
|
+
_wstringConverter(instance->getWstringConverter()),
|
|
121
|
+
_startSeq(-1)
|
|
122
|
+
{
|
|
123
|
+
//
|
|
124
|
+
// Initialize the encoding members of our pre-allocated encapsulations, in case
|
|
125
|
+
// this stream is used without an explicit encapsulation.
|
|
126
|
+
//
|
|
127
|
+
_preAllocatedReadEncaps.encoding = encoding;
|
|
128
|
+
_preAllocatedWriteEncaps.encoding = encoding;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
void
|
|
132
|
+
IceInternal::BasicStream::clear()
|
|
133
|
+
{
|
|
134
|
+
while(_currentReadEncaps && _currentReadEncaps != &_preAllocatedReadEncaps)
|
|
135
|
+
{
|
|
136
|
+
ReadEncaps* oldEncaps = _currentReadEncaps;
|
|
137
|
+
_currentReadEncaps = _currentReadEncaps->previous;
|
|
138
|
+
delete oldEncaps;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
while(_currentWriteEncaps && _currentWriteEncaps != &_preAllocatedWriteEncaps)
|
|
142
|
+
{
|
|
143
|
+
WriteEncaps* oldEncaps = _currentWriteEncaps;
|
|
144
|
+
_currentWriteEncaps = _currentWriteEncaps->previous;
|
|
145
|
+
delete oldEncaps;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
_startSeq = -1;
|
|
149
|
+
_sliceObjects = true;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
void*
|
|
153
|
+
IceInternal::BasicStream::closure() const
|
|
154
|
+
{
|
|
155
|
+
return _closure;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
void*
|
|
159
|
+
IceInternal::BasicStream::closure(void* p)
|
|
160
|
+
{
|
|
161
|
+
void* prev = _closure;
|
|
162
|
+
_closure = p;
|
|
163
|
+
return prev;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
void
|
|
167
|
+
IceInternal::BasicStream::swap(BasicStream& other)
|
|
168
|
+
{
|
|
169
|
+
assert(_instance == other._instance);
|
|
170
|
+
|
|
171
|
+
swapBuffer(other);
|
|
172
|
+
|
|
173
|
+
std::swap(_closure, other._closure);
|
|
174
|
+
|
|
175
|
+
//
|
|
176
|
+
// Swap is never called for BasicStreams that have encapsulations being read/write. However,
|
|
177
|
+
// encapsulations might still be set in case marhsalling or un-marhsalling failed. We just
|
|
178
|
+
// reset the encapsulations if there are still some set.
|
|
179
|
+
//
|
|
180
|
+
resetEncaps();
|
|
181
|
+
other.resetEncaps();
|
|
182
|
+
|
|
183
|
+
std::swap(_startSeq, other._startSeq);
|
|
184
|
+
std::swap(_minSeqSize, other._minSeqSize);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
void
|
|
188
|
+
IceInternal::BasicStream::resetEncaps()
|
|
189
|
+
{
|
|
190
|
+
while(_currentReadEncaps && _currentReadEncaps != &_preAllocatedReadEncaps)
|
|
191
|
+
{
|
|
192
|
+
ReadEncaps* oldEncaps = _currentReadEncaps;
|
|
193
|
+
_currentReadEncaps = _currentReadEncaps->previous;
|
|
194
|
+
delete oldEncaps;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
while(_currentWriteEncaps && _currentWriteEncaps != &_preAllocatedWriteEncaps)
|
|
198
|
+
{
|
|
199
|
+
WriteEncaps* oldEncaps = _currentWriteEncaps;
|
|
200
|
+
_currentWriteEncaps = _currentWriteEncaps->previous;
|
|
201
|
+
delete oldEncaps;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
_preAllocatedReadEncaps.reset();
|
|
205
|
+
_preAllocatedWriteEncaps.reset();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
void
|
|
209
|
+
IceInternal::BasicStream::startWriteEncaps()
|
|
210
|
+
{
|
|
211
|
+
//
|
|
212
|
+
// If no encoding version is specified, use the current write
|
|
213
|
+
// encapsulation encoding version if there's a current write
|
|
214
|
+
// encapsulation, otherwise, use the stream encoding version.
|
|
215
|
+
//
|
|
216
|
+
|
|
217
|
+
if(_currentWriteEncaps)
|
|
218
|
+
{
|
|
219
|
+
startWriteEncaps(_currentWriteEncaps->encoding, _currentWriteEncaps->format);
|
|
220
|
+
}
|
|
221
|
+
else
|
|
222
|
+
{
|
|
223
|
+
startWriteEncaps(_encoding, Ice::DefaultFormat);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
void
|
|
228
|
+
IceInternal::BasicStream::endWriteEncapsChecked()
|
|
229
|
+
{
|
|
230
|
+
if(!_currentWriteEncaps)
|
|
231
|
+
{
|
|
232
|
+
throw EncapsulationException(__FILE__, __LINE__, "not in an encapsulation");
|
|
233
|
+
}
|
|
234
|
+
endWriteEncaps();
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
void
|
|
238
|
+
IceInternal::BasicStream::endReadEncapsChecked()
|
|
239
|
+
{
|
|
240
|
+
if(!_currentReadEncaps)
|
|
241
|
+
{
|
|
242
|
+
throw EncapsulationException(__FILE__, __LINE__, "not in an encapsulation");
|
|
243
|
+
}
|
|
244
|
+
endReadEncaps();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
Int
|
|
248
|
+
IceInternal::BasicStream::getReadEncapsSize()
|
|
249
|
+
{
|
|
250
|
+
assert(_currentReadEncaps);
|
|
251
|
+
return _currentReadEncaps->sz - static_cast<Int>(sizeof(Int)) - 2;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
EncodingVersion
|
|
255
|
+
IceInternal::BasicStream::skipEncaps()
|
|
256
|
+
{
|
|
257
|
+
Int sz;
|
|
258
|
+
read(sz);
|
|
259
|
+
if(sz < 6)
|
|
260
|
+
{
|
|
261
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
262
|
+
}
|
|
263
|
+
if(i - sizeof(Int) + sz > b.end())
|
|
264
|
+
{
|
|
265
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
266
|
+
}
|
|
267
|
+
EncodingVersion encoding;
|
|
268
|
+
read(encoding.major);
|
|
269
|
+
read(encoding.minor);
|
|
270
|
+
i += sz - sizeof(Int) - 2;
|
|
271
|
+
return encoding;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
void
|
|
275
|
+
IceInternal::BasicStream::readPendingObjects()
|
|
276
|
+
{
|
|
277
|
+
if(_currentReadEncaps && _currentReadEncaps->decoder)
|
|
278
|
+
{
|
|
279
|
+
_currentReadEncaps->decoder->readPendingObjects();
|
|
280
|
+
}
|
|
281
|
+
else if(getReadEncoding() == Ice::Encoding_1_0)
|
|
282
|
+
{
|
|
283
|
+
//
|
|
284
|
+
// If using the 1.0 encoding and no objects were read, we
|
|
285
|
+
// still read an empty sequence of pending objects if
|
|
286
|
+
// requested (i.e.: if this is called).
|
|
287
|
+
//
|
|
288
|
+
// This is required by the 1.0 encoding, even if no objects
|
|
289
|
+
// are written we do marshal an empty sequence if marshaled
|
|
290
|
+
// data types use classes.
|
|
291
|
+
//
|
|
292
|
+
skipSize();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
void
|
|
297
|
+
IceInternal::BasicStream::writePendingObjects()
|
|
298
|
+
{
|
|
299
|
+
if(_currentWriteEncaps && _currentWriteEncaps->encoder)
|
|
300
|
+
{
|
|
301
|
+
_currentWriteEncaps->encoder->writePendingObjects();
|
|
302
|
+
}
|
|
303
|
+
else if(getWriteEncoding() == Ice::Encoding_1_0)
|
|
304
|
+
{
|
|
305
|
+
//
|
|
306
|
+
// If using the 1.0 encoding and no objects were written, we
|
|
307
|
+
// still write an empty sequence for pending objects if
|
|
308
|
+
// requested (i.e.: if this is called).
|
|
309
|
+
//
|
|
310
|
+
// This is required by the 1.0 encoding, even if no objects
|
|
311
|
+
// are written we do marshal an empty sequence if marshaled
|
|
312
|
+
// data types use classes.
|
|
313
|
+
//
|
|
314
|
+
writeSize(0);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
Int
|
|
319
|
+
IceInternal::BasicStream::readAndCheckSeqSize(int minSize)
|
|
320
|
+
{
|
|
321
|
+
Int sz = readSize();
|
|
322
|
+
|
|
323
|
+
if(sz == 0)
|
|
324
|
+
{
|
|
325
|
+
return sz;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
//
|
|
329
|
+
// The _startSeq variable points to the start of the sequence for which
|
|
330
|
+
// we expect to read at least _minSeqSize bytes from the stream.
|
|
331
|
+
//
|
|
332
|
+
// If not initialized or if we already read more data than _minSeqSize,
|
|
333
|
+
// we reset _startSeq and _minSeqSize for this sequence (possibly a
|
|
334
|
+
// top-level sequence or enclosed sequence it doesn't really matter).
|
|
335
|
+
//
|
|
336
|
+
// Otherwise, we are reading an enclosed sequence and we have to bump
|
|
337
|
+
// _minSeqSize by the minimum size that this sequence will require on
|
|
338
|
+
// the stream.
|
|
339
|
+
//
|
|
340
|
+
// The goal of this check is to ensure that when we start un-marshalling
|
|
341
|
+
// a new sequence, we check the minimal size of this new sequence against
|
|
342
|
+
// the estimated remaining buffer size. This estimatation is based on
|
|
343
|
+
// the minimum size of the enclosing sequences, it's _minSeqSize.
|
|
344
|
+
//
|
|
345
|
+
if(_startSeq == -1 || i > (b.begin() + _startSeq + _minSeqSize))
|
|
346
|
+
{
|
|
347
|
+
_startSeq = static_cast<int>(i - b.begin());
|
|
348
|
+
_minSeqSize = sz * minSize;
|
|
349
|
+
}
|
|
350
|
+
else
|
|
351
|
+
{
|
|
352
|
+
_minSeqSize += sz * minSize;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
//
|
|
356
|
+
// If there isn't enough data to read on the stream for the sequence (and
|
|
357
|
+
// possibly enclosed sequences), something is wrong with the marshalled
|
|
358
|
+
// data: it's claiming having more data that what is possible to read.
|
|
359
|
+
//
|
|
360
|
+
if(_startSeq + _minSeqSize > static_cast<int>(b.size()))
|
|
361
|
+
{
|
|
362
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return sz;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
void
|
|
369
|
+
IceInternal::BasicStream::writeBlob(const vector<Byte>& v)
|
|
370
|
+
{
|
|
371
|
+
if(!v.empty())
|
|
372
|
+
{
|
|
373
|
+
Container::size_type pos = b.size();
|
|
374
|
+
resize(pos + v.size());
|
|
375
|
+
memcpy(&b[pos], &v[0], v.size());
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
void
|
|
380
|
+
IceInternal::BasicStream::readBlob(vector<Byte>& v, Int sz)
|
|
381
|
+
{
|
|
382
|
+
if(sz > 0)
|
|
383
|
+
{
|
|
384
|
+
if(b.end() - i < sz)
|
|
385
|
+
{
|
|
386
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
387
|
+
}
|
|
388
|
+
vector<Byte>(i, i + sz).swap(v);
|
|
389
|
+
i += sz;
|
|
390
|
+
}
|
|
391
|
+
else
|
|
392
|
+
{
|
|
393
|
+
v.clear();
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
void
|
|
398
|
+
IceInternal::BasicStream::write(const Byte* begin, const Byte* end)
|
|
399
|
+
{
|
|
400
|
+
Int sz = static_cast<Int>(end - begin);
|
|
401
|
+
writeSize(sz);
|
|
402
|
+
if(sz > 0)
|
|
403
|
+
{
|
|
404
|
+
Container::size_type pos = b.size();
|
|
405
|
+
resize(pos + sz);
|
|
406
|
+
memcpy(&b[pos], begin, sz);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
void
|
|
411
|
+
IceInternal::BasicStream::read(std::vector<Ice::Byte>& v)
|
|
412
|
+
{
|
|
413
|
+
std::pair<const Ice::Byte*, const Ice::Byte*> p;
|
|
414
|
+
read(p);
|
|
415
|
+
if(p.first != p.second)
|
|
416
|
+
{
|
|
417
|
+
v.resize(static_cast<Ice::Int>(p.second - p.first));
|
|
418
|
+
copy(p.first, p.second, v.begin());
|
|
419
|
+
}
|
|
420
|
+
else
|
|
421
|
+
{
|
|
422
|
+
v.clear();
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
void
|
|
427
|
+
IceInternal::BasicStream::read(pair<const Byte*, const Byte*>& v)
|
|
428
|
+
{
|
|
429
|
+
Int sz = readAndCheckSeqSize(1);
|
|
430
|
+
if(sz > 0)
|
|
431
|
+
{
|
|
432
|
+
v.first = i;
|
|
433
|
+
v.second = i + sz;
|
|
434
|
+
i += sz;
|
|
435
|
+
}
|
|
436
|
+
else
|
|
437
|
+
{
|
|
438
|
+
v.first = v.second = i;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
void
|
|
443
|
+
IceInternal::BasicStream::write(const vector<bool>& v)
|
|
444
|
+
{
|
|
445
|
+
Int sz = static_cast<Int>(v.size());
|
|
446
|
+
writeSize(sz);
|
|
447
|
+
if(sz > 0)
|
|
448
|
+
{
|
|
449
|
+
Container::size_type pos = b.size();
|
|
450
|
+
resize(pos + sz);
|
|
451
|
+
copy(v.begin(), v.end(), b.begin() + pos);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
namespace
|
|
456
|
+
{
|
|
457
|
+
|
|
458
|
+
template<size_t boolSize>
|
|
459
|
+
struct BasicStreamWriteBoolHelper
|
|
460
|
+
{
|
|
461
|
+
static void write(const bool* begin, BasicStream::Container::size_type pos, BasicStream::Container& b, Int sz)
|
|
462
|
+
{
|
|
463
|
+
for(int idx = 0; idx < sz; ++idx)
|
|
464
|
+
{
|
|
465
|
+
b[pos + idx] = static_cast<Byte>(*(begin + idx));
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
template<>
|
|
471
|
+
struct BasicStreamWriteBoolHelper<1>
|
|
472
|
+
{
|
|
473
|
+
static void write(const bool* begin, BasicStream::Container::size_type pos, BasicStream::Container& b, Int sz)
|
|
474
|
+
{
|
|
475
|
+
memcpy(&b[pos], begin, sz);
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
void
|
|
482
|
+
IceInternal::BasicStream::write(const bool* begin, const bool* end)
|
|
483
|
+
{
|
|
484
|
+
Int sz = static_cast<Int>(end - begin);
|
|
485
|
+
writeSize(sz);
|
|
486
|
+
if(sz > 0)
|
|
487
|
+
{
|
|
488
|
+
Container::size_type pos = b.size();
|
|
489
|
+
resize(pos + sz);
|
|
490
|
+
BasicStreamWriteBoolHelper<sizeof(bool)>::write(begin, pos, b, sz);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
void
|
|
495
|
+
IceInternal::BasicStream::read(vector<bool>& v)
|
|
496
|
+
{
|
|
497
|
+
Int sz = readAndCheckSeqSize(1);
|
|
498
|
+
if(sz > 0)
|
|
499
|
+
{
|
|
500
|
+
v.resize(sz);
|
|
501
|
+
copy(i, i + sz, v.begin());
|
|
502
|
+
i += sz;
|
|
503
|
+
}
|
|
504
|
+
else
|
|
505
|
+
{
|
|
506
|
+
v.clear();
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
namespace
|
|
511
|
+
{
|
|
512
|
+
|
|
513
|
+
template<size_t boolSize>
|
|
514
|
+
struct BasicStreamReadBoolHelper
|
|
515
|
+
{
|
|
516
|
+
static bool* read(pair<const bool*, const bool*>& v, Int sz, BasicStream::Container::iterator& i)
|
|
517
|
+
{
|
|
518
|
+
bool* array = new bool[sz];
|
|
519
|
+
for(int idx = 0; idx < sz; ++idx)
|
|
520
|
+
{
|
|
521
|
+
array[idx] = static_cast<bool>(*(i + idx));
|
|
522
|
+
}
|
|
523
|
+
v.first = array;
|
|
524
|
+
v.second = array + sz;
|
|
525
|
+
return array;
|
|
526
|
+
}
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
template<>
|
|
530
|
+
struct BasicStreamReadBoolHelper<1>
|
|
531
|
+
{
|
|
532
|
+
static bool* read(pair<const bool*, const bool*>& v, Int sz, BasicStream::Container::iterator& i)
|
|
533
|
+
{
|
|
534
|
+
v.first = reinterpret_cast<bool*>(i);
|
|
535
|
+
v.second = reinterpret_cast<bool*>(i) + sz;
|
|
536
|
+
return 0;
|
|
537
|
+
}
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
void
|
|
543
|
+
IceInternal::BasicStream::read(pair<const bool*, const bool*>& v, IceUtil::ScopedArray<bool>& result)
|
|
544
|
+
{
|
|
545
|
+
Int sz = readAndCheckSeqSize(1);
|
|
546
|
+
if(sz > 0)
|
|
547
|
+
{
|
|
548
|
+
result.reset(BasicStreamReadBoolHelper<sizeof(bool)>::read(v, sz, i));
|
|
549
|
+
i += sz;
|
|
550
|
+
}
|
|
551
|
+
else
|
|
552
|
+
{
|
|
553
|
+
result.reset();
|
|
554
|
+
v.first = v.second = reinterpret_cast<bool*>(i);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
void
|
|
559
|
+
IceInternal::BasicStream::write(Short v)
|
|
560
|
+
{
|
|
561
|
+
Container::size_type pos = b.size();
|
|
562
|
+
resize(pos + sizeof(Short));
|
|
563
|
+
Byte* dest = &b[pos];
|
|
564
|
+
#ifdef ICE_BIG_ENDIAN
|
|
565
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v) + sizeof(Short) - 1;
|
|
566
|
+
*dest++ = *src--;
|
|
567
|
+
*dest = *src;
|
|
568
|
+
#else
|
|
569
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v);
|
|
570
|
+
*dest++ = *src++;
|
|
571
|
+
*dest = *src;
|
|
572
|
+
#endif
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
void
|
|
576
|
+
IceInternal::BasicStream::write(const Short* begin, const Short* end)
|
|
577
|
+
{
|
|
578
|
+
Int sz = static_cast<Int>(end - begin);
|
|
579
|
+
writeSize(sz);
|
|
580
|
+
if(sz > 0)
|
|
581
|
+
{
|
|
582
|
+
Container::size_type pos = b.size();
|
|
583
|
+
resize(pos + sz * sizeof(Short));
|
|
584
|
+
#ifdef ICE_BIG_ENDIAN
|
|
585
|
+
const Byte* src = reinterpret_cast<const Byte*>(begin) + sizeof(Short) - 1;
|
|
586
|
+
Byte* dest = &(*(b.begin() + pos));
|
|
587
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
588
|
+
{
|
|
589
|
+
*dest++ = *src--;
|
|
590
|
+
*dest++ = *src--;
|
|
591
|
+
src += 2 * sizeof(Short);
|
|
592
|
+
}
|
|
593
|
+
#else
|
|
594
|
+
memcpy(&b[pos], reinterpret_cast<const Byte*>(begin), sz * sizeof(Short));
|
|
595
|
+
#endif
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
void
|
|
600
|
+
IceInternal::BasicStream::read(Short& v)
|
|
601
|
+
{
|
|
602
|
+
if(b.end() - i < static_cast<int>(sizeof(Short)))
|
|
603
|
+
{
|
|
604
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
605
|
+
}
|
|
606
|
+
const Byte* src = &(*i);
|
|
607
|
+
i += sizeof(Short);
|
|
608
|
+
#ifdef ICE_BIG_ENDIAN
|
|
609
|
+
Byte* dest = reinterpret_cast<Byte*>(&v) + sizeof(Short) - 1;
|
|
610
|
+
*dest-- = *src++;
|
|
611
|
+
*dest = *src;
|
|
612
|
+
#else
|
|
613
|
+
Byte* dest = reinterpret_cast<Byte*>(&v);
|
|
614
|
+
*dest++ = *src++;
|
|
615
|
+
*dest = *src;
|
|
616
|
+
#endif
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
void
|
|
620
|
+
IceInternal::BasicStream::read(vector<Short>& v)
|
|
621
|
+
{
|
|
622
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Short)));
|
|
623
|
+
if(sz > 0)
|
|
624
|
+
{
|
|
625
|
+
Container::iterator begin = i;
|
|
626
|
+
i += sz * static_cast<int>(sizeof(Short));
|
|
627
|
+
v.resize(sz);
|
|
628
|
+
#ifdef ICE_BIG_ENDIAN
|
|
629
|
+
const Byte* src = &(*begin);
|
|
630
|
+
Byte* dest = reinterpret_cast<Byte*>(&v[0]) + sizeof(Short) - 1;
|
|
631
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
632
|
+
{
|
|
633
|
+
*dest-- = *src++;
|
|
634
|
+
*dest-- = *src++;
|
|
635
|
+
dest += 2 * sizeof(Short);
|
|
636
|
+
}
|
|
637
|
+
#else
|
|
638
|
+
copy(begin, i, reinterpret_cast<Byte*>(&v[0]));
|
|
639
|
+
#endif
|
|
640
|
+
}
|
|
641
|
+
else
|
|
642
|
+
{
|
|
643
|
+
v.clear();
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
void
|
|
648
|
+
IceInternal::BasicStream::read(pair<const Short*, const Short*>& v, IceUtil::ScopedArray<Short>& result)
|
|
649
|
+
{
|
|
650
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Short)));
|
|
651
|
+
if(sz > 0)
|
|
652
|
+
{
|
|
653
|
+
#if defined(__i386) || defined(_M_IX86) || defined(__x86_64) || defined(_M_X64)
|
|
654
|
+
v.first = reinterpret_cast<Short*>(i);
|
|
655
|
+
i += sz * static_cast<int>(sizeof(Short));
|
|
656
|
+
v.second = reinterpret_cast<Short*>(i);
|
|
657
|
+
#else
|
|
658
|
+
result.reset(new Short[sz]);
|
|
659
|
+
v.first = result.get();
|
|
660
|
+
v.second = result.get() + sz;
|
|
661
|
+
|
|
662
|
+
Container::iterator begin = i;
|
|
663
|
+
i += sz * static_cast<int>(sizeof(Short));
|
|
664
|
+
# ifdef ICE_BIG_ENDIAN
|
|
665
|
+
const Byte* src = &(*begin);
|
|
666
|
+
Byte* dest = reinterpret_cast<Byte*>(&result[0]) + sizeof(Short) - 1;
|
|
667
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
668
|
+
{
|
|
669
|
+
*dest-- = *src++;
|
|
670
|
+
*dest-- = *src++;
|
|
671
|
+
dest += 2 * sizeof(Short);
|
|
672
|
+
}
|
|
673
|
+
# else
|
|
674
|
+
copy(begin, i, reinterpret_cast<Byte*>(&result[0]));
|
|
675
|
+
# endif
|
|
676
|
+
#endif
|
|
677
|
+
}
|
|
678
|
+
else
|
|
679
|
+
{
|
|
680
|
+
result.reset();
|
|
681
|
+
v.first = v.second = 0;
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
void
|
|
686
|
+
IceInternal::BasicStream::write(const Int* begin, const Int* end)
|
|
687
|
+
{
|
|
688
|
+
Int sz = static_cast<Int>(end - begin);
|
|
689
|
+
writeSize(sz);
|
|
690
|
+
if(sz > 0)
|
|
691
|
+
{
|
|
692
|
+
Container::size_type pos = b.size();
|
|
693
|
+
resize(pos + sz * sizeof(Int));
|
|
694
|
+
#ifdef ICE_BIG_ENDIAN
|
|
695
|
+
const Byte* src = reinterpret_cast<const Byte*>(begin) + sizeof(Int) - 1;
|
|
696
|
+
Byte* dest = &(*(b.begin() + pos));
|
|
697
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
698
|
+
{
|
|
699
|
+
*dest++ = *src--;
|
|
700
|
+
*dest++ = *src--;
|
|
701
|
+
*dest++ = *src--;
|
|
702
|
+
*dest++ = *src--;
|
|
703
|
+
src += 2 * sizeof(Int);
|
|
704
|
+
}
|
|
705
|
+
#else
|
|
706
|
+
memcpy(&b[pos], reinterpret_cast<const Byte*>(begin), sz * sizeof(Int));
|
|
707
|
+
#endif
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
void
|
|
712
|
+
IceInternal::BasicStream::read(vector<Int>& v)
|
|
713
|
+
{
|
|
714
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Int)));
|
|
715
|
+
if(sz > 0)
|
|
716
|
+
{
|
|
717
|
+
Container::iterator begin = i;
|
|
718
|
+
i += sz * static_cast<int>(sizeof(Int));
|
|
719
|
+
v.resize(sz);
|
|
720
|
+
#ifdef ICE_BIG_ENDIAN
|
|
721
|
+
const Byte* src = &(*begin);
|
|
722
|
+
Byte* dest = reinterpret_cast<Byte*>(&v[0]) + sizeof(Int) - 1;
|
|
723
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
724
|
+
{
|
|
725
|
+
*dest-- = *src++;
|
|
726
|
+
*dest-- = *src++;
|
|
727
|
+
*dest-- = *src++;
|
|
728
|
+
*dest-- = *src++;
|
|
729
|
+
dest += 2 * sizeof(Int);
|
|
730
|
+
}
|
|
731
|
+
#else
|
|
732
|
+
copy(begin, i, reinterpret_cast<Byte*>(&v[0]));
|
|
733
|
+
#endif
|
|
734
|
+
}
|
|
735
|
+
else
|
|
736
|
+
{
|
|
737
|
+
v.clear();
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
void
|
|
742
|
+
IceInternal::BasicStream::read(pair<const Int*, const Int*>& v, ::IceUtil::ScopedArray<Int>& result)
|
|
743
|
+
{
|
|
744
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Int)));
|
|
745
|
+
if(sz > 0)
|
|
746
|
+
{
|
|
747
|
+
#if defined(__i386) || defined(_M_IX86) || defined(__x86_64) || defined(_M_X64)
|
|
748
|
+
v.first = reinterpret_cast<Int*>(i);
|
|
749
|
+
i += sz * static_cast<int>(sizeof(Int));
|
|
750
|
+
v.second = reinterpret_cast<Int*>(i);
|
|
751
|
+
#else
|
|
752
|
+
result.reset(new Int[sz]);
|
|
753
|
+
v.first = result.get();
|
|
754
|
+
v.second = result.get() + sz;
|
|
755
|
+
|
|
756
|
+
Container::iterator begin = i;
|
|
757
|
+
i += sz * static_cast<int>(sizeof(Int));
|
|
758
|
+
# ifdef ICE_BIG_ENDIAN
|
|
759
|
+
const Byte* src = &(*begin);
|
|
760
|
+
Byte* dest = reinterpret_cast<Byte*>(&result[0]) + sizeof(Int) - 1;
|
|
761
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
762
|
+
{
|
|
763
|
+
*dest-- = *src++;
|
|
764
|
+
*dest-- = *src++;
|
|
765
|
+
*dest-- = *src++;
|
|
766
|
+
*dest-- = *src++;
|
|
767
|
+
dest += 2 * sizeof(Int);
|
|
768
|
+
}
|
|
769
|
+
# else
|
|
770
|
+
copy(begin, i, reinterpret_cast<Byte*>(&result[0]));
|
|
771
|
+
# endif
|
|
772
|
+
#endif
|
|
773
|
+
}
|
|
774
|
+
else
|
|
775
|
+
{
|
|
776
|
+
result.reset();
|
|
777
|
+
v.first = v.second = 0;
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
void
|
|
782
|
+
IceInternal::BasicStream::write(Long v)
|
|
783
|
+
{
|
|
784
|
+
Container::size_type pos = b.size();
|
|
785
|
+
resize(pos + sizeof(Long));
|
|
786
|
+
Byte* dest = &b[pos];
|
|
787
|
+
#ifdef ICE_BIG_ENDIAN
|
|
788
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v) + sizeof(Long) - 1;
|
|
789
|
+
*dest++ = *src--;
|
|
790
|
+
*dest++ = *src--;
|
|
791
|
+
*dest++ = *src--;
|
|
792
|
+
*dest++ = *src--;
|
|
793
|
+
*dest++ = *src--;
|
|
794
|
+
*dest++ = *src--;
|
|
795
|
+
*dest++ = *src--;
|
|
796
|
+
*dest = *src;
|
|
797
|
+
#else
|
|
798
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v);
|
|
799
|
+
*dest++ = *src++;
|
|
800
|
+
*dest++ = *src++;
|
|
801
|
+
*dest++ = *src++;
|
|
802
|
+
*dest++ = *src++;
|
|
803
|
+
*dest++ = *src++;
|
|
804
|
+
*dest++ = *src++;
|
|
805
|
+
*dest++ = *src++;
|
|
806
|
+
*dest = *src;
|
|
807
|
+
#endif
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
void
|
|
811
|
+
IceInternal::BasicStream::write(const Long* begin, const Long* end)
|
|
812
|
+
{
|
|
813
|
+
Int sz = static_cast<Int>(end - begin);
|
|
814
|
+
writeSize(sz);
|
|
815
|
+
if(sz > 0)
|
|
816
|
+
{
|
|
817
|
+
Container::size_type pos = b.size();
|
|
818
|
+
resize(pos + sz * sizeof(Long));
|
|
819
|
+
#ifdef ICE_BIG_ENDIAN
|
|
820
|
+
const Byte* src = reinterpret_cast<const Byte*>(begin) + sizeof(Long) - 1;
|
|
821
|
+
Byte* dest = &(*(b.begin() + pos));
|
|
822
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
823
|
+
{
|
|
824
|
+
*dest++ = *src--;
|
|
825
|
+
*dest++ = *src--;
|
|
826
|
+
*dest++ = *src--;
|
|
827
|
+
*dest++ = *src--;
|
|
828
|
+
*dest++ = *src--;
|
|
829
|
+
*dest++ = *src--;
|
|
830
|
+
*dest++ = *src--;
|
|
831
|
+
*dest++ = *src--;
|
|
832
|
+
src += 2 * sizeof(Long);
|
|
833
|
+
}
|
|
834
|
+
#else
|
|
835
|
+
memcpy(&b[pos], reinterpret_cast<const Byte*>(begin), sz * sizeof(Long));
|
|
836
|
+
#endif
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
void
|
|
841
|
+
IceInternal::BasicStream::read(Long& v)
|
|
842
|
+
{
|
|
843
|
+
if(b.end() - i < static_cast<int>(sizeof(Long)))
|
|
844
|
+
{
|
|
845
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
846
|
+
}
|
|
847
|
+
const Byte* src = &(*i);
|
|
848
|
+
i += sizeof(Long);
|
|
849
|
+
#ifdef ICE_BIG_ENDIAN
|
|
850
|
+
Byte* dest = reinterpret_cast<Byte*>(&v) + sizeof(Long) - 1;
|
|
851
|
+
*dest-- = *src++;
|
|
852
|
+
*dest-- = *src++;
|
|
853
|
+
*dest-- = *src++;
|
|
854
|
+
*dest-- = *src++;
|
|
855
|
+
*dest-- = *src++;
|
|
856
|
+
*dest-- = *src++;
|
|
857
|
+
*dest-- = *src++;
|
|
858
|
+
*dest = *src;
|
|
859
|
+
#else
|
|
860
|
+
Byte* dest = reinterpret_cast<Byte*>(&v);
|
|
861
|
+
*dest++ = *src++;
|
|
862
|
+
*dest++ = *src++;
|
|
863
|
+
*dest++ = *src++;
|
|
864
|
+
*dest++ = *src++;
|
|
865
|
+
*dest++ = *src++;
|
|
866
|
+
*dest++ = *src++;
|
|
867
|
+
*dest++ = *src++;
|
|
868
|
+
*dest = *src;
|
|
869
|
+
#endif
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
void
|
|
873
|
+
IceInternal::BasicStream::read(vector<Long>& v)
|
|
874
|
+
{
|
|
875
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Long)));
|
|
876
|
+
if(sz > 0)
|
|
877
|
+
{
|
|
878
|
+
Container::iterator begin = i;
|
|
879
|
+
i += sz * static_cast<int>(sizeof(Long));
|
|
880
|
+
v.resize(sz);
|
|
881
|
+
#ifdef ICE_BIG_ENDIAN
|
|
882
|
+
const Byte* src = &(*begin);
|
|
883
|
+
Byte* dest = reinterpret_cast<Byte*>(&v[0]) + sizeof(Long) - 1;
|
|
884
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
885
|
+
{
|
|
886
|
+
*dest-- = *src++;
|
|
887
|
+
*dest-- = *src++;
|
|
888
|
+
*dest-- = *src++;
|
|
889
|
+
*dest-- = *src++;
|
|
890
|
+
*dest-- = *src++;
|
|
891
|
+
*dest-- = *src++;
|
|
892
|
+
*dest-- = *src++;
|
|
893
|
+
*dest-- = *src++;
|
|
894
|
+
dest += 2 * sizeof(Long);
|
|
895
|
+
}
|
|
896
|
+
#else
|
|
897
|
+
copy(begin, i, reinterpret_cast<Byte*>(&v[0]));
|
|
898
|
+
#endif
|
|
899
|
+
}
|
|
900
|
+
else
|
|
901
|
+
{
|
|
902
|
+
v.clear();
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
void
|
|
907
|
+
IceInternal::BasicStream::read(pair<const Long*, const Long*>& v, IceUtil::ScopedArray<Long>& result)
|
|
908
|
+
{
|
|
909
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Long)));
|
|
910
|
+
if(sz > 0)
|
|
911
|
+
{
|
|
912
|
+
#if defined(__i386) || defined(_M_IX86) || defined(__x86_64) || defined(_M_X64)
|
|
913
|
+
v.first = reinterpret_cast<Long*>(i);
|
|
914
|
+
i += sz * static_cast<int>(sizeof(Long));
|
|
915
|
+
v.second = reinterpret_cast<Long*>(i);
|
|
916
|
+
#else
|
|
917
|
+
result.reset(new Long[sz]);
|
|
918
|
+
v.first = result.get();
|
|
919
|
+
v.second = result.get() + sz;
|
|
920
|
+
|
|
921
|
+
Container::iterator begin = i;
|
|
922
|
+
i += sz * static_cast<int>(sizeof(Long));
|
|
923
|
+
# ifdef ICE_BIG_ENDIAN
|
|
924
|
+
const Byte* src = &(*begin);
|
|
925
|
+
Byte* dest = reinterpret_cast<Byte*>(&result[0]) + sizeof(Long) - 1;
|
|
926
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
927
|
+
{
|
|
928
|
+
*dest-- = *src++;
|
|
929
|
+
*dest-- = *src++;
|
|
930
|
+
*dest-- = *src++;
|
|
931
|
+
*dest-- = *src++;
|
|
932
|
+
*dest-- = *src++;
|
|
933
|
+
*dest-- = *src++;
|
|
934
|
+
*dest-- = *src++;
|
|
935
|
+
*dest-- = *src++;
|
|
936
|
+
dest += 2 * sizeof(Long);
|
|
937
|
+
}
|
|
938
|
+
# else
|
|
939
|
+
copy(begin, i, reinterpret_cast<Byte*>(&result[0]));
|
|
940
|
+
# endif
|
|
941
|
+
#endif
|
|
942
|
+
}
|
|
943
|
+
else
|
|
944
|
+
{
|
|
945
|
+
result.reset();
|
|
946
|
+
v.first = v.second = 0;
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
void
|
|
951
|
+
IceInternal::BasicStream::write(Float v)
|
|
952
|
+
{
|
|
953
|
+
Container::size_type pos = b.size();
|
|
954
|
+
resize(pos + sizeof(Float));
|
|
955
|
+
Byte* dest = &b[pos];
|
|
956
|
+
#ifdef ICE_BIG_ENDIAN
|
|
957
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v) + sizeof(Float) - 1;
|
|
958
|
+
*dest++ = *src--;
|
|
959
|
+
*dest++ = *src--;
|
|
960
|
+
*dest++ = *src--;
|
|
961
|
+
*dest = *src;
|
|
962
|
+
#else
|
|
963
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v);
|
|
964
|
+
*dest++ = *src++;
|
|
965
|
+
*dest++ = *src++;
|
|
966
|
+
*dest++ = *src++;
|
|
967
|
+
*dest = *src;
|
|
968
|
+
#endif
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
void
|
|
972
|
+
IceInternal::BasicStream::write(const Float* begin, const Float* end)
|
|
973
|
+
{
|
|
974
|
+
Int sz = static_cast<Int>(end - begin);
|
|
975
|
+
writeSize(sz);
|
|
976
|
+
if(sz > 0)
|
|
977
|
+
{
|
|
978
|
+
Container::size_type pos = b.size();
|
|
979
|
+
resize(pos + sz * sizeof(Float));
|
|
980
|
+
#ifdef ICE_BIG_ENDIAN
|
|
981
|
+
const Byte* src = reinterpret_cast<const Byte*>(begin) + sizeof(Float) - 1;
|
|
982
|
+
Byte* dest = &(*(b.begin() + pos));
|
|
983
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
984
|
+
{
|
|
985
|
+
*dest++ = *src--;
|
|
986
|
+
*dest++ = *src--;
|
|
987
|
+
*dest++ = *src--;
|
|
988
|
+
*dest++ = *src--;
|
|
989
|
+
src += 2 * sizeof(Float);
|
|
990
|
+
}
|
|
991
|
+
#else
|
|
992
|
+
memcpy(&b[pos], reinterpret_cast<const Byte*>(begin), sz * sizeof(Float));
|
|
993
|
+
#endif
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
void
|
|
998
|
+
IceInternal::BasicStream::read(Float& v)
|
|
999
|
+
{
|
|
1000
|
+
if(b.end() - i < static_cast<int>(sizeof(Float)))
|
|
1001
|
+
{
|
|
1002
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
1003
|
+
}
|
|
1004
|
+
const Byte* src = &(*i);
|
|
1005
|
+
i += sizeof(Float);
|
|
1006
|
+
#ifdef ICE_BIG_ENDIAN
|
|
1007
|
+
Byte* dest = reinterpret_cast<Byte*>(&v) + sizeof(Float) - 1;
|
|
1008
|
+
*dest-- = *src++;
|
|
1009
|
+
*dest-- = *src++;
|
|
1010
|
+
*dest-- = *src++;
|
|
1011
|
+
*dest = *src;
|
|
1012
|
+
#else
|
|
1013
|
+
Byte* dest = reinterpret_cast<Byte*>(&v);
|
|
1014
|
+
*dest++ = *src++;
|
|
1015
|
+
*dest++ = *src++;
|
|
1016
|
+
*dest++ = *src++;
|
|
1017
|
+
*dest = *src;
|
|
1018
|
+
#endif
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
void
|
|
1022
|
+
IceInternal::BasicStream::read(vector<Float>& v)
|
|
1023
|
+
{
|
|
1024
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Float)));
|
|
1025
|
+
if(sz > 0)
|
|
1026
|
+
{
|
|
1027
|
+
Container::iterator begin = i;
|
|
1028
|
+
i += sz * static_cast<int>(sizeof(Float));
|
|
1029
|
+
v.resize(sz);
|
|
1030
|
+
#ifdef ICE_BIG_ENDIAN
|
|
1031
|
+
const Byte* src = &(*begin);
|
|
1032
|
+
Byte* dest = reinterpret_cast<Byte*>(&v[0]) + sizeof(Float) - 1;
|
|
1033
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
1034
|
+
{
|
|
1035
|
+
*dest-- = *src++;
|
|
1036
|
+
*dest-- = *src++;
|
|
1037
|
+
*dest-- = *src++;
|
|
1038
|
+
*dest-- = *src++;
|
|
1039
|
+
dest += 2 * sizeof(Float);
|
|
1040
|
+
}
|
|
1041
|
+
#else
|
|
1042
|
+
copy(begin, i, reinterpret_cast<Byte*>(&v[0]));
|
|
1043
|
+
#endif
|
|
1044
|
+
}
|
|
1045
|
+
else
|
|
1046
|
+
{
|
|
1047
|
+
v.clear();
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
void
|
|
1052
|
+
IceInternal::BasicStream::read(pair<const Float*, const Float*>& v, IceUtil::ScopedArray<Float>& result)
|
|
1053
|
+
{
|
|
1054
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Float)));
|
|
1055
|
+
if(sz > 0)
|
|
1056
|
+
{
|
|
1057
|
+
#if defined(__i386) || defined(_M_IX86) || defined(__x86_64) || defined(_M_X64)
|
|
1058
|
+
v.first = reinterpret_cast<Float*>(i);
|
|
1059
|
+
i += sz * static_cast<int>(sizeof(Float));
|
|
1060
|
+
v.second = reinterpret_cast<Float*>(i);
|
|
1061
|
+
#else
|
|
1062
|
+
result.reset(new Float[sz]);
|
|
1063
|
+
v.first = result.get();
|
|
1064
|
+
v.second = result.get() + sz;
|
|
1065
|
+
|
|
1066
|
+
Container::iterator begin = i;
|
|
1067
|
+
i += sz * static_cast<int>(sizeof(Float));
|
|
1068
|
+
# ifdef ICE_BIG_ENDIAN
|
|
1069
|
+
const Byte* src = &(*begin);
|
|
1070
|
+
Byte* dest = reinterpret_cast<Byte*>(&result[0]) + sizeof(Float) - 1;
|
|
1071
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
1072
|
+
{
|
|
1073
|
+
*dest-- = *src++;
|
|
1074
|
+
*dest-- = *src++;
|
|
1075
|
+
*dest-- = *src++;
|
|
1076
|
+
*dest-- = *src++;
|
|
1077
|
+
dest += 2 * sizeof(Float);
|
|
1078
|
+
}
|
|
1079
|
+
# else
|
|
1080
|
+
copy(begin, i, reinterpret_cast<Byte*>(&result[0]));
|
|
1081
|
+
# endif
|
|
1082
|
+
#endif
|
|
1083
|
+
}
|
|
1084
|
+
else
|
|
1085
|
+
{
|
|
1086
|
+
result.reset();
|
|
1087
|
+
v.first = v.second = 0;
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
void
|
|
1092
|
+
IceInternal::BasicStream::write(Double v)
|
|
1093
|
+
{
|
|
1094
|
+
Container::size_type pos = b.size();
|
|
1095
|
+
resize(pos + sizeof(Double));
|
|
1096
|
+
Byte* dest = &b[pos];
|
|
1097
|
+
#ifdef ICE_BIG_ENDIAN
|
|
1098
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v) + sizeof(Double) - 1;
|
|
1099
|
+
*dest++ = *src--;
|
|
1100
|
+
*dest++ = *src--;
|
|
1101
|
+
*dest++ = *src--;
|
|
1102
|
+
*dest++ = *src--;
|
|
1103
|
+
*dest++ = *src--;
|
|
1104
|
+
*dest++ = *src--;
|
|
1105
|
+
*dest++ = *src--;
|
|
1106
|
+
*dest = *src;
|
|
1107
|
+
#else
|
|
1108
|
+
const Byte* src = reinterpret_cast<const Byte*>(&v);
|
|
1109
|
+
# if defined(ICE_LITTLEBYTE_BIGWORD)
|
|
1110
|
+
dest[4] = *src++;
|
|
1111
|
+
dest[5] = *src++;
|
|
1112
|
+
dest[6] = *src++;
|
|
1113
|
+
dest[7] = *src++;
|
|
1114
|
+
dest[0] = *src++;
|
|
1115
|
+
dest[1] = *src++;
|
|
1116
|
+
dest[2] = *src++;
|
|
1117
|
+
dest[3] = *src;
|
|
1118
|
+
# else
|
|
1119
|
+
*dest++ = *src++;
|
|
1120
|
+
*dest++ = *src++;
|
|
1121
|
+
*dest++ = *src++;
|
|
1122
|
+
*dest++ = *src++;
|
|
1123
|
+
*dest++ = *src++;
|
|
1124
|
+
*dest++ = *src++;
|
|
1125
|
+
*dest++ = *src++;
|
|
1126
|
+
*dest = *src;
|
|
1127
|
+
# endif
|
|
1128
|
+
#endif
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
void
|
|
1132
|
+
IceInternal::BasicStream::write(const Double* begin, const Double* end)
|
|
1133
|
+
{
|
|
1134
|
+
Int sz = static_cast<Int>(end - begin);
|
|
1135
|
+
writeSize(sz);
|
|
1136
|
+
if(sz > 0)
|
|
1137
|
+
{
|
|
1138
|
+
Container::size_type pos = b.size();
|
|
1139
|
+
resize(pos + sz * sizeof(Double));
|
|
1140
|
+
#ifdef ICE_BIG_ENDIAN
|
|
1141
|
+
const Byte* src = reinterpret_cast<const Byte*>(begin) + sizeof(Double) - 1;
|
|
1142
|
+
Byte* dest = &(*(b.begin() + pos));
|
|
1143
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
1144
|
+
{
|
|
1145
|
+
*dest++ = *src--;
|
|
1146
|
+
*dest++ = *src--;
|
|
1147
|
+
*dest++ = *src--;
|
|
1148
|
+
*dest++ = *src--;
|
|
1149
|
+
*dest++ = *src--;
|
|
1150
|
+
*dest++ = *src--;
|
|
1151
|
+
*dest++ = *src--;
|
|
1152
|
+
*dest++ = *src--;
|
|
1153
|
+
src += 2 * sizeof(Double);
|
|
1154
|
+
}
|
|
1155
|
+
#elif defined(ICE_LITTLEBYTE_BIGWORD)
|
|
1156
|
+
const Byte* src = reinterpret_cast<const Byte*>(begin);
|
|
1157
|
+
Byte* dest = &(*(b.begin() + pos));
|
|
1158
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
1159
|
+
{
|
|
1160
|
+
dest[4] = *src++;
|
|
1161
|
+
dest[5] = *src++;
|
|
1162
|
+
dest[6] = *src++;
|
|
1163
|
+
dest[7] = *src++;
|
|
1164
|
+
dest[0] = *src++;
|
|
1165
|
+
dest[1] = *src++;
|
|
1166
|
+
dest[2] = *src++;
|
|
1167
|
+
dest[3] = *src++;
|
|
1168
|
+
dest += sizeof(Double);
|
|
1169
|
+
}
|
|
1170
|
+
#else
|
|
1171
|
+
memcpy(&b[pos], reinterpret_cast<const Byte*>(begin), sz * sizeof(Double));
|
|
1172
|
+
#endif
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
void
|
|
1177
|
+
IceInternal::BasicStream::read(Double& v)
|
|
1178
|
+
{
|
|
1179
|
+
if(b.end() - i < static_cast<int>(sizeof(Double)))
|
|
1180
|
+
{
|
|
1181
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
1182
|
+
}
|
|
1183
|
+
const Byte* src = &(*i);
|
|
1184
|
+
i += sizeof(Double);
|
|
1185
|
+
#ifdef ICE_BIG_ENDIAN
|
|
1186
|
+
Byte* dest = reinterpret_cast<Byte*>(&v) + sizeof(Double) - 1;
|
|
1187
|
+
*dest-- = *src++;
|
|
1188
|
+
*dest-- = *src++;
|
|
1189
|
+
*dest-- = *src++;
|
|
1190
|
+
*dest-- = *src++;
|
|
1191
|
+
*dest-- = *src++;
|
|
1192
|
+
*dest-- = *src++;
|
|
1193
|
+
*dest-- = *src++;
|
|
1194
|
+
*dest = *src;
|
|
1195
|
+
#else
|
|
1196
|
+
Byte* dest = reinterpret_cast<Byte*>(&v);
|
|
1197
|
+
# if defined(ICE_LITTLEBYTE_BIGWORD)
|
|
1198
|
+
dest[4] = *src++;
|
|
1199
|
+
dest[5] = *src++;
|
|
1200
|
+
dest[6] = *src++;
|
|
1201
|
+
dest[7] = *src++;
|
|
1202
|
+
dest[0] = *src++;
|
|
1203
|
+
dest[1] = *src++;
|
|
1204
|
+
dest[2] = *src++;
|
|
1205
|
+
dest[3] = *src;
|
|
1206
|
+
# else
|
|
1207
|
+
*dest++ = *src++;
|
|
1208
|
+
*dest++ = *src++;
|
|
1209
|
+
*dest++ = *src++;
|
|
1210
|
+
*dest++ = *src++;
|
|
1211
|
+
*dest++ = *src++;
|
|
1212
|
+
*dest++ = *src++;
|
|
1213
|
+
*dest++ = *src++;
|
|
1214
|
+
*dest = *src;
|
|
1215
|
+
# endif
|
|
1216
|
+
#endif
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
void
|
|
1220
|
+
IceInternal::BasicStream::read(vector<Double>& v)
|
|
1221
|
+
{
|
|
1222
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Double)));
|
|
1223
|
+
if(sz > 0)
|
|
1224
|
+
{
|
|
1225
|
+
Container::iterator begin = i;
|
|
1226
|
+
i += sz * static_cast<int>(sizeof(Double));
|
|
1227
|
+
v.resize(sz);
|
|
1228
|
+
#ifdef ICE_BIG_ENDIAN
|
|
1229
|
+
const Byte* src = &(*begin);
|
|
1230
|
+
Byte* dest = reinterpret_cast<Byte*>(&v[0]) + sizeof(Double) - 1;
|
|
1231
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
1232
|
+
{
|
|
1233
|
+
*dest-- = *src++;
|
|
1234
|
+
*dest-- = *src++;
|
|
1235
|
+
*dest-- = *src++;
|
|
1236
|
+
*dest-- = *src++;
|
|
1237
|
+
*dest-- = *src++;
|
|
1238
|
+
*dest-- = *src++;
|
|
1239
|
+
*dest-- = *src++;
|
|
1240
|
+
*dest-- = *src++;
|
|
1241
|
+
dest += 2 * sizeof(Double);
|
|
1242
|
+
}
|
|
1243
|
+
#elif defined(ICE_LITTLEBYTE_BIGWORD)
|
|
1244
|
+
const Byte* src = &(*begin);
|
|
1245
|
+
Byte* dest = reinterpret_cast<Byte*>(&v[0]);
|
|
1246
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
1247
|
+
{
|
|
1248
|
+
dest[4] = *src++;
|
|
1249
|
+
dest[5] = *src++;
|
|
1250
|
+
dest[6] = *src++;
|
|
1251
|
+
dest[7] = *src++;
|
|
1252
|
+
dest[0] = *src++;
|
|
1253
|
+
dest[1] = *src++;
|
|
1254
|
+
dest[2] = *src++;
|
|
1255
|
+
dest[3] = *src++;
|
|
1256
|
+
dest += sizeof(Double);
|
|
1257
|
+
}
|
|
1258
|
+
#else
|
|
1259
|
+
copy(begin, i, reinterpret_cast<Byte*>(&v[0]));
|
|
1260
|
+
#endif
|
|
1261
|
+
}
|
|
1262
|
+
else
|
|
1263
|
+
{
|
|
1264
|
+
v.clear();
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
void
|
|
1269
|
+
IceInternal::BasicStream::read(pair<const Double*, const Double*>& v, IceUtil::ScopedArray<Double>& result)
|
|
1270
|
+
{
|
|
1271
|
+
Int sz = readAndCheckSeqSize(static_cast<int>(sizeof(Double)));
|
|
1272
|
+
if(sz > 0)
|
|
1273
|
+
{
|
|
1274
|
+
#if defined(__i386) || defined(_M_IX86) || defined(__x86_64) || defined(_M_X64)
|
|
1275
|
+
v.first = reinterpret_cast<Double*>(i);
|
|
1276
|
+
i += sz * static_cast<int>(sizeof(Double));
|
|
1277
|
+
v.second = reinterpret_cast<Double*>(i);
|
|
1278
|
+
#else
|
|
1279
|
+
result.reset(new Double[sz]);
|
|
1280
|
+
v.first = result.get();
|
|
1281
|
+
v.second = result.get() + sz;
|
|
1282
|
+
|
|
1283
|
+
Container::iterator begin = i;
|
|
1284
|
+
i += sz * static_cast<int>(sizeof(Double));
|
|
1285
|
+
# ifdef ICE_BIG_ENDIAN
|
|
1286
|
+
const Byte* src = &(*begin);
|
|
1287
|
+
Byte* dest = reinterpret_cast<Byte*>(&result[0]) + sizeof(Double) - 1;
|
|
1288
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
1289
|
+
{
|
|
1290
|
+
*dest-- = *src++;
|
|
1291
|
+
*dest-- = *src++;
|
|
1292
|
+
*dest-- = *src++;
|
|
1293
|
+
*dest-- = *src++;
|
|
1294
|
+
*dest-- = *src++;
|
|
1295
|
+
*dest-- = *src++;
|
|
1296
|
+
*dest-- = *src++;
|
|
1297
|
+
*dest-- = *src++;
|
|
1298
|
+
dest += 2 * sizeof(Double);
|
|
1299
|
+
}
|
|
1300
|
+
# elif defined(ICE_LITTLEBYTE_BIGWORD)
|
|
1301
|
+
const Byte* src = &(*begin);
|
|
1302
|
+
Byte* dest = reinterpret_cast<Byte*>(&result[0]);
|
|
1303
|
+
for(int j = 0 ; j < sz ; ++j)
|
|
1304
|
+
{
|
|
1305
|
+
dest[4] = *src++;
|
|
1306
|
+
dest[5] = *src++;
|
|
1307
|
+
dest[6] = *src++;
|
|
1308
|
+
dest[7] = *src++;
|
|
1309
|
+
dest[0] = *src++;
|
|
1310
|
+
dest[1] = *src++;
|
|
1311
|
+
dest[2] = *src++;
|
|
1312
|
+
dest[3] = *src++;
|
|
1313
|
+
dest += sizeof(Double);
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
# else
|
|
1317
|
+
copy(begin, i, reinterpret_cast<Byte*>(&result[0]));
|
|
1318
|
+
# endif
|
|
1319
|
+
#endif
|
|
1320
|
+
}
|
|
1321
|
+
else
|
|
1322
|
+
{
|
|
1323
|
+
result.reset();
|
|
1324
|
+
v.first = v.second = 0;
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
//
|
|
1329
|
+
// NOTE: This member function is intentionally omitted in order to
|
|
1330
|
+
// cause a link error if it is used. This is for efficiency reasons:
|
|
1331
|
+
// writing a const char * requires a traversal of the string to get
|
|
1332
|
+
// the string length first, which takes O(n) time, whereas getting the
|
|
1333
|
+
// string length from a std::string takes constant time.
|
|
1334
|
+
//
|
|
1335
|
+
/*
|
|
1336
|
+
void
|
|
1337
|
+
IceInternal::BasicStream::write(const char*)
|
|
1338
|
+
{
|
|
1339
|
+
}
|
|
1340
|
+
*/
|
|
1341
|
+
|
|
1342
|
+
void
|
|
1343
|
+
IceInternal::BasicStream::writeConverted(const char* vdata, size_t vsize)
|
|
1344
|
+
{
|
|
1345
|
+
//
|
|
1346
|
+
// What is the size of the resulting UTF-8 encoded string?
|
|
1347
|
+
// Impossible to tell, so we guess. If we don't guess correctly,
|
|
1348
|
+
// we'll have to fix the mistake afterwards
|
|
1349
|
+
//
|
|
1350
|
+
try
|
|
1351
|
+
{
|
|
1352
|
+
Int guessedSize = static_cast<Int>(vsize);
|
|
1353
|
+
writeSize(guessedSize); // writeSize() only writes the size; it does not reserve any buffer space.
|
|
1354
|
+
|
|
1355
|
+
size_t firstIndex = b.size();
|
|
1356
|
+
StreamUTF8BufferI buffer(*this);
|
|
1357
|
+
|
|
1358
|
+
Byte* lastByte = _stringConverter->toUTF8(vdata, vdata + vsize, buffer);
|
|
1359
|
+
if(lastByte != b.end())
|
|
1360
|
+
{
|
|
1361
|
+
resize(lastByte - b.begin());
|
|
1362
|
+
}
|
|
1363
|
+
size_t lastIndex = b.size();
|
|
1364
|
+
|
|
1365
|
+
Int actualSize = static_cast<Int>(lastIndex - firstIndex);
|
|
1366
|
+
|
|
1367
|
+
//
|
|
1368
|
+
// Check against the guess
|
|
1369
|
+
//
|
|
1370
|
+
if(guessedSize != actualSize)
|
|
1371
|
+
{
|
|
1372
|
+
if(guessedSize <= 254 && actualSize > 254)
|
|
1373
|
+
{
|
|
1374
|
+
//
|
|
1375
|
+
// Move the UTF-8 sequence 4 bytes further
|
|
1376
|
+
// Use memmove instead of memcpy since the source and destination typically overlap.
|
|
1377
|
+
//
|
|
1378
|
+
resize(b.size() + 4);
|
|
1379
|
+
memmove(b.begin() + firstIndex + 4, b.begin() + firstIndex, actualSize);
|
|
1380
|
+
}
|
|
1381
|
+
else if(guessedSize > 254 && actualSize <= 254)
|
|
1382
|
+
{
|
|
1383
|
+
//
|
|
1384
|
+
// Move the UTF-8 sequence 4 bytes back
|
|
1385
|
+
//
|
|
1386
|
+
memmove(b.begin() + firstIndex - 4, b.begin() + firstIndex, actualSize);
|
|
1387
|
+
resize(b.size() - 4);
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1390
|
+
if(guessedSize <= 254)
|
|
1391
|
+
{
|
|
1392
|
+
rewriteSize(actualSize, b.begin() + firstIndex - 1);
|
|
1393
|
+
}
|
|
1394
|
+
else
|
|
1395
|
+
{
|
|
1396
|
+
rewriteSize(actualSize, b.begin() + firstIndex - 1 - 4);
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
catch(const IceUtil::IllegalConversionException& ex)
|
|
1401
|
+
{
|
|
1402
|
+
throw StringConversionException(__FILE__, __LINE__, ex.reason());
|
|
1403
|
+
}
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
void
|
|
1407
|
+
IceInternal::BasicStream::write(const string* begin, const string* end, bool convert)
|
|
1408
|
+
{
|
|
1409
|
+
Int sz = static_cast<Int>(end - begin);
|
|
1410
|
+
writeSize(sz);
|
|
1411
|
+
if(sz > 0)
|
|
1412
|
+
{
|
|
1413
|
+
for(int i = 0; i < sz; ++i)
|
|
1414
|
+
{
|
|
1415
|
+
write(begin[i], convert);
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
void
|
|
1421
|
+
IceInternal::BasicStream::readConverted(string& v, int sz)
|
|
1422
|
+
{
|
|
1423
|
+
try
|
|
1424
|
+
{
|
|
1425
|
+
_stringConverter->fromUTF8(i, i + sz, v);
|
|
1426
|
+
}
|
|
1427
|
+
catch(const IceUtil::IllegalConversionException& ex)
|
|
1428
|
+
{
|
|
1429
|
+
throw StringConversionException(__FILE__, __LINE__, ex.reason());
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
void
|
|
1434
|
+
IceInternal::BasicStream::read(vector<string>& v, bool convert)
|
|
1435
|
+
{
|
|
1436
|
+
Int sz = readAndCheckSeqSize(1);
|
|
1437
|
+
if(sz > 0)
|
|
1438
|
+
{
|
|
1439
|
+
v.resize(sz);
|
|
1440
|
+
for(int j = 0; j < sz; ++j)
|
|
1441
|
+
{
|
|
1442
|
+
read(v[j], convert);
|
|
1443
|
+
}
|
|
1444
|
+
}
|
|
1445
|
+
else
|
|
1446
|
+
{
|
|
1447
|
+
v.clear();
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
void
|
|
1452
|
+
IceInternal::BasicStream::write(const wstring& v)
|
|
1453
|
+
{
|
|
1454
|
+
if(v.empty())
|
|
1455
|
+
{
|
|
1456
|
+
writeSize(0);
|
|
1457
|
+
return;
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
//
|
|
1461
|
+
// What is the size of the resulting UTF-8 encoded string?
|
|
1462
|
+
// Impossible to tell, so we guess. If we don't guess correctly,
|
|
1463
|
+
// we'll have to fix the mistake afterwards
|
|
1464
|
+
//
|
|
1465
|
+
try
|
|
1466
|
+
{
|
|
1467
|
+
Int guessedSize = static_cast<Int>(v.size());
|
|
1468
|
+
writeSize(guessedSize); // writeSize() only writes the size; it does not reserve any buffer space.
|
|
1469
|
+
|
|
1470
|
+
size_t firstIndex = b.size();
|
|
1471
|
+
StreamUTF8BufferI buffer(*this);
|
|
1472
|
+
|
|
1473
|
+
Byte* lastByte = _wstringConverter->toUTF8(v.data(), v.data() + v.size(), buffer);
|
|
1474
|
+
if(lastByte != b.end())
|
|
1475
|
+
{
|
|
1476
|
+
resize(lastByte - b.begin());
|
|
1477
|
+
}
|
|
1478
|
+
size_t lastIndex = b.size();
|
|
1479
|
+
|
|
1480
|
+
Int actualSize = static_cast<Int>(lastIndex - firstIndex);
|
|
1481
|
+
|
|
1482
|
+
//
|
|
1483
|
+
// Check against the guess
|
|
1484
|
+
//
|
|
1485
|
+
if(guessedSize != actualSize)
|
|
1486
|
+
{
|
|
1487
|
+
if(guessedSize <= 254 && actualSize > 254)
|
|
1488
|
+
{
|
|
1489
|
+
//
|
|
1490
|
+
// Move the UTF-8 sequence 4 bytes further
|
|
1491
|
+
// Use memmove instead of memcpy since the source and destination typically overlap.
|
|
1492
|
+
//
|
|
1493
|
+
resize(b.size() + 4);
|
|
1494
|
+
memmove(b.begin() + firstIndex + 4, b.begin() + firstIndex, actualSize);
|
|
1495
|
+
}
|
|
1496
|
+
else if(guessedSize > 254 && actualSize <= 254)
|
|
1497
|
+
{
|
|
1498
|
+
//
|
|
1499
|
+
// Move the UTF-8 sequence 4 bytes back
|
|
1500
|
+
//
|
|
1501
|
+
memmove(b.begin() + firstIndex - 4, b.begin() + firstIndex, actualSize);
|
|
1502
|
+
resize(b.size() - 4);
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
if(guessedSize <= 254)
|
|
1506
|
+
{
|
|
1507
|
+
rewriteSize(actualSize, b.begin() + firstIndex - 1);
|
|
1508
|
+
}
|
|
1509
|
+
else
|
|
1510
|
+
{
|
|
1511
|
+
rewriteSize(actualSize, b.begin() + firstIndex - 1 - 4);
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1515
|
+
catch(const IceUtil::IllegalConversionException& ex)
|
|
1516
|
+
{
|
|
1517
|
+
throw StringConversionException(__FILE__, __LINE__, ex.reason());
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
void
|
|
1522
|
+
IceInternal::BasicStream::write(const wstring* begin, const wstring* end)
|
|
1523
|
+
{
|
|
1524
|
+
Int sz = static_cast<Int>(end - begin);
|
|
1525
|
+
writeSize(sz);
|
|
1526
|
+
if(sz > 0)
|
|
1527
|
+
{
|
|
1528
|
+
for(int i = 0; i < sz; ++i)
|
|
1529
|
+
{
|
|
1530
|
+
write(begin[i]);
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
void
|
|
1536
|
+
IceInternal::BasicStream::read(wstring& v)
|
|
1537
|
+
{
|
|
1538
|
+
Int sz = readSize();
|
|
1539
|
+
if(sz > 0)
|
|
1540
|
+
{
|
|
1541
|
+
if(b.end() - i < sz)
|
|
1542
|
+
{
|
|
1543
|
+
throwUnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
try
|
|
1547
|
+
{
|
|
1548
|
+
_wstringConverter->fromUTF8(i, i + sz, v);
|
|
1549
|
+
i += sz;
|
|
1550
|
+
}
|
|
1551
|
+
catch(const IceUtil::IllegalConversionException& ex)
|
|
1552
|
+
{
|
|
1553
|
+
throw StringConversionException(__FILE__, __LINE__, ex.reason());
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1556
|
+
else
|
|
1557
|
+
{
|
|
1558
|
+
v.clear();
|
|
1559
|
+
}
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
void
|
|
1563
|
+
IceInternal::BasicStream::read(vector<wstring>& v)
|
|
1564
|
+
{
|
|
1565
|
+
Int sz = readAndCheckSeqSize(1);
|
|
1566
|
+
if(sz > 0)
|
|
1567
|
+
{
|
|
1568
|
+
v.resize(sz);
|
|
1569
|
+
for(int j = 0; j < sz; ++j)
|
|
1570
|
+
{
|
|
1571
|
+
read(v[j]);
|
|
1572
|
+
}
|
|
1573
|
+
}
|
|
1574
|
+
else
|
|
1575
|
+
{
|
|
1576
|
+
v.clear();
|
|
1577
|
+
}
|
|
1578
|
+
}
|
|
1579
|
+
|
|
1580
|
+
void
|
|
1581
|
+
IceInternal::BasicStream::write(const ObjectPrx& v)
|
|
1582
|
+
{
|
|
1583
|
+
_instance->proxyFactory()->proxyToStream(v, this);
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
void
|
|
1587
|
+
IceInternal::BasicStream::read(ObjectPrx& v)
|
|
1588
|
+
{
|
|
1589
|
+
v = _instance->proxyFactory()->streamToProxy(this);
|
|
1590
|
+
}
|
|
1591
|
+
|
|
1592
|
+
Int
|
|
1593
|
+
IceInternal::BasicStream::readEnum(Int maxValue)
|
|
1594
|
+
{
|
|
1595
|
+
if(getReadEncoding() == Encoding_1_0)
|
|
1596
|
+
{
|
|
1597
|
+
if(maxValue < 127)
|
|
1598
|
+
{
|
|
1599
|
+
Byte value;
|
|
1600
|
+
read(value);
|
|
1601
|
+
return value;
|
|
1602
|
+
}
|
|
1603
|
+
else if(maxValue < 32767)
|
|
1604
|
+
{
|
|
1605
|
+
Short value;
|
|
1606
|
+
read(value);
|
|
1607
|
+
return value;
|
|
1608
|
+
}
|
|
1609
|
+
else
|
|
1610
|
+
{
|
|
1611
|
+
Int value;
|
|
1612
|
+
read(value);
|
|
1613
|
+
return value;
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
else
|
|
1617
|
+
{
|
|
1618
|
+
return readSize();
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
void
|
|
1623
|
+
IceInternal::BasicStream::writeEnum(Int v, Int maxValue)
|
|
1624
|
+
{
|
|
1625
|
+
if(getWriteEncoding() == Encoding_1_0)
|
|
1626
|
+
{
|
|
1627
|
+
if(maxValue < 127)
|
|
1628
|
+
{
|
|
1629
|
+
write(static_cast<Byte>(v));
|
|
1630
|
+
}
|
|
1631
|
+
else if(maxValue < 32767)
|
|
1632
|
+
{
|
|
1633
|
+
write(static_cast<Short>(v));
|
|
1634
|
+
}
|
|
1635
|
+
else
|
|
1636
|
+
{
|
|
1637
|
+
write(v);
|
|
1638
|
+
}
|
|
1639
|
+
}
|
|
1640
|
+
else
|
|
1641
|
+
{
|
|
1642
|
+
writeSize(v);
|
|
1643
|
+
}
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
void
|
|
1647
|
+
IceInternal::BasicStream::writeException(const UserException& e)
|
|
1648
|
+
{
|
|
1649
|
+
initWriteEncaps();
|
|
1650
|
+
_currentWriteEncaps->encoder->write(e);
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1653
|
+
void
|
|
1654
|
+
IceInternal::BasicStream::throwException(const UserExceptionFactoryPtr& factory)
|
|
1655
|
+
{
|
|
1656
|
+
initReadEncaps();
|
|
1657
|
+
_currentReadEncaps->decoder->throwException(factory);
|
|
1658
|
+
}
|
|
1659
|
+
|
|
1660
|
+
void
|
|
1661
|
+
IceInternal::BasicStream::sliceObjects(bool doSlice)
|
|
1662
|
+
{
|
|
1663
|
+
_sliceObjects = doSlice;
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
bool
|
|
1667
|
+
IceInternal::BasicStream::readOptImpl(Int readTag, OptionalFormat expectedFormat)
|
|
1668
|
+
{
|
|
1669
|
+
if(getReadEncoding() == Encoding_1_0)
|
|
1670
|
+
{
|
|
1671
|
+
return false; // Optional members aren't supported with the 1.0 encoding.
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1674
|
+
while(true)
|
|
1675
|
+
{
|
|
1676
|
+
if(i >= b.begin() + _currentReadEncaps->start + _currentReadEncaps->sz)
|
|
1677
|
+
{
|
|
1678
|
+
return false; // End of encapsulation also indicates end of optionals.
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
Byte v;
|
|
1682
|
+
read(v);
|
|
1683
|
+
if(v == OPTIONAL_END_MARKER)
|
|
1684
|
+
{
|
|
1685
|
+
--i; // Rewind
|
|
1686
|
+
return false;
|
|
1687
|
+
}
|
|
1688
|
+
|
|
1689
|
+
OptionalFormat format = static_cast<OptionalFormat>(v & 0x07); // First 3 bits.
|
|
1690
|
+
Int tag = static_cast<Int>(v >> 3);
|
|
1691
|
+
if(tag == 30)
|
|
1692
|
+
{
|
|
1693
|
+
tag = readSize();
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
if(tag > readTag)
|
|
1697
|
+
{
|
|
1698
|
+
i -= tag < 30 ? 1 : (tag < 255 ? 2 : 6); // Rewind
|
|
1699
|
+
return false; // No optional data members with the requested tag.
|
|
1700
|
+
}
|
|
1701
|
+
else if(tag < readTag)
|
|
1702
|
+
{
|
|
1703
|
+
skipOpt(format); // Skip optional data members
|
|
1704
|
+
}
|
|
1705
|
+
else
|
|
1706
|
+
{
|
|
1707
|
+
if(format != expectedFormat)
|
|
1708
|
+
{
|
|
1709
|
+
ostringstream os;
|
|
1710
|
+
os << "invalid optional data member `" << tag << "': unexpected format";
|
|
1711
|
+
throw MarshalException(__FILE__, __LINE__, os.str());
|
|
1712
|
+
}
|
|
1713
|
+
return true;
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
return true; // Keep the compiler happy.
|
|
1717
|
+
}
|
|
1718
|
+
|
|
1719
|
+
bool
|
|
1720
|
+
IceInternal::BasicStream::writeOptImpl(Int tag, OptionalFormat type)
|
|
1721
|
+
{
|
|
1722
|
+
if(getWriteEncoding() == Encoding_1_0)
|
|
1723
|
+
{
|
|
1724
|
+
return false; // Optional members aren't supported with the 1.0 encoding.
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
Byte v = static_cast<Byte>(type);
|
|
1728
|
+
if(tag < 30)
|
|
1729
|
+
{
|
|
1730
|
+
v |= static_cast<Byte>(tag << 3);
|
|
1731
|
+
write(v);
|
|
1732
|
+
}
|
|
1733
|
+
else
|
|
1734
|
+
{
|
|
1735
|
+
v |= 0xF0; // tag = 30
|
|
1736
|
+
write(v);
|
|
1737
|
+
writeSize(tag);
|
|
1738
|
+
}
|
|
1739
|
+
return true;
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
void
|
|
1743
|
+
IceInternal::BasicStream::skipOpt(OptionalFormat type)
|
|
1744
|
+
{
|
|
1745
|
+
switch(type)
|
|
1746
|
+
{
|
|
1747
|
+
case Ice::OptionalFormatF1:
|
|
1748
|
+
{
|
|
1749
|
+
skip(1);
|
|
1750
|
+
break;
|
|
1751
|
+
}
|
|
1752
|
+
case Ice::OptionalFormatF2:
|
|
1753
|
+
{
|
|
1754
|
+
skip(2);
|
|
1755
|
+
break;
|
|
1756
|
+
}
|
|
1757
|
+
case Ice::OptionalFormatF4:
|
|
1758
|
+
{
|
|
1759
|
+
skip(4);
|
|
1760
|
+
break;
|
|
1761
|
+
}
|
|
1762
|
+
case Ice::OptionalFormatF8:
|
|
1763
|
+
{
|
|
1764
|
+
skip(8);
|
|
1765
|
+
break;
|
|
1766
|
+
}
|
|
1767
|
+
case Ice::OptionalFormatSize:
|
|
1768
|
+
{
|
|
1769
|
+
skipSize();
|
|
1770
|
+
break;
|
|
1771
|
+
}
|
|
1772
|
+
case Ice::OptionalFormatVSize:
|
|
1773
|
+
{
|
|
1774
|
+
skip(readSize());
|
|
1775
|
+
break;
|
|
1776
|
+
}
|
|
1777
|
+
case Ice::OptionalFormatFSize:
|
|
1778
|
+
{
|
|
1779
|
+
Int sz;
|
|
1780
|
+
read(sz);
|
|
1781
|
+
skip(sz);
|
|
1782
|
+
break;
|
|
1783
|
+
}
|
|
1784
|
+
case Ice::OptionalFormatClass:
|
|
1785
|
+
{
|
|
1786
|
+
read(0, 0);
|
|
1787
|
+
break;
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
|
|
1792
|
+
void
|
|
1793
|
+
BasicStream::skipOpts()
|
|
1794
|
+
{
|
|
1795
|
+
//
|
|
1796
|
+
// Skip remaining un-read optional members.
|
|
1797
|
+
//
|
|
1798
|
+
while(true)
|
|
1799
|
+
{
|
|
1800
|
+
if(i >= b.begin() + _currentReadEncaps->start + _currentReadEncaps->sz)
|
|
1801
|
+
{
|
|
1802
|
+
return; // End of encapsulation also indicates end of optionals.
|
|
1803
|
+
}
|
|
1804
|
+
|
|
1805
|
+
Byte v;
|
|
1806
|
+
read(v);
|
|
1807
|
+
if(v == OPTIONAL_END_MARKER)
|
|
1808
|
+
{
|
|
1809
|
+
return;
|
|
1810
|
+
}
|
|
1811
|
+
|
|
1812
|
+
OptionalFormat format = static_cast<OptionalFormat>(v & 0x07); // Read first 3 bits.
|
|
1813
|
+
if(static_cast<Int>(v >> 3) == 30)
|
|
1814
|
+
{
|
|
1815
|
+
skipSize();
|
|
1816
|
+
}
|
|
1817
|
+
skipOpt(format);
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
|
|
1821
|
+
void
|
|
1822
|
+
IceInternal::BasicStream::throwUnmarshalOutOfBoundsException(const char* file, int line)
|
|
1823
|
+
{
|
|
1824
|
+
throw UnmarshalOutOfBoundsException(file, line);
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
void
|
|
1828
|
+
IceInternal::BasicStream::throwEncapsulationException(const char* file, int line)
|
|
1829
|
+
{
|
|
1830
|
+
throw EncapsulationException(file, line);
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
void
|
|
1834
|
+
IceInternal::BasicStream::initReadEncaps()
|
|
1835
|
+
{
|
|
1836
|
+
if(!_currentReadEncaps) // Lazy initialization.
|
|
1837
|
+
{
|
|
1838
|
+
_currentReadEncaps = &_preAllocatedReadEncaps;
|
|
1839
|
+
_currentReadEncaps->sz = static_cast<Ice::Int>(b.size());
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
if(!_currentReadEncaps->decoder) // Lazy initialization.
|
|
1843
|
+
{
|
|
1844
|
+
ObjectFactoryManagerPtr factoryManager = _instance->servantFactoryManager();
|
|
1845
|
+
if(_currentReadEncaps->encoding == Encoding_1_0)
|
|
1846
|
+
{
|
|
1847
|
+
_currentReadEncaps->decoder = new EncapsDecoder10(this, _currentReadEncaps, _sliceObjects, factoryManager);
|
|
1848
|
+
}
|
|
1849
|
+
else
|
|
1850
|
+
{
|
|
1851
|
+
_currentReadEncaps->decoder = new EncapsDecoder11(this, _currentReadEncaps, _sliceObjects, factoryManager);
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
void
|
|
1857
|
+
IceInternal::BasicStream::initWriteEncaps()
|
|
1858
|
+
{
|
|
1859
|
+
if(!_currentWriteEncaps) // Lazy initialization.
|
|
1860
|
+
{
|
|
1861
|
+
_currentWriteEncaps = &_preAllocatedWriteEncaps;
|
|
1862
|
+
_currentWriteEncaps->start = b.size();
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1865
|
+
if(_currentWriteEncaps->format == Ice::DefaultFormat)
|
|
1866
|
+
{
|
|
1867
|
+
_currentWriteEncaps->format = _instance->defaultsAndOverrides()->defaultFormat;
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
if(!_currentWriteEncaps->encoder) // Lazy initialization.
|
|
1871
|
+
{
|
|
1872
|
+
if(_currentWriteEncaps->encoding == Encoding_1_0)
|
|
1873
|
+
{
|
|
1874
|
+
_currentWriteEncaps->encoder = new EncapsEncoder10(this, _currentWriteEncaps);
|
|
1875
|
+
}
|
|
1876
|
+
else
|
|
1877
|
+
{
|
|
1878
|
+
_currentWriteEncaps->encoder = new EncapsEncoder11(this, _currentWriteEncaps);
|
|
1879
|
+
}
|
|
1880
|
+
}
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
string
|
|
1884
|
+
IceInternal::BasicStream::EncapsDecoder::readTypeId(bool isIndex)
|
|
1885
|
+
{
|
|
1886
|
+
if(isIndex)
|
|
1887
|
+
{
|
|
1888
|
+
Int index = _stream->readSize();
|
|
1889
|
+
TypeIdReadMap::const_iterator k = _typeIdMap.find(index);
|
|
1890
|
+
if(k == _typeIdMap.end())
|
|
1891
|
+
{
|
|
1892
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
1893
|
+
}
|
|
1894
|
+
return k->second;
|
|
1895
|
+
}
|
|
1896
|
+
else
|
|
1897
|
+
{
|
|
1898
|
+
string typeId;
|
|
1899
|
+
_stream->read(typeId, false);
|
|
1900
|
+
_typeIdMap.insert(make_pair(++_typeIdIndex, typeId));
|
|
1901
|
+
return typeId;
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
Ice::ObjectPtr
|
|
1906
|
+
IceInternal::BasicStream::EncapsDecoder::newInstance(const string& typeId)
|
|
1907
|
+
{
|
|
1908
|
+
Ice::ObjectPtr v;
|
|
1909
|
+
|
|
1910
|
+
//
|
|
1911
|
+
// Try to find a factory registered for the specific type.
|
|
1912
|
+
//
|
|
1913
|
+
ObjectFactoryPtr userFactory = _servantFactoryManager->find(typeId);
|
|
1914
|
+
if(userFactory)
|
|
1915
|
+
{
|
|
1916
|
+
v = userFactory->create(typeId);
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1919
|
+
//
|
|
1920
|
+
// If that fails, invoke the default factory if one has been
|
|
1921
|
+
// registered.
|
|
1922
|
+
//
|
|
1923
|
+
if(!v)
|
|
1924
|
+
{
|
|
1925
|
+
userFactory = _servantFactoryManager->find("");
|
|
1926
|
+
if(userFactory)
|
|
1927
|
+
{
|
|
1928
|
+
v = userFactory->create(typeId);
|
|
1929
|
+
}
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
//
|
|
1933
|
+
// Last chance: check the table of static factories (i.e.,
|
|
1934
|
+
// automatically generated factories for concrete classes).
|
|
1935
|
+
//
|
|
1936
|
+
if(!v)
|
|
1937
|
+
{
|
|
1938
|
+
ObjectFactoryPtr of = IceInternal::factoryTable->getObjectFactory(typeId);
|
|
1939
|
+
if(of)
|
|
1940
|
+
{
|
|
1941
|
+
v = of->create(typeId);
|
|
1942
|
+
assert(v);
|
|
1943
|
+
}
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1946
|
+
return v;
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
void
|
|
1950
|
+
IceInternal::BasicStream::EncapsDecoder::addPatchEntry(Int index, PatchFunc patchFunc, void* patchAddr)
|
|
1951
|
+
{
|
|
1952
|
+
assert(index > 0);
|
|
1953
|
+
|
|
1954
|
+
//
|
|
1955
|
+
// Check if already un-marshalled the object. If that's the case,
|
|
1956
|
+
// just patch the object smart pointer and we're done.
|
|
1957
|
+
//
|
|
1958
|
+
IndexToPtrMap::iterator p = _unmarshaledMap.find(index);
|
|
1959
|
+
if(p != _unmarshaledMap.end())
|
|
1960
|
+
{
|
|
1961
|
+
(*patchFunc)(patchAddr, p->second);
|
|
1962
|
+
return;
|
|
1963
|
+
}
|
|
1964
|
+
|
|
1965
|
+
//
|
|
1966
|
+
// Add patch entry if the object isn't un-marshalled yet, the
|
|
1967
|
+
// smart pointer will be patched when the instance is
|
|
1968
|
+
// un-marshalled.
|
|
1969
|
+
//
|
|
1970
|
+
|
|
1971
|
+
PatchMap::iterator q = _patchMap.find(index);
|
|
1972
|
+
if(q == _patchMap.end())
|
|
1973
|
+
{
|
|
1974
|
+
//
|
|
1975
|
+
// We have no outstanding instances to be patched for this
|
|
1976
|
+
// index, so make a new entry in the patch map.
|
|
1977
|
+
//
|
|
1978
|
+
q = _patchMap.insert(make_pair(index, PatchList())).first;
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1981
|
+
//
|
|
1982
|
+
// Append a patch entry for this instance.
|
|
1983
|
+
//
|
|
1984
|
+
PatchEntry e;
|
|
1985
|
+
e.patchFunc = patchFunc;
|
|
1986
|
+
e.patchAddr = patchAddr;
|
|
1987
|
+
q->second.push_back(e);
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
void
|
|
1991
|
+
IceInternal::BasicStream::EncapsDecoder::unmarshal(Int index, const Ice::ObjectPtr& v)
|
|
1992
|
+
{
|
|
1993
|
+
//
|
|
1994
|
+
// Add the object to the map of un-marshalled objects, this must
|
|
1995
|
+
// be done before reading the objects (for circular references).
|
|
1996
|
+
//
|
|
1997
|
+
_unmarshaledMap.insert(make_pair(index, v));
|
|
1998
|
+
|
|
1999
|
+
//
|
|
2000
|
+
// Read the object.
|
|
2001
|
+
//
|
|
2002
|
+
v->__read(_stream);
|
|
2003
|
+
|
|
2004
|
+
//
|
|
2005
|
+
// Patch all instances now that the object is un-marshalled.
|
|
2006
|
+
//
|
|
2007
|
+
PatchMap::iterator patchPos = _patchMap.find(index);
|
|
2008
|
+
if(patchPos != _patchMap.end())
|
|
2009
|
+
{
|
|
2010
|
+
assert(patchPos->second.size() > 0);
|
|
2011
|
+
|
|
2012
|
+
//
|
|
2013
|
+
// Patch all pointers that refer to the instance.
|
|
2014
|
+
//
|
|
2015
|
+
for(PatchList::iterator k = patchPos->second.begin(); k != patchPos->second.end(); ++k)
|
|
2016
|
+
{
|
|
2017
|
+
(*k->patchFunc)(k->patchAddr, v);
|
|
2018
|
+
}
|
|
2019
|
+
|
|
2020
|
+
//
|
|
2021
|
+
// Clear out the patch map for that index -- there is nothing left
|
|
2022
|
+
// to patch for that index for the time being.
|
|
2023
|
+
//
|
|
2024
|
+
_patchMap.erase(patchPos);
|
|
2025
|
+
}
|
|
2026
|
+
|
|
2027
|
+
if(_objectList.empty() && _patchMap.empty())
|
|
2028
|
+
{
|
|
2029
|
+
try
|
|
2030
|
+
{
|
|
2031
|
+
if(_stream->instance()->collectObjects())
|
|
2032
|
+
{
|
|
2033
|
+
v->ice_collectable(true);
|
|
2034
|
+
}
|
|
2035
|
+
v->ice_postUnmarshal();
|
|
2036
|
+
}
|
|
2037
|
+
catch(const std::exception& ex)
|
|
2038
|
+
{
|
|
2039
|
+
Warning out(_stream->instance()->initializationData().logger);
|
|
2040
|
+
out << "std::exception raised by ice_postUnmarshal:\n" << ex;
|
|
2041
|
+
}
|
|
2042
|
+
catch(...)
|
|
2043
|
+
{
|
|
2044
|
+
Warning out(_stream->instance()->initializationData().logger);
|
|
2045
|
+
out << "unknown exception raised by ice_postUnmarshal";
|
|
2046
|
+
}
|
|
2047
|
+
}
|
|
2048
|
+
else
|
|
2049
|
+
{
|
|
2050
|
+
_objectList.push_back(v);
|
|
2051
|
+
|
|
2052
|
+
if(_patchMap.empty())
|
|
2053
|
+
{
|
|
2054
|
+
//
|
|
2055
|
+
// Iterate over the object list and invoke ice_postUnmarshal on
|
|
2056
|
+
// each object. We must do this after all objects have been
|
|
2057
|
+
// unmarshaled in order to ensure that any object data members
|
|
2058
|
+
// have been properly patched.
|
|
2059
|
+
//
|
|
2060
|
+
for(ObjectList::iterator p = _objectList.begin(); p != _objectList.end(); ++p)
|
|
2061
|
+
{
|
|
2062
|
+
try
|
|
2063
|
+
{
|
|
2064
|
+
if(_stream->instance()->collectObjects())
|
|
2065
|
+
{
|
|
2066
|
+
(*p)->ice_collectable(true);
|
|
2067
|
+
}
|
|
2068
|
+
(*p)->ice_postUnmarshal();
|
|
2069
|
+
}
|
|
2070
|
+
catch(const std::exception& ex)
|
|
2071
|
+
{
|
|
2072
|
+
Warning out(_stream->instance()->initializationData().logger);
|
|
2073
|
+
out << "std::exception raised by ice_postUnmarshal:\n" << ex;
|
|
2074
|
+
}
|
|
2075
|
+
catch(...)
|
|
2076
|
+
{
|
|
2077
|
+
Warning out(_stream->instance()->initializationData().logger);
|
|
2078
|
+
out << "unknown exception raised by ice_postUnmarshal";
|
|
2079
|
+
}
|
|
2080
|
+
}
|
|
2081
|
+
_objectList.clear();
|
|
2082
|
+
}
|
|
2083
|
+
}
|
|
2084
|
+
}
|
|
2085
|
+
|
|
2086
|
+
void
|
|
2087
|
+
IceInternal::BasicStream::EncapsDecoder10::read(PatchFunc patchFunc, void* patchAddr)
|
|
2088
|
+
{
|
|
2089
|
+
assert(patchFunc && patchAddr);
|
|
2090
|
+
|
|
2091
|
+
//
|
|
2092
|
+
// Object references are encoded as a negative integer in 1.0.
|
|
2093
|
+
//
|
|
2094
|
+
Int index;
|
|
2095
|
+
_stream->read(index);
|
|
2096
|
+
if(index > 0)
|
|
2097
|
+
{
|
|
2098
|
+
throw MarshalException(__FILE__, __LINE__, "invalid object id");
|
|
2099
|
+
}
|
|
2100
|
+
index = -index;
|
|
2101
|
+
|
|
2102
|
+
if(index == 0)
|
|
2103
|
+
{
|
|
2104
|
+
//
|
|
2105
|
+
// Calling the patch function for null instances is necessary for correct functioning of Ice for
|
|
2106
|
+
// Python and Ruby.
|
|
2107
|
+
//
|
|
2108
|
+
ObjectPtr nil;
|
|
2109
|
+
patchFunc(patchAddr, nil);
|
|
2110
|
+
}
|
|
2111
|
+
else
|
|
2112
|
+
{
|
|
2113
|
+
addPatchEntry(index, patchFunc, patchAddr);
|
|
2114
|
+
}
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
void
|
|
2118
|
+
IceInternal::BasicStream::EncapsDecoder10::throwException(const UserExceptionFactoryPtr& factory)
|
|
2119
|
+
{
|
|
2120
|
+
assert(_sliceType == NoSlice);
|
|
2121
|
+
|
|
2122
|
+
//
|
|
2123
|
+
// User exception with the 1.0 encoding start with a boolean flag
|
|
2124
|
+
// that indicates whether or not the exception has classes.
|
|
2125
|
+
//
|
|
2126
|
+
// This allows reading the pending objects even if some part of
|
|
2127
|
+
// the exception was sliced.
|
|
2128
|
+
//
|
|
2129
|
+
bool usesClasses;
|
|
2130
|
+
_stream->read(usesClasses);
|
|
2131
|
+
|
|
2132
|
+
_sliceType = ExceptionSlice;
|
|
2133
|
+
_skipFirstSlice = false;
|
|
2134
|
+
|
|
2135
|
+
//
|
|
2136
|
+
// Read the first slice header.
|
|
2137
|
+
//
|
|
2138
|
+
startSlice();
|
|
2139
|
+
const string mostDerivedId = _typeId;
|
|
2140
|
+
UserExceptionFactoryPtr exceptionFactory = factory;
|
|
2141
|
+
while(true)
|
|
2142
|
+
{
|
|
2143
|
+
//
|
|
2144
|
+
// Look for a statically-generated factory for this ID.
|
|
2145
|
+
//
|
|
2146
|
+
if(!exceptionFactory)
|
|
2147
|
+
{
|
|
2148
|
+
exceptionFactory = factoryTable->getExceptionFactory(_typeId);
|
|
2149
|
+
}
|
|
2150
|
+
|
|
2151
|
+
//
|
|
2152
|
+
// We found a factory, we get out of this loop.
|
|
2153
|
+
//
|
|
2154
|
+
if(exceptionFactory)
|
|
2155
|
+
{
|
|
2156
|
+
//
|
|
2157
|
+
// Got factory -- ask the factory to instantiate the
|
|
2158
|
+
// exception, initialize the exception members, and throw
|
|
2159
|
+
// the exception.
|
|
2160
|
+
//
|
|
2161
|
+
try
|
|
2162
|
+
{
|
|
2163
|
+
exceptionFactory->createAndThrow(_typeId);
|
|
2164
|
+
}
|
|
2165
|
+
catch(UserException& ex)
|
|
2166
|
+
{
|
|
2167
|
+
ex.__read(_stream);
|
|
2168
|
+
if(usesClasses)
|
|
2169
|
+
{
|
|
2170
|
+
readPendingObjects();
|
|
2171
|
+
}
|
|
2172
|
+
throw;
|
|
2173
|
+
|
|
2174
|
+
// Never reached.
|
|
2175
|
+
}
|
|
2176
|
+
}
|
|
2177
|
+
|
|
2178
|
+
//
|
|
2179
|
+
// Slice off what we don't understand.
|
|
2180
|
+
//
|
|
2181
|
+
skipSlice();
|
|
2182
|
+
try
|
|
2183
|
+
{
|
|
2184
|
+
startSlice();
|
|
2185
|
+
}
|
|
2186
|
+
catch(UnmarshalOutOfBoundsException& ex)
|
|
2187
|
+
{
|
|
2188
|
+
//
|
|
2189
|
+
// An oversight in the 1.0 encoding means there is no marker to indicate
|
|
2190
|
+
// the last slice of an exception. As a result, we just try to read the
|
|
2191
|
+
// next type ID, which raises UnmarshalOutOfBoundsException when the
|
|
2192
|
+
// input buffer underflows.
|
|
2193
|
+
//
|
|
2194
|
+
// Set the reason member to a more helpful message.
|
|
2195
|
+
//
|
|
2196
|
+
ex.reason = "unknown exception type `" + mostDerivedId + "'";
|
|
2197
|
+
throw;
|
|
2198
|
+
}
|
|
2199
|
+
}
|
|
2200
|
+
}
|
|
2201
|
+
|
|
2202
|
+
void
|
|
2203
|
+
#ifndef NDEBUG
|
|
2204
|
+
IceInternal::BasicStream::EncapsDecoder10::startInstance(SliceType sliceType)
|
|
2205
|
+
#else
|
|
2206
|
+
IceInternal::BasicStream::EncapsDecoder10::startInstance(SliceType)
|
|
2207
|
+
#endif
|
|
2208
|
+
{
|
|
2209
|
+
assert(_sliceType == sliceType);
|
|
2210
|
+
_skipFirstSlice = true;
|
|
2211
|
+
}
|
|
2212
|
+
|
|
2213
|
+
SlicedDataPtr
|
|
2214
|
+
IceInternal::BasicStream::EncapsDecoder10::endInstance(bool)
|
|
2215
|
+
{
|
|
2216
|
+
//
|
|
2217
|
+
// Read the Ice::Object slice.
|
|
2218
|
+
//
|
|
2219
|
+
if(_sliceType == ObjectSlice)
|
|
2220
|
+
{
|
|
2221
|
+
startSlice();
|
|
2222
|
+
Int sz = _stream->readSize(); // For compatibility with the old AFM.
|
|
2223
|
+
if(sz != 0)
|
|
2224
|
+
{
|
|
2225
|
+
throw MarshalException(__FILE__, __LINE__, "invalid Object slice");
|
|
2226
|
+
}
|
|
2227
|
+
endSlice();
|
|
2228
|
+
}
|
|
2229
|
+
_sliceType = NoSlice;
|
|
2230
|
+
return 0;
|
|
2231
|
+
}
|
|
2232
|
+
|
|
2233
|
+
const std::string&
|
|
2234
|
+
IceInternal::BasicStream::EncapsDecoder10::startSlice()
|
|
2235
|
+
{
|
|
2236
|
+
//
|
|
2237
|
+
// If first slice, don't read the header, it was already read in
|
|
2238
|
+
// readInstance or throwException to find the factory.
|
|
2239
|
+
//
|
|
2240
|
+
if(_skipFirstSlice)
|
|
2241
|
+
{
|
|
2242
|
+
_skipFirstSlice = false;
|
|
2243
|
+
return _typeId;
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2246
|
+
//
|
|
2247
|
+
// For objects, first read the type ID boolean which indicates
|
|
2248
|
+
// whether or not the type ID is encoded as a string or as an
|
|
2249
|
+
// index. For exceptions, the type ID is always encoded as a
|
|
2250
|
+
// string.
|
|
2251
|
+
//
|
|
2252
|
+
if(_sliceType == ObjectSlice)
|
|
2253
|
+
{
|
|
2254
|
+
bool isIndex;
|
|
2255
|
+
_stream->read(isIndex);
|
|
2256
|
+
_typeId = readTypeId(isIndex);
|
|
2257
|
+
}
|
|
2258
|
+
else
|
|
2259
|
+
{
|
|
2260
|
+
_stream->read(_typeId, false);
|
|
2261
|
+
}
|
|
2262
|
+
|
|
2263
|
+
_stream->read(_sliceSize);
|
|
2264
|
+
if(_sliceSize < 4)
|
|
2265
|
+
{
|
|
2266
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
2267
|
+
}
|
|
2268
|
+
return _typeId;
|
|
2269
|
+
}
|
|
2270
|
+
|
|
2271
|
+
void
|
|
2272
|
+
IceInternal::BasicStream::EncapsDecoder10::endSlice()
|
|
2273
|
+
{
|
|
2274
|
+
}
|
|
2275
|
+
|
|
2276
|
+
void
|
|
2277
|
+
IceInternal::BasicStream::EncapsDecoder10::skipSlice()
|
|
2278
|
+
{
|
|
2279
|
+
if(_stream->instance()->traceLevels()->slicing > 0)
|
|
2280
|
+
{
|
|
2281
|
+
const Ice::LoggerPtr& logger = _stream->instance()->initializationData().logger;
|
|
2282
|
+
if(_sliceType == ExceptionSlice)
|
|
2283
|
+
{
|
|
2284
|
+
traceSlicing("exception", _typeId, _stream->instance()->traceLevels()->slicingCat, logger);
|
|
2285
|
+
}
|
|
2286
|
+
else
|
|
2287
|
+
{
|
|
2288
|
+
traceSlicing("object", _typeId, _stream->instance()->traceLevels()->slicingCat, logger);
|
|
2289
|
+
}
|
|
2290
|
+
}
|
|
2291
|
+
assert(_sliceSize >= 4);
|
|
2292
|
+
_stream->skip(_sliceSize - sizeof(Int));
|
|
2293
|
+
}
|
|
2294
|
+
|
|
2295
|
+
void
|
|
2296
|
+
IceInternal::BasicStream::EncapsDecoder10::readPendingObjects()
|
|
2297
|
+
{
|
|
2298
|
+
Int num;
|
|
2299
|
+
do
|
|
2300
|
+
{
|
|
2301
|
+
num = _stream->readSize();
|
|
2302
|
+
for(Int k = num; k > 0; --k)
|
|
2303
|
+
{
|
|
2304
|
+
readInstance();
|
|
2305
|
+
}
|
|
2306
|
+
}
|
|
2307
|
+
while(num);
|
|
2308
|
+
|
|
2309
|
+
if(!_patchMap.empty())
|
|
2310
|
+
{
|
|
2311
|
+
//
|
|
2312
|
+
// If any entries remain in the patch map, the sender has sent an index for an object, but failed
|
|
2313
|
+
// to supply the object.
|
|
2314
|
+
//
|
|
2315
|
+
throw MarshalException(__FILE__, __LINE__, "index for class received, but no instance");
|
|
2316
|
+
}
|
|
2317
|
+
}
|
|
2318
|
+
|
|
2319
|
+
void
|
|
2320
|
+
IceInternal::BasicStream::EncapsDecoder10::readInstance()
|
|
2321
|
+
{
|
|
2322
|
+
Int index;
|
|
2323
|
+
_stream->read(index);
|
|
2324
|
+
|
|
2325
|
+
if(index <= 0)
|
|
2326
|
+
{
|
|
2327
|
+
throw MarshalException(__FILE__, __LINE__, "invalid object id");
|
|
2328
|
+
}
|
|
2329
|
+
|
|
2330
|
+
_sliceType = ObjectSlice;
|
|
2331
|
+
_skipFirstSlice = false;
|
|
2332
|
+
|
|
2333
|
+
//
|
|
2334
|
+
// Read the first slice header.
|
|
2335
|
+
//
|
|
2336
|
+
startSlice();
|
|
2337
|
+
const string mostDerivedId = _typeId;
|
|
2338
|
+
ObjectPtr v;
|
|
2339
|
+
while(true)
|
|
2340
|
+
{
|
|
2341
|
+
//
|
|
2342
|
+
// For the 1.0 encoding, the type ID for the base Object class
|
|
2343
|
+
// marks the last slice.
|
|
2344
|
+
//
|
|
2345
|
+
if(_typeId == Object::ice_staticId())
|
|
2346
|
+
{
|
|
2347
|
+
throw NoObjectFactoryException(__FILE__, __LINE__, "", mostDerivedId);
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
v = newInstance(_typeId);
|
|
2351
|
+
|
|
2352
|
+
//
|
|
2353
|
+
// We found a factory, we get out of this loop.
|
|
2354
|
+
//
|
|
2355
|
+
if(v)
|
|
2356
|
+
{
|
|
2357
|
+
break;
|
|
2358
|
+
}
|
|
2359
|
+
|
|
2360
|
+
//
|
|
2361
|
+
// If object slicing is disabled, stop un-marshalling.
|
|
2362
|
+
//
|
|
2363
|
+
if(!_sliceObjects)
|
|
2364
|
+
{
|
|
2365
|
+
throw NoObjectFactoryException(__FILE__, __LINE__, "no object factory found and object slicing is disabled",
|
|
2366
|
+
_typeId);
|
|
2367
|
+
}
|
|
2368
|
+
|
|
2369
|
+
//
|
|
2370
|
+
// Slice off what we don't understand.
|
|
2371
|
+
//
|
|
2372
|
+
skipSlice();
|
|
2373
|
+
startSlice(); // Read next Slice header for next iteration.
|
|
2374
|
+
}
|
|
2375
|
+
|
|
2376
|
+
//
|
|
2377
|
+
// Un-marshal the object and add-it to the map of un-marshaled objects.
|
|
2378
|
+
//
|
|
2379
|
+
unmarshal(index, v);
|
|
2380
|
+
}
|
|
2381
|
+
|
|
2382
|
+
void
|
|
2383
|
+
IceInternal::BasicStream::EncapsDecoder11::read(PatchFunc patchFunc, void* patchAddr)
|
|
2384
|
+
{
|
|
2385
|
+
Int index = _stream->readSize();
|
|
2386
|
+
if(index < 0)
|
|
2387
|
+
{
|
|
2388
|
+
throw MarshalException(__FILE__, __LINE__, "invalid object id");
|
|
2389
|
+
}
|
|
2390
|
+
else if(index == 0)
|
|
2391
|
+
{
|
|
2392
|
+
//
|
|
2393
|
+
// Calling the patch function for null instances is necessary for correct functioning of Ice for
|
|
2394
|
+
// Python and Ruby.
|
|
2395
|
+
//
|
|
2396
|
+
if(patchFunc)
|
|
2397
|
+
{
|
|
2398
|
+
ObjectPtr nil;
|
|
2399
|
+
patchFunc(patchAddr, nil);
|
|
2400
|
+
}
|
|
2401
|
+
}
|
|
2402
|
+
else if(_current && _current->sliceFlags & FLAG_HAS_INDIRECTION_TABLE)
|
|
2403
|
+
{
|
|
2404
|
+
//
|
|
2405
|
+
// When reading an object within a slice and there's an
|
|
2406
|
+
// indirect object table, always read an indirect reference
|
|
2407
|
+
// that points to an object from the indirect object table
|
|
2408
|
+
// marshaled at the end of the Slice.
|
|
2409
|
+
//
|
|
2410
|
+
// Maintain a list of indirect references. Note that the
|
|
2411
|
+
// indirect index starts at 1, so we decrement it by one to
|
|
2412
|
+
// derive an index into the indirection table that we'll read
|
|
2413
|
+
// at the end of the slice.
|
|
2414
|
+
//
|
|
2415
|
+
if(patchFunc)
|
|
2416
|
+
{
|
|
2417
|
+
IndirectPatchEntry e;
|
|
2418
|
+
e.index = index - 1;
|
|
2419
|
+
e.patchFunc = patchFunc;
|
|
2420
|
+
e.patchAddr = patchAddr;
|
|
2421
|
+
_current->indirectPatchList.push_back(e);
|
|
2422
|
+
}
|
|
2423
|
+
}
|
|
2424
|
+
else
|
|
2425
|
+
{
|
|
2426
|
+
readInstance(index, patchFunc, patchAddr);
|
|
2427
|
+
}
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2430
|
+
void
|
|
2431
|
+
IceInternal::BasicStream::EncapsDecoder11::throwException(const UserExceptionFactoryPtr& factory)
|
|
2432
|
+
{
|
|
2433
|
+
assert(!_current);
|
|
2434
|
+
|
|
2435
|
+
push(ExceptionSlice);
|
|
2436
|
+
|
|
2437
|
+
//
|
|
2438
|
+
// Read the first slice header.
|
|
2439
|
+
//
|
|
2440
|
+
startSlice();
|
|
2441
|
+
const string mostDerivedId = _current->typeId;
|
|
2442
|
+
UserExceptionFactoryPtr exceptionFactory = factory;
|
|
2443
|
+
while(true)
|
|
2444
|
+
{
|
|
2445
|
+
//
|
|
2446
|
+
// Look for a statically-generated factory for this ID.
|
|
2447
|
+
//
|
|
2448
|
+
if(!exceptionFactory)
|
|
2449
|
+
{
|
|
2450
|
+
exceptionFactory = factoryTable->getExceptionFactory(_current->typeId);
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2453
|
+
//
|
|
2454
|
+
// We found a factory, we get out of this loop.
|
|
2455
|
+
//
|
|
2456
|
+
if(exceptionFactory)
|
|
2457
|
+
{
|
|
2458
|
+
//
|
|
2459
|
+
// Got factory -- ask the factory to instantiate the
|
|
2460
|
+
// exception, initialize the exception members, and throw
|
|
2461
|
+
// the exception.
|
|
2462
|
+
//
|
|
2463
|
+
try
|
|
2464
|
+
{
|
|
2465
|
+
exceptionFactory->createAndThrow(_current->typeId);
|
|
2466
|
+
}
|
|
2467
|
+
catch(UserException& ex)
|
|
2468
|
+
{
|
|
2469
|
+
ex.__read(_stream);
|
|
2470
|
+
throw;
|
|
2471
|
+
|
|
2472
|
+
// Never reached.
|
|
2473
|
+
}
|
|
2474
|
+
}
|
|
2475
|
+
|
|
2476
|
+
//
|
|
2477
|
+
// Slice off what we don't understand.
|
|
2478
|
+
//
|
|
2479
|
+
skipSlice();
|
|
2480
|
+
|
|
2481
|
+
//
|
|
2482
|
+
// If this is the last slice, raise an exception and stop un-marshalling.
|
|
2483
|
+
//
|
|
2484
|
+
if(_current->sliceFlags & FLAG_IS_LAST_SLICE)
|
|
2485
|
+
{
|
|
2486
|
+
if(mostDerivedId.length() > 2 && mostDerivedId[0] == ':' && mostDerivedId[1] == ':')
|
|
2487
|
+
{
|
|
2488
|
+
throw UnknownUserException(__FILE__, __LINE__, mostDerivedId.substr(2));
|
|
2489
|
+
}
|
|
2490
|
+
else
|
|
2491
|
+
{
|
|
2492
|
+
throw UnknownUserException(__FILE__, __LINE__, mostDerivedId);
|
|
2493
|
+
}
|
|
2494
|
+
}
|
|
2495
|
+
|
|
2496
|
+
startSlice();
|
|
2497
|
+
}
|
|
2498
|
+
}
|
|
2499
|
+
|
|
2500
|
+
void
|
|
2501
|
+
#ifndef NDEBUG
|
|
2502
|
+
IceInternal::BasicStream::EncapsDecoder11::startInstance(SliceType sliceType)
|
|
2503
|
+
#else
|
|
2504
|
+
IceInternal::BasicStream::EncapsDecoder11::startInstance(SliceType)
|
|
2505
|
+
#endif
|
|
2506
|
+
{
|
|
2507
|
+
assert(_current->sliceType == sliceType);
|
|
2508
|
+
_current->skipFirstSlice = true;
|
|
2509
|
+
}
|
|
2510
|
+
|
|
2511
|
+
SlicedDataPtr
|
|
2512
|
+
IceInternal::BasicStream::EncapsDecoder11::endInstance(bool preserve)
|
|
2513
|
+
{
|
|
2514
|
+
SlicedDataPtr slicedData;
|
|
2515
|
+
if(preserve)
|
|
2516
|
+
{
|
|
2517
|
+
slicedData = readSlicedData();
|
|
2518
|
+
}
|
|
2519
|
+
_current->slices.clear();
|
|
2520
|
+
_current->indirectionTables.clear();
|
|
2521
|
+
_current = _current->previous;
|
|
2522
|
+
return slicedData;
|
|
2523
|
+
}
|
|
2524
|
+
|
|
2525
|
+
const std::string&
|
|
2526
|
+
IceInternal::BasicStream::EncapsDecoder11::startSlice()
|
|
2527
|
+
{
|
|
2528
|
+
//
|
|
2529
|
+
// If first slice, don't read the header, it was already read in
|
|
2530
|
+
// readInstance or throwException to find the factory.
|
|
2531
|
+
//
|
|
2532
|
+
if(_current->skipFirstSlice)
|
|
2533
|
+
{
|
|
2534
|
+
_current->skipFirstSlice = false;
|
|
2535
|
+
return _current->typeId;
|
|
2536
|
+
}
|
|
2537
|
+
|
|
2538
|
+
_stream->read(_current->sliceFlags);
|
|
2539
|
+
|
|
2540
|
+
//
|
|
2541
|
+
// Read the type ID, for object slices the type ID is encoded as a
|
|
2542
|
+
// string or as an index, for exceptions it's always encoded as a
|
|
2543
|
+
// string.
|
|
2544
|
+
//
|
|
2545
|
+
if(_current->sliceType == ObjectSlice)
|
|
2546
|
+
{
|
|
2547
|
+
if((_current->sliceFlags & FLAG_HAS_TYPE_ID_COMPACT) == FLAG_HAS_TYPE_ID_COMPACT) // Must be checked first!
|
|
2548
|
+
{
|
|
2549
|
+
_current->typeId.clear();
|
|
2550
|
+
_current->compactId = _stream->readSize();
|
|
2551
|
+
}
|
|
2552
|
+
else if(_current->sliceFlags & (FLAG_HAS_TYPE_ID_STRING | FLAG_HAS_TYPE_ID_INDEX))
|
|
2553
|
+
{
|
|
2554
|
+
_current->typeId = readTypeId(_current->sliceFlags & FLAG_HAS_TYPE_ID_INDEX);
|
|
2555
|
+
_current->compactId = -1;
|
|
2556
|
+
}
|
|
2557
|
+
else
|
|
2558
|
+
{
|
|
2559
|
+
// Only the most derived slice encodes the type ID for the compact format.
|
|
2560
|
+
_current->typeId.clear();
|
|
2561
|
+
_current->compactId = -1;
|
|
2562
|
+
}
|
|
2563
|
+
}
|
|
2564
|
+
else
|
|
2565
|
+
{
|
|
2566
|
+
_stream->read(_current->typeId, false);
|
|
2567
|
+
}
|
|
2568
|
+
|
|
2569
|
+
//
|
|
2570
|
+
// Read the slice size if necessary.
|
|
2571
|
+
//
|
|
2572
|
+
if(_current->sliceFlags & FLAG_HAS_SLICE_SIZE)
|
|
2573
|
+
{
|
|
2574
|
+
_stream->read(_current->sliceSize);
|
|
2575
|
+
if(_current->sliceSize < 4)
|
|
2576
|
+
{
|
|
2577
|
+
throw UnmarshalOutOfBoundsException(__FILE__, __LINE__);
|
|
2578
|
+
}
|
|
2579
|
+
}
|
|
2580
|
+
else
|
|
2581
|
+
{
|
|
2582
|
+
_current->sliceSize = 0;
|
|
2583
|
+
}
|
|
2584
|
+
|
|
2585
|
+
return _current->typeId;
|
|
2586
|
+
}
|
|
2587
|
+
|
|
2588
|
+
void
|
|
2589
|
+
IceInternal::BasicStream::EncapsDecoder11::endSlice()
|
|
2590
|
+
{
|
|
2591
|
+
if(_current->sliceFlags & FLAG_HAS_OPTIONAL_MEMBERS)
|
|
2592
|
+
{
|
|
2593
|
+
_stream->skipOpts();
|
|
2594
|
+
}
|
|
2595
|
+
|
|
2596
|
+
//
|
|
2597
|
+
// Read the indirect object table if one is present.
|
|
2598
|
+
//
|
|
2599
|
+
if(_current->sliceFlags & FLAG_HAS_INDIRECTION_TABLE)
|
|
2600
|
+
{
|
|
2601
|
+
IndexList indirectionTable(_stream->readAndCheckSeqSize(1));
|
|
2602
|
+
for(IndexList::iterator p = indirectionTable.begin(); p != indirectionTable.end(); ++p)
|
|
2603
|
+
{
|
|
2604
|
+
*p = readInstance(_stream->readSize(), 0, 0);
|
|
2605
|
+
}
|
|
2606
|
+
|
|
2607
|
+
//
|
|
2608
|
+
// Sanity checks. If there are optional members, it's possible
|
|
2609
|
+
// that not all object references were read if they are from
|
|
2610
|
+
// unknown optional data members.
|
|
2611
|
+
//
|
|
2612
|
+
if(indirectionTable.empty())
|
|
2613
|
+
{
|
|
2614
|
+
throw MarshalException(__FILE__, __LINE__, "empty indirection table");
|
|
2615
|
+
}
|
|
2616
|
+
if(_current->indirectPatchList.empty() && !(_current->sliceFlags & FLAG_HAS_OPTIONAL_MEMBERS))
|
|
2617
|
+
{
|
|
2618
|
+
throw MarshalException(__FILE__, __LINE__, "no references to indirection table");
|
|
2619
|
+
}
|
|
2620
|
+
|
|
2621
|
+
//
|
|
2622
|
+
// Convert indirect references into direct references.
|
|
2623
|
+
//
|
|
2624
|
+
IndirectPatchList::iterator p;
|
|
2625
|
+
for(p = _current->indirectPatchList.begin(); p != _current->indirectPatchList.end(); ++p)
|
|
2626
|
+
{
|
|
2627
|
+
assert(p->index >= 0);
|
|
2628
|
+
if(p->index >= static_cast<Int>(indirectionTable.size()))
|
|
2629
|
+
{
|
|
2630
|
+
throw MarshalException(__FILE__, __LINE__, "indirection out of range");
|
|
2631
|
+
}
|
|
2632
|
+
addPatchEntry(indirectionTable[p->index], p->patchFunc, p->patchAddr);
|
|
2633
|
+
}
|
|
2634
|
+
_current->indirectPatchList.clear();
|
|
2635
|
+
}
|
|
2636
|
+
}
|
|
2637
|
+
|
|
2638
|
+
void
|
|
2639
|
+
IceInternal::BasicStream::EncapsDecoder11::skipSlice()
|
|
2640
|
+
{
|
|
2641
|
+
if(_stream->instance()->traceLevels()->slicing > 0)
|
|
2642
|
+
{
|
|
2643
|
+
const Ice::LoggerPtr& logger = _stream->instance()->initializationData().logger;
|
|
2644
|
+
if(_current->sliceType == ExceptionSlice)
|
|
2645
|
+
{
|
|
2646
|
+
traceSlicing("exception", _current->typeId, _stream->instance()->traceLevels()->slicingCat, logger);
|
|
2647
|
+
}
|
|
2648
|
+
else
|
|
2649
|
+
{
|
|
2650
|
+
traceSlicing("object", _current->typeId, _stream->instance()->traceLevels()->slicingCat, logger);
|
|
2651
|
+
}
|
|
2652
|
+
}
|
|
2653
|
+
|
|
2654
|
+
Container::iterator start = _stream->i;
|
|
2655
|
+
|
|
2656
|
+
if(_current->sliceFlags & FLAG_HAS_SLICE_SIZE)
|
|
2657
|
+
{
|
|
2658
|
+
assert(_current->sliceSize >= 4);
|
|
2659
|
+
_stream->skip(_current->sliceSize - sizeof(Int));
|
|
2660
|
+
}
|
|
2661
|
+
else
|
|
2662
|
+
{
|
|
2663
|
+
if(_current->sliceType == ObjectSlice)
|
|
2664
|
+
{
|
|
2665
|
+
throw NoObjectFactoryException(__FILE__, __LINE__,
|
|
2666
|
+
"no object factory found and compact format prevents "
|
|
2667
|
+
"slicing (the sender should use the sliced format instead)",
|
|
2668
|
+
_current->typeId);
|
|
2669
|
+
}
|
|
2670
|
+
else
|
|
2671
|
+
{
|
|
2672
|
+
if(_current->typeId.length() > 2 && _current->typeId[0] == ':' && _current->typeId[1] == ':')
|
|
2673
|
+
{
|
|
2674
|
+
throw UnknownUserException(__FILE__, __LINE__, _current->typeId.substr(2));
|
|
2675
|
+
}
|
|
2676
|
+
else
|
|
2677
|
+
{
|
|
2678
|
+
throw UnknownUserException(__FILE__, __LINE__, _current->typeId);
|
|
2679
|
+
}
|
|
2680
|
+
}
|
|
2681
|
+
}
|
|
2682
|
+
|
|
2683
|
+
//
|
|
2684
|
+
// Preserve this slice.
|
|
2685
|
+
//
|
|
2686
|
+
SliceInfoPtr info = new SliceInfo;
|
|
2687
|
+
info->typeId = _current->typeId;
|
|
2688
|
+
info->compactId = _current->compactId;
|
|
2689
|
+
info->hasOptionalMembers = _current->sliceFlags & FLAG_HAS_OPTIONAL_MEMBERS;
|
|
2690
|
+
info->isLastSlice = _current->sliceFlags & FLAG_IS_LAST_SLICE;
|
|
2691
|
+
if(info->hasOptionalMembers)
|
|
2692
|
+
{
|
|
2693
|
+
//
|
|
2694
|
+
// Don't include the optional member end marker. It will be re-written by
|
|
2695
|
+
// endSlice when the sliced data is re-written.
|
|
2696
|
+
//
|
|
2697
|
+
vector<Byte>(start, _stream->i - 1).swap(info->bytes);
|
|
2698
|
+
}
|
|
2699
|
+
else
|
|
2700
|
+
{
|
|
2701
|
+
vector<Byte>(start, _stream->i).swap(info->bytes);
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2704
|
+
_current->indirectionTables.push_back(IndexList());
|
|
2705
|
+
|
|
2706
|
+
//
|
|
2707
|
+
// Read the indirect object table. We read the instances or their
|
|
2708
|
+
// IDs if the instance is a reference to an already un-marhsaled
|
|
2709
|
+
// object.
|
|
2710
|
+
//
|
|
2711
|
+
// The SliceInfo object sequence is initialized only if
|
|
2712
|
+
// readSlicedData is called.
|
|
2713
|
+
//
|
|
2714
|
+
if(_current->sliceFlags & FLAG_HAS_INDIRECTION_TABLE)
|
|
2715
|
+
{
|
|
2716
|
+
IndexList& table = _current->indirectionTables.back();
|
|
2717
|
+
table.resize(_stream->readAndCheckSeqSize(1));
|
|
2718
|
+
for(IndexList::iterator p = table.begin(); p != table.end(); ++p)
|
|
2719
|
+
{
|
|
2720
|
+
*p = readInstance(_stream->readSize(), 0, 0);
|
|
2721
|
+
}
|
|
2722
|
+
}
|
|
2723
|
+
|
|
2724
|
+
_current->slices.push_back(info);
|
|
2725
|
+
}
|
|
2726
|
+
|
|
2727
|
+
bool
|
|
2728
|
+
IceInternal::BasicStream::EncapsDecoder11::readOpt(Ice::Int readTag, Ice::OptionalFormat expectedFormat)
|
|
2729
|
+
{
|
|
2730
|
+
if(!_current)
|
|
2731
|
+
{
|
|
2732
|
+
return _stream->readOptImpl(readTag, expectedFormat);
|
|
2733
|
+
}
|
|
2734
|
+
else if(_current->sliceFlags & FLAG_HAS_OPTIONAL_MEMBERS)
|
|
2735
|
+
{
|
|
2736
|
+
return _stream->readOptImpl(readTag, expectedFormat);
|
|
2737
|
+
}
|
|
2738
|
+
return false;
|
|
2739
|
+
}
|
|
2740
|
+
|
|
2741
|
+
Int
|
|
2742
|
+
IceInternal::BasicStream::EncapsDecoder11::readInstance(Int index, PatchFunc patchFunc, void* patchAddr)
|
|
2743
|
+
{
|
|
2744
|
+
assert(index > 0);
|
|
2745
|
+
|
|
2746
|
+
if(index > 1)
|
|
2747
|
+
{
|
|
2748
|
+
if(patchFunc)
|
|
2749
|
+
{
|
|
2750
|
+
addPatchEntry(index, patchFunc, patchAddr);
|
|
2751
|
+
}
|
|
2752
|
+
return index;
|
|
2753
|
+
}
|
|
2754
|
+
|
|
2755
|
+
push(ObjectSlice);
|
|
2756
|
+
|
|
2757
|
+
//
|
|
2758
|
+
// Get the object ID before we start reading slices. If some
|
|
2759
|
+
// slices are skiped, the indirect object table are still read and
|
|
2760
|
+
// might read other objects.
|
|
2761
|
+
//
|
|
2762
|
+
index = ++_objectIdIndex;
|
|
2763
|
+
|
|
2764
|
+
//
|
|
2765
|
+
// Read the first slice header.
|
|
2766
|
+
//
|
|
2767
|
+
startSlice();
|
|
2768
|
+
const string mostDerivedId = _current->typeId;
|
|
2769
|
+
Ice::ObjectPtr v;
|
|
2770
|
+
const CompactIdResolverPtr& compactIdResolver = _stream->instance()->initializationData().compactIdResolver;
|
|
2771
|
+
while(true)
|
|
2772
|
+
{
|
|
2773
|
+
if(_current->compactId >= 0)
|
|
2774
|
+
{
|
|
2775
|
+
//
|
|
2776
|
+
// Translate a compact (numeric) type ID into a string type ID.
|
|
2777
|
+
//
|
|
2778
|
+
_current->typeId.clear();
|
|
2779
|
+
if(compactIdResolver)
|
|
2780
|
+
{
|
|
2781
|
+
try
|
|
2782
|
+
{
|
|
2783
|
+
_current->typeId = compactIdResolver->resolve(_current->compactId);
|
|
2784
|
+
}
|
|
2785
|
+
catch(const LocalException&)
|
|
2786
|
+
{
|
|
2787
|
+
throw;
|
|
2788
|
+
}
|
|
2789
|
+
catch(const std::exception& ex)
|
|
2790
|
+
{
|
|
2791
|
+
ostringstream ostr;
|
|
2792
|
+
ostr << "exception in CompactIdResolver for ID " << _current->compactId;
|
|
2793
|
+
string msg = ostr.str();
|
|
2794
|
+
string what = ex.what();
|
|
2795
|
+
if(!what.empty())
|
|
2796
|
+
{
|
|
2797
|
+
msg += ":\n" + what;
|
|
2798
|
+
}
|
|
2799
|
+
throw MarshalException(__FILE__, __LINE__, msg);
|
|
2800
|
+
}
|
|
2801
|
+
catch(...)
|
|
2802
|
+
{
|
|
2803
|
+
ostringstream ostr;
|
|
2804
|
+
ostr << "unknown exception in CompactIdResolver for ID " << _current->compactId;
|
|
2805
|
+
throw MarshalException(__FILE__, __LINE__, ostr.str());
|
|
2806
|
+
}
|
|
2807
|
+
}
|
|
2808
|
+
if(_current->typeId.empty())
|
|
2809
|
+
{
|
|
2810
|
+
_current->typeId = IceInternal::factoryTable->getTypeId(_current->compactId);
|
|
2811
|
+
}
|
|
2812
|
+
}
|
|
2813
|
+
|
|
2814
|
+
if(!_current->typeId.empty())
|
|
2815
|
+
{
|
|
2816
|
+
v = newInstance(_current->typeId);
|
|
2817
|
+
|
|
2818
|
+
//
|
|
2819
|
+
// We found a factory, we get out of this loop.
|
|
2820
|
+
//
|
|
2821
|
+
if(v)
|
|
2822
|
+
{
|
|
2823
|
+
break;
|
|
2824
|
+
}
|
|
2825
|
+
}
|
|
2826
|
+
|
|
2827
|
+
//
|
|
2828
|
+
// If object slicing is disabled, stop un-marshalling.
|
|
2829
|
+
//
|
|
2830
|
+
if(!_sliceObjects)
|
|
2831
|
+
{
|
|
2832
|
+
throw NoObjectFactoryException(__FILE__, __LINE__, "no object factory found and object slicing is disabled",
|
|
2833
|
+
_current->typeId);
|
|
2834
|
+
}
|
|
2835
|
+
|
|
2836
|
+
//
|
|
2837
|
+
// Slice off what we don't understand.
|
|
2838
|
+
//
|
|
2839
|
+
skipSlice();
|
|
2840
|
+
|
|
2841
|
+
//
|
|
2842
|
+
// If this is the last slice, keep the object as an opaque UnknownSlicedObject.
|
|
2843
|
+
//
|
|
2844
|
+
if(_current->sliceFlags & FLAG_IS_LAST_SLICE)
|
|
2845
|
+
{
|
|
2846
|
+
//
|
|
2847
|
+
// Provide a factory with an opportunity to supply the object.
|
|
2848
|
+
// We pass the "::Ice::Object" ID to indicate that this is the
|
|
2849
|
+
// last chance to preserve the object.
|
|
2850
|
+
//
|
|
2851
|
+
v = newInstance(Object::ice_staticId());
|
|
2852
|
+
if(!v)
|
|
2853
|
+
{
|
|
2854
|
+
v = new UnknownSlicedObject(mostDerivedId);
|
|
2855
|
+
}
|
|
2856
|
+
|
|
2857
|
+
break;
|
|
2858
|
+
}
|
|
2859
|
+
|
|
2860
|
+
startSlice(); // Read next Slice header for next iteration.
|
|
2861
|
+
}
|
|
2862
|
+
|
|
2863
|
+
//
|
|
2864
|
+
// Un-marshal the object
|
|
2865
|
+
//
|
|
2866
|
+
unmarshal(index, v);
|
|
2867
|
+
|
|
2868
|
+
if(!_current && !_patchMap.empty())
|
|
2869
|
+
{
|
|
2870
|
+
//
|
|
2871
|
+
// If any entries remain in the patch map, the sender has sent an index for an object, but failed
|
|
2872
|
+
// to supply the object.
|
|
2873
|
+
//
|
|
2874
|
+
throw MarshalException(__FILE__, __LINE__, "index for class received, but no instance");
|
|
2875
|
+
}
|
|
2876
|
+
|
|
2877
|
+
if(patchFunc)
|
|
2878
|
+
{
|
|
2879
|
+
patchFunc(patchAddr, v);
|
|
2880
|
+
}
|
|
2881
|
+
return index;
|
|
2882
|
+
}
|
|
2883
|
+
|
|
2884
|
+
SlicedDataPtr
|
|
2885
|
+
IceInternal::BasicStream::EncapsDecoder11::readSlicedData()
|
|
2886
|
+
{
|
|
2887
|
+
if(_current->slices.empty()) // No preserved slices.
|
|
2888
|
+
{
|
|
2889
|
+
return 0;
|
|
2890
|
+
}
|
|
2891
|
+
|
|
2892
|
+
//
|
|
2893
|
+
// The indirectionTables member holds the indirection table for
|
|
2894
|
+
// each slice in slices.
|
|
2895
|
+
//
|
|
2896
|
+
assert(_current->slices.size() == _current->indirectionTables.size());
|
|
2897
|
+
for(SliceInfoSeq::size_type n = 0; n < _current->slices.size(); ++n)
|
|
2898
|
+
{
|
|
2899
|
+
//
|
|
2900
|
+
// We use the "objects" list in SliceInfo to hold references
|
|
2901
|
+
// to the target objects. Note that the objects might not have
|
|
2902
|
+
// been read yet in the case of a circular reference to an
|
|
2903
|
+
// enclosing object.
|
|
2904
|
+
//
|
|
2905
|
+
const IndexList& table = _current->indirectionTables[n];
|
|
2906
|
+
vector<ObjectPtr>& objects = _current->slices[n]->objects;
|
|
2907
|
+
objects.resize(table.size());
|
|
2908
|
+
IndexList::size_type j = 0;
|
|
2909
|
+
for(IndexList::const_iterator p = table.begin(); p != table.end(); ++p)
|
|
2910
|
+
{
|
|
2911
|
+
addPatchEntry(*p, &patchHandle<Object>, &objects[j++]);
|
|
2912
|
+
}
|
|
2913
|
+
}
|
|
2914
|
+
return new SlicedData(_current->slices);
|
|
2915
|
+
}
|
|
2916
|
+
|
|
2917
|
+
Int
|
|
2918
|
+
IceInternal::BasicStream::EncapsEncoder::registerTypeId(const string& typeId)
|
|
2919
|
+
{
|
|
2920
|
+
TypeIdWriteMap::const_iterator p = _typeIdMap.find(typeId);
|
|
2921
|
+
if(p != _typeIdMap.end())
|
|
2922
|
+
{
|
|
2923
|
+
return p->second;
|
|
2924
|
+
}
|
|
2925
|
+
else
|
|
2926
|
+
{
|
|
2927
|
+
_typeIdMap.insert(make_pair(typeId, ++_typeIdIndex));
|
|
2928
|
+
return -1;
|
|
2929
|
+
}
|
|
2930
|
+
}
|
|
2931
|
+
|
|
2932
|
+
void
|
|
2933
|
+
IceInternal::BasicStream::EncapsEncoder10::write(const ObjectPtr& v)
|
|
2934
|
+
{
|
|
2935
|
+
//
|
|
2936
|
+
// Object references are encoded as a negative integer in 1.0.
|
|
2937
|
+
//
|
|
2938
|
+
if(v)
|
|
2939
|
+
{
|
|
2940
|
+
_stream->write(-registerObject(v));
|
|
2941
|
+
}
|
|
2942
|
+
else
|
|
2943
|
+
{
|
|
2944
|
+
_stream->write(0);
|
|
2945
|
+
}
|
|
2946
|
+
}
|
|
2947
|
+
|
|
2948
|
+
void
|
|
2949
|
+
IceInternal::BasicStream::EncapsEncoder10::write(const UserException& v)
|
|
2950
|
+
{
|
|
2951
|
+
//
|
|
2952
|
+
// User exception with the 1.0 encoding start with a boolean
|
|
2953
|
+
// flag that indicates whether or not the exception uses
|
|
2954
|
+
// classes.
|
|
2955
|
+
//
|
|
2956
|
+
// This allows reading the pending objects even if some part of
|
|
2957
|
+
// the exception was sliced.
|
|
2958
|
+
//
|
|
2959
|
+
bool usesClasses = v.__usesClasses();
|
|
2960
|
+
_stream->write(usesClasses);
|
|
2961
|
+
v.__write(_stream);
|
|
2962
|
+
if(usesClasses)
|
|
2963
|
+
{
|
|
2964
|
+
writePendingObjects();
|
|
2965
|
+
}
|
|
2966
|
+
}
|
|
2967
|
+
|
|
2968
|
+
void
|
|
2969
|
+
IceInternal::BasicStream::EncapsEncoder10::startInstance(SliceType sliceType, const SlicedDataPtr&)
|
|
2970
|
+
{
|
|
2971
|
+
_sliceType = sliceType;
|
|
2972
|
+
}
|
|
2973
|
+
|
|
2974
|
+
void
|
|
2975
|
+
IceInternal::BasicStream::EncapsEncoder10::endInstance()
|
|
2976
|
+
{
|
|
2977
|
+
if(_sliceType == ObjectSlice)
|
|
2978
|
+
{
|
|
2979
|
+
//
|
|
2980
|
+
// Write the Object slice.
|
|
2981
|
+
//
|
|
2982
|
+
startSlice(Object::ice_staticId(), -1, true);
|
|
2983
|
+
_stream->writeSize(0); // For compatibility with the old AFM.
|
|
2984
|
+
endSlice();
|
|
2985
|
+
}
|
|
2986
|
+
_sliceType = NoSlice;
|
|
2987
|
+
}
|
|
2988
|
+
|
|
2989
|
+
void
|
|
2990
|
+
IceInternal::BasicStream::EncapsEncoder10::startSlice(const string& typeId, int, bool /*last*/)
|
|
2991
|
+
{
|
|
2992
|
+
//
|
|
2993
|
+
// For object slices, encode a boolean to indicate how the type ID
|
|
2994
|
+
// is encoded and the type ID either as a string or index. For
|
|
2995
|
+
// exception slices, always encode the type ID as a string.
|
|
2996
|
+
//
|
|
2997
|
+
if(_sliceType == ObjectSlice)
|
|
2998
|
+
{
|
|
2999
|
+
Int index = registerTypeId(typeId);
|
|
3000
|
+
if(index < 0)
|
|
3001
|
+
{
|
|
3002
|
+
_stream->write(false);
|
|
3003
|
+
_stream->write(typeId, false);
|
|
3004
|
+
}
|
|
3005
|
+
else
|
|
3006
|
+
{
|
|
3007
|
+
_stream->write(true);
|
|
3008
|
+
_stream->writeSize(index);
|
|
3009
|
+
}
|
|
3010
|
+
}
|
|
3011
|
+
else
|
|
3012
|
+
{
|
|
3013
|
+
_stream->write(typeId, false);
|
|
3014
|
+
}
|
|
3015
|
+
|
|
3016
|
+
_stream->write(Int(0)); // Placeholder for the slice length.
|
|
3017
|
+
|
|
3018
|
+
_writeSlice = _stream->b.size();
|
|
3019
|
+
}
|
|
3020
|
+
|
|
3021
|
+
void
|
|
3022
|
+
IceInternal::BasicStream::EncapsEncoder10::endSlice()
|
|
3023
|
+
{
|
|
3024
|
+
//
|
|
3025
|
+
// Write the slice length.
|
|
3026
|
+
//
|
|
3027
|
+
Int sz = static_cast<Int>(_stream->b.size() - _writeSlice + sizeof(Int));
|
|
3028
|
+
Byte* dest = &(*(_stream->b.begin() + _writeSlice - sizeof(Int)));
|
|
3029
|
+
_stream->write(sz, dest);
|
|
3030
|
+
}
|
|
3031
|
+
|
|
3032
|
+
void
|
|
3033
|
+
IceInternal::BasicStream::EncapsEncoder10::writePendingObjects()
|
|
3034
|
+
{
|
|
3035
|
+
while(!_toBeMarshaledMap.empty())
|
|
3036
|
+
{
|
|
3037
|
+
//
|
|
3038
|
+
// Consider the to be marshalled objects as marshalled now,
|
|
3039
|
+
// this is necessary to avoid adding again the "to be
|
|
3040
|
+
// marshalled objects" into _toBeMarshaledMap while writing
|
|
3041
|
+
// objects.
|
|
3042
|
+
//
|
|
3043
|
+
_marshaledMap.insert(_toBeMarshaledMap.begin(), _toBeMarshaledMap.end());
|
|
3044
|
+
|
|
3045
|
+
PtrToIndexMap savedMap;
|
|
3046
|
+
savedMap.swap(_toBeMarshaledMap);
|
|
3047
|
+
_stream->writeSize(static_cast<Int>(savedMap.size()));
|
|
3048
|
+
for(PtrToIndexMap::iterator p = savedMap.begin(); p != savedMap.end(); ++p)
|
|
3049
|
+
{
|
|
3050
|
+
//
|
|
3051
|
+
// Ask the instance to marshal itself. Any new class
|
|
3052
|
+
// instances that are triggered by the classes marshaled
|
|
3053
|
+
// are added to toBeMarshaledMap.
|
|
3054
|
+
//
|
|
3055
|
+
_stream->write(p->second);
|
|
3056
|
+
|
|
3057
|
+
try
|
|
3058
|
+
{
|
|
3059
|
+
p->first->ice_preMarshal();
|
|
3060
|
+
}
|
|
3061
|
+
catch(const std::exception& ex)
|
|
3062
|
+
{
|
|
3063
|
+
Warning out(_stream->instance()->initializationData().logger);
|
|
3064
|
+
out << "std::exception raised by ice_preMarshal:\n" << ex;
|
|
3065
|
+
}
|
|
3066
|
+
catch(...)
|
|
3067
|
+
{
|
|
3068
|
+
Warning out(_stream->instance()->initializationData().logger);
|
|
3069
|
+
out << "unknown exception raised by ice_preMarshal";
|
|
3070
|
+
}
|
|
3071
|
+
|
|
3072
|
+
p->first->__write(_stream);
|
|
3073
|
+
}
|
|
3074
|
+
}
|
|
3075
|
+
_stream->writeSize(0); // Zero marker indicates end of sequence of sequences of instances.
|
|
3076
|
+
}
|
|
3077
|
+
|
|
3078
|
+
Int
|
|
3079
|
+
IceInternal::BasicStream::EncapsEncoder10::registerObject(const ObjectPtr& v)
|
|
3080
|
+
{
|
|
3081
|
+
assert(v);
|
|
3082
|
+
|
|
3083
|
+
//
|
|
3084
|
+
// Look for this instance in the to-be-marshaled map.
|
|
3085
|
+
//
|
|
3086
|
+
PtrToIndexMap::const_iterator p = _toBeMarshaledMap.find(v);
|
|
3087
|
+
if(p != _toBeMarshaledMap.end())
|
|
3088
|
+
{
|
|
3089
|
+
return p->second;
|
|
3090
|
+
}
|
|
3091
|
+
|
|
3092
|
+
//
|
|
3093
|
+
// Didn't find it, try the marshaled map next.
|
|
3094
|
+
//
|
|
3095
|
+
PtrToIndexMap::const_iterator q = _marshaledMap.find(v);
|
|
3096
|
+
if(q != _marshaledMap.end())
|
|
3097
|
+
{
|
|
3098
|
+
return q->second;
|
|
3099
|
+
}
|
|
3100
|
+
|
|
3101
|
+
//
|
|
3102
|
+
// We haven't seen this instance previously, create a new
|
|
3103
|
+
// index, and insert it into the to-be-marshaled map.
|
|
3104
|
+
//
|
|
3105
|
+
_toBeMarshaledMap.insert(make_pair(v, ++_objectIdIndex));
|
|
3106
|
+
return _objectIdIndex;
|
|
3107
|
+
}
|
|
3108
|
+
|
|
3109
|
+
void
|
|
3110
|
+
IceInternal::BasicStream::EncapsEncoder11::write(const ObjectPtr& v)
|
|
3111
|
+
{
|
|
3112
|
+
if(!v)
|
|
3113
|
+
{
|
|
3114
|
+
_stream->writeSize(0); // Nil reference.
|
|
3115
|
+
}
|
|
3116
|
+
else if(_current && _encaps->format == SlicedFormat)
|
|
3117
|
+
{
|
|
3118
|
+
//
|
|
3119
|
+
// If writting an object within a slice and using the sliced
|
|
3120
|
+
// format, write an index from the object indirection
|
|
3121
|
+
// table. The indirect object table is encoded at the end of
|
|
3122
|
+
// each slice and is always read (even if the Slice is
|
|
3123
|
+
// unknown).
|
|
3124
|
+
//
|
|
3125
|
+
PtrToIndexMap::const_iterator p = _current->indirectionMap.find(v);
|
|
3126
|
+
if(p == _current->indirectionMap.end())
|
|
3127
|
+
{
|
|
3128
|
+
_current->indirectionTable.push_back(v);
|
|
3129
|
+
Int idx = static_cast<Int>(_current->indirectionTable.size()); // Position + 1 (0 is reserved for nil)
|
|
3130
|
+
_current->indirectionMap.insert(make_pair(v, idx));
|
|
3131
|
+
_stream->writeSize(idx);
|
|
3132
|
+
}
|
|
3133
|
+
else
|
|
3134
|
+
{
|
|
3135
|
+
_stream->writeSize(p->second);
|
|
3136
|
+
}
|
|
3137
|
+
}
|
|
3138
|
+
else
|
|
3139
|
+
{
|
|
3140
|
+
writeInstance(v); // Write the instance or a reference if already marshaled.
|
|
3141
|
+
}
|
|
3142
|
+
}
|
|
3143
|
+
|
|
3144
|
+
void
|
|
3145
|
+
IceInternal::BasicStream::EncapsEncoder11::write(const UserException& v)
|
|
3146
|
+
{
|
|
3147
|
+
v.__write(_stream);
|
|
3148
|
+
}
|
|
3149
|
+
|
|
3150
|
+
void
|
|
3151
|
+
IceInternal::BasicStream::EncapsEncoder11::startInstance(SliceType sliceType, const SlicedDataPtr& data)
|
|
3152
|
+
{
|
|
3153
|
+
if(!_current)
|
|
3154
|
+
{
|
|
3155
|
+
_current = &_preAllocatedInstanceData;
|
|
3156
|
+
}
|
|
3157
|
+
else
|
|
3158
|
+
{
|
|
3159
|
+
_current = _current->next ? _current->next : new InstanceData(_current);
|
|
3160
|
+
}
|
|
3161
|
+
_current->sliceType = sliceType;
|
|
3162
|
+
_current->firstSlice = true;
|
|
3163
|
+
|
|
3164
|
+
if(data)
|
|
3165
|
+
{
|
|
3166
|
+
writeSlicedData(data);
|
|
3167
|
+
}
|
|
3168
|
+
}
|
|
3169
|
+
|
|
3170
|
+
void
|
|
3171
|
+
IceInternal::BasicStream::EncapsEncoder11::endInstance()
|
|
3172
|
+
{
|
|
3173
|
+
_current = _current->previous;
|
|
3174
|
+
}
|
|
3175
|
+
|
|
3176
|
+
void
|
|
3177
|
+
IceInternal::BasicStream::EncapsEncoder11::startSlice(const string& typeId, int compactId, bool last)
|
|
3178
|
+
{
|
|
3179
|
+
assert(_current->indirectionTable.empty() && _current->indirectionMap.empty());
|
|
3180
|
+
|
|
3181
|
+
_current->sliceFlagsPos = _stream->b.size();
|
|
3182
|
+
|
|
3183
|
+
_current->sliceFlags = 0;
|
|
3184
|
+
if(_encaps->format == SlicedFormat)
|
|
3185
|
+
{
|
|
3186
|
+
_current->sliceFlags |= FLAG_HAS_SLICE_SIZE; // Encode the slice size if using the sliced format.
|
|
3187
|
+
}
|
|
3188
|
+
if(last)
|
|
3189
|
+
{
|
|
3190
|
+
_current->sliceFlags |= FLAG_IS_LAST_SLICE; // This is the last slice.
|
|
3191
|
+
}
|
|
3192
|
+
|
|
3193
|
+
_stream->write(Byte(0)); // Placeholder for the slice flags
|
|
3194
|
+
|
|
3195
|
+
//
|
|
3196
|
+
// For object slices, encode the flag and the type ID either as a
|
|
3197
|
+
// string or index. For exception slices, always encode the type
|
|
3198
|
+
// ID a string.
|
|
3199
|
+
//
|
|
3200
|
+
if(_current->sliceType == ObjectSlice)
|
|
3201
|
+
{
|
|
3202
|
+
//
|
|
3203
|
+
// Encode the type ID (only in the first slice for the compact
|
|
3204
|
+
// encoding).
|
|
3205
|
+
//
|
|
3206
|
+
if(_encaps->format == SlicedFormat || _current->firstSlice)
|
|
3207
|
+
{
|
|
3208
|
+
if(compactId >= 0)
|
|
3209
|
+
{
|
|
3210
|
+
_current->sliceFlags |= FLAG_HAS_TYPE_ID_COMPACT;
|
|
3211
|
+
_stream->writeSize(compactId);
|
|
3212
|
+
}
|
|
3213
|
+
else
|
|
3214
|
+
{
|
|
3215
|
+
Int index = registerTypeId(typeId);
|
|
3216
|
+
if(index < 0)
|
|
3217
|
+
{
|
|
3218
|
+
_current->sliceFlags |= FLAG_HAS_TYPE_ID_STRING;
|
|
3219
|
+
_stream->write(typeId, false);
|
|
3220
|
+
}
|
|
3221
|
+
else
|
|
3222
|
+
{
|
|
3223
|
+
_current->sliceFlags |= FLAG_HAS_TYPE_ID_INDEX;
|
|
3224
|
+
_stream->writeSize(index);
|
|
3225
|
+
}
|
|
3226
|
+
}
|
|
3227
|
+
}
|
|
3228
|
+
}
|
|
3229
|
+
else
|
|
3230
|
+
{
|
|
3231
|
+
_stream->write(typeId, false);
|
|
3232
|
+
}
|
|
3233
|
+
|
|
3234
|
+
if(_current->sliceFlags & FLAG_HAS_SLICE_SIZE)
|
|
3235
|
+
{
|
|
3236
|
+
_stream->write(Int(0)); // Placeholder for the slice length.
|
|
3237
|
+
}
|
|
3238
|
+
|
|
3239
|
+
_current->writeSlice = _stream->b.size();
|
|
3240
|
+
_current->firstSlice = false;
|
|
3241
|
+
}
|
|
3242
|
+
|
|
3243
|
+
void
|
|
3244
|
+
IceInternal::BasicStream::EncapsEncoder11::endSlice()
|
|
3245
|
+
{
|
|
3246
|
+
//
|
|
3247
|
+
// Write the optional member end marker if some optional members
|
|
3248
|
+
// were encoded. Note that the optional members are encoded before
|
|
3249
|
+
// the indirection table and are included in the slice size.
|
|
3250
|
+
//
|
|
3251
|
+
if(_current->sliceFlags & FLAG_HAS_OPTIONAL_MEMBERS)
|
|
3252
|
+
{
|
|
3253
|
+
_stream->write(OPTIONAL_END_MARKER);
|
|
3254
|
+
}
|
|
3255
|
+
|
|
3256
|
+
//
|
|
3257
|
+
// Write the slice length if necessary.
|
|
3258
|
+
//
|
|
3259
|
+
if(_current->sliceFlags & FLAG_HAS_SLICE_SIZE)
|
|
3260
|
+
{
|
|
3261
|
+
Int sz = static_cast<Int>(_stream->b.size() - _current->writeSlice + sizeof(Int));
|
|
3262
|
+
Byte* dest = &(*(_stream->b.begin() + _current->writeSlice - sizeof(Int)));
|
|
3263
|
+
_stream->write(sz, dest);
|
|
3264
|
+
}
|
|
3265
|
+
|
|
3266
|
+
//
|
|
3267
|
+
// Only write the indirection table if it contains entries.
|
|
3268
|
+
//
|
|
3269
|
+
if(!_current->indirectionTable.empty())
|
|
3270
|
+
{
|
|
3271
|
+
assert(_encaps->format == SlicedFormat);
|
|
3272
|
+
_current->sliceFlags |= FLAG_HAS_INDIRECTION_TABLE;
|
|
3273
|
+
|
|
3274
|
+
//
|
|
3275
|
+
// Write the indirection object table.
|
|
3276
|
+
//
|
|
3277
|
+
_stream->writeSize(static_cast<Int>(_current->indirectionTable.size()));
|
|
3278
|
+
ObjectList::const_iterator p;
|
|
3279
|
+
for(p = _current->indirectionTable.begin(); p != _current->indirectionTable.end(); ++p)
|
|
3280
|
+
{
|
|
3281
|
+
writeInstance(*p);
|
|
3282
|
+
}
|
|
3283
|
+
_current->indirectionTable.clear();
|
|
3284
|
+
_current->indirectionMap.clear();
|
|
3285
|
+
}
|
|
3286
|
+
|
|
3287
|
+
//
|
|
3288
|
+
// Finally, update the slice flags.
|
|
3289
|
+
//
|
|
3290
|
+
Byte* dest = &(*(_stream->b.begin() + _current->sliceFlagsPos));
|
|
3291
|
+
*dest = _current->sliceFlags;
|
|
3292
|
+
}
|
|
3293
|
+
|
|
3294
|
+
bool
|
|
3295
|
+
IceInternal::BasicStream::EncapsEncoder11::writeOpt(Ice::Int tag, Ice::OptionalFormat format)
|
|
3296
|
+
{
|
|
3297
|
+
if(!_current)
|
|
3298
|
+
{
|
|
3299
|
+
return _stream->writeOptImpl(tag, format);
|
|
3300
|
+
}
|
|
3301
|
+
else
|
|
3302
|
+
{
|
|
3303
|
+
if(_stream->writeOptImpl(tag, format))
|
|
3304
|
+
{
|
|
3305
|
+
_current->sliceFlags |= FLAG_HAS_OPTIONAL_MEMBERS;
|
|
3306
|
+
return true;
|
|
3307
|
+
}
|
|
3308
|
+
else
|
|
3309
|
+
{
|
|
3310
|
+
return false;
|
|
3311
|
+
}
|
|
3312
|
+
}
|
|
3313
|
+
}
|
|
3314
|
+
|
|
3315
|
+
void
|
|
3316
|
+
IceInternal::BasicStream::EncapsEncoder11::writeSlicedData(const SlicedDataPtr& slicedData)
|
|
3317
|
+
{
|
|
3318
|
+
assert(slicedData);
|
|
3319
|
+
|
|
3320
|
+
//
|
|
3321
|
+
// We only remarshal preserved slices if we are using the sliced
|
|
3322
|
+
// format. Otherwise, we ignore the preserved slices, which
|
|
3323
|
+
// essentially "slices" the object into the most-derived type
|
|
3324
|
+
// known by the sender.
|
|
3325
|
+
//
|
|
3326
|
+
if(_encaps->format != SlicedFormat)
|
|
3327
|
+
{
|
|
3328
|
+
return;
|
|
3329
|
+
}
|
|
3330
|
+
|
|
3331
|
+
for(SliceInfoSeq::const_iterator p = slicedData->slices.begin(); p != slicedData->slices.end(); ++p)
|
|
3332
|
+
{
|
|
3333
|
+
startSlice((*p)->typeId, (*p)->compactId, (*p)->isLastSlice);
|
|
3334
|
+
|
|
3335
|
+
//
|
|
3336
|
+
// Write the bytes associated with this slice.
|
|
3337
|
+
//
|
|
3338
|
+
_stream->writeBlob((*p)->bytes);
|
|
3339
|
+
|
|
3340
|
+
if((*p)->hasOptionalMembers)
|
|
3341
|
+
{
|
|
3342
|
+
_current->sliceFlags |= FLAG_HAS_OPTIONAL_MEMBERS;
|
|
3343
|
+
}
|
|
3344
|
+
|
|
3345
|
+
//
|
|
3346
|
+
// Make sure to also re-write the object indirection table.
|
|
3347
|
+
//
|
|
3348
|
+
_current->indirectionTable = (*p)->objects;
|
|
3349
|
+
|
|
3350
|
+
endSlice();
|
|
3351
|
+
}
|
|
3352
|
+
}
|
|
3353
|
+
|
|
3354
|
+
void
|
|
3355
|
+
IceInternal::BasicStream::EncapsEncoder11::writeInstance(const ObjectPtr& v)
|
|
3356
|
+
{
|
|
3357
|
+
assert(v);
|
|
3358
|
+
|
|
3359
|
+
//
|
|
3360
|
+
// If the instance was already marshaled, just write it's ID.
|
|
3361
|
+
//
|
|
3362
|
+
PtrToIndexMap::const_iterator q = _marshaledMap.find(v);
|
|
3363
|
+
if(q != _marshaledMap.end())
|
|
3364
|
+
{
|
|
3365
|
+
_stream->writeSize(q->second);
|
|
3366
|
+
return;
|
|
3367
|
+
}
|
|
3368
|
+
|
|
3369
|
+
//
|
|
3370
|
+
// We haven't seen this instance previously, create a new ID,
|
|
3371
|
+
// insert it into the marshaled map, and write the instance.
|
|
3372
|
+
//
|
|
3373
|
+
_marshaledMap.insert(make_pair(v, ++_objectIdIndex));
|
|
3374
|
+
|
|
3375
|
+
try
|
|
3376
|
+
{
|
|
3377
|
+
v->ice_preMarshal();
|
|
3378
|
+
}
|
|
3379
|
+
catch(const std::exception& ex)
|
|
3380
|
+
{
|
|
3381
|
+
Warning out(_stream->instance()->initializationData().logger);
|
|
3382
|
+
out << "std::exception raised by ice_preMarshal:\n" << ex;
|
|
3383
|
+
}
|
|
3384
|
+
catch(...)
|
|
3385
|
+
{
|
|
3386
|
+
Warning out(_stream->instance()->initializationData().logger);
|
|
3387
|
+
out << "unknown exception raised by ice_preMarshal";
|
|
3388
|
+
}
|
|
3389
|
+
|
|
3390
|
+
_stream->writeSize(1); // Object instance marker.
|
|
3391
|
+
v->__write(_stream);
|
|
3392
|
+
}
|
|
3393
|
+
|