Encryption basically works.
Removed system specific files becuase they are now part of Mingw32/CPD
This commit is contained in:
parent
c898d18ad8
commit
8c4d2ca609
15
complus/ChangeLog
Normal file
15
complus/ChangeLog
Normal file
@ -0,0 +1,15 @@
|
||||
2001-07-30 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Encryption basically works.
|
||||
|
||||
|
||||
Copyright 2001 g10 Code GmbH
|
||||
|
||||
This file is free software; as a special exception the author gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
modifications, as long as this notice is preserved.
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
@ -19,18 +19,31 @@
|
||||
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
EXTRA_DIST = WINE-LICENSE WINE-AUTHORS
|
||||
# Because there is no free IDL compiler for OLE, we have to distribute
|
||||
# a binary typelibrary. To generate a new one, copy the idl file to a
|
||||
# system with an install MIDL and run the command
|
||||
# midl /nocpp gpgcom.idl
|
||||
# Sorry, there is no other way yet.
|
||||
EXTRA_DIST = gpgcom.idl gpgcom.tlb gpgcom.rc
|
||||
|
||||
# No need to install this becuase we are cross-compiling anyway.
|
||||
noinst_PROGRAMS = gpgcom
|
||||
# No need to install this because we are cross-compiling anyway.
|
||||
noinst_PROGRAMS = gpgcom tgpgcom
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/jnlib
|
||||
LDADD = -L ../jnlib -ljnlib
|
||||
LDADD = ../gpgme/libgpgme.la -L ../jnlib -ljnlib -lole32 -loleaut32
|
||||
gpgcom_LDADD = gpgcom_res.o $(LDADD)
|
||||
|
||||
comheaders = obj_base.h basetsd.h guiddef.h wtypes.h
|
||||
gpgcom_SOURCES = gpgcom.c main.h \
|
||||
debug.c utf8.c \
|
||||
igpgme.h igpgme.c
|
||||
|
||||
gpgcom_SOURCES = main.c main.h \
|
||||
$(comheaders) \
|
||||
ignupg.c ignupg.h
|
||||
tgpgcom_SOURCES = tgpgcom.c\
|
||||
debug.c \
|
||||
igpgme.h
|
||||
|
||||
#regtlb_SOURCES = regtlb.c
|
||||
#guidgen_SOURCES = guidgen.c
|
||||
|
||||
gpgcom_res.o: gpgcom.rc
|
||||
mingw32 windres $< gpgcom_res.o
|
||||
|
||||
|
@ -1,331 +0,0 @@
|
||||
@c This file is processed by GNU's TeXinfo
|
||||
@c If you modify it or move it to another location, make sure that
|
||||
@c TeXinfo works (type `make' in directory documentation).
|
||||
|
||||
@c This is a list of the Wine authors and copyright holders.
|
||||
|
||||
Wine is available thanks to the work of:
|
||||
James Abbatiello,
|
||||
Michael Abd-El-Malek,
|
||||
Howard Abrams,
|
||||
Mark G. Adams,
|
||||
Bruno Afonso,
|
||||
Samir Al-Battran,
|
||||
Guy Albertelli,
|
||||
Gustavo Junior Alves,
|
||||
Bob Amstadt,
|
||||
Dag Asheim,
|
||||
Jim Aston,
|
||||
Martin Ayotte,
|
||||
Viktor Babrian,
|
||||
Karl Backström,
|
||||
Bradley Baetz,
|
||||
Peter Bajusz,
|
||||
Andre Malafaya Baptista,
|
||||
Aaron Barnes,
|
||||
Jean-Claude Batista,
|
||||
Marcel Baur,
|
||||
Francis Beaudet,
|
||||
Tom Bech,
|
||||
Matthew Becker,
|
||||
Georg Beyerle,
|
||||
Ross Biro,
|
||||
Dennis Björklund,
|
||||
Zygo Blaxell,
|
||||
Martin Boehme,
|
||||
Francois Boisvert,
|
||||
Pim Bollen,
|
||||
Uwe Bonnes,
|
||||
Peter Bortas,
|
||||
Noel Borthwick,
|
||||
Erik Bos,
|
||||
Fons Botman,
|
||||
Sylvain Bouchard,
|
||||
Frederic Boulanger,
|
||||
Justin Bradford,
|
||||
John Brezak,
|
||||
Andrew Bulhak,
|
||||
John Burton,
|
||||
Jonathan Buzzard,
|
||||
Jose Marcos López Caravaca,
|
||||
Eddie Carpenter,
|
||||
Niels de Carpentier,
|
||||
Mike Castle,
|
||||
Ron Cemer,
|
||||
Gordon Chaffee,
|
||||
Gael de Chalendar,
|
||||
Jimen Ching,
|
||||
Geoff Clare,
|
||||
Robert 'Admiral' Coeyman,
|
||||
Richard Cohen,
|
||||
Jean-Claude Cote,
|
||||
Stephen Crowley,
|
||||
Pascal Cuoq,
|
||||
David A. Cuthbert,
|
||||
Brian Joseph Czapiga,
|
||||
Ulrich Czekalla,
|
||||
Huw D. M. Davies,
|
||||
Moses DeJong,
|
||||
Petar Djukic,
|
||||
Roman Dolejsi,
|
||||
Frans van Dorsselaer,
|
||||
Rikhardur Egilsson,
|
||||
Morten Eriksen,
|
||||
Chris Faherty,
|
||||
Carsten Fallesen,
|
||||
Paul Falstad,
|
||||
David Faure,
|
||||
Wesley Filardo,
|
||||
Claus Fischer,
|
||||
Olaf Flebbe,
|
||||
Chad Fraleigh,
|
||||
Matthew Francis,
|
||||
Philippe Froidevaux,
|
||||
Peter Galbavy,
|
||||
Peter Ganten,
|
||||
Ramon Garcia,
|
||||
Jeff Garzik,
|
||||
Julio Cesar Gazquez,
|
||||
Klaas van Gend,
|
||||
Abey George,
|
||||
Brian Gerst,
|
||||
Matthew Ghio,
|
||||
Jody Goldberg,
|
||||
David Golding,
|
||||
François Gouget,
|
||||
Hans de Graaff,
|
||||
David Grant,
|
||||
Albert den Haan,
|
||||
Jess Haas,
|
||||
Robert W Hall,
|
||||
Noomen Hamza,
|
||||
Charles M. Hannum,
|
||||
Adrian Harvey,
|
||||
John Harvey,
|
||||
James Hatheway,
|
||||
Kalevi J Hautaniemi,
|
||||
Bill Hawes,
|
||||
Lars Heete,
|
||||
Cameron Heide,
|
||||
Bernd Herd,
|
||||
Theodore S. Hetke,
|
||||
Haithem Hmida,
|
||||
Jochen Hoenicke,
|
||||
Henning Hoffmann,
|
||||
Kevin Holbrook,
|
||||
Nick Holloway,
|
||||
Onno Hovers,
|
||||
Jeffrey Hsu,
|
||||
Peter Hunnisett,
|
||||
Miguel de Icaza,
|
||||
Jukka Iivonen,
|
||||
Kostya Ivanov,
|
||||
Serge Ivanov,
|
||||
Lee Jaekil,
|
||||
Gautam Jain,
|
||||
Niels Kristian Bech Jensen,
|
||||
Rajeev Jhangiani,
|
||||
Bill Jin,
|
||||
Jeff Johann,
|
||||
Alexandre Julliard,
|
||||
Bang Jun-Young,
|
||||
James Juran,
|
||||
Achim Kaiser,
|
||||
Alexander Kanavin,
|
||||
Jukka Kangas,
|
||||
Pavel Kankovsky,
|
||||
Michael Karcher,
|
||||
Niclas Karlsson,
|
||||
Jochen Karrer,
|
||||
Don Kelly,
|
||||
Andreas Kirschbaum,
|
||||
Rein Klazes,
|
||||
Albrecht Kleine,
|
||||
Dietmar Kling,
|
||||
Eric Kohl,
|
||||
Jon Konrath,
|
||||
Alex Korobka,
|
||||
Zoltan Kovacs,
|
||||
Greg Kreider,
|
||||
Anand Kumria,
|
||||
Ove Kåven,
|
||||
Scott A. Laird,
|
||||
David Lee Lambert,
|
||||
Stephen Langasek,
|
||||
Sean Langley,
|
||||
Dan Langlois,
|
||||
Alexander Larsson,
|
||||
David Lassonde,
|
||||
Stefan Leichter,
|
||||
Karl Lessard,
|
||||
Pascal Lessard,
|
||||
Andrew Lewycky,
|
||||
John Li,
|
||||
Weisheng Li,
|
||||
Xiang Li,
|
||||
Per Lindström,
|
||||
Brian Litzinger,
|
||||
Juergen Lock,
|
||||
Martin von Loewis,
|
||||
Michiel van Loon,
|
||||
Richard A Lough,
|
||||
Alexander V. Lukyanov,
|
||||
Jiuming Luo,
|
||||
Stephane Lussier,
|
||||
David Luyer,
|
||||
José Marcos López,
|
||||
Kenneth MacDonald,
|
||||
Peter MacDonald,
|
||||
Pierre Mageau,
|
||||
William Magro,
|
||||
Juergen Marquardt,
|
||||
Ricardo Massaro,
|
||||
Keith Matthews,
|
||||
Joerg Mayer,
|
||||
Michael McCormack,
|
||||
Jason McMullan,
|
||||
Caolan McNamara,
|
||||
Marcus Meissner,
|
||||
Graham Menhennitt,
|
||||
David Metcalfe,
|
||||
Toufic Milan,
|
||||
Paul Millar,
|
||||
Bruce Milner,
|
||||
Steffen Moeller,
|
||||
Andreas Mohr,
|
||||
Slava Monich,
|
||||
James Moody,
|
||||
Chris Morgan,
|
||||
Kai Morich,
|
||||
Richard Mortimer,
|
||||
Vasudev Mulchandani,
|
||||
Rick Mutzke,
|
||||
Philippe De Muyter,
|
||||
Itai Nahshon,
|
||||
Jonathan Naylor,
|
||||
Tim Newsome,
|
||||
Thuy Nguyen,
|
||||
Kristian Nielsen,
|
||||
Damien O'Neill,
|
||||
Henrik Olsen,
|
||||
Gerard Patel,
|
||||
Michael Patra,
|
||||
Murali Pattathe,
|
||||
Dimitrie O. Paun,
|
||||
Bernd Paysan,
|
||||
Brad Pepers,
|
||||
Jim Peterson,
|
||||
Gerald Pfeifer,
|
||||
Dave Pickles,
|
||||
Ian Pilcher,
|
||||
Brian Pirie,
|
||||
Michael Poole,
|
||||
Eric Pouech,
|
||||
Robert Pouliot,
|
||||
Vahid Pourlotfali,
|
||||
Chad Powell,
|
||||
Joseph Pranevich,
|
||||
Alex Priem,
|
||||
Paul Quinn,
|
||||
Pete Ratzlaff,
|
||||
Ron Record,
|
||||
Petter Reinholdtsen,
|
||||
Keith Reynolds,
|
||||
Slaven Rezic,
|
||||
John Richardson,
|
||||
Rick Richardson,
|
||||
Douglas Ridgway,
|
||||
Robert Riggs,
|
||||
Bernhard Rosenkraenzer,
|
||||
Matthew Robertson,
|
||||
Pavel Roskin,
|
||||
Herbert Rosmanith,
|
||||
Lilia Roumiantseva,
|
||||
Johannes Ruscheinski,
|
||||
Adam Sacarny,
|
||||
Ivan de Saedeleer,
|
||||
Thomas Sandford,
|
||||
Constantine Sapuntzakis,
|
||||
Pablo Saratxaga,
|
||||
Carl van Schaik,
|
||||
Daniel Schepler,
|
||||
Christian Schlaile,
|
||||
Peter Schlaile,
|
||||
Ulrich Schmid,
|
||||
Bernd Schmidt,
|
||||
Ian Schmidt,
|
||||
Juergen Schmied,
|
||||
Ingo Schneider,
|
||||
Victor Schneider,
|
||||
John Sheets,
|
||||
Yngvi Sigurjonsson,
|
||||
Stephen Simmons,
|
||||
Jesper Skov,
|
||||
Rick Sladkey,
|
||||
William Smith,
|
||||
Jaroslaw Piotr Sobieszek,
|
||||
Patrick Spinler,
|
||||
Sylvain St-Germain,
|
||||
Gavriel State,
|
||||
Sheri Steeves,
|
||||
Norman Stevens,
|
||||
Dominik Strasser,
|
||||
Patrik Stridvall,
|
||||
Vadim Strizhevsky,
|
||||
Bertho Stultiens,
|
||||
Abraham Sudhakar,
|
||||
Charles Suprin,
|
||||
James Sutherland,
|
||||
Erik Svendsen,
|
||||
Tristan Tarrant,
|
||||
Andrew Taylor,
|
||||
Joshua Thielen,
|
||||
Dirk Thierbach,
|
||||
Jean-Louis Thirot,
|
||||
Duncan C Thomson,
|
||||
Adrian Thurston,
|
||||
Goran Thyni,
|
||||
Steve Tibbett,
|
||||
Dmitry Timoshkov,
|
||||
Jimmy Tirtawangsa,
|
||||
Jon Tombs,
|
||||
Linus Torvalds,
|
||||
Luc Tourangeau,
|
||||
Jeff Tranter,
|
||||
Gregory Trubetskoy,
|
||||
Petri Tuomola,
|
||||
Sergey Turchanov,
|
||||
Lionel Ulmer,
|
||||
Moshe Vainer,
|
||||
Michael Veksler,
|
||||
Sven Verdoolaege,
|
||||
Todd Vierling,
|
||||
Erez Volk,
|
||||
Jerome Vouillon,
|
||||
Duc Vuong,
|
||||
Ronan Waide,
|
||||
Martin Walker,
|
||||
Owen Wang,
|
||||
Eric Warnke,
|
||||
Leigh Wedding,
|
||||
Randy Weems,
|
||||
Manfred Weichel,
|
||||
Ulrich Weigand,
|
||||
Morten Welinder,
|
||||
Jeremy White,
|
||||
Len White,
|
||||
Lawson Whitney,
|
||||
Jan Willamowius,
|
||||
Carl Williams,
|
||||
Eric Williams,
|
||||
Cliff Wright,
|
||||
Karl Guenter Wuensch,
|
||||
Eric Youngdale,
|
||||
James Youngman,
|
||||
Nikita V. Youshchenko,
|
||||
Mikolaj Zalewski,
|
||||
John Zero,
|
||||
Yuxi Zhang,
|
||||
Nathan Zorich,
|
||||
Luiz Otavio L. Zorzella,
|
||||
and Per Ångström.
|
@ -1,26 +0,0 @@
|
||||
This is the license file as it appeared in the CVS version of
|
||||
Wine at cvs@rhlx01.fht-esslingen.de:/home/wine as of 2000-12-04
|
||||
where only AUTHORS has been renamed to WINE-AUTHORS. It applies
|
||||
to the header files establishing the COM+ framework
|
||||
|
||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
Copyright (c) 1993-2000 the Wine project authors (see the file WINE-AUTHORS
|
||||
for a complete list)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
@ -1,160 +0,0 @@
|
||||
/* basetsd.h - Compilers that uses ILP32, LP64 or P64 type models
|
||||
for both Win32 and Win64 are supported by this file.
|
||||
|
||||
Copyright (c) 1993-2000 the Wine project authors (see the file WINE-AUTHORS
|
||||
for a complete list)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __WINE_BASETSD_H
|
||||
#define __WINE_BASETSD_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* defined(__cplusplus) */
|
||||
|
||||
/*
|
||||
* Win32 was easy to implement under Unix since most (all?) 32-bit
|
||||
* Unices uses the same type model (ILP32) as Win32, where int, long
|
||||
* and pointer are 32-bit.
|
||||
*
|
||||
* Win64, however, will cause some problems when implemented under Unix.
|
||||
* Linux/{Alpha, Sparc64} and most (all?) other 64-bit Unices uses
|
||||
* the LP64 type model where int is 32-bit and long and pointer are
|
||||
* 64-bit. Win64 on the other hand uses the P64 (sometimes called LLP64)
|
||||
* type model where int and long are 32 bit and pointer is 64-bit.
|
||||
*/
|
||||
|
||||
/* Type model indepent typedefs */
|
||||
|
||||
typedef char __int8;
|
||||
typedef unsigned char __uint8;
|
||||
|
||||
typedef short __int16;
|
||||
typedef unsigned short __uint16;
|
||||
|
||||
typedef int __int32;
|
||||
typedef unsigned int __uint32;
|
||||
|
||||
typedef long long __int64;
|
||||
typedef unsigned long long __uint64;
|
||||
|
||||
#if defined(_WIN64)
|
||||
|
||||
typedef __uint32 __ptr32;
|
||||
typedef void *__ptr64;
|
||||
|
||||
#else /* FIXME: defined(_WIN32) */
|
||||
|
||||
typedef void *__ptr32;
|
||||
typedef __uint64 __ptr64;
|
||||
|
||||
#endif
|
||||
|
||||
/* Always signed and 32 bit wide */
|
||||
|
||||
typedef __int32 LONG32;
|
||||
typedef __int32 INT32;
|
||||
|
||||
typedef LONG32 *PLONG32;
|
||||
typedef INT32 *PINT32;
|
||||
|
||||
/* Always unsigned and 32 bit wide */
|
||||
|
||||
typedef __uint32 ULONG32;
|
||||
typedef __uint32 DWORD32;
|
||||
typedef __uint32 UINT32;
|
||||
|
||||
typedef ULONG32 *PULONG32;
|
||||
typedef DWORD32 *PDWORD32;
|
||||
typedef UINT32 *PUINT32;
|
||||
|
||||
/* Always signed and 64 bit wide */
|
||||
|
||||
typedef __int64 LONG64;
|
||||
typedef __int64 INT64;
|
||||
|
||||
typedef LONG64 *PLONG64;
|
||||
typedef INT64 *PINT64;
|
||||
|
||||
/* Always unsigned and 64 bit wide */
|
||||
|
||||
typedef __uint64 ULONG64;
|
||||
typedef __uint64 DWORD64;
|
||||
typedef __uint64 UINT64;
|
||||
|
||||
typedef ULONG64 *PULONG64;
|
||||
typedef DWORD64 *PDWORD64;
|
||||
typedef UINT64 *PUINT64;
|
||||
|
||||
/* Win32 or Win64 dependent typedef/defines. */
|
||||
|
||||
#ifdef _WIN64
|
||||
|
||||
typedef __int64 INT_PTR, *PINT_PTR;
|
||||
typedef __uint64 UINT_PTR, *PUINT_PTR;
|
||||
|
||||
#define MAXINT_PTR 0x7fffffffffffffff
|
||||
#define MININT_PTR 0x8000000000000000
|
||||
#define MAXUINT_PTR 0xffffffffffffffff
|
||||
|
||||
typedef __int32 HALF_PTR, *PHALF_PTR;
|
||||
typedef __int32 UHALF_PTR, *PUHALF_PTR;
|
||||
|
||||
#define MAXHALF_PTR 0x7fffffff
|
||||
#define MINHALF_PTR 0x80000000
|
||||
#define MAXUHALF_PTR 0xffffffff
|
||||
|
||||
typedef __int64 LONG_PTR, *PLONG_PTR;
|
||||
typedef __uint64 ULONG_PTR, *PULONG_PTR;
|
||||
typedef __uint64 DWORD_PTR, *PDWORD_PTR;
|
||||
|
||||
#else /* FIXME: defined(_WIN32) */
|
||||
|
||||
typedef __int32 INT_PTR, *PINT_PTR;
|
||||
typedef __uint32 UINT_PTR, *PUINT_PTR;
|
||||
|
||||
#define MAXINT_PTR 0x7fffffff
|
||||
#define MININT_PTR 0x80000000
|
||||
#define MAXUINT_PTR 0xffffffff
|
||||
|
||||
typedef __int16 HALF_PTR, *PHALF_PTR;
|
||||
typedef __uint16 UHALF_PTR, *PUHALF_PTR;
|
||||
|
||||
#define MAXUHALF_PTR 0xffff
|
||||
#define MAXHALF_PTR 0x7fff
|
||||
#define MINHALF_PTR 0x8000
|
||||
|
||||
typedef __int32 LONG_PTR, *PLONG_PTR;
|
||||
typedef __uint32 ULONG_PTR, *PULONG_PTR;
|
||||
typedef __uint32 DWORD_PTR, *PDWORD_PTR;
|
||||
|
||||
#endif /* defined(_WIN64) || defined(_WIN32) */
|
||||
|
||||
typedef INT_PTR SSIZE_T, *PSSIZE_T;
|
||||
typedef UINT_PTR SIZE_T, *PSIZE_T;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* defined(__cplusplus) */
|
||||
|
||||
#endif /* !defined(__WINE_BASETSD_H) */
|
||||
|
||||
|
||||
|
40
complus/debug.c
Normal file
40
complus/debug.c
Normal file
@ -0,0 +1,40 @@
|
||||
/* debug.c - COM+ debug helpers
|
||||
* 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
#include <ole2.h>
|
||||
|
||||
|
||||
const char *
|
||||
debugstr_guid (const GUID *id)
|
||||
{
|
||||
static char str[100];
|
||||
|
||||
if (!id)
|
||||
return "(null)";
|
||||
sprintf( str, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
||||
id->Data1, id->Data2, id->Data3,
|
||||
id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3],
|
||||
id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7] );
|
||||
return str;
|
||||
}
|
||||
|
543
complus/gpgcom.c
Normal file
543
complus/gpgcom.c
Normal file
@ -0,0 +1,543 @@
|
||||
/* gpgcom.c - COM+ component to access GnuPG
|
||||
* 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>
|
||||
|
||||
#include <ole2.h>
|
||||
|
||||
#include "argparse.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "igpgme.h"
|
||||
|
||||
static void register_server (void);
|
||||
static void unregister_server (void);
|
||||
static void enter_complus (void);
|
||||
|
||||
|
||||
enum cmd_and_opt_values { aNull = 0,
|
||||
oQuiet = 'q',
|
||||
oVerbose = 'v',
|
||||
|
||||
oNoVerbose = 500,
|
||||
oOptions,
|
||||
oDebug,
|
||||
oDebugAll,
|
||||
oNoGreeting,
|
||||
oNoOptions,
|
||||
oHomedir,
|
||||
oGPGBinary,
|
||||
oRegServer,
|
||||
oUnregServer,
|
||||
oEmbedding,
|
||||
aTest };
|
||||
|
||||
|
||||
static ARGPARSE_OPTS opts[] = {
|
||||
|
||||
{ 301, NULL, 0, N_("@Options:\n ") },
|
||||
|
||||
{ oVerbose, "verbose", 0, N_("verbose") },
|
||||
{ oQuiet, "quiet", 0, N_("be somewhat more quiet") },
|
||||
{ oOptions, "options" , 2, N_("read options from file")},
|
||||
{ oDebug, "debug" ,4|16, N_("set debugging flags")},
|
||||
{ oDebugAll, "debug-all" ,0, N_("enable full debugging")},
|
||||
{ oGPGBinary, "gpg-program", 2 , "" },
|
||||
{ oRegServer, "RegServer" , 0, "" },
|
||||
{ oUnregServer, "UnregServer" , 0, "" },
|
||||
{ oEmbedding, "Embedding" , 0, "" },
|
||||
{0} };
|
||||
|
||||
|
||||
|
||||
|
||||
static const char *
|
||||
my_strusage( int level )
|
||||
{
|
||||
const char *p;
|
||||
switch( level ) {
|
||||
case 11: p = "gpgcom";
|
||||
break;
|
||||
case 13: p = VERSION; break;
|
||||
/*case 17: p = PRINTABLE_OS_NAME; break;*/
|
||||
case 19: p =
|
||||
_("Please report bugs to <gpgme-bugs@gnupg.org>.\n");
|
||||
break;
|
||||
case 1:
|
||||
case 40: p =
|
||||
_("Usage: gpgcom [options] (-h for help)");
|
||||
break;
|
||||
case 41: p =
|
||||
_("Syntax: gpgcom [options]\n"
|
||||
"GnuPG COM+ component\n");
|
||||
break;
|
||||
|
||||
default: p = NULL;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char **argv )
|
||||
{
|
||||
ARGPARSE_ARGS pargs;
|
||||
int orig_argc;
|
||||
char **orig_argv;
|
||||
FILE *configfp = NULL;
|
||||
char *configname = NULL;
|
||||
unsigned configlineno;
|
||||
int parse_debug = 0;
|
||||
int default_config =1;
|
||||
int greeting = 0;
|
||||
int nogreeting = 0;
|
||||
int action = 0;
|
||||
|
||||
set_strusage( my_strusage );
|
||||
/*log_set_name ("gpa"); not yet implemented in logging.c */
|
||||
|
||||
opt.homedir = getenv("GNUPGHOME");
|
||||
if( !opt.homedir || !*opt.homedir ) {
|
||||
#ifdef HAVE_DRIVE_LETTERS
|
||||
opt.homedir = "c:/gnupg";
|
||||
#else
|
||||
opt.homedir = "~/.gnupg";
|
||||
#endif
|
||||
}
|
||||
|
||||
/* check whether we have a config file on the commandline */
|
||||
orig_argc = argc;
|
||||
orig_argv = argv;
|
||||
pargs.argc = &argc;
|
||||
pargs.argv = &argv;
|
||||
pargs.flags= 1|(1<<6); /* do not remove the args, ignore version */
|
||||
while( arg_parse( &pargs, opts) ) {
|
||||
if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
|
||||
parse_debug++;
|
||||
else if( pargs.r_opt == oOptions ) {
|
||||
/* yes there is one, so we do not try the default one, but
|
||||
* read the option file when it is encountered at the commandline
|
||||
*/
|
||||
default_config = 0;
|
||||
}
|
||||
else if( pargs.r_opt == oNoOptions )
|
||||
default_config = 0; /* --no-options */
|
||||
else if( pargs.r_opt == oHomedir )
|
||||
opt.homedir = pargs.r.ret_str;
|
||||
}
|
||||
|
||||
if( default_config )
|
||||
configname = make_filename(opt.homedir, "gpgme.conf", NULL );
|
||||
|
||||
|
||||
argc = orig_argc;
|
||||
argv = orig_argv;
|
||||
pargs.argc = &argc;
|
||||
pargs.argv = &argv;
|
||||
pargs.flags= 1 | (1<<5); /* do not remove the args, allow one dash */
|
||||
next_pass:
|
||||
if( configname ) {
|
||||
configlineno = 0;
|
||||
configfp = fopen( configname, "r" );
|
||||
if( !configfp ) {
|
||||
if( default_config ) {
|
||||
if( parse_debug )
|
||||
log_info(_("NOTE: no default option file `%s'\n"),
|
||||
configname );
|
||||
}
|
||||
else {
|
||||
log_error(_("option file `%s': %s\n"),
|
||||
configname, strerror(errno) );
|
||||
exit(2);
|
||||
}
|
||||
free(configname); configname = NULL;
|
||||
}
|
||||
if( parse_debug && configname )
|
||||
log_info(_("reading options from `%s'\n"), configname );
|
||||
default_config = 0;
|
||||
}
|
||||
|
||||
while( optfile_parse( configfp, configname, &configlineno,
|
||||
&pargs, opts) ) {
|
||||
switch( pargs.r_opt ) {
|
||||
case oQuiet: opt.quiet = 1; break;
|
||||
case oVerbose: opt.verbose++; break;
|
||||
|
||||
case oDebug: opt.debug |= pargs.r.ret_ulong; break;
|
||||
case oDebugAll: opt.debug = ~0; break;
|
||||
|
||||
case oOptions:
|
||||
/* config files may not be nested (silently ignore them) */
|
||||
if( !configfp ) {
|
||||
free(configname);
|
||||
configname = xstrdup(pargs.r.ret_str);
|
||||
goto next_pass;
|
||||
}
|
||||
break;
|
||||
case oNoGreeting: nogreeting = 1; break;
|
||||
case oNoVerbose: opt.verbose = 0; break;
|
||||
case oNoOptions: break; /* no-options */
|
||||
case oHomedir: opt.homedir = pargs.r.ret_str; break;
|
||||
case oGPGBinary: break;
|
||||
|
||||
case oRegServer: action = 1; break;
|
||||
case oUnregServer: action = 2; break;
|
||||
case oEmbedding: action = 3; break;
|
||||
|
||||
default : pargs.err = configfp? 1:2; break;
|
||||
}
|
||||
}
|
||||
if( configfp ) {
|
||||
fclose( configfp );
|
||||
configfp = NULL;
|
||||
free(configname); configname = NULL;
|
||||
goto next_pass;
|
||||
}
|
||||
free( configname ); configname = NULL;
|
||||
if( log_get_errorcount(0) )
|
||||
exit(2);
|
||||
if( nogreeting )
|
||||
greeting = 0;
|
||||
|
||||
if( greeting ) {
|
||||
fprintf(stderr, "%s %s; %s\n",
|
||||
strusage(11), strusage(13), strusage(14) );
|
||||
fprintf(stderr, "%s\n", strusage(15) );
|
||||
}
|
||||
#ifdef IS_DEVELOPMENT_VERSION
|
||||
log_info("NOTE: this is a development version!\n");
|
||||
#endif
|
||||
|
||||
if ( action == 1 )
|
||||
register_server ();
|
||||
else if (action == 2 )
|
||||
unregister_server ();
|
||||
else if (action == 3 )
|
||||
enter_complus ();
|
||||
else {
|
||||
fprintf (stderr, "This is a COM+ component with no user interface.\n"
|
||||
"gpgme --help will give you a list of options\n" );
|
||||
exit (1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
register_progid ( const char *name )
|
||||
{
|
||||
HKEY hk = 0;
|
||||
char buf[500];
|
||||
|
||||
/* Create a ProgID entry to point to the ClassID */
|
||||
sprintf (buf, "%.400s", name);
|
||||
if (RegCreateKeyA (HKEY_CLASSES_ROOT, buf, &hk)) {
|
||||
fprintf (stderr,"RegCreateKey(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
sprintf (buf, "g10 Code's GnuPG made easy COMponent" );
|
||||
if (RegSetValueExA (hk, 0, 0, REG_SZ, buf, 0)) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegCloseKey (hk)) {
|
||||
fprintf (stderr,"RegCloseKey() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
sprintf (buf, "%.400s\\CLSID", name);
|
||||
if (RegCreateKeyA (HKEY_CLASSES_ROOT, buf, &hk)) {
|
||||
fprintf (stderr,"RegCreateKey(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
sprintf (buf, "%.100s", debugstr_guid (&CLSID_Gpgme) );
|
||||
if (RegSetValueExA (hk, 0, 0, REG_SZ, buf, strlen (buf))) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegCloseKey (hk)) {
|
||||
fprintf (stderr,"RegCloseKey() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
hk = 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
register_typelib (void)
|
||||
{
|
||||
ITypeLib *pTypeLib;
|
||||
HRESULT hr;
|
||||
char name[500];
|
||||
wchar_t *wname;
|
||||
size_t n;
|
||||
|
||||
if ( !GetModuleFileNameA (0, name, sizeof (name)-10) ) {
|
||||
fprintf (stderr,"GetModuleFileName() failed: %d\n",
|
||||
(int)GetLastError());
|
||||
exit (1);
|
||||
}
|
||||
n = mbstowcs (NULL, name, strlen(name)+1);
|
||||
wname = xmalloc ((n+1)*sizeof *wname);
|
||||
mbstowcs (wname, name, strlen (name)+1);
|
||||
|
||||
hr = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);
|
||||
if (hr)
|
||||
fprintf (stderr, "CoInitializeEx() failed: hr=%lu\n", hr);
|
||||
|
||||
hr = LoadTypeLibEx (wname, REGKIND_REGISTER, &pTypeLib);
|
||||
if (hr)
|
||||
fprintf (stderr, "LoadTypeLibEx() failed: hr=%lx\n", hr);
|
||||
|
||||
ITypeLib_Release (pTypeLib);
|
||||
CoUninitialize ();
|
||||
free (wname);
|
||||
}
|
||||
|
||||
static void
|
||||
unregister_typelib (void)
|
||||
{
|
||||
UnRegisterTypeLib (&TLBID_Gpgcom, 1, 0, LANG_NEUTRAL, SYS_WIN32);
|
||||
}
|
||||
|
||||
static void
|
||||
register_server ()
|
||||
{
|
||||
HKEY hk = 0;
|
||||
char buf[500];
|
||||
|
||||
|
||||
register_typelib ();
|
||||
|
||||
/* Create a key for the CLSID */
|
||||
sprintf (buf, "CLSID\\%.100s", debugstr_guid (&CLSID_Gpgme) );
|
||||
if (RegCreateKeyA (HKEY_CLASSES_ROOT, buf, &hk)) {
|
||||
fprintf (stderr,"RegCreateKey(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
/* Store our class name as default value */
|
||||
strcpy (buf, "Gpgme");
|
||||
if (RegSetValueExA (hk, 0, 0, REG_SZ, buf, strlen (buf))) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/* Set the application ID */
|
||||
sprintf (buf, "%.100s", debugstr_guid (&APPID_Gpgcom) );
|
||||
if (RegSetValueExA (hk, "AppID", 0, REG_SZ, buf, strlen (buf))) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegCloseKey (hk)) {
|
||||
fprintf (stderr,"RegCloseKey() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
hk = 0;
|
||||
|
||||
/* Create the LocalServer32 subkey under the CLSID key */
|
||||
sprintf (buf, "CLSID\\%.100s\\LocalServer32",
|
||||
debugstr_guid (&CLSID_Gpgme) );
|
||||
if (RegCreateKeyA (HKEY_CLASSES_ROOT, buf, &hk)) {
|
||||
fprintf (stderr,"RegCreateKey(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
/* retrieve the module name and add it under the key */
|
||||
if ( !GetModuleFileNameA (0, buf, sizeof (buf)-10) ) {
|
||||
fprintf (stderr,"GetModuleFileName() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
if (RegSetValueExA (hk, 0, 0, REG_SZ, buf, strlen (buf))) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegCloseKey (hk)) {
|
||||
fprintf (stderr,"RegCloseKey() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
hk = 0;
|
||||
|
||||
/* Create the ProgID subkey under the CLSID key */
|
||||
sprintf (buf, "CLSID\\%.100s\\ProgID",
|
||||
debugstr_guid (&CLSID_Gpgme) );
|
||||
if (RegCreateKeyA (HKEY_CLASSES_ROOT, buf, &hk)) {
|
||||
fprintf (stderr,"RegCreateKey(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegSetValueExA (hk, 0, 0, REG_SZ, "Gpgcom.Gpgme.1", 0)) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegCloseKey (hk)) {
|
||||
fprintf (stderr,"RegCloseKey() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
hk = 0;
|
||||
/* Create the VersionIndependentProgID subkey under the CLSID key */
|
||||
sprintf (buf, "CLSID\\%.100s\\VersionIndependentProgID",
|
||||
debugstr_guid (&CLSID_Gpgme) );
|
||||
if (RegCreateKeyA (HKEY_CLASSES_ROOT, buf, &hk)) {
|
||||
fprintf (stderr,"RegCreateKey(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegSetValueExA (hk, 0, 0, REG_SZ, "Gpgcom.Gpgme", 0)) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegCloseKey (hk)) {
|
||||
fprintf (stderr,"RegCloseKey() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
hk = 0;
|
||||
|
||||
|
||||
/* Create a key to store AppID info */
|
||||
sprintf (buf, "AppID\\%.100s", debugstr_guid (&APPID_Gpgcom) );
|
||||
if (RegCreateKeyA (HKEY_CLASSES_ROOT, buf, &hk)) {
|
||||
fprintf (stderr,"RegCreateKey(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
/* Store the name as default value */
|
||||
strcpy (buf, "Gpgcom");
|
||||
if (RegSetValueExA (hk, 0, 0, REG_SZ, buf, strlen (buf))) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegCloseKey (hk)) {
|
||||
fprintf (stderr,"RegCloseKey() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
hk = 0;
|
||||
|
||||
register_progid ("Gpgcom.Gpgme");
|
||||
register_progid ("Gpgcom.Gpgme.1");
|
||||
|
||||
/* Create a convenience cross reference to the AppID */
|
||||
sprintf (buf, "AppID\\gpgcom.exe");
|
||||
if (RegCreateKeyA (HKEY_CLASSES_ROOT, buf, &hk)) {
|
||||
fprintf (stderr,"RegCreateKey(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
sprintf (buf, "%.100s", debugstr_guid (&APPID_Gpgcom) );
|
||||
if (RegSetValueExA (hk, "AppID", 0, REG_SZ, buf, strlen (buf))) {
|
||||
fprintf (stderr,"RegSetValueEx(`%s') failed\n", buf);
|
||||
exit (1);
|
||||
}
|
||||
if (RegCloseKey (hk)) {
|
||||
fprintf (stderr,"RegCloseKey() failed\n");
|
||||
exit (1);
|
||||
}
|
||||
hk = 0;
|
||||
|
||||
fprintf (stderr,"*** Component registered\n");
|
||||
}
|
||||
|
||||
static void
|
||||
unregister_server ()
|
||||
{
|
||||
char buf[500];
|
||||
|
||||
unregister_typelib ();
|
||||
sprintf (buf, "CLSID\\%.100s\\LocalServer32",
|
||||
debugstr_guid (&CLSID_Gpgme) );
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
|
||||
sprintf (buf, "CLSID\\%.100s\\ProgID", debugstr_guid (&CLSID_Gpgme) );
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
|
||||
sprintf (buf, "CLSID\\%.100s", debugstr_guid (&CLSID_Gpgme) );
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
|
||||
sprintf (buf, "Gpgcom.Gpgme.1\\CLSID");
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
sprintf (buf, "Gpgcom.Gpgme.1");
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
|
||||
sprintf (buf, "Gpgcom.Gpgme\\CLSID");
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
sprintf (buf, "Gpgcom.Gpgme");
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
|
||||
|
||||
sprintf (buf, "AppID\\%.100s", debugstr_guid (&APPID_Gpgcom) );
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
|
||||
sprintf (buf, "AppID\\gpgcom.exe" );
|
||||
if (RegDeleteKey (HKEY_CLASSES_ROOT, buf))
|
||||
fprintf (stderr,"RegDeleteKey(`%s') failed\n", buf);
|
||||
|
||||
fprintf (stderr,"*** component unregistered\n");
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
enter_complus ()
|
||||
{
|
||||
HANDLE running;
|
||||
DWORD reg;
|
||||
IClassFactory *factory;
|
||||
CLSID clsid;
|
||||
HRESULT hr;
|
||||
|
||||
fprintf (stderr,"*** enter enter_complus()\n");
|
||||
CoInitializeEx (NULL, COINIT_MULTITHREADED);
|
||||
running = CreateEvent (NULL, FALSE, FALSE, NULL );
|
||||
fprintf (stderr,"*** CoInitialize() done; event=%lx\n", (unsigned long)running );
|
||||
|
||||
factory = igpgme_factory_new ( &clsid );
|
||||
fprintf (stderr,"*** igpgme_factory_new() done; got=%p\n", factory );
|
||||
hr = CoRegisterClassObject (&clsid, (IUnknown*)factory,
|
||||
CLSCTX_LOCAL_SERVER,
|
||||
REGCLS_SUSPENDED|REGCLS_MULTIPLEUSE, ® );
|
||||
if (hr) {
|
||||
fprintf (stderr, "CoRegisterClassObject() failed: hr=%lx\n", hr);
|
||||
exit (1);
|
||||
}
|
||||
hr = CoResumeClassObjects ();
|
||||
if (hr)
|
||||
fprintf (stderr, "CoRegisterClassObject() failed: hr=%lx\n", hr);
|
||||
fprintf (stderr,"*** class object registered; waiting\n" );
|
||||
|
||||
WaitForSingleObject ( running, INFINITE );
|
||||
fprintf (stderr,"*** shutting down\n" );
|
||||
CloseHandle (running);
|
||||
CoRevokeClassObject ( reg );
|
||||
fprintf (stderr,"*** class object revoked\n" );
|
||||
igpgme_factory_release (factory);
|
||||
fprintf (stderr,"*** factory released\n" );
|
||||
CoUninitialize ();
|
||||
fprintf (stderr,"*** leave enter_complus()\n" );
|
||||
}
|
||||
|
62
complus/gpgcom.idl
Normal file
62
complus/gpgcom.idl
Normal file
@ -0,0 +1,62 @@
|
||||
/* ignupg.idl - Interface definition for the COM+ class GnuPG
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
import "unknwn.idl";
|
||||
import "oaidl.idl";
|
||||
|
||||
|
||||
[ object, uuid(3811fd50-7f72-11d5-8c9e-0080ad190cd5), dual]
|
||||
interface IGpgme : IDispatch
|
||||
{
|
||||
HRESULT GetVersion([out] BSTR *retval);
|
||||
HRESULT GetEngineInfo([out] BSTR *retval);
|
||||
HRESULT Cancel(void);
|
||||
[propput] HRESULT Armor([in] BOOL flag);
|
||||
[propget] HRESULT Armor([out, retval] BOOL *retval);
|
||||
[propput] HRESULT Textmode([in] BOOL flag);
|
||||
[propget] HRESULT Textmode([out, retval] BOOL *retval);
|
||||
[propput] HRESULT Plaintext([in] VARIANT val);
|
||||
[propget] HRESULT Plaintext([out, retval] VARIANT *retval);
|
||||
[propput] HRESULT Ciphertext([in] VARIANT val);
|
||||
[propget] HRESULT Ciphertext([out,retval] VARIANT *retval);
|
||||
HRESULT ClearRecipients(void);
|
||||
HRESULT AddRecipient([in] BSTR name,
|
||||
[in, optional, defaultvalue(-1)] signed short trust);
|
||||
HRESULT ResetSignKeys(void);
|
||||
HRESULT AddSignKey([in] BSTR name);
|
||||
HRESULT Encrypt(void);
|
||||
HRESULT Sign([in,optional,defaultvalue(0)] signed short signmode);
|
||||
HRESULT SignEncrypt([in,optional,defaultvalue(0)] signed short signmode);
|
||||
|
||||
};
|
||||
|
||||
|
||||
[ uuid(3811fd48-7f72-11d5-8c9e-0080ad190cd5),
|
||||
helpstring("g10Code.gpgcom, type library"),
|
||||
version(1.0) ]
|
||||
library GpgcomLib
|
||||
{
|
||||
[ uuid(3811fd40-7f72-11d5-8c9e-0080ad190cd5) ]
|
||||
coclass Gpgcom
|
||||
{
|
||||
[default] interface IGpgme;
|
||||
}
|
||||
};
|
22
complus/gpgcom.rc
Normal file
22
complus/gpgcom.rc
Normal file
@ -0,0 +1,22 @@
|
||||
/* gpgcom.rc - Resource file for gpgcom
|
||||
* 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
|
||||
*/
|
||||
|
||||
1 TYPELIB "gpgcom.tlb"
|
||||
|
BIN
complus/gpgcom.tlb
Normal file
BIN
complus/gpgcom.tlb
Normal file
Binary file not shown.
@ -1,95 +0,0 @@
|
||||
/* guiddef.h
|
||||
|
||||
Copyright (c) 1993-2000 the Wine project authors (see the file WINE-AUTHORS
|
||||
for a complete list)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/* already defined bu Mingw32/cpd
|
||||
#ifndef GUID_DEFINED
|
||||
#define GUID_DEFINED
|
||||
typedef struct _GUID
|
||||
{
|
||||
unsigned long Data1;
|
||||
unsigned short Data2;
|
||||
unsigned short Data3;
|
||||
unsigned char Data4[ 8 ];
|
||||
} GUID;
|
||||
#endif
|
||||
*/
|
||||
|
||||
#undef DEFINE_GUID
|
||||
|
||||
#ifdef INITGUID
|
||||
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
const GUID name = \
|
||||
{ l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
|
||||
#else
|
||||
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
extern const GUID name
|
||||
#endif
|
||||
|
||||
#define DEFINE_OLEGUID(name, l, w1, w2) \
|
||||
DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
|
||||
|
||||
#ifndef _GUIDDEF_H_
|
||||
#define _GUIDDEF_H_
|
||||
|
||||
/* typedef GUID *LPGUID;
|
||||
typedef GUID CLSID,*LPCLSID; */
|
||||
typedef GUID IID,*LPIID;
|
||||
typedef GUID FMTID,*LPFMTID;
|
||||
|
||||
#if defined(__cplusplus) && !defined(CINTERFACE)
|
||||
#define REFGUID const GUID &
|
||||
#define REFCLSID const CLSID &
|
||||
#define REFIID const IID &
|
||||
#define REFFMTID const FMTID &
|
||||
#else /* !defined(__cplusplus) && !defined(CINTERFACE) */
|
||||
#define REFGUID const GUID* const
|
||||
#define REFCLSID const CLSID* const
|
||||
#define REFIID const IID* const
|
||||
#define REFFMTID const FMTID* const
|
||||
#endif /* !defined(__cplusplus) && !defined(CINTERFACE) */
|
||||
|
||||
#if defined(__cplusplus) && !defined(CINTERFACE)
|
||||
#define IsEqualGUID(rguid1, rguid2) (!memcmp(&(rguid1), &(rguid2), sizeof(GUID)))
|
||||
#else /* defined(__cplusplus) && !defined(CINTERFACE) */
|
||||
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
|
||||
#endif /* defined(__cplusplus) && !defined(CINTERFACE) */
|
||||
#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
|
||||
#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
|
||||
|
||||
#if defined(__cplusplus) && !defined(CINTERFACE)
|
||||
inline bool operator==(const GUID& guidOne, const GUID& guidOther)
|
||||
{
|
||||
return !memcmp(&guidOne,&guidOther,sizeof(GUID));
|
||||
}
|
||||
inline bool operator!=(const GUID& guidOne, const GUID& guidOther)
|
||||
{
|
||||
return !(guidOne == guidOther);
|
||||
}
|
||||
#endif
|
||||
|
||||
extern const IID GUID_NULL;
|
||||
#define IID_NULL GUID_NULL
|
||||
#define CLSID_NULL GUID_NULL
|
||||
#define FMTID_NULL GUID_NULL
|
||||
|
||||
#endif /* _GUIDDEF_H_ */
|
202
complus/ignupg.c
202
complus/ignupg.c
@ -1,202 +0,0 @@
|
||||
/* ignupg.c - COM+ class IGnuPG
|
||||
* Copyright (C) 2000 Werner Koch (dd9jn)
|
||||
*
|
||||
* 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 "ignupg.h"
|
||||
|
||||
/*
|
||||
* Declare the interface implementation structures
|
||||
*/
|
||||
typedef struct IGnuPGImpl IGnuPGImpl;
|
||||
typedef struct IClassFactoryImpl IClassFactoryImpl;
|
||||
|
||||
|
||||
struct IGnuPGImpl {
|
||||
/* IUnknown required stuff */
|
||||
ICOM_VFIELD (IGnuPG);
|
||||
DWORD ref;
|
||||
/* Our stuff */
|
||||
int foo;
|
||||
};
|
||||
|
||||
|
||||
struct IClassFactoryImpl {
|
||||
/* IUnknown fields */
|
||||
ICOM_VFIELD(IClassFactory);
|
||||
DWORD ref;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**********************************************************
|
||||
************** IGnuPG Implementation *******************
|
||||
**********************************************************/
|
||||
|
||||
static HRESULT WINAPI
|
||||
IGnuPGImpl_QueryInterface (IGnuPG *iface, REFIID refiid, LPVOID *obj)
|
||||
{
|
||||
ICOM_THIS (IGnuPGImpl,iface);
|
||||
|
||||
fprintf (stderr,"(%p)->QueryInterface(%s,%p)\n",
|
||||
This, "debugstr_guid(refiid)", obj);
|
||||
if ( IsEqualGUID (&IID_IUnknown, refiid)
|
||||
|| !IsEqualGUID (&IID_IGnuPG, refiid) ) {
|
||||
*obj = iface;
|
||||
return 0;
|
||||
}
|
||||
*obj = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
||||
static ULONG WINAPI
|
||||
IGnuPGImpl_AddRef (IGnuPG *iface)
|
||||
{
|
||||
ICOM_THIS (IGnuPGImpl,iface);
|
||||
|
||||
return ++This->ref;
|
||||
}
|
||||
|
||||
|
||||
static ULONG WINAPI
|
||||
IGnuPGImpl_Release (IGnuPG *iface)
|
||||
{
|
||||
ICOM_THIS (IGnuPGImpl,iface);
|
||||
|
||||
if (--This->ref)
|
||||
return This->ref;
|
||||
|
||||
HeapFree(GetProcessHeap(),0,iface);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static ICOM_VTABLE(IGnuPG) gnupg_vtbl =
|
||||
{
|
||||
/* IUnknow methods */
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
IGnuPGImpl_QueryInterface,
|
||||
IGnuPGImpl_AddRef,
|
||||
IGnuPGImpl_Release,
|
||||
/* Our methods */
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
/***************************************************************
|
||||
****************** GnuPG Factory ****************************
|
||||
***************************************************************/
|
||||
|
||||
static HRESULT WINAPI
|
||||
GnuPGFactory_QueryInterface (IClassFactory *iface, REFIID refiid, LPVOID *obj)
|
||||
{
|
||||
/*ICOM_THIS(IClassFactoryImpl,iface);*/
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI
|
||||
GnuPGFactory_AddRef (IClassFactory *iface)
|
||||
{
|
||||
ICOM_THIS(IClassFactoryImpl,iface);
|
||||
return ++(This->ref);
|
||||
}
|
||||
|
||||
static ULONG WINAPI
|
||||
GnuPGFactory_Release (IClassFactory *iface)
|
||||
{
|
||||
ICOM_THIS(IClassFactoryImpl,iface);
|
||||
return --(This->ref);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
GnuPGFactory_CreateInstance (IClassFactory *iface, IUnknown *outer,
|
||||
REFIID refiid, LPVOID *r_obj )
|
||||
{
|
||||
/*ICOM_THIS(IClassFactoryImpl,iface);*/
|
||||
|
||||
if ( IsEqualGUID (&IID_IGnuPG, refiid) ) {
|
||||
IGnuPGImpl *obj;
|
||||
|
||||
obj = HeapAlloc (GetProcessHeap(), 0, sizeof *obj );
|
||||
if ( !obj)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
ICOM_VTBL(obj) = &gnupg_vtbl;
|
||||
obj->ref = 1;
|
||||
*r_obj = obj;
|
||||
return 0;
|
||||
}
|
||||
*r_obj = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
GnuPGFactory_LockServer (IClassFactory *iface, BOOL dolock )
|
||||
{
|
||||
/*ICOM_THIS(IClassFactoryImpl,iface);*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ICOM_VTABLE(IClassFactory) gnupg_factory_vtbl = {
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
GnuPGFactory_QueryInterface,
|
||||
GnuPGFactory_AddRef,
|
||||
GnuPGFactory_Release,
|
||||
GnuPGFactory_CreateInstance,
|
||||
GnuPGFactory_LockServer
|
||||
};
|
||||
static IClassFactoryImpl GnuPG_CF = {&gnupg_factory_vtbl, 1 };
|
||||
|
||||
|
||||
IClassFactory *
|
||||
gnupg_factory_new ( CLSID *r_clsid )
|
||||
{
|
||||
*r_clsid = CLSID_GnuPG;
|
||||
IClassFactory_AddRef((IClassFactory*)&GnuPG_CF);
|
||||
return (IClassFactory*)&GnuPG_CF;
|
||||
}
|
||||
|
||||
void
|
||||
gnupg_factory_release ( IClassFactory *factory )
|
||||
{
|
||||
/* it's static - nothing to do */
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,68 +0,0 @@
|
||||
/* ignupg.h - COM+ class IGnuPG
|
||||
* Copyright (C) 2000 Werner Koch (dd9jn)
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef IGNUPG_H
|
||||
#define IGNUPG_H 1
|
||||
|
||||
#include "obj_base.h"
|
||||
|
||||
DEFINE_GUID(CLSID_GnuPG, 0x42424242, 0x62e8, 0x11cf,
|
||||
0x93, 0xbc, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0);
|
||||
DEFINE_GUID(IID_IGnuPG, 0x24242424, 0x4981, 0x11CE,
|
||||
0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60);
|
||||
typedef struct IGnuPG IGnuPG;
|
||||
|
||||
|
||||
|
||||
#define ICOM_INTERFACE IGnuPG
|
||||
|
||||
#define IGnuPG_METHODS \
|
||||
ICOM_METHOD1(HRESULT,Initialize, REFIID,) \
|
||||
ICOM_METHOD1(HRESULT,EnumDevices, LPVOID,)
|
||||
|
||||
#define IGnuPG_IMETHODS \
|
||||
IUnknown_IMETHODS \
|
||||
IGnuPG_METHODS
|
||||
|
||||
ICOM_DEFINE(IGnuPG,IUnknown)
|
||||
#undef ICOM_INTERFACE
|
||||
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
#define IGnuPG_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
|
||||
#define IGnuPG_AddRef(p) ICOM_CALL (AddRef,p)
|
||||
#define IGnuPG_Release(p) ICOM_CALL (Release,p)
|
||||
/*** IGnuPG methods ***/
|
||||
#define IGnuPG_Initialize(p,a) ICOM_CALL1(Initialize,p,a)
|
||||
#define IGnuPG_EnumDevices(p,a,b) ICOM_CALL2(EnumDevice,p,a,b)
|
||||
|
||||
|
||||
#endif /*IGNUPG_H*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
903
complus/igpgme.c
Normal file
903
complus/igpgme.c
Normal file
@ -0,0 +1,903 @@
|
||||
/* igpgme.c - COM+ class IGpgme
|
||||
* 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>
|
||||
|
||||
#include "../gpgme/gpgme.h"
|
||||
|
||||
/* FIXME: Put them into an extra header */
|
||||
void *_gpgme_malloc (size_t n );
|
||||
void *_gpgme_calloc (size_t n, size_t m );
|
||||
void *_gpgme_realloc (void *p, size_t n);
|
||||
char *_gpgme_strdup (const char *p);
|
||||
void _gpgme_free ( void *a );
|
||||
|
||||
|
||||
|
||||
#define INITGUID
|
||||
#include "igpgme.h"
|
||||
|
||||
/*
|
||||
* Declare the interface implementation structures
|
||||
*/
|
||||
typedef struct IGpgmeImpl IGpgmeImpl;
|
||||
typedef struct IClassFactoryImpl IClassFactoryImpl;
|
||||
|
||||
|
||||
struct IGpgmeImpl {
|
||||
/* IUnknown required stuff */
|
||||
ICOM_VFIELD (IGpgme);
|
||||
DWORD ref;
|
||||
/* Delegation to IDispatch */
|
||||
struct {
|
||||
IUnknown *disp;
|
||||
ITypeInfo *tinfo;
|
||||
} std_disp;
|
||||
/* Our stuff */
|
||||
GpgmeCtx mainctx;
|
||||
GpgmeData plaintext;
|
||||
int plaintext_given_as_bstr;
|
||||
GpgmeData ciphertext;
|
||||
int ciphertext_is_armored;
|
||||
GpgmeRecipients rset;
|
||||
};
|
||||
|
||||
|
||||
struct IClassFactoryImpl {
|
||||
/* IUnknown fields */
|
||||
ICOM_VFIELD(IClassFactory);
|
||||
DWORD ref;
|
||||
};
|
||||
|
||||
/**********************************************************
|
||||
************** helper functions ************************
|
||||
*********************************************************/
|
||||
static HRESULT
|
||||
map_gpgme_error (GpgmeError err)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if (!err)
|
||||
return 0;
|
||||
if ( err < 0 || err > 0x1000 ) {
|
||||
fprintf (stderr,"*** GpgmeError `%s' mapped to GPGME_General_Error\n",
|
||||
gpgme_strerror (err) );
|
||||
err = GPGME_General_Error;
|
||||
}
|
||||
hr = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 0x1000 + err);
|
||||
fprintf (stderr,"*** GpgmeError `%s' mapped to %lx\n",
|
||||
gpgme_strerror (err), (unsigned long)hr );
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************
|
||||
************** IGpgme Implementation *******************
|
||||
*********************************************************/
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_QueryInterface (IGpgme *iface, REFIID refiid, LPVOID *obj)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
/*fprintf (stderr,"*** m_IGpgme_QueryInterface(%p,%s)",
|
||||
This, debugstr_guid(refiid));*/
|
||||
if ( IsEqualGUID (&IID_IUnknown, refiid)
|
||||
|| IsEqualGUID (&IID_IGpgme, refiid) ) {
|
||||
*obj = This;
|
||||
IGpgme_AddRef (iface);
|
||||
fprintf (stderr," -> got %p\n", *obj);
|
||||
return 0;
|
||||
}
|
||||
else if ( IsEqualGUID (&IID_IDispatch, refiid) ) {
|
||||
HRESULT hr = IDispatch_QueryInterface (This->std_disp.disp,
|
||||
refiid, obj);
|
||||
/*fprintf (stderr," -> delegated, hr=%lx, got %p\n",
|
||||
hr, hr? NULL: *obj);*/
|
||||
return hr;
|
||||
}
|
||||
/*fprintf (stderr," -> none\n");*/
|
||||
*obj = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
||||
static ULONG WINAPI
|
||||
m_IGpgme_AddRef (IGpgme *iface)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
return ++This->ref;
|
||||
}
|
||||
|
||||
|
||||
static ULONG WINAPI
|
||||
m_IGpgme_Release (IGpgme *iface)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
if (--This->ref)
|
||||
return This->ref;
|
||||
|
||||
gpgme_release (This->mainctx); This->mainctx = NULL;
|
||||
gpgme_data_release (This->plaintext); This->plaintext = NULL;
|
||||
gpgme_data_release (This->ciphertext); This->ciphertext = NULL;
|
||||
gpgme_recipients_release (This->rset); This->rset = NULL;
|
||||
if (This->std_disp.disp)
|
||||
IDispatch_Release (This->std_disp.disp);
|
||||
if (This->std_disp.tinfo)
|
||||
ITypeInfo_Release (This->std_disp.tinfo);
|
||||
HeapFree(GetProcessHeap(),0,iface);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_stub_IDispatch_GetTypeInfoCount (IGpgme *iface, unsigned int *pctinfo)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_stub_IDispatch_GetTypeInfo (IGpgme *iface, UINT iTInfo,
|
||||
LCID lcid, ITypeInfo **ppTInfo)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_stub_IDispatch_GetIDsOfNames (IGpgme *iface, REFIID riid,
|
||||
LPOLESTR *rgszNames, UINT cNames,
|
||||
LCID lcid, DISPID *rgDispId)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_stub_IDispatch_Invoke (IGpgme *iface, DISPID dispIdMember,
|
||||
REFIID riid, LCID lcid, WORD wFlags,
|
||||
DISPPARAMS *pDispParams, VARIANT *pVarResult,
|
||||
EXCEPINFO *pExepInfo, UINT *puArgErr)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetVersion (IGpgme *iface, BSTR *retvat)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetEngineInfo (IGpgme *iface, BSTR *retval)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_Cancel (IGpgme *iface)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SetArmor (IGpgme *iface, BOOL yes)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
gpgme_set_armor (This->mainctx, yes);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetArmor (IGpgme *iface, BOOL *retval)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
*retval = gpgme_get_armor (This->mainctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SetTextmode (IGpgme *iface, BOOL yes)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
gpgme_set_textmode (This->mainctx, yes);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetTextmode (IGpgme *iface, BOOL *retval)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Put the data from VAL into a a Gpgme data object, which is passed by
|
||||
* reference. Valid types of the Variant are: BSTR, SAFEARRAY of BYTE and
|
||||
* SAFEARRAY of VARIANTS of signed or unsigned integers.
|
||||
*/
|
||||
static HRESULT WINAPI
|
||||
set_data_from_variant (GpgmeData *data, VARIANT val, int *given_as_bstr)
|
||||
{
|
||||
GpgmeError err = 0;
|
||||
HRESULT hr;
|
||||
unsigned char *buf;
|
||||
SAFEARRAY *array;
|
||||
size_t len;
|
||||
int i;
|
||||
|
||||
if ( val.vt == VT_BSTR) {
|
||||
len = bstrtoutf8 (val.u.bstrVal, NULL, 0);
|
||||
buf = _gpgme_malloc (len);
|
||||
if (!buf)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
if (bstrtoutf8 (val.u.bstrVal, buf, len) < 0) {
|
||||
fprintf (stderr,"problem with bstrtoutf8\n");
|
||||
_gpgme_free (buf);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
fprintf (stderr,"Got a BSTR (utf8):");
|
||||
for (i=0; i < len; i++)
|
||||
fprintf (stderr, " %0X", buf[i] );
|
||||
putc ('\n', stderr);
|
||||
gpgme_data_release (*data); *data = NULL;
|
||||
err = gpgme_data_new_from_mem (data, buf, len, 0 /*no need to copy*/ );
|
||||
if (!err && given_as_bstr)
|
||||
*given_as_bstr = 1;
|
||||
}
|
||||
else if ( val.vt == (VT_ARRAY|VT_UI1)) {
|
||||
array = val.u.parray;
|
||||
|
||||
fprintf (stderr,"Got an ARRAY of bytes:");
|
||||
hr = SafeArrayAccessData (array, (void**)&buf);
|
||||
if (hr) {
|
||||
fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr);
|
||||
return hr;
|
||||
}
|
||||
len = array->rgsabound[0].cElements;
|
||||
for (i=0; i < len; i++)
|
||||
fprintf (stderr, " %0X", buf[i] );
|
||||
putc ('\n', stderr);
|
||||
|
||||
gpgme_data_release (*data); *data = NULL;
|
||||
err = gpgme_data_new_from_mem (data, buf, len, 1 );
|
||||
SafeArrayUnaccessData (array);
|
||||
if (given_as_bstr)
|
||||
*given_as_bstr = 0;
|
||||
}
|
||||
else if ( val.vt == (VT_ARRAY|VT_VARIANT)) {
|
||||
VARIANT *vp;
|
||||
array = val.u.parray;
|
||||
|
||||
fprintf (stderr,"Got an ARRAY of VARIANTS:");
|
||||
hr = SafeArrayAccessData (array, (void**)&vp);
|
||||
if (hr) {
|
||||
fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr);
|
||||
return hr;
|
||||
}
|
||||
len = array->rgsabound[0].cElements;
|
||||
/* allocate the array using the gpgme allocator so that we can
|
||||
* later use a new without the copy set*/
|
||||
buf = _gpgme_malloc (len);
|
||||
if (!buf) {
|
||||
SafeArrayUnaccessData (array);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
/* coerce all array elements into rawtext */
|
||||
for (i=0; i < len; i++) {
|
||||
switch (vp[i].vt) {
|
||||
case VT_I1: buf[i] = (BYTE)vp[i].u.cVal; break;
|
||||
case VT_I2: buf[i] = ((UINT)vp[i].u.iVal) & 0xff; break;
|
||||
case VT_I4: buf[i] = ((ULONG)vp[i].u.lVal) & 0xff; break;
|
||||
case VT_INT: buf[i] = ((UINT)vp[i].u.intVal) & 0xff; break;
|
||||
case VT_UI1: buf[i] = vp[i].u.bVal; break;
|
||||
case VT_UI2: buf[i] = vp[i].u.uiVal & 0xff; break;
|
||||
case VT_UI4: buf[i] = vp[i].u.ulVal & 0xff; break;
|
||||
case VT_UINT: buf[i] = vp[i].u.uintVal & 0xff; break;
|
||||
default:
|
||||
fprintf (stderr, "Invalid value in array as pos %d\n", i);
|
||||
_gpgme_free (buf);
|
||||
SafeArrayUnaccessData (array);
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i < len; i++)
|
||||
fprintf (stderr, " %0X", buf[i] );
|
||||
putc ('\n', stderr);
|
||||
|
||||
gpgme_data_release (*data); *data = NULL;
|
||||
err = gpgme_data_new_from_mem (data, buf, len, 0);
|
||||
SafeArrayUnaccessData (array);
|
||||
if (given_as_bstr)
|
||||
*given_as_bstr = 0;
|
||||
}
|
||||
else {
|
||||
fprintf (stderr, "Got a variant type = %d (0x%x)\n",
|
||||
(int)val.vt, (int)val.vt );
|
||||
return E_INVALIDARG; /* not a safearray of bytes */
|
||||
}
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
set_data_to_variant (GpgmeData data, VARIANT *retval, int use_bstr)
|
||||
{
|
||||
GpgmeError err;
|
||||
HRESULT hr;
|
||||
SAFEARRAY *array;
|
||||
char *p;
|
||||
size_t nread, len;
|
||||
int i;
|
||||
|
||||
/* Get some info on the data */
|
||||
err = gpgme_data_rewind (data);
|
||||
if (err ) {
|
||||
fprintf (stderr, "*** gpgme_data_rewind failed: %d\n", err);
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
err = gpgme_data_read (data, NULL, 0, &nread);
|
||||
if (err && err != GPGME_EOF ) {
|
||||
fprintf (stderr, "*** gpgme_data_read [length] failed: %d\n", err);
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
len = nread; /*(eof returns a length of 0)*/
|
||||
fprintf (stderr,"*** %d bytes are availabe\n", (int)len);
|
||||
|
||||
/* convert it to the target data type */
|
||||
if (use_bstr) {
|
||||
BSTR bs;
|
||||
unsigned char *helpbuf;
|
||||
|
||||
fprintf (stderr," using BSTR\n");
|
||||
/* It is easier to allocate some helper storage */
|
||||
helpbuf = _gpgme_malloc (len);
|
||||
if (!helpbuf)
|
||||
return E_OUTOFMEMORY;
|
||||
err = gpgme_data_read (data, helpbuf, len, &nread);
|
||||
if (err ) {
|
||||
_gpgme_free (helpbuf);
|
||||
fprintf (stderr, "*** gpgme_data_read [data] failed: %d\n", err);
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
|
||||
bs = SysAllocStringLen (NULL, len+1);
|
||||
if (!bs) {
|
||||
_gpgme_free (helpbuf);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
for (i=0, p=helpbuf; i < len; i++, p++)
|
||||
bs[i] = *p;
|
||||
bs[i] = 0;
|
||||
_gpgme_free (helpbuf);
|
||||
|
||||
/* Ready */
|
||||
VariantInit (retval);
|
||||
retval->vt = VT_BSTR;
|
||||
retval->u.bstrVal = bs;
|
||||
}
|
||||
#if 0
|
||||
else if (use_byte_array) {
|
||||
array = SafeArrayCreateVector (VT_UI1, 0, len);
|
||||
if (!array)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
p = NULL;
|
||||
hr = SafeArrayAccessData (array, (void**)&p);
|
||||
if (hr) {
|
||||
fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr);
|
||||
SafeArrayDestroyData (array);
|
||||
SafeArrayDestroy (array);
|
||||
return hr;
|
||||
}
|
||||
if (len) {
|
||||
err = gpgme_data_read (data, p, len, &nread);
|
||||
if (err ) {
|
||||
SafeArrayUnaccessData (array);
|
||||
SafeArrayDestroyData (array);
|
||||
SafeArrayDestroy (array);
|
||||
fprintf (stderr, "*** gpgme_data_read [data] failed: %d\n",
|
||||
err);
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
}
|
||||
SafeArrayUnaccessData (array);
|
||||
|
||||
/* pass the data to the caller */
|
||||
VariantInit (retval);
|
||||
retval->vt = (VT_ARRAY|VT_UI1);
|
||||
retval->u.parray = array;
|
||||
}
|
||||
#endif
|
||||
else { /* Create an array of variants of bytes */
|
||||
VARIANT *v;
|
||||
unsigned char *helpbuf;
|
||||
|
||||
/* It is easier to allocate some helper storage */
|
||||
helpbuf = _gpgme_malloc (len);
|
||||
if (!helpbuf)
|
||||
return E_OUTOFMEMORY;
|
||||
err = gpgme_data_read (data, helpbuf, len, &nread);
|
||||
if (err ) {
|
||||
_gpgme_free (helpbuf);
|
||||
fprintf (stderr, "*** gpgme_data_read [data] failed: %d\n", err);
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
|
||||
/* The create the array */
|
||||
array = SafeArrayCreateVector (VT_VARIANT, 0, len);
|
||||
if (!array) {
|
||||
_gpgme_free (helpbuf);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
v = NULL;
|
||||
hr = SafeArrayAccessData (array, (void**)&v);
|
||||
if (hr) {
|
||||
fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr);
|
||||
_gpgme_free (helpbuf);
|
||||
SafeArrayDestroyData (array);
|
||||
SafeArrayDestroy (array);
|
||||
return hr;
|
||||
}
|
||||
|
||||
for (p=helpbuf; len; len--, v++) {
|
||||
VariantInit (v);
|
||||
v->vt = VT_UI1;
|
||||
v->u.bVal = *p;
|
||||
}
|
||||
SafeArrayUnaccessData (array);
|
||||
_gpgme_free (helpbuf);
|
||||
|
||||
/* pass the data to the caller */
|
||||
VariantInit (retval);
|
||||
retval->vt = (VT_ARRAY|VT_VARIANT);
|
||||
retval->u.parray = array;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SetPlaintext (IGpgme *iface, VARIANT val)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
return set_data_from_variant (&This->plaintext, val,
|
||||
&This->plaintext_given_as_bstr);
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetPlaintext (IGpgme *iface, VARIANT *retval)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
return set_data_to_variant (This->plaintext, retval,
|
||||
This->plaintext_given_as_bstr);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SetCiphertext (IGpgme *iface, VARIANT val)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
return set_data_from_variant (&This->ciphertext, val, NULL);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetCiphertext (IGpgme *iface, VARIANT *retval)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
return set_data_to_variant (This->ciphertext, retval,
|
||||
This->ciphertext_is_armored);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_ClearRecipients (IGpgme *iface)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
gpgme_recipients_release (This->rset); This->rset = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_AddRecipient (IGpgme *iface, BSTR name, signed short int trust)
|
||||
{
|
||||
GpgmeError err;
|
||||
int n;
|
||||
char *p;
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p, %d)\n", This, (int)trust);
|
||||
if (!This->rset) {
|
||||
err = gpgme_recipients_new (&This->rset);
|
||||
if (err)
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
|
||||
n = bstrtoutf8 (name, NULL, 0);
|
||||
p = HeapAlloc (GetProcessHeap(), 0, n );
|
||||
if (!p) {
|
||||
fprintf (stderr,"HeapAlloc failed: ec=%d\n", (int)GetLastError () );
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
if (bstrtoutf8 (name, p, n) < 0) {
|
||||
fprintf (stderr,"problem with bstrtoutf8\n");
|
||||
HeapFree (GetProcessHeap(), 0, p);
|
||||
return E_FAIL;
|
||||
}
|
||||
fprintf (stderr,"*** adding name `%s'\n", p);
|
||||
err = gpgme_recipients_add_name (This->rset, p);
|
||||
HeapFree (GetProcessHeap(), 0, p);
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_ResetSignKeys (IGpgme *iface)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_AddSignKey (IGpgme *iface, BSTR name)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_Encrypt (IGpgme *iface)
|
||||
{
|
||||
GpgmeError err;
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
gpgme_data_release (This->ciphertext);
|
||||
err = gpgme_data_new (&This->ciphertext);
|
||||
if (err)
|
||||
return map_gpgme_error (err);
|
||||
|
||||
|
||||
This->ciphertext_is_armored = gpgme_get_armor (This->mainctx);
|
||||
err = gpgme_op_encrypt (This->mainctx, This->rset,
|
||||
This->plaintext, This->ciphertext);
|
||||
#if 0
|
||||
if (!err ) {
|
||||
char buf[100];
|
||||
size_t nread;
|
||||
|
||||
err = gpgme_data_rewind ( This->ciphertext );
|
||||
if (err )
|
||||
fprintf (stderr, "*** gpgme_data_rewind failed: %d\n", err);
|
||||
while ( !(err = gpgme_data_read ( This->ciphertext,
|
||||
buf, 100, &nread )) ) {
|
||||
fwrite ( buf, nread, 1, stderr );
|
||||
}
|
||||
if (err != GPGME_EOF)
|
||||
fprintf (stderr, "*** gpgme_data_read failed: %d\n", err);
|
||||
err = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return map_gpgme_error (err);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_Sign (IGpgme *iface, short int signmode)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SignEncrypt (IGpgme *iface, short int signmode)
|
||||
{
|
||||
ICOM_THIS (IGpgmeImpl,iface);
|
||||
|
||||
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SetKeylistMode( GpgmeCtx c, BOOL mode )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SetPassphraseCB (GpgmeCtx c,
|
||||
GpgmePassphraseCb cb, void *cb_value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SetProgressCB (GpgmeCtx c, GpgmeProgressCb cb, void *cb_value)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SignersClear (GpgmeCtx c)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SignersAdd (GpgmeCtx c, const GpgmeKey key)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_SignersEnum (const GpgmeCtx c, int seq)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetSigStatus(GpgmeCtx c, int idx,
|
||||
GpgmeSigStat *r_stat, time_t *r_created );
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetSigKey (GpgmeCtx c, int idx, GpgmeKey *r_key);
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_IGpgme_GetNotation(IGpgme *c, BSTR *retval)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static ICOM_VTABLE(IGpgme) igpgme_vtbl =
|
||||
{
|
||||
/* IUnknown methods */
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
m_IGpgme_QueryInterface,
|
||||
m_IGpgme_AddRef,
|
||||
m_IGpgme_Release,
|
||||
/* IDispatch methods */
|
||||
m_stub_IDispatch_GetTypeInfoCount,
|
||||
m_stub_IDispatch_GetTypeInfo,
|
||||
m_stub_IDispatch_GetIDsOfNames,
|
||||
m_stub_IDispatch_Invoke,
|
||||
/* Our methods */
|
||||
m_IGpgme_GetVersion,
|
||||
m_IGpgme_GetEngineInfo,
|
||||
m_IGpgme_Cancel,
|
||||
m_IGpgme_SetArmor,
|
||||
m_IGpgme_GetArmor,
|
||||
m_IGpgme_SetTextmode,
|
||||
m_IGpgme_GetTextmode,
|
||||
m_IGpgme_SetPlaintext,
|
||||
m_IGpgme_GetPlaintext,
|
||||
m_IGpgme_SetCiphertext,
|
||||
m_IGpgme_GetCiphertext,
|
||||
m_IGpgme_ClearRecipients,
|
||||
m_IGpgme_AddRecipient,
|
||||
m_IGpgme_ResetSignKeys,
|
||||
m_IGpgme_AddSignKey,
|
||||
m_IGpgme_Encrypt,
|
||||
m_IGpgme_Sign,
|
||||
m_IGpgme_SignEncrypt,
|
||||
/* m_IGpgme_SetKeylistMode,
|
||||
* m_IGpgme_SetPassphraseCB,
|
||||
* m_IGpgme_SetProgressCB,
|
||||
* m_IGpgme_SignersClear,
|
||||
* m_IGpgme_SignersAdd,
|
||||
* m_IGpgme_SignersEnum,
|
||||
* m_IGpgme_GetSigStatus,
|
||||
* m_IGpgme_GetSigKey,
|
||||
* m_IGpgme_GetNotation
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
|
||||
/***************************************************************
|
||||
****************** Gpgme Factory ****************************
|
||||
***************************************************************/
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_GpgmeFactory_QueryInterface (IClassFactory *iface,
|
||||
REFIID refiid, LPVOID *obj)
|
||||
{
|
||||
ICOM_THIS (IClassFactoryImpl,iface);
|
||||
|
||||
/*fprintf (stderr,"*** m_GpgmeFactory_QueryInterface(%p,%s)",
|
||||
This, debugstr_guid(refiid));*/
|
||||
if ( IsEqualGUID (&IID_IUnknown, refiid)
|
||||
|| IsEqualGUID (&IID_IClassFactory, refiid) ) {
|
||||
*obj = This;
|
||||
/*fprintf (stderr," -> got %p\n", obj);*/
|
||||
return 0;
|
||||
}
|
||||
*obj = NULL;
|
||||
/*fprintf (stderr," -> none\n");*/
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI
|
||||
m_GpgmeFactory_AddRef (IClassFactory *iface)
|
||||
{
|
||||
ICOM_THIS(IClassFactoryImpl,iface);
|
||||
return ++(This->ref);
|
||||
}
|
||||
|
||||
static ULONG WINAPI
|
||||
m_GpgmeFactory_Release (IClassFactory *iface)
|
||||
{
|
||||
ICOM_THIS(IClassFactoryImpl,iface);
|
||||
return --(This->ref);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_GpgmeFactory_CreateInstance (IClassFactory *iface, IUnknown *outer,
|
||||
REFIID refiid, LPVOID *r_obj )
|
||||
{
|
||||
/*ICOM_THIS(IClassFactoryImpl,iface);*/
|
||||
|
||||
fprintf (stderr,"*** m_GpgmeFactory_CreateInstance(%s)",
|
||||
debugstr_guid(refiid) );
|
||||
if ( IsEqualGUID (&IID_IUnknown, refiid)
|
||||
|| IsEqualGUID (&IID_IGpgme, refiid) ) {
|
||||
IGpgmeImpl *obj;
|
||||
GpgmeCtx ctx;
|
||||
GpgmeError err;
|
||||
|
||||
|
||||
err = gpgme_new (&ctx);
|
||||
if (err) {
|
||||
fprintf (stderr," -> gpgme_new failed: %s\n", gpgme_strerror (err));
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
obj = HeapAlloc (GetProcessHeap(), 0, sizeof *obj );
|
||||
if ( !obj) {
|
||||
fprintf (stderr," -> out of core\n");
|
||||
gpgme_release (ctx);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
memset (obj, 0, sizeof *obj);
|
||||
|
||||
ICOM_VTBL(obj) = &igpgme_vtbl;
|
||||
obj->ref = 1;
|
||||
obj->mainctx = ctx;
|
||||
{ /* Fixme: need to release some stuff on error */
|
||||
HRESULT hr;
|
||||
ITypeLib *pTypeLib;
|
||||
|
||||
hr = LoadRegTypeLib (&TLBID_Gpgcom, 1, 0, LANG_NEUTRAL, &pTypeLib);
|
||||
if (hr) {
|
||||
fprintf (stderr," -> LoadRegTypeLib failed: %lx\n", hr);
|
||||
return hr;
|
||||
}
|
||||
hr = ITypeLib_GetTypeInfoOfGuid (pTypeLib, &IID_IGpgme,
|
||||
&obj->std_disp.tinfo);
|
||||
ITypeLib_Release (pTypeLib);
|
||||
if (hr) {
|
||||
fprintf (stderr," -> GetTypeInfoOfGuid failed: %lx\n", hr);
|
||||
return hr;
|
||||
}
|
||||
hr = CreateStdDispatch ((IUnknown*)obj, obj, obj->std_disp.tinfo,
|
||||
&obj->std_disp.disp);
|
||||
if (hr) {
|
||||
fprintf (stderr," -> CreateStdDispatch failed: %lx\n", hr);
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
|
||||
*r_obj = obj;
|
||||
fprintf (stderr," -> created %p\n", obj );
|
||||
return 0;
|
||||
}
|
||||
fprintf (stderr," -> no interface\n" );
|
||||
*r_obj = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI
|
||||
m_GpgmeFactory_LockServer (IClassFactory *iface, BOOL dolock )
|
||||
{
|
||||
/*ICOM_THIS(IClassFactoryImpl,iface);*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ICOM_VTABLE(IClassFactory) igpgme_factory_vtbl = {
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
m_GpgmeFactory_QueryInterface,
|
||||
m_GpgmeFactory_AddRef,
|
||||
m_GpgmeFactory_Release,
|
||||
m_GpgmeFactory_CreateInstance,
|
||||
m_GpgmeFactory_LockServer
|
||||
};
|
||||
static IClassFactoryImpl igpgme_CF = {&igpgme_factory_vtbl, 1 };
|
||||
|
||||
|
||||
IClassFactory *
|
||||
igpgme_factory_new ( CLSID *r_clsid )
|
||||
{
|
||||
*r_clsid = CLSID_Gpgme;
|
||||
IClassFactory_AddRef((IClassFactory*)&igpgme_CF);
|
||||
return (IClassFactory*)&igpgme_CF;
|
||||
}
|
||||
|
||||
void
|
||||
igpgme_factory_release ( IClassFactory *factory )
|
||||
{
|
||||
/* it's static - nothing to do */
|
||||
}
|
162
complus/igpgme.h
Normal file
162
complus/igpgme.h
Normal file
@ -0,0 +1,162 @@
|
||||
/* igpgme.h - COM+ class IGpgme
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef IGPGME_H
|
||||
#define IGPGME_H 1
|
||||
|
||||
#include <ole2.h>
|
||||
|
||||
DEFINE_GUID(CLSID_Gpgme, 0x3811fd40, 0x7f72, 0x11d5,
|
||||
0x8c, 0x9e, 0x00, 0x80, 0xad, 0x19, 0x0c, 0xd5);
|
||||
#if 0
|
||||
DEFINE_GUID(CLSID_GpgmeData, 0x3811fd41, 0x7f72, 0x11d5,
|
||||
0x8c, 0x9e, 0x00, 0x80, 0xad, 0x19, 0x0c, 0xd5);
|
||||
DEFINE_GUID(CLSID_GpgmeKey, 0x3811fd42, 0x7f72, 0x11d5,
|
||||
0x8c, 0x9e, 0x00, 0x80, 0xad, 0x19, 0x0c, 0xd5);
|
||||
DEFINE_GUID(CLSID_GpgmeRSet, 0x3811fd43, 0x7f72, 0x11d5,
|
||||
0x8c, 0x9e, 0x00, 0x80, 0xad, 0x19, 0x0c, 0xd5);
|
||||
#endif
|
||||
|
||||
DEFINE_GUID(TLBID_Gpgcom, 0x3811fd48, 0x7f72, 0x11d5,
|
||||
0x8c, 0x9e, 0x00, 0x80, 0xad, 0x19, 0x0c, 0xd5);
|
||||
DEFINE_GUID(APPID_Gpgcom, 0x3811fd4f, 0x7f72, 0x11d5,
|
||||
0x8c, 0x9e, 0x00, 0x80, 0xad, 0x19, 0x0c, 0xd5);
|
||||
|
||||
|
||||
DEFINE_GUID(IID_IGpgme, 0x3811fd50, 0x7f72, 0x11d5,
|
||||
0x8c, 0x9e, 0x00, 0x80, 0xad, 0x19, 0x0c, 0xd5);
|
||||
|
||||
typedef struct IGpgme IGpgme;
|
||||
|
||||
IClassFactory *igpgme_factory_new( CLSID *r_clsid );
|
||||
void igpgme_factory_release ( IClassFactory *factory );
|
||||
|
||||
|
||||
/********************************************
|
||||
***** The IGpgme interface *****************
|
||||
********************************************/
|
||||
|
||||
#define ICOM_INTERFACE IGpgme
|
||||
|
||||
#define IGpgme_METHODS \
|
||||
ICOM_METHOD1(HRESULT,GetVersion, BSTR*,) \
|
||||
ICOM_METHOD1(HRESULT,GetEngineInfo, BSTR*,) \
|
||||
ICOM_METHOD(HRESULT,Cancel) \
|
||||
ICOM_METHOD1(HRESULT,SetArmor,BOOL,) \
|
||||
ICOM_METHOD1(HRESULT,GetArmor,BOOL*,) \
|
||||
ICOM_METHOD1(HRESULT,SetTextmode,BOOL,) \
|
||||
ICOM_METHOD1(HRESULT,GetTextmode,BOOL*,) \
|
||||
ICOM_METHOD1(HRESULT,SetPlaintext,VARIANT,) \
|
||||
ICOM_METHOD1(HRESULT,GetPlaintext,VARIANT*,) \
|
||||
ICOM_METHOD1(HRESULT,SetCiphertext,VARIANT,) \
|
||||
ICOM_METHOD1(HRESULT,GetCiphertext,VARIANT*,) \
|
||||
ICOM_METHOD(HRESULT,ClearRecipients) \
|
||||
ICOM_METHOD2(HRESULT,AddRecipient,BSTR,,signed short int,) \
|
||||
ICOM_METHOD(HRESULT,ResetSignKeys) \
|
||||
ICOM_METHOD1(HRESULT,AddSignKey,BSTR,) \
|
||||
ICOM_METHOD(HRESULT,Encrypt) \
|
||||
ICOM_METHOD1(HRESULT,Sign,signed short int,) \
|
||||
ICOM_METHOD1(HRESULT,SignEncrypt,signed short int,)
|
||||
|
||||
#if 0
|
||||
ICOM_METHOD1(HRESULT,SetKeylistMode,)
|
||||
ICOM_METHOD1(HRESULT,SetPassphraseCB,)
|
||||
ICOM_METHOD1(HRESULT,SetProgressCB,)
|
||||
ICOM_METHOD1(HRESULT,SignersClear,)
|
||||
ICOM_METHOD1(HRESULT,SignersAdd,)
|
||||
ICOM_METHOD1(HRESULT,SignersEnum,)
|
||||
ICOM_METHOD1(HRESULT,GetSigStatus,)
|
||||
ICOM_METHOD1(HRESULT,GetNotation,)
|
||||
#endif
|
||||
|
||||
#define IGpgme_IMETHODS \
|
||||
IDispatch_IMETHODS \
|
||||
IGpgme_METHODS
|
||||
|
||||
ICOM_DEFINE(IGpgme,IDispatch)
|
||||
#undef ICOM_INTERFACE
|
||||
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
#define IGpgme_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
|
||||
#define IGpgme_AddRef(p) ICOM_CALL (AddRef,p)
|
||||
#define IGpgme_Release(p) ICOM_CALL (Release,p)
|
||||
/*** IGpgme methods ***/
|
||||
#define IGpgme_GetVersion(p,r) ICOM_CALL1(GetVersion,p,r)
|
||||
#define IGpgme_GetEngineInfo(p,r) ICOM_CALL1(GetEngineInfo,p,r)
|
||||
#define IGpgme_Cancel(p,a) ICOM_CALL1(Cancel,p,a)
|
||||
#define IGpgme_SetArmor(p,a) ICOM_CALL1(SetArmor,p,a)
|
||||
#define IGpgme_GetArmor(p,a) ICOM_CALL1(GetArmor,p,a)
|
||||
#define IGpgme_SetTextmode(p,a) ICOM_CALL1(SetTextmode,p,a)
|
||||
#define IGpgme_GetTextmode(p,a) ICOM_CALL1(GetTextmode,p,a)
|
||||
#define IGpgme_SetPlaintext(p,a) ICOM_CALL1(SetPlaintext,p,a)
|
||||
#define IGpgme_GetPlaintext(p,a) ICOM_CALL1(GetPlaintext,p,a)
|
||||
#define IGpgme_SetCiphertext(p,a) ICOM_CALL1(SetCiphertext,p,a)
|
||||
#define IGpgme_GetCiphertext(p,a) ICOM_CALL1(GetCiphertext,p,a)
|
||||
#define IGpgme_ClearRecipients(p) ICOM_CALL (ClearRecipients,p)
|
||||
#define IGpgme_AddRecipient(p,a,b) ICOM_CALL2(AddRecipient,p,a,b)
|
||||
#define IGpgme_ResetSignKeys(p) ICOM_CALL (ResetSignKeys,p)
|
||||
#define IGpgme_AddSignKey(p,a) ICOM_CALL (AddSignKey,p,a)
|
||||
#define IGpgme_Encrypt(p) ICOM_CALL (Encrypt,p)
|
||||
#define IGpgme_Sign(p,a) ICOM_CALL (Sign,p,a)
|
||||
#define IGpgme_SignEncrypt(p,a) ICOM_CALL (SignEncrypt,p,a)
|
||||
#if 0
|
||||
#define IGpgme_SetKeylistMode(p,a) ICOM_CALL1(SetKeylistMode,p,a)
|
||||
#define IGpgme_SetPassphraseCB(p,a) ICOM_CALL1(SetPassphraseCB,p,a)
|
||||
#define IGpgme_SetProgressCB(p,a) ICOM_CALL1(SetProgressCB,p,a)
|
||||
#define IGpgme_SignersClear(p,a) ICOM_CALL1(SignersClear,p,a)
|
||||
#define IGpgme_SignersAdd(p,a) ICOM_CALL1(SignersAdd,p,a)
|
||||
#define IGpgme_SignersEnum(p,a) ICOM_CALL1(SignersEnum,p,a)
|
||||
#define IGpgme_GetSigStatus(p,a) ICOM_CALL1(GetSigStatus,p,a)
|
||||
#define IGpgme_GetSigKey(p,a) ICOM_CALL1(GetSigKey,p,a)
|
||||
#define IGpgme_GetNotation(p,a) ICOM_CALL1(GetNotation,p,a)
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
/********************************************
|
||||
***** The IGpgmeKey interface **************
|
||||
********************************************/
|
||||
|
||||
#define ICOM_INTERFACE IGpgmeKey
|
||||
|
||||
#define IGpgmeKey_METHODS \
|
||||
ICOM_METHOD1(HRESULT,GetVersion, BSTR,) \
|
||||
ICOM_METHOD1(HRESULT,GetEngineInfo, BSTR,)
|
||||
|
||||
|
||||
#define IGpgmeKey_IMETHODS \
|
||||
IUnknown_IMETHODS \
|
||||
IGpgmeKey_METHODS
|
||||
|
||||
ICOM_DEFINE(IGpgmeKey,IUnknown)
|
||||
#undef ICOM_INTERFACE
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
#define IGpgmeKey_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
|
||||
#define IGpgmeKey_AddRef(p) ICOM_CALL (AddRef,p)
|
||||
#define IGpgmeKey_Release(p) ICOM_CALL (Release,p)
|
||||
/*** IGpgmeKey methods ***/
|
||||
#define IGpgmeKey_GetVersion(p,r) ICOM_CALL1(GetVersion,p,r)
|
||||
#define IGpgmeKey_GetEngineInfo(p,r) ICOM_CALL1(GetEngineInfo,p,r)
|
||||
#endif
|
||||
|
||||
#endif /*IGPGME_H*/
|
||||
|
285
complus/main.c
285
complus/main.c
@ -1,285 +0,0 @@
|
||||
/* main.c - COM+ component to access GnuPG
|
||||
* Copyright (C) 2000 Werner Koch (dd9jn)
|
||||
*
|
||||
* 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>
|
||||
|
||||
#include "obj_base.h"
|
||||
|
||||
#include "argparse.h"
|
||||
|
||||
#include "main.h"
|
||||
|
||||
|
||||
static void register_server (void);
|
||||
static void unregister_server (void);
|
||||
static void enter_complus (void);
|
||||
|
||||
|
||||
enum cmd_and_opt_values { aNull = 0,
|
||||
oQuiet = 'q',
|
||||
oVerbose = 'v',
|
||||
|
||||
oNoVerbose = 500,
|
||||
oOptions,
|
||||
oDebug,
|
||||
oDebugAll,
|
||||
oNoGreeting,
|
||||
oNoOptions,
|
||||
oHomedir,
|
||||
oGPGBinary,
|
||||
oRegServer,
|
||||
oUnregServer,
|
||||
oEmbedding,
|
||||
aTest };
|
||||
|
||||
|
||||
static ARGPARSE_OPTS opts[] = {
|
||||
|
||||
{ 301, NULL, 0, N_("@Options:\n ") },
|
||||
|
||||
{ oVerbose, "verbose", 0, N_("verbose") },
|
||||
{ oQuiet, "quiet", 0, N_("be somewhat more quiet") },
|
||||
{ oOptions, "options" , 2, N_("read options from file")},
|
||||
{ oDebug, "debug" ,4|16, N_("set debugging flags")},
|
||||
{ oDebugAll, "debug-all" ,0, N_("enable full debugging")},
|
||||
{ oGPGBinary, "gpg-program", 2 , "@" },
|
||||
{ oRegServer, "RegServer" , 0, "@" },
|
||||
{ oUnregServer, "UnregServer" , 0, "@" },
|
||||
{ oEmbedding, "Embedding" , 0, "@" },
|
||||
{0} };
|
||||
|
||||
|
||||
|
||||
|
||||
static const char *
|
||||
my_strusage( int level )
|
||||
{
|
||||
const char *p;
|
||||
switch( level ) {
|
||||
case 11: p = "gpgme";
|
||||
break;
|
||||
case 13: p = VERSION; break;
|
||||
/*case 17: p = PRINTABLE_OS_NAME; break;*/
|
||||
case 19: p =
|
||||
_("Please report bugs to <gpgme-bugs@gnupg.org>.\n");
|
||||
break;
|
||||
case 1:
|
||||
case 40: p =
|
||||
_("Usage: gpgme [options] (-h for help)");
|
||||
break;
|
||||
case 41: p =
|
||||
_("Syntax: gpgme [options]\n"
|
||||
"GnuPG COM+ component\n");
|
||||
break;
|
||||
|
||||
default: p = NULL;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char **argv )
|
||||
{
|
||||
ARGPARSE_ARGS pargs;
|
||||
int orig_argc;
|
||||
char **orig_argv;
|
||||
FILE *configfp = NULL;
|
||||
char *configname = NULL;
|
||||
unsigned configlineno;
|
||||
int parse_debug = 0;
|
||||
int default_config =1;
|
||||
int greeting = 0;
|
||||
int nogreeting = 0;
|
||||
int action = 0;
|
||||
|
||||
set_strusage( my_strusage );
|
||||
/*log_set_name ("gpa"); not yet implemented in logging.c */
|
||||
|
||||
opt.homedir = getenv("GNUPGHOME");
|
||||
if( !opt.homedir || !*opt.homedir ) {
|
||||
#ifdef HAVE_DRIVE_LETTERS
|
||||
opt.homedir = "c:/gnupg";
|
||||
#else
|
||||
opt.homedir = "~/.gnupg";
|
||||
#endif
|
||||
}
|
||||
|
||||
/* check whether we have a config file on the commandline */
|
||||
orig_argc = argc;
|
||||
orig_argv = argv;
|
||||
pargs.argc = &argc;
|
||||
pargs.argv = &argv;
|
||||
pargs.flags= 1|(1<<6); /* do not remove the args, ignore version */
|
||||
while( arg_parse( &pargs, opts) ) {
|
||||
if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
|
||||
parse_debug++;
|
||||
else if( pargs.r_opt == oOptions ) {
|
||||
/* yes there is one, so we do not try the default one, but
|
||||
* read the option file when it is encountered at the commandline
|
||||
*/
|
||||
default_config = 0;
|
||||
}
|
||||
else if( pargs.r_opt == oNoOptions )
|
||||
default_config = 0; /* --no-options */
|
||||
else if( pargs.r_opt == oHomedir )
|
||||
opt.homedir = pargs.r.ret_str;
|
||||
}
|
||||
|
||||
if( default_config )
|
||||
configname = make_filename(opt.homedir, "gpgme.conf", NULL );
|
||||
|
||||
|
||||
argc = orig_argc;
|
||||
argv = orig_argv;
|
||||
pargs.argc = &argc;
|
||||
pargs.argv = &argv;
|
||||
pargs.flags= 1 | (1<<5); /* do not remove the args, allow one dash */
|
||||
next_pass:
|
||||
if( configname ) {
|
||||
configlineno = 0;
|
||||
configfp = fopen( configname, "r" );
|
||||
if( !configfp ) {
|
||||
if( default_config ) {
|
||||
if( parse_debug )
|
||||
log_info(_("NOTE: no default option file `%s'\n"),
|
||||
configname );
|
||||
}
|
||||
else {
|
||||
log_error(_("option file `%s': %s\n"),
|
||||
configname, strerror(errno) );
|
||||
exit(2);
|
||||
}
|
||||
free(configname); configname = NULL;
|
||||
}
|
||||
if( parse_debug && configname )
|
||||
log_info(_("reading options from `%s'\n"), configname );
|
||||
default_config = 0;
|
||||
}
|
||||
|
||||
while( optfile_parse( configfp, configname, &configlineno,
|
||||
&pargs, opts) ) {
|
||||
switch( pargs.r_opt ) {
|
||||
case oQuiet: opt.quiet = 1; break;
|
||||
case oVerbose: opt.verbose++; break;
|
||||
|
||||
case oDebug: opt.debug |= pargs.r.ret_ulong; break;
|
||||
case oDebugAll: opt.debug = ~0; break;
|
||||
|
||||
case oOptions:
|
||||
/* config files may not be nested (silently ignore them) */
|
||||
if( !configfp ) {
|
||||
free(configname);
|
||||
configname = xstrdup(pargs.r.ret_str);
|
||||
goto next_pass;
|
||||
}
|
||||
break;
|
||||
case oNoGreeting: nogreeting = 1; break;
|
||||
case oNoVerbose: opt.verbose = 0; break;
|
||||
case oNoOptions: break; /* no-options */
|
||||
case oHomedir: opt.homedir = pargs.r.ret_str; break;
|
||||
case oGPGBinary: break;
|
||||
|
||||
case oRegServer: action = 1; break;
|
||||
case oUnregServer: action = 2; break;
|
||||
case oEmbedding: action = 3; break;
|
||||
|
||||
default : pargs.err = configfp? 1:2; break;
|
||||
}
|
||||
}
|
||||
if( configfp ) {
|
||||
fclose( configfp );
|
||||
configfp = NULL;
|
||||
free(configname); configname = NULL;
|
||||
goto next_pass;
|
||||
}
|
||||
free( configname ); configname = NULL;
|
||||
if( log_get_errorcount(0) )
|
||||
exit(2);
|
||||
if( nogreeting )
|
||||
greeting = 0;
|
||||
|
||||
if( greeting ) {
|
||||
fprintf(stderr, "%s %s; %s\n",
|
||||
strusage(11), strusage(13), strusage(14) );
|
||||
fprintf(stderr, "%s\n", strusage(15) );
|
||||
}
|
||||
#ifdef IS_DEVELOPMENT_VERSION
|
||||
log_info("NOTE: this is a development version!\n");
|
||||
#endif
|
||||
|
||||
if ( action == 1 )
|
||||
register_server ();
|
||||
else if (action == 2 )
|
||||
unregister_server ();
|
||||
else if (action == 3 )
|
||||
enter_complus ();
|
||||
else {
|
||||
fprintf (stderr, "This is a COM+ component with no user interface.\n"
|
||||
"gpgme --help will give you a list of options\n" );
|
||||
exit (1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
register_server ()
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
unregister_server ()
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
enter_complus ()
|
||||
{
|
||||
HANDLE running;
|
||||
int reg;
|
||||
IClassFactory *factory;
|
||||
CLSID clsid;
|
||||
|
||||
CoInitializeEx (NULL, COINIT_MULTITHREADED);
|
||||
running = CreateEvent (NULL, FALSE, FALSE, NULL );
|
||||
|
||||
factory = gnupg_factory_new ( &clsid );
|
||||
CoRegisterClassObject (&clsid, (IUnknown*)factory,
|
||||
CLSCTX_LOCAL_SERVER,
|
||||
REGCLS_SUSPENDED|REGCLS_MULTIPLEUSE, ® );
|
||||
CoResumeClassObjects ();
|
||||
|
||||
WaitForSingleObject ( running, INFINITE );
|
||||
CloseHandle (running);
|
||||
CoRevokeClassObject ( reg );
|
||||
gnupg_factory_release (factory);
|
||||
CoUninitialize ();
|
||||
}
|
||||
|
||||
|
@ -38,11 +38,6 @@ struct {
|
||||
} opt;
|
||||
|
||||
|
||||
/*-- ignupg.c --*/
|
||||
IClassFactory *gnupg_factory_new ( CLSID *r_clsid );
|
||||
void gnupg_factory_release ( IClassFactory *factory );
|
||||
|
||||
|
||||
|
||||
#endif /* COMPLUS_MAIN_H */
|
||||
|
||||
|
@ -1,800 +0,0 @@
|
||||
/* obj_base.h - This file defines the macros and types necessary to
|
||||
define COM interfaces, and the three most basic COM interfaces:
|
||||
IUnknown, IMalloc and IClassFactory.
|
||||
|
||||
Copyright (c) 1993-2000 the Wine project authors (see the file WINE-AUTHORS
|
||||
for a complete list)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __WINE_WINE_OBJ_BASE_H
|
||||
#define __WINE_WINE_OBJ_BASE_H
|
||||
|
||||
/* check these values! */
|
||||
#define E_NOINTERFACE 0x80040002
|
||||
#define E_OUTOFMEMORY 0x8007000E
|
||||
|
||||
/*****************************************************************************
|
||||
* define ICOM_MSVTABLE_COMPAT
|
||||
* to implement the microsoft com vtable compatibility workaround for g++.
|
||||
*
|
||||
* NOTE: Turning this option on will produce a winelib that is incompatible
|
||||
* with the binary emulator.
|
||||
*
|
||||
* If the compiler supports the com_interface attribute, leave this off, and
|
||||
* define the ICOM_USE_COM_INTERFACE_ATTRIBUTE macro below. This may also
|
||||
* require the addition of the -vtable-thunks option for g++.
|
||||
*
|
||||
* If you aren't interested in Winelib C++ compatibility at all, leave both
|
||||
* options off.
|
||||
*
|
||||
* The preferable method for using ICOM_USE_COM_INTERFACE_ATTRIBUTE macro
|
||||
* would be to define it only for your Winelib application. This allows you
|
||||
* to have both binary and Winelib compatibility for C and C++ at the same
|
||||
* time :)
|
||||
*/
|
||||
/* #define ICOM_MSVTABLE_COMPAT 1 */
|
||||
/* #define ICOM_USE_COM_INTERFACE_ATTRIBUTE 1 */
|
||||
|
||||
/*****************************************************************************
|
||||
* Defines the basic types
|
||||
*/
|
||||
#include "wtypes.h"
|
||||
#include "guiddef.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef NONAMELESSSTRUCT
|
||||
#define LISet32(li, v) ((li).HighPart = (v) < 0 ? -1 : 0, (li).LowPart = (v))
|
||||
#define ULISet32(li, v) ((li).HighPart = 0, (li).LowPart = (v))
|
||||
#else
|
||||
#define LISet32(li, v) ((li).s.HighPart = (v) < 0 ? -1 : 0, (li).s.LowPart = (v))
|
||||
#define ULISet32(li, v) ((li).s.HighPart = 0, (li).s.LowPart = (v))
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
* GUID API
|
||||
*/
|
||||
HRESULT WINAPI StringFromCLSID16(REFCLSID id, LPOLESTR16*);
|
||||
HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR*);
|
||||
|
||||
HRESULT WINAPI CLSIDFromString16(LPCOLESTR16, CLSID *);
|
||||
HRESULT WINAPI CLSIDFromString(LPCOLESTR, CLSID *);
|
||||
|
||||
HRESULT WINAPI CLSIDFromProgID16(LPCOLESTR16 progid, LPCLSID riid);
|
||||
HRESULT WINAPI CLSIDFromProgID(LPCOLESTR progid, LPCLSID riid);
|
||||
|
||||
HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *lplpszProgID);
|
||||
|
||||
|
||||
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Macros to define a COM interface
|
||||
*/
|
||||
/*
|
||||
* The goal of the following set of definitions is to provide a way to use the same
|
||||
* header file definitions to provide both a C interface and a C++ object oriented
|
||||
* interface to COM interfaces. The type of interface is selected automatically
|
||||
* depending on the language but it is always possible to get the C interface in C++
|
||||
* by defining CINTERFACE.
|
||||
*
|
||||
* It is based on the following assumptions:
|
||||
* - all COM interfaces derive from IUnknown, this should not be a problem.
|
||||
* - the header file only defines the interface, the actual fields are defined
|
||||
* separately in the C file implementing the interface.
|
||||
*
|
||||
* The natural approach to this problem would be to make sure we get a C++ class and
|
||||
* virtual methods in C++ and a structure with a table of pointer to functions in C.
|
||||
* Unfortunately the layout of the virtual table is compiler specific, the layout of
|
||||
* g++ virtual tables is not the same as that of an egcs virtual table which is not the
|
||||
* same as that generated by Visual C+. There are workarounds to make the virtual tables
|
||||
* compatible via padding but unfortunately the one which is imposed to the WINE emulator
|
||||
* by the Windows binaries, i.e. the Visual C++ one, is the most compact of all.
|
||||
*
|
||||
* So the solution I finally adopted does not use virtual tables. Instead I use inline
|
||||
* non virtual methods that dereference the method pointer themselves and perform the call.
|
||||
*
|
||||
* Let's take Direct3D as an example:
|
||||
*
|
||||
* #define ICOM_INTERFACE IDirect3D
|
||||
* #define IDirect3D_METHODS \
|
||||
* ICOM_METHOD1(HRESULT,Initialize, REFIID,) \
|
||||
* ICOM_METHOD2(HRESULT,EnumDevices, LPD3DENUMDEVICESCALLBACK,, LPVOID,) \
|
||||
* ICOM_METHOD2(HRESULT,CreateLight, LPDIRECT3DLIGHT*,, IUnknown*,) \
|
||||
* ICOM_METHOD2(HRESULT,CreateMaterial,LPDIRECT3DMATERIAL*,, IUnknown*,) \
|
||||
* ICOM_METHOD2(HRESULT,CreateViewport,LPDIRECT3DVIEWPORT*,, IUnknown*,) \
|
||||
* ICOM_METHOD2(HRESULT,FindDevice, LPD3DFINDDEVICESEARCH,, LPD3DFINDDEVICERESULT,)
|
||||
* #define IDirect3D_IMETHODS \
|
||||
* IUnknown_IMETHODS \
|
||||
* IDirect3D_METHODS
|
||||
* ICOM_DEFINE(IDirect3D,IUnknown)
|
||||
* #undef ICOM_INTERFACE
|
||||
*
|
||||
* #ifdef ICOM_CINTERFACE
|
||||
* // *** IUnknown methods *** //
|
||||
* #define IDirect3D_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
|
||||
* #define IDirect3D_AddRef(p) ICOM_CALL (AddRef,p)
|
||||
* #define IDirect3D_Release(p) ICOM_CALL (Release,p)
|
||||
* // *** IDirect3D methods *** //
|
||||
* #define IDirect3D_Initialize(p,a) ICOM_CALL1(Initialize,p,a)
|
||||
* #define IDirect3D_EnumDevices(p,a,b) ICOM_CALL2(EnumDevice,p,a,b)
|
||||
* #define IDirect3D_CreateLight(p,a,b) ICOM_CALL2(CreateLight,p,a,b)
|
||||
* #define IDirect3D_CreateMaterial(p,a,b) ICOM_CALL2(CreateMaterial,p,a,b)
|
||||
* #define IDirect3D_CreateViewport(p,a,b) ICOM_CALL2(CreateViewport,p,a,b)
|
||||
* #define IDirect3D_FindDevice(p,a,b) ICOM_CALL2(FindDevice,p,a,b)
|
||||
* #endif
|
||||
*
|
||||
* Comments:
|
||||
* - The ICOM_INTERFACE macro is used in the ICOM_METHOD macros to define the type of the 'this'
|
||||
* pointer. Defining this macro here saves us the trouble of having to repeat the interface
|
||||
* name everywhere. Note however that because of the way macros work, a macro like ICOM_METHOD1
|
||||
* cannot use 'ICOM_INTERFACE##_VTABLE' because this would give 'ICOM_INTERFACE_VTABLE' and not
|
||||
* 'IDirect3D_VTABLE'.
|
||||
* - ICOM_METHODS defines the methods specific to this interface. It is then aggregated with the
|
||||
* inherited methods to form ICOM_IMETHODS.
|
||||
* - ICOM_IMETHODS defines the list of methods that are inheritable from this interface. It must
|
||||
* be written manually (rather than using a macro to generate the equivalent code) to avoid
|
||||
* macro recursion (which compilers don't like).
|
||||
* - The ICOM_DEFINE finally declares all the structures necessary for the interface. We have to
|
||||
* explicitly use the interface name for macro expansion reasons again.
|
||||
* Inherited methods are inherited in C by using the IDirect3D_METHODS macro and the parent's
|
||||
* Xxx_IMETHODS macro. In C++ we need only use the IDirect3D_METHODS since method inheritance
|
||||
* is taken care of by the language.
|
||||
* - In C++ the ICOM_METHOD macros generate a function prototype and a call to a function pointer
|
||||
* method. This means using once 't1 p1, t2 p2, ...' and once 'p1, p2' without the types. The
|
||||
* only way I found to handle this is to have one ICOM_METHOD macro per number of parameters and
|
||||
* to have it take only the type information (with const if necessary) as parameters.
|
||||
* The 'undef ICOM_INTERFACE' is here to remind you that using ICOM_INTERFACE in the following
|
||||
* macros will not work. This time it's because the ICOM_CALL macro expansion is done only once
|
||||
* the 'IDirect3D_Xxx' macro is expanded. And by that time ICOM_INTERFACE will be long gone
|
||||
* anyway.
|
||||
* - You may have noticed the double commas after each parameter type. This allows you to put the
|
||||
* name of that parameter which I think is good for documentation. It is not required and since
|
||||
* I did not know what to put there for this example (I could only find doc about IDirect3D2),
|
||||
* I left them blank.
|
||||
* - Finally the set of 'IDirect3D_Xxx' macros is a standard set of macros defined to ease access
|
||||
* to the interface methods in C. Unfortunately I don't see any way to avoid having to duplicate
|
||||
* the inherited method definitions there. This time I could have used a trick to use only one
|
||||
* macro whatever the number of parameters but I prefered to have it work the same way as above.
|
||||
* - You probably have noticed that we don't define the fields we need to actually implement this
|
||||
* interface: reference count, pointer to other resources and miscellaneous fields. That's
|
||||
* because these interfaces are just that: interfaces. They may be implemented more than once, in
|
||||
* different contexts and sometimes not even in Wine. Thus it would not make sense to impose
|
||||
* that the interface contains some specific fields.
|
||||
*
|
||||
*
|
||||
* In C this gives:
|
||||
* typedef struct IDirect3DVtbl IDirect3DVtbl;
|
||||
* struct IDirect3D {
|
||||
* IDirect3DVtbl* lpVtbl;
|
||||
* };
|
||||
* struct IDirect3DVtbl {
|
||||
* HRESULT (*fnQueryInterface)(IDirect3D* me, REFIID riid, LPVOID* ppvObj);
|
||||
* ULONG (*fnQueryInterface)(IDirect3D* me);
|
||||
* ULONG (*fnQueryInterface)(IDirect3D* me);
|
||||
* HRESULT (*fnInitialize)(IDirect3D* me, REFIID a);
|
||||
* HRESULT (*fnEnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b);
|
||||
* HRESULT (*fnCreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b);
|
||||
* HRESULT (*fnCreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b);
|
||||
* HRESULT (*fnCreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b);
|
||||
* HRESULT (*fnFindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b);
|
||||
* };
|
||||
*
|
||||
* #ifdef ICOM_CINTERFACE
|
||||
* // *** IUnknown methods *** //
|
||||
* #define IDirect3D_QueryInterface(p,a,b) (p)->lpVtbl->fnQueryInterface(p,a,b)
|
||||
* #define IDirect3D_AddRef(p) (p)->lpVtbl->fnAddRef(p)
|
||||
* #define IDirect3D_Release(p) (p)->lpVtbl->fnRelease(p)
|
||||
* // *** IDirect3D methods *** //
|
||||
* #define IDirect3D_Initialize(p,a) (p)->lpVtbl->fnInitialize(p,a)
|
||||
* #define IDirect3D_EnumDevices(p,a,b) (p)->lpVtbl->fnEnumDevice(p,a,b)
|
||||
* #define IDirect3D_CreateLight(p,a,b) (p)->lpVtbl->fnCreateLight(p,a,b)
|
||||
* #define IDirect3D_CreateMaterial(p,a,b) (p)->lpVtbl->fnCreateMaterial(p,a,b)
|
||||
* #define IDirect3D_CreateViewport(p,a,b) (p)->lpVtbl->fnCreateViewport(p,a,b)
|
||||
* #define IDirect3D_FindDevice(p,a,b) (p)->lpVtbl->fnFindDevice(p,a,b)
|
||||
* #endif
|
||||
*
|
||||
* Comments:
|
||||
* - IDirect3D only contains a pointer to the IDirect3D virtual/jump table. This is the only thing
|
||||
* the user needs to know to use the interface. Of course the structure we will define to
|
||||
* implement this interface will have more fields but the first one will match this pointer.
|
||||
* - The code generated by ICOM_DEFINE defines both the structure representing the interface and
|
||||
* the structure for the jump table. ICOM_DEFINE uses the parent's Xxx_IMETHODS macro to
|
||||
* automatically repeat the prototypes of all the inherited methods and then uses IDirect3D_METHODS
|
||||
* to define the IDirect3D methods.
|
||||
* - Each method is declared as a pointer to function field in the jump table. The implementation
|
||||
* will fill this jump table with appropriate values, probably using a static variable, and
|
||||
* initialize the lpVtbl field to point to this variable.
|
||||
* - The IDirect3D_Xxx macros then just derefence the lpVtbl pointer and use the function pointer
|
||||
* corresponding to the macro name. This emulates the behavior of a virtual table and should be
|
||||
* just as fast.
|
||||
* - This C code should be quite compatible with the Windows headers both for code that uses COM
|
||||
* interfaces and for code implementing a COM interface.
|
||||
*
|
||||
*
|
||||
* And in C++ (with gcc's g++):
|
||||
*
|
||||
* typedef struct IDirect3D: public IUnknown {
|
||||
* private: HRESULT (*fnInitialize)(IDirect3D* me, REFIID a);
|
||||
* public: inline HRESULT Initialize(REFIID a) { return ((IDirect3D*)t.lpVtbl)->fnInitialize(this,a); };
|
||||
* private: HRESULT (*fnEnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b);
|
||||
* public: inline HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK a, LPVOID b)
|
||||
* { return ((IDirect3D*)t.lpVtbl)->fnEnumDevices(this,a,b); };
|
||||
* private: HRESULT (*fnCreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b);
|
||||
* public: inline HRESULT CreateLight(LPDIRECT3DLIGHT* a, IUnknown* b)
|
||||
* { return ((IDirect3D*)t.lpVtbl)->fnCreateLight(this,a,b); };
|
||||
* private: HRESULT (*fnCreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b);
|
||||
* public: inline HRESULT CreateMaterial(LPDIRECT3DMATERIAL* a, IUnknown* b)
|
||||
* { return ((IDirect3D*)t.lpVtbl)->fnCreateMaterial(this,a,b); };
|
||||
* private: HRESULT (*fnCreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b);
|
||||
* public: inline HRESULT CreateViewport(LPDIRECT3DVIEWPORT* a, IUnknown* b)
|
||||
* { return ((IDirect3D*)t.lpVtbl)->fnCreateViewport(this,a,b); };
|
||||
* private: HRESULT (*fnFindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b);
|
||||
* public: inline HRESULT FindDevice(LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b)
|
||||
* { return ((IDirect3D*)t.lpVtbl)->fnFindDevice(this,a,b); };
|
||||
* };
|
||||
*
|
||||
* Comments:
|
||||
* - In C++ IDirect3D does double duty as both the virtual/jump table and as the interface
|
||||
* definition. The reason for this is to avoid having to duplicate the mehod definitions: once
|
||||
* to have the function pointers in the jump table and once to have the methods in the interface
|
||||
* class. Here one macro can generate both. This means though that the first pointer, t.lpVtbl
|
||||
* defined in IUnknown, must be interpreted as the jump table pointer if we interpret the
|
||||
* structure as the the interface class, and as the function pointer to the QueryInterface
|
||||
* method, t.fnQueryInterface, if we interpret the structure as the jump table. Fortunately this
|
||||
* gymnastic is entirely taken care of in the header of IUnknown.
|
||||
* - Of course in C++ we use inheritance so that we don't have to duplicate the method definitions.
|
||||
* - Since IDirect3D does double duty, each ICOM_METHOD macro defines both a function pointer and
|
||||
* a non-vritual inline method which dereferences it and calls it. This way this method behaves
|
||||
* just like a virtual method but does not create a true C++ virtual table which would break the
|
||||
* structure layout. If you look at the implementation of these methods you'll notice that they
|
||||
* would not work for void functions. We have to return something and fortunately this seems to
|
||||
* be what all the COM methods do (otherwise we would need another set of macros).
|
||||
* - Note how the ICOM_METHOD generates both function prototypes mixing types and formal parameter
|
||||
* names and the method invocation using only the formal parameter name. This is the reason why
|
||||
* we need different macros to handle different numbers of parameters.
|
||||
* - Finally there is no IDirect3D_Xxx macro. These are not needed in C++ unless the CINTERFACE
|
||||
* macro is defined in which case we would not be here.
|
||||
* - This C++ code works well for code that just uses COM interfaces. But it will not work with
|
||||
* C++ code implement a COM interface. That's because such code assumes the interface methods
|
||||
* are declared as virtual C++ methods which is not the case here.
|
||||
*
|
||||
*
|
||||
* Implementing a COM interface.
|
||||
*
|
||||
* This continues the above example. This example assumes that the implementation is in C.
|
||||
*
|
||||
* typedef struct _IDirect3D {
|
||||
* void* lpVtbl;
|
||||
* // ...
|
||||
*
|
||||
* } _IDirect3D;
|
||||
*
|
||||
* static ICOM_VTABLE(IDirect3D) d3dvt;
|
||||
*
|
||||
* // implement the IDirect3D methods here
|
||||
*
|
||||
* int IDirect3D_fnQueryInterface(IDirect3D* me)
|
||||
* {
|
||||
* ICOM_THIS(IDirect3D,me);
|
||||
* // ...
|
||||
* }
|
||||
*
|
||||
* // ...
|
||||
*
|
||||
* static ICOM_VTABLE(IDirect3D) d3dvt = {
|
||||
* ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
* IDirect3D_fnQueryInterface,
|
||||
* IDirect3D_fnAdd,
|
||||
* IDirect3D_fnAdd2,
|
||||
* IDirect3D_fnInitialize,
|
||||
* IDirect3D_fnSetWidth
|
||||
* };
|
||||
*
|
||||
* Comments:
|
||||
* - We first define what the interface really contains. This is th e_IDirect3D structure. The
|
||||
* first field must of course be the virtual table pointer. Everything else is free.
|
||||
* - Then we predeclare our static virtual table variable, we will need its address in some
|
||||
* methods to initialize the virtual table pointer of the returned interface objects.
|
||||
* - Then we implement the interface methods. To match what has been declared in the header file
|
||||
* they must take a pointer to a IDirect3D structure and we must cast it to an _IDirect3D so that
|
||||
* we can manipulate the fields. This is performed by the ICOM_THIS macro.
|
||||
* - Finally we initialize the virtual table.
|
||||
*/
|
||||
|
||||
|
||||
#define ICOM_VTABLE(iface) iface##Vtbl
|
||||
#define ICOM_VFIELD(iface) ICOM_VTABLE(iface)* lpVtbl
|
||||
#define ICOM_VTBL(iface) (iface)->lpVtbl
|
||||
|
||||
|
||||
#if !defined(__cplusplus) || defined(CINTERFACE)
|
||||
#define ICOM_CINTERFACE 1
|
||||
#endif
|
||||
|
||||
#ifndef ICOM_CINTERFACE
|
||||
/* C++ interface */
|
||||
|
||||
#define ICOM_METHOD(ret,xfn) \
|
||||
public: virtual ret CALLBACK (xfn)(void) = 0;
|
||||
#define ICOM_METHOD1(ret,xfn,ta,na) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a) = 0;
|
||||
#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b) = 0;
|
||||
#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c) = 0;
|
||||
#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c,td d) = 0;
|
||||
#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c,td d,te e) = 0;
|
||||
#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f) = 0;
|
||||
#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) = 0;
|
||||
#define ICOM_METHOD8(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h) = 0;
|
||||
#define ICOM_METHOD9(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i) = 0;
|
||||
#define ICOM_METHOD10(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j) = 0;
|
||||
#define ICOM_METHOD11(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj,tk,nk) \
|
||||
public: virtual ret CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j,tk k) = 0;
|
||||
|
||||
|
||||
#define ICOM_VMETHOD(xfn) \
|
||||
public: virtual void CALLBACK (xfn)(void) = 0;
|
||||
#define ICOM_VMETHOD1(xfn,ta,na) \
|
||||
public: virtual void CALLBACK (xfn)(ta a) = 0;
|
||||
#define ICOM_VMETHOD2(xfn,ta,na,tb,nb) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b) = 0;
|
||||
#define ICOM_VMETHOD3(xfn,ta,na,tb,nb,tc,nc) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c) = 0;
|
||||
#define ICOM_VMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d) = 0;
|
||||
#define ICOM_VMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d,te e) = 0;
|
||||
#define ICOM_VMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f) = 0;
|
||||
#define ICOM_VMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) = 0;
|
||||
#define ICOM_VMETHOD8(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h) = 0;
|
||||
#define ICOM_VMETHOD9(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i) = 0;
|
||||
#define ICOM_VMETHOD10(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i, tj j) = 0;
|
||||
#define ICOM_VMETHOD11(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj,tk,nk) \
|
||||
public: virtual void CALLBACK (xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i, tj j, tk k) = 0;
|
||||
|
||||
|
||||
#ifdef ICOM_USE_COM_INTERFACE_ATTRIBUTE
|
||||
|
||||
#define ICOM_DEFINE(iface,ibase) \
|
||||
typedef struct iface: public ibase { \
|
||||
iface##_METHODS \
|
||||
} __attribute__ ((com_interface));
|
||||
|
||||
#else
|
||||
|
||||
#define ICOM_DEFINE(iface,ibase) \
|
||||
typedef struct iface: public ibase { \
|
||||
iface##_METHODS \
|
||||
};
|
||||
|
||||
#endif /* ICOM_USE_COM_INTERFACE_ATTRIBUTE */
|
||||
|
||||
#define ICOM_CALL(xfn, p) (p)->xfn()
|
||||
#define ICOM_CALL1(xfn, p,a) (p)->xfn(a)
|
||||
#define ICOM_CALL2(xfn, p,a,b) (p)->xfn(a,b)
|
||||
#define ICOM_CALL3(xfn, p,a,b,c) (p)->xfn(a,b,c)
|
||||
#define ICOM_CALL4(xfn, p,a,b,c,d) (p)->xfn(a,b,c,d)
|
||||
#define ICOM_CALL5(xfn, p,a,b,c,d,e) (p)->xfn(a,b,c,d,e)
|
||||
#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) (p)->xfn(a,b,c,d,e,f)
|
||||
#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) (p)->xfn(a,b,c,d,e,f,g)
|
||||
#define ICOM_CALL8(xfn, p,a,b,c,d,e,f,g,h) (p)->xfn(a,b,c,d,e,f,g,h)
|
||||
#define ICOM_CALL9(xfn, p,a,b,c,d,e,f,g,h,i) (p)->xfn(a,b,c,d,e,f,g,h,i)
|
||||
#define ICOM_CALL10(xfn, p,a,b,c,d,e,f,g,h,i,j) (p)->xfn(a,b,c,d,e,f,g,h,i,j)
|
||||
#define ICOM_CALL11(xfn, p,a,b,c,d,e,f,g,h,i,j,k) (p)->xfn(a,b,c,d,e,f,g,h,i,j,k)
|
||||
|
||||
|
||||
#else
|
||||
/* C interface */
|
||||
|
||||
|
||||
#ifdef __WINE__
|
||||
|
||||
#define ICOM_METHOD(ret,xfn) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me);
|
||||
#define ICOM_METHOD1(ret,xfn,ta,na) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a);
|
||||
#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b);
|
||||
#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c);
|
||||
#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
|
||||
#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
|
||||
#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
|
||||
#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
|
||||
#define ICOM_METHOD8(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h);
|
||||
#define ICOM_METHOD9(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i);
|
||||
#define ICOM_METHOD10(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j);
|
||||
#define ICOM_METHOD11(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj,tk,nk) \
|
||||
ret CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j,tk k);
|
||||
|
||||
#define ICOM_VMETHOD(xfn) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me);
|
||||
#define ICOM_VMETHOD1(xfn,ta,na) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a);
|
||||
#define ICOM_VMETHOD2(xfn,ta,na,tb,nb) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b);
|
||||
#define ICOM_VMETHOD3(xfn,ta,na,tb,nb,tc,nc) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c);
|
||||
#define ICOM_VMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
|
||||
#define ICOM_VMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
|
||||
#define ICOM_VMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
|
||||
#define ICOM_VMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
|
||||
#define ICOM_VMETHOD8(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,nh) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h);
|
||||
#define ICOM_VMETHOD9(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ni) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i);
|
||||
#define ICOM_VMETHOD10(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,nj) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j);
|
||||
#define ICOM_VMETHOD11(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj,nk) \
|
||||
void CALLBACK (*fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j,tk k);
|
||||
|
||||
#define ICOM_CALL(xfn, p) ICOM_VTBL(p)->fn##xfn(p)
|
||||
#define ICOM_CALL1(xfn, p,a) ICOM_VTBL(p)->fn##xfn(p,a)
|
||||
#define ICOM_CALL2(xfn, p,a,b) ICOM_VTBL(p)->fn##xfn(p,a,b)
|
||||
#define ICOM_CALL3(xfn, p,a,b,c) ICOM_VTBL(p)->fn##xfn(p,a,b,c)
|
||||
#define ICOM_CALL4(xfn, p,a,b,c,d) ICOM_VTBL(p)->fn##xfn(p,a,b,c,d)
|
||||
#define ICOM_CALL5(xfn, p,a,b,c,d,e) ICOM_VTBL(p)->fn##xfn(p,a,b,c,d,e)
|
||||
#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) ICOM_VTBL(p)->fn##xfn(p,a,b,c,d,e,f)
|
||||
#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) ICOM_VTBL(p)->fn##xfn(p,a,b,c,d,e,f,g)
|
||||
#define ICOM_CALL8(xfn, p,a,b,c,d,e,f,g,h) ICOM_VTBL(p)->fn##xfn(p,a,b,c,d,e,f,g,h)
|
||||
#define ICOM_CALL9(xfn, p,a,b,c,d,e,f,g,h,i) ICOM_VTBL(p)->fn##xfn(p,a,b,c,d,e,f,g,h,i)
|
||||
#define ICOM_CALL10(xfn, p,a,b,c,d,e,f,g,h,i,j) ICOM_VTBL(p)->fn##xfn(p,a,b,c,d,e,f,g,h,i,j)
|
||||
#define ICOM_CALL11(xfn, p,a,b,c,d,e,f,g,h,i,j,k) ICOM_VTBL(p)->fn##xfn(p,a,b,c,d,e,f,g,h,i,j,k)
|
||||
|
||||
#else
|
||||
|
||||
/* WINELIB case */
|
||||
|
||||
#define ICOM_METHOD(ret,xfn) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me);
|
||||
#define ICOM_METHOD1(ret,xfn,ta,na) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a);
|
||||
#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b);
|
||||
#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c);
|
||||
#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
|
||||
#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
|
||||
#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
|
||||
#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
|
||||
#define ICOM_METHOD8(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h);
|
||||
#define ICOM_METHOD9(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i);
|
||||
#define ICOM_METHOD10(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j);
|
||||
#define ICOM_METHOD11(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj,tk,nk) \
|
||||
ret CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j,tk k);
|
||||
|
||||
#define ICOM_VMETHOD(xfn) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me);
|
||||
#define ICOM_VMETHOD1(xfn,ta,na) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a);
|
||||
#define ICOM_VMETHOD2(xfn,ta,na,tb,nb) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b);
|
||||
#define ICOM_VMETHOD3(xfn,ta,na,tb,nb,tc,nc) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c);
|
||||
#define ICOM_VMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
|
||||
#define ICOM_VMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
|
||||
#define ICOM_VMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
|
||||
#define ICOM_VMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
|
||||
#define ICOM_VMETHOD8(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,nh) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h);
|
||||
#define ICOM_VMETHOD9(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ni) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i);
|
||||
#define ICOM_VMETHOD10(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,nj) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j);
|
||||
#define ICOM_VMETHOD11(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj,nk) \
|
||||
void CALLBACK (*xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j,tk k);
|
||||
|
||||
#define ICOM_CVMETHOD(xfn) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me);
|
||||
#define ICOM_CVMETHOD1(xfn,ta,na) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a);
|
||||
#define ICOM_CVMETHOD2(xfn,ta,na,tb,nb) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b);
|
||||
#define ICOM_CVMETHOD3(xfn,ta,na,tb,nb,tc,nc) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c);
|
||||
#define ICOM_CVMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
|
||||
#define ICOM_CVMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
|
||||
#define ICOM_CVMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
|
||||
#define ICOM_CVMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
|
||||
#define ICOM_CVMETHOD8(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h);
|
||||
|
||||
#define ICOM_CVMETHOD9(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i);
|
||||
#define ICOM_CVMETHOD10(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j);
|
||||
#define ICOM_CVMETHOD11(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng,th,nh,ti,ni,tj,nj,tk,nk) \
|
||||
void CALLBACK (*xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g,th h,ti i,tj j,tk k);
|
||||
|
||||
#define ICOM_CALL(xfn, p) ICOM_VTBL(p)->xfn(p)
|
||||
#define ICOM_CALL1(xfn, p,a) ICOM_VTBL(p)->xfn(p,a)
|
||||
#define ICOM_CALL2(xfn, p,a,b) ICOM_VTBL(p)->xfn(p,a,b)
|
||||
#define ICOM_CALL3(xfn, p,a,b,c) ICOM_VTBL(p)->xfn(p,a,b,c)
|
||||
#define ICOM_CALL4(xfn, p,a,b,c,d) ICOM_VTBL(p)->xfn(p,a,b,c,d)
|
||||
#define ICOM_CALL5(xfn, p,a,b,c,d,e) ICOM_VTBL(p)->xfn(p,a,b,c,d,e)
|
||||
#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) ICOM_VTBL(p)->xfn(p,a,b,c,d,e,f)
|
||||
#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) ICOM_VTBL(p)->xfn(p,a,b,c,d,e,f,g)
|
||||
#define ICOM_CALL8(xfn, p,a,b,c,d,e,f,g,h) ICOM_VTBL(p)->xfn(p,a,b,c,d,e,f,g,h)
|
||||
#define ICOM_CALL9(xfn, p,a,b,c,d,e,f,g,h,i) ICOM_VTBL(p)->xfn(p,a,b,c,d,e,f,g,h,i)
|
||||
#define ICOM_CALL10(xfn, p,a,b,c,d,e,f,g,h,i,j) ICOM_VTBL(p)->xfn(p,a,b,c,d,e,f,g,h,i,j)
|
||||
#define ICOM_CALL11(xfn, p,a,b,c,d,e,f,g,h,i,j,k) ICOM_VTBL(p)->xfn(p,a,b,c,d,e,f,g,h,i,j,k)
|
||||
|
||||
#endif /* __WINE__ */
|
||||
|
||||
#ifdef ICOM_MSVTABLE_COMPAT
|
||||
#define ICOM_DEFINE(iface,ibase) \
|
||||
typedef struct ICOM_VTABLE(iface) ICOM_VTABLE(iface); \
|
||||
struct iface { \
|
||||
const ICOM_VFIELD(iface); \
|
||||
}; \
|
||||
struct ICOM_VTABLE(iface) { \
|
||||
long dummyRTTI1; \
|
||||
long dummyRTTI2; \
|
||||
ibase##_IMETHODS \
|
||||
iface##_METHODS \
|
||||
};
|
||||
#define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 0,0,
|
||||
|
||||
#else
|
||||
#define ICOM_DEFINE(iface,ibase) \
|
||||
typedef struct ICOM_VTABLE(iface) ICOM_VTABLE(iface); \
|
||||
struct iface { \
|
||||
const ICOM_VFIELD(iface); \
|
||||
}; \
|
||||
struct ICOM_VTABLE(iface) { \
|
||||
ibase##_IMETHODS \
|
||||
iface##_METHODS \
|
||||
};
|
||||
#define ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
#endif /* ICOM_MSVTABLE_COMPAT */
|
||||
|
||||
|
||||
#define ICOM_THIS(impl,iface) impl* const This=(impl*)iface
|
||||
#define ICOM_CTHIS(impl,iface) const impl* const This=(const impl*)iface
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Predeclare the interfaces
|
||||
*/
|
||||
DEFINE_OLEGUID(IID_IClassFactory, 0x00000001L, 0, 0);
|
||||
typedef struct IClassFactory IClassFactory, *LPCLASSFACTORY;
|
||||
|
||||
DEFINE_OLEGUID(IID_IMalloc, 0x00000002L, 0, 0);
|
||||
typedef struct IMalloc IMalloc,*LPMALLOC;
|
||||
|
||||
DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0);
|
||||
typedef struct IUnknown IUnknown, *LPUNKNOWN;
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* IUnknown interface
|
||||
*/
|
||||
#define ICOM_INTERFACE IUnknown
|
||||
#define IUnknown_IMETHODS \
|
||||
ICOM_METHOD2(HRESULT,QueryInterface,REFIID,riid, LPVOID*,ppvObj) \
|
||||
ICOM_METHOD (ULONG,AddRef) \
|
||||
ICOM_METHOD (ULONG,Release)
|
||||
#ifdef ICOM_CINTERFACE
|
||||
typedef struct ICOM_VTABLE(IUnknown) ICOM_VTABLE(IUnknown);
|
||||
struct IUnknown {
|
||||
ICOM_VFIELD(IUnknown);
|
||||
#if defined(ICOM_USE_COM_INTERFACE_ATTRIBUTE)
|
||||
} __attribute__ ((com_interface));
|
||||
#else
|
||||
};
|
||||
#endif /* ICOM_US_COM_INTERFACE_ATTRIBUTE */
|
||||
|
||||
struct ICOM_VTABLE(IUnknown) {
|
||||
#ifdef ICOM_MSVTABLE_COMPAT
|
||||
long dummyRTTI1;
|
||||
long dummyRTTI2;
|
||||
#endif /* ICOM_MSVTABLE_COMPAT */
|
||||
|
||||
#else /* ICOM_CINTERFACE */
|
||||
struct IUnknown {
|
||||
|
||||
#endif /* ICOM_CINTERFACE */
|
||||
|
||||
ICOM_METHOD2(HRESULT,QueryInterface,REFIID,riid, LPVOID*,ppvObj)
|
||||
ICOM_METHOD (ULONG,AddRef)
|
||||
ICOM_METHOD (ULONG,Release)
|
||||
#if defined(ICOM_USE_COM_INTERFACE_ATTRIBUTE)
|
||||
} __attribute__ ((com_interface));
|
||||
#else
|
||||
};
|
||||
#endif /* ICOM_US_COM_INTERFACE_ATTRIBUTE */
|
||||
|
||||
#undef ICOM_INTERFACE
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
#define IUnknown_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
|
||||
#define IUnknown_AddRef(p) ICOM_CALL (AddRef,p)
|
||||
#define IUnknown_Release(p) ICOM_CALL (Release,p)
|
||||
|
||||
/*****************************************************************************
|
||||
* IClassFactory interface
|
||||
*/
|
||||
#define ICOM_INTERFACE IClassFactory
|
||||
#define IClassFactory_METHODS \
|
||||
ICOM_METHOD3(HRESULT,CreateInstance, LPUNKNOWN,pUnkOuter, REFIID,riid, LPVOID*,ppvObject) \
|
||||
ICOM_METHOD1(HRESULT,LockServer, BOOL,fLock)
|
||||
#define IClassFactory_IMETHODS \
|
||||
IUnknown_IMETHODS \
|
||||
IClassFactory_METHODS
|
||||
ICOM_DEFINE(IClassFactory,IUnknown)
|
||||
#undef ICOM_INTERFACE
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
#define IClassFactory_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
|
||||
#define IClassFactory_AddRef(p) ICOM_CALL (AddRef,p)
|
||||
#define IClassFactory_Release(p) ICOM_CALL (Release,p)
|
||||
/*** IClassFactory methods ***/
|
||||
#define IClassFactory_CreateInstance(p,a,b,c) ICOM_CALL3(CreateInstance,p,a,b,c)
|
||||
#define IClassFactory_LockServer(p,a) ICOM_CALL1(LockServer,p,a)
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* IMalloc interface
|
||||
*/
|
||||
#define ICOM_INTERFACE IMalloc
|
||||
#define IMalloc_METHODS \
|
||||
ICOM_METHOD1 (LPVOID,Alloc, DWORD,cb) \
|
||||
ICOM_METHOD2 (LPVOID,Realloc, LPVOID,pv, DWORD,cb) \
|
||||
ICOM_VMETHOD1( Free, LPVOID,pv) \
|
||||
ICOM_METHOD1(DWORD, GetSize, LPVOID,pv) \
|
||||
ICOM_METHOD1(INT, DidAlloc, LPVOID,pv) \
|
||||
ICOM_METHOD (VOID, HeapMinimize)
|
||||
#define IMalloc_IMETHODS \
|
||||
IUnknown_IMETHODS \
|
||||
IMalloc_METHODS
|
||||
ICOM_DEFINE(IMalloc,IUnknown)
|
||||
#undef ICOM_INTERFACE
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
#define IMalloc_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
|
||||
#define IMalloc_AddRef(p) ICOM_CALL (AddRef,p)
|
||||
#define IMalloc_Release(p) ICOM_CALL (Release,p)
|
||||
/*** IMalloc32 methods ***/
|
||||
#define IMalloc_Alloc(p,a) ICOM_CALL1(Alloc,p,a)
|
||||
#define IMalloc_Realloc(p,a,b) ICOM_CALL2(Realloc,p,a,b)
|
||||
#define IMalloc_Free(p,a) ICOM_CALL1(Free,p,a)
|
||||
#define IMalloc_GetSize(p,a) ICOM_CALL1(GetSize,p,a)
|
||||
#define IMalloc_DidAlloc(p,a) ICOM_CALL1(DidAlloc,p,a)
|
||||
#define IMalloc_HeapMinimize(p) ICOM_CALL (HeapMinimize,p)
|
||||
|
||||
|
||||
HRESULT WINAPI CoGetMalloc(DWORD dwMemContext,LPMALLOC* lpMalloc);
|
||||
|
||||
LPVOID WINAPI CoTaskMemAlloc(ULONG size);
|
||||
|
||||
void WINAPI CoTaskMemFree(LPVOID ptr);
|
||||
|
||||
/* FIXME: unimplemented */
|
||||
LPVOID WINAPI CoTaskMemRealloc(LPVOID ptr, ULONG size);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Additional API
|
||||
*/
|
||||
|
||||
HRESULT WINAPI CoCreateGuid(GUID* pguid);
|
||||
|
||||
HINSTANCE WINAPI CoLoadLibrary(LPOLESTR lpszLibName, BOOL bAutoFree);
|
||||
|
||||
void WINAPI CoFreeAllLibraries(void);
|
||||
|
||||
void WINAPI CoFreeLibrary(HINSTANCE hLibrary);
|
||||
|
||||
void WINAPI CoFreeUnusedLibraries(void);
|
||||
|
||||
HRESULT WINAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv);
|
||||
|
||||
HRESULT WINAPI CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, LPVOID pvReserved, REFIID iid, LPVOID *ppv);
|
||||
|
||||
HRESULT WINAPI CoInitialize(LPVOID lpReserved);
|
||||
HRESULT WINAPI CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit);
|
||||
|
||||
void WINAPI CoUninitialize(void);
|
||||
|
||||
typedef enum tagCOINIT
|
||||
{
|
||||
COINIT_APARTMENTTHREADED = 0x2, /* Apartment model */
|
||||
COINIT_MULTITHREADED = 0x0, /* OLE calls objects on any thread */
|
||||
COINIT_DISABLE_OLE1DDE = 0x4, /* Don't use DDE for Ole1 support */
|
||||
COINIT_SPEED_OVER_MEMORY = 0x8 /* Trade memory for speed */
|
||||
} COINIT;
|
||||
|
||||
|
||||
/* FIXME: not implemented */
|
||||
BOOL WINAPI CoIsOle1Class(REFCLSID rclsid);
|
||||
|
||||
HRESULT WINAPI CoLockObjectExternal(LPUNKNOWN pUnk, BOOL fLock, BOOL fLastUnlockReleases);
|
||||
|
||||
/* class registration flags; passed to CoRegisterClassObject */
|
||||
typedef enum tagREGCLS
|
||||
{
|
||||
REGCLS_SINGLEUSE = 0,
|
||||
REGCLS_MULTIPLEUSE = 1,
|
||||
REGCLS_MULTI_SEPARATE = 2,
|
||||
REGCLS_SUSPENDED = 4
|
||||
} REGCLS;
|
||||
|
||||
HRESULT WINAPI CoResumeClassObjects (void);
|
||||
HRESULT WINAPI CoRegisterClassObject(REFCLSID rclsid,LPUNKNOWN pUnk,DWORD dwClsContext,DWORD flags,LPDWORD lpdwRegister);
|
||||
|
||||
HRESULT WINAPI CoRevokeClassObject(DWORD dwRegister);
|
||||
|
||||
/*****************************************************************************
|
||||
* COM Server dll - exports
|
||||
*/
|
||||
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID * ppv);
|
||||
HRESULT WINAPI DllCanUnloadNow(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* __WINE_WINE_OBJ_BASE_H */
|
272
complus/wtypes.h
272
complus/wtypes.h
@ -1,272 +0,0 @@
|
||||
/* wtypes.h - Defines the basic types used by COM interfaces.
|
||||
|
||||
Copyright (c) 1993-2000 the Wine project authors (see the file WINE-AUTHORS
|
||||
for a complete list)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __WINE_WTYPES_H
|
||||
#define __WINE_WTYPES_H
|
||||
|
||||
#include "basetsd.h"
|
||||
#include "guiddef.h"
|
||||
/*#include "rpc.h"*/
|
||||
/*#include "rpcndr.h"*/
|
||||
|
||||
typedef WORD CLIPFORMAT, *LPCLIPFORMAT;
|
||||
|
||||
/* FIXME: does not belong here */
|
||||
typedef CHAR OLECHAR16;
|
||||
typedef LPSTR LPOLESTR16;
|
||||
typedef LPCSTR LPCOLESTR16;
|
||||
typedef OLECHAR16 *BSTR16;
|
||||
typedef BSTR16 *LPBSTR16;
|
||||
#define OLESTR16(x) x
|
||||
|
||||
typedef WCHAR OLECHAR;
|
||||
typedef LPWSTR LPOLESTR;
|
||||
typedef LPCWSTR LPCOLESTR;
|
||||
typedef OLECHAR *BSTR;
|
||||
typedef BSTR *LPBSTR;
|
||||
|
||||
/*
|
||||
#ifndef _DWORDLONG_
|
||||
#define _DWORDLONG_
|
||||
typedef __uint64 DWORDLONG, *PDWORDLONG;
|
||||
#endif
|
||||
|
||||
#ifndef _ULONGLONG_
|
||||
#define _ULONGLONG_
|
||||
typedef __int64 LONGLONG, *PLONGLONG;
|
||||
typedef __uint64 ULONGLONG, *PULONGLONG;
|
||||
#endif
|
||||
*/
|
||||
|
||||
#define OLESTR(x) L##x
|
||||
|
||||
typedef enum tagDVASPECT
|
||||
{
|
||||
DVASPECT_CONTENT = 1,
|
||||
DVASPECT_THUMBNAIL = 2,
|
||||
DVASPECT_ICON = 4,
|
||||
DVASPECT_DOCPRINT = 8
|
||||
} DVASPECT;
|
||||
|
||||
typedef enum tagSTGC
|
||||
{
|
||||
STGC_DEFAULT = 0,
|
||||
STGC_OVERWRITE = 1,
|
||||
STGC_ONLYIFCURRENT = 2,
|
||||
STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE = 4,
|
||||
STGC_CONSOLIDATE = 8
|
||||
} STGC;
|
||||
|
||||
typedef enum tagSTGMOVE
|
||||
{
|
||||
STGMOVE_MOVE = 0,
|
||||
STGMOVE_COPY = 1,
|
||||
STGMOVE_SHALLOWCOPY = 2
|
||||
} STGMOVE;
|
||||
|
||||
|
||||
typedef struct _COAUTHIDENTITY
|
||||
{
|
||||
USHORT* User;
|
||||
ULONG UserLength;
|
||||
USHORT* Domain;
|
||||
ULONG DomainLength;
|
||||
USHORT* Password;
|
||||
ULONG PasswordLength;
|
||||
ULONG Flags;
|
||||
} COAUTHIDENTITY;
|
||||
|
||||
typedef struct _COAUTHINFO
|
||||
{
|
||||
DWORD dwAuthnSvc;
|
||||
DWORD dwAuthzSvc;
|
||||
LPWSTR pwszServerPrincName;
|
||||
DWORD dwAuthnLevel;
|
||||
DWORD dwImpersonationLevel;
|
||||
COAUTHIDENTITY* pAuthIdentityData;
|
||||
DWORD dwCapabilities;
|
||||
} COAUTHINFO;
|
||||
|
||||
typedef struct _COSERVERINFO
|
||||
{
|
||||
DWORD dwReserved1;
|
||||
LPWSTR pwszName;
|
||||
COAUTHINFO* pAuthInfo;
|
||||
DWORD dwReserved2;
|
||||
} COSERVERINFO;
|
||||
|
||||
typedef enum tagCLSCTX
|
||||
{
|
||||
CLSCTX_INPROC_SERVER = 0x1,
|
||||
CLSCTX_INPROC_HANDLER = 0x2,
|
||||
CLSCTX_LOCAL_SERVER = 0x4,
|
||||
CLSCTX_INPROC_SERVER16 = 0x8,
|
||||
CLSCTX_REMOTE_SERVER = 0x10,
|
||||
CLSCTX_INPROC_HANDLER16 = 0x20,
|
||||
CLSCTX_INPROC_SERVERX86 = 0x40,
|
||||
CLSCTX_INPROC_HANDLERX86 = 0x80,
|
||||
CLSCTX_ESERVER_HANDLER = 0x100
|
||||
} CLSCTX;
|
||||
|
||||
#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER)
|
||||
#define CLSCTX_ALL (CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)
|
||||
#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)
|
||||
|
||||
typedef enum tagMSHLFLAGS
|
||||
{
|
||||
MSHLFLAGS_NORMAL = 0,
|
||||
MSHLFLAGS_TABLESTRONG = 1,
|
||||
MSHLFLAGS_TABLEWEAK = 2,
|
||||
MSHLFLAGS_NOPING = 4
|
||||
} MSHLFLAGS;
|
||||
|
||||
typedef enum tagMSHCTX
|
||||
{
|
||||
MSHCTX_LOCAL = 0,
|
||||
MSHCTX_NOSHAREDMEM = 1,
|
||||
MSHCTX_DIFFERENTMACHINE = 2,
|
||||
MSHCTX_INPROC = 3
|
||||
} MSHCTX;
|
||||
|
||||
typedef unsigned short VARTYPE;
|
||||
|
||||
typedef ULONG PROPID;
|
||||
|
||||
/*
|
||||
#ifndef _tagBLOB_DEFINED
|
||||
#define _tagBLOB_DEFINED
|
||||
#define _BLOB_DEFINED
|
||||
#define _LPBLOB_DEFINED
|
||||
typedef struct tagBLOB
|
||||
{
|
||||
ULONG cbSize;
|
||||
BYTE *pBlobData;
|
||||
} BLOB, *LPBLOB;
|
||||
#endif
|
||||
*/
|
||||
|
||||
#ifndef _tagCY_DEFINED
|
||||
#define _tagCY_DEFINED
|
||||
|
||||
typedef union tagCY {
|
||||
struct {
|
||||
#ifdef BIG_ENDIAN
|
||||
LONG Hi;
|
||||
LONG Lo;
|
||||
#else /* defined(BIG_ENDIAN) */
|
||||
ULONG Lo;
|
||||
LONG Hi;
|
||||
#endif /* defined(BIG_ENDIAN) */
|
||||
} DUMMYSTRUCTNAME;
|
||||
LONGLONG int64;
|
||||
} CY;
|
||||
|
||||
#endif /* _tagCY_DEFINED */
|
||||
|
||||
/*
|
||||
* 0 == FALSE and -1 == TRUE
|
||||
*/
|
||||
#define VARIANT_TRUE ((VARIANT_BOOL)0xFFFF)
|
||||
#define VARIANT_FALSE ((VARIANT_BOOL)0x0000)
|
||||
typedef short VARIANT_BOOL,_VARIANT_BOOL;
|
||||
|
||||
typedef struct tagCLIPDATA
|
||||
{
|
||||
ULONG cbSize;
|
||||
long ulClipFmt;
|
||||
BYTE *pClipData;
|
||||
} CLIPDATA;
|
||||
|
||||
/* Macro to calculate the size of the above pClipData */
|
||||
#define CBPCLIPDATA(clipdata) ( (clipdata).cbSize - sizeof((clipdata).ulClipFmt) )
|
||||
|
||||
typedef LONG SCODE;
|
||||
|
||||
/*
|
||||
#ifndef _FILETIME_
|
||||
#define _FILETIME_
|
||||
*/
|
||||
/* 64 bit number of 100 nanoseconds intervals since January 1, 1601 */
|
||||
/*
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwLowDateTime;
|
||||
DWORD dwHighDateTime;
|
||||
} FILETIME, *LPFILETIME;
|
||||
#endif
|
||||
*/
|
||||
|
||||
#ifndef _SECURITY_DEFINED
|
||||
#define _SECURITY_DEFINED
|
||||
|
||||
/*
|
||||
typedef struct {
|
||||
BYTE Value[6];
|
||||
} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY;
|
||||
|
||||
typedef struct _SID {
|
||||
BYTE Revision;
|
||||
BYTE SubAuthorityCount;
|
||||
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
|
||||
DWORD SubAuthority[1];
|
||||
} SID,*PSID;
|
||||
*/
|
||||
/*
|
||||
* ACL
|
||||
*/
|
||||
/*
|
||||
typedef struct _ACL {
|
||||
BYTE AclRevision;
|
||||
BYTE Sbz1;
|
||||
WORD AclSize;
|
||||
WORD AceCount;
|
||||
WORD Sbz2;
|
||||
} ACL, *PACL;
|
||||
|
||||
typedef DWORD SECURITY_INFORMATION;
|
||||
typedef WORD SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
|
||||
typedef DWORD ACCESS_MASK, *PACCESS_MASK;
|
||||
|
||||
typedef PVOID PGENERIC_MAPPING;
|
||||
*/
|
||||
/* The security descriptor structure */
|
||||
/*
|
||||
typedef struct {
|
||||
BYTE Revision;
|
||||
BYTE Sbz1;
|
||||
SECURITY_DESCRIPTOR_CONTROL Control;
|
||||
PSID Owner;
|
||||
PSID Group;
|
||||
PACL Sacl;
|
||||
PACL Dacl;
|
||||
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
|
||||
*/
|
||||
#endif /* _SECURITY_DEFINED */
|
||||
|
||||
#ifndef _ROTFLAGS_DEFINED
|
||||
#define _ROTFLAGS_DEFINED
|
||||
#define ROTFLAGS_REGISTRATIONKEEPSALIVE 0x1
|
||||
#define ROTFLAGS_ALLOWANYCLIENT 0x2
|
||||
#endif /* !defined(_ROTFLAGS_DEFINED) */
|
||||
|
||||
#endif /* __WINE_WTYPES_H */
|
Loading…
Reference in New Issue
Block a user