diff options
author | Mark Spruiell <mes@zeroc.com> | 2014-03-19 12:45:55 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2014-03-19 12:45:55 -0700 |
commit | cdcffbcc3c3c052afdeb772ff0167e7a90b525bb (patch) | |
tree | 4f16ee41ef7d33394c44e9db81e4d6cd89908250 /js/src/Ice/EndpointFactoryManager.js | |
parent | fixing testicedist.py for 5487 (diff) | |
download | ice-cdcffbcc3c3c052afdeb772ff0167e7a90b525bb.tar.bz2 ice-cdcffbcc3c3c052afdeb772ff0167e7a90b525bb.tar.xz ice-cdcffbcc3c3c052afdeb772ff0167e7a90b525bb.zip |
merging javascript branch
Diffstat (limited to 'js/src/Ice/EndpointFactoryManager.js')
-rw-r--r-- | js/src/Ice/EndpointFactoryManager.js | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/js/src/Ice/EndpointFactoryManager.js b/js/src/Ice/EndpointFactoryManager.js new file mode 100644 index 00000000000..881c9cd998c --- /dev/null +++ b/js/src/Ice/EndpointFactoryManager.js @@ -0,0 +1,146 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +(function(global){ + require("Ice/Class"); + require("Ice/BasicStream"); + require("Ice/Debug"); + require("Ice/OpaqueEndpointI"); + require("Ice/Protocol"); + require("Ice/LocalException"); + + var Ice = global.Ice || {}; + + // + // Local aliases. + // + var Debug = Ice.Debug; + var BasicStream = Ice.BasicStream; + var EndpointParseException = Ice.EndpointParseException; + var OpaqueEndpointI = Ice.OpaqueEndpointI; + var Protocol = Ice.Protocol; + + var EndpointFactoryManager = Ice.Class({ + __init__: function(instance) + { + this._instance = instance; + this._factories = []; + }, + add: function(factory) + { + for(var i = 0; i < this._factories.length; ++i) + { + Debug.assert(this._factories[i].type() != factory.type()); + } + + this._factories.push(factory); + }, + get: function(type) + { + for(var i = 0; i < this._factories.length; ++i) + { + if(this._factories[i].type() === type) + { + return this._factories[i]; + } + } + return null; + }, + create: function(str, oaEndpoint) + { + var s = str.trim(); + if(s.length === 0) + { + throw new EndpointParseException("value has no non-whitespace characters"); + } + + var protocol; + var rest = ""; + var i, length; + var pos = s.search(/[ \t\n\r]+/); + if(pos === -1) + { + protocol = s; + } + else + { + protocol = s.substring(0, pos); + if(pos < s.length) + { + rest = s.substring(pos); + } + } + + if(protocol === "default") + { + protocol = this._instance.defaultsAndOverrides().defaultProtocol; + } + + for(i = 0, length = this._factories.length; i < length; ++i) + { + if(this._factories[i].protocol() === protocol) + { + return this._factories[i].create(rest, oaEndpoint); + } + } + + // + // If the stringified endpoint is opaque, create an unknown endpoint, + // then see whether the type matches one of the known endpoints. + // + if(protocol === "opaque") + { + var ue = OpaqueEndpointI.fromString(rest); + for(i = 0, length = this._factories.length; i < length; ++i) + { + if(this._factories[i].type() == ue.type()) + { + // + // Make a temporary stream, write the opaque endpoint data into the stream, + // and ask the factory to read the endpoint data from that stream to create + // the actual endpoint. + // + var bs = new BasicStream(this._instance, Protocol.currentProtocolEncoding, true); + ue.streamWrite(bs); + bs.pos = 0; + bs.readShort(); // type + return this._factories[i].read(bs); + } + } + return ue; // Endpoint is opaque, but we don't have a factory for its type. + } + + return null; + }, + read: function(s) + { + var type = s.readShort(); + + for(var i = 0; i < this._factories.length; ++i) + { + if(this._factories[i].type() == type) + { + return this._factories[i].read(s); + } + } + return OpaqueEndpointI.fromStream(type, s); + }, + destroy: function() + { + for(var i = 0; i < this._factories.length; ++i) + { + this._factories[i].destroy(); + } + this._factories = []; + } + }); + + Ice.EndpointFactoryManager = EndpointFactoryManager; + global.Ice = Ice; +}(typeof (global) === "undefined" ? window : global)); |