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 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_extensions.hxx" 26 #include <sal/types.h> 27 #include <rtl/memory.h> 28 #ifndef _RTL_WSTRING_ 29 #include <rtl/wstring> 30 #endif 31 #include <vos/macros.hxx> 32 33 #ifndef _USR_SMARTSERVICES_HXX_ 34 #include <usr/smartservices.hxx> 35 #endif 36 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 37 #include <com/sun/star/io/XInputStream.hpp> 38 #include <com/sun/star/io/XOutputStream.hpp> 39 #include <com/sun/star/pgp/RecipientsEvent.hpp> 40 #include <com/sun/star/pgp/SignatureEvent.hpp> 41 #include <com/sun/star/pgp/XPGPDecoder.hpp> 42 #include <com/sun/star/pgp/XPGPDecoderListener.hpp> 43 #include <com/sun/star/pgp/XPGPEncoder.hpp> 44 #include <com/sun/star/pgp/XPGPPreferences.hpp> 45 #include <com/sun/star/uno/XInterface.hpp> 46 #include <com/sun/star/uno/Any.h> 47 #include <com/sun/star/uno/Reference.h> 48 #include <com/sun/star/uno/Sequence.hxx> 49 #include <cppuhelper/weak.hxx> 50 51 #include <stdio.h> 52 #include <stdlib.h> 53 #include <string.h> 54 55 #include <fcntl.h> 56 #include <io.h> 57 58 using namespace com::sun::star::lang; 59 using namespace com::sun::star::io; 60 using namespace com::sun::star::pgp; 61 using namespace com::sun::star::uno; 62 63 /*======================================================================== 64 * 65 * DataSource_Impl interface. 66 * 67 *======================================================================*/ 68 class DataSource_Impl : 69 public OWeakObject, 70 public XInputStream 71 { 72 Sequence<sal_Int8> m_buffer; 73 sal_Int32 m_position; 74 int m_fd; 75 76 public: 77 DataSource_Impl (int fd = 0); 78 virtual ~DataSource_Impl (void); 79 80 void setBuffer (const Sequence<sal_Int8> &rBuffer); 81 82 /** XInterface. 83 */ 84 virtual sal_Bool SAL_CALL queryInterface ( 85 const Uik &rUik, Any &rIfc) throw(RuntimeException); 86 87 virtual void SAL_CALL acquire (void) throw(RuntimeException); 88 89 virtual void SAL_CALL release (void) throw(RuntimeException); 90 91 /** XInputStream. 92 */ 93 virtual sal_Int32 SAL_CALL readBytes ( 94 Sequence<sal_Int8> &rData, sal_Int32 nBytesToRead) 95 throw (NotConnectedException, 96 BufferSizeExceededException, 97 IOException); 98 99 virtual sal_Int32 SAL_CALL readSomeBytes ( 100 Sequence<sal_Int8> &rData, sal_Int32 nMaxBytesToRead) 101 throw (NotConnectedException, 102 BufferSizeExceededException, 103 IOException); 104 105 virtual void SAL_CALL skipBytes (sal_Int32 nBytesToSkip) 106 throw (NotConnectedException, 107 BufferSizeExceededException, 108 IOException); 109 110 virtual sal_Int32 SAL_CALL available (void) 111 throw (NotConnectedException, IOException); 112 113 virtual void SAL_CALL closeInput (void) 114 throw (NotConnectedException, IOException); 115 }; 116 117 /*======================================================================== 118 * 119 * DataSink_Impl interface. 120 * 121 *======================================================================*/ 122 class DataSink_Impl : 123 public OWeakObject, 124 public XOutputStream 125 { 126 Sequence<sal_Int8> m_buffer; 127 128 public: 129 DataSink_Impl (void); 130 virtual ~DataSink_Impl (void); 131 132 const Sequence<sal_Int8>& getBuffer (void) const { return m_buffer; } 133 134 /** XInterface. 135 */ 136 virtual sal_Bool SAL_CALL queryInterface ( 137 const Uik &rUik, Any &rIfc) throw(RuntimeException); 138 139 virtual void SAL_CALL acquire (void) throw(RuntimeException); 140 virtual void SAL_CALL release (void) throw(RuntimeException); 141 142 /** XOutputStream. 143 */ 144 virtual void SAL_CALL writeBytes ( 145 const Sequence<sal_Int8> &rBuffer) 146 throw (NotConnectedException, 147 BufferSizeExceededException, 148 IOException); 149 150 virtual void SAL_CALL flush (void) 151 throw (NotConnectedException, 152 BufferSizeExceededException, 153 IOException); 154 155 virtual void SAL_CALL closeOutput (void) 156 throw (NotConnectedException, 157 BufferSizeExceededException, 158 IOException); 159 }; 160 161 /*======================================================================== 162 * 163 * DecoderListener_Impl interface. 164 * 165 *======================================================================*/ 166 class DecoderListener_Impl : 167 public OWeakObject, 168 public XPGPDecoderListener 169 { 170 public: 171 DecoderListener_Impl (void); 172 virtual ~DecoderListener_Impl (void); 173 174 /** XInterface. 175 */ 176 virtual sal_Bool SAL_CALL queryInterface ( 177 const Uik &rUik, Any &rIfc) throw(RuntimeException); 178 179 virtual void SAL_CALL acquire (void) throw(RuntimeException); 180 181 virtual void SAL_CALL release (void) throw(RuntimeException); 182 183 /** XEventListener. 184 */ 185 virtual void SAL_CALL disposing (const EventObject &rSource); 186 187 /** XPGPDecoderListener. 188 */ 189 virtual void SAL_CALL decrypted (const RecipientsEvent &rEvent); 190 virtual void SAL_CALL verified (const SignatureEvent &rEvent); 191 }; 192 193 /*======================================================================== 194 * 195 * DataSource_Impl implementation. 196 * 197 *======================================================================*/ 198 /* 199 * DataSource_Impl. 200 */ 201 DataSource_Impl::DataSource_Impl (int fd) 202 : m_fd (fd), m_position (0) 203 { 204 } 205 206 /* 207 * ~DataSource_Impl. 208 */ 209 DataSource_Impl::~DataSource_Impl (void) 210 { 211 } 212 213 /* 214 * DataSource_Impl: setBuffer. 215 */ 216 void DataSource_Impl::setBuffer (const Sequence<sal_Int8> &rBuffer) 217 { 218 m_buffer = rBuffer; 219 if (!m_buffer.getLength()) 220 { 221 // Fill buffer from file descriptor. 222 char buffer[1024]; 223 rtl_zeroMemory (buffer, sizeof(buffer)); 224 225 int k = read (m_fd, buffer, sizeof(buffer)); 226 while (k > 0) 227 { 228 sal_Int32 n = m_buffer.getLength(); 229 m_buffer.realloc (n + k); 230 231 rtl_copyMemory (m_buffer.getArray() + n, buffer, k); 232 n += k; 233 234 rtl_zeroMemory (buffer, k); 235 k = read (m_fd, buffer, sizeof(buffer)); 236 } 237 } 238 m_position = 0; 239 } 240 241 /* 242 * XInterface: queryInterface. 243 */ 244 sal_Bool SAL_CALL DataSource_Impl::queryInterface ( 245 const Uik &rUik, Any &rIfc) throw(RuntimeException) 246 { 247 if (com::sun::star::uno::queryInterface ( 248 rUik, rIfc, 249 SAL_STATIC_CAST (XInputStream*, this))) 250 return sal_True; 251 else 252 return OWeakObject::queryInterface (rUik, rIfc); 253 } 254 255 /* 256 * XInterface: acquire. 257 */ 258 void SAL_CALL DataSource_Impl::acquire (void) throw(RuntimeException) 259 { 260 OWeakObject::acquire(); 261 } 262 263 /* 264 * XInterface: release. 265 */ 266 void SAL_CALL DataSource_Impl::release (void) throw(RuntimeException) 267 { 268 OWeakObject::release(); 269 } 270 271 /* 272 * XInputStream: readBytes. 273 */ 274 sal_Int32 SAL_CALL DataSource_Impl::readBytes ( 275 Sequence<sal_Int8> &rData, sal_Int32 nBytesToRead) 276 throw (NotConnectedException, BufferSizeExceededException, IOException) 277 { 278 if (nBytesToRead < 0) 279 throw IOException(); 280 281 sal_Int32 k = m_buffer.getLength() - m_position; 282 k = VOS_BOUND(k, 0, nBytesToRead); 283 if (k > 0) 284 { 285 rData.realloc(k); 286 rtl_copyMemory ( 287 rData.getArray(), m_buffer.getConstArray() + m_position, k); 288 m_position += k; 289 } 290 return k; 291 } 292 293 /* 294 * XInputStream: readSomeBytes. 295 */ 296 sal_Int32 SAL_CALL DataSource_Impl::readSomeBytes ( 297 Sequence<sal_Int8> &rData, sal_Int32 nMaxBytesToRead) 298 throw (NotConnectedException, BufferSizeExceededException, IOException) 299 { 300 return readBytes (rData, nMaxBytesToRead); 301 } 302 303 /* 304 * XInputStream: skipBytes. 305 */ 306 void SAL_CALL DataSource_Impl::skipBytes (sal_Int32 nBytesToSkip) 307 throw (NotConnectedException, BufferSizeExceededException, IOException) 308 { 309 if (nBytesToSkip < 0) 310 throw IOException(); 311 312 m_position += nBytesToSkip; 313 } 314 315 /* 316 * XInputStream: available. 317 */ 318 sal_Int32 SAL_CALL DataSource_Impl::available (void) 319 throw (NotConnectedException, IOException) 320 { 321 sal_Int32 k = m_buffer.getLength() - m_position; 322 return ((k > 0) ? k : 0); 323 } 324 325 /* 326 * XInputStream: closeInput. 327 */ 328 void SAL_CALL DataSource_Impl::closeInput (void) 329 throw (NotConnectedException, IOException) 330 { 331 } 332 333 /*======================================================================== 334 * 335 * DataSink_Impl implementation. 336 * 337 *======================================================================*/ 338 /* 339 * DataSink_Impl. 340 */ 341 DataSink_Impl::DataSink_Impl (void) 342 { 343 } 344 345 /* 346 * ~DataSink_Impl. 347 */ 348 DataSink_Impl::~DataSink_Impl (void) 349 { 350 } 351 352 /* 353 * XInterface: queryInterface. 354 */ 355 sal_Bool SAL_CALL DataSink_Impl::queryInterface ( 356 const Uik &rUik, Any &rIfc) throw(RuntimeException) 357 { 358 if (com::sun::star::uno::queryInterface ( 359 rUik, rIfc, 360 SAL_STATIC_CAST (XOutputStream*, this))) 361 return sal_True; 362 else 363 return OWeakObject::queryInterface (rUik, rIfc); 364 } 365 366 /* 367 * XInterface: acquire. 368 */ 369 void SAL_CALL DataSink_Impl::acquire (void) throw(RuntimeException) 370 { 371 OWeakObject::acquire(); 372 } 373 374 /* 375 * XInterface: release. 376 */ 377 void SAL_CALL DataSink_Impl::release (void) throw(RuntimeException) 378 { 379 OWeakObject::release(); 380 } 381 382 /* 383 * XOutputStream: writeBytes. 384 */ 385 void SAL_CALL DataSink_Impl::writeBytes (const Sequence<sal_Int8> &rBuffer) 386 throw (NotConnectedException, BufferSizeExceededException, IOException) 387 { 388 if (rBuffer.getLength()) 389 { 390 sal_Int32 n = m_buffer.getLength(); 391 m_buffer.realloc (n + rBuffer.getLength()); 392 393 rtl_copyMemory ( 394 m_buffer.getArray() + n, 395 rBuffer.getConstArray(), 396 rBuffer.getLength()); 397 } 398 } 399 400 /* 401 * XOutputStream: flush. 402 */ 403 void SAL_CALL DataSink_Impl::flush (void) 404 throw (NotConnectedException, BufferSizeExceededException, IOException) 405 { 406 if (m_buffer.getLength()) 407 { 408 // Write data to stdout. 409 const sal_Int8 *pData = m_buffer.getConstArray(); 410 sal_Int32 nData = m_buffer.getLength(); 411 412 int prev = ::setmode (1, O_BINARY); 413 if (!(prev < 0)) 414 { 415 int k = ::write (1, pData, nData); 416 if (k > 0) 417 ::write (1, "\n", 1); 418 ::setmode (1, prev); 419 } 420 } 421 } 422 423 /* 424 * XOutputStream: closeOutput. 425 */ 426 void SAL_CALL DataSink_Impl::closeOutput (void) 427 throw (NotConnectedException, BufferSizeExceededException, IOException) 428 { 429 flush(); 430 } 431 432 /*======================================================================== 433 * 434 * DecoderListener_Impl implementation. 435 * 436 *======================================================================*/ 437 /* 438 * DecoderListener_Impl. 439 */ 440 DecoderListener_Impl::DecoderListener_Impl (void) 441 { 442 } 443 444 /* 445 * ~DecoderListener_Impl. 446 */ 447 DecoderListener_Impl::~DecoderListener_Impl (void) 448 { 449 } 450 451 /* 452 * XInterface: queryInterface. 453 */ 454 sal_Bool SAL_CALL DecoderListener_Impl::queryInterface ( 455 const Uik &rUik, Any &rIfc) throw(RuntimeException) 456 { 457 if (com::sun::star::uno::queryInterface ( 458 rUik, rIfc, 459 SAL_STATIC_CAST (XEventListener*, this), 460 SAL_STATIC_CAST (XPGPDecoderListener*, this))) 461 return sal_True; 462 else 463 return OWeakObject::queryInterface (rUik, rIfc); 464 } 465 466 /* 467 * XInterface: acquire. 468 */ 469 void SAL_CALL DecoderListener_Impl::acquire (void) throw(RuntimeException) 470 { 471 OWeakObject::acquire(); 472 } 473 474 /* 475 * XInterface: release. 476 */ 477 void SAL_CALL DecoderListener_Impl::release (void) throw(RuntimeException) 478 { 479 OWeakObject::release(); 480 } 481 482 /* 483 * XEventListener: disposing. 484 */ 485 void SAL_CALL DecoderListener_Impl::disposing (const EventObject &rSource) 486 { 487 } 488 489 /* 490 * XPGPDecoderListener: decrypted. 491 */ 492 void SAL_CALL DecoderListener_Impl::decrypted (const RecipientsEvent &rEvent) 493 { 494 } 495 496 /* 497 * XPGPDecoderListener: verified. 498 */ 499 void SAL_CALL DecoderListener_Impl::verified (const SignatureEvent &rEvent) 500 { 501 } 502 503 /*======================================================================== 504 * 505 * Main. 506 * 507 *======================================================================*/ 508 inline rtl::OWString S2U (const sal_Char *ascii) 509 { 510 return rtl::OWString::createFromAscii (ascii); 511 } 512 513 #if 0 /* OLD */ 514 515 /* 516 * queryModuleActivator. 517 */ 518 BOOL queryModuleActivator ( 519 const XServiceManagerRef &rxManager, 520 XServiceActivatorRef &rxActivator) 521 { 522 XServiceProviderRef xProv; 523 XInterfaceRef xProvInst; 524 525 xProv = rxManager->queryServiceProvider ( 526 L"stardiv.uno.ServiceActivator.module"); 527 if (!xProv.is()) 528 { 529 printf ("Error: no ServiceActivator service.\n"); 530 return FALSE; 531 } 532 533 xProvInst = xProv->createInstance(); 534 if (!xProvInst.is()) 535 { 536 printf ("Error: no ServiceActivator instance.\n"); 537 return FALSE; 538 } 539 540 return xProvInst->queryInterface ( 541 XServiceActivator::getSmartUik(), rxActivator); 542 } 543 544 /* 545 * install. 546 */ 547 BOOL install ( 548 const XServiceActivatorRef &rxActivator, 549 const char *prefix) 550 { 551 String aModule ("module://"); 552 char pBuffer[1024]; 553 554 vos::ORealDynamicLoader::computeModuleName ( 555 prefix, pBuffer, sizeof(pBuffer)); 556 aModule += pBuffer; 557 558 return rxActivator->install ( 559 StringToUString (aModule, CHARSET_SYSTEM)); 560 } 561 562 /* 563 * uninstall. 564 */ 565 BOOL uninstall ( 566 const XServiceActivatorRef &rxActivator, 567 const char *prefix) 568 { 569 String aModule ("module://"); 570 char pBuffer[1024]; 571 572 vos::ORealDynamicLoader::computeModuleName ( 573 prefix, pBuffer, sizeof(pBuffer)); 574 aModule += pBuffer; 575 576 return rxActivator->deinstall ( 577 StringToUString (aModule, CHARSET_SYSTEM)); 578 } 579 580 #endif /* OLD */ 581 582 /* 583 * main. 584 */ 585 int SAL_CALL main (int argc, char **argv) 586 { 587 enum Option 588 { 589 OPTION_INSTALL = 0x01, 590 OPTION_UNINSTALL = 0x02, 591 592 OPTION_DECRYPT = 0x04, 593 OPTION_ENCRYPT = 0x08, 594 OPTION_SIGN = 0x10, 595 596 OPTION_FILE = 0x20, 597 OPTION_HELP = 0x40 598 }; 599 600 int fd = 0; 601 unsigned long nOptions = 0; 602 603 for (int i = 1; i < argc; i++) 604 { 605 const char *opt = argv[i]; 606 if (opt[0] == '-') 607 { 608 switch (opt[1]) 609 { 610 case 'i': 611 nOptions |= OPTION_INSTALL; 612 break; 613 614 case 'u': 615 nOptions |= OPTION_UNINSTALL; 616 break; 617 618 case 'd': 619 nOptions |= OPTION_DECRYPT; 620 break; 621 622 case 'e': 623 nOptions |= OPTION_ENCRYPT; 624 break; 625 626 case 's': 627 nOptions |= OPTION_SIGN; 628 break; 629 630 case 'f': 631 nOptions |= OPTION_FILE; 632 break; 633 634 case 'h': 635 default: 636 nOptions |= OPTION_HELP; 637 break; 638 } 639 } 640 else 641 { 642 if (nOptions & OPTION_FILE) 643 { 644 if ((fd = open (argv[i], O_RDONLY | O_BINARY)) < 0) 645 { 646 printf ("Error: can't open file: %s\n", argv[i]); 647 exit (0); 648 } 649 } 650 } 651 } 652 653 if ((nOptions == 0) || (nOptions & OPTION_HELP)) 654 { 655 printf ("Options:\n"); 656 printf ("-i\tinstall module\n"); 657 printf ("-u\tuninstall module\n"); 658 printf ("-d\tdecrypt and verify\n"); 659 printf ("-e\tencrypt test pattern\n"); 660 printf ("-s\tsign test pattern\n"); 661 printf ("-h\thelp\n"); 662 exit (0); 663 } 664 665 Reference<XMultiServiceFactory> xManager ( 666 usr::createDefaultSmartRegistryServiceFactory()); 667 if (!xManager.is()) 668 { 669 printf ("Error: no ProcessServiceManager.\n"); 670 exit (1); 671 } 672 usr::setProcessServiceFactory (xManager); 673 674 if (nOptions & OPTION_INSTALL) 675 { 676 #if 0 /* OLD */ 677 XServiceActivatorRef xActivator; 678 if (queryModuleActivator (xManager, xActivator)) 679 { 680 if (install (xActivator, "pgp")) 681 printf ("Module PGP installed.\n"); 682 else 683 printf ("Error: module PGP not installed.\n"); 684 } 685 nOptions &= ~OPTION_INSTALL; 686 #endif /* OLD */ 687 } 688 689 if (nOptions & (OPTION_DECRYPT | OPTION_ENCRYPT | OPTION_SIGN)) 690 { 691 Reference<XMultiServiceFactory> xProv ( 692 xManager->createInstance ( 693 S2U("com.sun.star.pgp.PGPFactory")), 694 UNO_QUERY); 695 if (!xProv.is()) 696 { 697 printf ("Error: no PGPFactory service.\n"); 698 exit (1); 699 } 700 701 Reference<XInterface> xProvInst ( 702 xProv->createInstance ( 703 S2U("com.sun.star.pgp.SimplePGPMailer"))); 704 if (!xProvInst.is()) 705 { 706 printf ("Error: no SimplePGPMailer service.\n"); 707 exit (2); 708 } 709 710 Reference<XPGPPreferences> xPrefs (xProvInst, UNO_QUERY); 711 if (xPrefs.is()) 712 { 713 unsigned long nDefaults = 0; 714 715 if (xPrefs->getEncryptByDefault()) 716 nDefaults |= OPTION_ENCRYPT; 717 if (xPrefs->getSignByDefault()) 718 nDefaults |= OPTION_SIGN; 719 if (xPrefs->getAutoDecrypt()) 720 nDefaults |= OPTION_DECRYPT; 721 722 if (nDefaults) 723 { 724 } 725 } 726 727 static const sal_Int8 pData[] = "" /* "Hello PGP World." */; 728 Sequence<sal_Int8> buffer (pData, sizeof (pData) - 1); 729 730 if (nOptions & (OPTION_ENCRYPT | OPTION_SIGN)) 731 { 732 Reference<XPGPEncoder> xEncoder (xProvInst, UNO_QUERY); 733 if (!xEncoder.is()) 734 { 735 printf ("Error: no PGPEncoder interface.\n"); 736 exit (4); 737 } 738 739 DataSource_Impl *source = new DataSource_Impl (fd); 740 source->setBuffer (buffer); 741 742 DataSink_Impl *sink = new DataSink_Impl; 743 744 Reference<XInputStream> xPlainText (source); 745 Reference<XOutputStream> xCipherText (sink); 746 747 if (nOptions & OPTION_ENCRYPT) 748 { 749 rtl::OWString aRecipients[] = 750 { 751 S2U("er@stardiv.de"), 752 // L"mhu@stardivision.de", 753 S2U("mhu@rabbit") 754 }; 755 756 sal_Int32 nRecipients = 757 sizeof(aRecipients) / sizeof(aRecipients[0]); 758 759 if (nOptions & OPTION_SIGN) 760 { 761 xEncoder->encryptAndSign ( 762 Sequence<rtl::OWString>(aRecipients, nRecipients), 763 xPlainText, 764 xCipherText); 765 nOptions &= ~OPTION_SIGN; 766 } 767 else 768 { 769 xEncoder->encrypt ( 770 Sequence<rtl::OWString>(aRecipients, nRecipients), 771 xPlainText, 772 xCipherText); 773 } 774 nOptions &= ~OPTION_ENCRYPT; 775 } 776 777 if (nOptions & OPTION_SIGN) 778 { 779 sal_Bool bDataIsAscii = (fd == 0); // stdin. 780 781 xEncoder->sign ( 782 bDataIsAscii, 783 xPlainText, 784 xCipherText); 785 nOptions &= ~OPTION_SIGN; 786 } 787 788 buffer = sink->getBuffer(); 789 } 790 791 if (nOptions & OPTION_DECRYPT) 792 { 793 Reference<XPGPDecoder> xDecoder (xProvInst, UNO_QUERY); 794 if (!xDecoder.is()) 795 { 796 printf ("Error: no PGPDecoder interface.\n"); 797 exit (5); 798 } 799 800 DataSource_Impl *source = new DataSource_Impl; 801 source->setBuffer (buffer); 802 803 DataSink_Impl *sink = new DataSink_Impl; 804 805 Reference<XInputStream> xCipherText (source); 806 Reference<XOutputStream> xPlainText (sink); 807 808 Reference<XPGPDecoderListener> xListener ( 809 new DecoderListener_Impl); 810 xDecoder->addDecoderListener (xListener); 811 812 xDecoder->decryptAndVerify ( 813 xCipherText, 814 xPlainText); 815 nOptions &= ~OPTION_DECRYPT; 816 817 xDecoder->removeDecoderListener (xListener); 818 819 buffer = sink->getBuffer(); 820 } 821 } 822 823 if (nOptions & OPTION_UNINSTALL) 824 { 825 #if 0 /* OLD */ 826 XServiceActivatorRef xActivator; 827 if (queryModuleActivator (xManager, xActivator)) 828 { 829 if (uninstall (xActivator, "pgp")) 830 printf ("Module PGP uninstalled.\n"); 831 else 832 printf ("Error: module PGP not uninstalled.\n"); 833 } 834 nOptions &= ~OPTION_UNINSTALL; 835 #endif /* OLD */ 836 } 837 838 return 0; 839 } 840 841