diff --git a/Source/CLI/CommandLine_Parser.cpp b/Source/CLI/CommandLine_Parser.cpp index bd472bba..223d733f 100644 --- a/Source/CLI/CommandLine_Parser.cpp +++ b/Source/CLI/CommandLine_Parser.cpp @@ -776,7 +776,6 @@ CL_OPTION(MD5_Generate) //--------------------------------------------------------------------------- CL_OPTION(MD5_Verify) { - C.GenerateMD5=true; C.VerifyMD5=true; C.VerifyMD5_Force=true; @@ -786,7 +785,6 @@ CL_OPTION(MD5_Verify) //--------------------------------------------------------------------------- CL_OPTION(MD5_Embed) { - C.GenerateMD5=true; C.EmbedMD5=true; return -2; //Continue @@ -795,7 +793,6 @@ CL_OPTION(MD5_Embed) //--------------------------------------------------------------------------- CL_OPTION(MD5_Embed_Overwrite) { - C.GenerateMD5=true; C.EmbedMD5=true; C.EmbedMD5_AuthorizeOverWritting=true; diff --git a/Source/GUI/Qt/GUI_Main_Menu.cpp b/Source/GUI/Qt/GUI_Main_Menu.cpp index 7b6faec7..88ab0e0a 100644 --- a/Source/GUI/Qt/GUI_Main_Menu.cpp +++ b/Source/GUI/Qt/GUI_Main_Menu.cpp @@ -1353,11 +1353,6 @@ void GUI_Main::OnMenu_Options_GenerateMD5(bool) C->GenerateMD5=true; C->Menu_File_Options_Update(); C->Menu_File_Open_Files_Finish(); //TODO: progress bar - if (C->GenerateMD5==false) - { - Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Embed]->setChecked(false); - //OnMenu_Options_EmbedMD5(); - } //Showing if (C->Text_stderr_Updated_Get()) @@ -1370,11 +1365,6 @@ void GUI_Main::OnMenu_Options_GenerateMD5(bool) break; case QMessageBox::No : // No was clicked C->GenerateMD5=true; - if (C->GenerateMD5==false) - { - Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Embed]->setChecked(false); - //OnMenu_Options_EmbedMD5(); - } break; case QMessageBox::Cancel : // Cancel was clicked C->GenerateMD5=false; @@ -1386,13 +1376,6 @@ void GUI_Main::OnMenu_Options_GenerateMD5(bool) else { C->GenerateMD5=Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Generate]->isChecked(); - if (C->GenerateMD5==false) - { - Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Verify]->setChecked(false); - //OnMenu_Options_VerifyMD5(); - Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Embed]->setChecked(false); - //OnMenu_Options_EmbedMD5(); - } } } @@ -1402,13 +1385,6 @@ void GUI_Main::OnMenu_Options_VerifyMD5(bool) C->VerifyMD5=Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Verify]->isChecked(); if (C->VerifyMD5==true) { - Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Generate]->setChecked(true); - //OnMenu_Options_GenerateMD5(); - if (!C->GenerateMD5) - { - Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Verify]->setChecked(false); - //OnMenu_Options_VerifyMD5(); - } C->Menu_File_Options_Update(); //Showing @@ -1430,11 +1406,6 @@ void GUI_Main::OnMenu_Options_EmbedMD5(bool) C->EmbedMD5=Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Embed]->isChecked(); if (C->EmbedMD5==true) { - Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Generate]->setChecked(true); - if (!C->GenerateMD5) - { - Menu_Fields_CheckBoxes[Group_MD5*options::MaxCount+Option_MD5_Embed]->setChecked(false); - } C->Menu_File_Options_Update(); View_Refresh(); } diff --git a/Source/Riff/Riff_Base.cpp b/Source/Riff/Riff_Base.cpp index 80ad6443..f50a2d4e 100644 --- a/Source/Riff/Riff_Base.cpp +++ b/Source/Riff/Riff_Base.cpp @@ -242,7 +242,8 @@ void Riff_Base::Read_Internal_ReadAllInBuffer () if (BytesRead==0) break; //Read is finished Global->CS.Enter(); - Global->Progress=(float)Global->In.Position_Get()/Global->In.Size_Get(); + int64u Skipped=Global->data?Global->data->Size:0; + Global->Progress=(float)(Global->In.Position_Get()-Skipped)/Global->In.Size_Get(); if (Global->Canceling) { Global->CS.Leave(); diff --git a/Source/Riff/Riff_Chunks_WAVE_data.cpp b/Source/Riff/Riff_Chunks_WAVE_data.cpp index 00645a0d..11cca29e 100644 --- a/Source/Riff/Riff_Chunks_WAVE_data.cpp +++ b/Source/Riff/Riff_Chunks_WAVE_data.cpp @@ -9,10 +9,6 @@ //--------------------------------------------------------------------------- #include "Riff/Riff_Chunks.h" -extern "C" -{ -#include "MD5/md5.h" -} #include "ZenLib/Utils.h" //--------------------------------------------------------------------------- @@ -39,54 +35,6 @@ void Riff_WAVE_data::Read_Internal () Global->data=new Riff_Base::global::chunk_data; Global->data->File_Offset=Global->In.Position_Get(); Global->data->Size=Chunk.Content.Size; - - //MD5 - try - { - Chunk.Content.Buffer=new int8u[65536]; - } - catch(...) - { - throw exception_read_chunk("Problem during memory allocation"); - } - - //Reading - if (Global->GenerateMD5 && (!Global->MD5Generated || Global->MD5Generated->Strings["md5generated"].empty())) - { - MD5Context MD5; - MD5Init(&MD5); - while(Chunk.Content.Buffer_Offset65536) - ToRead=65536; - size_t BytesRead=Global->In.Read(Chunk.Content.Buffer, ToRead); - if (BytesRead==0) - break; //Read is finished - Global->CS.Enter(); - Global->Progress=(float)Global->In.Position_Get()/Global->In.Size_Get(); - if (Global->Canceling) - { - Global->CS.Leave(); - throw exception_canceled(); - } - Global->CS.Leave(); - //SleeperThread::msleep(200); - Chunk.Content.Buffer_Offset+=BytesRead; - MD5Update(&MD5, Chunk.Content.Buffer, (unsigned int)BytesRead); - } - if (Chunk.Content.Buffer_OffsetMD5Generated=new Riff_Base::global::chunk_strings; - Global->MD5Generated->Strings["md5generated"]=Ztring().From_Number(DigestI, 16).To_UTF8(); - while (Global->MD5Generated->Strings["md5generated"].size()<32) - Global->MD5Generated->Strings["md5generated"].insert(Global->MD5Generated->Strings["md5generated"].begin(), '0'); //Padding with 0, this must be a 32-byte string - } } //*************************************************************************** diff --git a/Source/Riff/Riff_Handler.cpp b/Source/Riff/Riff_Handler.cpp index 7a6970ea..45c9c05c 100644 --- a/Source/Riff/Riff_Handler.cpp +++ b/Source/Riff/Riff_Handler.cpp @@ -18,6 +18,10 @@ #include "ZenLib/File.h" #include "ZenLib/Dir.h" #include "TinyXml2/tinyxml2.h" +extern "C" +{ +#include "MD5/md5.h" +} #ifdef MACSTORE #include "Common/Mac_Helpers.h" @@ -557,6 +561,90 @@ bool Riff_Handler::Open_Internal(const string &FileName) ReturnValue=false; } + //Compute MD5 + if (Chunks->Global->data && + ((Chunks->Global->GenerateMD5 && (!Chunks->Global->MD5Generated || Chunks->Global->MD5Generated->Strings["md5generated"].empty())) || + (Chunks->Global->VerifyMD5 && (Chunks->Global->MD5Stored && !Chunks->Global->MD5Stored->Strings["md5stored"].empty())) || + (Chunks->Global->EmbedMD5 && ((!Chunks->Global->MD5Stored || Chunks->Global->MD5Stored->Strings["md5stored"].empty()) || Chunks->Global->EmbedMD5_AuthorizeOverWritting)))) + { + size_t Buffer_Offset=0; + int8u* Buffer=nullptr; + try + { + Buffer=new int8u[65536]; + } + catch(...) + { + Errors<Global->File_Name.To_UTF8()<<": Problem during memory allocation"<Global->In.GoTo(Chunks->Global->data->File_Offset)) + { + MD5Context MD5; + MD5Init(&MD5); + + while(Buffer_OffsetGlobal->data->Size) + { + size_t ToRead=(size_t)Chunks->Global->data->Size-Buffer_Offset; + if (ToRead>65536) + ToRead=65536; + size_t BytesRead=Chunks->Global->In.Read(Buffer, ToRead); + if (BytesRead==0) + break; //Read is finished + Buffer_Offset+=BytesRead; + + Chunks->Global->CS.Enter(); + int64u Skipped=Chunks->Global->data->Size-Buffer_Offset; + Chunks->Global->Progress=(float)(Chunks->Global->In.Size_Get()-Skipped)/Chunks->Global->In.Size_Get(); + if (Chunks->Global->Canceling) + { + Errors<Global->File_Name.To_UTF8()<<": canceled"<Global->Canceling=false; + ReturnValue=false; + Chunks->Global->CS.Leave(); + break; + } + Chunks->Global->CS.Leave(); + MD5Update(&MD5, Buffer, (unsigned int)BytesRead); + } + delete[] Buffer; + + if (File_IsCanceled) + { + //Nothing to do + } + else if (Buffer_OffsetGlobal->data->Size) + { + Errors<Global->File_Name.To_UTF8()<<": Problem during reading"<Global->MD5Generated=new Riff_Base::global::chunk_strings; + Chunks->Global->MD5Generated->Strings["md5generated"]=Ztring().From_Number(DigestI, 16).To_UTF8(); + while (Chunks->Global->MD5Generated->Strings["md5generated"].size()<32) + Chunks->Global->MD5Generated->Strings["md5generated"].insert(Chunks->Global->MD5Generated->Strings["md5generated"].begin(), '0'); //Padding with 0, this must be a 32-byte string + } + } + else + { + Errors<Global->File_Name.To_UTF8()<<": Problem during seeking"<Global->In.Close();