zeroc-ice 3.6.5 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }