libKonogonka/src/main/java/libKonogonka/Tools/RomFs/RomFsDecryptedProvider.java

77 lines
3.1 KiB
Java
Raw Normal View History

2022-08-10 15:55:50 +03:00
/*
2022-08-10 20:20:10 +03:00
* Copyright 2019-2022 Dmitry Isaenko
2022-08-10 15:55:50 +03:00
*
2022-08-10 20:20:10 +03:00
* This file is part of libKonogonka.
2022-08-10 15:55:50 +03:00
*
2022-08-10 20:20:10 +03:00
* libKonogonka is free software: you can redistribute it and/or modify
2022-08-10 15:55:50 +03:00
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
2022-08-10 20:20:10 +03:00
* libKonogonka is distributed in the hope that it will be useful,
2022-08-10 15:55:50 +03:00
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
2022-08-10 20:20:10 +03:00
* along with libKonogonka. If not, see <https://www.gnu.org/licenses/>.
2022-08-10 15:55:50 +03:00
*/
package libKonogonka.Tools.RomFs;
2022-09-05 00:39:48 +03:00
import libKonogonka.Tools.RomFs.view.DirectoryMetaTablePlainView;
import libKonogonka.Tools.RomFs.view.FileMetaTablePlainView;
2022-08-10 15:55:50 +03:00
import java.io.*;
public class RomFsDecryptedProvider implements IRomFsProvider{
2022-09-05 00:39:48 +03:00
private final File file;
private final long level6Offset;
private final Level6Header level6Header;
private final FileSystemEntry rootEntry;
// Used only for debug
private final byte[] directoryMetadataTable;
private final byte[] fileMetadataTable;
public RomFsDecryptedProvider(File decryptedFsImageFile, long level6offset) throws Exception{
RomFsDecryptedConstruct construct = new RomFsDecryptedConstruct(decryptedFsImageFile, level6offset);
2022-08-10 15:55:50 +03:00
this.file = decryptedFsImageFile;
2022-09-05 00:39:48 +03:00
this.level6Offset = level6offset;
this.level6Header = construct.getHeader();
this.rootEntry = construct.getRootEntry();
2022-08-10 15:55:50 +03:00
2022-09-05 00:39:48 +03:00
this.directoryMetadataTable = construct.getDirectoryMetadataTable();
this.fileMetadataTable = construct.getFileMetadataTable();
2022-08-10 15:55:50 +03:00
}
2022-09-05 00:39:48 +03:00
@Override
public File getFile() { return file; }
2022-08-10 15:55:50 +03:00
@Override
public long getLevel6Offset() { return level6Offset; }
@Override
2022-09-05 00:39:48 +03:00
public Level6Header getHeader() { return level6Header; }
2022-08-10 15:55:50 +03:00
@Override
public FileSystemEntry getRootEntry() { return rootEntry; }
@Override
public PipedInputStream getContent(FileSystemEntry entry) throws Exception{
if (entry.isDirectory())
2022-09-05 00:39:48 +03:00
throw new Exception("Request of the binary stream for the folder entry is not supported (and doesn't make sense).");
2022-08-10 15:55:50 +03:00
PipedOutputStream streamOut = new PipedOutputStream();
PipedInputStream streamIn = new PipedInputStream(streamOut);
2022-09-05 00:39:48 +03:00
long internalFileRealPosition = level6Offset + level6Header.getFileDataOffset() + entry.getFileOffset();
long internalFileSize = entry.getFileSize();
2022-08-10 15:55:50 +03:00
2022-09-05 00:39:48 +03:00
Thread contentRetrievingThread = new Thread(
new RomFsDecryptedContentRetrieve(file, streamOut, internalFileRealPosition, internalFileSize));
contentRetrievingThread.start();
2022-08-10 15:55:50 +03:00
return streamIn;
}
@Override
2022-09-05 00:39:48 +03:00
public void printDebug(){
level6Header.printDebugInfo();
new DirectoryMetaTablePlainView(level6Header.getDirectoryMetadataTableLength(), directoryMetadataTable);
new FileMetaTablePlainView(level6Header.getFileMetadataTableLength(), fileMetadataTable);
2022-08-10 15:55:50 +03:00
rootEntry.printTreeForDebug();
}
}