Ignore:
Timestamp:
11/13/2008 12:32:28 PM (4 years ago)
Author:
lowjoel
Message:

Added a self-scoping Handle class; fixed a few memory leaks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eraser6/Installer/Bootstrapper/Bootstrapper.cpp

    r542 r543  
    2323#include "Bootstrapper.h" 
    2424 
     25class Handle 
     26{ 
     27public: 
     28    Handle(HANDLE handle) 
     29    { 
     30        thisHandle = handle; 
     31    } 
     32 
     33    ~Handle() 
     34    { 
     35        CloseHandle(thisHandle); 
     36    } 
     37 
     38    operator HANDLE() 
     39    { 
     40        return thisHandle; 
     41    } 
     42 
     43private: 
     44    HANDLE thisHandle; 
     45}; 
     46 
    2547/// ISzInStream interface for extracting the archives. 
    2648struct LZFileStream 
     
    110132    //Open the file 
    111133#if _DEBUG 
    112     HANDLE srcFile = CreateFileW((Application::Get().GetPath() + L".7z").c_str(), 
    113         GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
     134    Handle srcFile(CreateFileW((Application::Get().GetPath() + L".7z").c_str(), 
     135        GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)); 
    114136    if (srcFile == INVALID_HANDLE_VALUE) 
    115137        throw GetErrorMessage(GetLastError()); 
    116138#else 
    117     HANDLE srcFile = CreateFileW(Application::Get().GetPath().c_str(), GENERIC_READ, 
    118         FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
     139    Handle srcFile(CreateFileW(Application::Get().GetPath().c_str(), GENERIC_READ, 
     140        FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)); 
    119141    if (srcFile == INVALID_HANDLE_VALUE) 
    120142        throw GetErrorMessage(GetLastError()); 
     
    147169    unsigned blockIndex = 0; 
    148170    Byte* outBuffer = NULL; 
    149     size_t outBufferSize = 524288; 
     171    size_t outBufferSize = 0; 
    150172    for (unsigned i = 0; i < db.Database.NumFiles; ++i) 
    151173    { 
    152174        size_t offset = 0; 
    153175        size_t processedSize = 0; 
    154         CFileItem *f = db.Database.Files + i; 
     176        CFileItem* file = db.Database.Files + i; 
    155177        SZ_RESULT result = SZ_OK; 
    156178 
     
    158180        size_t convertedChars = 0; 
    159181        wchar_t fileName[MAX_PATH]; 
    160         mbstowcs_s(&convertedChars, fileName, f->Name, sizeof(fileName) / sizeof(fileName[0])); 
    161         HANDLE destFile = CreateFileW((pathToExtract + fileName).c_str(), GENERIC_WRITE, 0, 
    162             NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
     182        mbstowcs_s(&convertedChars, fileName, file->Name, sizeof(fileName) / sizeof(fileName[0])); 
     183        Handle destFile(CreateFileW((pathToExtract + fileName).c_str(), GENERIC_WRITE, 0, 
     184            NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)); 
    163185        if (destFile == INVALID_HANDLE_VALUE) 
    164186            throw GetErrorMessage(GetLastError()); 
    165         unsigned long long destFileSize = f->Size; 
     187        unsigned long long destFileSize = file->Size; 
    166188 
    167189        //Extract the file 
     
    172194                &allocTempImp); 
    173195            if (result != SZ_OK) 
    174                 _asm int 3; 
     196                throw std::wstring(L"Could not decompress data as it is corrupt."); 
    175197 
    176198            DWORD bytesWritten = 0; 
     
    181203            Application::Get().Yield(); 
    182204        } 
    183  
    184         CloseHandle(destFile); 
    185     } 
     205    } 
     206 
    186207    allocImp.Free(outBuffer); 
    187208} 
     
    276297        tempDir += L"\\"; 
    277298    std::wstring commandLine(L'"' + tempDir); 
    278     commandLine += L"dotnetfx.exe\""; 
     299    commandLine += L"dotnetfx35.exe\""; 
    279300 
    280301    //And the return code is true if the process exited with 0. 
Note: See TracChangeset for help on using the changeset viewer.