Example #1
0
 public void AddCustomTupleDefinition(IntermediateTupleDefinition definition)
 {
     if (!this.CustomDefinitionByName.TryGetValue(definition.Name, out var existing) || definition.Revision > existing.Revision)
     {
         this.CustomDefinitionByName[definition.Name] = definition;
     }
 }
Example #2
0
        public bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
        {
            // First, look in the built-ins.
            tupleDefinition = TupleDefinitions.ByName(name);

            if (tupleDefinition == null)
            {
                if (this.ExtensionData == null)
                {
                    this.LoadExtensionData();
                }

                // Second, look in the extensions.
                foreach (var data in this.ExtensionData)
                {
                    if (data.TryGetTupleDefinitionByName(name, out tupleDefinition))
                    {
                        break;
                    }
                }

                // Finally, look in the custom tuple definitions provided during an intermediate load.
                if (tupleDefinition == null)
                {
                    this.CustomDefinitionByName.TryGetValue(name, out tupleDefinition);
                }
            }

            return(tupleDefinition != null);
        }
Example #3
0
        /// <summary>
        /// Resolves the source path of a file using binder extensions.
        /// </summary>
        /// <param name="source">Original source value.</param>
        /// <param name="type">Optional type of source file being resolved.</param>
        /// <param name="sourceLineNumbers">Optional source line of source file being resolved.</param>
        /// <param name="bindStage">The binding stage used to determine what collection of bind paths will be used</param>
        /// <returns>Should return a valid path for the stream to be imported.</returns>
        public string ResolveFile(string source, IntermediateTupleDefinition tupleDefinition, SourceLineNumber sourceLineNumbers, BindStage bindStage)
        {
            foreach (var extension in this.ResolverExtensions)
            {
                var resolved = extension.ResolveFile(source, tupleDefinition, sourceLineNumbers, bindStage);

                if (null != resolved)
                {
                    return(resolved);
                }
            }

            return(this.ResolveUsingBindPaths(source, tupleDefinition, sourceLineNumbers, bindStage));
        }
Example #4
0
        public string Resolve(SourceLineNumber sourceLineNumbers, IntermediateTupleDefinition tupleDefinition, string source)
        {
            foreach (var extension in this.LibrarianExtensions)
            {
                var resolved = extension.Resolve(sourceLineNumbers, tupleDefinition, source);

                if (null != resolved)
                {
                    return(resolved);
                }
            }

            return(this.ResolveUsingBindPaths(source, tupleDefinition, sourceLineNumbers, BindStage.Normal));
        }
Example #5
0
        public bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
        {
            switch (name)
            {
            case "Example":
                tupleDefinition = ExampleTupleDefinitions.Example;
                break;

            default:
                tupleDefinition = null;
                break;
            }

            return(tupleDefinition != null);
        }
Example #6
0
        public void CanSaveAndLoadIntermediateWithCustomDefinitions()
        {
            var sln = new SourceLineNumber("test.wxs", 1);

            var section = new IntermediateSection("test", SectionType.Product, 65001);

            var fieldDefs = new[]
            {
                new IntermediateFieldDefinition("A", IntermediateFieldType.String),
                new IntermediateFieldDefinition("B", IntermediateFieldType.Number),
                new IntermediateFieldDefinition("C", IntermediateFieldType.Bool),
            };

            var tupleDef = new IntermediateTupleDefinition("CustomDef", fieldDefs, null);

            var tuple = tupleDef.CreateTuple(sln, new Identifier(AccessModifier.Public, "customT"));

            tuple.Set(0, "foo");
            tuple.Set(1, 2);
            tuple.Set(2, true);

            section.Tuples.Add(tuple);

            var intermediate = new Intermediate("TestIntermediate", new[] { section }, null, null);

            var path = Path.GetTempFileName();

            try
            {
                intermediate.Save(path);

                var loaded        = Intermediate.Load(path);
                var loadedSection = loaded.Sections.Single();
                var loadedTuple   = loadedSection.Tuples.Single();

                Assert.Equal("foo", loadedTuple.AsString(0));
                Assert.Equal(2, loadedTuple[1].AsNumber());
                Assert.True(loadedTuple[2].AsBool());
            }
            finally
            {
                File.Delete(path);
            }
        }
        /// <summary>
        /// Resolves the source path of a file using binder extensions.
        /// </summary>
        /// <param name="source">Original source value.</param>
        /// <param name="type">Optional type of source file being resolved.</param>
        /// <param name="sourceLineNumbers">Optional source line of source file being resolved.</param>
        /// <param name="bindStage">The binding stage used to determine what collection of bind paths will be used</param>
        /// <returns>Should return a valid path for the stream to be imported.</returns>
        public string ResolveFile(string source, IntermediateTupleDefinition tupleDefinition, SourceLineNumber sourceLineNumbers, BindStage bindStage)
        {
            var checkedPaths = new List <string>();

            foreach (var extension in this.ResolverExtensions)
            {
                var resolved = extension.ResolveFile(source, tupleDefinition, sourceLineNumbers, bindStage);

                if (resolved?.CheckedPaths != null)
                {
                    checkedPaths.AddRange(resolved.CheckedPaths);
                }

                if (!String.IsNullOrEmpty(resolved?.Path))
                {
                    return(resolved?.Path);
                }
            }

            return(this.MustResolveUsingBindPaths(source, tupleDefinition, sourceLineNumbers, bindStage, checkedPaths));
        }
Example #8
0
 public override bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
 {
     tupleDefinition = SqlTupleDefinitions.ByName(name);
     return(tupleDefinition != null);
 }
 public virtual string ResolveFile(string source, IntermediateTupleDefinition tupleDefinition, SourceLineNumber sourceLineNumbers, BindStage bindStage)
 {
     return(null);
 }
Example #10
0
        public void CanSaveAndLoadMultipleIntermediateWithCustomDefinitions()
        {
            var sln = new SourceLineNumber("test.wxs", 1);

            // Intermediate #1
            var fieldDefs = new[]
            {
                new IntermediateFieldDefinition("A", IntermediateFieldType.String),
                new IntermediateFieldDefinition("B", IntermediateFieldType.Number),
                new IntermediateFieldDefinition("C", IntermediateFieldType.Bool),
            };

            var tupleDef = new IntermediateTupleDefinition("CustomDef", fieldDefs, null);

            var tuple = tupleDef.CreateTuple(sln, new Identifier(AccessModifier.Public, "customT"));

            tuple.Set(0, "foo");
            tuple.Set(1, 2);
            tuple.Set(2, true);

            var section = new IntermediateSection("test", SectionType.Product, 65001);

            section.Tuples.Add(tuple);

            var intermediate1 = new Intermediate("TestIntermediate", new[] { section }, null, null);

            // Intermediate #2
            var fieldDefs2 = new[]
            {
                new IntermediateFieldDefinition("A", IntermediateFieldType.String),
                new IntermediateFieldDefinition("B", IntermediateFieldType.Number),
                new IntermediateFieldDefinition("C", IntermediateFieldType.Bool),
                new IntermediateFieldDefinition("D", IntermediateFieldType.String),
            };

            var tupleDef2 = new IntermediateTupleDefinition("CustomDef", 1, fieldDefs2, null);

            var tuple2 = tupleDef2.CreateTuple(sln, new Identifier(AccessModifier.Public, "customT2"));

            tuple2.Set(0, "bar");
            tuple2.Set(1, 3);
            tuple2.Set(2, false);
            tuple2.Set(3, "baz");

            var section2 = new IntermediateSection("test2", SectionType.Fragment, 65001);

            section2.Tuples.Add(tuple2);

            var intermediate2 = new Intermediate("TestIntermediate2", new[] { section2 }, null, null);

            // Save
            var path1 = Path.GetTempFileName();
            var path2 = Path.GetTempFileName();

            try
            {
                intermediate1.Save(path1);
                intermediate2.Save(path2);

                var loaded = Intermediate.Load(new[] { path1, path2 });

                var loaded1 = loaded.First();
                var loaded2 = loaded.Skip(1).Single();

                var loadedTuple1 = loaded1.Sections.Single().Tuples.Single();
                var loadedTuple2 = loaded2.Sections.Single().Tuples.Single();

                Assert.Equal("foo", loadedTuple1.AsString(0));
                Assert.Equal(2, loadedTuple1[1].AsNumber());
                Assert.True(loadedTuple1[2].AsBool());
                Assert.Null(loadedTuple1.AsString(3));

                Assert.Equal("bar", loadedTuple2.AsString(0));
                Assert.Equal(3, loadedTuple2[1].AsNumber());
                Assert.False(loadedTuple2[2].AsBool());
                Assert.Equal("baz", loadedTuple2.AsString(3));
            }
            finally
            {
                File.Delete(path2);
                File.Delete(path1);
            }
        }
Example #11
0
        private static IntermediateTuple CreateRow(IntermediateSection section, SourceLineNumber sourceLineNumbers, IntermediateTupleDefinition tupleDefinition, Identifier identifier)
        {
            var row = tupleDefinition.CreateTuple(sourceLineNumbers, identifier);

            if (null != identifier)
            {
                if (row.Definition.FieldDefinitions[0].Type == IntermediateFieldType.Number)
                {
                    row.Set(0, Convert.ToInt32(identifier.Id));
                }
                else
                {
                    row.Set(0, identifier.Id);
                }
            }

            section.Tuples.Add(row);

            return(row);
        }
Example #12
0
        private string ResolveUsingBindPaths(string source, IntermediateTupleDefinition tupleDefinition, SourceLineNumber sourceLineNumbers, BindStage bindStage)
        {
            string resolved = null;

            // If the file exists, we're good to go.
            if (CheckFileExists(source))
            {
                resolved = source;
            }
            else if (Path.IsPathRooted(source)) // path is rooted so bindpaths won't help, bail since the file apparently doesn't exist.
            {
                resolved = null;
            }
            else // not a rooted path so let's try applying all the different source resolution options.
            {
                string bindName             = String.Empty;
                var    path                 = source;
                string pathWithoutSourceDir = null;

                if (source.StartsWith(BindPathOpenString, StringComparison.Ordinal))
                {
                    int closeParen = source.IndexOf(')', BindPathOpenString.Length);
                    if (-1 != closeParen)
                    {
                        bindName = source.Substring(BindPathOpenString.Length, closeParen - BindPathOpenString.Length);
                        path     = source.Substring(BindPathOpenString.Length + bindName.Length + 1); // +1 for the closing brace.
                        path     = path.TrimStart('\\');                                              // remove starting '\\' char so the path doesn't look rooted.
                    }
                }
                else if (source.StartsWith("SourceDir\\", StringComparison.Ordinal) || source.StartsWith("SourceDir/", StringComparison.Ordinal))
                {
                    pathWithoutSourceDir = path.Substring(10);
                }

                var bindPaths = this.BindPaths[bindStage];

                foreach (var bindPath in bindPaths)
                {
                    if (!String.IsNullOrEmpty(pathWithoutSourceDir))
                    {
                        var filePath = Path.Combine(bindPath.Path, pathWithoutSourceDir);

                        if (CheckFileExists(filePath))
                        {
                            resolved = filePath;
                        }
                    }

                    if (String.IsNullOrEmpty(resolved))
                    {
                        var filePath = Path.Combine(bindPath.Path, path);

                        if (CheckFileExists(filePath))
                        {
                            resolved = filePath;
                        }
                    }
                }
            }

            if (null == resolved)
            {
                throw new WixFileNotFoundException(sourceLineNumbers, source, tupleDefinition.Name);
            }

            // Didn't find the file.
            return(resolved);
        }
 public virtual bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
 {
     tupleDefinition = null;
     return(false);
 }
Example #14
0
 public void AddCustomTupleDefinition(IntermediateTupleDefinition definition)
 {
     this.CustomDefinitionByName.Add(definition.Name, definition);
 }
 public override bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
 {
     tupleDefinition = (name == FirewallTupleDefinitionNames.WixFirewallException) ? FirewallTupleDefinitions.WixFirewallException : null;
     return(tupleDefinition != null);
 }
Example #16
0
 public override bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
 {
     tupleDefinition = (name == NetfxTupleDefinitionNames.NetFxNativeImage) ? NetfxTupleDefinitions.NetFxNativeImage : null;
     return(tupleDefinition != null);
 }