xref: /trunk/main/xmerge/source/activesync/XMergeSync.cpp (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir 
2*cdf0e10cSrcweir #include "stdafx.h"
3*cdf0e10cSrcweir 
4*cdf0e10cSrcweir #include "XMergeFilter.h"
5*cdf0e10cSrcweir #include "XMergeFactory.h"
6*cdf0e10cSrcweir 
7*cdf0e10cSrcweir 
8*cdf0e10cSrcweir CXMergeSyncModule _Module;
9*cdf0e10cSrcweir 
10*cdf0e10cSrcweir 
11*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
12*cdf0e10cSrcweir // DLL Functions
13*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
14*cdf0e10cSrcweir BOOL WINAPI DllMain(HANDLE hInst, ULONG ulReason, LPVOID lpReserved)
15*cdf0e10cSrcweir {
16*cdf0e10cSrcweir     switch (ulReason)
17*cdf0e10cSrcweir     {
18*cdf0e10cSrcweir         case DLL_PROCESS_ATTACH:
19*cdf0e10cSrcweir             _Module.m_hInst = reinterpret_cast<HINSTANCE>(hInst);
20*cdf0e10cSrcweir             break;
21*cdf0e10cSrcweir 
22*cdf0e10cSrcweir         case DLL_PROCESS_DETACH:
23*cdf0e10cSrcweir             _Module.m_hInst = NULL;
24*cdf0e10cSrcweir             break;
25*cdf0e10cSrcweir 
26*cdf0e10cSrcweir         case DLL_THREAD_ATTACH:
27*cdf0e10cSrcweir             break;
28*cdf0e10cSrcweir 
29*cdf0e10cSrcweir         case DLL_THREAD_DETACH:
30*cdf0e10cSrcweir             break;
31*cdf0e10cSrcweir     }
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir     return TRUE;
34*cdf0e10cSrcweir }
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
38*cdf0e10cSrcweir {
39*cdf0e10cSrcweir     // Create the factory object
40*cdf0e10cSrcweir     CXMergeFactory *pFactory = new CXMergeFactory();
41*cdf0e10cSrcweir     if (pFactory == NULL)
42*cdf0e10cSrcweir     {
43*cdf0e10cSrcweir         *ppv = NULL;
44*cdf0e10cSrcweir         return E_OUTOFMEMORY;
45*cdf0e10cSrcweir     }
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir     HRESULT hr = pFactory->QueryInterface(riid, ppv);
48*cdf0e10cSrcweir     pFactory->Release();
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir     return hr;
51*cdf0e10cSrcweir }
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir STDAPI DllCanUnloadNow()
55*cdf0e10cSrcweir {
56*cdf0e10cSrcweir     if (_Module.GetLockCount() == 0)
57*cdf0e10cSrcweir         return S_OK;
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir     return S_FALSE;
60*cdf0e10cSrcweir }
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir // Utility function to close open keys during registration
64*cdf0e10cSrcweir static _signalRegError(long lRet, HKEY hKey, HKEY hDataKey)
65*cdf0e10cSrcweir {
66*cdf0e10cSrcweir     if (hKey)
67*cdf0e10cSrcweir         ::RegCloseKey(hKey);
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir     if (hDataKey)
71*cdf0e10cSrcweir         ::RegCloseKey(hDataKey);
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir     return HRESULT_FROM_WIN32(lRet);
74*cdf0e10cSrcweir }
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir STDAPI DllRegisterServer()
78*cdf0e10cSrcweir {
79*cdf0e10cSrcweir     HKEY hKey = NULL;
80*cdf0e10cSrcweir     HKEY hDataKey = NULL;
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir     long lRet = 0;
83*cdf0e10cSrcweir     TCHAR sTemp[_MAX_PATH + 1] = "\0";
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir     /*
87*cdf0e10cSrcweir      * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Writer export filter.
88*cdf0e10cSrcweir      *
89*cdf0e10cSrcweir      * Note that import are export are relative to the WinCE device, so files are
90*cdf0e10cSrcweir      * exported to the desktop format.
91*cdf0e10cSrcweir      */
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir     // Get a handle to the CLSID key
94*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey);
95*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
96*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir     // Create the CLSID key for the XMergeFilter
99*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPSWExportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);
100*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
101*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportShortDesc,
104*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPSWExportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
105*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
106*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir     // Create the DefaultIcon key.  For the moment, use one of the Async supplied ones
110*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
111*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
112*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"),
115*cdf0e10cSrcweir                             (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"))
116*cdf0e10cSrcweir                                * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
117*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
118*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
119*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);  hDataKey = NULL;
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir     // Create the InprocServer32 key
122*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
123*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
124*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10);
127*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
128*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir     // Create the key for the DLL file.  First find the filename of the dll
131*cdf0e10cSrcweir     if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1)))
132*cdf0e10cSrcweir     {
133*cdf0e10cSrcweir         lRet = ::GetLastError();
134*cdf0e10cSrcweir         if (lRet != ERROR_SUCCESS)
135*cdf0e10cSrcweir             return _signalRegError(lRet, hKey, hDataKey);
136*cdf0e10cSrcweir     }
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp,
140*cdf0e10cSrcweir                 (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
141*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
142*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
143*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir     // Setup the PegasusFilter key values
147*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
148*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
149*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportDesc,
152*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPSWExportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
153*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
154*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("Export"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR)));
158*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
159*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportExt,
163*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPSWExportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
164*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
165*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey = NULL;
169*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir     /*
175*cdf0e10cSrcweir      * Following calls create the entries for the filter in
176*cdf0e10cSrcweir      * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters
177*cdf0e10cSrcweir      */
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"),
180*cdf0e10cSrcweir                 0, KEY_ALL_ACCESS, &hKey);
181*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
182*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir     _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPSWImportExt);
185*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T(sTemp),
186*cdf0e10cSrcweir                 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
187*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
188*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPSWExportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR)));
191*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
192*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
193*cdf0e10cSrcweir 
194*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey = NULL;
195*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
196*cdf0e10cSrcweir 
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir     /*
200*cdf0e10cSrcweir      * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Writer import filter.
201*cdf0e10cSrcweir      *
202*cdf0e10cSrcweir      * Note that import are export are relative to the WinCE device, so files are
203*cdf0e10cSrcweir      * exported to the desktop format.
204*cdf0e10cSrcweir      */
205*cdf0e10cSrcweir     // Get a handle to the CLSID key
206*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey);
207*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
208*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir     // Create the CLSID key for the XMergeFilter
211*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPSWImportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);
212*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
213*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportShortDesc,
216*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPSWImportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
217*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
218*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir     // Create the DefaultIcon key.  For the moment, use one of the Async supplied ones
222*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
223*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
224*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"),
227*cdf0e10cSrcweir                             (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"))
228*cdf0e10cSrcweir                                * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
229*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
230*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
231*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);  hDataKey = NULL;
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir 
234*cdf0e10cSrcweir     // Create the InprocServer32 key
235*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
236*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
237*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
238*cdf0e10cSrcweir 
239*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10);
240*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
241*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir     // Create the key for the DLL file.  First find the filename of the dll
245*cdf0e10cSrcweir     if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1)))
246*cdf0e10cSrcweir     {
247*cdf0e10cSrcweir         lRet = ::GetLastError();
248*cdf0e10cSrcweir         if (lRet != ERROR_SUCCESS)
249*cdf0e10cSrcweir             return _signalRegError(lRet, hKey, hDataKey);
250*cdf0e10cSrcweir     }
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir 
253*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp,
254*cdf0e10cSrcweir                 (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
255*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
256*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
257*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir     // Setup the PegasusFilter key values
261*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
262*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
263*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
264*cdf0e10cSrcweir 
265*cdf0e10cSrcweir         lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportDesc,
266*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
267*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
268*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir 
271*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("Import"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR)));
272*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
273*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir 
276*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportExt,
277*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPSWImportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
278*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
279*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey = NULL;
283*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir     /*
287*cdf0e10cSrcweir      * Following calls create the entries for the filter in
288*cdf0e10cSrcweir      * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters
289*cdf0e10cSrcweir      */
290*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"),
291*cdf0e10cSrcweir                 0, KEY_ALL_ACCESS, &hKey);
292*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
293*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
294*cdf0e10cSrcweir 
295*cdf0e10cSrcweir     // Add in defaults for import and export
296*cdf0e10cSrcweir     _snprintf(sTemp, _MAX_PATH +1, "%c%s\0", '.', CXMergeFilter::m_pszPSWExportExt);
297*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
298*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
299*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ,
302*cdf0e10cSrcweir                             (LPBYTE)CXMergeFilter::m_pszPSWImportCLSID,
303*cdf0e10cSrcweir                             (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
304*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
305*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
306*cdf0e10cSrcweir 
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("DefaultExport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"),
309*cdf0e10cSrcweir                             (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
310*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
311*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir     // Update registered filters
316*cdf0e10cSrcweir     _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPSWExportExt);
317*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T(sTemp),
318*cdf0e10cSrcweir                 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
319*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
320*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
321*cdf0e10cSrcweir 
322*cdf0e10cSrcweir 
323*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPSWImportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR)));
324*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
325*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey = NULL;
328*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
329*cdf0e10cSrcweir 
330*cdf0e10cSrcweir 
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir     /*
333*cdf0e10cSrcweir      * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Calc export filter.
334*cdf0e10cSrcweir      *
335*cdf0e10cSrcweir      * Note that import are export are relative to the WinCE device, so files are
336*cdf0e10cSrcweir      * exported to the desktop format.
337*cdf0e10cSrcweir      */
338*cdf0e10cSrcweir 
339*cdf0e10cSrcweir     // Get a handle to the CLSID key
340*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey);
341*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
342*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
343*cdf0e10cSrcweir 
344*cdf0e10cSrcweir     // Create the CLSID key for the XMerge Filter
345*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPXLExportCLSID, 0, _T(""),
346*cdf0e10cSrcweir                                 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);
347*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
348*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
349*cdf0e10cSrcweir 
350*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportShortDesc,
351*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPXLExportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
352*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
353*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
354*cdf0e10cSrcweir 
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir     // Create the DefaultIcon key.  For the moment, use one of the Async supplied ones
357*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
358*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
359*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"),
362*cdf0e10cSrcweir                             (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"))
363*cdf0e10cSrcweir                                * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
364*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
365*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
366*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);  hDataKey = NULL;
367*cdf0e10cSrcweir 
368*cdf0e10cSrcweir 
369*cdf0e10cSrcweir     // Create the InprocServer32 key
370*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
371*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
372*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
373*cdf0e10cSrcweir 
374*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10);
375*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
376*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir     // Create the key for the DLL file.  First find the filename of the dll
380*cdf0e10cSrcweir     if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1)))
381*cdf0e10cSrcweir     {
382*cdf0e10cSrcweir         lRet = ::GetLastError();
383*cdf0e10cSrcweir         if (lRet != ERROR_SUCCESS)
384*cdf0e10cSrcweir             return _signalRegError(lRet, hKey, hDataKey);
385*cdf0e10cSrcweir     }
386*cdf0e10cSrcweir 
387*cdf0e10cSrcweir 
388*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp,
389*cdf0e10cSrcweir                 (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
390*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
391*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
392*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
393*cdf0e10cSrcweir 
394*cdf0e10cSrcweir 
395*cdf0e10cSrcweir     // Setup the PegasusFilter key values
396*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
397*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
398*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir         lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportDesc,
401*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPXLExportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
402*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
403*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
404*cdf0e10cSrcweir 
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("Export"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR)));
407*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
408*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
409*cdf0e10cSrcweir 
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportExt,
412*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPXLExportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
413*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
414*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
415*cdf0e10cSrcweir 
416*cdf0e10cSrcweir 
417*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey = NULL;
418*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
419*cdf0e10cSrcweir 
420*cdf0e10cSrcweir 
421*cdf0e10cSrcweir 
422*cdf0e10cSrcweir 
423*cdf0e10cSrcweir     /*
424*cdf0e10cSrcweir      * Following calls create the entries for the filter in
425*cdf0e10cSrcweir      * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters
426*cdf0e10cSrcweir      */
427*cdf0e10cSrcweir 
428*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"),
429*cdf0e10cSrcweir                 0, KEY_ALL_ACCESS, &hKey);
430*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
431*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
432*cdf0e10cSrcweir 
433*cdf0e10cSrcweir     _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPXLImportExt);
434*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T(sTemp),
435*cdf0e10cSrcweir                 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
436*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
437*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPXLExportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR)));
440*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
441*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
442*cdf0e10cSrcweir 
443*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey = NULL;
444*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
445*cdf0e10cSrcweir 
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir 
448*cdf0e10cSrcweir     /*
449*cdf0e10cSrcweir      * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Calc import filter.
450*cdf0e10cSrcweir      *
451*cdf0e10cSrcweir      * Note that import are export are relative to the WinCE device, so files are
452*cdf0e10cSrcweir      * exported to the desktop format.
453*cdf0e10cSrcweir      */
454*cdf0e10cSrcweir     // Get a handle to the CLSID key
455*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey);
456*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
457*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
458*cdf0e10cSrcweir 
459*cdf0e10cSrcweir 
460*cdf0e10cSrcweir     // Create the CLSID key for the XMergeFilter
461*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPXLImportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);
462*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
463*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
464*cdf0e10cSrcweir 
465*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportShortDesc,
466*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPXLImportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
467*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
468*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
469*cdf0e10cSrcweir 
470*cdf0e10cSrcweir     // Create the DefaultIcon key.  For the moment, use one of the Async supplied ones
471*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
472*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
473*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
474*cdf0e10cSrcweir 
475*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"),
476*cdf0e10cSrcweir                             (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"))
477*cdf0e10cSrcweir                                * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
478*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
479*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
480*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);  hDataKey = NULL;
481*cdf0e10cSrcweir 
482*cdf0e10cSrcweir 
483*cdf0e10cSrcweir     // Create the InprocServer32 key
484*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
485*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
486*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
487*cdf0e10cSrcweir 
488*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10);
489*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
490*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir 
493*cdf0e10cSrcweir     // Create the key for the DLL file.  First find the filename of the dll
494*cdf0e10cSrcweir     if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1)))
495*cdf0e10cSrcweir     {
496*cdf0e10cSrcweir         lRet = ::GetLastError();
497*cdf0e10cSrcweir         if (lRet != ERROR_SUCCESS)
498*cdf0e10cSrcweir             return _signalRegError(lRet, hKey, hDataKey);
499*cdf0e10cSrcweir     }
500*cdf0e10cSrcweir 
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp,
503*cdf0e10cSrcweir                 (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
504*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
505*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
506*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
507*cdf0e10cSrcweir 
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir     // Setup the PegasusFilter key values
510*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
511*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
512*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir         lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportDesc,
515*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPXLImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
516*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
517*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
518*cdf0e10cSrcweir 
519*cdf0e10cSrcweir 
520*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("Import"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR)));
521*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
522*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir 
525*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportExt,
526*cdf0e10cSrcweir                 (::_tcslen(CXMergeFilter::m_pszPXLImportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
527*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
528*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
529*cdf0e10cSrcweir 
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey = NULL;
532*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
533*cdf0e10cSrcweir 
534*cdf0e10cSrcweir 
535*cdf0e10cSrcweir 
536*cdf0e10cSrcweir     /*
537*cdf0e10cSrcweir      * Following calls create the entries for the filter in
538*cdf0e10cSrcweir      * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters
539*cdf0e10cSrcweir      */
540*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"),
541*cdf0e10cSrcweir                 0, KEY_ALL_ACCESS, &hKey);
542*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
543*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir     // Add in defaults for import and export
546*cdf0e10cSrcweir     _snprintf(sTemp, _MAX_PATH +1, "%c%s\0", '.', CXMergeFilter::m_pszPXLExportExt);
547*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
548*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
549*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ,
552*cdf0e10cSrcweir                             (LPBYTE)CXMergeFilter::m_pszPXLImportCLSID,
553*cdf0e10cSrcweir                             (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
554*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
555*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("DefaultExport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"),
559*cdf0e10cSrcweir                             (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
560*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
561*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
562*cdf0e10cSrcweir 
563*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir     // Update registered filters
566*cdf0e10cSrcweir 
567*cdf0e10cSrcweir 
568*cdf0e10cSrcweir     _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPXLExportExt);
569*cdf0e10cSrcweir     lRet = ::RegCreateKeyEx(hKey, _T(sTemp),
570*cdf0e10cSrcweir                 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL);
571*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
572*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPXLImportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR)));
575*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
576*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey = NULL;
579*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
580*cdf0e10cSrcweir 
581*cdf0e10cSrcweir 
582*cdf0e10cSrcweir 
583*cdf0e10cSrcweir     return HRESULT_FROM_WIN32(lRet);
584*cdf0e10cSrcweir }
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir 
587*cdf0e10cSrcweir STDAPI DllUnregisterServer()
588*cdf0e10cSrcweir {
589*cdf0e10cSrcweir     long lRet = 0;
590*cdf0e10cSrcweir     HKEY hKey = NULL;
591*cdf0e10cSrcweir     HKEY hDataKey = NULL;
592*cdf0e10cSrcweir 
593*cdf0e10cSrcweir     TCHAR szClassName[_MAX_PATH] = "\0";
594*cdf0e10cSrcweir     TCHAR szKeyName[_MAX_PATH]   = "\0";
595*cdf0e10cSrcweir     DWORD dwClassName            = _MAX_PATH;
596*cdf0e10cSrcweir     DWORD dwKeyName              = _MAX_PATH;
597*cdf0e10cSrcweir 
598*cdf0e10cSrcweir     /*
599*cdf0e10cSrcweir      * Remove HKEY_CLASS_ROOT\CLSID\{XXX} entry for the export and import filters
600*cdf0e10cSrcweir      *
601*cdf0e10cSrcweir      * Windows 95/98/Me allow one step deletion of a key and all subkeys.
602*cdf0e10cSrcweir      * Windows NT/2000/XP do not so the subkeys must be deleted individually.
603*cdf0e10cSrcweir      */
604*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey);
605*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
606*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
607*cdf0e10cSrcweir 
608*cdf0e10cSrcweir 
609*cdf0e10cSrcweir     // First up, the Writer export filter
610*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPSWExportCLSID, 0, KEY_ALL_ACCESS, &hDataKey);
611*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
612*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir 
615*cdf0e10cSrcweir     while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL))
616*cdf0e10cSrcweir                 != ERROR_NO_MORE_ITEMS)
617*cdf0e10cSrcweir     {
618*cdf0e10cSrcweir         lRet = ::RegDeleteKey(hDataKey, szKeyName);
619*cdf0e10cSrcweir 
620*cdf0e10cSrcweir         ::lstrcpy(szKeyName, "\0");
621*cdf0e10cSrcweir         ::lstrcpy(szClassName, "\0");
622*cdf0e10cSrcweir 
623*cdf0e10cSrcweir         dwClassName = _MAX_PATH;
624*cdf0e10cSrcweir         dwKeyName   = _MAX_PATH;
625*cdf0e10cSrcweir     }
626*cdf0e10cSrcweir 
627*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);  hDataKey = NULL;
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir     lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPSWExportCLSID);
630*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND)
631*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir 
634*cdf0e10cSrcweir 
635*cdf0e10cSrcweir     // Next, the Writer import filter
636*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPSWImportCLSID, 0, KEY_ALL_ACCESS, &hDataKey);
637*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
638*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
639*cdf0e10cSrcweir 
640*cdf0e10cSrcweir 
641*cdf0e10cSrcweir     while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL))
642*cdf0e10cSrcweir                 != ERROR_NO_MORE_ITEMS)
643*cdf0e10cSrcweir     {
644*cdf0e10cSrcweir         lRet = ::RegDeleteKey(hDataKey, szKeyName);
645*cdf0e10cSrcweir 
646*cdf0e10cSrcweir         ::lstrcpy(szKeyName, "\0");
647*cdf0e10cSrcweir         ::lstrcpy(szClassName, "\0");
648*cdf0e10cSrcweir 
649*cdf0e10cSrcweir         dwClassName = _MAX_PATH;
650*cdf0e10cSrcweir         dwKeyName   = _MAX_PATH;
651*cdf0e10cSrcweir     }
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);  hDataKey = NULL;
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir     lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPSWImportCLSID);
656*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND)
657*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
658*cdf0e10cSrcweir 
659*cdf0e10cSrcweir 
660*cdf0e10cSrcweir     // Next up, the Calc export filter
661*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPXLExportCLSID, 0, KEY_ALL_ACCESS, &hDataKey);
662*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
663*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir 
666*cdf0e10cSrcweir     while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL))
667*cdf0e10cSrcweir                 != ERROR_NO_MORE_ITEMS)
668*cdf0e10cSrcweir     {
669*cdf0e10cSrcweir         lRet = ::RegDeleteKey(hDataKey, szKeyName);
670*cdf0e10cSrcweir 
671*cdf0e10cSrcweir         ::lstrcpy(szKeyName, "\0");
672*cdf0e10cSrcweir         ::lstrcpy(szClassName, "\0");
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir         dwClassName = _MAX_PATH;
675*cdf0e10cSrcweir         dwKeyName   = _MAX_PATH;
676*cdf0e10cSrcweir     }
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);  hDataKey = NULL;
679*cdf0e10cSrcweir 
680*cdf0e10cSrcweir     lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPXLExportCLSID);
681*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND)
682*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
683*cdf0e10cSrcweir 
684*cdf0e10cSrcweir 
685*cdf0e10cSrcweir     // Next, the Calc import filter
686*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPXLImportCLSID, 0, KEY_ALL_ACCESS, &hDataKey);
687*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
688*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir 
691*cdf0e10cSrcweir     while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL))
692*cdf0e10cSrcweir                 != ERROR_NO_MORE_ITEMS)
693*cdf0e10cSrcweir     {
694*cdf0e10cSrcweir         lRet = ::RegDeleteKey(hDataKey, szKeyName);
695*cdf0e10cSrcweir 
696*cdf0e10cSrcweir         ::lstrcpy(szKeyName, "\0");
697*cdf0e10cSrcweir         ::lstrcpy(szClassName, "\0");
698*cdf0e10cSrcweir 
699*cdf0e10cSrcweir         dwClassName = _MAX_PATH;
700*cdf0e10cSrcweir         dwKeyName   = _MAX_PATH;
701*cdf0e10cSrcweir     }
702*cdf0e10cSrcweir 
703*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);  hDataKey = NULL;
704*cdf0e10cSrcweir 
705*cdf0e10cSrcweir     lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPXLImportCLSID);
706*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND)
707*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
708*cdf0e10cSrcweir 
709*cdf0e10cSrcweir     ::RegCloseKey(hKey);  hKey = NULL;
710*cdf0e10cSrcweir 
711*cdf0e10cSrcweir 
712*cdf0e10cSrcweir 
713*cdf0e10cSrcweir     /*
714*cdf0e10cSrcweir      * Remove the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters
715*cdf0e10cSrcweir      */
716*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"),
717*cdf0e10cSrcweir                             0, KEY_ALL_ACCESS, &hKey);
718*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
719*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
720*cdf0e10cSrcweir 
721*cdf0e10cSrcweir 
722*cdf0e10cSrcweir     // Remove the Writer export filter from the Writer import file extension subkey.
723*cdf0e10cSrcweir     _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPSWImportExt);
724*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey);
725*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
726*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
727*cdf0e10cSrcweir 
728*cdf0e10cSrcweir     lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPSWExportCLSID);
729*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
730*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
731*cdf0e10cSrcweir 
732*cdf0e10cSrcweir     ::lstrcpyn(szKeyName, "\0", _MAX_PATH);
733*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
734*cdf0e10cSrcweir 
735*cdf0e10cSrcweir 
736*cdf0e10cSrcweir     // Remove the Writer import filter from the Writer export file extension subkey.
737*cdf0e10cSrcweir     _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPSWExportExt);
738*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey);
739*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
740*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
741*cdf0e10cSrcweir 
742*cdf0e10cSrcweir     lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPSWImportCLSID);
743*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
744*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
745*cdf0e10cSrcweir 
746*cdf0e10cSrcweir     ::lstrcpyn(szKeyName, "\0", _MAX_PATH);
747*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir 
750*cdf0e10cSrcweir     // Make Binary Copy the default for Writer export file extension subkey DefaultImport
751*cdf0e10cSrcweir     _snprintf(szKeyName, _MAX_PATH, ".%s\0", CXMergeFilter::m_pszPSWExportExt);
752*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey);
753*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
754*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
755*cdf0e10cSrcweir 
756*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"),
757*cdf0e10cSrcweir                             (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
758*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
759*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
760*cdf0e10cSrcweir 
761*cdf0e10cSrcweir     ::lstrcpyn(szKeyName, "\0", _MAX_PATH);
762*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
763*cdf0e10cSrcweir 
764*cdf0e10cSrcweir 
765*cdf0e10cSrcweir     // Remove the Calc export filter from the Calc import file extension subkey.
766*cdf0e10cSrcweir     _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPXLImportExt);
767*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey);
768*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
769*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
770*cdf0e10cSrcweir 
771*cdf0e10cSrcweir     lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPXLExportCLSID);
772*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
773*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
774*cdf0e10cSrcweir 
775*cdf0e10cSrcweir     ::lstrcpyn(szKeyName, "\0", _MAX_PATH);
776*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
777*cdf0e10cSrcweir 
778*cdf0e10cSrcweir     // Remove the Calc import filter from the Calc export file extension subkey.
779*cdf0e10cSrcweir     _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPXLExportExt);
780*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey);
781*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
782*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
783*cdf0e10cSrcweir 
784*cdf0e10cSrcweir     lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPXLImportCLSID);
785*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
786*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
787*cdf0e10cSrcweir 
788*cdf0e10cSrcweir     ::lstrcpyn(szKeyName, "\0", _MAX_PATH);
789*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
790*cdf0e10cSrcweir 
791*cdf0e10cSrcweir 
792*cdf0e10cSrcweir     // Make Binary Copy the default for Calc export file extension subkey DefaultImport
793*cdf0e10cSrcweir     _snprintf(szKeyName, _MAX_PATH, ".%s\0", CXMergeFilter::m_pszPXLExportExt);
794*cdf0e10cSrcweir     lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey);
795*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
796*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
797*cdf0e10cSrcweir 
798*cdf0e10cSrcweir     lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"),
799*cdf0e10cSrcweir                             (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR))));
800*cdf0e10cSrcweir     if (lRet != ERROR_SUCCESS)
801*cdf0e10cSrcweir         return _signalRegError(lRet, hKey, hDataKey);
802*cdf0e10cSrcweir 
803*cdf0e10cSrcweir     ::lstrcpyn(szKeyName, "\0", _MAX_PATH);
804*cdf0e10cSrcweir     ::RegCloseKey(hDataKey);    hDataKey = NULL;
805*cdf0e10cSrcweir 
806*cdf0e10cSrcweir 
807*cdf0e10cSrcweir 
808*cdf0e10cSrcweir     ::RegCloseKey(hKey);        hKey     = NULL;
809*cdf0e10cSrcweir 
810*cdf0e10cSrcweir     return HRESULT_FROM_WIN32(lRet);
811*cdf0e10cSrcweir }
812*cdf0e10cSrcweir 
813*cdf0e10cSrcweir 
814*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
815*cdf0e10cSrcweir // CXMergeSyncModule methods
816*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
817*cdf0e10cSrcweir CXMergeSyncModule::CXMergeSyncModule ()
818*cdf0e10cSrcweir {
819*cdf0e10cSrcweir }
820*cdf0e10cSrcweir 
821*cdf0e10cSrcweir CXMergeSyncModule::~CXMergeSyncModule ()
822*cdf0e10cSrcweir {
823*cdf0e10cSrcweir }
824*cdf0e10cSrcweir 
825*cdf0e10cSrcweir long CXMergeSyncModule::LockServer(BOOL fLock)
826*cdf0e10cSrcweir {
827*cdf0e10cSrcweir     if(fLock)
828*cdf0e10cSrcweir         return ::InterlockedIncrement(&m_lLocks);
829*cdf0e10cSrcweir     else
830*cdf0e10cSrcweir         return ::InterlockedDecrement(&m_lLocks);
831*cdf0e10cSrcweir }
832*cdf0e10cSrcweir 
833*cdf0e10cSrcweir long CXMergeSyncModule::GetLockCount()
834*cdf0e10cSrcweir {
835*cdf0e10cSrcweir     return m_lLocks + m_lObjs;
836*cdf0e10cSrcweir }
837*cdf0e10cSrcweir 
838