"Fossies" - the Fresh Open Source Software Archive

Member "unrar/win32stm.cpp" (4 May 2022, 4326 Bytes) of package /linux/misc/unrarsrc-6.1.7.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "win32stm.cpp" see the Fossies "Dox" file reference documentation.

    1 
    2 
    3 #if !defined(SFX_MODULE) && defined(_WIN_ALL)
    4 void ExtractStreams20(Archive &Arc,const wchar *FileName)
    5 {
    6   if (Arc.BrokenHeader)
    7   {
    8     uiMsg(UIERROR_STREAMBROKEN,Arc.FileName,FileName);
    9     ErrHandler.SetErrorCode(RARX_CRC);
   10     return;
   11   }
   12 
   13   if (Arc.StreamHead.Method<0x31 || Arc.StreamHead.Method>0x35 || Arc.StreamHead.UnpVer>VER_PACK)
   14   {
   15     uiMsg(UIERROR_STREAMUNKNOWN,Arc.FileName,FileName);
   16     ErrHandler.SetErrorCode(RARX_WARNING);
   17     return;
   18   }
   19 
   20   wchar StreamName[NM+2];
   21   if (FileName[0]!=0 && FileName[1]==0)
   22   {
   23     // Convert single character names like f:stream to .\f:stream to
   24     // resolve the ambiguity with drive letters.
   25     wcsncpyz(StreamName,L".\\",ASIZE(StreamName));
   26     wcsncatz(StreamName,FileName,ASIZE(StreamName));
   27   }
   28   else
   29     wcsncpyz(StreamName,FileName,ASIZE(StreamName));
   30   if (wcslen(StreamName)+strlen(Arc.StreamHead.StreamName)>=ASIZE(StreamName) ||
   31       Arc.StreamHead.StreamName[0]!=':')
   32   {
   33     uiMsg(UIERROR_STREAMBROKEN,Arc.FileName,FileName);
   34     ErrHandler.SetErrorCode(RARX_CRC);
   35     return;
   36   }
   37 
   38   wchar StoredName[NM];
   39   CharToWide(Arc.StreamHead.StreamName,StoredName,ASIZE(StoredName));
   40   ConvertPath(StoredName+1,StoredName+1,ASIZE(StoredName)-1);
   41 
   42   wcsncatz(StreamName,StoredName,ASIZE(StreamName));
   43 
   44   FindData fd;
   45   bool Found=FindFile::FastFind(FileName,&fd);
   46 
   47   if ((fd.FileAttr & FILE_ATTRIBUTE_READONLY)!=0)
   48     SetFileAttr(FileName,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY);
   49 
   50   File CurFile;
   51   if (CurFile.WCreate(StreamName))
   52   {
   53     ComprDataIO DataIO;
   54     Unpack Unpack(&DataIO);
   55     Unpack.Init(0x10000,false);
   56 
   57     DataIO.SetPackedSizeToRead(Arc.StreamHead.DataSize);
   58     DataIO.EnableShowProgress(false);
   59     DataIO.SetFiles(&Arc,&CurFile);
   60     DataIO.UnpHash.Init(HASH_CRC32,1);
   61     Unpack.SetDestSize(Arc.StreamHead.UnpSize);
   62     Unpack.DoUnpack(Arc.StreamHead.UnpVer,false);
   63 
   64     if (Arc.StreamHead.StreamCRC!=DataIO.UnpHash.GetCRC32())
   65     {
   66       uiMsg(UIERROR_STREAMBROKEN,Arc.FileName,StreamName);
   67       ErrHandler.SetErrorCode(RARX_CRC);
   68     }
   69     else
   70       CurFile.Close();
   71   }
   72   File HostFile;
   73   if (Found && HostFile.Open(FileName,FMF_OPENSHARED|FMF_UPDATE))
   74     SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime,
   75                 &fd.ftLastWriteTime);
   76   if ((fd.FileAttr & FILE_ATTRIBUTE_READONLY)!=0)
   77     SetFileAttr(FileName,fd.FileAttr);
   78 }
   79 #endif
   80 
   81 
   82 #ifdef _WIN_ALL
   83 void ExtractStreams(Archive &Arc,const wchar *FileName,bool TestMode)
   84 {
   85   wchar FullName[NM+2];
   86   if (FileName[0]!=0 && FileName[1]==0)
   87   {
   88     // Convert single character names like f:stream to .\f:stream to
   89     // resolve the ambiguity with drive letters.
   90     wcsncpyz(FullName,L".\\",ASIZE(FullName));
   91     wcsncatz(FullName,FileName,ASIZE(FullName));
   92   }
   93   else
   94     wcsncpyz(FullName,FileName,ASIZE(FullName));
   95 
   96   wchar StreamName[NM];
   97   GetStreamNameNTFS(Arc,StreamName,ASIZE(StreamName));
   98   if (*StreamName!=':')
   99   {
  100     uiMsg(UIERROR_STREAMBROKEN,Arc.FileName,FileName);
  101     ErrHandler.SetErrorCode(RARX_CRC);
  102     return;
  103   }
  104 
  105   if (TestMode)
  106   {
  107     File CurFile;
  108     Arc.ReadSubData(NULL,&CurFile,true);
  109     return;
  110   }
  111 
  112   wcsncatz(FullName,StreamName,ASIZE(FullName));
  113 
  114   FindData fd;
  115   bool Found=FindFile::FastFind(FileName,&fd);
  116 
  117   if ((fd.FileAttr & FILE_ATTRIBUTE_READONLY)!=0)
  118     SetFileAttr(FileName,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY);
  119   File CurFile;
  120   if (CurFile.WCreate(FullName) && Arc.ReadSubData(NULL,&CurFile,false))
  121     CurFile.Close();
  122   File HostFile;
  123   if (Found && HostFile.Open(FileName,FMF_OPENSHARED|FMF_UPDATE))
  124     SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime,
  125                 &fd.ftLastWriteTime);
  126 
  127   // Restoring original file attributes. Important if file was read only
  128   // or did not have "Archive" attribute
  129   SetFileAttr(FileName,fd.FileAttr);
  130 }
  131 #endif
  132 
  133 
  134 void GetStreamNameNTFS(Archive &Arc,wchar *StreamName,size_t MaxSize)
  135 {
  136   byte *Data=&Arc.SubHead.SubData[0];
  137   size_t DataSize=Arc.SubHead.SubData.Size();
  138   if (Arc.Format==RARFMT15)
  139   {
  140     size_t DestSize=Min(DataSize/2,MaxSize-1);
  141     RawToWide(Data,StreamName,DestSize);
  142     StreamName[DestSize]=0;
  143   }
  144   else
  145   {
  146     char UtfString[NM*4];
  147     size_t DestSize=Min(DataSize,ASIZE(UtfString)-1);
  148     memcpy(UtfString,Data,DestSize);
  149     UtfString[DestSize]=0;
  150     UtfToWide(UtfString,StreamName,MaxSize);
  151   }
  152 }