private void ProcessStreamXmlContexts(ref bool r, FA mode
                                              , StreamXmlStage firstStage       // = StreamXmlStage.Preload
                                              , StreamXmlStage lastStagePlusOne // = StreamXmlStage.kNumberOf
                                              , Engine.XmlFilePriority firstPriority       = Engine.XmlFilePriority.Lists
                                              , Engine.XmlFilePriority lastPriorityPlusOne = Engine.XmlFilePriority.kNumberOf
                                              )
        {
            SetupStreamXmlContexts();

            for (var s = firstStage; s < lastStagePlusOne; s++)
            {
                var args = new ProcessStreamXmlContextStageArgs(mode, s, firstPriority, lastPriorityPlusOne);
                ProcessStreamXmlContextStage(ref r, args);
            }
        }
        private void ProcessStreamXmlContextStage(ref bool r, ProcessStreamXmlContextStageArgs args)
        {
            var mode = args.Mode;

            for (var p = args.FirstPriority; p < args.LastPriorityPlusOne; p++)
            {
                foreach (var ctxt in mStreamXmlContexts)
                {
                    if (ctxt.ProtoFileInfo.Priority != p)
                    {
                        continue;
                    }

                    switch (args.Stage)
                    {
                        #region Preload
                    case StreamXmlStage.Preload:
                    {
                        if (ctxt.Preload == null)
                        {
                            break;
                        }

                        var task = Task <bool> .Factory.StartNew(() => TryStreamData(ctxt.FileInfo, mode, ctxt.Preload));

                        args.Tasks.Add(task);
                    } break;

                        #endregion
                        #region Stream
                    case StreamXmlStage.Stream:
                    {
                        if (ctxt.Stream == null)
                        {
                            break;
                        }

                        var task = Task <bool> .Factory.StartNew(() => TryStreamData(ctxt.FileInfo, mode, ctxt.Stream));

                        args.Tasks.Add(task);
                    } break;

                        #endregion
                        #region StreamUpdates
                    case StreamXmlStage.StreamUpdates:
                    {
                        if (ctxt.FileInfoWithUpdates == null)
                        {
                            break;
                        }
                        if (ctxt.StreamUpdates == null)
                        {
                            break;
                        }

                        var task = Task <bool> .Factory.StartNew(() => TryStreamData(ctxt.FileInfoWithUpdates, mode, ctxt.StreamUpdates));

                        args.Tasks.Add(task);
                    } break;
                        #endregion
                    }
                }

                if (!args.UpdateResultWithTaskResults(ref r))
                {
                    var inner = args.TaskExceptions.ToAggregateExceptionOrNull().GetOnlyExceptionOrAllWhenAggregate();

                    throw new InvalidOperationException(string.Format(
                                                            "Failed to process one or more files for priority={0}",
                                                            p),
                                                        inner);
                }

                args.ClearTaskData();
            }
        }