/* tgpgcom.c - Test the IGpgme classes
 *	Copyright (C) 2001 g10 Code GmbH
 *
 * This file is part of GPGME.
 *
 * GPGME is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * GPGME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 */


#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <assert.h>
#include <time.h>
#include <windows.h>

#define INITGUID
#include "igpgme.h"


int 
main (int argc, char **argv)
{
    IUnknown *pUnknown = NULL;
    IGpgme   *pGpgme;
    HRESULT hr;
    BSTR bs;
    
    hr = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED); 
    if (hr)
        fprintf (stderr, "CoInitializeEx() failed: hr=%lu\n", hr);

    fprintf (stderr, "system initialized\n");
    hr = CoCreateInstance (&CLSID_Gpgme, NULL, CLSCTX_LOCAL_SERVER,
                           &IID_IUnknown, (void**)&pUnknown );
    if (hr)
        fprintf (stderr, "CoCreateInstance() failed: hr=%lx\n", hr);
    if (!pUnknown)
        exit (1);

    fprintf (stderr,"got object %p - querying %s\n",
             pUnknown, debugstr_guid(&IID_IGpgme));
    hr = IGpgme_QueryInterface (pUnknown, &IID_IGpgme, (void**)&pGpgme);
    if (hr) {
        fprintf (stderr, "QueryInterface() failed: hr=%lx\n", hr);
        goto leave;
    }
    fprintf (stderr, "got interface %p\n", pGpgme);

    hr = IGpgme_SetArmor (pGpgme, 1);
    fprintf (stderr, "SetArmor returned %lx\n", hr);

    hr = IGpgme_SetTextmode (pGpgme, 0);
    fprintf (stderr, "SetTextmode returned %lx\n", hr);

    hr = IGpgme_ClearRecipients (pGpgme);
    fprintf (stderr, "ClearRecipients returned %lx\n", hr);

    bs = SysAllocString (L"alice");
    if (!bs)
      fprintf (stderr, "SysAllocString failed: ec=%d\n", (int)GetLastError());
    else {
      int i;
      
      for (i=-4; i < 12; i++ )
        fprintf (stderr," %02X", ((unsigned char*)bs)[i] );
      putc ('\n', stderr);
    }
    hr = IGpgme_AddRecipient (pGpgme, bs, -1);
    fprintf (stderr, "AddRecipients returned %lx\n", hr);
    
    {
      SAFEARRAY *sa;
      VARIANT v;
      char *p;
      
      sa = SafeArrayCreateVector (VT_UI1, 0, 20);
      if (!sa) {
        fprintf (stderr, "SafeArrayCreateVector failed\n");
        goto leave;
      }

      hr = SafeArrayAccessData (sa, (void**)&p);
      if (hr) {
        fprintf (stderr,"SafeArrayAccessData failed: hr=%lx\n", hr);
        goto leave;
      }

      memcpy (p, "=> Omnis enim res <=", 20 );
      SafeArrayUnaccessData (sa);

      VariantInit (&v);
      v.vt = (VT_ARRAY|VT_UI1);
      v.u.parray = sa;
      
      hr = IGpgme_SetPlaintext (pGpgme, v );
      fprintf (stderr, "SetPlaintext returned %lx\n", hr);
      SafeArrayDestroyData (sa);
      SafeArrayDestroy (sa);

      VariantClear (&v);
    }

    hr = IGpgme_Encrypt (pGpgme);
    fprintf (stderr, "Encrypt returned %lx\n", hr);

    {
      VARIANT v;
    
      hr = IGpgme_GetCiphertext (pGpgme, &v);
      fprintf (stderr, "GetCiphertext returned %lx\n", hr);
      if (!hr) {
          if (v.vt != (VT_ARRAY|VT_UI1)) 
              fprintf (stderr, "Invalid array typed returned\n");
          else {
              unsigned char *p;
              
              hr = SafeArrayAccessData (v.u.parray, (void**)&p);
              if (hr) 
                  fprintf (stderr,"*** SafeArrayAccessData failed: %lx\n", hr);
              else {
                  size_t arraysize = v.u.parray->rgsabound[0].cElements;
                  fprintf (stderr,"*** got %d bytes\n", (int)arraysize);
                  for (;arraysize; arraysize--, p++ )
                      putc (*p, stderr);
                  SafeArrayUnaccessData (v.u.parray);
              }
          }
      }
    }
    IGpgme_Release (pGpgme);

 leave:
    CoUninitialize ();
    fprintf (stderr, "system uninitialized\n");
    return 0;
}