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