public ParametersNativeDll(IExternalType nativeDll, Interface inter, Uri dataFile, bool debuggerLaunch)
        {
            if (nativeDll == null)
                nativeDll = new ExternalType();

            _nativeDllImplementingNetAssembly = (ExternalType)nativeDll.Clone();
            _interface = inter;
            _debuggerLaunch = debuggerLaunch;
        }
        public void Initialise(XElement xElement, IDocumentAccessor accessor)
        {
            xElement = Persistence.ThisOrSingleChild(XName, xElement);

            string inter = Utilities.Xml.GetAttribute(xElement, "interface");

            _interface = (Interface)Enum.Parse(typeof(Interface), inter);

            _nativeDllImplementingNetAssembly = null;

            XElement xdllDotNetStub = xElement
                .Elements("ExternalType")
                .SingleOrDefault();

            if (xdllDotNetStub != null)
            {
                _nativeDllImplementingNetAssembly = new ExternalType(accessor);
                _nativeDllImplementingNetAssembly.Initialise(xdllDotNetStub, accessor);
            }

            _debuggerLaunch = Utilities.Xml.GetAttribute(xElement, "debuggerLaunch", false);
        }
        public BaseComponentWithEngine(IIdentifiable identity, ExternalType derivedComponentType, ExternalType engineType, bool useNativeDllArgument)
            : base(identity, true, null, null, null, null)
        {
            _derivedComponentType = derivedComponentType;
            _engineType = engineType;

            _useNativeDll = useNativeDllArgument;

            SetArgCaption();

            ArgumentsAddRange(new IArgument[]
            {
                _argCaption,
                new ArgumentParametersDiagnosticsEngine(GetArgumentIdentity(ArgsWithEngine.Diagnostics),
                    new ParametersDiagnosticsNative()),
                new ArgumentParametersRemoting(GetArgumentIdentity(ArgsWithEngine.Remoting),
                    new ParametersRemoting()),
            });

            if (_useNativeDll)
                Arguments.Add(new ArgumentNativeDll(GetArgumentIdentity(ArgsWithEngine.NativeDll),
                    new ParametersNativeDll()));
        }
        public virtual void Initialise(XElement xElement, IDocumentAccessor accessor)
        {
            xElement = Persistence.ThisOrSingleChild(XName, xElement);

            IEnumerable<IArgument> arguments;
            IEnumerable<IBaseInput> inputs;
            IEnumerable<IBaseOutput> outputs;

            Identity = Persistence.BaseComponent.Parse(xElement, accessor, out arguments, out inputs, out outputs);

            Arguments = arguments.ToList();

            SetArgCaption();

            Inputs = inputs.ToList();
            Outputs = outputs.ToList();

            foreach (var i in Inputs)
                if (i is BaseExchangeItem)
                    ((BaseExchangeItem)i).Component = this;

            foreach (var i in Outputs)
                if (i is BaseExchangeItem)
                    ((BaseExchangeItem)i).Component = this;

            _useNativeDll = Utilities.Xml.GetAttribute(xElement, "useNativeDllArgument", false);

            int traceTo = int.Parse(Utilities.Xml.GetAttribute(xElement, "traceTo"));

            _writeTo = (WriteTo)traceTo;

            var derivedComponentType = xElement
                .Elements("DerivedComponentType")
                .SingleOrDefault();

            _derivedComponentType = derivedComponentType != null
                ? new ExternalType(derivedComponentType, accessor)
                : null;

            var engineType = xElement
                .Elements("EngineType")
                .SingleOrDefault();

            _engineType = engineType != null
                ? new ExternalType(engineType, accessor)
                : null;

            _engine = null;

            _activeInputs = new List<IBaseInput>();
            _activeOutputs = new List<IBaseOutput>();
        }
 /// <summary>
 /// Contract that developer expects previous code to have been already honoured 
 /// </summary>
 /// <param name="condition">True if contract has been honoured</param>
 /// <param name="conditionAsString">Message to display if contract failed</param>
 internal static void Requires(IExternalType derivedClass, bool condition, string conditionAsString)
 {
     ContractBase.Requires(typeof(Contract), condition, conditionAsString);
 }
            public void PrePrepare(
               LinkableComponentOpenMIV1Wrapper component2,
               IExternalType component1ExternalType, 
               double startTime, double updateLinkTimeIncrement,
               List<IBaseInput> activeInputs, List<IBaseOutput> activeOutputs)
            {
                Type tComponentV1;

                Component1
                    = component1ExternalType.CreateInstance(out tComponentV1)
                    as OpenMI.Standard.ILinkableComponent;

                if (Component1 == null)
                    throw new Exception("Cannot instantiate " + component1ExternalType.ToString());

                Component1.Initialize(component2.Arguments1.ToArray());

                _currentTime = startTime;
                _updateLinkTimeIncrement = updateLinkTimeIncrement;

                   // Create internal links between components 1 and 2
                   // T2 --> T1
                   // S1 --> S2

                Utilities.Standard1.TimeSpan timeHorizon1
                    = new Utilities.Standard1.TimeSpan(component2.TimeExtent.TimeHorizon);

                OpenMI.Standard.IInputExchangeItem input;
                OpenMI.Standard.IOutputExchangeItem output;
                OpenMI.Standard.ILink internalLink;

                ITimeSpaceExchangeItem itemTimeSpace;

                string idQuantity, idElementSet;

                activeInputs.ForEach(i =>
                    {
                        idQuantity = i.ValueDefinition.Caption;

                        itemTimeSpace = i as ITimeSpaceExchangeItem;
                        idElementSet = itemTimeSpace == null
                            ? i.Caption // what else?
                            : itemTimeSpace.SpatialDefinition.Caption;

                        internalLink = null;

                        for (int n = 0; n < _component1.InputExchangeItemCount; ++n)
                        {
                            input = _component1.GetInputExchangeItem(n);

                            if (input.Quantity.ID != idQuantity
                                || input.ElementSet.ID != idElementSet)
                                continue;

                            var isVector = input.Quantity.ValueType == OpenMI.Standard.ValueType.Vector;

                            // Get providers convertot to use directly

                            Contract.Requires(i.Provider is IHasValueSetConvertor,
                                "i.Provider is IHasValueSetConvertor");

                            var convertorProvider = ((IHasValueSetConvertor)i.Provider).ValueSetConverter
                                as IValueSetConverterTime;

                            Contract.Requires(convertorProvider != null,
                                "i.Provider.ValueSetConverter is IValueSetConverterTime");

                            internalLink = new Utilities.Standard1.InternalLink(
                                _component1, input, timeHorizon1, convertorProvider, isVector);

                            _linksIn.Add(internalLink);

                            _component1.AddLink(internalLink);

                            break;
                        }

                        if (internalLink == null)
                            throw new Exception(string.Format(
                                "OpenMI.Standard.IOutputExchangeItem not found with Qualtity,ElementSet ids if \"{0}\",\"{1}\"",
                                idQuantity, idElementSet));
                    });

                activeOutputs.ForEach(o =>
                    {
                        idQuantity = o.ValueDefinition.Caption;

                        itemTimeSpace = o as ITimeSpaceExchangeItem;
                        idElementSet = itemTimeSpace == null
                            ? o.Caption // what else?
                            : itemTimeSpace.SpatialDefinition.Caption;

                        internalLink = null;

                        for (int n = 0; n < _component1.OutputExchangeItemCount; ++n)
                        {
                            output = _component1.GetOutputExchangeItem(n);

                            if (output.Quantity.ID != idQuantity
                                || output.ElementSet.ID != idElementSet)
                                continue;

                            internalLink = new Utilities.Standard1.InternalLink(_component1, output, timeHorizon1);

                            _linksOut.Add(internalLink);

                            _component1.AddLink(internalLink);

                            if (((IHasValueSetConvertor)o).ValueSetConverter is ValueSetConverterTimeEngineDoubleStandard1)
                            {
                                var convertor = (ValueSetConverterTimeEngineDoubleStandard1)((IHasValueSetConvertor)o).ValueSetConverter;

                                //convertor.SetRuntime(this, internalLink);
                            }
                            else if (((IHasValueSetConvertor)o).ValueSetConverter is ValueSetConverterTimeEngineDoubleVector3dStandard1)
                            {
                                var convertor = (ValueSetConverterTimeEngineDoubleVector3dStandard1)((IHasValueSetConvertor)o).ValueSetConverter;

                                //convertor.SetRuntime(this, internalLink);
                            }
                            else
                                throw new Exception("o.ValueSetConverter as ValueSetConverterTimeEngineDouble?");

                            break;
                        }

                        if (internalLink == null)
                            throw new Exception(string.Format(
                                "OpenMI.Standard.IInputExchangeItem not found with Qualtity,ElementSet ids if \"{0}\",\"{1}\"",
                                idQuantity, idElementSet));
                    });

                if (_linksOut.Count < 1)
                    throw new Exception("At least one output link must be specified");
            }