コード例 #1
0
ファイル: RepackPAC.cs プロジェクト: descatal/FBRepacker
        private byte[] appendEndFile(byte[] arraytoAppend, GeneralFileInfo endFileInfo)
        {
            // For files without endfiles (STREAM)
            if (endFileInfo == null)
            {
                return(arraytoAppend);
            }

            bool ifFileExist = realFileInfos.Any(s => s.Name == endFileInfo.fileName);

            if (!ifFileExist)
            {
                throw new Exception("Cannot find endFile " + endFileInfo.fileName);
            }

            FileInfo file = realFileInfos.FirstOrDefault(s => s.Name == endFileInfo.fileName);

            byte[] endFileBuffer = new byte[file.OpenRead().Length];
            file.OpenRead().Read(endFileBuffer, 0, endFileBuffer.Length);

            int originalSize = arraytoAppend.Length;

            Array.Resize(ref arraytoAppend, arraytoAppend.Length + endFileBuffer.Length);

            Buffer.BlockCopy(endFileBuffer, 0, arraytoAppend, originalSize, endFileBuffer.Length);

            return(arraytoAppend);
        }
コード例 #2
0
ファイル: RepackPAC.cs プロジェクト: descatal/FBRepacker
        private void parseSTREAMInfo(int fileNumber, bool isRootSTREAM)
        {
            string[] STREAMInfo = fileInfoDic[fileNumber];

            GeneralFileInfo streamFile = new GeneralFileInfo();

            if (parsedFileInfo.ContainsKey(fileNumber))
            {
                streamFile = parsedFileInfo[fileNumber];
            }

            streamFile.totalFileSize      = 0;
            streamFile.numberofFiles      = 1;
            streamFile.FHMChunkSize       = 0;
            streamFile.additionalInfoFlag = 0;
            streamFile.fileName           = getSpecificFileInfoProperties("fileName: ", STREAMInfo);
            streamFile.fileNo             = fileNumber;
            streamFile.header             = "STREAM";

            parsedFileInfo[fileNumber] = streamFile;

            // stream
            string[] newFileInfos = fileInfoDic[fileNumberinInfoFile];
            repackSTREAM.parseSTREAMMetadata(newFileInfos);
        }
コード例 #3
0
        private TreeViewItem addHierarchy(TreeViewItem treeViewItem, GeneralFileInfo fileInfo)
        {
            // Convert fileInfo into TreeViewItem
            TreeViewItem newItem = getTreeView(fileInfo);

            if (fileInfo.header == "fhm")
            {
                List <GeneralFileInfo> allChildFileInfos = parsedFileInfo.Values.Where(s => s.FHMFileNumber == fileInfo.fileNo).ToList();

                if (fileInfo.numberofFiles != allChildFileInfos.Count)
                {
                    throw new Exception("number of child files in FHM dosen't match with the total FHM file number!");
                }

                foreach (var childFileInfos in allChildFileInfos)
                {
                    TreeViewItem treeView = addHierarchy(newItem, childFileInfos);
                    //treeView.Header = childFileInfos.fileName;
                }

                treeViewItem.Items.Add(newItem);
            }
            else
            {
                treeViewItem.Items.Add(newItem);
            }

            return(treeViewItem);
        }
コード例 #4
0
        private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e)
        {
            TreeViewItem selectedItem = (TreeViewItem)TreeView.SelectedItem;
            var          ddd          = selectedItem.Header;

            try
            {
                GeneralFileInfo tag = (GeneralFileInfo)selectedItem.Tag;

                if (tag != null)
                {
                    fileNumberInput.Text = tag.fileNo.ToString();
                    fileNameInput.Text   = tag.fileName;
                    headerInput.Text     = tag.header;

                    FHMEnumSelect.SelectedIndex = tag.FHMAssetLoadEnum;

                    if (tag.isLinked)
                    {
                        isLinkedFile.IsChecked = true;
                        linkedtoFile.IsEnabled = true;
                        //linkedtoFile.Text = tag.linkedFileName;
                    }
                    else
                    {
                        isLinkedFile.IsChecked = false;
                        linkedtoFile.IsEnabled = false;
                    }
                }
            }
            catch
            {
                NTP3FileInfo tag = (NTP3FileInfo)selectedItem.Tag;

                GeneralFileInfo parentTag = (GeneralFileInfo)(GetSelectedTreeViewItemParent(selectedItem) as TreeViewItem).Tag;

                if (parentTag != null)
                {
                    fileNumberInput.Text = parentTag.fileNo.ToString();
                    fileNameInput.Text   = parentTag.fileName;
                    headerInput.Text     = parentTag.header;

                    FHMEnumSelect.SelectedIndex = parentTag.FHMAssetLoadEnum;

                    if (parentTag.isLinked)
                    {
                        isLinkedFile.IsChecked = true;
                        linkedtoFile.IsEnabled = true;
                        //linkedtoFile.Text = tag.linkedFileName;
                    }
                    else
                    {
                        isLinkedFile.IsChecked = false;
                        linkedtoFile.IsEnabled = false;
                    }
                }
            }
        }
コード例 #5
0
ファイル: RepackPAC.cs プロジェクト: descatal/FBRepacker
        private void parseFHMFileInfoReferences(GeneralFileInfo fileInfo)
        {
            int FHMFileNumber = fileInfo.FHMFileNumber;

            if (FHMFileNumber != 0)
            {
                if (!parsedFileInfo.ContainsKey(FHMFileNumber))
                {
                    throw new Exception("Cannot find corresponding FHMFileNumber of: " + FHMFileNumber + " in parsedFileInfo!");
                }

                string FHMFileName = parsedFileInfo[FHMFileNumber].fileName;
                fileInfo.FHMFileName = FHMFileName;
            }

            if (fileInfo.header == "fhm")
            {
                List <int> filePointers = new List <int>();
                //List<GeneralFileInfo> allChildFileInfos =;

                List <int> allChildFileInfoIndexes = parsedFileInfo.Where(s => s.Value.FHMFileNumber == fileInfo.fileNo).Select(x => x.Key).ToList();

                if (fileInfo.numberofFiles != allChildFileInfoIndexes.Count)
                {
                    throw new Exception("number of child files in FHM dosen't match with the total FHM file number!");
                }

                if (fileInfo.numberofFiles != 0)
                {
                    for (int i = 0; i < allChildFileInfoIndexes.Count(); i++)
                    {
                        var childFileInfos = parsedFileInfo[allChildFileInfoIndexes[i]];

                        if (childFileInfos.isLinked)
                        {
                            int linkedFileNo = childFileInfos.linkedFileNo - 1;

                            if (allChildFileInfoIndexes.Count() < linkedFileNo)
                            {
                                throw new Exception("linkedFileNo exceed index of allChildFiles in index!");
                            }

                            string linkedFileName = parsedFileInfo[allChildFileInfoIndexes[linkedFileNo]].fileName;
                            parsedFileInfo[allChildFileInfoIndexes[i]].linkedFileName = linkedFileName;
                        }

                        parseFHMFileInfoReferences(childFileInfos);
                    }
                }
            }
        }
コード例 #6
0
ファイル: RepackPAC.cs プロジェクト: descatal/FBRepacker
        private void parseFHMInfo(int fileNumber, bool isRootFHM)
        {
            // For the .fhm File
            int fileNumberinFHM = 1;

            string[] FHMinfos = fileInfoDic[fileNumber];
            //FHMFileInfo fhmFileInfo = new FHMFileInfo();
            //FHMFileInfoDic[fileNumber] = fhmFileInfo;

            GeneralFileInfo fhmFile = new GeneralFileInfo();

            if (parsedFileInfo.ContainsKey(fileNumber))
            {
                fhmFile = parsedFileInfo[fileNumber];
            }

            // parse and get info of FHM from PAC.info
            //fhmFileInfo.totalFileSize = convertStringtoInt(getSpecificFileInfoProperties("Total file size: ", FHMinfos));
            //fhmFileInfo.numberofFiles = convertStringtoInt(getSpecificFileInfoProperties("Number of files: ", FHMinfos));
            //fhmFileInfo.FHMChunkSize = convertStringtoInt(getSpecificFileInfoProperties("FHM chunk size: ", FHMinfos));
            //fhmFileInfo.additionalInfoFlag = (additionalInfo)convertStringtoInt(getSpecificFileInfoProperties("Additional info flag: ", FHMinfos));

            fhmFile.totalFileSize      = convertStringtoInt(getSpecificFileInfoProperties("Total file size: ", FHMinfos));
            fhmFile.numberofFiles      = convertStringtoInt(getSpecificFileInfoProperties("Number of files: ", FHMinfos));
            fhmFile.FHMChunkSize       = convertStringtoInt(getSpecificFileInfoProperties("FHM chunk size: ", FHMinfos));
            fhmFile.additionalInfoFlag = (additionalInfo)convertStringtoInt(getSpecificFileInfoProperties("Additional info flag: ", FHMinfos));
            fhmFile.fileName           = getSpecificFileInfoProperties("fileName: ", FHMinfos);
            fhmFile.fileNo             = fileNumber;
            fhmFile.header             = "fhm";

            parsedFileInfo[fileNumber] = fhmFile;

            for (int i = 1; i <= fhmFile.numberofFiles; i++)
            {
                // For the rest of the files in the FHM tag in PAC.info
                fileNumberinInfoFile++;
                string[] newFileInfos = fileInfoDic[fileNumberinInfoFile];
                parseGeneralFileInfo(newFileInfos, fileNumberinInfoFile, fileNumberinFHM, fhmFile.additionalInfoFlag);
                fileNumberinFHM++;
            }

            // For endfile
            if (isRootFHM)
            {
                fileNumberinInfoFile++;
                string[] endFileInfos = fileInfoDic[fileNumberinInfoFile];
                parseGeneralFileInfo(endFileInfos, fileNumberinInfoFile, fileNumberinFHM, fhmFile.additionalInfoFlag);
            }
        }
コード例 #7
0
        internal ModelImportStatus DoSurveyImport(string SelectedFile, string SelectedFormatFile, ImportDataMap importMap, RawFileReader rawFileReader, Guid NKDProjectID, bool doOverwrite, bool checkForDuplicates)
        {
            BaseImportTools   bit = new BaseImportTools();
            ModelImportStatus mos = new ModelImportStatus();

            GeneralFileInfo gfi = new GeneralFileInfo();

            gfi.GeneralFileStats(SelectedFile);
            int numLines = gfi.numLines;

            Stream fileStream = new FileStream(SelectedFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            //Stream fileStream = new FileStream(SelectedFile, FileMode.Open);
            bit.PerformSurveyImport(mos, fileStream, null, importMap, this.backgroundWorker, NKDProjectID, ConnectionString, numLines, doOverwrite, checkForDuplicates);
            return(mos);
        }
コード例 #8
0
ファイル: RepackPAC.cs プロジェクト: descatal/FBRepacker
        private byte[] repackFHMFiles(GeneralFileInfo fileInfo, out int beforeAppendSize)
        {
            int fileNumber = fileInfo.fileNo;

            beforeAppendSize = 0;

            if (fileInfo.header == "fhm")
            {
                MemoryStream  FHMStream      = new MemoryStream();
                List <int>    filePointers   = new List <int>();
                List <int>    fileSizes      = new List <int>();
                List <int>    assetLoadEnums = new List <int>();
                List <byte[]> filesByteArray = new List <byte[]>();

                appendUIntMemoryStream(FHMStream, 0x46484D20, true);            // FHM Magic
                appendUIntMemoryStream(FHMStream, 0x01010010, true);            // Unknown Flag, constant
                appendZeroMemoryStream(FHMStream, 4);
                appendIntMemoryStream(FHMStream, fileInfo.totalFileSize, true); // Supposed to be the FHM size, but very weird, so we reuse it for identification purposes (system does not read these)

                appendIntMemoryStream(FHMStream, fileInfo.numberofFiles, true);

                List <GeneralFileInfo> allChildFileInfos = parsedFileInfo.Values.Where(s => s.FHMFileNumber == fileNumber).ToList();

                if (fileInfo.numberofFiles != allChildFileInfos.Count)
                {
                    throw new Exception("number of child files in FHM dosen't match with the total FHM file number!");
                }

                if (fileInfo.numberofFiles != 0)
                {
                    // Calculate the FHM Chunk Size based on the number of files
                    // each child files has 4 4 byte info, pointer, size, assetLoadEnum and unkEnum.
                    int FHMChunkSize = addPaddingSizeCalculation((allChildFileInfos.Count * 0x04) * 4 + (int)FHMStream.Length);

                    // The first pointer is the end of FHM, or the FHMChunkSize.
                    filePointers.Add(FHMChunkSize);

                    foreach (var childFileInfos in allChildFileInfos)
                    {
                        if (!childFileInfos.isLinked)
                        {
                            byte[] tempByteArray = repackFHMFiles(childFileInfos, out beforeAppendSize);
                            filePointers.Add(tempByteArray.Length + filePointers.Last());
                            fileSizes.Add(beforeAppendSize);
                            assetLoadEnums.Add(childFileInfos.FHMAssetLoadEnum);
                            filesByteArray.Add(tempByteArray);
                        }
                        else
                        {
                            int    linkedFileNo  = allChildFileInfos.IndexOf(allChildFileInfos.FirstOrDefault(s => s.fileName == childFileInfos.linkedFileName));
                            byte[] tempByteArray = new byte[0];

                            // Assuming the same pointer has already been added, since we sort the pointers when repacking.
                            if (filePointers.Count() < linkedFileNo)
                            {
                                throw new Exception("Cannot find file number: " + linkedFileNo + " in filePointers!");
                            }

                            filePointers.Insert(filePointers.Count() - 2, filePointers[linkedFileNo]);
                            fileSizes.Insert(fileSizes.Count() - 1, fileSizes[linkedFileNo]);

                            //fileSizes.Add(fileSizes[linkedFileNo - 1]);
                            assetLoadEnums.Insert(assetLoadEnums.Count() - 1, assetLoadEnums[linkedFileNo]);
                            filesByteArray.Add(tempByteArray);
                        }
                    }

                    for (int i = 0; i < allChildFileInfos.Count; i++)
                    {
                        appendIntMemoryStream(FHMStream, filePointers[i], true);
                    }

                    for (int i = 0; i < allChildFileInfos.Count; i++)
                    {
                        appendIntMemoryStream(FHMStream, fileSizes[i], true);
                    }

                    for (int i = 0; i < allChildFileInfos.Count; i++)
                    {
                        appendIntMemoryStream(FHMStream, assetLoadEnums[i], true);
                    }

                    for (int i = 0; i < allChildFileInfos.Count; i++)
                    {
                        appendZeroMemoryStream(FHMStream, 0x04);
                    }

                    addPaddingStream(FHMStream);

                    for (int i = 0; i < allChildFileInfos.Count; i++)
                    {
                        FHMStream.Write(filesByteArray[i], 0, filesByteArray[i].Length);
                    }
                }

                beforeAppendSize = (int)FHMStream.Length; // FHM file size is unused, so no matter if they are appended or not.

                return(FHMStream.ToArray());
            }
            else
            {
                bool ifFileExist = realFileInfos.Any(s => s.Name == fileInfo.fileName);

                if (!ifFileExist)
                {
                    throw new Exception("Cannot find file " + fileInfo.fileName);
                }

                FileInfo file = realFileInfos.FirstOrDefault(s => s.Name == fileInfo.fileName);

                switch (fileInfo.header)
                {
                case "NTP3":
                    byte[] NTP3Buffer = repackNTP3.repackDDStoNTP3(file, fileNumber);
                    beforeAppendSize = NTP3Buffer.Length;
                    NTP3Buffer       = addPaddingArrayBuffer(NTP3Buffer);
                    return(NTP3Buffer);

                case "EIDX":
                    byte[] EIDXBuffer = repackEIDX.repackEIDX();
                    beforeAppendSize = EIDXBuffer.Length;
                    EIDXBuffer       = addPaddingArrayBuffer(EIDXBuffer);
                    return(EIDXBuffer);

                case "STREAM":
                    byte[] STREAMBuffer = repackSTREAM.repackSTREAM(file);
                    beforeAppendSize = STREAMBuffer.Length;
                    STREAMBuffer     = addPaddingArrayBuffer(STREAMBuffer);
                    return(STREAMBuffer);

                default:
                    FileStream fileOpen      = file.OpenRead();
                    byte[]     generalBuffer = new byte[fileOpen.Length];
                    fileOpen.Read(generalBuffer, 0, generalBuffer.Length);
                    beforeAppendSize = generalBuffer.Length;
                    generalBuffer    = addPaddingArrayBuffer(generalBuffer);
                    fileOpen.Close();
                    return(generalBuffer);
                }
            }
        }
コード例 #9
0
ファイル: RepackPAC.cs プロジェクト: descatal/FBRepacker
        private void parseGeneralFileInfo(string[] newFileInfos, int fileNo, int fileNoinFHM, additionalInfo additionalInfoFlag)
        {
            //GeneralFileInfo generalFileInfo = new GeneralFileInfo();

            string header = getSpecificFileInfoProperties("Header: ", newFileInfos);

            GeneralFileInfo fhmFile = new GeneralFileInfo();

            if (header != "endfile")
            {
                // parse and get infos from PAC.info
                // we should link up duplicate infos, but this will suffice for now
                int    FHMOffset    = convertStringtoInt(getSpecificFileInfoProperties("FHMOffset: ", newFileInfos, false));
                int    fileSize     = convertStringtoInt(getSpecificFileInfoProperties("Size: ", newFileInfos, false));
                int    FHMassetEnum = convertStringtoInt(getSpecificFileInfoProperties("FHMAssetLoadEnum: ", newFileInfos));
                int    FHMunkEnum   = convertStringtoInt(getSpecificFileInfoProperties("FHMunkEnum: ", newFileInfos));
                int    FHMFileNo    = convertStringtoInt(getSpecificFileInfoProperties("FHMFileNo: ", newFileInfos));
                string fileName     = getSpecificFileInfoProperties("fileName: ", newFileInfos);

                // parse and get infos from PAC.info
                //generalFileInfo.FHMOffset = FHMOffset;
                //generalFileInfo.fileSize = fileSize;
                //generalFileInfo.header = header;
                //generalFileInfo.fileNo = fileNumber;
                //generalFileInfo.fileNoinFHM = fileNoinFHM;

                fhmFile.FHMOffset = FHMOffset;
                fhmFile.fileSize  = fileSize;
                fhmFile.header    = header;
                fhmFile.fileNo    = fileNo;
                //fhmFile.fileNoinFHM = fileNoinFHM;
                fhmFile.FHMAssetLoadEnum = FHMassetEnum;
                fhmFile.FHMunkEnum       = FHMunkEnum;
                fhmFile.FHMFileNumber    = FHMFileNo;
                fhmFile.fileName         = fileName;

                if (checkLinked(newFileInfos))
                {
                    //generalFileInfo.isLinked = true;
                    //generalFileInfo.linkFileNumber = convertStringtoInt(getSpecificFileInfoProperties("LinkFHMOffset: ", newFileInfos));
                    fhmFile.isLinked     = true;
                    fhmFile.linkedFileNo = convertStringtoInt(getSpecificFileInfoProperties("LinkedFileNo_in_FHM: ", newFileInfos));
                }

                parsedFileInfo[fileNo] = fhmFile;

                switch (fhmFile.header)//generalFileInfo.header
                {
                case "fhm":
                    parseFHMInfo(fileNo, false);
                    break;

                case "NTP3":
                    // TODO: should check if the fileNumber has been parsed before instead of checking linked. Hopefully there's no linked non-multi NTP3.
                    if (!fhmFile.isLinked)    //!generalFileInfo.isLinked
                    {
                        // Pre Base64 code, TODO: Remove
                        // StreamReader NTP3Info = repackNTP3.getNTP3InfoStreamReader(newFileInfos);
                        repackNTP3.parseNTP3Info(newFileInfos, fileNo);
                    }
                    break;

                case "EIDX":
                    repackEIDX.parseEIDXMetadata(newFileInfos);
                    break;

                case "STREAM":
                    repackSTREAM.parseSTREAMMetadata(newFileInfos);
                    break;

                default:
                    break;
                }

                if (fhmFile.header != "fhm") // generalFileInfo.header != "fhm"
                {
                    //GeneralFileInfoDic[fileNo] = fhmFile; //generalFileInfo
                    //parsedFileInfo[fileNumber] = fhmFile;
                }

                parseAdditionalInfo(additionalInfoFlag, newFileInfos, fileNo, header);
            }
            else
            {
                // TODO: Check offset and Size with repacked file
                int    EndFileOffset = convertStringtoInt(getSpecificFileInfoProperties("End File Offset: ", newFileInfos));
                int    EndFileSize   = convertStringtoInt(getSpecificFileInfoProperties("End File Size: ", newFileInfos));
                string fileName      = getSpecificFileInfoProperties("fileName: ", newFileInfos);

                // parse and get infos from PAC.info
                //generalFileInfo.FHMOffset = EndFileOffset;
                //generalFileInfo.fileSize = EndFileSize;
                //generalFileInfo.header = header;
                //generalFileInfo.fileNo = fileNumber;

                fhmFile.FHMOffset = EndFileOffset;
                fhmFile.fileSize  = EndFileSize;
                fhmFile.header    = header;
                fhmFile.fileNo    = fileNo;
                //fhmFile.fileNoinFHM = fileNoinFHM;
                fhmFile.fileName = fileName;

                //GeneralFileInfoDic[fileNo] = fhmFile; //generalFileInfo;
                parsedFileInfo[fileNo] = fhmFile;
            }
        }
コード例 #10
0
        private TreeViewItem getTreeView(GeneralFileInfo fileInfo)
        {
            TreeViewItem item = new TreeViewItem();

            item.IsExpanded = true;

            // create stack panel
            StackPanel stack = new StackPanel();

            stack.Orientation = Orientation.Horizontal;

            // Label
            Label lbl = new Label();

            lbl.Content = fileInfo.fileNo.ToString("000") + " - " + fileInfo.fileName;
            //stack.Children.Add(border);

            if (fileInfo.header == "NTP3" && !fileInfo.isLinked)
            {
                if (!repackInstance.repackNTP3.NTP3FileInfoDic.ContainsKey(fileInfo.fileNo))
                {
                    throw new Exception("Cannot find fileNumber: " + fileInfo.fileNo + " in NTP3FileInfoDic!");
                }

                lbl.Content = fileInfo.fileNo.ToString("000") + "-NTP3";

                var NTP3FileInfo = repackInstance.repackNTP3.NTP3FileInfoDic[fileInfo.fileNo];

                foreach (var NTP3File in NTP3FileInfo)
                {
                    TreeViewItem itemDDS = new TreeViewItem();
                    itemDDS.IsExpanded = true;

                    // create stack panel
                    StackPanel stackDDS = new StackPanel();
                    stackDDS.Orientation = Orientation.Horizontal;

                    // Label
                    Label lblDDS = new Label();
                    lblDDS.Content = NTP3File.fileName;

                    stackDDS.Children.Add(lblDDS);
                    itemDDS.Header = stackDDS;
                    itemDDS.Tag    = NTP3File;

                    item.Items.Add(itemDDS);
                }
            }

            if (fileInfo.header == "STREAM")
            {
                lbl.Content = fileInfo.fileNo.ToString("000") + "-STREAM";

                var STREAMFileInfoList = repackInstance.repackSTREAM.streamFileInfoList;

                foreach (var audioFile in STREAMFileInfoList)
                {
                    TreeViewItem itemAudio = new TreeViewItem();
                    itemAudio.IsExpanded = true;

                    // create stack panel
                    StackPanel stackAudio = new StackPanel();
                    stackAudio.Orientation = Orientation.Horizontal;

                    // Label
                    Label lblDDS = new Label();
                    lblDDS.Content = audioFile.file_Name;

                    stackAudio.Children.Add(lblDDS);
                    itemAudio.Header = stackAudio;
                    //itemAudio.Tag = audioFile;

                    item.Items.Add(itemAudio);
                }
            }

            /*// create Image
             * Border border = new Border();
             * border.Width = 8;
             * border.Height = 12;
             */

            stack.Children.Add(lbl);

            //item.HeaderTemplate.ad
            item.Header = stack;
            item.Tag    = fileInfo;
            return(item);
        }