示例#1
0
        /// <summary>
        /// Creates and routes a packet with data from a binary stream.
        /// </summary>
        public void DeserializeAndRoutePacket(int nodeId, NodePacketType packetType, INodePacketTranslator translator)
        {
            // PERF: Not using VerifyThrow to avoid boxing of packetType in the non-error case
            if (!_packetFactories.ContainsKey(packetType))
            {
                ErrorUtilities.ThrowInternalError("No packet handler for type {0}", packetType);
            }

            PacketFactoryRecord record = _packetFactories[packetType];
            record.DeserializeAndRoutePacket(nodeId, translator);
        }
示例#2
0
        /// <summary>
        /// Translate the TargetOutputs for the target finished event.
        /// </summary>
        private static void TranslateTargetFinishedEvent(INodePacketTranslator translator, TargetFinishedEventArgs finishedEvent)
        {
            List<TaskItem> targetOutputs = null;
            if (translator.Mode == TranslationDirection.WriteToStream)
            {
                if (finishedEvent.TargetOutputs != null)
                {
                    targetOutputs = new List<TaskItem>();
                    foreach (TaskItem item in finishedEvent.TargetOutputs)
                    {
                        targetOutputs.Add(item);
                    }
                }
            }

            translator.Translate<TaskItem>(ref targetOutputs, TaskItem.FactoryForDeserialization);

            if (translator.Mode == TranslationDirection.ReadFromStream)
            {
                finishedEvent.TargetOutputs = targetOutputs;
            }
        }
 /// <summary>
 /// Translates the packet to/from binary form.
 /// </summary>
 /// <param name="translator">The translator to use.</param>
 public void Translate(INodePacketTranslator translator)
 {
     translator.Translate(ref _nodeId);
     translator.Translate(ref _startupDirectory);
     translator.TranslateDictionary(ref _buildProcessEnvironment, StringComparer.OrdinalIgnoreCase);
     translator.TranslateCulture(ref _culture);
     translator.TranslateCulture(ref _uiCulture);
     translator.TranslateDotNet(ref _appDomainSetup);
     translator.Translate(ref _lineNumberOfTask);
     translator.Translate(ref _columnNumberOfTask);
     translator.Translate(ref _projectFileOfTask);
     translator.Translate(ref _taskName);
     translator.Translate(ref _taskLocation);
     translator.TranslateDictionary(ref _taskParameters, StringComparer.OrdinalIgnoreCase, TaskParameter.FactoryForDeserialization);
     translator.Translate(ref _continueOnError);
 }
示例#4
0
 /// <summary>
 /// Private constructor for deserialization
 /// </summary>
 private BuildRequest(INodePacketTranslator translator)
 {
     Translate(translator);
 }
示例#5
0
        /// <summary>
        /// Writes the packet to the serializer.
        /// Always send as ints, even if ushorts are being used: otherwise it'd
        /// need a byte to discriminate and the savings would be microscopic.
        /// </summary>
        void INodePacketTranslatable.Translate(INodePacketTranslator translator)
        {
            ErrorUtilities.VerifyThrow(translator.Mode == TranslationDirection.WriteToStream, "write only");

            string file = File;
            int line = Line;
            int column = Column;
            translator.Translate(ref file);
            translator.Translate(ref line);
            translator.Translate(ref column);
        }
示例#6
0
 /// <summary>
 /// Factory for serialization.
 /// </summary>
 static internal WorkUnitResult FactoryForDeserialization(INodePacketTranslator translator)
 {
     return new WorkUnitResult(translator);
 }
示例#7
0
 /// <summary>
 /// The class factory for deserialization.
 /// </summary>
 internal static BuildParameters FactoryForDeserialization(INodePacketTranslator translator)
 {
     return new BuildParameters(translator);
 }
示例#8
0
 /// <summary>
 /// Serializes or deserializes a packet.
 /// </summary>
 public void Translate(INodePacketTranslator translator)
 {
     translator.TranslateEnum(ref _reason, (int)_reason);
     translator.TranslateDotNet(ref _exception);
 }
示例#9
0
 /// <summary>
 /// Constructor for deserialization
 /// </summary>
 private BuildResult(INodePacketTranslator translator)
 {
     ((INodePacketTranslatable)this).Translate(translator);
 }
示例#10
0
 /// <summary>
 /// Function for serialization.
 /// </summary>
 void INodePacketTranslatable.Translate(INodePacketTranslator translator)
 {
     translator.Translate(ref _toolsVersion);
     translator.Translate(ref _toolsPath);
     translator.TranslateProjectPropertyInstanceDictionary(ref _properties);
     translator.TranslateProjectPropertyInstanceDictionary(ref _environmentProperties);
     translator.TranslateProjectPropertyInstanceDictionary(ref _globalProperties);
     translator.TranslateDictionary(ref _subToolsets, StringComparer.OrdinalIgnoreCase, SubToolset.FactoryForDeserialization);
     translator.Translate(ref _overrideTasksPath);
     translator.Translate(ref _defaultOverrideToolsVersion);
 }
 public static INodePacket FactoryForDeserialization(INodePacketTranslator translator)
 {
     return(new SdkResolverResponse(translator));
 }
 public void Translate(INodePacketTranslator translator)
 {
     translator.Translate(ref _fullPath);
     translator.Translate(ref _version);
 }
 public SdkResolverResponse(INodePacketTranslator translator)
 {
     Translate(translator);
 }
示例#14
0
 /// <summary>
 /// Private constructor for deserialization
 /// </summary>
 private TargetResult(INodePacketTranslator translator)
 {
     ((INodePacketTranslatable)this).Translate(translator);
 }
示例#15
0
 /// <summary>
 /// Factory for the serializer.
 /// </summary>
 static internal ItemsStore FactoryForDeserialization(INodePacketTranslator translator)
 {
     return(new ItemsStore(translator));
 }
示例#16
0
 /// <summary>
 /// Factory for serialization.
 /// </summary>
 static internal INodePacket FactoryForDeserialization(INodePacketTranslator translator)
 {
     return new BuildRequest(translator);
 }
示例#17
0
 /// <summary>
 /// Factory for serialization
 /// </summary>
 static internal INodePacket FactoryForDeserialization(INodePacketTranslator translator)
 {
     return(new BuildResult(translator));
 }
示例#18
0
 /// <summary>
 /// Factory for deserialization.
 /// </summary>
 internal static INodePacket FactoryForDeserialization(INodePacketTranslator translator)
 {
     TaskHostTaskCancelled taskCancelled = new TaskHostTaskCancelled();
     taskCancelled.Translate(translator);
     return taskCancelled;
 }
 /// <summary>
 /// Private constructor for deserialization
 /// </summary>
 private BuildRequestConfiguration(INodePacketTranslator translator)
 {
     Translate(translator);
 }
示例#20
0
 /// <summary>
 /// Private constructor for translation
 /// </summary>
 private BuildParameters(INodePacketTranslator translator)
 {
     ((INodePacketTranslatable)this).Translate(translator);
 }
 /// <summary>
 /// Factory for serialization.
 /// </summary>
 static internal INodePacket FactoryForDeserialization(INodePacketTranslator translator)
 {
     return(new BuildRequestConfiguration(translator));
 }
示例#22
0
 public void Translate(INodePacketTranslator translator)
 {
     ErrorUtilities.VerifyThrow(translator.Mode == TranslationDirection.WriteToStream, "write only");
     string assemblyName = AssemblyName;
     string assemblyFile = AssemblyFile;
     translator.Translate(ref assemblyName);
     translator.Translate(ref assemblyFile);
 }
        /// <summary>
        /// Write the given ITaskItem, using the given write translator
        /// </summary>
        private void WriteITaskItem(INodePacketTranslator translator, ITaskItem wrappedItem)
        {
            ErrorUtilities.VerifyThrow(translator.Mode == TranslationDirection.WriteToStream, "Cannot call this method when reading!");

            if (!TranslateNullable(translator, wrappedItem))
            {
                return;
            }

            string      escapedItemSpec;
            string      escapedDefiningProject;
            IDictionary wrappedMetadata;
            bool        wrappedMetadataIsEscaped;

            ITaskItem2 wrappedItemAsITaskItem2 = wrappedItem as ITaskItem2;

            if (wrappedItemAsITaskItem2 != null)
            {
                escapedItemSpec          = wrappedItemAsITaskItem2.EvaluatedIncludeEscaped;
                escapedDefiningProject   = wrappedItemAsITaskItem2.GetMetadataValueEscaped(FileUtilities.ItemSpecModifiers.DefiningProjectFullPath);
                wrappedMetadata          = wrappedItemAsITaskItem2.CloneCustomMetadataEscaped();
                wrappedMetadataIsEscaped = true;
            }
            else
            {
                // We know that the ITaskItem constructor expects an escaped string, and that ITaskItem.ItemSpec
                // is expected to be unescaped, so make sure we give the constructor what it wants.
                escapedItemSpec          = EscapingUtilities.Escape(wrappedItem.ItemSpec);
                escapedDefiningProject   = EscapingUtilities.EscapeWithCaching(wrappedItem.GetMetadata(FileUtilities.ItemSpecModifiers.DefiningProjectFullPath));
                wrappedMetadata          = wrappedItem.CloneCustomMetadata();
                wrappedMetadataIsEscaped = false;
            }

            Dictionary <string, string> escapedGenericWrappedMetadata = wrappedMetadata as Dictionary <string, string>;

            if (escapedGenericWrappedMetadata == null)
            {
                escapedGenericWrappedMetadata = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

                foreach (object key in wrappedMetadata.Keys)
                {
                    string value = (string)wrappedMetadata[key];

                    if (!wrappedMetadataIsEscaped)
                    {
                        value = (value == null) ? value : EscapingUtilities.Escape(value);
                    }

                    escapedGenericWrappedMetadata.Add((string)key, value);
                }
            }
            else if (!wrappedMetadataIsEscaped)
            {
                foreach (KeyValuePair <string, string> entry in escapedGenericWrappedMetadata)
                {
                    escapedGenericWrappedMetadata[entry.Key] = entry.Value == null ? entry.Value : EscapingUtilities.Escape(entry.Value);
                }
            }

            translator.Translate(ref escapedItemSpec);
            translator.Translate(ref escapedDefiningProject);
            translator.TranslateDictionary(ref escapedGenericWrappedMetadata, StringComparer.OrdinalIgnoreCase);
        }
示例#24
0
 /// <summary>
 /// Constructor for serialization.
 /// </summary>
 private ItemsStore(INodePacketTranslator translator)
 {
     Translate(translator);
 }
示例#25
0
 /// <summary>
 /// Deserializes and routes a packer to the appropriate handler.
 /// </summary>
 /// <param name="nodeId">The node from which the packet was received.</param>
 /// <param name="packetType">The packet type.</param>
 /// <param name="translator">The translator to use as a source for packet data.</param>
 void INodePacketFactory.DeserializeAndRoutePacket(int nodeId, NodePacketType packetType, INodePacketTranslator translator)
 {
     _packetFactory.DeserializeAndRoutePacket(nodeId, packetType, translator);
 }
示例#26
0
 /// <summary>
 /// Factory for serialization.
 /// </summary>
 static internal TargetResult FactoryForDeserialization(INodePacketTranslator translator)
 {
     return(new TargetResult(translator));
 }
 void INodePacketTranslatable.Translate(INodePacketTranslator translator)
 {
     // all subclasses should be translateable
     ErrorUtilities.ThrowInternalErrorUnreachable();
 }
示例#28
0
 /// <summary>
 /// Translator constructor
 /// </summary>
 private WorkUnitResult(INodePacketTranslator translator)
 {
     ((INodePacketTranslatable)this).Translate(translator);
 }
 internal static ProjectTargetInstanceChild FactoryForDeserialization(INodePacketTranslator translator)
 {
     return(translator.FactoryForDeserializingTypeWithName <ProjectTargetInstanceChild>());
 }
示例#30
0
 /// <summary>
 /// Factory for deserialization.
 /// </summary>
 internal static INodePacket FactoryForDeserialization(INodePacketTranslator translator)
 {
     TaskHostConfiguration configuration = new TaskHostConfiguration();
     configuration.Translate(translator);
     return configuration;
 }
示例#31
0
 /// <summary>
 /// Constructor for deserialization
 /// </summary>
 protected LogMessagePacketBase(INodePacketTranslator translator)
 {
     Translate(translator);
 }
示例#32
0
        /// <summary>
        /// Reads/writes this packet
        /// </summary>
        public void Translate(INodePacketTranslator translator)
        {
            translator.Translate(ref _submissionId);
            translator.Translate(ref _configurationId);
            translator.Translate(ref _globalRequestId);
            translator.Translate(ref _parentGlobalRequestId);
            translator.Translate(ref _nodeRequestId);
            translator.Translate(ref _targets);
            translator.Translate(ref _parentBuildEventContext);
            translator.Translate(ref _buildEventContext);
            translator.TranslateEnum(ref _buildRequestDataFlags, (int)_buildRequestDataFlags);

            // UNDONE: (Compat) Serialize the host object.
        }
示例#33
0
        /// <summary>
        /// Reads the logging packet from the translator.
        /// </summary>
        internal void ReadFromStream(INodePacketTranslator translator)
        {
#if FEATURE_BINARY_SERIALIZATION
            if (LoggingEventType.CustomEvent != _eventType)
            {
                _buildEvent = GetBuildEventArgFromId();

                // The other side is telling us whether the event knows how to log itself, or whether we're going to have
                // to do it manually
                int packetVersion = s_defaultPacketVersion;
                translator.Translate(ref packetVersion);

                bool eventCanSerializeItself = true;
                translator.Translate(ref eventCanSerializeItself);

                if (eventCanSerializeItself)
                {
                    MethodInfo methodInfo = null;
                    lock (s_readMethodCache)
                    {
                        if (!s_readMethodCache.TryGetValue(_eventType, out methodInfo))
                        {
                            Type eventDerivedType = _buildEvent.GetType();
                            methodInfo = eventDerivedType.GetMethod("CreateFromStream", BindingFlags.NonPublic | BindingFlags.Instance);
                            s_readMethodCache.Add(_eventType, methodInfo);
                        }
                    }

                    ArgsReaderDelegate readerMethod = (ArgsReaderDelegate)CreateDelegateRobust(typeof(ArgsReaderDelegate), _buildEvent, methodInfo);

                    readerMethod(translator.Reader, packetVersion);
                    if (_eventType == LoggingEventType.TargetFinishedEvent && _targetFinishedTranslator != null)
                    {
                        _targetFinishedTranslator(translator, (TargetFinishedEventArgs)_buildEvent);
                    }
                }
                else
                {
                    _buildEvent = ReadEventFromStream(_eventType, translator);
                }
            }
            else
            {
                string fileLocation = null;
                translator.Translate(ref fileLocation);

                bool resolveAssembly = false;
                lock (s_lockObject)
                {
                    if (!s_customEventsLoaded.Contains(fileLocation))
                    {
                        resolveAssembly = true;
                    }

                    // If we are to resolve the assembly add it to the list of assemblies resolved
                    if (resolveAssembly)
                    {
                        s_customEventsLoaded.Add(fileLocation);
                    }
                }

#if FEATURE_APPDOMAIN
                if (resolveAssembly)
                {
                    s_resolver = new TaskEngineAssemblyResolver();
                    s_resolver.InstallHandler();
                    s_resolver.Initialize(fileLocation);
                }
#endif

                try
                {
                    translator.TranslateDotNet(ref _buildEvent);
                }
                finally
                {
#if FEATURE_APPDOMAIN
                    if (resolveAssembly)
                    {
                        s_resolver.RemoveHandler();
                        s_resolver = null;
                    }
#endif
                }
            }
#else
            translator.TranslateBuildEventArgs(ref _buildEvent);
#endif

            _eventType = GetLoggingEventId(_buildEvent);
        }
示例#34
0
 /// <summary>
 /// Translates the packet to/from binary form.
 /// </summary>
 /// <param name="translator">The translator to use.</param>
 public void Translate(INodePacketTranslator translator)
 {
     // Do nothing -- this packet doesn't contain any parameters. 
 }
示例#35
0
        /// <summary>
        /// Given a build event that is presumed to be 2.0 (due to its lack of a "WriteToStream" method) and its
        /// LoggingEventType, serialize that event to the stream.
        /// </summary>
        private void WriteEventToStream(BuildEventArgs buildEvent, LoggingEventType eventType, INodePacketTranslator translator)
        {
            string message     = buildEvent.Message;
            string helpKeyword = buildEvent.HelpKeyword;
            string senderName  = buildEvent.SenderName;

            translator.Translate(ref message);
            translator.Translate(ref helpKeyword);
            translator.Translate(ref senderName);

            // It is essential that you translate in the same order during writing and reading
            switch (eventType)
            {
            case LoggingEventType.BuildMessageEvent:
                WriteBuildMessageEventToStream((BuildMessageEventArgs)buildEvent, translator);
                break;

            case LoggingEventType.TaskCommandLineEvent:
                WriteTaskCommandLineEventToStream((TaskCommandLineEventArgs)buildEvent, translator);
                break;

            case LoggingEventType.BuildErrorEvent:
                WriteBuildErrorEventToStream((BuildErrorEventArgs)buildEvent, translator);
                break;

            case LoggingEventType.BuildWarningEvent:
                WriteBuildWarningEventToStream((BuildWarningEventArgs)buildEvent, translator);
                break;

            case LoggingEventType.ProjectStartedEvent:
                WriteExternalProjectStartedEventToStream((ExternalProjectStartedEventArgs)buildEvent, translator);
                break;

            case LoggingEventType.ProjectFinishedEvent:
                WriteExternalProjectFinishedEventToStream((ExternalProjectFinishedEventArgs)buildEvent, translator);
                break;

            default:
                ErrorUtilities.ThrowInternalError("Not Supported LoggingEventType {0}", eventType.ToString());
                break;
            }
        }
示例#36
0
 /// <summary>
 /// Private constructor for serialization.
 /// </summary>
 private Toolset(INodePacketTranslator translator)
 {
     ((INodePacketTranslatable)this).Translate(translator);
 }
示例#37
0
        /// <summary>
        /// Serialize ExternalProjectFinished Event Argument to the stream
        /// </summary>
        private void WriteExternalProjectFinishedEventToStream(ExternalProjectFinishedEventArgs externalProjectFinishedEventArgs, INodePacketTranslator translator)
        {
            string projectFile = externalProjectFinishedEventArgs.ProjectFile;

            translator.Translate(ref projectFile);

            bool succeeded = externalProjectFinishedEventArgs.Succeeded;

            translator.Translate(ref succeeded);
        }
示例#38
0
 /// <summary>
 /// Factory for deserialization.
 /// </summary>
 static internal Toolset FactoryForDeserialization(INodePacketTranslator translator)
 {
     Toolset toolset = new Toolset(translator);
     return toolset;
 }
示例#39
0
        /// <summary>
        /// ExternalProjectStartedEvent
        /// </summary>
        private void WriteExternalProjectStartedEventToStream(ExternalProjectStartedEventArgs externalProjectStartedEventArgs, INodePacketTranslator translator)
        {
            string projectFile = externalProjectStartedEventArgs.ProjectFile;

            translator.Translate(ref projectFile);

            string targetNames = externalProjectStartedEventArgs.TargetNames;

            translator.Translate(ref targetNames);
        }
示例#40
0
        /// <summary>
        /// Implementation of the serialization mechanism.
        /// </summary>
        void INodePacketTranslatable.Translate(INodePacketTranslator translator)
        {
            translator.Translate(ref _buildId);
            /* No build thread priority during translation.  We specifically use the default (which is ThreadPriority.Normal) */
            translator.TranslateDictionary(ref _buildProcessEnvironment, StringComparer.OrdinalIgnoreCase);
            translator.TranslateCulture(ref _culture);
            translator.Translate(ref _defaultToolsVersion);
            translator.Translate(ref _disableInProcNode);
            translator.Translate(ref _enableNodeReuse);
            translator.TranslateProjectPropertyInstanceDictionary(ref _environmentProperties);
            /* No forwarding logger information sent here - that goes with the node configuration */
            translator.TranslateProjectPropertyInstanceDictionary(ref _globalProperties);
            /* No host services during translation */
            /* No loggers during translation */
            translator.Translate(ref _maxNodeCount);
            translator.Translate(ref _memoryUseLimit);
            translator.Translate(ref _nodeExeLocation);
            /* No node id during translation */
            translator.Translate(ref _onlyLogCriticalEvents);
            translator.Translate(ref s_startupDirectory);
            translator.TranslateCulture(ref _uiCulture);
            translator.Translate(ref _toolsetProvider, Microsoft.Build.Evaluation.ToolsetProvider.FactoryForDeserialization);
            translator.Translate(ref _useSynchronousLogging);
            translator.Translate(ref _shutdownInProcNodeOnBuildFinish);
            translator.Translate(ref _logTaskInputs);
            translator.Translate(ref _logInitialPropertiesAndItems);

            // ProjectRootElementCache is not transmitted.
            // ResetCaches is not transmitted.
            // LegacyThreadingSemantics is not transmitted.
        }
示例#41
0
        /// <summary>
        /// Write a Build Error message into the translator
        /// </summary>
        private void WriteBuildErrorEventToStream(BuildErrorEventArgs buildErrorEventArgs, INodePacketTranslator translator)
        {
            string code = buildErrorEventArgs.Code;

            translator.Translate(ref code);

            int columnNumber = buildErrorEventArgs.ColumnNumber;

            translator.Translate(ref columnNumber);

            int endColumnNumber = buildErrorEventArgs.EndColumnNumber;

            translator.Translate(ref endColumnNumber);

            int endLineNumber = buildErrorEventArgs.EndLineNumber;

            translator.Translate(ref endLineNumber);

            string file = buildErrorEventArgs.File;

            translator.Translate(ref file);

            int lineNumber = buildErrorEventArgs.LineNumber;

            translator.Translate(ref lineNumber);

            string subCategory = buildErrorEventArgs.Subcategory;

            translator.Translate(ref subCategory);
        }
示例#42
0
        static public AssemblyLoadInfo FactoryForTranslation(INodePacketTranslator translator)
        {
            string assemblyName = null;
            string assemblyFile = null;
            translator.Translate(ref assemblyName);
            translator.Translate(ref assemblyFile);

            return Create(assemblyName, assemblyFile);
        }
示例#43
0
 /// <summary>
 /// Deserializes and routes a packet.  Not used in the in-proc node.
 /// </summary>
 public void DeserializeAndRoutePacket(int nodeId, NodePacketType packetType, INodePacketTranslator translator)
 {
     // Not used
     ErrorUtilities.ThrowInternalErrorUnreachable();
 }
 /// <summary>
 /// Takes a serializer, deserializes the packet and routes it to the appropriate handler.
 /// </summary>
 /// <param name="nodeId">The node from which the packet was received.</param>
 /// <param name="packetType">The packet type.</param>
 /// <param name="translator">The translator containing the data from which the packet should be reconstructed.</param>
 public void DeserializeAndRoutePacket(int nodeId, NodePacketType packetType, INodePacketTranslator translator)
 {
     if (_nodeIdToPacketFactory.ContainsKey(nodeId))
     {
         _nodeIdToPacketFactory[nodeId].DeserializeAndRoutePacket(nodeId, packetType, translator);
     }
     else
     {
         _localPacketFactory.DeserializeAndRoutePacket(nodeId, packetType, translator);
     }
 }
 public void DeserializeAndRoutePacket(int nodeId, NodePacketType packetType, INodePacketTranslator translator)
 {
     throw new NotImplementedException();
 }
示例#46
0
 /// <summary>
 /// Factory method for deserialization
 /// </summary>
 internal static NodeShutdown FactoryForDeserialization(INodePacketTranslator translator)
 {
     NodeShutdown shutdown = new NodeShutdown();
     shutdown.Translate(translator);
     return shutdown;
 }
示例#47
0
 /// <summary>
 /// Performs the actual translation
 /// </summary>
 private void InternalTranslate(INodePacketTranslator translator)
 {
     translator.Translate(ref _result, WorkUnitResult.FactoryForDeserialization);
     translator.Translate(ref _targetFailureDoesntCauseBuildFailure);
     translator.Translate(ref _itemsStore, ItemsStore.FactoryForDeserialization);
 }
示例#48
0
 /// <summary>
 /// Takes a serializer, deserializes the packet and routes it to the appropriate handler.
 /// </summary>
 /// <param name="nodeId">The node from which the packet was received.</param>
 /// <param name="packetType">The packet type.</param>
 /// <param name="translator">The translator containing the data from which the packet should be reconstructed.</param>
 public void DeserializeAndRoutePacket(int nodeId, NodePacketType packetType, INodePacketTranslator translator)
 {
     _packetFactory.DeserializeAndRoutePacket(nodeId, packetType, translator);
 }
示例#49
0
 /// <summary>
 /// Takes a serializer, deserializes the packet and routes it to the appropriate handler.
 /// </summary>
 /// <param name="nodeId">The node from which the packet was received.</param>
 /// <param name="packetType">The packet type.</param>
 /// <param name="translator">The translator containing the data from which the packet should be reconstructed.</param>
 public void DeserializeAndRoutePacket(int nodeId, NodePacketType packetType, INodePacketTranslator translator)
 {
     throw new NotSupportedException("not used");
 }
示例#50
0
 /// <summary>
 /// Serialize the packet
 /// </summary>
 public void Translate(INodePacketTranslator translator)
 {
     throw new NotImplementedException();
 }
示例#51
0
 /// <summary>
 /// Translator.
 /// </summary>
 public void Translate(INodePacketTranslator translator)
 {
     translator.TranslateEnum(ref _resultCode, (int)_resultCode);
     translator.TranslateEnum(ref _actionCode, (int)_actionCode);
     translator.TranslateDotNet(ref _exception);
 }
示例#52
0
        /// <summary>
        /// Factory for serialization.
        /// Custom factory is needed because this class is abstract and uses a factory pattern.
        /// </summary>
        internal static IElementLocation FactoryForDeserialization(INodePacketTranslator translator)
        {
            string file = null;
            int line = 0;
            int column = 0;
            translator.Translate(ref file);
            translator.Translate(ref line);
            translator.Translate(ref column);

            return Create(file, line, column);
        }
示例#53
0
            /// <summary>
            /// Sends the specified packet to this node.
            /// </summary>
            /// <param name="packet">The packet to send.</param>
            public void SendData(INodePacket packet)
            {
                MemoryStream          writeStream     = new MemoryStream();
                INodePacketTranslator writeTranslator = NodePacketTranslator.GetWriteTranslator(writeStream);

                try
                {
                    writeStream.WriteByte((byte)packet.Type);

                    // Pad for the packet length
                    writeStream.Write(BitConverter.GetBytes((int)0), 0, 4);
                    packet.Translate(writeTranslator);

                    // Now plug in the real packet length
                    writeStream.Position = 1;
                    writeStream.Write(BitConverter.GetBytes((int)writeStream.Length - 5), 0, 4);

#if FALSE
                    if (trace) // Avoid method call
                    {
                        CommunicationsUtilities.Trace(nodeId, "Sending Packet of type {0} with length {1}", packet.Type.ToString(), writeStream.Length - 5);
                    }
#endif

                    byte[] writeStreamBuffer = writeStream.GetBuffer();

                    for (int i = 0; i < writeStream.Length; i += MaxPacketWriteSize)
                    {
                        int lengthToWrite = Math.Min((int)writeStream.Length - i, MaxPacketWriteSize);
                        if ((int)writeStream.Length - i <= MaxPacketWriteSize)
                        {
                            // We are done, write the last bit asynchronously.  This is actually the general case for
                            // most packets in the build, and the asynchronous behavior here is desirable.
#if FEATURE_APM
                            _serverToClientStream.BeginWrite(writeStreamBuffer, i, lengthToWrite, PacketWriteComplete, null);
#else
                            _serverToClientStream.WriteAsync(writeStreamBuffer, i, lengthToWrite);
#endif
                            return;
                        }
                        else
                        {
                            // If this packet is longer that we can write in one go, then we need to break it up.  We can't
                            // return out of this function and let the rest of the system continue because another operation
                            // might want to send data immediately afterward, and that could result in overlapping writes
                            // to the pipe on different threads.
#if FEATURE_APM
                            IAsyncResult result = _serverToClientStream.BeginWrite(writeStream.GetBuffer(), i, lengthToWrite, null, null);
                            _serverToClientStream.EndWrite(result);
#else
                            _serverToClientStream.Write(writeStreamBuffer, i, lengthToWrite);
#endif
                        }
                    }
                }
                catch (IOException e)
                {
                    // Do nothing here because any exception will be caught by the async read handler
                    CommunicationsUtilities.Trace(_nodeId, "EXCEPTION in SendData: {0}", e);
                }
                catch (ObjectDisposedException) // This happens if a child dies unexpectedly
                {
                    // Do nothing here because any exception will be caught by the async read handler
                }
            }