summaryrefslogtreecommitdiff
path: root/xmerge/source/activesync/XMergeSync.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xmerge/source/activesync/XMergeSync.cpp')
-rw-r--r--xmerge/source/activesync/XMergeSync.cpp837
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;
+}
+