diff options
Diffstat (limited to 'dotnet/client-010/management/console/Session.cs')
-rw-r--r-- | dotnet/client-010/management/console/Session.cs | 796 |
1 files changed, 0 insertions, 796 deletions
diff --git a/dotnet/client-010/management/console/Session.cs b/dotnet/client-010/management/console/Session.cs deleted file mode 100644 index d9c5948e57..0000000000 --- a/dotnet/client-010/management/console/Session.cs +++ /dev/null @@ -1,796 +0,0 @@ -/* - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -using System; -using System.Collections.Generic; -using System.IO ; -using System.Reflection ; -using System.Threading ; -using log4net ; -using org.apache.qpid.client ; -using org.apache.qpid.transport.util; -using org.apache.qpid.transport.codec ; - -namespace org.apache.qpid.console -{ - - /** - * Main Interaction point for interaction with the bus. Can be used to locate objects - * on the bus, and invoke messages on them. - */ - public class Session - { - public static ILog log = LogManager.GetLogger(typeof(Session)) ; - - public static int CONTEXT_SYNC = 1 ; - public static int CONTEXT_STARTUP = 2 ; - public static int CONTEXT_MULTIGET = 3 ; - public static int DEFAULT_GET_WAIT_TIME = 60000 ; - - public bool RecieveObjects = true ; - public bool RecieveEvents = true ; - public bool RecieveHeartbeat = true ; - public bool UserBindings = false ; - public Console Console ; - - protected Dictionary<string, Dictionary<string, SchemaClass>> Packages = new Dictionary<string, Dictionary<string, SchemaClass>>() ; - protected List<Broker> Brokers = new List<Broker>() ; - protected SequenceManager SequenceManager = new SequenceManager() ; - protected object LockObject = new Object(); - protected List<long> SyncSequenceList = new List<long>() ; - protected List<QMFObject> GetResult ; - protected Object SyncResult ; - - public Session() - { - } - - public Session(Console console) { - Console = console ; - } - - public void AddBroker(string url) { - BrokerURL brokerurl = GetBrokerURL(url) ; - Broker broker = new Broker(this, brokerurl) ; - Brokers.Add(broker) ; - - Dictionary<string, object> args = new Dictionary<string, object>() ; - args.Add("_class", "agent") ; - args.Add("_broker", broker) ; - this.GetObjects(args) ; - } - - public void RemoveBroker(Broker broker) { - if (Brokers.Contains(broker)) { - Brokers.Remove(broker) ; - } - - broker.Shutdown() ; - } - - public void Close() { - foreach (Broker broker in Brokers.ToArray()) { - this.RemoveBroker(broker) ; - } - } - - protected BrokerURL GetBrokerURL(string url) { - return new BrokerURL(url) ; - } - - - public List<QMFObject> GetObjects(Dictionary<string, object> args) { - List<Broker> brokerList = null ; - List<Agent> agentList = new List<Agent>() ; - - if (args.ContainsKey("_broker")) { - brokerList = new List<Broker>() ; - brokerList.Add((Broker)args["_broker"]) ; - } else { - brokerList = this.Brokers ; - } - - foreach (Broker broker in brokerList) { - broker.WaitForStable() ; - } - - if (args.ContainsKey("_agent")) { - Agent agent = (Agent)args["_agent"] ; - if (brokerList.Contains(agent.Broker)) { - agentList.Add(agent) ; - } else { - throw new Exception("Agent is not managed by this console or the supplied broker") ; - } - } else { - if (args.ContainsKey("_objectId")) { - ObjectID oid = (ObjectID) args["_objectId"] ; - foreach (Broker broker in Brokers) { - foreach (Agent agent in broker.Agents.Values) { - if ((agent.AgentBank == oid.AgentBank()) && (agent.BrokerBank == oid.BrokerBank())) { - agentList.Add(agent) ; - } - } - } - } - else { - foreach (Broker broker in brokerList) { - foreach (Agent agent in broker.Agents.Values) { - if (agent.Broker.IsConnected()) { - agentList.Add(agent) ; - } - } - } - } - } - - GetResult = new List<QMFObject>() ; - - if (agentList.Count > 0) { - //FIXME Add a bunch of other suff too - foreach (Agent agent in agentList) { - Dictionary<string, object> getParameters = new Dictionary<string, object>() ; - Broker broker = agent.Broker ; - long seq = -1 ; - lock(LockObject) { - seq = SequenceManager.Reserve(Session.CONTEXT_MULTIGET) ; - SyncSequenceList.Add(seq) ; - } - object packageName = null ; - object className = null ; - object key = null ; - object sClass = null ; - object oid = null ; - object hash = null ; - - args.TryGetValue("_schema", out sClass) ; - args.TryGetValue("_key", out key) ; - args.TryGetValue("_class", out className) ; - args.TryGetValue("_package", out packageName) ; - args.TryGetValue("_objectID", out oid) ; - args.TryGetValue("_hash", out hash) ; - - if ((className == null) && (oid == null) && (oid == null)) { - throw new Exception("No class supplied, use '_schema', '_key', '_class', or '_objectId' argument") ; - } - - if (oid != null) { - getParameters.Add("_objectID", oid) ; - } - else { - if (sClass != null) { - key = key ?? ((SchemaClass)sClass).Key ; - } - if (key != null) { - ClassKey cKey = (ClassKey)key ; - className = className ?? cKey.ClassName ; - packageName = packageName ?? cKey.PackageName ; - hash = hash ?? cKey.Hash ; - } - - if (packageName != null) { - getParameters.Add("_package", packageName) ; - } - if (className != null) { - getParameters.Add("_class", className) ; - } - if (hash != null) { - getParameters.Add("_hash", hash) ; - } - foreach (KeyValuePair<string, object> pair in args) { - if (!pair.Key.StartsWith("_")) { - getParameters.Add(pair.Key, pair.Value) ; - } - } - } - - IEncoder enc = broker.CreateEncoder('G', seq) ; - enc.WriteMap(getParameters) ; - string routingKey = String.Format("agent.{0}.{1}", agent.BrokerBank, agent.AgentBank) ; - Message msg = broker.CreateMessage(enc, routingKey) ; - log.Debug("Get Object Keys: ") ; - foreach (string pKey in getParameters.Keys) { - log.Debug(String.Format("\tKey: '{0}' Value: '{1}'", pKey, getParameters[pKey])) ; - } - broker.Send(msg) ; - } - - int waittime = DEFAULT_GET_WAIT_TIME ; - bool timeout = false ; - if (args.ContainsKey("_timeout")) { - waittime = (int) args["_timeout"] ; - } - DateTime start = DateTime.Now ; - lock (LockObject) { - // FIXME ERROR - while (SyncSequenceList.Count > 0){ - Monitor.Wait(LockObject,waittime) ; - TimeSpan duration = DateTime.Now - start; - if (duration.TotalMilliseconds > waittime) { - foreach (long pendingSeq in SyncSequenceList) { - SequenceManager.Release(pendingSeq) ; - } - SyncSequenceList.Clear() ; - timeout = true ; - } - } - } - - //FIXME Add the error logic - if ((GetResult.Count == 0) && timeout) { - throw new Exception ("Get Request timed out") ; - } - } - return GetResult ; - } - - public List<string> GetPackages() { - this.WaitForStable() ; - List<string> returnValue = new List<string>() ; - foreach (String name in Packages.Keys) { - returnValue.Add(name) ; - } - - return returnValue ; - } - - public List<ClassKey> GetClasses(string packageName) { - List<ClassKey> returnValue = new List<ClassKey>() ; - this.WaitForStable() ; - - if (Packages.ContainsKey(packageName)) { - foreach (SchemaClass sClass in Packages[packageName].Values) { - returnValue.Add(sClass.Key) ; - } - } - - return returnValue ; - } - - public SchemaClass GetSchema(ClassKey key) { - return GetSchema(key, true) ; - } - - protected SchemaClass GetSchema(ClassKey key, bool waitForStable) { - if (waitForStable) { - this.WaitForStable() ; - } - - SchemaClass returnValue = null ; - - try { - returnValue = Packages[key.PackageName][key.GetKeyString()] ; - } - catch (KeyNotFoundException) { - // eat it - } - - return returnValue ; - } - - - protected void WaitForStable() { - foreach (Broker broker in Brokers) { - broker.WaitForStable() ; - } - } - - - public Broker GetBroker(long BrokerBank) { - Broker returnValue = null ; - - foreach (Broker broker in Brokers) { - if (broker.BrokerBank() == BrokerBank) { - returnValue = broker ; - break ; - } - } - - return returnValue ; - } - - public MethodResult InvokeMethod(QMFObject obj, string name, List<object> args, bool synchronous, int timeToLive) { - Broker aBroker = this.GetBroker(obj.BrokerBank()) ; - - long seq = this.SendMethodRequest(obj, aBroker, name, args, synchronous, timeToLive) ; - if (seq != 0) { - if (!synchronous) { - return null ; - } - try { - aBroker.WaitForSync(timeToLive) ; - } catch (Exception e) { - SequenceManager.Release(seq) ; - throw e ; - } - - // FIXME missing error logic in the broker - return (MethodResult) SyncResult ; - } - - return null ; - } - - protected long SendMethodRequest(QMFObject obj, Broker aBroker, string name, List<object> args, bool synchronous, int timeToLive) { - - SchemaMethod method = obj.Schema.GetMethod(name) ; - if (args == null) { - args = new List<object>() ; - } - - long seq = 0 ; - if (method != null) { - KeyValuePair<SchemaMethod, bool> pair = new KeyValuePair<SchemaMethod, bool>(method, synchronous) ; - seq = SequenceManager.Reserve(pair) ; - IEncoder enc = aBroker.CreateEncoder('M', seq) ; - obj.ObjectID.encode(enc) ; - obj.Schema.Key.encode(enc) ; - enc.WriteStr8(name) ; - - if (args.Count < method.InputArgCount) { - throw new Exception(String.Format("Incorrect number of arguments: expected {0}, got{1}", method.InputArgCount, args.Count)) ; - } - - int argIndex = 0 ; - foreach (SchemaArgument arg in method.Arguments) { - if (arg.IsInput()) {; - this.EncodeValue(enc, arg.Type, args[argIndex]) ; - argIndex += 1 ; - } - } - - Message msg = aBroker.CreateMessage(enc,obj.RoutingKey(),timeToLive) ; - - if (synchronous) { - aBroker.SetSyncInFlight(true) ; - } - aBroker.Send(msg) ; - } - return seq ; - } - - public QMFObject MakeObject(ClassKey key) { - SchemaClass sClass = this.GetSchema(key) ; - if (sClass == null) { - throw new Exception("No schema found for class " + key.ToString()) ; - } - - return this.CreateQMFObject(sClass, true, true, false) ; - } - - public QMFObject MakeObject(String keyString) { - return this.MakeObject(new ClassKey(keyString)) ; - } - - // Callback Methods - public void HandleNewAgent(Agent agent) { - if (Console != null) { - Console.NewAgent(agent) ; - } - } - - public void HandleAgentRemoved(Agent agent) { - if (Console != null) { - Console.AgentRemoved(agent) ; - } - } - - public void HandleBrokerConnect(Broker broker) { - if (Console != null) { - Console.BrokerConnected(broker) ; - } - } - - public void HandleBrokerDisconnect(Broker broker) { - if (Console != null) { - Console.BrokerDisconnected(broker) ; - } - } - - public void HandleBrokerResponse(Broker broker, IDecoder decoder, long sequence) { - if (Console != null) { - Console.BrokerInformation(broker) ; - } - - long seq = SequenceManager.Reserve(CONTEXT_STARTUP) ; - IEncoder endocder = broker.CreateEncoder('P', seq) ; - broker.Send(endocder) ; - } - - public void HandlePackageIndicator(Broker broker, IDecoder decoder, long sequence) { - string packageName = decoder.ReadStr8() ; - bool notify = false ; - if (!Packages.ContainsKey(packageName)) { - lock (LockObject) { - Packages[packageName] = new Dictionary<string, SchemaClass>() ; - notify = true ; - } - } - - if (notify && Console != null) { - Console.NewPackage(packageName) ; - } - - broker.IncrementOutstanding() ; - long seq = SequenceManager.Reserve(Session.CONTEXT_STARTUP) ; - IEncoder enc = broker.CreateEncoder('Q', seq) ; - enc.WriteStr8(packageName) ; - broker.Send(enc) ; - } - - public void HandleCommandComplete(Broker broker, IDecoder decoder, long sequence) { - - long code = decoder.ReadUint32() ; - string text = decoder.ReadStr8() ; - Object context = this.SequenceManager.Release(sequence) ; - - if (context.Equals(CONTEXT_STARTUP)) { - broker.DecrementOutstanding() ; - } else { - if ((context.Equals(CONTEXT_SYNC)) & broker.GetSyncInFlight()) { - broker.SetSyncInFlight(false) ; - } else { - if (context.Equals(CONTEXT_MULTIGET) && SyncSequenceList.Contains(sequence)) { - lock(LockObject) { - SyncSequenceList.Remove(sequence) ; - if (SyncSequenceList.Count == 0) { - Monitor.PulseAll(LockObject) ; - } - } - } - } - } - } - - public void HandleClassIndicator(Broker broker, IDecoder decoder, long sequence) { - short kind = decoder.ReadUint8() ; - ClassKey classKey = new ClassKey(decoder) ; - bool unknown = false ; - - - lock (LockObject) { - if (Packages.ContainsKey(classKey.PackageName)) { - if (!Packages[classKey.PackageName].ContainsKey(classKey.GetKeyString())) { - unknown = true ; - } - } - } - - if (unknown) { - broker.IncrementOutstanding() ; - long seq = SequenceManager.Reserve(Session.CONTEXT_STARTUP) ; - IEncoder enc = broker.CreateEncoder('S', seq) ; - classKey.encode(enc) ; - broker.Send(enc) ; - } - } - - public void HandleMethodResponse(Broker broker, IDecoder decoder, long sequence) { - long code = decoder.ReadUint32() ; - string text = decoder.ReadStr16() ; - - Dictionary<string, object> outArgs = new Dictionary<string, object>() ; - object obj = SequenceManager.Release(sequence) ; - - if (obj == null) { - return ; - } - - KeyValuePair<SchemaMethod, bool> pair = (KeyValuePair<SchemaMethod, bool>) obj ; - if (code == 0) { - foreach (SchemaArgument arg in pair.Key.Arguments) { - if (arg.IsOutput()) { - outArgs.Add(arg.Name, this.DecodeValue(decoder, arg.Type)) ; - } - } - } - - MethodResult result = new MethodResult(code, text, outArgs) ; - - if (pair.Value) { - this.SyncResult = result; - broker.SetSyncInFlight(false) ; - } - - if (Console != null) { - Console.MethodResponse(broker, sequence, result) ; - } - } - - public void HandleHeartbeatIndicator(Broker broker, IDecoder decoder, long sequence, IMessage msg) { - if (Console != null) { - long brokerBank = 1 ; - long agentBank = 0 ; - try { - string routingKey = msg.DeliveryProperties.GetRoutingKey() ; - if (routingKey != null) { - agentBank = Agent.GetBrokerBank(routingKey) ; - brokerBank = Agent.GetBrokerBank(routingKey) ; - } - } - catch (Exception e) { - log.Warn("Internal QPID error", e) ; - } - - string agentKey = Agent.AgentKey(agentBank, brokerBank) ; - long timestamp = decoder.ReadUint64() ; - if (broker.Agents.ContainsKey(agentKey)) { - Agent agent = broker.Agents[agentKey] ; - Console.HearbeatRecieved(agent, timestamp) ; - } - } - - } - - public void HandleEventIndicator(Broker broker, IDecoder decoder, long sequence) { - if (Console != null) { - QMFEvent newEvent = new QMFEvent(this, decoder) ; - Console.EventRecieved(broker, newEvent) ; - } - } - - public void HandleSchemaResponse(Broker broker, IDecoder decoder, long sequence) { - short kind = decoder.ReadUint8() ; - ClassKey classKey = new ClassKey(decoder) ; - SchemaClass sClass = new SchemaClass(kind, classKey, decoder, this) ; - lock(LockObject) { - Dictionary<string, SchemaClass> classMappings = Packages[sClass.PackageName] ; - classMappings.Remove(sClass.ClassKeyString) ; - classMappings.Add(sClass.ClassKeyString, sClass) ; - } - - SequenceManager.Release(sequence) ; - broker.DecrementOutstanding() ; - if (Console != null) { - this.Console.NewClass(kind, classKey) ; - } - } - - public void HandleContentIndicator(Broker broker, IDecoder decoder, long sequence, bool hasProperties, bool hasStatistics) { - - ClassKey key = new ClassKey(decoder) ; - SchemaClass sClass = null ;; - lock (LockObject) { - sClass = GetSchema(key, false) ; - } - if (sClass != null) { - QMFObject obj = this.CreateQMFObject(sClass, decoder, hasProperties, hasStatistics, true) ; - - if (key.PackageName.Equals("org.apache.qpid.broker") && key.ClassName.Equals("agent") && hasProperties) { - broker.UpdateAgent(obj) ; - } - - lock (LockObject) { - if (SyncSequenceList.Contains(sequence)) { - if (!obj.IsDeleted() && this.SelectMatch(obj)) { - GetResult.Add(obj) ; - } - } - } - - if (Console != null) { - if (hasProperties) { - Console.ObjectProperties(broker, obj) ; - } - if (hasStatistics) { - Console.ObjectStatistics(broker, obj) ; - } - } - } - } - - public bool SelectMatch(QMFObject obj) { - return true ; - } - - public object DecodeValue(IDecoder dec, short type) { - - switch (type) { - case 1: return dec.ReadUint8() ; // U8 - case 2: return dec.ReadUint16() ; // U16 - case 3: return dec.ReadUint32() ; // U32 - case 4: return dec.ReadUint64() ; // U64 - case 6: return dec.ReadStr8() ; // SSTR - case 7: return dec.ReadStr16() ; // LSTR - case 8: return dec.ReadDatetime() ; // ABSTIME - case 9: return dec.ReadUint32() ; // DELTATIME - case 10: return new ObjectID(dec) ; // ref - case 11: return dec.ReadUint8() != 0 ; // bool - case 12: return dec.ReadFloat() ; // float - case 13: return dec.ReadDouble() ; // double - case 14: return dec.ReadUuid() ; // UUID - case 15: return dec.ReadMap() ; // Ftable - case 16: return dec.ReadInt8() ; // int8 - case 17: return dec.ReadInt16() ; // int16 - case 18: return dec.ReadInt32() ; // int32 - case 19: return dec.ReadInt64() ; // int64 - case 20: // Object - // Peek into the inner type code, make sure - // it is actually an object - object returnValue = null ; - short innerTypeCode = dec.ReadUint8() ; - if (innerTypeCode != 20) { - returnValue = this.DecodeValue(dec, innerTypeCode) ; - } - else { - ClassKey classKey = new ClassKey(dec) ; - lock(LockObject) { - SchemaClass sClass = GetSchema(classKey) ; - if (sClass != null) { - returnValue = this.CreateQMFObject(sClass, dec, true, true, false) ; - } - } - } - return returnValue; - case 21: // List - { - MSDecoder lDec = new MSDecoder(); - lDec.Init(new MemoryStream(dec.ReadVbin32())); - long count = lDec.ReadUint32(); - List<object> newList = new List<object>(); - while (count > 0) - { - short innerType = lDec.ReadUint8(); - newList.Add(this.DecodeValue(lDec, innerType)); - count -= 1; - } - return newList; - } - case 22: // Array - { - MSDecoder aDec = new MSDecoder(); - aDec.Init(new MemoryStream(dec.ReadVbin32())); - long cnt = aDec.ReadUint32(); - short innerType = aDec.ReadUint8(); - List<object> aList = new List<object>(); - while (cnt > 0) - { - aList.Add(this.DecodeValue(aDec, innerType)); - cnt -= 1; - } - return aList; - } - default: - throw new Exception(String.Format("Invalid Type Code: {0}", type)) ; - } - } - - - public void EncodeValue(IEncoder enc, short type, object val) { - try { - switch ((int)type) { - case 1: enc.WriteUint8((short) val) ; break; // U8 - case 2: enc.WriteUint16((int) val) ; break; // U16 - case 3: enc.WriteUint32((long) val) ; break; // U32 - case 4: enc.WriteUint64((long) val) ; break; // U64 - case 6: enc.WriteStr8((string) val) ; break; // SSTR - case 7: enc.WriteStr16((string) val) ; break; // LSTR - case 8: enc.WriteDatetime((long) val); break; // ABSTIME - case 9: enc.WriteUint32((long) val); break; // DELTATIME - case 10: ((ObjectID)val).encode(enc) ; break; // ref - case 11: - if ((bool) val) { - enc.WriteUint8(1) ; - } else { - enc.WriteUint8(0) ; - } - break ; - case 12: enc.WriteFloat((float) val); break; // FLOAT - case 13: enc.WriteDouble((double) val); break; // DOUBLE - case 14: enc.WriteUuid((UUID) val) ; break ; // UUID - case 15: enc.WriteMap((Dictionary<string, object>) val) ; break ; // Ftable - case 16: enc.WriteInt8((short) val) ; break; // int8 - case 17: enc.WriteInt16((int) val) ; break; // int16 - case 18: enc.WriteInt32(long.Parse(""+ val)) ; break; // int32 - case 19: enc.WriteInt64(long.Parse("" + val)) ; break; // int64 - case 20: // Object - // Check that the object has a session, if not - // take ownership of it - QMFObject qObj = (QMFObject) val ; - if (qObj.Session == null) { - qObj.Session = this ; - } - qObj.Encode(enc) ; - break; - case 21: // List - List<object> items = (List<object>) val ; - MSEncoder lEnc = new MSEncoder(1) ; - lEnc.Init() ; - lEnc.WriteUint32(items.Count) ; - foreach (object obj in items) { - short innerType = Util.QMFType(obj) ; - lEnc.WriteUint8(innerType) ; - this.EncodeValue(lEnc,innerType,obj) ; - } - enc.WriteVbin32(lEnc.Segment().ToArray()) ; - break ; - case 22: // Array - List<object> aItems = (List<object>) val ; - MSEncoder aEnc = new MSEncoder(1) ; - aEnc.Init() ; - long aCount = aItems.Count ; - aEnc.WriteUint32(aCount) ; - if (aCount > 0) { - Object anObj = aItems[0] ; - short innerType = Util.QMFType(anObj) ; - aEnc.WriteUint8(innerType) ; - foreach (object obj in aItems) { - this.EncodeValue(aEnc,innerType,obj) ; - } - } - enc.WriteVbin32(aEnc.Segment().ToArray()) ; - break ; - default: - throw new Exception(String.Format("Invalid Type Code: {0}", type)) ; - } - } - catch (System.InvalidCastException e) { - string msg = String.Format("Class cast exception for typecode {0}, type {1} ", type, val.GetType()) ; - log.Error(msg) ; - throw new Exception(msg + type, e) ; - } - } - - public List<string> BindingKeys() { - List<string> bindings = new List<string>() ; - bindings.Add("schema.#") ; - if (RecieveObjects & RecieveEvents & RecieveHeartbeat & !UserBindings) { - bindings.Add("console.#") ; - } - else { - if (RecieveObjects & !UserBindings) { - bindings.Add("console.obj.#") ; - } - else { - bindings.Add("console.obj.*.*.org.apache.qpid.broker.agent") ; - } - if (RecieveEvents) { - bindings.Add("console.event.#") ; - } - if (RecieveHeartbeat) { - bindings.Add("console.heartbeat.#") ; - } - } - return bindings ; - } - - protected QMFObject CreateQMFObject(SchemaClass schema, bool hasProperties, bool hasStats , bool isManaged) { - Type realClass = typeof(QMFObject) ; - if (Console != null) { - realClass = Console.TypeMapping(schema.Key) ; - } - Type[] types = new Type[] {typeof(Session), typeof(SchemaClass), typeof(bool), typeof(bool),typeof(bool)} ; - object[] args = new object[] {this, schema, hasProperties, hasStats, isManaged} ; - ConstructorInfo ci = realClass.GetConstructor(types); - return (QMFObject) ci.Invoke(args) ; - } - - protected QMFObject CreateQMFObject(SchemaClass schema, IDecoder dec, bool hasProperties, bool hasStats , bool isManaged) { - Type realClass = typeof(QMFObject) ; - if (Console != null) { - realClass = Console.TypeMapping(schema.Key) ; - } - Type[] types = new Type[] {typeof(Session), typeof(SchemaClass), typeof(IDecoder), typeof(bool), typeof(bool),typeof(bool)} ; - object[] args = new object[] {this, schema, dec, hasProperties, hasStats, isManaged} ; - ConstructorInfo ci = realClass.GetConstructor(types); - return (QMFObject) ci.Invoke(args) ; - } - } -} |