#include "rar.hpp"
#ifdef RARDLL
bool DllVolChange(CommandData *Cmd,std::wstring &NextName);
static bool DllVolNotify(CommandData *Cmd,const std::wstring &NextName);
#endif
bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Command)
{ … }
#ifdef RARDLL
bool DllVolChange(CommandData *Cmd,std::wstring &NextName)
{
bool DllVolChanged=false,DllVolAborted=false;
if (Cmd->Callback!=NULL)
{
std::wstring OrgNextName=NextName;
std::vector<wchar> NameBuf(MAXPATHSIZE);
std::copy(NextName.data(), NextName.data() + NextName.size() + 1, NameBuf.begin());
if (Cmd->Callback(UCM_CHANGEVOLUMEW,Cmd->UserData,(LPARAM)NameBuf.data(),RAR_VOL_ASK)==-1)
DllVolAborted=true;
else
{
NextName=NameBuf.data();
if (OrgNextName!=NextName)
DllVolChanged=true;
else
{
std::string NextNameA;
WideToChar(NextName,NextNameA);
std::string OrgNextNameA=NextNameA;
std::vector<char> NameBufA(MAXPATHSIZE);
std::copy(NextNameA.data(), NextNameA.data() + NextNameA.size() + 1, NameBufA.begin());
if (Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LPARAM)NameBufA.data(),RAR_VOL_ASK)==-1)
DllVolAborted=true;
else
{
NextNameA=NameBufA.data();
if (OrgNextNameA!=NextNameA)
{
CharToWide(NextNameA,NextName);
DllVolChanged=true;
}
}
}
}
}
if (!DllVolChanged && Cmd->ChangeVolProc!=NULL)
{
std::string NextNameA;
WideToChar(NextName,NextNameA);
std::vector<char> NameBufA(MAXPATHSIZE);
std::copy(NextNameA.data(), NextNameA.data() + NextNameA.size() + 1, NameBufA.begin());
int RetCode=Cmd->ChangeVolProc(NameBufA.data(),RAR_VOL_ASK);
if (RetCode==0)
DllVolAborted=true;
else
{
NextNameA=NameBufA.data();
CharToWide(NextNameA,NextName);
}
}
if (DllVolAborted || Cmd->Callback==NULL && Cmd->ChangeVolProc==NULL)
{
Cmd->DllError=ERAR_EOPEN;
return false;
}
return true;
}
#endif
#ifdef RARDLL
static bool DllVolNotify(CommandData *Cmd,const std::wstring &NextName)
{
std::string NextNameA;
WideToChar(NextName,NextNameA);
if (Cmd->Callback!=NULL)
{
if (Cmd->Callback(UCM_CHANGEVOLUMEW,Cmd->UserData,(LPARAM)NextName.data(),RAR_VOL_NOTIFY)==-1)
return false;
if (Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LPARAM)NextNameA.data(),RAR_VOL_NOTIFY)==-1)
return false;
}
if (Cmd->ChangeVolProc!=NULL)
{
int RetCode=Cmd->ChangeVolProc((char *)NextNameA.data(),RAR_VOL_NOTIFY);
if (RetCode==0)
return false;
}
return true;
}
#endif