summaryrefslogtreecommitdiff
path: root/js/src/Ice/EndpointFactoryManager.js
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2014-03-19 12:45:55 -0700
committerMark Spruiell <mes@zeroc.com>2014-03-19 12:45:55 -0700
commitcdcffbcc3c3c052afdeb772ff0167e7a90b525bb (patch)
tree4f16ee41ef7d33394c44e9db81e4d6cd89908250 /js/src/Ice/EndpointFactoryManager.js
parentfixing testicedist.py for 5487 (diff)
downloadice-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.js146
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));