예제 #1
0
        public static void FixupPaths(string fileName, BindingAssembly assembly)
        {
            FileInfo manifest = new FileInfo(fileName);

            foreach (BindingAssembly.File file in assembly.Files)
            {
                FileInfo fi = new FileInfo(file.FileName);
                if (fi.Exists)
                {
                    if (fi.FullName != file.FileName)
                    {  // Really this shouldn't happen but it might figure something out that's useful, so use it.
                        file.FileName = fi.FullName;
                    }
                }
                else
                {
                    // File doesn't exist, see if we can find it
                    if (file.FileName.IndexOf(':') == -1)
                    {
                        // Relative path, so try relative
                        string   mergedFileName = Path.Combine(manifest.DirectoryName, file.FileName);
                        FileInfo mergedFi       = new FileInfo(mergedFileName);
                        if (mergedFi.Exists)
                        {
                            file.FileName = mergedFi.FullName;
                        }
                        else
                        {
                            // We don't know where to find this file.
                            // TODO: Enhancements
                        }
                    }
                }
            }
        }
예제 #2
0
        private void btnSaveAs_Click(object sender, EventArgs e)
        {
            if (assembly == null)
            {
                assembly = new BindingAssembly();
            }
            ctlSettings.ScreenToSettings(assembly.DefaultSettings);

            FileInfo       fi          = new FileInfo(txtFileName.Text);
            SaveFileDialog dlgSaveFile = new SaveFileDialog();

            if (fi.Exists)
            {
                dlgSaveFile.InitialDirectory = fi.DirectoryName;
            }
            dlgSaveFile.FileName    = fi.Name;
            dlgSaveFile.Filter      = "Text (*.TXT)|*.txt|XML (*.XML)|*.xml|Manifest (*.Manifest)|*.Manifest|All files (*.*)|*.*";
            dlgSaveFile.FilterIndex = 3;
            dlgSaveFile.FileOk     += new System.ComponentModel.CancelEventHandler(DlgSaveFile_FileOk);

            dlgSaveFile.ShowDialog();

            if (!didSelectSaveFile)
            {
                return;
            }

            FileInfo newFi = new FileInfo(dlgSaveFile.FileName);

            switch (newFi.Extension.ToLower())
            {
            case ".txt":
            case ".text":
                // For text we write a list of files -- only
                using (FileStream fs = File.Open(newFi.FullName, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
                {
                    using (StreamWriter sw = new StreamWriter(fs))
                    {
                        foreach (BindingAssembly.File file in assembly.Files)
                        {
                            sw.Write(GetRelativePath(dlgSaveFile.FileName, file.FileName)); sw.WriteLine();
                        }
                    }
                }
                break;

            default:
                BindingAssembly ba = new BindingAssembly();
                ba.CopyFrom(assembly);
                foreach (BindingAssembly.File file in ba.Files)
                {
                    file.FileName = GetRelativePath(dlgSaveFile.FileName, file.FileName);
                }
                using (FileStream fs = File.Open(newFi.FullName, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
                {
                    FileReader.Serialize(assembly, fs);
                }
                break;
            }
        }
예제 #3
0
 public static void Serialize(BindingAssembly assembly, Stream stream)
 {
     if (xmlSer == null)
     {
         xmlSer = new XmlSerializer(typeof(BindingAssembly));
     }
     xmlSer.Serialize(stream, assembly);
 }
예제 #4
0
        private void btnDefault_Click(object sender, EventArgs e)
        {
            if (assembly == null)
            {
                assembly = new BindingAssembly();
            }
            SettingsForm sf = new SettingsForm(assembly.DefaultSettings);

            sf.ShowDialog();
            assembly.DefaultSettings.CopyFrom(sf.Settings);
        }
예제 #5
0
        public Binder()
        {
            InitializeComponent();
            assembly = new BindingAssembly();
            ctlSettings.SettingsToScreen(assembly.DefaultSettings);
            grdFiles.AutoGenerateColumns = true;

            grdFiles.DataSource = assembly.Files;
            foreach (DataGridViewColumn column in grdFiles.Columns)
            {
                column.ReadOnly = true;
                column.Visible  = (column.Name == "FileName");  // Hide all but FileName
                if (column.Name == "FileName")
                {
                    column.HeaderText = "File Name";
                    column.Width      = grdFiles.Width;
                }
            }
            grdFiles.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
        }
예제 #6
0
        private void btnLoad_Click(object sender, EventArgs e)
        {
            if (assembly == null)
            {
                assembly = new BindingAssembly();
            }
            ctlSettings.ScreenToSettings(assembly.DefaultSettings);
            if (assembly.Files.Count > 0)
            {
                // Confirm, overwrite
                DialogResult result = MessageBox.Show("Clear existing entries and configuration?", "Overwrite", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
                if (result == DialogResult.Yes)
                {
                    assembly.Files.Clear();
                }
                else if (result == DialogResult.Cancel)
                {
                    return;
                }
                // else we'll append
            }

            try
            {
                if (assembly == null)
                {
                    assembly = new BindingAssembly();
                }
                assembly = FileReader.GetAssembly(txtFileName.Text, assembly);
            }
            catch (Exception ex)
            {
                SetStatusMessage(ex.Message);
            }

            ctlSettings.SettingsToScreen(assembly.DefaultSettings);
            UpdateFilesLoaded();
        }
예제 #7
0
        public static BindingAssembly GetAssembly(string fileName, BindingAssembly assembly)
        {
            if (string.IsNullOrWhiteSpace(fileName))
            {
                throw new InvalidDataException("Filename may not be null/empty");
            }
            FileInfo fi = new FileInfo(fileName);

            if (!fi.Exists)
            {
                throw new InvalidDataException("Input manifest file must exist");
            }
            if (fi.Length > MaxManifestFileLength)
            {
                throw new InvalidDataException($"The manifest file may not be longer than {MaxManifestFileLength} bytes");
            }
            // File exists and we've got a good name, read it
            string manifestFile = File.ReadAllText(fileName);

            bool        isValidXml = false;
            XmlDocument doc        = new XmlDocument();

            try
            {
                doc.LoadXml(manifestFile);
                isValidXml = true;
            }
            catch { }

            if (isValidXml)
            {
                // Try to Deserialize
                try
                {
                    if (xmlSer == null)
                    {
                        xmlSer = new XmlSerializer(typeof(BindingAssembly));
                    }
                    BindingAssembly xmlAssembly = null;
                    using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        xmlAssembly = xmlSer.Deserialize(fs) as BindingAssembly;
                    }
                    FixupPaths(fileName, xmlAssembly);
                    assembly.CopyFrom(xmlAssembly);
                    return(assembly);
                }
                catch
                {
                    throw new InvalidDataException("Unable to deserialize XML");
                }
            }
            else
            {
                // Process as list of files
                string[] lines = manifestFile.Split(new char[] { '\r', '\n' });
                foreach (string line in lines)
                {
                    string cleanLine = line.Trim();
                    if (cleanLine.Length > 0)
                    {
                        assembly.Files.Add(new BindingAssembly.File(line, assembly.DefaultSettings));
                    }
                }
            }

            FixupPaths(fileName, assembly);
            return(assembly);
        }
예제 #8
0
        public static BindingAssembly GetAssembly(string fileName, BindingAssembly.Settings defaultSettings)
        {
            BindingAssembly assembly = new BindingAssembly(defaultSettings);

            return(GetAssembly(fileName, assembly));
        }
예제 #9
0
        const long MaxManifestFileLength = 10 * 1024 * 1024; // 10MB

        // Overloads
        public static BindingAssembly GetAssembly(string fileName)
        {
            BindingAssembly assembly = new BindingAssembly();

            return(GetAssembly(fileName, assembly));
        }
예제 #10
0
 public BindingController(Document wordDoc, BindingAssembly assembly, BinderStatus status)
 {
     WordDoc  = wordDoc;
     Assembly = assembly;
     Status   = status;
 }