⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 themezip.cpp

📁 这是一个mp3的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
       }

       //
       // sanity checks
       //

       // check if we are done (header record all 0)
       int ctr,sum;
       for(ctr=sum=0; ctr<(int)sizeof(tar_record); ctr++) 
           sum+=TarRecord.charptr[ctr];
       if(sum==0)
       {
           // empty record detected, bail out
           fDone = TRUE;
           break;
       }

       // check for magic
       if(TarRecord.header.magic[7]!=0 || strcmp(TarRecord.header.magic,TMAGIC))
       {
           // nope, something not right
           gzclose(pIn);
           delete pBuffer;
           CleanupThemeZip();
           return kError_NoDataAvail;
       }

       // check if checksum is still OK
       int our_sum = from_oct(6,TarRecord.header.chksum);
       memcpy(TarRecord.header.chksum,CHKBLANKS,8);
       for(ctr=sum=0;ctr<(int)sizeof(tar_record);ctr++) 
           sum+=TarRecord.charptr[ctr];
       if(sum!=our_sum)
       {
           // checksum failed
           gzclose(pIn);
           delete pBuffer;
           CleanupThemeZip();
           return kError_NoDataAvail;
       }

       // check if we are dealing with file
       if(TarRecord.header.typeflag == REGTYPE || TarRecord.header.typeflag == AREGTYPE)
       {
           // all fine, just proceed
           ;
       }
       else
       {
           if(TarRecord.header.typeflag == DIRTYPE && !fOneDirectory)
           {
               // will tolearate one directory
               fOneDirectory = TRUE;

               continue; // go on to next record
           }
           else
           {
               // ... but not many:
               // this archive is likely not theme anyway!
               gzclose(pIn);
               delete pBuffer;
               CleanupThemeZip();
               return kError_NoDataAvail;
           }
       }
       // ... sanity checks ok, proceed with file


       //
       // the unpacking itself
       //

       oUnpackFile = string(TarRecord.header.name);
       // in case we have sub-directory in tar, take only filename
       unsigned int uPos;
       uPos=oUnpackFile.rfind('/');
       if(uPos!=oUnpackFile.npos) oUnpackFile.erase(0,uPos+1);

       // open output file
       oFile = oDestPath + string(DIR_MARKER_STR) + oUnpackFile;
       pOut = fopen(oFile.c_str(), "wb");
       if (pOut == NULL)
       {
           gzclose(pIn);
           delete pBuffer;
           CleanupThemeZip();
           return kError_FileNotFound;
       }
       m_oCreatedFiles.push_back(oFile);

       iSize = from_oct(11,TarRecord.header.size); 
       iPadding = (iSize/512+1)*512-iSize;

       // write it's data out
       for(; iSize > 0;)
       {
           iBlock = min(iSize, iBufferSize);
           iRead = gzread(pIn, pBuffer, iBlock);
           if (iRead != iBlock)
           {
               gzclose(pIn);
               fclose(pOut);
               delete pBuffer;
               CleanupThemeZip();
               return kError_ReadFile;
           }
           iWrite = fwrite(pBuffer, 1, iBlock, pOut);
           if (iWrite != iBlock)
           {
               gzclose(pIn);
               fclose(pOut);
               delete pBuffer;
               CleanupThemeZip();
               return kError_WriteFile;
           }

           iSize -= iBlock;
       }          
       fclose(pOut);

       if(iPadding)
       {
           gzseek(pIn, iPadding, SEEK_CUR);
       }

   }

   // all went fine

   delete pBuffer;
   gzclose(pIn);

   return kError_NoErr;
}

Error ThemeZip::GetDescriptiveName(const string &oSrcFile, string &oDescriptiveName)
{
    gzFile pIn;
    tar_record TarRecord;
    int iSize, iPadding;
    int fDone;

    // sanity check
    if (oSrcFile.length() == 0)
       return kError_FileNotFound;

    oDescriptiveName=string(""); // return at least empty string in any case

    // open theme file
    pIn = gzopen(oSrcFile.c_str(), "rb");
    if (pIn == NULL)
        return kError_FileNotFound;

    //
    // loop to find directory record (descriptive name, that is)
    //
    fDone = FALSE;
    while(!fDone)
    {
        if (gzread(pIn, &TarRecord, sizeof(tar_record)) != sizeof(tar_record))
        {
            gzclose(pIn);
            return kError_ReadFile;
        }

        //
        // sanity checks
        //

        // check if we are done (header record all 0)
        int ctr,sum;
        for(ctr=sum=0; ctr<(int)sizeof(tar_record); ctr++) 
            sum+=TarRecord.charptr[ctr];
        if(sum==0)
        {
            // empty record detected, bail out
            fDone = TRUE;
            break;
        }

        // check for magic
        if(TarRecord.header.magic[7]!=0 || strcmp(TarRecord.header.magic,TMAGIC))
        {
            // nope, something not right
            gzclose(pIn);
            return kError_NoDataAvail;
        }

        // check if checksum is still OK
        int our_sum = from_oct(6,TarRecord.header.chksum);
        memcpy(TarRecord.header.chksum,CHKBLANKS,8);
        for(ctr=sum=0;ctr<(int)sizeof(tar_record);ctr++) 
            sum+=TarRecord.charptr[ctr];
        if(sum!=our_sum)
        {
            // checksum failed
            gzclose(pIn);
            return kError_NoDataAvail;
        }

        // see if it is directory record we are looking for
        if(TarRecord.header.typeflag == DIRTYPE)
        {
            unsigned int uPos;
            oDescriptiveName = string (TarRecord.header.name);

            // erase trailing slash
            uPos=oDescriptiveName.rfind('/');
            if(uPos!=oDescriptiveName.npos) oDescriptiveName.erase(uPos,uPos+1);
            // erase (possible) extension
            uPos=oDescriptiveName.rfind(".fat");
            if(uPos!=oDescriptiveName.npos) oDescriptiveName.erase(uPos,uPos+1);

            break; //we're done
        }

        if (strcasecmp(TarRecord.header.name, "title.txt") == 0)
        {
            char *pText;
            
            iSize = from_oct(11,TarRecord.header.size);
            if(iSize)
            {
                char *pPtr;
                
                iPadding = (iSize/512+1)*512-iSize;
                pText = new char[iSize + iPadding + 1];
                if (gzread(pIn, pText, iSize+iPadding) != iSize+iPadding)
                {
                    gzclose(pIn);
                    return kError_ReadFile;
                }
                
                pPtr = strchr(pText, '\n');
                if (pPtr)
                   *pPtr = 0;
                pPtr = strchr(pText, '\r');
                if (pPtr)
                   *pPtr = 0;
                   
                oDescriptiveName = pText;
                delete pText;
                break;
            }
            
            continue;
        }

        // skip actual content
        iSize = from_oct(11,TarRecord.header.size);
        if(iSize)
        {
            iPadding = (iSize/512+1)*512-iSize;
            gzseek(pIn, iSize+iPadding, SEEK_CUR);
        }
    }

    gzclose(pIn);
    return kError_NoErr;
}

Error ThemeZip::CleanupThemeZip(void)
{
   vector<string>::iterator i;
   
   for(i = m_oCreatedFiles.begin(); i != m_oCreatedFiles.end(); i++)
   {
   	   if (unlink((*i).c_str()))
           return kError_UnlinkFailed;
   }        

   return kError_NoErr;
}      

#if 0
void main(int argc, char **argv)
{
   ThemeZip a;
   vector<string *> list;
   string src;

   if (argv[1][0] == 'e')
   {
       int i;

       for(i = 3; i < argc; i++)
       {
           string *p;

           p = new string(argv[i]);
           list.push_back(p);
       }
       int r = a.CompressThemeZip(string(argv[2]), list);
       printf("ret: %d", r);
       exit(0);
   }  
   if (argv[1][0] == 'd')
   {
       int r = a.DecompressThemeZip(string(argv[2]), string(argv[3]));
       printf("ret: %d", r);
       exit(0);
   }  
   printf("Did nothing\n");
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -