Example #1
0
        /// <summary>
        /// Parses a well-formed XAML fragment and creates a corresponding Silverlight object tree,
        /// and returns the root of the object tree.
        /// </summary>
        /// <returns>The root object of the Silverlight object tree.</returns>
        /// <param name="xaml">A string that contains a valid XAML fragment.</param>
        public static object Load(string xaml)
        {
            var textReader = new StringReader(xaml);

            var xamlReader = new XamlXmlReader(textReader);
            var xamlWriter = new XamlObjectWriter(xamlReader.SchemaContext);

            if (xamlReader.NodeType == XamlNodeType.None)
            {
                xamlReader.Read();
            }

            var xamlLineInfo      = xamlReader as IXamlLineInfo;
            var xamlLineConsumer  = xamlWriter as IXamlLineInfoConsumer;
            var shouldSetLineInfo = xamlLineInfo != null && xamlLineConsumer != null && xamlLineConsumer.ShouldProvideLineInfo && xamlLineInfo.HasLineInfo;

            while (!xamlReader.IsEof)
            {
                if (shouldSetLineInfo)
                {
                    xamlLineConsumer.SetLineInfo(xamlLineInfo.LineNumber, xamlLineInfo.LinePosition);
                }
                xamlWriter.WriteNode(xamlReader);
                xamlReader.Read();
            }

            return(xamlWriter.Result);
        }
Example #2
0
        public static void GetNamespacesLineInfo(string sourceXamlFileName, Dictionary <string, int> lineNumbersForNSes, Dictionary <string, int> lineNumbersForNSesForImpl)
        {
            // read until StartMember: TextExpression.NamespacesForImplementation OR TextExpression.Namespaces
            // create a subtree reader,
            // in the subtree,
            // look for StartObject nodes of String type.  their values are added to either LineNumbersForNSes or LineNumbersForNSesForImpl dictionaries.
            if (!File.Exists(sourceXamlFileName))
            {
                return;
            }

            using (XmlReader xmlReader = XmlReader.Create(sourceXamlFileName, new XmlReaderSettings {
                XmlResolver = null
            }))
            {
                using (XamlXmlReader xreader = new XamlXmlReader(xmlReader, new XamlXmlReaderSettings()
                {
                    ProvideLineInfo = true
                }))
                {
                    bool hasHitFirstStartObj = false;
                    while (!hasHitFirstStartObj && xreader.Read())
                    {
                        if (xreader.NodeType == XamlNodeType.StartObject)
                        {
                            hasHitFirstStartObj = true;
                        }
                    }

                    if (hasHitFirstStartObj)
                    {
                        xreader.Read();
                        do
                        {
                            if (IsStartMemberTextExprNS(xreader))
                            {
                                XamlReader subTreeReader = xreader.ReadSubtree();
                                WalkSubTree(subTreeReader, lineNumbersForNSes);
                            }
                            else if (IsStartMemberTextExprNSForImpl(xreader))
                            {
                                XamlReader subTreeReader = xreader.ReadSubtree();
                                WalkSubTree(subTreeReader, lineNumbersForNSesForImpl);
                            }
                            else
                            {
                                xreader.Skip();
                            }
                        }while (!xreader.IsEof);
                    }
                }
            }
        }
Example #3
0
        public XamlFileDefinition Parse(string content)
        {
            var document = XmlReader.Create(new StringReader(content));

            // Initialize the reader using an empty context, because when the tasl
            // is run under the BeforeCompile in VS IDE, the loaded assemblies are used
            // to interpret the meaning of objects, which is not correct in Uno.UI context.
            var context = new XamlSchemaContext(Enumerable.Empty <Assembly>());

            // Force the line info, otherwise it will be enabled only when the debugger is attached.
            var settings = new XamlXmlReaderSettings()
            {
                ProvideLineInfo = true
            };

            using (var reader = new XamlXmlReader(document, context, settings))
            {
                if (reader.Read())
                {
                    return(Visit(reader));
                }
            }

            return(null);
        }
Example #4
0
        XamlType GetRootXamlType()
        {
            try
            {
                using (Stream xamlStream = base.OpenStream())
                {
                    XmlReader     xmlReader  = XmlReader.Create(xamlStream);
                    XamlXmlReader xamlReader = new XamlXmlReader(xmlReader);

                    // Read to the root object
                    while (xamlReader.Read())
                    {
                        if (xamlReader.NodeType == XamlNodeType.StartObject)
                        {
                            return(xamlReader.Type);
                        }
                    }
                    throw FxTrace.Exception.AsError(new HttpCompileException(SR.UnexpectedEof));
                }
            }
            catch (XamlParseException ex)
            {
                throw FxTrace.Exception.AsError(new HttpCompileException(ex.Message, ex));
            }
        }
Example #5
0
        private XamlFileDefinition Visit(XamlXmlReader reader, string file)
        {
            WriteState(reader);

            var xamlFile = new XamlFileDefinition(file);

            do
            {
                switch (reader.NodeType)
                {
                case XamlNodeType.StartObject:
                    _depth++;
                    xamlFile.Objects.Add(VisitObject(reader, null));
                    break;

                case XamlNodeType.NamespaceDeclaration:
                    xamlFile.Namespaces.Add(reader.Namespace);
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }while (reader.Read());

            return(xamlFile);
        }
Example #6
0
        private void Visit(XamlXmlReader reader, XamlObjectDefinition xamlObject)
        {
            while (reader.Read())
            {
                WriteState(reader);

                switch (reader.NodeType)
                {
                case XamlNodeType.StartMember:
                    _depth++;
                    xamlObject.Members.Add(VisitMember(reader, xamlObject));
                    break;

                case XamlNodeType.StartObject:
                    _depth++;
                    xamlObject.Objects.Add(VisitObject(reader, xamlObject));
                    break;

                case XamlNodeType.Value:
                    xamlObject.Value = reader.Value;
                    break;

                case XamlNodeType.EndObject:
                    _depth--;
                    return;

                case XamlNodeType.EndMember:
                    _depth--;
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }
        }
        public void TestBaseUri2()
        {
            string       xaml = @"
<c:ArrayList xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:s='clr-namespace:System;assembly=mscorlib'
xmlns:c='clr-namespace:System.Collections;assembly=mscorlib' xml:base='http://schemas.microsoft.com/winfx/2006/xaml'>
<s:String>Hello</s:String>
</c:ArrayList>";
            MemoryStream ms   = new MemoryStream();

            using (StreamWriter sw = new StreamWriter(ms))
            {
                sw.Write(xaml);
                sw.Flush();
                ms.Position = 0;
                XamlXmlReaderSettings settings  = new XamlXmlReaderSettings();
                XamlXmlReader         xxr       = new XamlXmlReader(ms, settings);
                XamlObjectWriter      objWriter = new XamlObjectWriter(xxr.SchemaContext);

                while (xxr.Read())
                {
                    objWriter.WriteNode(xxr);
                }

                objWriter.Clear();
                objWriter.Close();
            }
        }
Example #8
0
        public static void Load(Stream stream, object component)
        {
            DependencyObject dependencyObject = component as DependencyObject;
            NameScope        nameScope        = new NameScope();

            if (dependencyObject != null)
            {
                NameScope.SetNameScope(dependencyObject, nameScope);
            }

            XmlReader        xml    = XmlReader.Create(stream);
            XamlXmlReader    reader = new XamlXmlReader(xml);
            XamlObjectWriter writer = new XamlObjectWriter(
                new XamlSchemaContext(),
                new XamlObjectWriterSettings
            {
                RootObjectInstance = component,
                ExternalNameScope  = nameScope,
                RegisterNamesOnExternalNamescope = true,
                XamlSetValueHandler = SetValue,
            });

            while (reader.Read())
            {
                writer.WriteNode(reader);
            }
        }
Example #9
0
        private XamlFileDefinition ParseFile(string file)
        {
            try
            {
                this.Log().InfoFormat("Pre-processing XAML file: {0}", file);

                var document = ApplyIgnorables(file);

                // Initialize the reader using an empty context, because when the tasl
                // is run under the BeforeCompile in VS IDE, the loaded assemblies are used
                // to interpret the meaning of objects, which is not correct in Uno.UI context.
                var context = new XamlSchemaContext(Enumerable.Empty <Assembly>());

                // Force the line info, otherwise it will be enabled only when the debugger is attached.
                var settings = new XamlXmlReaderSettings()
                {
                    ProvideLineInfo = true
                };

                using (var reader = new XamlXmlReader(document, context, settings))
                {
                    if (reader.Read())
                    {
                        return(Visit(reader, file));
                    }
                }

                return(null);
            }
            catch (Exception e)
            {
                throw new InvalidOperationException($"Failed to parse file {file}", e);
            }
        }
        public override Type GetGeneratedType(CompilerResults results)
        {
            Type type;

            try
            {
                using (Stream stream = base.OpenStream())
                {
                    XamlXmlReader reader2 = new XamlXmlReader(XmlReader.Create(stream));
                    while (reader2.Read())
                    {
                        if (reader2.NodeType == XamlNodeType.StartObject)
                        {
                            if (reader2.Type.IsUnknown)
                            {
                                StringBuilder sb = new StringBuilder();
                                this.AppendTypeName(reader2.Type, sb);
                                throw FxTrace.Exception.AsError(new TypeLoadException(System.Xaml.Hosting.SR.CouldNotResolveType(sb)));
                            }
                            return(reader2.Type.UnderlyingType);
                        }
                    }
                    throw FxTrace.Exception.AsError(new HttpCompileException(System.Xaml.Hosting.SR.UnexpectedEof));
                }
            }
            catch (XamlParseException exception)
            {
                throw FxTrace.Exception.AsError(new HttpCompileException(exception.Message, exception));
            }
            return(type);
        }
Example #11
0
        private void LoadWorkspace(string workspaceFile)
        {
            try
            {
                using (XamlXmlReader reader = new XamlXmlReader(workspaceFile))
                {
                    using (XamlObjectWriter writer = new XamlObjectWriter(reader.SchemaContext))
                    {
                        while (reader.Read())
                        {
                            writer.WriteNode(reader);
                        }

                        Workspace      = (MdiDemoWorkspace)writer.Result;
                        _workspaceFile = workspaceFile;
                    }
                }

                GC.Collect(); // lame!  The XamlXmlReader will leave the file open until the next GC.
                GC.WaitForPendingFinalizers();
            }
            catch (Exception)
            {
                MessageBox.Show(String.Format("An error occured opening MDI workspace file '{0}'.", workspaceFile));
            }
        }
Example #12
0
 private UIElement Load(string path)
 {
     using (var reader = new XamlXmlReader(path))
         using (var writer = new XamlObjectWriter(reader.SchemaContext))
         {
             while (reader.Read())
             {
                 writer.WriteNode(reader);
             }
             return((UIElement)writer.Result);
         }
 }
        protected override void Write(XamlMarkdownWriter renderer, HtmlEntityInline obj)
        {
            var txt = obj.Transcoded.Text.Substring(obj.Transcoded.Start, obj.Transcoded.Length);

            using (var xaml = new XamlXmlReader(new StringReader(txt), new XamlXmlReaderSettings()
            {
            }))
            {
                while (xaml.Read())
                {
                    switch (xaml.NodeType)
                    {
                    case XamlNodeType.NamespaceDeclaration:
                        renderer.WriteNamespace(xaml.Namespace);
                        break;

                    case XamlNodeType.StartObject:
                        renderer.WriteStartObject(xaml.Type);
                        break;

                    case XamlNodeType.GetObject:
                        renderer.WriteGetObject();
                        break;

                    case XamlNodeType.EndObject:
                        renderer.WriteEndObject();
                        break;

                    case XamlNodeType.StartMember:
                        renderer.WriteStartMember(xaml.Member);
                        break;

                    case XamlNodeType.EndMember:
                        renderer.WriteEndMember();
                        break;

                    case XamlNodeType.Value:
                        if (xaml.Value is string text)
                        {
                            renderer.WriteValue(text);
                        }
                        else
                        {
                            renderer.WriteValue(xaml.Value.ToString());                                     // todo: use xaml to text converter
                        }
                        break;

                    default:
                        throw new InvalidOperationException();
                    }
                }
            }
        } // proc Write
Example #14
0
        private XamlMemberDefinition VisitMember(XamlXmlReader reader, XamlObjectDefinition owner)
        {
            var member = new XamlMemberDefinition(reader.Member, reader.LineNumber, reader.LinePosition, owner);

            while (reader.Read())
            {
                WriteState(reader);

                switch (reader.NodeType)
                {
                case XamlNodeType.EndMember:
                    _depth--;
                    return(member);

                case XamlNodeType.Value:
                    if (IsLiteralInlineText(reader.Value, member, owner))
                    {
                        var run = ConvertLiteralInlineTextToRun(reader);
                        member.Objects.Add(run);
                    }
                    else
                    {
                        if (member.Value is string s)
                        {
                            member.Value += ", " + reader.Value;
                        }
                        else
                        {
                            member.Value = reader.Value;
                        }
                    }
                    break;

                case XamlNodeType.StartObject:
                    _depth++;
                    member.Objects.Add(VisitObject(reader, owner));
                    break;

                case XamlNodeType.EndObject:
                    _depth--;
                    break;

                case XamlNodeType.NamespaceDeclaration:
                    // Skip
                    break;

                default:
                    throw new InvalidOperationException("Unable to process {2} node at Line {0}, position {1}".InvariantCultureFormat(reader.LineNumber, reader.LinePosition, reader.NodeType));
                }
            }

            return(member);
        }
Example #15
0
        private void Analyze(XamlXmlReader reader) {
            Stack<XamlType> objectTypes = new Stack<XamlType>();
            Stack<MemberType> nameStack = new Stack<MemberType>();
            Stack<XamlMember> eventStack = new Stack<XamlMember>();
            while (reader.Read()) {
                switch (reader.NodeType) {
                    case XamlNodeType.StartObject: objectTypes.Push(reader.Type); break;
                    case XamlNodeType.EndObject:
                        if (objectTypes.Count > 0) {
                            objectTypes.Pop();
                        }
                        break;
                    case XamlNodeType.NamespaceDeclaration:
                        break;
                    case XamlNodeType.StartMember:
                        var property = reader.Member;
                        if (property.Name == "Name" && property.Type.UnderlyingType == typeof(string)) {
                            nameStack.Push(MemberType.XName);
                        } else if (property.IsEvent) {
                            nameStack.Push(MemberType.Event);
                            eventStack.Push(property);
                        } else {
                            nameStack.Push(MemberType.Unknown);
                        }
                        break;

                    case XamlNodeType.EndMember:
                        if (nameStack.Pop() == MemberType.Event) {
                            eventStack.Pop();
                        }
                        break;
                    case XamlNodeType.GetObject:

                    case XamlNodeType.Value:
                        object value = reader.Value;
                        if (value is string) {
                            switch (nameStack.Peek()) {
                                case MemberType.XName:
                                    // we are writing a x:Name, save it so we can later get the name from the scope                                    
                                    _knownTypes[(string)value] = new XamlTypeReference(objectTypes.Peek(), reader.LineNumber, reader.LinePosition);
                                    break;
                                case MemberType.Event:
                                    // we have an event handler, save the method name and the XamlMember for the event
                                    _eventInfo[(string)value] = new XamlMemberReference(eventStack.Peek(), reader.LineNumber, reader.LinePosition);
                                    break;
                            }
                        }

                        break;
                }
            }
        }
Example #16
0
        public static object Deserialize(this XamlSchemaContext schemaContext, string xaml)
        {
            using (var sr = new StringReader(xaml))
                using (var xor = new XamlXmlReader(sr, schemaContext))
                    using (var xxw = new XamlObjectWriter(schemaContext))
                    {
                        while (xor.Read())
                        {
                            xxw.WriteNode(xor);
                        }

                        return(xxw.Result);
                    }
        }
        public MainWindow()
        {
            InitializeComponent();

            using (var reader = new XamlXmlReader("./Button.xaml"))
                using (var writer = new XamlXmlWriter(new FileStream("./Test.xaml", FileMode.Create), reader.SchemaContext))
                {
                    while (reader.Read())
                    {
                        writer.WriteNode(reader);
                    }
                }

            using (var reader = new XamlObjectReader(new Button()))
                using (var writer = new XamlObjectWriter(reader.SchemaContext))
                {
                    while (reader.Read())
                    {
                        writer.WriteNode(reader);
                    }

                    var button = (Button)writer.Result;
                }

            using (var reader = new XamlXmlReader(new StringReader("<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">This is a button</Button>")))
                using (var writer = new XamlObjectWriter(reader.SchemaContext))
                {
                    while (reader.Read())
                    {
                        writer.WriteNode(reader);
                    }

                    var button = (Button)writer.Result;
                }

            var button1 = (Button)XamlServices.Load("./Button.xaml");
            var button2 = XamlServices.Load(new XamlObjectReader(new Button()));
            var button3 = XamlServices.Load(new StringReader("<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">This is a button</Button>"));
            var button4 = XamlServices.Parse("<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">This is a button</Button>");

            XamlServices.Save("./Test2.xaml", new Button());

            //DispatcherObject methods, hidden from intellisense via the EditorBrowsableAttribute
            button1.CheckAccess();
            button1.VerifyAccess();
        }
Example #18
0
        public void UnknownContentWS()
        {
            XamlXmlReader xxr        = new XamlXmlReader(new MemoryStream(ASCIIEncoding.Default.GetBytes(RobPanel)));
            bool          containsWS = false;

            while (xxr.Read())
            {
                if ((xxr.NodeType == XamlNodeType.Value) && ((string)xxr.Value == " "))
                {
                    containsWS = true;
                }
            }
            if (!containsWS)
            {
                throw new Exception("Whitespace expected in unknown content");
            }
        }
        private IEnumerable <Node> XmlToNodes(string x, XamlXmlReaderSettings xamlXmlReaderSettings)
        {
            XamlXmlReader r = new XamlXmlReader(XmlReader.Create(new StringReader(x)), xamlXmlReaderSettings);

            while (r.Read())
            {
                switch (r.NodeType)
                {
                case XamlNodeType.EndMember:
                    yield return(new EM());

                    break;

                case XamlNodeType.EndObject:
                    yield return(new EO());

                    break;

                case XamlNodeType.GetObject:
                    yield return(new GO());

                    break;

                case XamlNodeType.NamespaceDeclaration:
                    yield return(new NS(r.Namespace));

                    break;

                case XamlNodeType.StartMember:
                    yield return(new SM(r.Member));

                    break;

                case XamlNodeType.StartObject:
                    yield return(new SO(r.Type));

                    break;

                case XamlNodeType.Value:
                    yield return(new V(r.Value));

                    break;
                }
            }
        }
        public static TOutput XamlStringToObject <TOutput>(this string xmlString)
        {
            XamlSchemaContext     schemaContext = System.Windows.Markup.XamlReader.GetWpfSchemaContext();
            XamlXmlReaderSettings settings      = new XamlXmlReaderSettings()
            {
                LocalAssembly = Assembly.GetExecutingAssembly()
            };

            using (XamlXmlReader reader = new XamlXmlReader(new StringReader(xmlString), schemaContext, settings))
                using (XamlObjectWriter writer = new XamlObjectWriter(reader.SchemaContext))
                {
                    while (reader.Read())
                    {
                        writer.WriteNode(reader);
                    }
                    return((TOutput)writer.Result);
                }
        }
        private static T Get <T>(string path)
        {
            using (var stream = Assembly.GetExecutingAssembly()
                                .GetManifestResourceStream(path))
            {
                // создаем экземпляр валидатора

                XamlXmlReader xxr = new XamlXmlReader(stream);
                //where xamlStringToLoad is a string of well formed XAML
                XamlObjectWriter xow = new XamlObjectWriter(xxr.SchemaContext);
                while (xxr.Read())
                {
                    xow.WriteNode(xxr);
                }


                return((T)xow.Result);
            }
        }
Example #22
0
        public void DeserializationTest(string xaml, Type expectedType, string expectedValue)
        {
            var sc = GetContext();

            using (var sr = new StringReader(xaml))
                using (var xxr = new XamlXmlReader(sr, sc))
                    using (var xow = new XamlObjectWriter(sc))
                    {
                        while (xxr.Read())
                        {
                            xow.WriteNode(xxr);
                        }

                        Assert.IsType(expectedType, xow.Result);
                        Assert.Equal(
                            expectedValue,
                            (xow.Result as IFormattable)?.ToString(null, CultureInfo.InvariantCulture) ?? xow.Result?.ToString());
                    }
        }
        public void TestBaseUri3()
        {
            string                xaml       = @"
<c:ArrayList xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:s='clr-namespace:System;assembly=mscorlib'
xmlns:c='clr-namespace:System.Collections;assembly=mscorlib' xml:base='http://schemas.microsoft.com/winfx/2006/xaml'>
<s:String>Hello</s:String>
</c:ArrayList>";
            TextReader            textReader = new StringReader(xaml);
            XamlXmlReaderSettings settings   = new XamlXmlReaderSettings();
            XamlXmlReader         xxr        = new XamlXmlReader(textReader, settings);
            XamlObjectWriter      objWriter  = new XamlObjectWriter(xxr.SchemaContext);

            while (xxr.Read())
            {
                objWriter.WriteNode(xxr);
            }
            objWriter.Clear();
            objWriter.Close();
        }
Example #24
0
        public static Viewbox GetViewboxFromXAML(string XAML)
        {
            System.IO.StringReader sr  = new System.IO.StringReader(XAML);
            XamlXmlReader          xxr = new XamlXmlReader(sr);
            XamlObjectWriter       xow = new XamlObjectWriter(xxr.SchemaContext);

            while (xxr.Read())
            {
                xow.WriteNode(xxr);
            }

            sr.Close();

            Viewbox vb = (Viewbox)xow.Result;

            vb.HorizontalAlignment = HorizontalAlignment.Stretch;
            vb.VerticalAlignment   = VerticalAlignment.Stretch;

            return(vb);
        }
Example #25
0
        private IEnumerable <Message> DoExtractMessagesFromFile([NotNull] UFile file, [NotNull] XamlXmlReader reader)
        {
            while (reader.Read())
            {
                if (reader.NodeType != XamlNodeType.StartObject)
                {
                    continue;
                }

                var lineNumber = reader.LineNumber;
                var type       = reader.Type.UnderlyingType;
                if (type == typeof(LocalizeExtension))
                {
                    var readSubtree = reader.ReadSubtree();
                    readSubtree.Read(); // read once to position on the first node
                    var message = ParseLocalizeExtension(readSubtree);
                    message.LineNumber = lineNumber;
                    message.Source     = file;
                    yield return(message);
                }
            }
        }
Example #26
0
        /// <summary>
        /// Loads XAML from the specified XamlXmlReader and returns the deserialized object.  Any event handlers
        /// are bound to methods defined in the provided Scope and converted using the provided DynamicOperations
        /// object.
        /// </summary>
        public static object LoadComponent(dynamic scope, DynamicOperations operations, XamlXmlReader reader)
        {
            var settings = new XamlObjectWriterSettings();

            settings.RootObjectInstance = scope;

            var myWriter = new DynamicWriter((object)scope, operations, reader.SchemaContext, settings);

            while (reader.Read())
            {
                myWriter.WriteNode(reader);
            }

            foreach (string name in myWriter.Names)
            {
                object value = myWriter.RootNameScope.FindName(name);
                if (value != null)
                {
                    operations.SetMember((object)scope, name, value);
                }
            }

            return(myWriter.Result);
        }
Example #27
0
        /// <summary>
        /// Compiling the workflow xamls into the assembly.
        /// </summary>
        internal void Compile(List <string> dependentWorkflows, Dictionary <string, string> requiredAssemblies)
        {
            if (IsRunningOnProcessorArchitectureARM())
            {
                Tracer.WriteMessage("The workflow Calling workflow is not supported so throwing the exception.");
                throw new NotSupportedException(Resources.WFCallingWFNotSupported);
            }

// Note that the _NOT_ARMBUILD_ flag is not a global build flag and needs to be set in the corresponding sources.inc file as appropriate.
#if _NOTARMBUILD_
            DirectoryInfo folder = new DirectoryInfo(this.ProjectFolderPath);
            folder.Create();

            List <string> workflowFiles = new List <string>();
            try
            {
                // Dump the files
                foreach (string dependentWorkflow in dependentWorkflows)
                {
                    string newFileName = Path.Combine(this.ProjectFolderPath, Path.GetRandomFileName() + ".xaml");
                    File.WriteAllText(newFileName, dependentWorkflow);
                    workflowFiles.Add(newFileName);
                }

                File.WriteAllText(this.ProjectFilePath, Template_Project);
            }
            catch (Exception e)
            {
                Tracer.TraceException(e);
                throw;
            }

            using (ProjectCollection projects = new ProjectCollection())
            {
                Project project = projects.LoadProject(this.ProjectFilePath);

                project.SetProperty("AssemblyName", this.AssemblyName);

                HashSet <string> Assemblies = new HashSet <string>();

                foreach (string file in workflowFiles)
                {
                    project.AddItem("XamlAppDef", file);

                    XamlXmlReader reader = new XamlXmlReader(XmlReader.Create(file, new XmlReaderSettings {
                        XmlResolver = null
                    }), new XamlSchemaContext());
                    using (reader)
                    {
                        while (reader.Read())
                        {
                            if (reader.NodeType == XamlNodeType.NamespaceDeclaration)
                            {
                                string _namespace = reader.Namespace.Namespace.ToLowerInvariant();

                                if (_namespace.IndexOf("assembly=", StringComparison.OrdinalIgnoreCase) > -1)
                                {
                                    List <string> filters = new List <string>();
                                    filters.Add("assembly=");
                                    string[] results = _namespace.Split(filters.ToArray(), StringSplitOptions.RemoveEmptyEntries);
                                    if (results.Length > 1 && !string.IsNullOrEmpty(results[1]))
                                    {
                                        string requiredAssemblyLocation;
                                        if (requiredAssemblies != null && requiredAssemblies.Count > 0 && requiredAssemblies.TryGetValue(results[1], out requiredAssemblyLocation))
                                        {
                                            Assemblies.Add(requiredAssemblyLocation);
                                        }
                                        else
                                        {
                                            Assemblies.Add(results[1]);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                foreach (string assembly in Assemblies)
                {
                    project.AddItem("Reference", assembly);
                }

                project.Save(this.ProjectFilePath);

                FileLogger logger = new FileLogger();
                logger.Parameters = "logfile=" + this.BuildLogPath;

                this.BuildReturnedCode = false;

                // According to MSDN, http://msdn.microsoft.com/en-us/library/microsoft.build.evaluation.projectcollection.aspx
                // multiple project collections can exist within an app domain. However, these must not build concurrently.
                // Therefore, we need a static lock to prevent multiple threads from accessing this call.
                lock (_syncObject)
                {
                    this.BuildReturnedCode = project.Build(logger);
                }

                logger.Shutdown();

                // If compilation succeeded, delete the project files.
                //
                if (this.BuildReturnedCode)
                {
                    string generatedAssemblyPath = Path.Combine(this.ProjectFolderPath, @"obj\Release\" + this.ProjectName + ".dll");
                    if (File.Exists(generatedAssemblyPath))
                    {
                        File.Move(generatedAssemblyPath, this.AssemblyPath);
                    }

                    try
                    {
                        System.IO.Directory.Delete(this.ProjectFolderPath, true);
                    }
                    catch (Exception e)
                    {
                        Tracer.TraceException(e);
                        // Ignoring the exceptions from Delete of temp directory.
                    }
                }
            }
#endif
        }
Example #28
0
        private bool ParseInput()
        {
            XamlXmlReader reader = null;

            try {
                try {
                    reader = new XamlXmlReader(InputFileName.ItemSpec, new XamlXmlReaderSettings {
                        ProvideLineInfo = true
                    });
                } catch (FileNotFoundException ex) {
                    LogError(1001, ex.Message);
                    return(false);
                }

                bool classNameExpected = false, classModifierExpected = false;
                bool lambdaBodyExpected = false, importedNamespacesExpected = false;
                int  nestingLevel = 0, lambdaNestingLevel = -1;
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                    case XamlNodeType.GetObject:
                        ++nestingLevel;
                        break;

                    case XamlNodeType.StartObject:
                        ++nestingLevel;
                        if (nestingLevel == 1)
                        {
                            classNameLineNumber = reader.LineNumber;
                        }
                        if ((reader.Type.Name == "Lambda" || reader.Type.Name == "LambdaExtension") && IsLambdaNamespace(reader.Type.PreferredXamlNamespace))
                        {
                            lambdaNestingLevel = nestingLevel;
                        }
                        break;

                    case XamlNodeType.EndObject:
                        --nestingLevel;
                        if (nestingLevel < lambdaNestingLevel)
                        {
                            lambdaNestingLevel = -1;
                        }
                        break;

                    case XamlNodeType.StartMember:
                        if (nestingLevel == 1)
                        {
                            if (reader.Member.PreferredXamlNamespace == XamlLanguage.Xaml2006Namespace)
                            {
                                switch (reader.Member.Name)
                                {
                                case "Class": {
                                    classNameExpected = true;
                                } break;

                                case "ClassModifier": {
                                    classModifierExpected = true;
                                } break;
                                }
                            }
                            else if (reader.Member.DeclaringType != null && IsLambdaNamespace(reader.Member.DeclaringType.PreferredXamlNamespace))
                            {
                                if (reader.Member.Name == "ImportedNamespaces" && reader.Member.DeclaringType.Name == "LambdaProperties")
                                {
                                    importedNamespacesExpected = true;
                                }
                            }
                        }
                        else if (nestingLevel == lambdaNestingLevel)
                        {
                            if (reader.Member == XamlLanguage.UnknownContent || reader.Member == XamlLanguage.PositionalParameters || reader.Member.Name == "Lambda")
                            {
                                lambdaBodyExpected = true;
                            }
                        }
                        break;

                    case XamlNodeType.EndMember:
                        classNameExpected = lambdaBodyExpected = importedNamespacesExpected = false;
                        break;

                    case XamlNodeType.Value:
                        if (classNameExpected)
                        {
                            classNameExpected   = false;
                            className           = (string)reader.Value;
                            classNameLineNumber = reader.LineNumber;
                        }
                        else if (classModifierExpected)
                        {
                            classModifierExpected   = false;
                            classModifier           = (string)reader.Value;
                            classModifierLineNumber = reader.LineNumber;
                        }
                        else if (importedNamespacesExpected)
                        {
                            importedNamespaces.Clear();
                            importedNamespaces.AddRange(((string)reader.Value).Split(" \f\n\r\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
                            importedNamespacesLineNumber = reader.LineNumber;
                        }
                        else if (lambdaBodyExpected)
                        {
                            lambdas.Add(new LambdaInfo {
                                Code = (string)reader.Value, LineNumber = reader.LineNumber
                            });
                        }
                        break;
                    }
                }
            } catch (IOException ex) {
                LogError(1002, ex.Message);
                return(false);
            } catch (XmlException ex) {
                LogError(1003, ex.Message);
                return(false);
            } catch (XamlException ex) {
                LogError(1004, ex.Message);
                return(false);
            } finally {
                if (reader != null)
                {
                    reader.Close();
                }
            }

            return(true);
        }
Example #29
0
        public static void LoadI18N()
        {
            var locale = AppSettings.Default.Interface.Locale;

            _i18nDic = App.Current.Resources.MergedDictionaries[0];
            var defLocale    = _i18nDic.MergedDictionaries[0];
            var defUiStrings = defLocale.Keys.Cast <object>().ToDictionary(defKey => (string)defKey, defKey => (string)defLocale[defKey]);

            foreach (var enumerateFile in Util.EnumerateFiles(Domain.LangPath, ".xaml"))
            {
                try
                {
                    var fullText   = File.ReadAllText(enumerateFile.FullName);
                    var localeCode = Path.GetFileNameWithoutExtension(enumerateFile.Name);
                    var nativeName = CultureInfo.CreateSpecificCulture(localeCode).NativeName;

                    if (string.IsNullOrWhiteSpace(fullText)) // 读取文件,若空则新建
                    {
                        var defUiText = string.Join("\r\n",
                                                    defUiStrings.Select(k => $@"    <sys:String x:Key=""{k.Key}"">{k.Value}</sys:String>"));
                        var xamlTemplate = GetXamlTemplate(defUiText);
                        File.WriteAllText(enumerateFile.FullName, xamlTemplate);
                    }
                    else
                    {
                        // 否则分析文件,和默认的做对比,如果少了相应的字段则补齐
                        using (var xamlReader = new XamlXmlReader(new StringReader(fullText)))
                        {
                            string keyName = null;

                            (int LineNumber, int LinePosition, Type Type)? currentObj        = null;
                            (int LineNumber, int LinePosition, string member)? currentMember = null;
                            int firstObjLine = 0;
                            var kvs          = new Dictionary <string, string>();
                            while (!xamlReader.IsEof)
                            {
                                var result = xamlReader.Read();
                                if (!result)
                                {
                                    continue;
                                }
                                if (xamlReader.NodeType == XamlNodeType.StartObject)
                                {
                                    currentObj = (xamlReader.LineNumber, xamlReader.LinePosition, xamlReader.Type.UnderlyingType);
                                }
                                else if (xamlReader.NodeType == XamlNodeType.EndObject)
                                {
                                    currentObj = null;
                                }
                                else if (xamlReader.NodeType == XamlNodeType.EndMember)
                                {
                                    currentMember = null;
                                }

                                //if (currentObj?.Type == typeof(ResourceDictionary))
                                //{
                                //    if (xamlReader.NodeType == XamlNodeType.StartMember)
                                //    {
                                //        currentMember = (xamlReader.LineNumber, xamlReader.LinePosition, xamlReader.Member.Name);
                                //    }
                                //    else if (xamlReader.NodeType == XamlNodeType.Value && currentMember?.member == "Name")
                                //    {
                                //        langName = (string)xamlReader.Value;
                                //    }
                                //}
                                //else
                                if (currentObj?.Type == typeof(string))
                                {
                                    if (xamlReader.NodeType == XamlNodeType.StartMember)
                                    {
                                        currentMember = (xamlReader.LineNumber, xamlReader.LinePosition, xamlReader.Member.Name);
                                    }
                                    else if (xamlReader.NodeType == XamlNodeType.Value && currentMember?.member == "Key")
                                    {
                                        keyName = (string)xamlReader.Value;
                                    }
                                    else if (xamlReader.NodeType == XamlNodeType.Value && currentMember?.member == "_Initialization")
                                    {
                                        if (kvs.Count == 0)
                                        {
                                            firstObjLine = xamlReader.LineNumber;
                                        }

                                        kvs.Add(keyName, (string)xamlReader.Value);
                                    }
                                }
                            }

                            var unspecifiedKvs = defUiStrings.Where(k => !kvs.ContainsKey(k.Key)).ToList(); // 是否缺少字段
                            if (unspecifiedKvs.Count > 0)
                            {
                                var kvStr = string.Join("\r\n",
                                                        unspecifiedKvs.Select(k => $@"    <sys:String x:Key=""{k.Key}"">{k.Value}</sys:String>"));

                                using (var sr = new StringReader(fullText))
                                    using (var sw = new StreamWriter(enumerateFile.FullName))
                                    {
                                        int    i    = 1;
                                        string line = sr.ReadLine();
                                        while (line != null)
                                        {
                                            if (i == firstObjLine)
                                            {
                                                sw.WriteLine(kvStr);
                                            }

                                            sw.WriteLine(line);
                                            line = sr.ReadLine();
                                            i++;
                                        }
                                    }
                            }
                        }
                    }

                    AvailableLangDic.Add(nativeName, localeCode);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }

            if (!AvailableLangDic.ContainsValue("zh-CN"))
            {
                var chiUiText = string.Join("\r\n",
                                            defUiStrings.Select(k => $@"    <sys:String x:Key=""{k.Key}"">{k.Value}</sys:String>"));
                var nativeName = CultureInfo.CreateSpecificCulture("zh-CN").NativeName;
                File.WriteAllText(Path.Combine(Domain.LangPath, "zh-CN.xaml"), GetXamlTemplate(chiUiText));

                AvailableLangDic.Add(nativeName, "zh-CN");
            }

            SwitchToLang(string.IsNullOrWhiteSpace(locale) ? CultureInfo.CurrentCulture.Name : locale);
        }
        internal void Compile(List <string> dependentWorkflows, Dictionary <string, string> requiredAssemblies)
        {
            string        str           = null;
            DirectoryInfo directoryInfo = new DirectoryInfo(this.ProjectFolderPath);

            directoryInfo.Create();
            List <string> strs = new List <string>();

            try
            {
                foreach (string dependentWorkflow in dependentWorkflows)
                {
                    string str1 = Path.Combine(this.ProjectFolderPath, string.Concat(Path.GetRandomFileName(), ".xaml"));
                    File.WriteAllText(str1, dependentWorkflow);
                    strs.Add(str1);
                }
                File.WriteAllText(this.ProjectFilePath, "<?xml version=\"1.0\" encoding=\"utf-8\"?><Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup><Configuration Condition=\" '$(Configuration)' == '' \">Release</Configuration><Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform><ProductVersion>10.0</ProductVersion><SchemaVersion>2.0</SchemaVersion><OutputType>Library</OutputType><AppDesignerFolder>Properties</AppDesignerFolder><TargetFrameworkVersion>v4.0</TargetFrameworkVersion><TargetFrameworkProfile></TargetFrameworkProfile><FileAlignment>512</FileAlignment></PropertyGroup><PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \"><DebugSymbols>true</DebugSymbols><DebugType>full</DebugType><Optimize>false</Optimize><OutputPath>bin\\Debug\\</OutputPath><DefineConstants>DEBUG;TRACE</DefineConstants><ErrorReport>prompt</ErrorReport><WarningLevel>4</WarningLevel></PropertyGroup><PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \"><DebugType>pdbonly</DebugType><Optimize>true</Optimize><OutputPath>bin\\Release\\</OutputPath><DefineConstants>TRACE</DefineConstants><ErrorReport>prompt</ErrorReport><WarningLevel>4</WarningLevel></PropertyGroup><ItemGroup><Reference Include=\"Microsoft.CSharp\" /><Reference Include=\"System\" /><Reference Include=\"System.Activities\" /><Reference Include=\"System.Core\" /><Reference Include=\"System.Data\" /><Reference Include=\"System.ServiceModel\" /><Reference Include=\"System.ServiceModel.Activities\" /><Reference Include=\"System.Xaml\" /><Reference Include=\"System.Xml\" /><Reference Include=\"System.Xml.Linq\" /><Reference Include=\"System.Management\" /><Reference Include=\"System.Management.Automation\" /><Reference Include=\"Microsoft.PowerShell.Workflow.ServiceCore\" /></ItemGroup><Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" /><!-- To modify your build process, add your task inside one of the targets below and uncomment it.  Other similar extension points exist, see Microsoft.Common.targets. <Target Name=\"BeforeBuild\"></Target><Target Name=\"AfterBuild\"></Target>--></Project>");
            }
            catch (Exception exception1)
            {
                Exception exception = exception1;
                WorkflowRuntimeCompilation.Tracer.TraceException(exception);
                throw;
            }
            using (ProjectCollection projectCollection = new ProjectCollection())
            {
                Project project = projectCollection.LoadProject(this.ProjectFilePath);
                project.SetProperty("AssemblyName", this.AssemblyName);
                HashSet <string> strs1 = new HashSet <string>();
                foreach (string str2 in strs)
                {
                    project.AddItem("XamlAppDef", str2);
                    XamlXmlReader xamlXmlReader = new XamlXmlReader(XmlReader.Create(str2), new XamlSchemaContext());
                    using (xamlXmlReader)
                    {
                        while (xamlXmlReader.Read())
                        {
                            if (xamlXmlReader.NodeType != XamlNodeType.NamespaceDeclaration)
                            {
                                continue;
                            }
                            string lowerInvariant = xamlXmlReader.Namespace.Namespace.ToLowerInvariant();
                            if (lowerInvariant.IndexOf("assembly=", StringComparison.OrdinalIgnoreCase) <= -1)
                            {
                                continue;
                            }
                            List <string> strs2 = new List <string>();
                            strs2.Add("assembly=");
                            string[] strArrays = lowerInvariant.Split(strs2.ToArray(), StringSplitOptions.RemoveEmptyEntries);
                            if ((int)strArrays.Length <= 1 || string.IsNullOrEmpty(strArrays[1]))
                            {
                                continue;
                            }
                            if (requiredAssemblies == null || requiredAssemblies.Count <= 0 || !requiredAssemblies.TryGetValue(strArrays[1], out str))
                            {
                                strs1.Add(strArrays[1]);
                            }
                            else
                            {
                                strs1.Add(str);
                            }
                        }
                    }
                }
                foreach (string str3 in strs1)
                {
                    project.AddItem("Reference", str3);
                }
                project.Save(this.ProjectFilePath);
                FileLogger fileLogger = new FileLogger();
                fileLogger.Parameters  = string.Concat("logfile=", this.BuildLogPath);
                this.BuildReturnedCode = false;
                lock (WorkflowRuntimeCompilation._syncObject)
                {
                    this.BuildReturnedCode = project.Build(fileLogger);
                }
                fileLogger.Shutdown();
                if (this.BuildReturnedCode)
                {
                    string str4 = Path.Combine(this.ProjectFolderPath, string.Concat("obj\\Release\\", this.ProjectName, ".dll"));
                    if (File.Exists(str4))
                    {
                        File.Move(str4, this.AssemblyPath);
                    }
                    try
                    {
                        Directory.Delete(this.ProjectFolderPath, true);
                    }
                    catch (Exception exception3)
                    {
                        Exception exception2 = exception3;
                        WorkflowRuntimeCompilation.Tracer.TraceException(exception2);
                    }
                }
            }
        }