chromium/third_party/unrar/src/volume.cpp

#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)
          {
            // We can damage some Unicode characters by U->A->U conversion,
            // so set Unicode name only if we see that ANSI name is changed.
            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);
    }
  }

  // We quit only on 'abort' condition, but not on 'name not changed'.
  // It is legitimate for program to return the same name when waiting
  // for currently non-existent volume.
  // Also we quit to prevent an infinite loop if no callback is defined.
  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