mirror of
https://github.com/claunia/romrepomgr.git
synced 2025-12-16 19:24:51 +00:00
Implement exporting disks.
This commit is contained in:
12
RomRepoMgr.Core/Resources/Localization.Designer.cs
generated
12
RomRepoMgr.Core/Resources/Localization.Designer.cs
generated
@@ -356,5 +356,17 @@ namespace RomRepoMgr.Core.Resources {
|
|||||||
return ResourceManager.GetString("NoChecksumsFound", resourceCulture);
|
return ResourceManager.GetString("NoChecksumsFound", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static string Copying {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Copying", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string CopyingFile {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("CopyingFile", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -167,4 +167,10 @@
|
|||||||
<data name="NotAChdFile" xml:space="preserve">
|
<data name="NotAChdFile" xml:space="preserve">
|
||||||
<value>No es un CHD.</value>
|
<value>No es un CHD.</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Copying" xml:space="preserve">
|
||||||
|
<value>Copiando {0}...</value>
|
||||||
|
</data>
|
||||||
|
<data name="CopyingFile" xml:space="preserve">
|
||||||
|
<value>Copiando archivo...</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -172,4 +172,10 @@
|
|||||||
<data name="NoChecksumsFound" xml:space="preserve">
|
<data name="NoChecksumsFound" xml:space="preserve">
|
||||||
<value>No checksums found.</value>
|
<value>No checksums found.</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Copying" xml:space="preserve">
|
||||||
|
<value>Copying {0}...</value>
|
||||||
|
</data>
|
||||||
|
<data name="CopyingFile" xml:space="preserve">
|
||||||
|
<value>Copying file...</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -17,6 +17,7 @@ namespace RomRepoMgr.Core.Workers
|
|||||||
{
|
{
|
||||||
public class FileExporter
|
public class FileExporter
|
||||||
{
|
{
|
||||||
|
const long BUFFER_SIZE = 131072;
|
||||||
readonly string _outPath;
|
readonly string _outPath;
|
||||||
readonly long _romSetId;
|
readonly long _romSetId;
|
||||||
long _filePosition;
|
long _filePosition;
|
||||||
@@ -106,6 +107,172 @@ namespace RomRepoMgr.Core.Workers
|
|||||||
Message = machine.Name
|
Message = machine.Name
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Dictionary<string, DiskByMachine> disksByMachine = Context.Singleton.DisksByMachines.
|
||||||
|
Where(f => f.Machine.Id == machine.Id &&
|
||||||
|
f.Disk.IsInRepo).
|
||||||
|
ToDictionary(f => f.Name);
|
||||||
|
|
||||||
|
string machineName = machine.Name;
|
||||||
|
|
||||||
|
if(disksByMachine.Count > 0)
|
||||||
|
{
|
||||||
|
SetProgress2Bounds?.Invoke(this, new ProgressBoundsEventArgs
|
||||||
|
{
|
||||||
|
Minimum = 0,
|
||||||
|
Maximum = disksByMachine.Count
|
||||||
|
});
|
||||||
|
|
||||||
|
if(machineName.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
machineName = machineName.Substring(0, machineName.Length - 4);
|
||||||
|
|
||||||
|
string machinePath = Path.Combine(_outPath, machineName);
|
||||||
|
|
||||||
|
if(!Directory.Exists(machinePath))
|
||||||
|
Directory.CreateDirectory(machinePath);
|
||||||
|
|
||||||
|
long diskPosition = 0;
|
||||||
|
|
||||||
|
foreach(KeyValuePair<string, DiskByMachine> diskByMachine in disksByMachine)
|
||||||
|
{
|
||||||
|
string outputPath = Path.Combine(machinePath, diskByMachine.Key);
|
||||||
|
|
||||||
|
if(!outputPath.EndsWith(".chd", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
outputPath += ".chd";
|
||||||
|
|
||||||
|
SetProgress2?.Invoke(this, new ProgressEventArgs
|
||||||
|
{
|
||||||
|
Value = diskPosition
|
||||||
|
});
|
||||||
|
|
||||||
|
string repoPath = null;
|
||||||
|
string md5Path = null;
|
||||||
|
string sha1Path = null;
|
||||||
|
|
||||||
|
DbDisk disk = diskByMachine.Value.Disk;
|
||||||
|
|
||||||
|
if(disk.Sha1 != null)
|
||||||
|
{
|
||||||
|
byte[] sha1Bytes = new byte[20];
|
||||||
|
string sha1 = disk.Sha1;
|
||||||
|
|
||||||
|
for(int i = 0; i < 20; i++)
|
||||||
|
{
|
||||||
|
if(sha1[i * 2] >= 0x30 &&
|
||||||
|
sha1[i * 2] <= 0x39)
|
||||||
|
sha1Bytes[i] = (byte)((sha1[i * 2] - 0x30) * 0x10);
|
||||||
|
else if(sha1[i * 2] >= 0x41 &&
|
||||||
|
sha1[i * 2] <= 0x46)
|
||||||
|
sha1Bytes[i] = (byte)((sha1[i * 2] - 0x37) * 0x10);
|
||||||
|
else if(sha1[i * 2] >= 0x61 &&
|
||||||
|
sha1[i * 2] <= 0x66)
|
||||||
|
sha1Bytes[i] = (byte)((sha1[i * 2] - 0x57) * 0x10);
|
||||||
|
|
||||||
|
if(sha1[(i * 2) + 1] >= 0x30 &&
|
||||||
|
sha1[(i * 2) + 1] <= 0x39)
|
||||||
|
sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x30);
|
||||||
|
else if(sha1[(i * 2) + 1] >= 0x41 &&
|
||||||
|
sha1[(i * 2) + 1] <= 0x46)
|
||||||
|
sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x37);
|
||||||
|
else if(sha1[(i * 2) + 1] >= 0x61 &&
|
||||||
|
sha1[(i * 2) + 1] <= 0x66)
|
||||||
|
sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x57);
|
||||||
|
}
|
||||||
|
|
||||||
|
string sha1B32 = Base32.ToBase32String(sha1Bytes);
|
||||||
|
|
||||||
|
sha1Path = Path.Combine(Settings.Settings.Current.RepositoryPath, "chd", "sha1",
|
||||||
|
sha1B32[0].ToString(), sha1B32[1].ToString(), sha1B32[2].ToString(),
|
||||||
|
sha1B32[3].ToString(), sha1B32[4].ToString(), sha1B32 + ".chd");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(disk.Md5 != null)
|
||||||
|
{
|
||||||
|
byte[] md5Bytes = new byte[16];
|
||||||
|
string md5 = disk.Md5;
|
||||||
|
|
||||||
|
for(int i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
if(md5[i * 2] >= 0x30 &&
|
||||||
|
md5[i * 2] <= 0x39)
|
||||||
|
md5Bytes[i] = (byte)((md5[i * 2] - 0x30) * 0x10);
|
||||||
|
else if(md5[i * 2] >= 0x41 &&
|
||||||
|
md5[i * 2] <= 0x46)
|
||||||
|
md5Bytes[i] = (byte)((md5[i * 2] - 0x37) * 0x10);
|
||||||
|
else if(md5[i * 2] >= 0x61 &&
|
||||||
|
md5[i * 2] <= 0x66)
|
||||||
|
md5Bytes[i] = (byte)((md5[i * 2] - 0x57) * 0x10);
|
||||||
|
|
||||||
|
if(md5[(i * 2) + 1] >= 0x30 &&
|
||||||
|
md5[(i * 2) + 1] <= 0x39)
|
||||||
|
md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x30);
|
||||||
|
else if(md5[(i * 2) + 1] >= 0x41 &&
|
||||||
|
md5[(i * 2) + 1] <= 0x46)
|
||||||
|
md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x37);
|
||||||
|
else if(md5[(i * 2) + 1] >= 0x61 &&
|
||||||
|
md5[(i * 2) + 1] <= 0x66)
|
||||||
|
md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x57);
|
||||||
|
}
|
||||||
|
|
||||||
|
string md5B32 = Base32.ToBase32String(md5Bytes);
|
||||||
|
|
||||||
|
md5Path = Path.Combine(Settings.Settings.Current.RepositoryPath, "chd", "md5",
|
||||||
|
md5B32[0].ToString(), md5B32[1].ToString(), md5B32[2].ToString(),
|
||||||
|
md5B32[3].ToString(), md5B32[4].ToString(), md5B32 + ".chd");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(File.Exists(sha1Path))
|
||||||
|
repoPath = sha1Path;
|
||||||
|
else if(File.Exists(md5Path))
|
||||||
|
repoPath = md5Path;
|
||||||
|
|
||||||
|
if(repoPath == null)
|
||||||
|
throw new ArgumentException(string.Format(Localization.CannotFindHashInRepository,
|
||||||
|
disk.Sha1 ?? disk.Md5));
|
||||||
|
|
||||||
|
var inFs = new FileStream(repoPath, FileMode.Open, FileAccess.Read);
|
||||||
|
var outFs = new FileStream(outputPath, FileMode.Create, FileAccess.Write);
|
||||||
|
|
||||||
|
SetMessage3?.Invoke(this, new MessageEventArgs
|
||||||
|
{
|
||||||
|
Message = string.Format(Localization.Copying, Path.GetFileName(outputPath))
|
||||||
|
});
|
||||||
|
|
||||||
|
SetProgress3Bounds?.Invoke(this, new ProgressBoundsEventArgs
|
||||||
|
{
|
||||||
|
Minimum = 0,
|
||||||
|
Maximum = inFs.Length
|
||||||
|
});
|
||||||
|
|
||||||
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
|
|
||||||
|
while(inFs.Position + BUFFER_SIZE <= inFs.Length)
|
||||||
|
{
|
||||||
|
SetProgress3?.Invoke(this, new ProgressEventArgs
|
||||||
|
{
|
||||||
|
Value = inFs.Position
|
||||||
|
});
|
||||||
|
|
||||||
|
inFs.Read(buffer, 0, buffer.Length);
|
||||||
|
outFs.Write(buffer, 0, buffer.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = new byte[inFs.Length - inFs.Position];
|
||||||
|
|
||||||
|
SetProgress3?.Invoke(this, new ProgressEventArgs
|
||||||
|
{
|
||||||
|
Value = inFs.Position
|
||||||
|
});
|
||||||
|
|
||||||
|
inFs.Read(buffer, 0, buffer.Length);
|
||||||
|
outFs.Write(buffer, 0, buffer.Length);
|
||||||
|
|
||||||
|
inFs.Close();
|
||||||
|
outFs.Close();
|
||||||
|
|
||||||
|
diskPosition++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_filesByMachine = Context.Singleton.FilesByMachines.
|
_filesByMachine = Context.Singleton.FilesByMachines.
|
||||||
Where(f => f.Machine.Id == machine.Id && f.File.IsInRepo).
|
Where(f => f.Machine.Id == machine.Id && f.File.IsInRepo).
|
||||||
ToDictionary(f => f.Name);
|
ToDictionary(f => f.Name);
|
||||||
@@ -124,8 +291,6 @@ namespace RomRepoMgr.Core.Workers
|
|||||||
Maximum = _filesByMachine.Count
|
Maximum = _filesByMachine.Count
|
||||||
});
|
});
|
||||||
|
|
||||||
string machineName = machine.Name;
|
|
||||||
|
|
||||||
if(!machineName.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
|
if(!machineName.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
|
||||||
machineName += ".zip";
|
machineName += ".zip";
|
||||||
|
|
||||||
|
|||||||
@@ -563,8 +563,8 @@ namespace RomRepoMgr.Core.Workers
|
|||||||
int nibble1 = chd.SHA1[i] >> 4;
|
int nibble1 = chd.SHA1[i] >> 4;
|
||||||
int nibble2 = chd.SHA1[i] & 0xF;
|
int nibble2 = chd.SHA1[i] & 0xF;
|
||||||
|
|
||||||
nibble1 += nibble1 >= 0xA ? 0x37 : 0x30;
|
nibble1 += nibble1 >= 0xA ? 0x57 : 0x30;
|
||||||
nibble2 += nibble2 >= 0xA ? 0x37 : 0x30;
|
nibble2 += nibble2 >= 0xA ? 0x57 : 0x30;
|
||||||
|
|
||||||
chdArray[i * 2] = (char)nibble1;
|
chdArray[i * 2] = (char)nibble1;
|
||||||
chdArray[(i * 2) + 1] = (char)nibble2;
|
chdArray[(i * 2) + 1] = (char)nibble2;
|
||||||
@@ -642,12 +642,16 @@ namespace RomRepoMgr.Core.Workers
|
|||||||
dbDisk.UpdatedOn = DateTime.UtcNow;
|
dbDisk.UpdatedOn = DateTime.UtcNow;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dbDisk.Size == null ||
|
if(dbDisk.Size > uSize)
|
||||||
dbDisk.Size > uSize)
|
{
|
||||||
|
knownDiskWasBigger = true;
|
||||||
|
dbDisk.Size = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dbDisk.Size == null)
|
||||||
{
|
{
|
||||||
dbDisk.Size = uSize;
|
dbDisk.Size = uSize;
|
||||||
dbDisk.UpdatedOn = DateTime.UtcNow;
|
dbDisk.UpdatedOn = DateTime.UtcNow;
|
||||||
knownDiskWasBigger = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string md5Path = null;
|
string md5Path = null;
|
||||||
@@ -720,7 +724,7 @@ namespace RomRepoMgr.Core.Workers
|
|||||||
|
|
||||||
SetMessage2?.Invoke(this, new MessageEventArgs
|
SetMessage2?.Invoke(this, new MessageEventArgs
|
||||||
{
|
{
|
||||||
Message = Localization.CompressingFile
|
Message = Localization.CopyingFile
|
||||||
});
|
});
|
||||||
|
|
||||||
byte[] buffer = new byte[BUFFER_SIZE];
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
@@ -765,7 +769,7 @@ namespace RomRepoMgr.Core.Workers
|
|||||||
if(_deleteAfterImport)
|
if(_deleteAfterImport)
|
||||||
File.Delete(path);
|
File.Delete(path);
|
||||||
|
|
||||||
if(!knownDiskWasBigger)
|
if(knownDiskWasBigger)
|
||||||
File.Delete(repoPath + ".bak");
|
File.Delete(repoPath + ".bak");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user