zeroc-ice 3.6.5 → 3.7.0

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.
Files changed (752) hide show
  1. checksums.yaml +4 -4
  2. data/BZIP2_LICENSE +42 -0
  3. data/ICE_LICENSE +17 -17
  4. data/LICENSE +12 -12
  5. data/bin/slice2rb +1 -1
  6. data/ext/Communicator.cpp +150 -53
  7. data/ext/Communicator.h +1 -1
  8. data/ext/Config.h +2 -12
  9. data/ext/Connection.cpp +89 -68
  10. data/ext/Connection.h +1 -1
  11. data/ext/Endpoint.cpp +16 -45
  12. data/ext/Endpoint.h +1 -1
  13. data/ext/ImplicitContext.cpp +1 -5
  14. data/ext/ImplicitContext.h +1 -1
  15. data/ext/Init.cpp +4 -1
  16. data/ext/Logger.cpp +1 -1
  17. data/ext/Logger.h +1 -1
  18. data/ext/Operation.cpp +33 -44
  19. data/ext/Operation.h +1 -1
  20. data/ext/Properties.cpp +1 -1
  21. data/ext/Properties.h +1 -1
  22. data/ext/Proxy.cpp +22 -57
  23. data/ext/Proxy.h +1 -1
  24. data/ext/Slice.cpp +5 -5
  25. data/ext/Slice.h +1 -1
  26. data/ext/Types.cpp +244 -171
  27. data/ext/Types.h +118 -66
  28. data/ext/Util.cpp +13 -9
  29. data/ext/Util.h +10 -10
  30. data/ext/ValueFactoryManager.cpp +445 -0
  31. data/ext/ValueFactoryManager.h +100 -0
  32. data/ext/extconf.rb +47 -45
  33. data/ext/ice/bzip2/blocksort.c +1094 -0
  34. data/ext/ice/bzip2/bzlib.c +1572 -0
  35. data/ext/ice/bzip2/bzlib.h +282 -0
  36. data/ext/ice/bzip2/bzlib_private.h +509 -0
  37. data/ext/ice/bzip2/compress.c +672 -0
  38. data/ext/ice/bzip2/crctable.c +104 -0
  39. data/ext/ice/bzip2/decompress.c +646 -0
  40. data/ext/ice/bzip2/huffman.c +205 -0
  41. data/ext/ice/bzip2/randtable.c +84 -0
  42. data/ext/ice/cpp/include/Ice/Application.h +77 -60
  43. data/ext/ice/cpp/include/Ice/AsyncResult.h +34 -318
  44. data/ext/ice/cpp/include/Ice/AsyncResultF.h +4 -2
  45. data/ext/ice/cpp/include/Ice/BatchRequestInterceptor.h +5 -10
  46. data/ext/ice/cpp/include/Ice/BatchRequestQueueF.h +1 -1
  47. data/ext/ice/cpp/include/Ice/Buffer.h +10 -10
  48. data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +14 -12
  49. data/ext/ice/cpp/include/Ice/Comparable.h +130 -0
  50. data/ext/ice/cpp/include/Ice/Config.h +7 -36
  51. data/ext/ice/cpp/include/Ice/ConnectionAsync.h +107 -11
  52. data/ext/ice/cpp/include/Ice/ConnectionIF.h +5 -1
  53. data/ext/ice/cpp/include/Ice/ConsoleUtil.h +28 -0
  54. data/ext/ice/cpp/include/Ice/{DefaultObjectFactory.h → DefaultValueFactory.h} +28 -14
  55. data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +4 -6
  56. data/ext/ice/cpp/include/Ice/Dispatcher.h +14 -13
  57. data/ext/ice/cpp/include/Ice/DynamicLibrary.h +7 -5
  58. data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +1 -1
  59. data/ext/ice/cpp/include/Ice/Exception.h +66 -56
  60. data/ext/ice/cpp/include/Ice/ExceptionHelpers.h +69 -0
  61. data/ext/ice/cpp/include/Ice/FactoryTable.h +11 -12
  62. data/ext/ice/cpp/include/Ice/FactoryTableInit.h +27 -25
  63. data/ext/ice/cpp/include/Ice/Format.h +6 -1
  64. data/ext/ice/cpp/include/Ice/Functional.h +33 -33
  65. data/ext/ice/cpp/include/Ice/GCObject.h +9 -5
  66. data/ext/ice/cpp/include/Ice/Handle.h +6 -11
  67. data/ext/ice/cpp/include/Ice/Ice.h +9 -5
  68. data/ext/ice/cpp/include/{IceUtil → Ice}/IconvStringConverter.h +108 -62
  69. data/ext/ice/cpp/include/Ice/Incoming.h +109 -33
  70. data/ext/ice/cpp/include/Ice/IncomingAsync.h +63 -23
  71. data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +7 -1
  72. data/ext/ice/cpp/include/Ice/Initialize.h +178 -38
  73. data/ext/ice/cpp/include/Ice/InputStream.h +994 -0
  74. data/ext/ice/cpp/include/Ice/InstanceF.h +1 -2
  75. data/ext/ice/cpp/include/Ice/InterfaceByValue.h +46 -0
  76. data/ext/ice/cpp/include/Ice/LocalObject.h +9 -9
  77. data/ext/ice/cpp/include/Ice/LocalObjectF.h +1 -1
  78. data/ext/ice/cpp/include/Ice/LoggerUtil.h +20 -14
  79. data/ext/ice/cpp/include/Ice/MetricsAdminI.h +114 -65
  80. data/ext/ice/cpp/include/Ice/MetricsFunctional.h +23 -5
  81. data/ext/ice/cpp/include/Ice/MetricsObserverI.h +99 -26
  82. data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +17 -4
  83. data/ext/ice/cpp/include/Ice/Object.h +105 -56
  84. data/ext/ice/cpp/include/Ice/ObjectF.h +8 -3
  85. data/ext/ice/cpp/include/Ice/ObserverHelper.h +18 -8
  86. data/ext/ice/cpp/include/Ice/Optional.h +1084 -0
  87. data/ext/ice/cpp/include/Ice/OutgoingAsync.h +655 -84
  88. data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +12 -6
  89. data/ext/ice/cpp/include/Ice/OutputStream.h +753 -0
  90. data/ext/ice/cpp/include/Ice/Protocol.h +19 -12
  91. data/ext/ice/cpp/include/Ice/Proxy.h +1329 -717
  92. data/ext/ice/cpp/include/Ice/ProxyF.h +11 -33
  93. data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +1 -1
  94. data/ext/ice/cpp/include/Ice/ProxyHandle.h +34 -50
  95. data/ext/ice/cpp/include/Ice/ReferenceF.h +1 -1
  96. data/ext/ice/cpp/include/Ice/RegisterPlugins.h +22 -3
  97. data/ext/ice/cpp/include/Ice/RequestHandlerF.h +10 -4
  98. data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +6 -1
  99. data/ext/ice/cpp/include/{IceUtil → Ice}/SHA1.h +16 -16
  100. data/ext/ice/cpp/include/Ice/ServantManagerF.h +1 -1
  101. data/ext/ice/cpp/include/Ice/Service.h +13 -18
  102. data/ext/ice/cpp/include/Ice/SliceChecksums.h +1 -1
  103. data/ext/ice/cpp/include/Ice/SlicedData.h +46 -20
  104. data/ext/ice/cpp/include/Ice/SlicedDataF.h +14 -6
  105. data/ext/ice/cpp/include/Ice/StreamHelpers.h +159 -49
  106. data/ext/ice/cpp/include/Ice/StringConverter.h +52 -0
  107. data/ext/ice/cpp/include/Ice/ThreadPoolF.h +1 -1
  108. data/{slice/Ice/ObjectFactoryF.ice → ext/ice/cpp/include/Ice/UUID.h} +9 -7
  109. data/ext/ice/cpp/include/{IceUtil → Ice}/UniquePtr.h +21 -22
  110. data/ext/ice/cpp/include/Ice/UniqueRef.h +98 -0
  111. data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +40 -8
  112. data/ext/ice/cpp/include/Ice/Value.h +104 -0
  113. data/{slice/Freeze/ConnectionF.ice → ext/ice/cpp/include/Ice/ValueF.h} +11 -7
  114. data/ext/ice/cpp/include/IceSSL/Config.h +8 -23
  115. data/ext/ice/cpp/include/IceSSL/IceSSL.h +17 -6
  116. data/ext/ice/cpp/include/IceSSL/OpenSSL.h +130 -0
  117. data/ext/ice/cpp/include/IceSSL/Plugin.h +172 -259
  118. data/ext/ice/cpp/include/IceSSL/SChannel.h +66 -0
  119. data/ext/ice/cpp/include/IceSSL/SecureTransport.h +66 -0
  120. data/ext/ice/cpp/include/IceSSL/UWP.h +58 -0
  121. data/ext/ice/cpp/include/IceUtil/Atomic.h +8 -10
  122. data/ext/ice/cpp/include/IceUtil/Cond.h +17 -18
  123. data/ext/ice/cpp/include/IceUtil/Config.h +138 -39
  124. data/ext/ice/cpp/include/IceUtil/ConsoleUtil.h +97 -0
  125. data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +5 -5
  126. data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +23 -17
  127. data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +1 -3
  128. data/ext/ice/cpp/include/IceUtil/Exception.h +157 -67
  129. data/ext/ice/cpp/include/IceUtil/FileUtil.h +148 -0
  130. data/ext/ice/cpp/include/IceUtil/Functional.h +1 -2
  131. data/ext/ice/cpp/include/IceUtil/Handle.h +11 -11
  132. data/ext/ice/cpp/include/IceUtil/IceUtil.h +4 -10
  133. data/ext/ice/cpp/include/IceUtil/InputUtil.h +3 -3
  134. data/ext/ice/cpp/include/IceUtil/Iterator.h +2 -2
  135. data/ext/ice/cpp/include/IceUtil/Lock.h +8 -10
  136. data/ext/ice/cpp/include/IceUtil/Monitor.h +1 -2
  137. data/ext/ice/cpp/include/IceUtil/Mutex.h +17 -11
  138. data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +2 -2
  139. data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +4 -4
  140. data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +4 -4
  141. data/ext/ice/cpp/include/IceUtil/Optional.h +32 -18
  142. data/ext/ice/cpp/include/IceUtil/Options.h +17 -18
  143. data/ext/ice/cpp/include/IceUtil/OutputUtil.h +55 -29
  144. data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +6 -6
  145. data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +11 -10
  146. data/ext/ice/cpp/include/IceUtil/Random.h +3 -3
  147. data/ext/ice/cpp/include/IceUtil/RecMutex.h +7 -8
  148. data/ext/ice/cpp/include/IceUtil/ResourceConfig.h +58 -0
  149. data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +1 -9
  150. data/ext/ice/cpp/include/IceUtil/ScopedArray.h +8 -2
  151. data/ext/ice/cpp/include/IceUtil/Shared.h +5 -7
  152. data/ext/ice/cpp/{src → include}/IceUtil/StopWatch.h +2 -2
  153. data/ext/ice/cpp/include/IceUtil/StringConverter.h +77 -72
  154. data/ext/ice/cpp/include/IceUtil/StringUtil.h +32 -21
  155. data/ext/ice/cpp/include/IceUtil/Thread.h +10 -12
  156. data/ext/ice/cpp/include/IceUtil/ThreadException.h +33 -42
  157. data/ext/ice/cpp/include/IceUtil/Time.h +3 -3
  158. data/ext/ice/cpp/include/IceUtil/Timer.h +14 -13
  159. data/ext/ice/cpp/include/IceUtil/UUID.h +2 -2
  160. data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +1 -1
  161. data/ext/ice/cpp/include/{Ice → generated/Ice}/BuiltinSequences.h +41 -8
  162. data/ext/ice/cpp/include/generated/Ice/Communicator.h +364 -0
  163. data/ext/ice/cpp/include/{Ice → generated/Ice}/CommunicatorF.h +40 -8
  164. data/ext/ice/cpp/include/generated/Ice/Connection.h +872 -0
  165. data/ext/ice/cpp/include/{Ice → generated/Ice}/ConnectionF.h +46 -8
  166. data/ext/ice/cpp/include/{Ice → generated/Ice}/Current.h +71 -8
  167. data/ext/ice/cpp/include/generated/Ice/Endpoint.h +582 -0
  168. data/ext/ice/cpp/include/{Ice → generated/Ice}/EndpointF.h +62 -8
  169. data/ext/ice/cpp/include/{Ice → generated/Ice}/EndpointTypes.h +31 -16
  170. data/ext/ice/cpp/include/{Ice → generated/Ice}/FacetMap.h +23 -8
  171. data/ext/ice/cpp/include/generated/Ice/Identity.h +221 -0
  172. data/ext/ice/cpp/include/{Ice → generated/Ice}/ImplicitContext.h +72 -13
  173. data/ext/ice/cpp/include/{Ice → generated/Ice}/ImplicitContextF.h +40 -8
  174. data/ext/ice/cpp/include/generated/Ice/Instrumentation.h +602 -0
  175. data/ext/ice/cpp/include/{Ice → generated/Ice}/InstrumentationF.h +54 -8
  176. data/ext/ice/cpp/include/generated/Ice/LocalException.h +2802 -0
  177. data/ext/ice/cpp/include/generated/Ice/Locator.h +2036 -0
  178. data/ext/ice/cpp/include/{Ice → generated/Ice}/LocatorF.h +53 -12
  179. data/ext/ice/cpp/include/{Ice → generated/Ice}/Logger.h +71 -13
  180. data/ext/ice/cpp/include/{Ice → generated/Ice}/LoggerF.h +40 -8
  181. data/ext/ice/cpp/include/generated/Ice/Metrics.h +2649 -0
  182. data/ext/ice/cpp/include/generated/Ice/ObjectAdapter.h +302 -0
  183. data/ext/ice/cpp/include/{Ice → generated/Ice}/ObjectAdapterF.h +40 -8
  184. data/ext/ice/cpp/include/generated/Ice/ObjectFactory.h +142 -0
  185. data/ext/ice/cpp/include/generated/Ice/Plugin.h +197 -0
  186. data/ext/ice/cpp/include/{Ice → generated/Ice}/PluginF.h +43 -8
  187. data/ext/ice/cpp/include/generated/Ice/Process.h +536 -0
  188. data/ext/ice/cpp/include/{Ice → generated/Ice}/ProcessF.h +45 -10
  189. data/ext/ice/cpp/include/{Ice → generated/Ice}/Properties.h +88 -21
  190. data/ext/ice/cpp/include/generated/Ice/PropertiesAdmin.h +749 -0
  191. data/ext/ice/cpp/include/{Ice → generated/Ice}/PropertiesF.h +48 -10
  192. data/ext/ice/cpp/include/generated/Ice/RemoteLogger.h +1449 -0
  193. data/ext/ice/cpp/include/generated/Ice/Router.h +1032 -0
  194. data/ext/ice/cpp/include/{Ice → generated/Ice}/RouterF.h +45 -10
  195. data/ext/ice/cpp/include/{Ice → generated/Ice}/ServantLocator.h +65 -13
  196. data/ext/ice/cpp/include/{Ice → generated/Ice}/ServantLocatorF.h +40 -8
  197. data/ext/ice/cpp/include/{Ice → generated/Ice}/SliceChecksumDict.h +23 -8
  198. data/ext/ice/cpp/include/generated/Ice/ValueFactory.h +169 -0
  199. data/ext/ice/cpp/include/generated/Ice/Version.h +334 -0
  200. data/ext/ice/cpp/include/generated/IceSSL/ConnectionInfo.h +172 -0
  201. data/ext/ice/cpp/include/generated/IceSSL/ConnectionInfoF.h +98 -0
  202. data/ext/ice/cpp/include/generated/IceSSL/EndpointInfo.h +156 -0
  203. data/ext/ice/cpp/src/Ice/ACM.cpp +18 -14
  204. data/ext/ice/cpp/src/Ice/ACM.h +9 -2
  205. data/ext/ice/cpp/{include → src}/Ice/ACMF.h +10 -5
  206. data/ext/ice/cpp/src/Ice/Acceptor.cpp +6 -1
  207. data/ext/ice/cpp/src/Ice/Acceptor.h +4 -3
  208. data/ext/ice/cpp/src/Ice/AcceptorF.h +1 -1
  209. data/ext/ice/cpp/src/{IceUtil → Ice}/ArgVector.cpp +9 -9
  210. data/ext/ice/cpp/src/{IceUtil → Ice}/ArgVector.h +7 -7
  211. data/ext/ice/cpp/src/Ice/AsyncResult.cpp +15 -538
  212. data/ext/ice/cpp/src/Ice/Base64.cpp +11 -11
  213. data/ext/ice/cpp/src/Ice/Base64.h +1 -1
  214. data/ext/ice/cpp/src/Ice/BatchRequestQueue.cpp +40 -12
  215. data/ext/ice/cpp/src/Ice/BatchRequestQueue.h +15 -10
  216. data/ext/ice/cpp/src/Ice/Buffer.cpp +74 -12
  217. data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +20 -6
  218. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +85 -190
  219. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +17 -18
  220. data/ext/ice/cpp/src/Ice/Communicator.cpp +39 -8
  221. data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +27 -5
  222. data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +271 -104
  223. data/ext/ice/cpp/src/Ice/CommunicatorI.h +84 -28
  224. data/ext/ice/cpp/src/{IceUtil → Ice}/Cond.cpp +3 -3
  225. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +58 -125
  226. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +11 -22
  227. data/ext/ice/cpp/src/Ice/ConnectRequestHandlerF.h +6 -2
  228. data/ext/ice/cpp/src/Ice/Connection.cpp +88 -8
  229. data/ext/ice/cpp/src/Ice/ConnectionF.cpp +27 -5
  230. data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +158 -80
  231. data/ext/ice/cpp/src/Ice/ConnectionFactory.h +41 -23
  232. data/ext/ice/cpp/{include → src}/Ice/ConnectionFactoryF.h +8 -3
  233. data/ext/ice/cpp/src/Ice/ConnectionI.cpp +707 -653
  234. data/ext/ice/cpp/src/Ice/ConnectionI.h +97 -69
  235. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +2 -15
  236. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +4 -3
  237. data/ext/ice/cpp/src/Ice/Connector.cpp +6 -1
  238. data/ext/ice/cpp/src/Ice/Connector.h +4 -3
  239. data/ext/ice/cpp/src/Ice/ConnectorF.h +1 -1
  240. data/ext/ice/cpp/src/{IceUtil → Ice}/CountDownLatch.cpp +4 -4
  241. data/ext/ice/cpp/src/Ice/Current.cpp +29 -6
  242. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +6 -5
  243. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +1 -1
  244. data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +1 -1
  245. data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +5 -25
  246. data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +29 -19
  247. data/ext/ice/cpp/src/Ice/Endpoint.cpp +85 -6
  248. data/ext/ice/cpp/src/Ice/EndpointF.cpp +27 -5
  249. data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +152 -1
  250. data/ext/ice/cpp/src/Ice/EndpointFactory.h +72 -6
  251. data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +1 -1
  252. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +35 -19
  253. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +10 -4
  254. data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +1 -1
  255. data/ext/ice/cpp/src/Ice/EndpointI.cpp +17 -1
  256. data/ext/ice/cpp/src/Ice/EndpointI.h +35 -9
  257. data/ext/ice/cpp/src/Ice/EndpointIF.h +18 -5
  258. data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +18 -6
  259. data/ext/ice/cpp/src/Ice/EventHandler.cpp +6 -4
  260. data/ext/ice/cpp/src/Ice/EventHandler.h +13 -8
  261. data/ext/ice/cpp/src/Ice/EventHandlerF.h +5 -2
  262. data/ext/ice/cpp/src/Ice/Exception.cpp +95 -86
  263. data/ext/ice/cpp/src/Ice/FacetMap.cpp +20 -6
  264. data/ext/ice/cpp/src/Ice/FactoryTable.cpp +37 -28
  265. data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +2 -4
  266. data/ext/ice/cpp/src/Ice/GCObject.cpp +28 -25
  267. data/ext/ice/cpp/src/Ice/HashUtil.h +2 -3
  268. data/ext/ice/cpp/src/Ice/HttpParser.cpp +1 -2
  269. data/ext/ice/cpp/src/Ice/HttpParser.h +1 -1
  270. data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +92 -53
  271. data/ext/ice/cpp/src/Ice/IPEndpointI.h +19 -10
  272. data/ext/ice/cpp/src/Ice/IPEndpointIF.h +6 -2
  273. data/ext/ice/cpp/src/Ice/IconvStringConverter.cpp +56 -0
  274. data/ext/ice/cpp/src/Ice/Identity.cpp +24 -10
  275. data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +37 -6
  276. data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +27 -5
  277. data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +14 -14
  278. data/ext/ice/cpp/src/Ice/ImplicitContextI.h +7 -5
  279. data/ext/ice/cpp/src/Ice/Incoming.cpp +276 -245
  280. data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +104 -209
  281. data/ext/ice/cpp/src/Ice/IncomingRequest.h +5 -4
  282. data/ext/ice/cpp/src/Ice/Initialize.cpp +299 -172
  283. data/ext/ice/cpp/src/Ice/InputStream.cpp +2773 -0
  284. data/ext/ice/cpp/src/Ice/Instance.cpp +191 -231
  285. data/ext/ice/cpp/src/Ice/Instance.h +30 -18
  286. data/ext/ice/cpp/src/Ice/Instrumentation.cpp +106 -7
  287. data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +27 -5
  288. data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +117 -99
  289. data/ext/ice/cpp/src/Ice/InstrumentationI.h +30 -31
  290. data/ext/ice/cpp/src/Ice/LocalException.cpp +1190 -416
  291. data/ext/ice/cpp/src/Ice/LocalObject.cpp +1 -2
  292. data/ext/ice/cpp/src/Ice/Locator.cpp +1167 -1215
  293. data/ext/ice/cpp/src/Ice/LocatorF.cpp +29 -6
  294. data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +129 -163
  295. data/ext/ice/cpp/src/Ice/LocatorInfo.h +29 -29
  296. data/ext/ice/cpp/src/Ice/LocatorInfoF.h +1 -1
  297. data/ext/ice/cpp/src/Ice/Logger.cpp +35 -5
  298. data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +178 -73
  299. data/ext/ice/cpp/src/Ice/LoggerAdminI.h +4 -4
  300. data/ext/ice/cpp/src/Ice/LoggerF.cpp +27 -5
  301. data/ext/ice/cpp/src/Ice/LoggerI.cpp +14 -44
  302. data/ext/ice/cpp/src/Ice/LoggerI.h +7 -13
  303. data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +10 -12
  304. data/ext/ice/cpp/src/Ice/Metrics.cpp +1059 -1069
  305. data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +49 -19
  306. data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +1 -2
  307. data/ext/ice/cpp/src/Ice/Network.cpp +534 -170
  308. data/ext/ice/cpp/src/Ice/Network.h +100 -23
  309. data/ext/ice/cpp/src/Ice/NetworkF.h +2 -2
  310. data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +21 -14
  311. data/ext/ice/cpp/src/Ice/NetworkProxy.h +5 -2
  312. data/ext/ice/cpp/src/Ice/NetworkProxyF.h +1 -1
  313. data/ext/ice/cpp/src/Ice/Object.cpp +217 -221
  314. data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -6
  315. data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +27 -5
  316. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +35 -14
  317. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +13 -7
  318. data/ext/ice/cpp/{include → src}/Ice/ObjectAdapterFactoryF.h +5 -1
  319. data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +184 -58
  320. data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +32 -26
  321. data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +37 -6
  322. data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +9 -32
  323. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +40 -18
  324. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +14 -5
  325. data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +803 -365
  326. data/ext/ice/cpp/src/Ice/OutputStream.cpp +1399 -0
  327. data/ext/ice/cpp/src/Ice/Plugin.cpp +45 -6
  328. data/ext/ice/cpp/src/Ice/PluginF.cpp +27 -5
  329. data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +13 -13
  330. data/ext/ice/cpp/src/Ice/PluginManagerI.h +5 -6
  331. data/ext/ice/cpp/src/Ice/Process.cpp +256 -114
  332. data/ext/ice/cpp/src/Ice/ProcessF.cpp +29 -6
  333. data/ext/ice/cpp/src/Ice/Properties.cpp +38 -8
  334. data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +340 -328
  335. data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +81 -17
  336. data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +29 -5
  337. data/ext/ice/cpp/src/Ice/PropertiesF.cpp +29 -6
  338. data/ext/ice/cpp/src/Ice/PropertiesI.cpp +25 -26
  339. data/ext/ice/cpp/src/Ice/PropertiesI.h +8 -11
  340. data/ext/ice/cpp/src/Ice/PropertyNames.cpp +107 -50
  341. data/ext/ice/cpp/src/Ice/PropertyNames.h +4 -2
  342. data/ext/ice/cpp/src/Ice/Protocol.cpp +2 -2
  343. data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +37 -2
  344. data/ext/ice/cpp/src/Ice/ProtocolInstance.h +9 -20
  345. data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +1 -1
  346. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +6 -1
  347. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +3 -1
  348. data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +1 -1
  349. data/ext/ice/cpp/src/Ice/Proxy.cpp +690 -964
  350. data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +23 -32
  351. data/ext/ice/cpp/src/Ice/ProxyFactory.h +16 -11
  352. data/ext/ice/cpp/src/Ice/Reference.cpp +75 -69
  353. data/ext/ice/cpp/src/Ice/Reference.h +27 -22
  354. data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +18 -21
  355. data/ext/ice/cpp/src/Ice/ReferenceFactory.h +12 -12
  356. data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +1 -1
  357. data/ext/ice/cpp/src/Ice/RegisterPluginsInit.cpp +18 -4
  358. data/ext/ice/cpp/src/Ice/RegisterPluginsInit.h +1 -1
  359. data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +672 -552
  360. data/ext/ice/cpp/src/Ice/ReplyStatus.h +1 -1
  361. data/ext/ice/cpp/src/Ice/RequestHandler.cpp +5 -3
  362. data/ext/ice/cpp/src/Ice/RequestHandler.h +10 -13
  363. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +10 -6
  364. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +2 -2
  365. data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +3 -6
  366. data/ext/ice/cpp/src/Ice/ResponseHandler.h +16 -7
  367. data/ext/ice/cpp/src/Ice/RetryQueue.cpp +6 -12
  368. data/ext/ice/cpp/src/Ice/RetryQueue.h +7 -6
  369. data/ext/ice/cpp/src/Ice/RetryQueueF.h +1 -1
  370. data/ext/ice/cpp/src/Ice/Router.cpp +523 -474
  371. data/ext/ice/cpp/src/Ice/RouterF.cpp +29 -6
  372. data/ext/ice/cpp/src/Ice/RouterInfo.cpp +91 -70
  373. data/ext/ice/cpp/src/Ice/RouterInfo.h +43 -32
  374. data/ext/ice/cpp/src/Ice/RouterInfoF.h +1 -1
  375. data/ext/ice/cpp/src/{IceUtil → Ice}/SHA1.cpp +21 -21
  376. data/ext/ice/cpp/src/Ice/Selector.cpp +989 -923
  377. data/ext/ice/cpp/src/Ice/Selector.h +100 -147
  378. data/ext/ice/cpp/src/Ice/ServantLocator.cpp +37 -6
  379. data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +27 -5
  380. data/ext/ice/cpp/src/Ice/ServantManager.cpp +9 -9
  381. data/ext/ice/cpp/src/Ice/ServantManager.h +1 -1
  382. data/ext/ice/cpp/src/Ice/SharedContext.h +2 -2
  383. data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +20 -6
  384. data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +2 -2
  385. data/ext/ice/cpp/src/Ice/SlicedData.cpp +72 -20
  386. data/ext/ice/cpp/src/Ice/StreamSocket.cpp +173 -18
  387. data/ext/ice/cpp/src/Ice/StreamSocket.h +13 -4
  388. data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +48 -17
  389. data/ext/ice/cpp/src/Ice/StringUtil.h +35 -0
  390. data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +8 -4
  391. data/ext/ice/cpp/src/Ice/SysLoggerI.h +2 -3
  392. data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +158 -32
  393. data/ext/ice/cpp/src/Ice/TcpAcceptor.h +12 -5
  394. data/ext/ice/cpp/src/Ice/TcpConnector.cpp +1 -7
  395. data/ext/ice/cpp/src/Ice/TcpConnector.h +1 -2
  396. data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +40 -32
  397. data/ext/ice/cpp/src/Ice/TcpEndpointI.h +11 -8
  398. data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +12 -27
  399. data/ext/ice/cpp/src/Ice/TcpTransceiver.h +7 -10
  400. data/ext/ice/cpp/src/{IceUtil → Ice}/Thread.cpp +24 -41
  401. data/ext/ice/cpp/src/Ice/ThreadPool.cpp +175 -267
  402. data/ext/ice/cpp/src/Ice/ThreadPool.h +38 -43
  403. data/ext/ice/cpp/src/{IceUtil → Ice}/Timer.cpp +28 -21
  404. data/ext/ice/cpp/src/Ice/TraceLevels.cpp +2 -2
  405. data/ext/ice/cpp/src/Ice/TraceLevels.h +1 -1
  406. data/ext/ice/cpp/src/Ice/TraceLevelsF.h +2 -2
  407. data/ext/ice/cpp/src/Ice/TraceUtil.cpp +53 -31
  408. data/ext/ice/cpp/src/Ice/TraceUtil.h +13 -6
  409. data/ext/ice/cpp/src/Ice/Transceiver.cpp +1 -2
  410. data/ext/ice/cpp/src/Ice/Transceiver.h +8 -7
  411. data/ext/ice/cpp/src/Ice/TransceiverF.h +1 -1
  412. data/ext/ice/cpp/src/Ice/UdpConnector.cpp +2 -8
  413. data/ext/ice/cpp/src/Ice/UdpConnector.h +1 -2
  414. data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +92 -31
  415. data/ext/ice/cpp/src/Ice/UdpEndpointI.h +12 -4
  416. data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +150 -179
  417. data/ext/ice/cpp/src/Ice/UdpTransceiver.h +15 -17
  418. data/ext/ice/cpp/src/Ice/Value.cpp +81 -0
  419. data/ext/ice/cpp/src/Ice/ValueFactory.cpp +84 -0
  420. data/ext/ice/cpp/src/Ice/ValueFactoryManagerI.cpp +70 -0
  421. data/ext/ice/cpp/src/Ice/ValueFactoryManagerI.h +42 -0
  422. data/ext/ice/cpp/src/Ice/Version.cpp +24 -14
  423. data/ext/ice/cpp/src/Ice/VirtualShared.h +43 -0
  424. data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +3 -9
  425. data/ext/ice/cpp/src/Ice/WSAcceptor.h +3 -7
  426. data/ext/ice/cpp/src/Ice/WSConnector.cpp +5 -11
  427. data/ext/ice/cpp/src/Ice/WSConnector.h +3 -6
  428. data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +185 -80
  429. data/ext/ice/cpp/src/Ice/WSEndpoint.h +21 -31
  430. data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +41 -37
  431. data/ext/ice/cpp/src/Ice/WSTransceiver.h +7 -21
  432. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +526 -264
  433. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +341 -455
  434. data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +86 -26
  435. data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +59 -23
  436. data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +315 -61
  437. data/ext/ice/cpp/src/IceDiscovery/LookupI.h +83 -36
  438. data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +57 -59
  439. data/ext/ice/cpp/src/IceDiscovery/PluginI.h +3 -3
  440. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.cpp +396 -159
  441. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.h +251 -355
  442. data/ext/ice/cpp/src/IceLocatorDiscovery/Plugin.h +52 -0
  443. data/ext/ice/cpp/src/IceLocatorDiscovery/PluginI.cpp +526 -131
  444. data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +19 -165
  445. data/ext/ice/cpp/src/IceSSL/AcceptorI.h +8 -17
  446. data/ext/ice/cpp/src/IceSSL/CertificateI.cpp +284 -0
  447. data/ext/ice/cpp/src/IceSSL/CertificateI.h +69 -0
  448. data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +39 -11
  449. data/ext/ice/cpp/src/{Ice/ObjectFactoryF.cpp → IceSSL/ConnectionInfoF.cpp} +31 -9
  450. data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +14 -56
  451. data/ext/ice/cpp/src/IceSSL/ConnectorI.h +6 -13
  452. data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +205 -197
  453. data/ext/ice/cpp/src/IceSSL/EndpointI.h +41 -33
  454. data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +39 -10
  455. data/ext/ice/cpp/src/IceSSL/Instance.cpp +1 -6
  456. data/ext/ice/cpp/src/IceSSL/Instance.h +7 -7
  457. data/ext/ice/cpp/src/IceSSL/InstanceF.h +11 -7
  458. data/ext/ice/cpp/src/IceSSL/OpenSSLCertificateI.cpp +588 -0
  459. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +117 -152
  460. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.h +64 -0
  461. data/ext/ice/cpp/src/IceSSL/OpenSSLEngineF.h +32 -0
  462. data/ext/ice/cpp/src/IceSSL/OpenSSLPluginI.cpp +132 -0
  463. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +400 -89
  464. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +36 -21
  465. data/ext/ice/cpp/src/IceSSL/OpenSSLUtil.cpp +291 -0
  466. data/ext/ice/cpp/src/IceSSL/OpenSSLUtil.h +63 -0
  467. data/ext/ice/cpp/src/IceSSL/PluginI.cpp +71 -41
  468. data/ext/ice/cpp/src/IceSSL/PluginI.h +13 -18
  469. data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +9 -54
  470. data/ext/ice/cpp/src/IceSSL/RFC2253.h +7 -7
  471. data/ext/ice/cpp/src/IceSSL/SChannelCertificateI.cpp +585 -0
  472. data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +491 -75
  473. data/ext/ice/cpp/src/IceSSL/SChannelEngine.h +126 -0
  474. data/ext/ice/cpp/src/IceSSL/SChannelEngineF.h +32 -0
  475. data/ext/ice/cpp/src/IceSSL/SChannelPluginI.cpp +78 -0
  476. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +126 -169
  477. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +19 -22
  478. data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +79 -74
  479. data/ext/ice/cpp/src/IceSSL/SSLEngine.h +24 -187
  480. data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +4 -19
  481. data/ext/ice/cpp/src/IceSSL/SecureTransportCertificateI.cpp +862 -0
  482. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +56 -214
  483. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.h +60 -0
  484. data/ext/ice/cpp/src/IceSSL/SecureTransportEngineF.h +31 -0
  485. data/ext/ice/cpp/src/IceSSL/SecureTransportPluginI.cpp +80 -0
  486. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +137 -144
  487. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +25 -28
  488. data/ext/ice/cpp/src/IceSSL/SecureTransportUtil.cpp +857 -0
  489. data/ext/ice/cpp/src/IceSSL/SecureTransportUtil.h +46 -0
  490. data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +9 -13
  491. data/ext/ice/cpp/src/IceSSL/TrustManager.h +4 -4
  492. data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +3 -3
  493. data/ext/ice/cpp/src/IceSSL/UWPCertificateI.cpp +271 -0
  494. data/ext/ice/cpp/src/IceSSL/UWPEngine.cpp +343 -0
  495. data/ext/ice/cpp/src/IceSSL/UWPEngine.h +46 -0
  496. data/ext/ice/cpp/{include/Ice/ObjectFactoryManagerF.h → src/IceSSL/UWPEngineF.h} +13 -8
  497. data/ext/ice/cpp/src/IceSSL/UWPPluginI.cpp +94 -0
  498. data/ext/ice/cpp/src/IceSSL/UWPTransceiverI.cpp +388 -0
  499. data/ext/ice/cpp/src/IceSSL/UWPTransceiverI.h +76 -0
  500. data/ext/ice/cpp/src/IceSSL/Util.cpp +66 -1256
  501. data/ext/ice/cpp/src/IceSSL/Util.h +48 -137
  502. data/ext/ice/cpp/src/IceUtil/ConsoleUtil.cpp +162 -0
  503. data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +22 -22
  504. data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +34 -26
  505. data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +20 -31
  506. data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +25 -116
  507. data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +1 -1
  508. data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +1 -1
  509. data/ext/ice/cpp/src/IceUtil/Options.cpp +23 -46
  510. data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +7 -6
  511. data/ext/ice/cpp/src/IceUtil/Random.cpp +13 -13
  512. data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +3 -9
  513. data/ext/ice/cpp/src/IceUtil/Shared.cpp +8 -3
  514. data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +501 -264
  515. data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +540 -235
  516. data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +37 -74
  517. data/ext/ice/cpp/src/IceUtil/Time.cpp +1 -1
  518. data/ext/ice/cpp/src/IceUtil/UUID.cpp +10 -10
  519. data/ext/ice/cpp/src/IceUtil/Unicode.cpp +98 -97
  520. data/ext/ice/cpp/src/IceUtil/Unicode.h +21 -35
  521. data/ext/ice/cpp/src/IceUtil/UtilException.cpp +838 -0
  522. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +815 -163
  523. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.h +76 -0
  524. data/ext/ice/cpp/src/Slice/Checksum.cpp +2 -2
  525. data/ext/ice/cpp/{include → src}/Slice/Checksum.h +2 -2
  526. data/ext/ice/cpp/src/Slice/FileTracker.cpp +25 -78
  527. data/ext/ice/cpp/{include → src}/Slice/FileTracker.h +9 -9
  528. data/ext/ice/cpp/src/Slice/Grammar.cpp +1994 -1943
  529. data/ext/ice/cpp/src/Slice/Grammar.h +44 -24
  530. data/ext/ice/cpp/src/Slice/GrammarUtil.h +14 -14
  531. data/ext/ice/cpp/src/Slice/JavaUtil.cpp +2658 -1927
  532. data/ext/ice/cpp/{include → src}/Slice/JavaUtil.h +178 -59
  533. data/ext/ice/cpp/src/Slice/MD5.cpp +1 -1
  534. data/ext/ice/cpp/src/Slice/MD5.h +1 -1
  535. data/ext/ice/cpp/src/Slice/MD5I.cpp +0 -1
  536. data/ext/ice/cpp/src/Slice/MD5I.h +1 -1
  537. data/ext/ice/cpp/src/Slice/PHPUtil.cpp +12 -15
  538. data/ext/ice/cpp/{include → src}/Slice/PHPUtil.h +6 -15
  539. data/ext/ice/cpp/src/Slice/Parser.cpp +802 -307
  540. data/ext/ice/cpp/{include → src}/Slice/Parser.h +76 -84
  541. data/ext/ice/cpp/src/Slice/Preprocessor.cpp +43 -21
  542. data/ext/ice/cpp/{include → src}/Slice/Preprocessor.h +7 -12
  543. data/ext/ice/cpp/src/Slice/Python.cpp +207 -86
  544. data/ext/ice/cpp/src/Slice/PythonUtil.cpp +683 -679
  545. data/ext/ice/cpp/{include → src}/Slice/PythonUtil.h +19 -8
  546. data/ext/ice/cpp/src/Slice/Ruby.cpp +38 -34
  547. data/ext/ice/cpp/src/Slice/RubyUtil.cpp +177 -445
  548. data/ext/ice/cpp/{include → src}/Slice/RubyUtil.h +6 -6
  549. data/ext/ice/cpp/src/Slice/Scanner.cpp +218 -306
  550. data/ext/ice/cpp/src/Slice/{Util.cpp → SliceUtil.cpp} +37 -64
  551. data/ext/ice/cpp/src/Slice/StringLiteralUtil.cpp +374 -0
  552. data/ext/ice/cpp/src/Slice/Util.h +54 -0
  553. data/ext/ice/mcpp/Makefile +5 -2
  554. data/ice.gemspec +2 -7
  555. data/lib/Glacier2.rb +1 -1
  556. data/lib/Glacier2/Metrics.rb +7 -46
  557. data/lib/Glacier2/PermissionsVerifier.rb +24 -95
  558. data/lib/Glacier2/PermissionsVerifierF.rb +3 -3
  559. data/lib/Glacier2/Router.rb +32 -74
  560. data/lib/Glacier2/RouterF.rb +3 -3
  561. data/lib/Glacier2/SSLInfo.rb +4 -7
  562. data/lib/Glacier2/Session.rb +88 -307
  563. data/lib/Ice.rb +83 -52
  564. data/lib/Ice/BuiltinSequences.rb +4 -4
  565. data/lib/Ice/Communicator.rb +56 -58
  566. data/lib/Ice/CommunicatorF.rb +3 -3
  567. data/lib/Ice/Connection.rb +153 -162
  568. data/lib/Ice/ConnectionF.rb +3 -3
  569. data/lib/Ice/Current.rb +4 -11
  570. data/lib/Ice/Endpoint.rb +57 -133
  571. data/lib/Ice/EndpointF.rb +3 -3
  572. data/lib/Ice/EndpointTypes.rb +3 -7
  573. data/lib/Ice/FacetMap.rb +4 -4
  574. data/lib/Ice/Identity.rb +5 -8
  575. data/lib/Ice/ImplicitContext.rb +5 -34
  576. data/lib/Ice/ImplicitContextF.rb +3 -3
  577. data/lib/Ice/Instrumentation.rb +23 -275
  578. data/lib/Ice/InstrumentationF.rb +3 -3
  579. data/lib/Ice/LocalException.rb +95 -141
  580. data/lib/Ice/Locator.rb +51 -165
  581. data/lib/Ice/LocatorF.rb +3 -3
  582. data/lib/Ice/Logger.rb +5 -34
  583. data/lib/Ice/LoggerF.rb +3 -3
  584. data/lib/Ice/Metrics.rb +61 -416
  585. data/lib/Ice/ObjectAdapter.rb +34 -0
  586. data/lib/Ice/ObjectAdapterF.rb +3 -3
  587. data/lib/Ice/ObjectFactory.rb +5 -30
  588. data/lib/Ice/Plugin.rb +7 -60
  589. data/lib/Ice/PluginF.rb +3 -3
  590. data/lib/Ice/Process.rb +16 -52
  591. data/lib/Ice/ProcessF.rb +3 -3
  592. data/lib/Ice/Properties.rb +5 -41
  593. data/lib/Ice/PropertiesAdmin.rb +19 -56
  594. data/lib/Ice/PropertiesF.rb +3 -3
  595. data/lib/Ice/RemoteLogger.rb +34 -115
  596. data/lib/Ice/Router.rb +29 -101
  597. data/lib/Ice/RouterF.rb +3 -3
  598. data/lib/Ice/ServantLocator.rb +31 -0
  599. data/lib/Ice/{ObjectFactoryF.rb → ServantLocatorF.rb} +6 -6
  600. data/lib/Ice/SliceChecksumDict.rb +3 -3
  601. data/lib/Ice/ValueFactory.rb +33 -0
  602. data/lib/Ice/Version.rb +5 -11
  603. data/lib/IceBox.rb +1 -1
  604. data/lib/IceBox/IceBox.rb +44 -148
  605. data/lib/IceGrid.rb +1 -4
  606. data/lib/IceGrid/Admin.rb +551 -427
  607. data/lib/IceGrid/Descriptor.rb +62 -529
  608. data/lib/IceGrid/Exception.rb +24 -45
  609. data/lib/IceGrid/FileParser.rb +14 -50
  610. data/lib/IceGrid/PluginFacade.rb +40 -0
  611. data/lib/IceGrid/Registry.rb +151 -58
  612. data/lib/IceGrid/Session.rb +25 -64
  613. data/lib/IceGrid/UserAccountMapper.rb +14 -50
  614. data/lib/IcePatch2.rb +1 -1
  615. data/lib/IcePatch2/FileInfo.rb +5 -11
  616. data/lib/IcePatch2/FileServer.rb +33 -76
  617. data/lib/IceStorm.rb +1 -1
  618. data/lib/IceStorm/IceStorm.rb +79 -206
  619. data/lib/IceStorm/Metrics.rb +11 -89
  620. data/slice/Glacier2/Metrics.ice +8 -4
  621. data/slice/Glacier2/PermissionsVerifier.ice +10 -7
  622. data/slice/Glacier2/PermissionsVerifierF.ice +7 -4
  623. data/slice/Glacier2/Router.ice +10 -8
  624. data/slice/Glacier2/RouterF.ice +7 -4
  625. data/slice/Glacier2/SSLInfo.ice +8 -5
  626. data/slice/Glacier2/Session.ice +15 -13
  627. data/slice/Ice/BuiltinSequences.ice +7 -4
  628. data/slice/Ice/Communicator.ice +141 -66
  629. data/slice/Ice/CommunicatorF.ice +7 -4
  630. data/slice/Ice/Connection.ice +183 -86
  631. data/slice/Ice/ConnectionF.ice +7 -4
  632. data/slice/Ice/Current.ice +13 -9
  633. data/slice/Ice/Endpoint.ice +63 -14
  634. data/slice/Ice/EndpointF.ice +7 -4
  635. data/slice/Ice/EndpointTypes.ice +8 -6
  636. data/slice/Ice/FacetMap.ice +7 -4
  637. data/slice/Ice/Identity.ice +13 -5
  638. data/slice/Ice/ImplicitContext.ice +20 -18
  639. data/slice/Ice/ImplicitContextF.ice +7 -4
  640. data/slice/Ice/Instrumentation.ice +20 -19
  641. data/slice/Ice/InstrumentationF.ice +8 -5
  642. data/slice/Ice/LocalException.ice +87 -87
  643. data/slice/Ice/Locator.ice +19 -18
  644. data/slice/Ice/LocatorF.ice +7 -4
  645. data/slice/Ice/Logger.ice +9 -7
  646. data/slice/Ice/LoggerF.ice +7 -4
  647. data/slice/Ice/Metrics.ice +18 -14
  648. data/slice/Ice/ObjectAdapter.ice +30 -13
  649. data/slice/Ice/ObjectAdapterF.ice +7 -4
  650. data/slice/Ice/ObjectFactory.ice +15 -12
  651. data/slice/Ice/Plugin.ice +9 -6
  652. data/slice/Ice/PluginF.ice +8 -5
  653. data/slice/Ice/Process.ice +9 -6
  654. data/slice/Ice/ProcessF.ice +7 -4
  655. data/slice/Ice/Properties.ice +15 -12
  656. data/slice/Ice/PropertiesAdmin.ice +9 -5
  657. data/slice/Ice/PropertiesF.ice +7 -4
  658. data/slice/Ice/RemoteLogger.ice +33 -24
  659. data/slice/Ice/Router.ice +16 -7
  660. data/slice/Ice/RouterF.ice +7 -4
  661. data/slice/Ice/ServantLocator.ice +13 -10
  662. data/slice/Ice/ServantLocatorF.ice +7 -4
  663. data/slice/Ice/SliceChecksumDict.ice +7 -4
  664. data/slice/Ice/ValueFactory.ice +127 -0
  665. data/slice/Ice/Version.ice +9 -5
  666. data/slice/IceBT/ConnectionInfo.ice +53 -0
  667. data/slice/IceBT/EndpointInfo.ice +51 -0
  668. data/slice/IceBT/Types.ice +39 -0
  669. data/slice/IceBox/IceBox.ice +20 -21
  670. data/slice/IceDiscovery/IceDiscovery.ice +9 -5
  671. data/slice/IceGrid/Admin.ice +390 -30
  672. data/slice/IceGrid/Descriptor.ice +37 -29
  673. data/slice/IceGrid/Exception.ice +33 -27
  674. data/slice/IceGrid/FileParser.ice +9 -6
  675. data/slice/IceGrid/PluginFacade.ice +11 -9
  676. data/slice/IceGrid/Registry.ice +139 -16
  677. data/slice/IceGrid/Session.ice +10 -8
  678. data/slice/IceGrid/UserAccountMapper.ice +9 -6
  679. data/slice/IceIAP/ConnectionInfo.ice +70 -0
  680. data/slice/IceIAP/EndpointInfo.ice +64 -0
  681. data/slice/IceLocatorDiscovery/IceLocatorDiscovery.ice +9 -7
  682. data/slice/IcePatch2/FileInfo.ice +9 -8
  683. data/slice/IcePatch2/FileServer.ice +17 -13
  684. data/slice/IceSSL/ConnectionInfo.ice +14 -17
  685. data/slice/IceSSL/ConnectionInfoF.ice +24 -0
  686. data/slice/IceSSL/EndpointInfo.ice +9 -30
  687. data/slice/IceStorm/IceStorm.ice +22 -18
  688. data/slice/IceStorm/Metrics.ice +9 -5
  689. metadata +154 -120
  690. data/ext/ObjectFactory.cpp +0 -140
  691. data/ext/ObjectFactory.h +0 -50
  692. data/ext/ice/cpp/include/Ice/BasicStream.h +0 -1335
  693. data/ext/ice/cpp/include/Ice/Communicator.h +0 -200
  694. data/ext/ice/cpp/include/Ice/Connection.h +0 -497
  695. data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +0 -62
  696. data/ext/ice/cpp/include/Ice/Endpoint.h +0 -341
  697. data/ext/ice/cpp/include/Ice/Identity.h +0 -168
  698. data/ext/ice/cpp/include/Ice/Instrumentation.h +0 -365
  699. data/ext/ice/cpp/include/Ice/LocalException.h +0 -1030
  700. data/ext/ice/cpp/include/Ice/Locator.h +0 -2193
  701. data/ext/ice/cpp/include/Ice/Metrics.h +0 -2974
  702. data/ext/ice/cpp/include/Ice/ObjectAdapter.h +0 -168
  703. data/ext/ice/cpp/include/Ice/ObjectFactory.h +0 -92
  704. data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +0 -66
  705. data/ext/ice/cpp/include/Ice/Outgoing.h +0 -225
  706. data/ext/ice/cpp/include/Ice/Plugin.h +0 -125
  707. data/ext/ice/cpp/include/Ice/Process.h +0 -574
  708. data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +0 -830
  709. data/ext/ice/cpp/include/Ice/RemoteLogger.h +0 -1500
  710. data/ext/ice/cpp/include/Ice/Router.h +0 -1159
  711. data/ext/ice/cpp/include/Ice/Stream.h +0 -447
  712. data/ext/ice/cpp/include/Ice/StreamF.h +0 -30
  713. data/ext/ice/cpp/include/Ice/Version.h +0 -262
  714. data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +0 -158
  715. data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +0 -142
  716. data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +0 -119
  717. data/ext/ice/cpp/include/IceUtil/Cache.h +0 -362
  718. data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +0 -65
  719. data/ext/ice/cpp/include/Slice/CsUtil.h +0 -92
  720. data/ext/ice/cpp/include/Slice/DotNetNames.h +0 -34
  721. data/ext/ice/cpp/include/Slice/ObjCUtil.h +0 -127
  722. data/ext/ice/cpp/include/Slice/Util.h +0 -56
  723. data/ext/ice/cpp/src/Ice/BasicStream.cpp +0 -3428
  724. data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +0 -62
  725. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +0 -139
  726. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +0 -43
  727. data/ext/ice/cpp/src/Ice/Outgoing.cpp +0 -694
  728. data/ext/ice/cpp/src/Ice/Stream.cpp +0 -53
  729. data/ext/ice/cpp/src/Ice/StreamI.cpp +0 -832
  730. data/ext/ice/cpp/src/Ice/StreamI.h +0 -198
  731. data/ext/ice/cpp/src/IceSSL/Certificate.cpp +0 -1336
  732. data/ext/ice/cpp/src/IceUtil/Exception.cpp +0 -792
  733. data/ext/ice/cpp/src/IceUtil/FileUtil.h +0 -185
  734. data/ext/ice/cpp/src/Slice/CsUtil.cpp +0 -2660
  735. data/ext/ice/cpp/src/Slice/DotNetNames.cpp +0 -146
  736. data/ext/ice/cpp/src/Slice/ObjCUtil.cpp +0 -1310
  737. data/lib/IceGrid/Locator.rb +0 -106
  738. data/lib/IceGrid/Observer.rb +0 -572
  739. data/lib/IceGrid/Query.rb +0 -169
  740. data/slice/Freeze/BackgroundSaveEvictor.ice +0 -111
  741. data/slice/Freeze/CatalogData.ice +0 -49
  742. data/slice/Freeze/Connection.ice +0 -121
  743. data/slice/Freeze/DB.ice +0 -37
  744. data/slice/Freeze/Evictor.ice +0 -346
  745. data/slice/Freeze/EvictorF.ice +0 -22
  746. data/slice/Freeze/EvictorStorage.ice +0 -72
  747. data/slice/Freeze/Exception.ice +0 -100
  748. data/slice/Freeze/Transaction.ice +0 -58
  749. data/slice/Freeze/TransactionalEvictor.ice +0 -50
  750. data/slice/IceGrid/Locator.ice +0 -57
  751. data/slice/IceGrid/Observer.ice +0 -395
  752. data/slice/IceGrid/Query.ice +0 -131
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2018 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -23,7 +23,7 @@ using namespace Ice;
23
23
  using namespace IceInternal;
24
24
  using namespace IceMX;
25
25
 
26
- namespace
26
+ namespace
27
27
  {
28
28
 
29
29
  const string suffixes[] =
@@ -80,7 +80,7 @@ parseRule(const PropertiesPtr& properties, const string& name)
80
80
  {
81
81
  try
82
82
  {
83
- regexps.push_back(new MetricsMapI::RegExp(p->first.substr(name.length() + 1), p->second));
83
+ regexps.push_back(ICE_MAKE_SHARED(MetricsMapI::RegExp, p->first.substr(name.length() + 1), p->second));
84
84
  }
85
85
  catch(const std::exception&)
86
86
  {
@@ -99,10 +99,10 @@ MetricsMapI::RegExp::RegExp(const string& attribute, const string& regexp) : _at
99
99
  // No regexp support with MinGW, when MinGW C++11 mode is not experimental
100
100
  // we can use std::regex.
101
101
  //
102
- #elif !defined(ICE_CPP11_REGEXP)
102
+ #elif !defined(ICE_CPP11_COMPILER_REGEXP)
103
103
  if(regcomp(&_preg, regexp.c_str(), REG_EXTENDED | REG_NOSUB) != 0)
104
104
  {
105
- throw SyscallException(__FILE__, __LINE__);
105
+ throw SyscallException(__FILE__, __LINE__);
106
106
  }
107
107
  #else
108
108
  # if _MSC_VER < 1600
@@ -120,7 +120,7 @@ MetricsMapI::RegExp::~RegExp()
120
120
  // No regexp support with MinGW, when MinGW C++11 mode is not experimental
121
121
  // we can use std::regex.
122
122
  //
123
- #elif !defined(ICE_CPP11_REGEXP)
123
+ #elif !defined(ICE_CPP11_COMPILER_REGEXP)
124
124
  regfree(&_preg);
125
125
  #endif
126
126
  }
@@ -134,7 +134,7 @@ MetricsMapI::RegExp::match(const string& value)
134
134
  // we can use std::regex.
135
135
  //
136
136
  return false;
137
- #elif !defined(ICE_CPP11_REGEXP)
137
+ #elif !defined(ICE_CPP11_COMPILER_REGEXP)
138
138
  return regexec(&_preg, value.c_str(), 0, 0, 0) == 0;
139
139
  #else
140
140
  # if _MSC_VER < 1600
@@ -145,6 +145,11 @@ MetricsMapI::RegExp::match(const string& value)
145
145
  #endif
146
146
  }
147
147
 
148
+ MetricsMapI::~MetricsMapI()
149
+ {
150
+ // Out of line to avoid weak vtable
151
+ }
152
+
148
153
  MetricsMapI::MetricsMapI(const std::string& mapPrefix, const PropertiesPtr& properties) :
149
154
  _properties(properties->getPropertiesForPrefix(mapPrefix)),
150
155
  _retain(properties->getPropertyAsIntWithDefault(mapPrefix + "RetainDetached", 10)),
@@ -164,7 +169,7 @@ MetricsMapI::MetricsMapI(const std::string& mapPrefix, const PropertiesPtr& prop
164
169
  {
165
170
  groupByAttributes.push_back("");
166
171
  }
167
-
172
+
168
173
  for(string::const_iterator p = groupBy.begin(); p != groupBy.end(); ++p)
169
174
  {
170
175
  bool isAlphaNum = IceUtilInternal::isAlpha(*p) || IceUtilInternal::isDigit(*p) || *p == '.';
@@ -213,6 +218,11 @@ MetricsMapI::getProperties() const
213
218
  return _properties;
214
219
  }
215
220
 
221
+ MetricsMapFactory::~MetricsMapFactory()
222
+ {
223
+ // Out of line to avoid weak vtable
224
+ }
225
+
216
226
  MetricsMapFactory::MetricsMapFactory(Updater* updater) : _updater(updater)
217
227
  {
218
228
  }
@@ -223,7 +233,7 @@ MetricsMapFactory::update()
223
233
  assert(_updater);
224
234
  _updater->update();
225
235
  }
226
-
236
+
227
237
  MetricsViewI::MetricsViewI(const string& name) : _name(name)
228
238
  {
229
239
  }
@@ -238,7 +248,7 @@ MetricsViewI::destroy()
238
248
  }
239
249
 
240
250
  bool
241
- MetricsViewI::addOrUpdateMap(const PropertiesPtr& properties, const string& mapName,
251
+ MetricsViewI::addOrUpdateMap(const PropertiesPtr& properties, const string& mapName,
242
252
  const MetricsMapFactoryPtr& factory, const ::Ice::LoggerPtr& logger)
243
253
  {
244
254
  const string viewPrefix = "IceMX.Metrics." + _name + ".";
@@ -378,10 +388,10 @@ MetricsViewI::getMap(const string& mapName) const
378
388
  {
379
389
  return p->second;
380
390
  }
381
- return 0;
391
+ return ICE_NULLPTR;
382
392
  }
383
393
 
384
- MetricsAdminI::MetricsAdminI(const PropertiesPtr& properties, const LoggerPtr& logger) :
394
+ MetricsAdminI::MetricsAdminI(const PropertiesPtr& properties, const LoggerPtr& logger) :
385
395
  _logger(logger), _properties(properties)
386
396
  {
387
397
  updateViews();
@@ -439,7 +449,7 @@ MetricsAdminI::updateViews()
439
449
  map<string, MetricsViewIPtr>::const_iterator q = _views.find(viewName);
440
450
  if(q == _views.end())
441
451
  {
442
- q = views.insert(map<string, MetricsViewIPtr>::value_type(viewName, new MetricsViewI(viewName))).first;
452
+ q = views.insert(map<string, MetricsViewIPtr>::value_type(viewName, ICE_MAKE_SHARED(MetricsViewI, viewName))).first;
443
453
  }
444
454
  else
445
455
  {
@@ -455,7 +465,7 @@ MetricsAdminI::updateViews()
455
465
  }
456
466
  }
457
467
  _views.swap(views);
458
-
468
+
459
469
  //
460
470
  // Go through removed views to collect maps to update.
461
471
  //
@@ -472,7 +482,7 @@ MetricsAdminI::updateViews()
472
482
  }
473
483
  }
474
484
  }
475
-
485
+
476
486
  //
477
487
  // Call the updaters to update the maps.
478
488
  //
@@ -523,13 +533,17 @@ MetricsAdminI::getMetricsViewNames(Ice::StringSeq& disabledViews, const Current&
523
533
 
524
534
  #else
525
535
  disabledViews.insert(disabledViews.end(), _disabledViews.begin(), _disabledViews.end());
526
- #endif
536
+ #endif
527
537
 
528
538
  return enabledViews;
529
539
  }
530
540
 
531
541
  void
542
+ #ifdef ICE_CPP11_MAPPING
543
+ MetricsAdminI::enableMetricsView(string viewName, const Current&)
544
+ #else
532
545
  MetricsAdminI::enableMetricsView(const string& viewName, const Current&)
546
+ #endif
533
547
  {
534
548
  {
535
549
  Lock sync(*this);
@@ -540,7 +554,11 @@ MetricsAdminI::enableMetricsView(const string& viewName, const Current&)
540
554
  }
541
555
 
542
556
  void
557
+ #ifdef ICE_CPP11_MAPPING
558
+ MetricsAdminI::disableMetricsView(string viewName, const Current&)
559
+ #else
543
560
  MetricsAdminI::disableMetricsView(const string& viewName, const Current&)
561
+ #endif
544
562
  {
545
563
  {
546
564
  Lock sync(*this);
@@ -551,7 +569,11 @@ MetricsAdminI::disableMetricsView(const string& viewName, const Current&)
551
569
  }
552
570
 
553
571
  MetricsView
572
+ #ifdef ICE_CPP11_MAPPING
573
+ MetricsAdminI::getMetricsView(string viewName, ::Ice::Long& timestamp, const Current&)
574
+ #else
554
575
  MetricsAdminI::getMetricsView(const string& viewName, ::Ice::Long& timestamp, const Current&)
576
+ #endif
555
577
  {
556
578
  Lock sync(*this);
557
579
  MetricsViewIPtr view = getMetricsView(viewName);
@@ -564,7 +586,11 @@ MetricsAdminI::getMetricsView(const string& viewName, ::Ice::Long& timestamp, co
564
586
  }
565
587
 
566
588
  MetricsFailuresSeq
589
+ #ifdef ICE_CPP11_MAPPING
590
+ MetricsAdminI::getMapMetricsFailures(string viewName, string map, const Current&)
591
+ #else
567
592
  MetricsAdminI::getMapMetricsFailures(const string& viewName, const string& map, const Current&)
593
+ #endif
568
594
  {
569
595
  Lock sync(*this);
570
596
  MetricsViewIPtr view = getMetricsView(viewName);
@@ -576,7 +602,11 @@ MetricsAdminI::getMapMetricsFailures(const string& viewName, const string& map,
576
602
  }
577
603
 
578
604
  MetricsFailures
605
+ #ifdef ICE_CPP11_MAPPING
606
+ MetricsAdminI::getMetricsFailures(string viewName, string map, string id, const Current&)
607
+ #else
579
608
  MetricsAdminI::getMetricsFailures(const string& viewName, const string& map, const string& id, const Current&)
609
+ #endif
580
610
  {
581
611
  Lock sync(*this);
582
612
  MetricsViewIPtr view = getMetricsView(viewName);
@@ -587,7 +617,7 @@ MetricsAdminI::getMetricsFailures(const string& viewName, const string& map, con
587
617
  return MetricsFailures();
588
618
  }
589
619
 
590
- vector<MetricsMapIPtr>
620
+ vector<MetricsMapIPtr>
591
621
  MetricsAdminI::getMaps(const string& mapName) const
592
622
  {
593
623
  Lock sync(*this);
@@ -619,12 +649,12 @@ MetricsAdminI::getMetricsView(const std::string& name)
619
649
  {
620
650
  throw UnknownMetricsView();
621
651
  }
622
- return 0;
652
+ return ICE_NULLPTR;
623
653
  }
624
654
  return p->second;
625
655
  }
626
656
 
627
- void
657
+ void
628
658
  MetricsAdminI::updated(const PropertyDict& props)
629
659
  {
630
660
  for(PropertyDict::const_iterator p = props.begin(); p != props.end(); ++p)
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2018 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -11,4 +11,3 @@
11
11
 
12
12
  #include <Ice/Connection.h>
13
13
  #include <Ice/Endpoint.h>
14
-
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2018 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -21,17 +21,17 @@
21
21
  #include <Ice/Network.h>
22
22
  #include <Ice/NetworkProxy.h>
23
23
  #include <IceUtil/StringUtil.h>
24
- #include <IceUtil/StringConverter.h>
24
+ #include <Ice/StringConverter.h>
25
25
  #include <Ice/LocalException.h>
26
26
  #include <Ice/ProtocolInstance.h> // For setTcpBufSize
27
27
  #include <Ice/Properties.h> // For setTcpBufSize
28
28
  #include <Ice/LoggerUtil.h> // For setTcpBufSize
29
29
  #include <Ice/Buffer.h>
30
30
  #include <IceUtil/Random.h>
31
+ #include <functional>
31
32
 
32
- #if defined(ICE_OS_WINRT)
33
+ #if defined(ICE_OS_UWP)
33
34
  # include <IceUtil/InputUtil.h>
34
- # include <IceUtil/CountDownLatch.h>
35
35
  #elif defined(_WIN32)
36
36
  # include <winsock2.h>
37
37
  # include <ws2tcpip.h>
@@ -46,7 +46,7 @@
46
46
  # include <sys/ioctl.h>
47
47
  #endif
48
48
 
49
- #if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
49
+ #if defined(__linux) || defined(__APPLE__) || defined(__FreeBSD__)
50
50
  # include <ifaddrs.h>
51
51
  #elif defined(__sun)
52
52
  # include <sys/sockio.h>
@@ -72,12 +72,12 @@ extern "C"
72
72
  }
73
73
  #endif
74
74
 
75
-
76
75
  using namespace std;
77
76
  using namespace Ice;
78
77
  using namespace IceInternal;
79
78
 
80
- #ifdef ICE_OS_WINRT
79
+ #ifdef ICE_OS_UWP
80
+ using namespace Concurrency;
81
81
  using namespace Platform;
82
82
  using namespace Windows::Foundation;
83
83
  using namespace Windows::Foundation::Collections;
@@ -87,10 +87,24 @@ using namespace Windows::Networking::Sockets;
87
87
  using namespace Windows::Networking::Connectivity;
88
88
  #endif
89
89
 
90
+ #ifdef _WIN32
91
+ int
92
+ IceInternal::getSystemErrno()
93
+ {
94
+ return GetLastError();
95
+ }
96
+ #else
97
+ int
98
+ IceInternal::getSystemErrno()
99
+ {
100
+ return errno;
101
+ }
102
+ #endif
103
+
90
104
  namespace
91
105
  {
92
106
 
93
- #ifndef ICE_OS_WINRT
107
+ #ifndef ICE_OS_UWP
94
108
  struct AddressIsIPv6 : public unary_function<Address, bool>
95
109
  {
96
110
  public:
@@ -113,7 +127,7 @@ struct RandomNumberGenerator : public std::unary_function<ptrdiff_t, ptrdiff_t>
113
127
  void
114
128
  sortAddresses(vector<Address>& addrs, ProtocolSupport protocol, Ice::EndpointSelectionType selType, bool preferIPv6)
115
129
  {
116
- if(selType == Ice::Random)
130
+ if(selType == Ice::ICE_ENUM(EndpointSelectionType, Random))
117
131
  {
118
132
  RandomNumberGenerator rng;
119
133
  random_shuffle(addrs.begin(), addrs.end(), rng);
@@ -159,7 +173,31 @@ setKeepAlive(SOCKET fd)
159
173
  }
160
174
  #endif
161
175
 
162
- #ifdef ICE_OS_WINRT
176
+ #if defined(_WIN32) && !defined(ICE_OS_UWP)
177
+ void
178
+ setTcpLoopbackFastPath(SOCKET fd)
179
+ {
180
+ int OptionValue = 1;
181
+ DWORD NumberOfBytesReturned = 0;
182
+
183
+ int status =
184
+ WSAIoctl(fd, SIO_LOOPBACK_FAST_PATH, &OptionValue, sizeof(OptionValue), ICE_NULLPTR, 0, &NumberOfBytesReturned, 0, 0);
185
+ if(status == SOCKET_ERROR)
186
+ {
187
+ // On platforms that do not support fast path (< Windows 8), WSAEONOTSUPP is expected.
188
+ DWORD LastError = ::GetLastError();
189
+ if(LastError != WSAEOPNOTSUPP)
190
+ {
191
+ closeSocketNoThrow(fd);
192
+ SocketException ex(__FILE__, __LINE__);
193
+ ex.error = getSocketErrno();
194
+ throw ex;
195
+ }
196
+ }
197
+ }
198
+ #endif
199
+
200
+ #ifdef ICE_OS_UWP
163
201
  SOCKET
164
202
  createSocketImpl(bool udp, int)
165
203
  {
@@ -205,7 +243,7 @@ createSocketImpl(bool udp, int family)
205
243
  setTcpNoDelay(fd);
206
244
  setKeepAlive(fd);
207
245
 
208
- #if defined(_WIN32) && !defined(ICE_OS_WINRT)
246
+ #if defined(_WIN32) && !defined(ICE_OS_UWP)
209
247
  //
210
248
  // FIX: the fast path loopback appears to cause issues with
211
249
  // connection closure when it's enabled. Sometime, a peer
@@ -222,7 +260,7 @@ createSocketImpl(bool udp, int family)
222
260
  }
223
261
  #endif
224
262
 
225
- #ifndef ICE_OS_WINRT
263
+ #ifndef ICE_OS_UWP
226
264
  vector<Address>
227
265
  getLocalAddresses(ProtocolSupport protocol, bool includeLoopback)
228
266
  {
@@ -244,16 +282,20 @@ getLocalAddresses(ProtocolSupport protocol, bool includeLoopback)
244
282
  }
245
283
 
246
284
  DWORD size;
247
- DWORD rv = GetAdaptersAddresses(family, 0, NULL, NULL, &size);
248
- if (rv == ERROR_BUFFER_OVERFLOW)
285
+ DWORD rv = GetAdaptersAddresses(family, 0, ICE_NULLPTR, ICE_NULLPTR, &size);
286
+ if(rv == ERROR_BUFFER_OVERFLOW)
249
287
  {
250
288
  PIP_ADAPTER_ADDRESSES adapter_addresses = (PIP_ADAPTER_ADDRESSES) malloc(size);
251
- rv = GetAdaptersAddresses(family, 0, NULL, adapter_addresses, &size);
252
- if (rv == ERROR_SUCCESS)
289
+ rv = GetAdaptersAddresses(family, 0, ICE_NULLPTR, adapter_addresses, &size);
290
+ if(rv == ERROR_SUCCESS)
253
291
  {
254
- for (PIP_ADAPTER_ADDRESSES aa = adapter_addresses; aa != NULL; aa = aa->Next)
292
+ for(PIP_ADAPTER_ADDRESSES aa = adapter_addresses; aa != ICE_NULLPTR; aa = aa->Next)
255
293
  {
256
- for (PIP_ADAPTER_UNICAST_ADDRESS ua = aa->FirstUnicastAddress; ua != NULL; ua = ua->Next)
294
+ if(aa->OperStatus != IfOperStatusUp)
295
+ {
296
+ continue;
297
+ }
298
+ for(PIP_ADAPTER_UNICAST_ADDRESS ua = aa->FirstUnicastAddress; ua != ICE_NULLPTR; ua = ua->Next)
257
299
  {
258
300
  Address addr;
259
301
  memcpy(&addr.saStorage, ua->Address.lpSockaddr, ua->Address.iSockaddrLength);
@@ -279,7 +321,7 @@ getLocalAddresses(ProtocolSupport protocol, bool includeLoopback)
279
321
 
280
322
  free(adapter_addresses);
281
323
  }
282
- #elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
324
+ #elif defined(__linux) || defined(__APPLE__) || defined(__FreeBSD__)
283
325
  struct ifaddrs* ifap;
284
326
  if(::getifaddrs(&ifap) == SOCKET_ERROR)
285
327
  {
@@ -438,11 +480,11 @@ getLocalAddresses(ProtocolSupport protocol, bool includeLoopback)
438
480
  bool
439
481
  isLinklocal(const Address& addr)
440
482
  {
441
- if (addr.saStorage.ss_family == AF_INET6)
483
+ if(addr.saStorage.ss_family == AF_INET6)
442
484
  {
443
485
  return IN6_IS_ADDR_LINKLOCAL(&addr.saIn6.sin6_addr);
444
486
  }
445
- else if (addr.saStorage.ss_family == AF_INET)
487
+ else if(addr.saStorage.ss_family == AF_INET)
446
488
  {
447
489
  // Check for 169.254.X.X in network order
448
490
  return (addr.saIn.sin_addr.s_addr & 0xFF) == 169 && ((addr.saIn.sin_addr.s_addr & 0xFF00)>>8) == 254;
@@ -453,58 +495,66 @@ isLinklocal(const Address& addr)
453
495
  bool
454
496
  isWildcard(const string& host, ProtocolSupport protocol, bool& ipv4)
455
497
  {
456
- try
498
+ Address addr = getAddressForServer(host, 0, protocol, true, false);
499
+ if(addr.saStorage.ss_family == AF_INET)
457
500
  {
458
- Address addr = getAddressForServer(host, 0, protocol, true);
459
- if(addr.saStorage.ss_family == AF_INET)
460
- {
461
- if(addr.saIn.sin_addr.s_addr == INADDR_ANY)
462
- {
463
- ipv4 = true;
464
- return true;
465
- }
466
- }
467
- else if(addr.saStorage.ss_family)
501
+ if(addr.saIn.sin_addr.s_addr == INADDR_ANY)
468
502
  {
469
- if(IN6_IS_ADDR_UNSPECIFIED(&addr.saIn6.sin6_addr))
470
- {
471
- ipv4 = false;
472
- return true;
473
- }
503
+ ipv4 = true;
504
+ return true;
474
505
  }
475
506
  }
476
- catch(const DNSException&)
507
+ else if(addr.saStorage.ss_family == AF_INET6)
477
508
  {
509
+ if(IN6_IS_ADDR_UNSPECIFIED(&addr.saIn6.sin6_addr))
510
+ {
511
+ ipv4 = false;
512
+ return true;
513
+ }
478
514
  }
479
515
  return false;
480
516
  }
481
517
 
482
518
  int
483
- getInterfaceIndex(const string& name)
519
+ getInterfaceIndex(const string& intf)
484
520
  {
485
- if(name.empty())
521
+ if(intf.empty())
486
522
  {
487
523
  return 0;
488
524
  }
489
525
 
490
- int index = 0;
526
+ string name;
527
+ bool isAddr;
528
+ in6_addr addr;
529
+ string::size_type pos = intf.find("%");
530
+ if(pos != string::npos)
531
+ {
532
+ //
533
+ // If it's a link-local address, use the zone indice.
534
+ //
535
+ isAddr = false;
536
+ name = intf.substr(pos + 1);
537
+ }
538
+ else
539
+ {
540
+ //
541
+ // Then check if it's an IPv6 address. If it's an address we'll
542
+ // look for the interface index by address.
543
+ //
544
+ isAddr = inet_pton(AF_INET6, intf.c_str(), &addr) > 0;
545
+ name = intf;
546
+ }
491
547
 
492
548
  //
493
- // First check if index
549
+ // Check if index
494
550
  //
551
+ int index = -1;
495
552
  istringstream p(name);
496
553
  if((p >> index) && p.eof())
497
554
  {
498
555
  return index;
499
556
  }
500
557
 
501
- //
502
- // Then check if it's an IPv6 address. If it's an address we'll
503
- // look for the interface index by address.
504
- //
505
- in6_addr addr;
506
- bool isAddr = inet_pton(AF_INET6, name.c_str(), &addr) > 0;
507
-
508
558
  #ifdef _WIN32
509
559
  IP_ADAPTER_ADDRESSES addrs;
510
560
  ULONG buflen = 0;
@@ -545,7 +595,7 @@ getInterfaceIndex(const string& name)
545
595
  // Don't need to pass a wide string converter as the wide string
546
596
  // come from Windows API.
547
597
  //
548
- if(IceUtil::wstringToString(paddrs->FriendlyName, IceUtil::getProcessStringConverter()) == name)
598
+ if(wstringToString(paddrs->FriendlyName, getProcessStringConverter()) == name)
549
599
  {
550
600
  index = paddrs->Ipv6IfIndex;
551
601
  break;
@@ -556,6 +606,10 @@ getInterfaceIndex(const string& name)
556
606
  }
557
607
  delete[] buf;
558
608
  }
609
+ if(index < 0) // interface not found
610
+ {
611
+ throw Ice::SocketException(__FILE__, __LINE__, WSAEINVAL);
612
+ }
559
613
  #elif !defined(__hpux)
560
614
 
561
615
  //
@@ -563,7 +617,7 @@ getInterfaceIndex(const string& name)
563
617
  //
564
618
  if(isAddr)
565
619
  {
566
- # if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__)
620
+ # if defined(__linux) || defined(__APPLE__) || defined(__FreeBSD__)
567
621
  struct ifaddrs* ifap;
568
622
  if(::getifaddrs(&ifap) != SOCKET_ERROR)
569
623
  {
@@ -653,6 +707,11 @@ getInterfaceIndex(const string& name)
653
707
  {
654
708
  index = if_nametoindex(name.c_str());
655
709
  }
710
+ if(index <= 0)
711
+ {
712
+ // index == 0 if if_nametoindex returned 0, < 0 if name wasn't found
713
+ throw Ice::SocketException(__FILE__, __LINE__, index == 0 ? getSocketErrno() : ENXIO);
714
+ }
656
715
  #endif
657
716
 
658
717
  return index;
@@ -689,19 +748,20 @@ getInterfaceAddress(const string& name)
689
748
  // Don't need to pass a wide string converter as the wide string come
690
749
  // from Windows API.
691
750
  //
692
- if(IceUtil::wstringToString(paddrs->FriendlyName, IceUtil::getProcessStringConverter()) == name)
751
+ if(wstringToString(paddrs->FriendlyName, getProcessStringConverter()) == name)
693
752
  {
694
753
  struct sockaddr_in addrin;
695
754
  memcpy(&addrin, paddrs->FirstUnicastAddress->Address.lpSockaddr,
696
755
  paddrs->FirstUnicastAddress->Address.iSockaddrLength);
697
- addr = addrin.sin_addr;
698
- break;
756
+ delete[] buf;
757
+ return addrin.sin_addr;
699
758
  }
700
759
  paddrs = paddrs->Next;
701
760
  }
702
761
  }
703
762
  delete[] buf;
704
763
  }
764
+ throw Ice::SocketException(__FILE__, __LINE__, WSAEINVAL);
705
765
  #else
706
766
  ifreq if_address;
707
767
  strcpy(if_address.ifr_name, name.c_str());
@@ -709,14 +769,12 @@ getInterfaceAddress(const string& name)
709
769
  SOCKET fd = createSocketImpl(false, AF_INET);
710
770
  int rc = ioctl(fd, SIOCGIFADDR, &if_address);
711
771
  closeSocketNoThrow(fd);
712
-
713
- if(rc != SOCKET_ERROR)
772
+ if(rc == SOCKET_ERROR)
714
773
  {
715
- addr = reinterpret_cast<struct sockaddr_in*>(&if_address.ifr_addr)->sin_addr;
774
+ throw Ice::SocketException(__FILE__, __LINE__, getSocketErrno());
716
775
  }
776
+ return reinterpret_cast<struct sockaddr_in*>(&if_address.ifr_addr)->sin_addr;
717
777
  #endif
718
-
719
- return addr;
720
778
  }
721
779
 
722
780
  int
@@ -734,11 +792,28 @@ getAddressStorageSize(const Address& addr)
734
792
  return size;
735
793
  }
736
794
 
737
- #endif // #ifndef ICE_OS_WINRT
795
+ #endif // #ifndef ICE_OS_UWP
796
+
797
+ }
798
+
799
+ ReadyCallback::~ReadyCallback()
800
+ {
801
+ // Out of line to avoid weak vtable
802
+ }
803
+
804
+ NativeInfo::~NativeInfo()
805
+ {
806
+ // Out of line to avoid weak vtable
807
+ }
738
808
 
809
+ void
810
+ NativeInfo::setReadyCallback(const ReadyCallbackPtr& callback)
811
+ {
812
+ _readyCallback = callback;
739
813
  }
740
814
 
741
815
  #ifdef ICE_USE_IOCP
816
+
742
817
  IceInternal::AsyncInfo::AsyncInfo(SocketOperation s)
743
818
  {
744
819
  ZeroMemory(this, sizeof(AsyncInfo));
@@ -762,7 +837,97 @@ IceInternal::NativeInfo::completed(SocketOperation operation)
762
837
  throw ex;
763
838
  }
764
839
  }
765
- #elif defined(ICE_OS_WINRT)
840
+
841
+ #elif defined(ICE_OS_UWP)
842
+
843
+ void
844
+ IceInternal::NativeInfo::queueAction(SocketOperation op, IAsyncAction^ action, bool connect)
845
+ {
846
+ AsyncInfo* asyncInfo = getAsyncInfo(op);
847
+ if(checkIfErrorOrCompleted(op, action, connect))
848
+ {
849
+ asyncInfo->count = 0;
850
+ }
851
+ else
852
+ {
853
+ action->Completed = ref new AsyncActionCompletedHandler(
854
+ [=] (IAsyncAction^ info, Windows::Foundation::AsyncStatus status)
855
+ {
856
+ //
857
+ // COMPILERFIX with VC141 using operator!= and operator== inside
858
+ // a lambda callback triggers a compiler bug, we move the code to
859
+ // a seperate private method to workaround the issue.
860
+ //
861
+ this->queueActionCompleted(op, asyncInfo, info, status);
862
+ });
863
+ }
864
+ }
865
+
866
+ void
867
+ IceInternal::NativeInfo::queueActionCompleted(SocketOperation op, AsyncInfo* asyncInfo, IAsyncAction^ info,
868
+ Windows::Foundation::AsyncStatus status)
869
+ {
870
+ if(status != Windows::Foundation::AsyncStatus::Completed)
871
+ {
872
+ asyncInfo->count = SOCKET_ERROR;
873
+ asyncInfo->error = info->ErrorCode.Value;
874
+ }
875
+ else
876
+ {
877
+ asyncInfo->count = 0;
878
+ }
879
+ completed(op);
880
+ }
881
+
882
+ void
883
+ IceInternal::NativeInfo::queueOperation(SocketOperation op, IAsyncOperation<unsigned int>^ operation)
884
+ {
885
+ AsyncInfo* info = getAsyncInfo(op);
886
+ if(checkIfErrorOrCompleted(op, operation))
887
+ {
888
+ info->count = static_cast<int>(operation->GetResults());
889
+ }
890
+ else
891
+ {
892
+ if(!info->completedHandler)
893
+ {
894
+ info->completedHandler = ref new AsyncOperationCompletedHandler<unsigned int>(
895
+ [=] (IAsyncOperation<unsigned int>^ operation, Windows::Foundation::AsyncStatus status)
896
+ {
897
+ //
898
+ // COMPILERFIX with VC141 using operator!= and operator== inside
899
+ // a lambda callback triggers a compiler bug, we move the code to
900
+ // a seperate private method to workaround the issue.
901
+ //
902
+ this->queueOperationCompleted(op, info, operation, status);
903
+ });
904
+ }
905
+ operation->Completed = info->completedHandler;
906
+ }
907
+ }
908
+
909
+ void
910
+ IceInternal::NativeInfo::queueOperationCompleted(SocketOperation op, AsyncInfo* info,
911
+ IAsyncOperation<unsigned int>^ operation,
912
+ Windows::Foundation::AsyncStatus status)
913
+ {
914
+ if(status != Windows::Foundation::AsyncStatus::Completed)
915
+ {
916
+ info->count = SOCKET_ERROR;
917
+ info->error = operation->ErrorCode.Value;
918
+ }
919
+ else
920
+ {
921
+ info->count = static_cast<int>(operation->GetResults());
922
+ }
923
+ completed(op);
924
+ }
925
+
926
+ void
927
+ IceInternal::NativeInfo::setCompletedHandler(SocketOperationCompletedHandler^ handler)
928
+ {
929
+ _completedHandler = handler;
930
+ }
766
931
 
767
932
  void
768
933
  IceInternal::NativeInfo::completed(SocketOperation operation)
@@ -771,12 +936,69 @@ IceInternal::NativeInfo::completed(SocketOperation operation)
771
936
  _completedHandler(operation);
772
937
  }
773
938
 
939
+ bool
940
+ IceInternal::NativeInfo::checkIfErrorOrCompleted(SocketOperation op, IAsyncInfo^ info, bool connect)
941
+ {
942
+ //
943
+ // NOTE: It's important to only check for info->Status once as it
944
+ // might change during the checks below (the Status can be changed
945
+ // by the Windows thread pool concurrently).
946
+ //
947
+ // We consider that a canceled async status is the same as an
948
+ // error. A canceled async status can occur if there's a timeout
949
+ // and the socket is closed.
950
+ //
951
+ Windows::Foundation::AsyncStatus status = info->Status;
952
+ if(status == Windows::Foundation::AsyncStatus::Completed)
953
+ {
954
+ _completedHandler(op);
955
+ return true;
956
+ }
957
+ else if (status == Windows::Foundation::AsyncStatus::Started)
958
+ {
959
+ return false;
960
+ }
961
+ else
962
+ {
963
+ if(connect) // Connect
964
+ {
965
+ checkConnectErrorCode(__FILE__, __LINE__, info->ErrorCode.Value);
966
+ }
967
+ else
968
+ {
969
+ checkErrorCode(__FILE__, __LINE__, info->ErrorCode.Value);
970
+ }
971
+ return true; // Prevent compiler warning.
972
+ }
973
+ }
974
+
975
+ #else
976
+
977
+ void
978
+ IceInternal::NativeInfo::setNewFd(SOCKET fd)
979
+ {
980
+ assert(_fd == INVALID_SOCKET); // This can only be called once, when the current socket isn't set yet.
981
+ _newFd = fd;
982
+ }
983
+
984
+ bool
985
+ IceInternal::NativeInfo::newFd()
986
+ {
987
+ if(_newFd == INVALID_SOCKET)
988
+ {
989
+ return false;
990
+ }
991
+ assert(_fd == INVALID_SOCKET);
992
+ swap(_fd, _newFd);
993
+ return true;
994
+ }
995
+
774
996
  #endif
775
997
 
776
998
  bool
777
999
  IceInternal::noMoreFds(int error)
778
1000
  {
779
- #if defined(ICE_OS_WINRT)
1001
+ #if defined(ICE_OS_UWP)
780
1002
  return error == (int)SocketErrorStatus::TooManyOpenFiles;
781
1003
  #elif defined(_WIN32)
782
1004
  return error == WSAEMFILE;
@@ -785,7 +1007,7 @@ IceInternal::noMoreFds(int error)
785
1007
  #endif
786
1008
  }
787
1009
 
788
- #if defined(ICE_OS_WINRT)
1010
+ #if defined(ICE_OS_UWP)
789
1011
  string
790
1012
  IceInternal::errorToStringDNS(int)
791
1013
  {
@@ -803,7 +1025,7 @@ IceInternal::errorToStringDNS(int error)
803
1025
  }
804
1026
  #endif
805
1027
 
806
- #ifdef ICE_OS_WINRT
1028
+ #ifdef ICE_OS_UWP
807
1029
  vector<Address>
808
1030
  IceInternal::getAddresses(const string& host, int port, ProtocolSupport, Ice::EndpointSelectionType, bool, bool)
809
1031
  {
@@ -822,16 +1044,16 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport, Ice::En
822
1044
  // to Windows API.
823
1045
  //
824
1046
  addr.host = ref new HostName(ref new String(
825
- IceUtil::stringToWstring(host,
826
- IceUtil::getProcessStringConverter()).c_str()));
1047
+ stringToWstring(host,
1048
+ getProcessStringConverter()).c_str()));
827
1049
  }
828
1050
  stringstream os;
829
1051
  os << port;
830
1052
  //
831
1053
  // Don't need to use any string converter here as the port number use just
832
- // ACII characters.
1054
+ // ASCII characters.
833
1055
  //
834
- addr.port = ref new String(IceUtil::stringToWstring(os.str()).c_str());
1056
+ addr.port = ref new String(stringToWstring(os.str()).c_str());
835
1057
  result.push_back(addr);
836
1058
  return result;
837
1059
  }
@@ -847,7 +1069,7 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport, Ice::En
847
1069
  #else
848
1070
  vector<Address>
849
1071
  IceInternal::getAddresses(const string& host, int port, ProtocolSupport protocol, Ice::EndpointSelectionType selType,
850
- bool preferIPv6, bool blocking)
1072
+ bool preferIPv6, bool canBlock)
851
1073
  {
852
1074
  vector<Address> result;
853
1075
  Address addr;
@@ -895,7 +1117,7 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport protocol
895
1117
  hints.ai_family = PF_UNSPEC;
896
1118
  }
897
1119
 
898
- if(!blocking)
1120
+ if(!canBlock)
899
1121
  {
900
1122
  hints.ai_flags = AI_NUMERICHOST;
901
1123
  }
@@ -912,12 +1134,12 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport protocol
912
1134
  // address. However on some platforms (e.g. macOS 10.4.x)
913
1135
  // EAI_NODATA is also returned so we also check for it.
914
1136
  # ifdef EAI_NODATA
915
- if(!blocking && (rs == EAI_NONAME || rs == EAI_NODATA))
1137
+ if(!canBlock && (rs == EAI_NONAME || rs == EAI_NODATA))
916
1138
  # else
917
- if(!blocking && rs == EAI_NONAME)
1139
+ if(!canBlock && rs == EAI_NONAME)
918
1140
  # endif
919
1141
  {
920
- return result; // Empty result indicates that a blocking lookup is necessary.
1142
+ return result; // Empty result indicates that a canBlock lookup is necessary.
921
1143
  }
922
1144
  else if(rs != 0)
923
1145
  {
@@ -927,7 +1149,7 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport protocol
927
1149
  throw ex;
928
1150
  }
929
1151
 
930
- for(struct addrinfo* p = info; p != NULL; p = p->ai_next)
1152
+ for(struct addrinfo* p = info; p != ICE_NULLPTR; p = p->ai_next)
931
1153
  {
932
1154
  memcpy(&addr.saStorage, p->ai_addr, p->ai_addrlen);
933
1155
  if(p->ai_family == PF_INET)
@@ -967,11 +1189,11 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport protocol
967
1189
  }
968
1190
  #endif
969
1191
 
970
- #ifdef ICE_OS_WINRT
1192
+ #ifdef ICE_OS_UWP
971
1193
  ProtocolSupport
972
1194
  IceInternal::getProtocolSupport(const Address&)
973
1195
  {
974
- // For WinRT, there's no distinction between IPv4 and IPv6 adresses.
1196
+ // For UWP, there's no distinction between IPv4 and IPv6 adresses.
975
1197
  return EnableBoth;
976
1198
  }
977
1199
  #else
@@ -983,7 +1205,7 @@ IceInternal::getProtocolSupport(const Address& addr)
983
1205
  #endif
984
1206
 
985
1207
  Address
986
- IceInternal::getAddressForServer(const string& host, int port, ProtocolSupport protocol, bool preferIPv6)
1208
+ IceInternal::getAddressForServer(const string& host, int port, ProtocolSupport protocol, bool preferIPv6, bool canBlock)
987
1209
  {
988
1210
  //
989
1211
  // We don't use getaddrinfo when host is empty as it's not portable (some old Linux
@@ -992,14 +1214,14 @@ IceInternal::getAddressForServer(const string& host, int port, ProtocolSupport p
992
1214
  if(host.empty())
993
1215
  {
994
1216
  Address addr;
995
- #ifdef ICE_OS_WINRT
1217
+ #ifdef ICE_OS_UWP
996
1218
  ostringstream os;
997
1219
  os << port;
998
1220
  //
999
1221
  // Don't need to use any string converter here as the port number use just
1000
1222
  // ASCII characters.
1001
1223
  //
1002
- addr.port = ref new String(IceUtil::stringToWstring(os.str()).c_str());
1224
+ addr.port = ref new String(stringToWstring(os.str()).c_str());
1003
1225
  addr.host = nullptr; // Equivalent of inaddr_any, see doBind implementation.
1004
1226
  #else
1005
1227
  memset(&addr.saStorage, 0, sizeof(sockaddr_storage));
@@ -1018,13 +1240,14 @@ IceInternal::getAddressForServer(const string& host, int port, ProtocolSupport p
1018
1240
  #endif
1019
1241
  return addr;
1020
1242
  }
1021
- return getAddresses(host, port, protocol, Ice::Ordered, preferIPv6, true)[0];
1243
+ vector<Address> addrs = getAddresses(host, port, protocol, Ice::ICE_ENUM(EndpointSelectionType, Ordered), preferIPv6, canBlock);
1244
+ return addrs.empty() ? Address() : addrs[0];
1022
1245
  }
1023
1246
 
1024
1247
  int
1025
1248
  IceInternal::compareAddress(const Address& addr1, const Address& addr2)
1026
1249
  {
1027
- #ifdef ICE_OS_WINRT
1250
+ #ifdef ICE_OS_UWP
1028
1251
  int o = String::CompareOrdinal(addr1.port, addr2.port);
1029
1252
  if(o != 0)
1030
1253
  {
@@ -1099,7 +1322,7 @@ IceInternal::compareAddress(const Address& addr1, const Address& addr2)
1099
1322
  #endif
1100
1323
  }
1101
1324
 
1102
- #ifdef ICE_OS_WINRT
1325
+ #ifdef ICE_OS_UWP
1103
1326
  bool
1104
1327
  IceInternal::isIPv6Supported()
1105
1328
  {
@@ -1122,7 +1345,7 @@ IceInternal::isIPv6Supported()
1122
1345
  }
1123
1346
  #endif
1124
1347
 
1125
- #ifdef ICE_OS_WINRT
1348
+ #ifdef ICE_OS_UWP
1126
1349
  SOCKET
1127
1350
  IceInternal::createSocket(bool udp, const Address&)
1128
1351
  {
@@ -1136,7 +1359,7 @@ IceInternal::createSocket(bool udp, const Address& addr)
1136
1359
  }
1137
1360
  #endif
1138
1361
 
1139
- #ifndef ICE_OS_WINRT
1362
+ #ifndef ICE_OS_UWP
1140
1363
  SOCKET
1141
1364
  IceInternal::createServerSocket(bool udp, const Address& addr, ProtocolSupport protocol)
1142
1365
  {
@@ -1171,7 +1394,7 @@ IceInternal::createServerSocket(bool udp, const Address& addr, ProtocolSupport)
1171
1394
  void
1172
1395
  IceInternal::closeSocketNoThrow(SOCKET fd)
1173
1396
  {
1174
- #if defined(ICE_OS_WINRT)
1397
+ #if defined(ICE_OS_UWP)
1175
1398
  //
1176
1399
  // NOTE: StreamSocket::Close or DatagramSocket::Close aren't
1177
1400
  // exposed in C++, you have to delete the socket to close
@@ -1194,7 +1417,7 @@ IceInternal::closeSocketNoThrow(SOCKET fd)
1194
1417
  void
1195
1418
  IceInternal::closeSocket(SOCKET fd)
1196
1419
  {
1197
- #if defined(ICE_OS_WINRT)
1420
+ #if defined(ICE_OS_UWP)
1198
1421
  //
1199
1422
  // NOTE: StreamSocket::Close or DatagramSocket::Close aren't
1200
1423
  // exposed in C++, you have to delete the socket to close
@@ -1245,7 +1468,7 @@ IceInternal::addrToString(const Address& addr)
1245
1468
  void
1246
1469
  IceInternal::fdToLocalAddress(SOCKET fd, Address& addr)
1247
1470
  {
1248
- #ifndef ICE_OS_WINRT
1471
+ #ifndef ICE_OS_UWP
1249
1472
  socklen_t len = static_cast<socklen_t>(sizeof(sockaddr_storage));
1250
1473
  if(getsockname(fd, &addr.sa, &len) == SOCKET_ERROR)
1251
1474
  {
@@ -1272,7 +1495,7 @@ IceInternal::fdToLocalAddress(SOCKET fd, Address& addr)
1272
1495
  bool
1273
1496
  IceInternal::fdToRemoteAddress(SOCKET fd, Address& addr)
1274
1497
  {
1275
- #ifndef ICE_OS_WINRT
1498
+ #ifndef ICE_OS_UWP
1276
1499
  socklen_t len = static_cast<socklen_t>(sizeof(sockaddr_storage));
1277
1500
  if(getpeername(fd, &addr.sa, &len) == SOCKET_ERROR)
1278
1501
  {
@@ -1427,14 +1650,14 @@ IceInternal::addressesToString(const Address& localAddr, const Address& remoteAd
1427
1650
  bool
1428
1651
  IceInternal::isAddressValid(const Address& addr)
1429
1652
  {
1430
- #ifndef ICE_OS_WINRT
1653
+ #ifndef ICE_OS_UWP
1431
1654
  return addr.saStorage.ss_family != AF_UNSPEC;
1432
1655
  #else
1433
1656
  return addr.host != nullptr || addr.port != nullptr;
1434
1657
  #endif
1435
1658
  }
1436
1659
 
1437
- #ifdef ICE_OS_WINRT
1660
+ #ifdef ICE_OS_UWP
1438
1661
  vector<string>
1439
1662
  IceInternal::getHostsForEndpointExpand(const string& host, ProtocolSupport protocolSupport, bool includeLoopback)
1440
1663
  {
@@ -1446,8 +1669,7 @@ IceInternal::getHostsForEndpointExpand(const string& host, ProtocolSupport proto
1446
1669
  HostName^ h = it->Current;
1447
1670
  if(h->IPInformation != nullptr && h->IPInformation->NetworkAdapter != nullptr)
1448
1671
  {
1449
- hosts.push_back(IceUtil::wstringToString(h->CanonicalName->Data(),
1450
- IceUtil::getProcessStringConverter()));
1672
+ hosts.push_back(wstringToString(h->CanonicalName->Data(), getProcessStringConverter()));
1451
1673
  }
1452
1674
  }
1453
1675
  if(includeLoopback)
@@ -1464,6 +1686,17 @@ IceInternal::getHostsForEndpointExpand(const string& host, ProtocolSupport proto
1464
1686
  }
1465
1687
  return hosts;
1466
1688
  }
1689
+
1690
+ vector<string>
1691
+ IceInternal::getInterfacesForMulticast(const string& intf, ProtocolSupport protocolSupport)
1692
+ {
1693
+ vector<string> interfaces = getHostsForEndpointExpand(intf, protocolSupport, true);
1694
+ if(interfaces.empty())
1695
+ {
1696
+ interfaces.push_back(intf);
1697
+ }
1698
+ return interfaces;
1699
+ }
1467
1700
  #else
1468
1701
  vector<string>
1469
1702
  IceInternal::getHostsForEndpointExpand(const string& host, ProtocolSupport protocolSupport, bool includeLoopback)
@@ -1488,12 +1721,32 @@ IceInternal::getHostsForEndpointExpand(const string& host, ProtocolSupport proto
1488
1721
  }
1489
1722
  return hosts; // An empty host list indicates to just use the given host.
1490
1723
  }
1724
+
1725
+ vector<string>
1726
+ IceInternal::getInterfacesForMulticast(const string& intf, ProtocolSupport protocolSupport)
1727
+ {
1728
+ vector<string> interfaces;
1729
+ bool ipv4Wildcard = false;
1730
+ if(isWildcard(intf, protocolSupport, ipv4Wildcard))
1731
+ {
1732
+ vector<Address> addrs = getLocalAddresses(ipv4Wildcard ? EnableIPv4 : protocolSupport, true);
1733
+ for(vector<Address>::const_iterator p = addrs.begin(); p != addrs.end(); ++p)
1734
+ {
1735
+ interfaces.push_back(inetAddrToString(*p)); // We keep link local addresses for multicast
1736
+ }
1737
+ }
1738
+ if(interfaces.empty())
1739
+ {
1740
+ interfaces.push_back(intf);
1741
+ }
1742
+ return interfaces;
1743
+ }
1491
1744
  #endif
1492
1745
 
1493
1746
  string
1494
1747
  IceInternal::inetAddrToString(const Address& ss)
1495
1748
  {
1496
- #ifndef ICE_OS_WINRT
1749
+ #ifndef ICE_OS_UWP
1497
1750
  int size = getAddressStorageSize(ss);
1498
1751
  if(size == 0)
1499
1752
  {
@@ -1515,7 +1768,7 @@ IceInternal::inetAddrToString(const Address& ss)
1515
1768
  // Don't need to pass a wide string converter as the wide string come
1516
1769
  // from Windows API.
1517
1770
  //
1518
- return IceUtil::wstringToString(ss.host->RawName->Data(), IceUtil::getProcessStringConverter());
1771
+ return wstringToString(ss.host->RawName->Data(), getProcessStringConverter());
1519
1772
  }
1520
1773
  #endif
1521
1774
  }
@@ -1523,7 +1776,7 @@ IceInternal::inetAddrToString(const Address& ss)
1523
1776
  int
1524
1777
  IceInternal::getPort(const Address& addr)
1525
1778
  {
1526
- #ifndef ICE_OS_WINRT
1779
+ #ifndef ICE_OS_UWP
1527
1780
  if(addr.saStorage.ss_family == AF_INET)
1528
1781
  {
1529
1782
  return ntohs(addr.saIn.sin_port);
@@ -1541,7 +1794,7 @@ IceInternal::getPort(const Address& addr)
1541
1794
  //
1542
1795
  // Don't need to use any string converter here as the port number use just ASCII characters.
1543
1796
  //
1544
- if(addr.port == nullptr || !IceUtilInternal::stringToInt64(IceUtil::wstringToString(addr.port->Data()), port))
1797
+ if(addr.port == nullptr || !IceUtilInternal::stringToInt64(wstringToString(addr.port->Data()), port))
1545
1798
  {
1546
1799
  return -1;
1547
1800
  }
@@ -1552,7 +1805,7 @@ IceInternal::getPort(const Address& addr)
1552
1805
  void
1553
1806
  IceInternal::setPort(Address& addr, int port)
1554
1807
  {
1555
- #ifndef ICE_OS_WINRT
1808
+ #ifndef ICE_OS_UWP
1556
1809
  if(addr.saStorage.ss_family == AF_INET)
1557
1810
  {
1558
1811
  addr.saIn.sin_port = htons(port);
@@ -1567,16 +1820,16 @@ IceInternal::setPort(Address& addr, int port)
1567
1820
  os << port;
1568
1821
  //
1569
1822
  // Don't need to use any string converter here as the port number use just
1570
- // ACII characters.
1823
+ // ASCII characters.
1571
1824
  //
1572
- addr.port = ref new String(IceUtil::stringToWstring(os.str()).c_str());
1825
+ addr.port = ref new String(stringToWstring(os.str()).c_str());
1573
1826
  #endif
1574
1827
  }
1575
1828
 
1576
1829
  bool
1577
1830
  IceInternal::isMulticast(const Address& addr)
1578
1831
  {
1579
- #ifndef ICE_OS_WINRT
1832
+ #ifndef ICE_OS_UWP
1580
1833
  if(addr.saStorage.ss_family == AF_INET)
1581
1834
  {
1582
1835
  return IN_MULTICAST(ntohl(addr.saIn.sin_addr.s_addr));
@@ -1594,7 +1847,7 @@ IceInternal::isMulticast(const Address& addr)
1594
1847
  // Don't need to use string converters here, this is just to do a local
1595
1848
  // comparison to find if the address is multicast.
1596
1849
  //
1597
- string host = IceUtil::wstringToString(addr.host->RawName->Data());
1850
+ string host = wstringToString(addr.host->RawName->Data());
1598
1851
  string ip = IceUtilInternal::toUpper(host);
1599
1852
  vector<string> tokens;
1600
1853
  IceUtilInternal::splitString(ip, ".", tokens);
@@ -1689,7 +1942,7 @@ IceInternal::setTcpBufSize(SOCKET fd, int rcvSize, int sndSize, const ProtocolIn
1689
1942
  }
1690
1943
  }
1691
1944
 
1692
- #ifdef ICE_OS_WINRT
1945
+ #ifdef ICE_OS_UWP
1693
1946
  void
1694
1947
  IceInternal::setBlock(SOCKET fd, bool)
1695
1948
  {
@@ -1753,7 +2006,7 @@ IceInternal::setBlock(SOCKET fd, bool block)
1753
2006
  void
1754
2007
  IceInternal::setSendBufferSize(SOCKET fd, int sz)
1755
2008
  {
1756
- #ifndef ICE_OS_WINRT
2009
+ #ifndef ICE_OS_UWP
1757
2010
  if(setsockopt(fd, SOL_SOCKET, SO_SNDBUF, reinterpret_cast<char*>(&sz), int(sizeof(int))) == SOCKET_ERROR)
1758
2011
  {
1759
2012
  closeSocketNoThrow(fd);
@@ -1773,7 +2026,7 @@ IceInternal::setSendBufferSize(SOCKET fd, int sz)
1773
2026
  int
1774
2027
  IceInternal::getSendBufferSize(SOCKET fd)
1775
2028
  {
1776
- #ifndef ICE_OS_WINRT
2029
+ #ifndef ICE_OS_UWP
1777
2030
  int sz;
1778
2031
  socklen_t len = sizeof(sz);
1779
2032
  if(getsockopt(fd, SOL_SOCKET, SO_SNDBUF, reinterpret_cast<char*>(&sz), &len) == SOCKET_ERROR ||
@@ -1795,7 +2048,7 @@ IceInternal::getSendBufferSize(SOCKET fd)
1795
2048
  #endif
1796
2049
  }
1797
2050
 
1798
- #ifdef ICE_OS_WINRT
2051
+ #ifdef ICE_OS_UWP
1799
2052
  void
1800
2053
  IceInternal::setRecvBufferSize(SOCKET, int)
1801
2054
  {
@@ -1817,7 +2070,7 @@ IceInternal::setRecvBufferSize(SOCKET fd, int sz)
1817
2070
  int
1818
2071
  IceInternal::getRecvBufferSize(SOCKET fd)
1819
2072
  {
1820
- #ifndef ICE_OS_WINRT
2073
+ #ifndef ICE_OS_UWP
1821
2074
  int sz;
1822
2075
  socklen_t len = sizeof(sz);
1823
2076
  if(getsockopt(fd, SOL_SOCKET, SO_RCVBUF, reinterpret_cast<char*>(&sz), &len) == SOCKET_ERROR ||
@@ -1834,31 +2087,41 @@ IceInternal::getRecvBufferSize(SOCKET fd)
1834
2087
  #endif
1835
2088
  }
1836
2089
 
1837
- #ifndef ICE_OS_WINRT
2090
+ #ifndef ICE_OS_UWP
1838
2091
  void
1839
2092
  IceInternal::setMcastGroup(SOCKET fd, const Address& group, const string& intf)
1840
2093
  {
1841
- int rc;
1842
- if(group.saStorage.ss_family == AF_INET)
1843
- {
1844
- struct ip_mreq mreq;
1845
- mreq.imr_multiaddr = group.saIn.sin_addr;
1846
- mreq.imr_interface = getInterfaceAddress(intf);
1847
- rc = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<char*>(&mreq), int(sizeof(mreq)));
1848
- }
1849
- else
1850
- {
1851
- struct ipv6_mreq mreq;
1852
- mreq.ipv6mr_multiaddr = group.saIn6.sin6_addr;
1853
- mreq.ipv6mr_interface = getInterfaceIndex(intf);
1854
- rc = setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, reinterpret_cast<char*>(&mreq), int(sizeof(mreq)));
1855
- }
1856
- if(rc == SOCKET_ERROR)
2094
+ vector<string> interfaces = getInterfacesForMulticast(intf, getProtocolSupport(group));
2095
+ set<int> indexes;
2096
+ for(vector<string>::const_iterator p = interfaces.begin(); p != interfaces.end(); ++p)
1857
2097
  {
1858
- closeSocketNoThrow(fd);
1859
- SocketException ex(__FILE__, __LINE__);
1860
- ex.error = getSocketErrno();
1861
- throw ex;
2098
+ int rc = 0;
2099
+ if(group.saStorage.ss_family == AF_INET)
2100
+ {
2101
+ struct ip_mreq mreq;
2102
+ mreq.imr_multiaddr = group.saIn.sin_addr;
2103
+ mreq.imr_interface = getInterfaceAddress(*p);
2104
+ rc = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<char*>(&mreq), int(sizeof(mreq)));
2105
+ }
2106
+ else
2107
+ {
2108
+ int index = getInterfaceIndex(*p);
2109
+ if(indexes.find(index) == indexes.end()) // Don't join twice the same interface (if it has multiple IPs)
2110
+ {
2111
+ indexes.insert(index);
2112
+ struct ipv6_mreq mreq;
2113
+ mreq.ipv6mr_multiaddr = group.saIn6.sin6_addr;
2114
+ mreq.ipv6mr_interface = index;
2115
+ rc = setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, reinterpret_cast<char*>(&mreq), int(sizeof(mreq)));
2116
+ }
2117
+ }
2118
+ if(rc == SOCKET_ERROR)
2119
+ {
2120
+ closeSocketNoThrow(fd);
2121
+ SocketException ex(__FILE__, __LINE__);
2122
+ ex.error = getSocketErrno();
2123
+ throw ex;
2124
+ }
1862
2125
  }
1863
2126
  }
1864
2127
  #else
@@ -1868,9 +2131,34 @@ IceInternal::setMcastGroup(SOCKET fd, const Address& group, const string&)
1868
2131
  try
1869
2132
  {
1870
2133
  //
1871
- // NOTE: WinRT doesn't allow specyfing the interface.
2134
+ // NOTE: UWP mcast interface is set earlier in doBind.
1872
2135
  //
1873
2136
  safe_cast<DatagramSocket^>(fd)->JoinMulticastGroup(group.host);
2137
+
2138
+ //
2139
+ // BUGFIX DatagramSocket will not recive any messages from a multicast group if the
2140
+ // messages originate in the same host until the socket is used to send at least one
2141
+ // message. We send a valiate connection message that the peers will ignore to workaround
2142
+ // the issue.
2143
+ //
2144
+ auto out = IceInternal::runSync(safe_cast<DatagramSocket^>(fd)->GetOutputStreamAsync(group.host, group.port));
2145
+ auto writer = ref new DataWriter(out);
2146
+
2147
+ OutputStream os;
2148
+ os.write(magic[0]);
2149
+ os.write(magic[1]);
2150
+ os.write(magic[2]);
2151
+ os.write(magic[3]);
2152
+ os.write(currentProtocol);
2153
+ os.write(currentProtocolEncoding);
2154
+ os.write(validateConnectionMsg);
2155
+ os.write(static_cast<Byte>(0)); // Compression status (always zero for validate connection).
2156
+ os.write(headerSize); // Message size.
2157
+ os.i = os.b.begin();
2158
+
2159
+ writer->WriteBytes(ref new Array<unsigned char>(&*os.i, static_cast<unsigned int>(headerSize)));
2160
+
2161
+ IceInternal::runSync(writer->StoreAsync());
1874
2162
  }
1875
2163
  catch(Platform::Exception^ pex)
1876
2164
  {
@@ -1879,7 +2167,7 @@ IceInternal::setMcastGroup(SOCKET fd, const Address& group, const string&)
1879
2167
  }
1880
2168
  #endif
1881
2169
 
1882
- #ifdef ICE_OS_WINRT
2170
+ #ifdef ICE_OS_UWP
1883
2171
  void
1884
2172
  IceInternal::setMcastInterface(SOCKET, const string&, const Address&)
1885
2173
  {
@@ -1909,7 +2197,7 @@ IceInternal::setMcastInterface(SOCKET fd, const string& intf, const Address& add
1909
2197
  }
1910
2198
  #endif
1911
2199
 
1912
- #ifdef ICE_OS_WINRT
2200
+ #ifdef ICE_OS_UWP
1913
2201
  void
1914
2202
  IceInternal::setMcastTtl(SOCKET, int, const Address&)
1915
2203
  {
@@ -1937,7 +2225,7 @@ IceInternal::setMcastTtl(SOCKET fd, int ttl, const Address& addr)
1937
2225
  }
1938
2226
  #endif
1939
2227
 
1940
- #ifdef ICE_OS_WINRT
2228
+ #ifdef ICE_OS_UWP
1941
2229
  void
1942
2230
  IceInternal::setReuseAddress(SOCKET, bool)
1943
2231
  {
@@ -1957,41 +2245,51 @@ IceInternal::setReuseAddress(SOCKET fd, bool reuse)
1957
2245
  }
1958
2246
  #endif
1959
2247
 
2248
+ #ifdef ICE_OS_UWP
2249
+ namespace
2250
+ {
1960
2251
 
1961
- #ifdef ICE_OS_WINRT
1962
2252
  void
1963
2253
  checkResultAndWait(IAsyncAction^ action)
1964
2254
  {
1965
- if(action->Status == Windows::Foundation::AsyncStatus::Started)
2255
+ auto status = action->Status;
2256
+ switch(status)
1966
2257
  {
1967
- IceUtilInternal::CountDownLatch count(1);
1968
- HRESULT result = 0;
1969
- action->Completed = ref new AsyncActionCompletedHandler(
1970
- [&count, &result] (IAsyncAction^ action, Windows::Foundation::AsyncStatus status)
1971
- {
1972
- if(status != Windows::Foundation::AsyncStatus::Completed)
2258
+ case Windows::Foundation::AsyncStatus::Started:
2259
+ {
2260
+ promise<HRESULT> p;
2261
+ action->Completed = ref new AsyncActionCompletedHandler(
2262
+ [&p] (IAsyncAction^ action, Windows::Foundation::AsyncStatus status)
1973
2263
  {
1974
- result = action->ErrorCode.Value;
1975
- }
1976
- count.countDown();
1977
- });
1978
- count.await();
1979
- if(result)
2264
+ p.set_value(status != Windows::Foundation::AsyncStatus::Completed ? action->ErrorCode.Value : 0);
2265
+ });
2266
+
2267
+ HRESULT result = p.get_future().get();
2268
+ if(result)
2269
+ {
2270
+ checkErrorCode(__FILE__, __LINE__, result);
2271
+ }
2272
+ break;
2273
+ }
2274
+ case Windows::Foundation::AsyncStatus::Error:
1980
2275
  {
1981
- checkErrorCode(__FILE__, __LINE__, result);
2276
+ checkErrorCode(__FILE__, __LINE__, action->ErrorCode.Value);
2277
+ break;
2278
+ }
2279
+ default:
2280
+ {
2281
+ break;
1982
2282
  }
1983
- }
1984
- else if(action->Status == Windows::Foundation::AsyncStatus::Error)
1985
- {
1986
- checkErrorCode(__FILE__, __LINE__, action->ErrorCode.Value);
1987
2283
  }
1988
2284
  }
2285
+
2286
+ }
1989
2287
  #endif
1990
2288
 
2289
+ #ifdef ICE_OS_UWP
1991
2290
  Address
1992
- IceInternal::doBind(SOCKET fd, const Address& addr)
2291
+ IceInternal::doBind(SOCKET fd, const Address& addr, const string& intf)
1993
2292
  {
1994
- #ifdef ICE_OS_WINRT
1995
2293
  Address local;
1996
2294
  try
1997
2295
  {
@@ -2015,7 +2313,32 @@ IceInternal::doBind(SOCKET fd, const Address& addr)
2015
2313
  {
2016
2314
  if(addr.host == nullptr) // inaddr_any
2017
2315
  {
2018
- checkResultAndWait(datagram->BindServiceNameAsync(addr.port));
2316
+ NetworkAdapter^ adapter;
2317
+ if(!intf.empty())
2318
+ {
2319
+ auto s = ref new String(Ice::stringToWstring(intf).c_str());
2320
+ auto profiles = NetworkInformation::GetConnectionProfiles();
2321
+ for(auto i = profiles->First(); adapter == nullptr && i->HasCurrent; i->MoveNext())
2322
+ {
2323
+ auto names = i->Current->GetNetworkNames();
2324
+ for(auto j = names->First(); adapter == nullptr && j->HasCurrent; j->MoveNext())
2325
+ {
2326
+ if(j->Current->Equals(s))
2327
+ {
2328
+ adapter = i->Current->NetworkAdapter;
2329
+ }
2330
+ }
2331
+ }
2332
+ }
2333
+
2334
+ if(adapter)
2335
+ {
2336
+ checkResultAndWait(datagram->BindServiceNameAsync(addr.port, adapter));
2337
+ }
2338
+ else
2339
+ {
2340
+ checkResultAndWait(datagram->BindServiceNameAsync(addr.port));
2341
+ }
2019
2342
  }
2020
2343
  else
2021
2344
  {
@@ -2031,7 +2354,11 @@ IceInternal::doBind(SOCKET fd, const Address& addr)
2031
2354
  throw;
2032
2355
  }
2033
2356
  return local;
2357
+ }
2034
2358
  #else
2359
+ Address
2360
+ IceInternal::doBind(SOCKET fd, const Address& addr, const string&)
2361
+ {
2035
2362
  int size = getAddressStorageSize(addr);
2036
2363
  assert(size != 0);
2037
2364
 
@@ -2052,15 +2379,16 @@ IceInternal::doBind(SOCKET fd, const Address& addr)
2052
2379
  assert(ret != SOCKET_ERROR);
2053
2380
  # endif
2054
2381
  return local;
2055
- #endif
2056
2382
  }
2383
+ #endif
2057
2384
 
2058
- #ifndef ICE_OS_WINRT
2385
+ #ifndef ICE_OS_UWP
2059
2386
 
2060
2387
  Address
2061
2388
  IceInternal::getNumericAddress(const std::string& address)
2062
2389
  {
2063
- vector<Address> addrs = getAddresses(address, 0, EnableBoth, Ice::Ordered, false, false);
2390
+ vector<Address> addrs = getAddresses(address, 0, EnableBoth, Ice::ICE_ENUM(EndpointSelectionType, Ordered), false,
2391
+ false);
2064
2392
  if(addrs.empty())
2065
2393
  {
2066
2394
  return Address();
@@ -2293,7 +2621,7 @@ repeatConnect:
2293
2621
  }
2294
2622
  }
2295
2623
 
2296
- #if defined(__linux__)
2624
+ #if defined(__linux)
2297
2625
  //
2298
2626
  // Prevent self connect (self connect happens on Linux when a client tries to connect to
2299
2627
  // a server which was just deactivated if the client socket re-uses the same ephemeral
@@ -2372,7 +2700,7 @@ IceInternal::doFinishConnect(SOCKET fd)
2372
2700
  }
2373
2701
  }
2374
2702
 
2375
- #if defined(__linux__)
2703
+ #if defined(__linux)
2376
2704
  //
2377
2705
  // Prevent self connect (self connect happens on Linux when a client tries to connect to
2378
2706
  // a server which was just deactivated if the client socket re-uses the same ephemeral
@@ -2417,7 +2745,6 @@ repeatAccept:
2417
2745
  return ret;
2418
2746
  }
2419
2747
 
2420
-
2421
2748
  void
2422
2749
  IceInternal::createPipe(SOCKET fds[2])
2423
2750
  {
@@ -2521,10 +2848,10 @@ IceInternal::createPipe(SOCKET fds[2])
2521
2848
  #endif
2522
2849
  }
2523
2850
 
2524
- #else // ICE_OS_WINRT
2851
+ #else // ICE_OS_UWP
2525
2852
 
2526
2853
  void
2527
- IceInternal::checkConnectErrorCode(const char* file, int line, HRESULT herr, HostName^ host)
2854
+ IceInternal::checkConnectErrorCode(const char* file, int line, HRESULT herr)
2528
2855
  {
2529
2856
  if(herr == E_ACCESSDENIED)
2530
2857
  {
@@ -2554,11 +2881,6 @@ IceInternal::checkConnectErrorCode(const char* file, int line, HRESULT herr, Hos
2554
2881
  {
2555
2882
  DNSException ex(file, line);
2556
2883
  ex.error = static_cast<int>(error);
2557
- //
2558
- // Don't need to pass a wide string converter as the wide string come from
2559
- // Windows API.
2560
- //
2561
- ex.host = IceUtil::wstringToString(host->RawName->Data(), IceUtil::getProcessStringConverter());
2562
2884
  throw ex;
2563
2885
  }
2564
2886
  else
@@ -2601,6 +2923,34 @@ IceInternal::checkErrorCode(const char* file, int line, HRESULT herr)
2601
2923
  }
2602
2924
  }
2603
2925
 
2926
+ //
2927
+ // UWP impose some restriction on operations that block when run from
2928
+ // STA thread and throws concurrency::invalid_operation. We cannot
2929
+ // directly call task::get or task::way, this helper method is used to
2930
+ // workaround this limitation.
2931
+ //
2932
+ void
2933
+ IceInternal::runSync(Windows::Foundation::IAsyncAction^ action)
2934
+ {
2935
+ std::promise<void> p;
2936
+
2937
+ concurrency::create_task(action).then(
2938
+ [&p](concurrency::task<void> t)
2939
+ {
2940
+ try
2941
+ {
2942
+ t.get();
2943
+ p.set_value();
2944
+ }
2945
+ catch(...)
2946
+ {
2947
+ p.set_exception(std::current_exception());
2948
+ }
2949
+ },
2950
+ concurrency::task_continuation_context::use_arbitrary());
2951
+
2952
+ return p.get_future().get();
2953
+ }
2604
2954
 
2605
2955
  #endif
2606
2956
 
@@ -2644,7 +2994,7 @@ IceInternal::doConnectAsync(SOCKET fd, const Address& addr, const Address& sourc
2644
2994
  throw ex;
2645
2995
  }
2646
2996
 
2647
- LPFN_CONNECTEX ConnectEx = NULL; // a pointer to the 'ConnectEx()' function
2997
+ LPFN_CONNECTEX ConnectEx = ICE_NULLPTR; // a pointer to the 'ConnectEx()' function
2648
2998
  GUID GuidConnectEx = WSAID_CONNECTEX; // The Guid
2649
2999
  DWORD dwBytes;
2650
3000
  if(WSAIoctl(fd,
@@ -2654,8 +3004,8 @@ IceInternal::doConnectAsync(SOCKET fd, const Address& addr, const Address& sourc
2654
3004
  &ConnectEx,
2655
3005
  sizeof(ConnectEx),
2656
3006
  &dwBytes,
2657
- NULL,
2658
- NULL) == SOCKET_ERROR)
3007
+ ICE_NULLPTR,
3008
+ ICE_NULLPTR) == SOCKET_ERROR)
2659
3009
  {
2660
3010
  SocketException ex(__FILE__, __LINE__);
2661
3011
  ex.error = getSocketErrno();
@@ -2719,7 +3069,7 @@ IceInternal::doFinishConnectAsync(SOCKET fd, AsyncInfo& info)
2719
3069
  }
2720
3070
  }
2721
3071
 
2722
- if(setsockopt(fd, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0) == SOCKET_ERROR)
3072
+ if(setsockopt(fd, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, ICE_NULLPTR, 0) == SOCKET_ERROR)
2723
3073
  {
2724
3074
  SocketException ex(__FILE__, __LINE__);
2725
3075
  ex.error = getSocketErrno();
@@ -2728,3 +3078,17 @@ IceInternal::doFinishConnectAsync(SOCKET fd, AsyncInfo& info)
2728
3078
  }
2729
3079
  #endif
2730
3080
 
3081
+ bool
3082
+ IceInternal::isIpAddress(const string& name)
3083
+ {
3084
+ #ifdef ICE_OS_UWP
3085
+ HostName^ hostname = ref new HostName(ref new String(stringToWstring(name,
3086
+ getProcessStringConverter()).c_str()));
3087
+ return hostname->Type == HostNameType::Ipv4 || hostname->Type == HostNameType::Ipv6;
3088
+ #else
3089
+ in_addr addr;
3090
+ in6_addr addr6;
3091
+
3092
+ return inet_pton(AF_INET, name.c_str(), &addr) > 0 || inet_pton(AF_INET6, name.c_str(), &addr6) > 0;
3093
+ #endif
3094
+ }