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