diff options
Diffstat (limited to 'xmerge/source/activesync/XMergeSync.cpp')
-rw-r--r-- | xmerge/source/activesync/XMergeSync.cpp | 837 |
1 files changed, 837 insertions, 0 deletions
diff --git a/xmerge/source/activesync/XMergeSync.cpp b/xmerge/source/activesync/XMergeSync.cpp new file mode 100644 index 000000000000..469c15b2f292 --- /dev/null +++ b/xmerge/source/activesync/XMergeSync.cpp @@ -0,0 +1,837 @@ + +#include "stdafx.h" + +#include "XMergeFilter.h" +#include "XMergeFactory.h" + + +CXMergeSyncModule _Module; + + +////////////////////////////////////////////////////////////////////// +// DLL Functions +////////////////////////////////////////////////////////////////////// +BOOL WINAPI DllMain(HANDLE hInst, ULONG ulReason, LPVOID lpReserved) +{ + switch (ulReason) + { + case DLL_PROCESS_ATTACH: + _Module.m_hInst = reinterpret_cast<HINSTANCE>(hInst); + break; + + case DLL_PROCESS_DETACH: + _Module.m_hInst = NULL; + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + break; + } + + return TRUE; +} + + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +{ + // Create the factory object + CXMergeFactory *pFactory = new CXMergeFactory(); + if (pFactory == NULL) + { + *ppv = NULL; + return E_OUTOFMEMORY; + } + + HRESULT hr = pFactory->QueryInterface(riid, ppv); + pFactory->Release(); + + return hr; +} + + +STDAPI DllCanUnloadNow() +{ + if (_Module.GetLockCount() == 0) + return S_OK; + + return S_FALSE; +} + + +// Utility function to close open keys during registration +static _signalRegError(long lRet, HKEY hKey, HKEY hDataKey) +{ + if (hKey) + ::RegCloseKey(hKey); + + + if (hDataKey) + ::RegCloseKey(hDataKey); + + return HRESULT_FROM_WIN32(lRet); +} + + +STDAPI DllRegisterServer() +{ + HKEY hKey = NULL; + HKEY hDataKey = NULL; + + long lRet = 0; + TCHAR sTemp[_MAX_PATH + 1] = "\0"; + + + /* + * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Writer export filter. + * + * Note that import are export are relative to the WinCE device, so files are + * exported to the desktop format. + */ + + // Get a handle to the CLSID key + lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + // Create the CLSID key for the XMergeFilter + lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPSWExportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportShortDesc, + (::_tcslen(CXMergeFilter::m_pszPSWExportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // Create the DefaultIcon key. For the moment, use one of the Async supplied ones + lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"), + (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0")) + * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + // Create the InprocServer32 key + lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + // Create the key for the DLL file. First find the filename of the dll + if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1))) + { + lRet = ::GetLastError(); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + } + + + lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp, + (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Setup the PegasusFilter key values + lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportDesc, + (::_tcslen(CXMergeFilter::m_pszPSWExportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("Export"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportExt, + (::_tcslen(CXMergeFilter::m_pszPSWExportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + ::RegCloseKey(hKey); hKey = NULL; + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + + + /* + * Following calls create the entries for the filter in + * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters + */ + + lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), + 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPSWImportExt); + lRet = ::RegCreateKeyEx(hKey, _T(sTemp), + 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPSWExportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::RegCloseKey(hKey); hKey = NULL; + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + + /* + * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Writer import filter. + * + * Note that import are export are relative to the WinCE device, so files are + * exported to the desktop format. + */ + // Get a handle to the CLSID key + lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + // Create the CLSID key for the XMergeFilter + lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPSWImportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportShortDesc, + (::_tcslen(CXMergeFilter::m_pszPSWImportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // Create the DefaultIcon key. For the moment, use one of the Async supplied ones + lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"), + (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0")) + * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Create the InprocServer32 key + lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // Create the key for the DLL file. First find the filename of the dll + if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1))) + { + lRet = ::GetLastError(); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + } + + + lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp, + (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Setup the PegasusFilter key values + lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportDesc, + (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("Import"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportExt, + (::_tcslen(CXMergeFilter::m_pszPSWImportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + ::RegCloseKey(hKey); hKey = NULL; + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + /* + * Following calls create the entries for the filter in + * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters + */ + lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), + 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + // Add in defaults for import and export + _snprintf(sTemp, _MAX_PATH +1, "%c%s\0", '.', CXMergeFilter::m_pszPSWExportExt); + lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, + (LPBYTE)CXMergeFilter::m_pszPSWImportCLSID, + (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("DefaultExport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"), + (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::RegCloseKey(hDataKey); + + // Update registered filters + _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPSWExportExt); + lRet = ::RegCreateKeyEx(hKey, _T(sTemp), + 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPSWImportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::RegCloseKey(hKey); hKey = NULL; + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + + /* + * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Calc export filter. + * + * Note that import are export are relative to the WinCE device, so files are + * exported to the desktop format. + */ + + // Get a handle to the CLSID key + lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + // Create the CLSID key for the XMerge Filter + lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPXLExportCLSID, 0, _T(""), + 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportShortDesc, + (::_tcslen(CXMergeFilter::m_pszPXLExportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // Create the DefaultIcon key. For the moment, use one of the Async supplied ones + lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"), + (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0")) + * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Create the InprocServer32 key + lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // Create the key for the DLL file. First find the filename of the dll + if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1))) + { + lRet = ::GetLastError(); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + } + + + lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp, + (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Setup the PegasusFilter key values + lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportDesc, + (::_tcslen(CXMergeFilter::m_pszPXLExportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("Export"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportExt, + (::_tcslen(CXMergeFilter::m_pszPXLExportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + ::RegCloseKey(hKey); hKey = NULL; + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + + + /* + * Following calls create the entries for the filter in + * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters + */ + + lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), + 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPXLImportExt); + lRet = ::RegCreateKeyEx(hKey, _T(sTemp), + 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPXLExportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::RegCloseKey(hKey); hKey = NULL; + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + + /* + * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Calc import filter. + * + * Note that import are export are relative to the WinCE device, so files are + * exported to the desktop format. + */ + // Get a handle to the CLSID key + lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // Create the CLSID key for the XMergeFilter + lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPXLImportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportShortDesc, + (::_tcslen(CXMergeFilter::m_pszPXLImportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + // Create the DefaultIcon key. For the moment, use one of the Async supplied ones + lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"), + (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0")) + * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Create the InprocServer32 key + lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // Create the key for the DLL file. First find the filename of the dll + if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1))) + { + lRet = ::GetLastError(); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + } + + + lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp, + (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Setup the PegasusFilter key values + lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportDesc, + (::_tcslen(CXMergeFilter::m_pszPXLImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("Import"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportExt, + (::_tcslen(CXMergeFilter::m_pszPXLImportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + ::RegCloseKey(hKey); hKey = NULL; + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + + /* + * Following calls create the entries for the filter in + * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters + */ + lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), + 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + // Add in defaults for import and export + _snprintf(sTemp, _MAX_PATH +1, "%c%s\0", '.', CXMergeFilter::m_pszPXLExportExt); + lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, + (LPBYTE)CXMergeFilter::m_pszPXLImportCLSID, + (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + lRet = ::RegSetValueEx(hDataKey, _T("DefaultExport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"), + (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::RegCloseKey(hDataKey); + + // Update registered filters + + + _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPXLExportExt); + lRet = ::RegCreateKeyEx(hKey, _T(sTemp), + 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPXLImportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::RegCloseKey(hKey); hKey = NULL; + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + + return HRESULT_FROM_WIN32(lRet); +} + + +STDAPI DllUnregisterServer() +{ + long lRet = 0; + HKEY hKey = NULL; + HKEY hDataKey = NULL; + + TCHAR szClassName[_MAX_PATH] = "\0"; + TCHAR szKeyName[_MAX_PATH] = "\0"; + DWORD dwClassName = _MAX_PATH; + DWORD dwKeyName = _MAX_PATH; + + /* + * Remove HKEY_CLASS_ROOT\CLSID\{XXX} entry for the export and import filters + * + * Windows 95/98/Me allow one step deletion of a key and all subkeys. + * Windows NT/2000/XP do not so the subkeys must be deleted individually. + */ + lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // First up, the Writer export filter + lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPSWExportCLSID, 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)) + != ERROR_NO_MORE_ITEMS) + { + lRet = ::RegDeleteKey(hDataKey, szKeyName); + + ::lstrcpy(szKeyName, "\0"); + ::lstrcpy(szClassName, "\0"); + + dwClassName = _MAX_PATH; + dwKeyName = _MAX_PATH; + } + + ::RegCloseKey(hDataKey); hDataKey = NULL; + + lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPSWExportCLSID); + if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND) + return _signalRegError(lRet, hKey, hDataKey); + + + + // Next, the Writer import filter + lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPSWImportCLSID, 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)) + != ERROR_NO_MORE_ITEMS) + { + lRet = ::RegDeleteKey(hDataKey, szKeyName); + + ::lstrcpy(szKeyName, "\0"); + ::lstrcpy(szClassName, "\0"); + + dwClassName = _MAX_PATH; + dwKeyName = _MAX_PATH; + } + + ::RegCloseKey(hDataKey); hDataKey = NULL; + + lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPSWImportCLSID); + if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND) + return _signalRegError(lRet, hKey, hDataKey); + + + // Next up, the Calc export filter + lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPXLExportCLSID, 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)) + != ERROR_NO_MORE_ITEMS) + { + lRet = ::RegDeleteKey(hDataKey, szKeyName); + + ::lstrcpy(szKeyName, "\0"); + ::lstrcpy(szClassName, "\0"); + + dwClassName = _MAX_PATH; + dwKeyName = _MAX_PATH; + } + + ::RegCloseKey(hDataKey); hDataKey = NULL; + + lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPXLExportCLSID); + if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND) + return _signalRegError(lRet, hKey, hDataKey); + + + // Next, the Calc import filter + lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPXLImportCLSID, 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)) + != ERROR_NO_MORE_ITEMS) + { + lRet = ::RegDeleteKey(hDataKey, szKeyName); + + ::lstrcpy(szKeyName, "\0"); + ::lstrcpy(szClassName, "\0"); + + dwClassName = _MAX_PATH; + dwKeyName = _MAX_PATH; + } + + ::RegCloseKey(hDataKey); hDataKey = NULL; + + lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPXLImportCLSID); + if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND) + return _signalRegError(lRet, hKey, hDataKey); + + ::RegCloseKey(hKey); hKey = NULL; + + + + /* + * Remove the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters + */ + lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), + 0, KEY_ALL_ACCESS, &hKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + + // Remove the Writer export filter from the Writer import file extension subkey. + _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPSWImportExt); + lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPSWExportCLSID); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::lstrcpyn(szKeyName, "\0", _MAX_PATH); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Remove the Writer import filter from the Writer export file extension subkey. + _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPSWExportExt); + lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPSWImportCLSID); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::lstrcpyn(szKeyName, "\0", _MAX_PATH); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Make Binary Copy the default for Writer export file extension subkey DefaultImport + _snprintf(szKeyName, _MAX_PATH, ".%s\0", CXMergeFilter::m_pszPSWExportExt); + lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"), + (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::lstrcpyn(szKeyName, "\0", _MAX_PATH); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Remove the Calc export filter from the Calc import file extension subkey. + _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPXLImportExt); + lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPXLExportCLSID); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::lstrcpyn(szKeyName, "\0", _MAX_PATH); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + // Remove the Calc import filter from the Calc export file extension subkey. + _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPXLExportExt); + lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPXLImportCLSID); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::lstrcpyn(szKeyName, "\0", _MAX_PATH); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + // Make Binary Copy the default for Calc export file extension subkey DefaultImport + _snprintf(szKeyName, _MAX_PATH, ".%s\0", CXMergeFilter::m_pszPXLExportExt); + lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"), + (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); + if (lRet != ERROR_SUCCESS) + return _signalRegError(lRet, hKey, hDataKey); + + ::lstrcpyn(szKeyName, "\0", _MAX_PATH); + ::RegCloseKey(hDataKey); hDataKey = NULL; + + + + ::RegCloseKey(hKey); hKey = NULL; + + return HRESULT_FROM_WIN32(lRet); +} + + +////////////////////////////////////////////////////////////////////// +// CXMergeSyncModule methods +////////////////////////////////////////////////////////////////////// +CXMergeSyncModule::CXMergeSyncModule () +{ +} + +CXMergeSyncModule::~CXMergeSyncModule () +{ +} + +long CXMergeSyncModule::LockServer(BOOL fLock) +{ + if(fLock) + return ::InterlockedIncrement(&m_lLocks); + else + return ::InterlockedDecrement(&m_lLocks); +} + +long CXMergeSyncModule::GetLockCount() +{ + return m_lLocks + m_lObjs; +} + |