Ignore:
Timestamp:
10/28/2009 10:05:32 AM (4 years ago)
Author:
lowjoel
Message:

Upgrade the Eraser custom erasure methods to the new Unicode versions so that custom methods are preserved. Fixes #225.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/eraser5/EraserDll/Options.cpp

    r4 r1294  
    2929#define MAX_CMETHOD_SIZE         (CMETHOD_SIZE + PASSES_MAX * sizeof(PASS)) 
    3030#define MAX_LIBRARYSETTINGS_SIZE (LIBRARYSETTINGS_SIZE + (MAX_CUSTOM_METHODS * MAX_CMETHOD_SIZE)) 
     31#define LIBRARYVERSION           1 //Unicode library version. 0 is the ASCII one 
    3132 
    3233void 
     
    5859        CKey &kReg = no_registry ? kReg_ini : kReg_reg; 
    5960        bool    bResult = FALSE; 
     61        DWORD   LibraryVersion = 0; 
    6062        E_UINT32  uSize; 
    6163        E_PUINT8  lpData; 
     
    6668            return false; 
    6769        } 
     70 
     71        //Get the version of the library database 
     72        kReg.GetValue(LibraryVersion, ERASER_REGISTRY_LIBRARY_VERSION, 0); 
    6873 
    6974        uSize = kReg.GetValueSize(ERASER_REGISTRY_LIBRARY); 
     
    8287 
    8388                    E_UINT32 uPos = LIBRARYSETTINGS_SIZE; 
     89#ifdef _UNICODE 
     90                    bool upgradeCustomMethods = LibraryVersion == LIBRARYVERSION || 
     91                        AfxMessageBox(_T("An old version of Eraser settings have been found.\n\n") 
     92                        _T("Would you like to upgrade the settings to match the new format? Clicking no will likely ") 
     93                        _T("result in corrupted custom erase methods."), MB_YESNO) == IDYES; 
     94#endif 
    8495 
    8596                    for (E_UINT8 i = 0; i < pls->m_nCMethods; i++) { 
     
    90101 
    91102                        uPos += CMETHOD_SIZE; 
     103 
     104#ifdef _UNICODE 
     105                        // upgrade the name of the method if this is an old library 
     106                        if (LibraryVersion < LIBRARYVERSION && upgradeCustomMethods) 
     107                        { 
     108                            // Cast the raw data to the old method base class 
     109                            MethodBaseA* ansiMethod = reinterpret_cast<MethodBaseA*>(&pls->m_lpCMethods[i]); 
     110                            _MethodBase unicodeMethod; 
     111 
     112                            // Migrate the data element by element 
     113                            memset(&unicodeMethod, 0, sizeof(_MethodBase)); 
     114                            unicodeMethod.m_nMethodID = ansiMethod->m_nMethodID; 
     115                            unicodeMethod.m_nPasses = ansiMethod->m_nPasses; 
     116                            unicodeMethod.m_pwfFunction = ansiMethod->m_pwfFunction; 
     117                            unicodeMethod.m_bShuffle = ansiMethod->m_bShuffle; 
     118 
     119                            // Convert the method name to Unicode 
     120                            size_t convCount = 0; 
     121                            mbstowcs_s(&convCount, unicodeMethod.m_szDescription, DESCRIPTION_SIZE, 
     122                                ansiMethod->m_szDescription, DESCRIPTION_SIZE - 1); 
     123 
     124                            // Copy the new structure 
     125                            memcpy(ansiMethod, &unicodeMethod, sizeof(_MethodBase)); 
     126 
     127                            // Move the buffer pointer backwards so that the passes loaded will be correct 
     128                            uPos -= (sizeof(wchar_t) - sizeof(char)) * DESCRIPTION_SIZE; 
     129                        } 
     130#endif 
    92131 
    93132                        // actual pass information 
     
    105144                        } 
    106145                    } 
     146 
     147#ifdef _UNICODE 
     148                    if (LibraryVersion < LIBRARYVERSION && upgradeCustomMethods) 
     149                        saveLibrarySettings(pls); 
     150#endif 
    107151                } 
    108152 
     
    152196        } 
    153197 
     198        // write the library version 
     199        kReg.SetValue(LIBRARYVERSION, ERASER_REGISTRY_LIBRARY_VERSION); 
     200 
    154201        // calculate data size 
    155202        uSize = LIBRARYSETTINGS_SIZE + (pls->m_nCMethods * CMETHOD_SIZE); 
Note: See TracChangeset for help on using the changeset viewer.