UnrarObject.cpp
资源名称:MyUnRar.rar [点击查看]
上传用户:sz4588
上传日期:2022-05-26
资源大小:2253k
文件大小:7k
源码类别:
压缩解压
开发平台:
Visual C++
- // UnrarObject.cpp: implementation of the CUnrarObject class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "UnrarObject.h"
- #include "gAPI.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- //------------------------------------------------------------------------
- CUnrarObject::CUnrarObject()
- {
- m_hArchive=NULL;
- bCleanOriginalArchive=FALSE;
- ResetGuiControls();
- }
- //------------------------------------------------------------------------
- CUnrarObject::~CUnrarObject()
- {
- if(pGUIWindows) delete pGUIWindows;
- if(m_hArchive)
- {
- RARCloseArchive(m_hArchive);
- m_hArchive=NULL;
- }
- }
- //------------------------------------------------------------------------
- //------------------------------------------------------------------------
- int CUnrarObject::SetInputPath(CString InputPath)
- {
- m_InputPath=InputPath;
- //[1] Get the handle
- char CmtBuf[16384]; //Comment buffer
- RAROpenArchiveDataEx ArchiveData;
- memset(&ArchiveData,0,sizeof(ArchiveData));
- ArchiveData.ArcName=InputPath.GetBuffer(1024);
- ArchiveData.CmtBuf=CmtBuf;
- ArchiveData.CmtBufSize=sizeof(CmtBuf);
- ArchiveData.OpenMode=RAR_OM_EXTRACT;
- m_hArchive=RAROpenArchiveEx(&ArchiveData);
- if(m_hArchive==NULL)
- {
- printf("Error open packed files %s",InputPath);
- return 0;
- }
- //[2] hook the callback functions for GUI display
- RARSetCallback(m_hArchive,ExtractCallbackProc,(LONG)this);
- return 1;
- }
- void CUnrarObject::SetCleanArchiveOption(bool bRemove)
- {
- bCleanOriginalArchive=bRemove;
- }
- //------------------------------------------------------------------------
- //////////////////////////////////////////////////////////////////////
- // Unpacking operations
- //////////////////////////////////////////////////////////////////////
- //------------------------------------------------------------------------
- //The multi-thread function
- UINT CUnrarObject::UnpackThreadFun(LPVOID pParam)
- {
- CUnrarObject* pThis=(CUnrarObject*)pParam;
- if(pThis==NULL)
- return -1;
- if(pThis->m_hArchive)
- {
- pThis->Update_Gui_Info(_T("-Unpacking ")+ApiGetFileName(pThis->m_InputPath));
- pThis->UnpackedArchives.Add(pThis->m_InputPath); //For the final deletion/cleaning
- RARHeaderData HeaderData;
- int ReadHeaderCode;
- ///////////////////////////////////////////////////////////////////
- //For each file in the rar
- while ((ReadHeaderCode=RARReadHeader(pThis->m_hArchive,&HeaderData)==0))
- {
- CString Info;
- Info.Format(" ==> %s Extracted",HeaderData.FileName);
- pThis->Update_Gui_Info(Info);
- int nReturnCode=RARProcessFile( pThis->m_hArchive,RAR_EXTRACT,
- pThis->m_OutputPath.GetBuffer(1024),NULL);
- switch(nReturnCode)
- {
- case 0: break; //Success
- case ERAR_BAD_DATA: TRACE("File Extraction: Bad data, possibly CRC error"); return FALSE;
- case ERAR_BAD_ARCHIVE: TRACE("File Extraction: Volume is not valid RAR archive"); return FALSE;
- case ERAR_UNKNOWN_FORMAT: TRACE("File Extraction: Unknown archive format"); return FALSE;
- case ERAR_EOPEN: TRACE("File Extraction: Volume open error"); return FALSE;
- case ERAR_ECREATE: TRACE("File Extraction: File create error"); return FALSE;
- case ERAR_ECLOSE: TRACE("File Extraction: File close error"); return FALSE;
- case ERAR_EREAD: TRACE("File Extraction: Read error"); return FALSE;
- case ERAR_EWRITE: TRACE("File Extraction: Write error"); return FALSE;
- }
- }
- ///////////////////////////////////////////////////////////////////
- }
- pThis->Update_Gui_Info("Success!");
- pThis->CleanOriginalArchive(pThis->bCleanOriginalArchive);
- return 0;
- }
- //------------------------------------------------------------------------
- //------------------------------------------------------------------------
- //Use this to call the unpack function
- void CUnrarObject::Unpack(bool bMultiThread)
- {
- if(SetInputPath(m_InputPath)==0)return;
- if(m_hArchive==NULL)return;
- if(bMultiThread)
- AfxBeginThread(UnpackThreadFun,this);
- else
- UnpackThreadFun((LPVOID)this);
- }
- //------------------------------------------------------------------------
- //The callback function, following the signature of RARLAB API
- int CUnrarObject::ExtractCallbackProc(UINT msg, LONG UserData, LONG P1, LONG P2)
- {
- CUnrarObject* pThis=(CUnrarObject*)UserData;
- switch(msg)
- {
- case UCM_CHANGEVOLUME:
- if (P2==RAR_VOL_ASK)
- {
- CString Info;
- Info.Format("A volume %s is required, terminate now",ApiGetFileName((char *)P1));
- TRACE(Info);
- exit(-1);
- }
- if (P2==RAR_VOL_NOTIFY)
- {
- CString Path=(char *)P1;
- pThis->UnpackedArchives.Add(Path); //For file deletions;
- pThis->Update_Gui_Info(_T("-Unpacking ")+ApiGetFileName(Path));
- }
- case UCM_PROCESSDATA: { }
- case UCM_NEEDPASSWORD:{ }
- }
- return(0);
- }
- //------------------------------------------------------------------------
- void CUnrarObject::CleanOriginalArchive(BOOL bClearFilesOnSuccess)
- {
- if(bClearFilesOnSuccess)
- {
- RARCloseArchive(m_hArchive);
- m_hArchive=NULL;
- for(int i=0;i<UnpackedArchives.GetSize();i++)
- DeleteFile(UnpackedArchives[i]); //Direct delete, not RecycleBin!
- }
- }
- //------------------------------------------------------------------------
- //////////////////////////////////////////////////////////////////////
- // GUI Controls
- //////////////////////////////////////////////////////////////////////
- //------------------------------------------------------------------------
- void CUnrarObject::ResetGuiControls()
- {
- pGUIWindows=new CGuiStruct;
- pGUIWindows->m_pListBox=NULL;
- pGUIWindows->m_pstatic=NULL;
- }
- void CUnrarObject::Update_Gui_Info(CString Info, BOOL bClearDataFirst)
- {
- if(Info.IsEmpty())
- return;
- if(pGUIWindows->m_pListBox)
- {
- if(bClearDataFirst)
- pGUIWindows->m_pListBox->ResetContent();
- int n=pGUIWindows->m_pListBox->GetCount();
- pGUIWindows->m_pListBox->InsertString(n,Info);
- pGUIWindows->m_pListBox->SetCurSel(n);
- pGUIWindows->m_pListBox->Invalidate();
- }
- if(pGUIWindows->m_pstatic)
- {
- pGUIWindows->m_pstatic->SetWindowText(Info);
- pGUIWindows->m_pstatic->Invalidate();
- }
- //Append your own GUI control update code here
- }
- //------------------------------------------------------------------------
English
