From aa12a763c97b42f4ffe1a74c7ea1b0820c63527b Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Mon, 13 Oct 2014 22:55:05 +0100 Subject: [PATCH] Remove unused cpp code --- cpp/JXInput/JXInputManager.cpp | 175 - cpp/JXInput/JXInputManager.h | 47 - cpp/JXInput/ReadMe.txt | 37 - cpp/JXInput/StdAfx.cpp | 9 - cpp/JXInput/StdAfx.h | 32 - ..._jxinput_directinput_DirectInputDriver.cpp | 279 - ...de_jxinput_directinput_DirectInputDriver.h | 183 - cpp/JXInput/dllmain.cpp | 24 - cpp/JXInput/jxinput.cpp | 600 -- cpp/JXInput/jxinput.dsp | 175 - cpp/JXInput/jxinput.dsw | 29 - cpp/JXInput/jxinput.h | 183 - cpp/JXInput/jxinput.sln | 20 - cpp/JXInput/jxinput.vcproj | 367 - cpp/JavaWinampApi/WINAMPCMD.H | 62 - cpp/JavaWinampApi/WinampController.c | 587 -- cpp/JavaWinampApi/WinampController.h | 285 - cpp/JavaWinampApi/dev/copy.bat | 1 - cpp/JavaWinampApi/dev/copy.mak | 2 - cpp/JavaWinampApi/dev/wpcom.dev | 69 - .../include/classfile_constants.h | 523 -- cpp/JavaWinampApi/include/jawt.h | 278 - cpp/JavaWinampApi/include/jdwpTransport.h | 237 - cpp/JavaWinampApi/include/jni.h | 1944 ----- cpp/JavaWinampApi/include/jvmti.h | 2504 ------ cpp/JavaWinampApi/include/win32/jawt_md.h | 41 - cpp/JavaWinampApi/include/win32/jni_md.h | 19 - cpp/JavaWinampApi/wa_ipc.h | 1620 ---- cpp/jacob/ComThread.cpp | 47 - cpp/jacob/ComThread.h | 48 - cpp/jacob/Dispatch.cpp | 582 -- cpp/jacob/Dispatch.h | 95 - cpp/jacob/DispatchEvents.cpp | 370 - cpp/jacob/DispatchEvents.h | 50 - cpp/jacob/DispatchProxy.cpp | 106 - cpp/jacob/DispatchProxy.h | 55 - cpp/jacob/EnumVariant.cpp | 131 - cpp/jacob/EnumVariant.h | 63 - cpp/jacob/EventProxy.cpp | 870 -- cpp/jacob/EventProxy.h | 101 - cpp/jacob/STA.cpp | 63 - cpp/jacob/STA.h | 47 - cpp/jacob/SafeArray.cpp | 3177 ------- cpp/jacob/SafeArray.h | 940 --- cpp/jacob/StdAfx.h | 51 - cpp/jacob/Variant.cpp | 1274 --- cpp/jacob/Variant.h | 605 -- cpp/jacob/include/atlalloc.h | 764 -- cpp/jacob/include/atlbase.h | 7410 ----------------- cpp/jacob/include/atlbase.inl | 428 - cpp/jacob/include/atlchecked.h | 605 -- cpp/jacob/include/atlcomcli.h | 2874 ------- cpp/jacob/include/atlconv.h | 1302 --- cpp/jacob/include/atlcore.h | 554 -- cpp/jacob/include/atldef.h | 668 -- cpp/jacob/include/atlexcept.h | 123 - cpp/jacob/include/atliface.h | 2956 ------- cpp/jacob/include/atlrc.h | 28 - cpp/jacob/include/atlsimpcoll.h | 489 -- cpp/jacob/include/atltrace.h | 450 - cpp/jacob/include/statreg.h | 1509 ---- cpp/jacob/lib/atls.lib | Bin 3030360 -> 0 bytes cpp/jacob/msvc/copy.bat | 1 - cpp/jacob/msvc/jacob.sln | 20 - cpp/jacob/msvc/jacob.suo | Bin 12288 -> 0 bytes cpp/jacob/msvc/jacob.vcxproj | 105 - cpp/jacob/msvc/jacob.vcxproj.filters | 87 - cpp/jacob/msvc/jacob.vcxproj.user | 3 - cpp/jacob/util.cpp | 75 - cpp/jacob/util.h | 29 - cpp/jintellitype/JIntellitype.cpp | 157 - cpp/jintellitype/JIntellitypeHandler.cpp | 279 - cpp/jintellitype/JIntellitypeHandler.h | 93 - cpp/jintellitype/JIntellitypeThread.cpp | 133 - cpp/jintellitype/JIntellitypeThread.h | 55 - cpp/jintellitype/JIntellitype_private.h | 23 - cpp/jintellitype/StdAfx.cpp | 8 - cpp/jintellitype/StdAfx.h | 24 - .../com_melloware_jintellitype_JIntellitype.h | 53 - cpp/jintellitype/msvc/copy.bat | 1 - cpp/jintellitype/msvc/jintellitype.sln | 20 - cpp/jintellitype/msvc/jintellitype.suo | Bin 11776 -> 0 bytes cpp/jintellitype/msvc/jintellitype.vcxproj | 96 - .../msvc/jintellitype.vcxproj.filters | 45 - .../msvc/jintellitype.vcxproj.user | 3 - cpp/list/dev/copy.bat | 1 - cpp/list/dev/copy.mak | 2 - cpp/list/dev/list.dev | 59 - cpp/list/main.cpp | 62 - cpp/nativecall/IntCall.cpp | 236 - cpp/nativecall/NativeCall.cpp | 234 - cpp/nativecall/VoidCall.cpp | 228 - cpp/nativecall/com_eaio_nativecall_IntCall.h | 29 - .../com_eaio_nativecall_NativeCall.h | 45 - cpp/nativecall/com_eaio_nativecall_VoidCall.h | 29 - cpp/nativecall/include/classfile_constants.h | 523 -- cpp/nativecall/include/jawt.h | 278 - cpp/nativecall/include/jdwpTransport.h | 237 - cpp/nativecall/include/jni.h | 1944 ----- cpp/nativecall/include/jvmti.h | 2504 ------ cpp/nativecall/include/win32/jawt_md.h | 41 - cpp/nativecall/include/win32/jni_md.h | 19 - cpp/nativecall/msvc/copy.bat | 1 - cpp/nativecall/msvc/nativecall.sln | 20 - cpp/nativecall/msvc/nativecall.suo | Bin 9728 -> 0 bytes cpp/nativecall/msvc/nativecall.vcxproj | 98 - .../msvc/nativecall.vcxproj.filters | 42 - cpp/nativecall/msvc/nativecall.vcxproj.user | 3 - 108 files changed, 47112 deletions(-) delete mode 100644 cpp/JXInput/JXInputManager.cpp delete mode 100644 cpp/JXInput/JXInputManager.h delete mode 100644 cpp/JXInput/ReadMe.txt delete mode 100644 cpp/JXInput/StdAfx.cpp delete mode 100644 cpp/JXInput/StdAfx.h delete mode 100644 cpp/JXInput/de_hardcode_jxinput_directinput_DirectInputDriver.cpp delete mode 100644 cpp/JXInput/de_hardcode_jxinput_directinput_DirectInputDriver.h delete mode 100644 cpp/JXInput/dllmain.cpp delete mode 100644 cpp/JXInput/jxinput.cpp delete mode 100644 cpp/JXInput/jxinput.dsp delete mode 100644 cpp/JXInput/jxinput.dsw delete mode 100644 cpp/JXInput/jxinput.h delete mode 100644 cpp/JXInput/jxinput.sln delete mode 100644 cpp/JXInput/jxinput.vcproj delete mode 100644 cpp/JavaWinampApi/WINAMPCMD.H delete mode 100644 cpp/JavaWinampApi/WinampController.c delete mode 100644 cpp/JavaWinampApi/WinampController.h delete mode 100644 cpp/JavaWinampApi/dev/copy.bat delete mode 100644 cpp/JavaWinampApi/dev/copy.mak delete mode 100644 cpp/JavaWinampApi/dev/wpcom.dev delete mode 100644 cpp/JavaWinampApi/include/classfile_constants.h delete mode 100644 cpp/JavaWinampApi/include/jawt.h delete mode 100644 cpp/JavaWinampApi/include/jdwpTransport.h delete mode 100644 cpp/JavaWinampApi/include/jni.h delete mode 100644 cpp/JavaWinampApi/include/jvmti.h delete mode 100644 cpp/JavaWinampApi/include/win32/jawt_md.h delete mode 100644 cpp/JavaWinampApi/include/win32/jni_md.h delete mode 100644 cpp/JavaWinampApi/wa_ipc.h delete mode 100644 cpp/jacob/ComThread.cpp delete mode 100644 cpp/jacob/ComThread.h delete mode 100644 cpp/jacob/Dispatch.cpp delete mode 100644 cpp/jacob/Dispatch.h delete mode 100644 cpp/jacob/DispatchEvents.cpp delete mode 100644 cpp/jacob/DispatchEvents.h delete mode 100644 cpp/jacob/DispatchProxy.cpp delete mode 100644 cpp/jacob/DispatchProxy.h delete mode 100644 cpp/jacob/EnumVariant.cpp delete mode 100644 cpp/jacob/EnumVariant.h delete mode 100644 cpp/jacob/EventProxy.cpp delete mode 100644 cpp/jacob/EventProxy.h delete mode 100644 cpp/jacob/STA.cpp delete mode 100644 cpp/jacob/STA.h delete mode 100644 cpp/jacob/SafeArray.cpp delete mode 100644 cpp/jacob/SafeArray.h delete mode 100644 cpp/jacob/StdAfx.h delete mode 100644 cpp/jacob/Variant.cpp delete mode 100644 cpp/jacob/Variant.h delete mode 100644 cpp/jacob/include/atlalloc.h delete mode 100644 cpp/jacob/include/atlbase.h delete mode 100644 cpp/jacob/include/atlbase.inl delete mode 100644 cpp/jacob/include/atlchecked.h delete mode 100644 cpp/jacob/include/atlcomcli.h delete mode 100644 cpp/jacob/include/atlconv.h delete mode 100644 cpp/jacob/include/atlcore.h delete mode 100644 cpp/jacob/include/atldef.h delete mode 100644 cpp/jacob/include/atlexcept.h delete mode 100644 cpp/jacob/include/atliface.h delete mode 100644 cpp/jacob/include/atlrc.h delete mode 100644 cpp/jacob/include/atlsimpcoll.h delete mode 100644 cpp/jacob/include/atltrace.h delete mode 100644 cpp/jacob/include/statreg.h delete mode 100644 cpp/jacob/lib/atls.lib delete mode 100644 cpp/jacob/msvc/copy.bat delete mode 100644 cpp/jacob/msvc/jacob.sln delete mode 100644 cpp/jacob/msvc/jacob.suo delete mode 100644 cpp/jacob/msvc/jacob.vcxproj delete mode 100644 cpp/jacob/msvc/jacob.vcxproj.filters delete mode 100644 cpp/jacob/msvc/jacob.vcxproj.user delete mode 100644 cpp/jacob/util.cpp delete mode 100644 cpp/jacob/util.h delete mode 100644 cpp/jintellitype/JIntellitype.cpp delete mode 100644 cpp/jintellitype/JIntellitypeHandler.cpp delete mode 100644 cpp/jintellitype/JIntellitypeHandler.h delete mode 100644 cpp/jintellitype/JIntellitypeThread.cpp delete mode 100644 cpp/jintellitype/JIntellitypeThread.h delete mode 100644 cpp/jintellitype/JIntellitype_private.h delete mode 100644 cpp/jintellitype/StdAfx.cpp delete mode 100644 cpp/jintellitype/StdAfx.h delete mode 100644 cpp/jintellitype/com_melloware_jintellitype_JIntellitype.h delete mode 100644 cpp/jintellitype/msvc/copy.bat delete mode 100644 cpp/jintellitype/msvc/jintellitype.sln delete mode 100644 cpp/jintellitype/msvc/jintellitype.suo delete mode 100644 cpp/jintellitype/msvc/jintellitype.vcxproj delete mode 100644 cpp/jintellitype/msvc/jintellitype.vcxproj.filters delete mode 100644 cpp/jintellitype/msvc/jintellitype.vcxproj.user delete mode 100644 cpp/list/dev/copy.bat delete mode 100644 cpp/list/dev/copy.mak delete mode 100644 cpp/list/dev/list.dev delete mode 100644 cpp/list/main.cpp delete mode 100644 cpp/nativecall/IntCall.cpp delete mode 100644 cpp/nativecall/NativeCall.cpp delete mode 100644 cpp/nativecall/VoidCall.cpp delete mode 100644 cpp/nativecall/com_eaio_nativecall_IntCall.h delete mode 100644 cpp/nativecall/com_eaio_nativecall_NativeCall.h delete mode 100644 cpp/nativecall/com_eaio_nativecall_VoidCall.h delete mode 100644 cpp/nativecall/include/classfile_constants.h delete mode 100644 cpp/nativecall/include/jawt.h delete mode 100644 cpp/nativecall/include/jdwpTransport.h delete mode 100644 cpp/nativecall/include/jni.h delete mode 100644 cpp/nativecall/include/jvmti.h delete mode 100644 cpp/nativecall/include/win32/jawt_md.h delete mode 100644 cpp/nativecall/include/win32/jni_md.h delete mode 100644 cpp/nativecall/msvc/copy.bat delete mode 100644 cpp/nativecall/msvc/nativecall.sln delete mode 100644 cpp/nativecall/msvc/nativecall.suo delete mode 100644 cpp/nativecall/msvc/nativecall.vcxproj delete mode 100644 cpp/nativecall/msvc/nativecall.vcxproj.filters delete mode 100644 cpp/nativecall/msvc/nativecall.vcxproj.user diff --git a/cpp/JXInput/JXInputManager.cpp b/cpp/JXInput/JXInputManager.cpp deleted file mode 100644 index 3718a7f..0000000 --- a/cpp/JXInput/JXInputManager.cpp +++ /dev/null @@ -1,175 +0,0 @@ - -#include "stdafx.h" -#include "JXInputManager.h" -#include "JXInput.h" - -// -// Globals -// -extern HINSTANCE g_hInst; - - -JXInputManager::JXInputManager( HWND hWnd ) : -mhWnd( hWnd ), -mDeviceCounter( 0 ) -{ - - for ( int i = 0; i < MAX_JXINPUTS; ++i ) - { - mDevices[ i ] = NULL; - } - - - if ( FAILED( InitDirectInput( hWnd ) ) ) - { - FreeDirectInput(); - } - -} - -JXInputManager::~JXInputManager() -{ - for ( int i = 0; i < getNumberOfJXInputs(); ++i ) - { - delete mDevices[ i ]; - mDevices[ i ] = NULL; - } - - FreeDirectInput(); -} - -int JXInputManager::getNumberOfJXInputs() const -{ - return mDeviceCounter; -} - -JXInput& JXInputManager::getJXInput( int idx ) const -{ - assert( idx < mDeviceCounter ); - return * mDevices[ idx ]; -} - - -int JXInputManager::getMaxNumberOfAxes() const -{ - return JXINPUT_MAX_AXES; -} - -int JXInputManager::getMaxNumberOfButtons() const -{ - return JXINPUT_MAX_BUTTONS; -} - -int JXInputManager::getMaxNumberOfDirectionals() const -{ - return JXINPUT_MAX_DIRECTIONALS; -} - - - -//----------------------------------------------------------------------------- -// Name: InitDirectInput() -// Desc: Initialize the DirectInput variables. -//----------------------------------------------------------------------------- -HRESULT JXInputManager::InitDirectInput( HWND hWnd ) -{ - HRESULT hr; - - // Register with the DirectInput subsystem and get a pointer - // to a IDirectInput interface we can use. - // Create a DInput object - if( FAILED( hr = DirectInput8Create( g_hInst, DIRECTINPUT_VERSION, - IID_IDirectInput8, (VOID**)&mpDI, NULL ) ) ) - return hr; - - // Look for a simple joystick we can use for this sample program. - if( FAILED( hr = mpDI->EnumDevices( DI8DEVCLASS_GAMECTRL, - EnumJoysticksCallback, - (VOID*)this, DIEDFL_ALLDEVICES /*| DIEDFL_INCLUDEPHANTOMS*/ ) ) ) - return hr; - - // Look for a other devices - if( FAILED( hr = mpDI->EnumDevices( DI8DEVCLASS_DEVICE, - EnumJoysticksCallback, - (VOID*)this, DIEDFL_ALLDEVICES /*| DIEDFL_INCLUDEPHANTOMS*/ ) ) ) - return hr; - - return S_OK; -} - - -//----------------------------------------------------------------------------- -// Name: FreeDirectInput() -// Desc: Initialize the DirectInput variables. -//----------------------------------------------------------------------------- -HRESULT JXInputManager::FreeDirectInput() -{ - - if ( NULL != mpDI ) - mpDI->Release(); - mpDI = NULL; - return S_OK; -} - - -//----------------------------------------------------------------------------- -// Name: EnumJoysticksCallback() -// Desc: Called once for each enumerated joystick. If we find one, create a -// device interface on it so we can play with it. -//----------------------------------------------------------------------------- -BOOL CALLBACK JXInputManager::EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, - VOID* pContext ) -{ - HRESULT hr; - LPDIRECTINPUTDEVICE8 pJoystick; - - JXInputManager* pThis = (JXInputManager*)pContext; - - // - // if the maximum number of devices is already registered, - // issue a warning and stop enumeration. - // - if( MAX_JXINPUTS == pThis->mDeviceCounter ) - { - OutputDebugString( "Max. number of devices exceeded!" ); - return DIENUM_STOP; - } - - - - // Obtain an interface to the enumerated joystick. - hr = pThis->mpDI->CreateDevice( pdidInstance->guidInstance, &pJoystick, NULL ); - - // If it failed, then we can't use this joystick. (Maybe the user unplugged - // it while we were in the middle of enumerating it.) - if( FAILED(hr) ) - return DIENUM_CONTINUE; - - JXInput* pJ = new JXInput( pJoystick, pThis->mhWnd ); - - // - // only register useful devices - // - if( pJ->getNumberOfAxes() + pJ->getNumberOfButtons() + pJ->getNumberOfDirectionals() > 0 ) - { - pThis->addJXInput( pJ ); - } - else - { - delete pJ; - } - - return DIENUM_CONTINUE; -} - - -/** - * Register a JXInput device. - */ -void JXInputManager::addJXInput( JXInput* pJ ) -{ - assert( mDeviceCounter < MAX_JXINPUTS ); - - if( mDeviceCounter < MAX_JXINPUTS ) - mDevices[ mDeviceCounter++ ] = pJ; -} diff --git a/cpp/JXInput/JXInputManager.h b/cpp/JXInput/JXInputManager.h deleted file mode 100644 index 41b9da4..0000000 --- a/cpp/JXInput/JXInputManager.h +++ /dev/null @@ -1,47 +0,0 @@ -// JXInputManager.h: Schnittstelle für die Klasse JXInputManager. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_JXINPUTMANAGER_H__24862402_14C9_407D_8532_A16A6E3A7D64__INCLUDED_) -#define AFX_JXINPUTMANAGER_H__24862402_14C9_407D_8532_A16A6E3A7D64__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -#define MAX_JXINPUTS 10 - -class JXInput; - -class JXINPUT_API JXInputManager -{ -public: - JXInputManager( HWND hWnd ); - virtual ~JXInputManager(); - - int getNumberOfJXInputs() const; - JXInput& getJXInput( int idx ) const; - - // - // Numbering methods - // - int getMaxNumberOfAxes() const; - int getMaxNumberOfButtons() const; - int getMaxNumberOfDirectionals() const; - -private: - LPDIRECTINPUT8 mpDI; - HWND mhWnd; - JXInput* mDevices[ MAX_JXINPUTS ]; - int mDeviceCounter; - - HRESULT InitDirectInput( HWND hWnd = NULL ); - HRESULT FreeDirectInput(); - - static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, - VOID* pContext ); - void addJXInput( JXInput* pJ ); -}; - -#endif // !defined(AFX_JXINPUTMANAGER_H__24862402_14C9_407D_8532_A16A6E3A7D64__INCLUDED_) diff --git a/cpp/JXInput/ReadMe.txt b/cpp/JXInput/ReadMe.txt deleted file mode 100644 index 5769d0b..0000000 --- a/cpp/JXInput/ReadMe.txt +++ /dev/null @@ -1,37 +0,0 @@ -======================================================================== - DYNAMIC LINK LIBRARY : jxinput -======================================================================== - - -Diese jxinput-DLL hat der Anwendungs-Assistent für Sie erstellt. - -Diese Datei enthält eine Zusammenfassung dessen, was Sie in jeder der Dateien -finden, die Ihre jxinput-Anwendung bilden. - -jxinput.dsp - Diese Datei (Projektdatei) enthält Informationen auf Projektebene und wird zur - Erstellung eines einzelnen Projekts oder Teilprojekts verwendet. Andere Benutzer können - die Projektdatei (.dsp) gemeinsam nutzen, sollten aber die Makefiles lokal exportieren. - -jxinput.cpp - Dies ist die Hauptquellcodedatei für die DLL. - -jxinput.h - Diese Datei enthält Ihre DLL-Exporte. - -///////////////////////////////////////////////////////////////////////////// -Weitere Standarddateien: - -StdAfx.h, StdAfx.cpp - Diese Dateien werden zum Erstellen einer vorkompilierten Header-Datei (PCH) namens - jxinput.pch und einer vorkompilierten Typdatei namens StdAfx.obj verwendet. - - -///////////////////////////////////////////////////////////////////////////// -Weitere Hinweise: - -Der Anwendungs-Assistent verwendet "ZU ERLEDIGEN:", um Bereiche des Quellcodes zu -kennzeichnen, die Sie hinzufügen oder anpassen sollten. - - -///////////////////////////////////////////////////////////////////////////// diff --git a/cpp/JXInput/StdAfx.cpp b/cpp/JXInput/StdAfx.cpp deleted file mode 100644 index a144a09..0000000 --- a/cpp/JXInput/StdAfx.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// stdafx.cpp : Quelltextdatei, die nur die Standard-Includes einbindet -// jxinput.pch ist die vorkompilierte Header-Datei -// stdafx.obj enthält die vorkompilierte Typinformation - -#include "stdafx.h" - -// ZU ERLEDIGEN: Verweis auf alle zusätzlichen Header-Dateien, die Sie in STDAFX.H -// und nicht in dieser Datei benötigen - diff --git a/cpp/JXInput/StdAfx.h b/cpp/JXInput/StdAfx.h deleted file mode 100644 index e139c4c..0000000 --- a/cpp/JXInput/StdAfx.h +++ /dev/null @@ -1,32 +0,0 @@ -// stdafx.h : Include-Datei für Standard-System-Include-Dateien, -// oder projektspezifische Include-Dateien, die häufig benutzt, aber -// in unregelmäßigen Abständen geändert werden. -// - -#if !defined(AFX_STDAFX_H__68E14C76_098F_47ED_932B_4C01E8E9EFFB__INCLUDED_) -#define AFX_STDAFX_H__68E14C76_098F_47ED_932B_4C01E8E9EFFB__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -// Fügen Sie hier Ihre Header-Dateien ein -#define WIN32_LEAN_AND_MEAN // Selten benutzte Teile der Windows-Header nicht einbinden -#define STRICT -#include - -// ZU ERLEDIGEN: Verweisen Sie hier auf zusätzliche Header-Dateien, die Ihr Programm benötigt -#ifdef JXINPUT_EXPORTS -#define JXINPUT_API __declspec(dllexport) -#else -#define JXINPUT_API __declspec(dllimport) -#endif - -#include -#include - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ fügt zusätzliche Deklarationen unmittelbar vor der vorherigen Zeile ein. - -#endif // !defined(AFX_STDAFX_H__68E14C76_098F_47ED_932B_4C01E8E9EFFB__INCLUDED_) diff --git a/cpp/JXInput/de_hardcode_jxinput_directinput_DirectInputDriver.cpp b/cpp/JXInput/de_hardcode_jxinput_directinput_DirectInputDriver.cpp deleted file mode 100644 index 077afe8..0000000 --- a/cpp/JXInput/de_hardcode_jxinput_directinput_DirectInputDriver.cpp +++ /dev/null @@ -1,279 +0,0 @@ -#include "stdafx.h" - -#include "de_hardcode_jxinput_directinput_DirectInputDriver.h" -#include "jxinput.h" -#include "JXInputManager.h" - - -// -// Globals -// -extern HINSTANCE g_hInst; - -static JXInputManager* pJXInputManager = NULL; -static JXInput* apJXInput[ MAX_JXINPUTS ]; -static HWND hWndJava; - -// -// IDs of the static Java arrays. -// -static jfieldID sAxesFieldID; -static jfieldID sButtonsFieldID; -static jfieldID sDirectionsFieldID; - - - -/** - * Remove all resources allocated by the Java binding. - */ -void shutdownJavaResources() -{ - if ( NULL != pJXInputManager ) - delete pJXInputManager; - - if ( NULL != hWndJava ) - DestroyWindow( hWndJava ); - - pJXInputManager = NULL; - - for( int i = 0; i < MAX_JXINPUTS; ++i ) - apJXInput[ i ] = NULL; - - hWndJava = NULL; -} - - - -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) -{ - return JNI_VERSION_1_2; -} - - -JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) -{ - shutdownJavaResources(); -} - - -JNIEXPORT jboolean JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_nativeinit - (JNIEnv * penv, jclass pClazz ) -{ - - // - // Create a non-visible window as 'owner' of the DI device. - // - hWndJava = CreateWindowEx( - 0/*WS_EX_APPWINDOW*/, // DWORD dwExStyle, // extended window style - "STATIC", // LPCTSTR lpClassName, // pointer to registered class name - NULL, // LPCTSTR lpWindowName, // pointer to window name - 0/*WS_CAPTION*/, // DWORD dwStyle, // window style - 0, // int x, // horizontal position of window - 0, // int y, // vertical position of window - 0, // int nWidth, // window width - 0, // int nHeight, // window height - NULL, // HWND hWndParent, // handle to parent or owner window - NULL, // HMENU hMenu, // handle to menu, or child-window identifier - g_hInst, // HINSTANCE hInstance, // handle to application instance - NULL // LPVOID lpParam // pointer to window-creation data - ); - - - if ( NULL == pJXInputManager ) - { - pJXInputManager = new JXInputManager( hWndJava ); - - for( int i = 0; i < MAX_JXINPUTS; ++i ) - apJXInput[ i ] = NULL; - - for ( int i = 0; i < pJXInputManager->getNumberOfJXInputs(); ++i ) - { - apJXInput[ i ] = & pJXInputManager->getJXInput( i ); - } - } - - return true; -} - - - -JNIEXPORT void JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_nativeexit - (JNIEnv *, jclass ) -{ - shutdownJavaResources(); -} - - -/** - * Bind my field IDs to the Java variables. - */ -JNIEXPORT void JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_bind - (JNIEnv * penv, jclass pClazz) -{ - // - // All fields are static. - // - sAxesFieldID = penv->GetStaticFieldID( pClazz, "sAxisValues", "[[D" ); - sButtonsFieldID = penv->GetStaticFieldID( pClazz, "sButtonStates", "[[Z" ); - sDirectionsFieldID = penv->GetStaticFieldID( pClazz, "sDirectionalValues", "[[I" ); -} - - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getNumberOfDevices - (JNIEnv *penv, jclass) -{ - return pJXInputManager->getNumberOfJXInputs(); -} - - -JNIEXPORT jstring JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getName - (JNIEnv *penv, jclass, jint dev) -{ - return penv->NewStringUTF( apJXInput[ dev ]->getName() ); -} - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getNumberOfAxes - (JNIEnv *, jclass, jint dev) -{ - return apJXInput[ dev ]->getNumberOfAxes(); -} - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getNumberOfButtons - (JNIEnv *, jclass, jint dev) -{ - return apJXInput[ dev ]->getNumberOfButtons(); -} - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getNumberOfDirectionals - (JNIEnv *, jclass, jint dev) -{ - return apJXInput[ dev ]->getNumberOfDirectionals(); -} - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getMaxNumberOfAxes - (JNIEnv *, jclass) -{ - return pJXInputManager->getMaxNumberOfAxes(); -} - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getMaxNumberOfButtons - (JNIEnv *, jclass) -{ - return pJXInputManager->getMaxNumberOfButtons(); -} - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getMaxNumberOfDirectionals - (JNIEnv *, jclass) -{ - return pJXInputManager->getMaxNumberOfDirectionals(); -} - -JNIEXPORT jboolean JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_isAxisAvailable - (JNIEnv *, jclass, jint dev, jint idx ) -{ - return apJXInput[ dev ]->isAxisAvailable( idx ); -} - -JNIEXPORT jstring JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getAxisName - (JNIEnv *penv, jclass, jint dev, jint idx ) -{ - return penv->NewStringUTF( apJXInput[ dev ]->getAxisName( idx ) ); -} - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getAxisType - (JNIEnv *, jclass, jint dev, jint idx ) -{ - return apJXInput[ dev ]->getAxisType( idx ); -} - - -JNIEXPORT jboolean JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_isButtonAvailable - (JNIEnv *, jclass, jint dev, jint idx ) -{ - return apJXInput[ dev ]->isButtonAvailable( idx ); -} - -JNIEXPORT jstring JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getButtonName - (JNIEnv *penv, jclass, jint dev, jint idx ) -{ - return penv->NewStringUTF( apJXInput[ dev ]->getButtonName( idx ) ); -} - -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getButtonType - (JNIEnv *, jclass, jint dev, jint idx ) -{ - return apJXInput[ dev ]->getButtonType( idx ); -} - -JNIEXPORT jboolean JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_isDirectionalAvailable - (JNIEnv *, jclass, jint dev, jint idx ) -{ - return apJXInput[ dev ]->isDirectionalAvailable( idx ); -} - -JNIEXPORT jstring JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getDirectionalName - (JNIEnv *penv, jclass, jint dev, jint idx ) -{ - return penv->NewStringUTF( apJXInput[ dev ]->getDirectionalName( idx ) ); -} - - - -/** - * The main update method. - * Here, the actual work is done. - */ -JNIEXPORT void JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_nativeupdate - (JNIEnv * penv, jclass pClazz ) -{ - - static jdouble axes [ MAX_JXINPUTS ][ JXINPUT_MAX_AXES ]; - static jboolean buttons [ MAX_JXINPUTS ][ JXINPUT_MAX_BUTTONS ]; - static jint directions [ MAX_JXINPUTS ][ JXINPUT_MAX_DIRECTIONALS ]; - - static jobjectArray axisarrayarray; - static jobjectArray buttonarrayarray; - static jobjectArray directionarrayarray; - - static jdoubleArray axisarray; - static jbooleanArray buttonarray; - static jintArray directionarray; - - axisarrayarray = (jobjectArray)penv->GetStaticObjectField( pClazz, sAxesFieldID ); - buttonarrayarray = (jobjectArray)penv->GetStaticObjectField( pClazz, sButtonsFieldID ); - directionarrayarray = (jobjectArray)penv->GetStaticObjectField( pClazz, sDirectionsFieldID ); - - // - // For each device.... - // - for ( int dev = 0; dev < pJXInputManager->getNumberOfJXInputs(); ++dev ) - { - // Do the update of the device. - apJXInput[ dev ]->update(); - - // - // Copy all values into my arrays. - // - for ( int i = 0; i < JXINPUT_MAX_AXES; ++i ) - axes[ dev ][ i ] = apJXInput[ dev ]->getAxisValue( i ); - for ( int i = 0; i < JXINPUT_MAX_BUTTONS; ++i ) - buttons[ dev ][ i ] = apJXInput[ dev ]->isButtonDown( i ); - for ( int i = 0; i < JXINPUT_MAX_DIRECTIONALS; ++i ) - directions[ dev ][ i ] = apJXInput[ dev ]->getDirection( i ); - - - // - // Move my arrays to the Java arrays. - // - axisarray = (jdoubleArray)penv->GetObjectArrayElement( axisarrayarray, dev ); - penv->SetDoubleArrayRegion( axisarray, 0, JXINPUT_MAX_AXES, axes[ dev ] ); - - buttonarray = (jbooleanArray)penv->GetObjectArrayElement( buttonarrayarray, dev ); - penv->SetBooleanArrayRegion( buttonarray, 0, JXINPUT_MAX_BUTTONS, buttons[ dev ] ); - - directionarray = (jintArray)penv->GetObjectArrayElement( directionarrayarray, dev ); - penv->SetIntArrayRegion( directionarray, 0, JXINPUT_MAX_DIRECTIONALS, directions[ dev ] ); - } - -} - diff --git a/cpp/JXInput/de_hardcode_jxinput_directinput_DirectInputDriver.h b/cpp/JXInput/de_hardcode_jxinput_directinput_DirectInputDriver.h deleted file mode 100644 index bb93548..0000000 --- a/cpp/JXInput/de_hardcode_jxinput_directinput_DirectInputDriver.h +++ /dev/null @@ -1,183 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include - -/* Header for class de_hardcode_jxinput_directinput_DirectInputDriver */ - -#ifndef _Included_de_hardcode_jxinput_directinput_DirectInputDriver -#define _Included_de_hardcode_jxinput_directinput_DirectInputDriver - -#ifdef __cplusplus -extern "C" { -#endif - -/* Inaccessible static: sIsOperational */ -/* Inaccessible static: sAxisValues */ -/* Inaccessible static: sButtonStates */ -/* Inaccessible static: sDirectionalValues */ -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: nativeinit - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_nativeinit - (JNIEnv *, jclass); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: nativeexit - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_nativeexit - (JNIEnv *, jclass); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: bind - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_bind - (JNIEnv *, jclass); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getNumberOfDevices - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getNumberOfDevices - (JNIEnv *, jclass); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getName - * Signature: (I)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getName - (JNIEnv *, jclass, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getNumberOfAxes - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getNumberOfAxes - - (JNIEnv *, jclass, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getNumberOfButtons - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getNumberOfButtons - (JNIEnv *, jclass, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getNumberOfDirectionals - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getNumberOfDirectionals - (JNIEnv *, jclass, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getMaxNumberOfAxes - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getMaxNumberOfAxes - (JNIEnv *, jclass); - - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getMaxNumberOfButtons - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getMaxNumberOfButtons - (JNIEnv *, jclass); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getMaxNumberOfDirectionals - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getMaxNumberOfDirectionals - (JNIEnv *, jclass); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: isAxisAvailable - * Signature: (II)Z - */ -JNIEXPORT jboolean JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_isAxisAvailable - (JNIEnv *, jclass, jint, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getAxisName - * Signature: (II)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getAxisName - (JNIEnv *, jclass, jint, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getAxisType - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getAxisType - (JNIEnv *, jclass, jint, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: isButtonAvailable - * Signature: (II)Z - */ -JNIEXPORT jboolean JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_isButtonAvailable - (JNIEnv *, jclass, jint, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getButtonName - * Signature: (II)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getButtonName - (JNIEnv *, jclass, jint, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getButtonType - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getButtonType - (JNIEnv *, jclass, jint, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: isDirectionalAvailable - * Signature: (II)Z - */ -JNIEXPORT jboolean JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_isDirectionalAvailable - (JNIEnv *, jclass, jint, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: getDirectionalName - * Signature: (II)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_getDirectionalName - (JNIEnv *, jclass, jint, jint); - -/* - * Class: de_hardcode_jxinput_directinput_DirectInputDriver - * Method: nativeupdate - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_de_hardcode_jxinput_directinput_DirectInputDriver_nativeupdate - (JNIEnv *, jclass); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/cpp/JXInput/dllmain.cpp b/cpp/JXInput/dllmain.cpp deleted file mode 100644 index 567e8d4..0000000 --- a/cpp/JXInput/dllmain.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "stdafx.h" - -HINSTANCE g_hInst; - - -BOOL APIENTRY DllMain( HANDLE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - g_hInst = (HINSTANCE)hModule; - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - break; - case DLL_PROCESS_DETACH: - g_hInst = NULL; - break; - } - return TRUE; -} diff --git a/cpp/JXInput/jxinput.cpp b/cpp/JXInput/jxinput.cpp deleted file mode 100644 index 890805b..0000000 --- a/cpp/JXInput/jxinput.cpp +++ /dev/null @@ -1,600 +0,0 @@ -// -// jxinput.cpp -// -#include "stdafx.h" -#include "jxinput.h" - - -// -// Globals -// -extern HINSTANCE g_hInst; - - -/** - * Ctor: Connect with DI - */ -JXInput::JXInput( LPDIRECTINPUTDEVICE8 pJoystick, HWND hWnd ) : - mpJoystick( pJoystick ), - mSliderCount( 0 ), - mPOVCount( 0 ), - mButtonCount( 0 ) -{ - initAxisConfig(); - initButtonsConfig(); - initDirectionalsConfig(); - - if ( FAILED( InitDirectInput( hWnd ) ) ) - { - FreeDirectInput(); - } -} - - - -/** - * Destructor: - * Free DirectInput. - */ -JXInput::~JXInput() -{ - FreeDirectInput(); -} - - -void JXInput::update() -{ - UpdateInputState(); -} - - -TCHAR * const JXInput::getName() const -{ - return (TCHAR*)mdiDevInfo.tszInstanceName; -} - - - -int JXInput::getNumberOfAxes() const -{ - return mdiDevCaps.dwAxes; -} - -int JXInput::getNumberOfButtons() const -{ - return mButtonCount; -} - -int JXInput::getNumberOfDirectionals() const -{ - return mPOVCount; -} - - -double JXInput::getAxisValueHelper( LONG val, int idx ) const -{ - const AxisConfig& cfg = mAxisConfig[ idx ]; - - double span = (double)( cfg.mMaxValue - cfg.mMinValue ); - double ret = (double)(val - cfg.mMinValue) / span; - - if ( TYPE_SLIDER != cfg.mType ) - return ret*2.0 - 1.0; - return ret; -} - -double JXInput::getX() const -{ - return getAxisValueHelper( mJS.lX, ID_X ); -} -double JXInput::getY() const -{ - return getAxisValueHelper( mJS.lY, ID_Y ); -} -double JXInput::getZ() const -{ - return getAxisValueHelper( mJS.lZ, ID_Z ); -} -double JXInput::getRotX() const -{ - return getAxisValueHelper( mJS.lRx, ID_ROTX ); -} -double JXInput::getRotY() const -{ - return getAxisValueHelper( mJS.lRy, ID_ROTY ); -} -double JXInput::getRotZ() const -{ - return getAxisValueHelper( mJS.lRz, ID_ROTZ ); -} -double JXInput::getSlider0() const -{ - return getAxisValueHelper( mJS.rglSlider[ 0 ], ID_SLIDER0 ); -} -double JXInput::getSlider1() const -{ - return getAxisValueHelper( mJS.rglSlider[ 1 ], ID_SLIDER1 ); -} - - - -bool JXInput::isAxisAvailable( int idx ) const -{ - assert( idx < JXINPUT_MAX_AXES ); - return mAxisConfig[ idx ].mIsAvailable; -} - -TCHAR * const JXInput::getAxisName( int idx ) const -{ - assert( idx < JXINPUT_MAX_AXES ); - return (char*const)mAxisConfig[ idx ].mName; -} - -int JXInput::getAxisType( int idx ) const -{ - assert( idx < JXINPUT_MAX_AXES ); - return mAxisConfig[ idx ].mType; -} - -double JXInput::getAxisValue( int idx ) const -{ - assert( idx < JXINPUT_MAX_AXES ); - - // Failsafe if called accidentally - if ( ! mAxisConfig[ idx ].mIsAvailable ) - return 0.0; - - return (this->*mAxisConfig[ idx ].mGetValueMethod)(); -} - - - - - -bool JXInput::isButtonAvailable( int idx ) const -{ - assert( idx < JXINPUT_MAX_BUTTONS ); - return mButtonConfig[ idx ].mIsAvailable; -} - -TCHAR * const JXInput::getButtonName( int idx ) const -{ - assert( idx < JXINPUT_MAX_BUTTONS ); - return (char*const)mButtonConfig[ idx ].mName; -} - -int JXInput::getButtonType( int idx ) const -{ - assert( idx < JXINPUT_MAX_BUTTONS ); - return mButtonConfig[ idx ].mType; -} - -bool JXInput::isButtonDown( int idx ) const -{ - assert( idx < JXINPUT_MAX_BUTTONS ); - return 0 != mJS.rgbButtons[ idx ] ; -} - - -bool JXInput::isDirectionalAvailable( int idx ) const -{ - assert( idx < JXINPUT_MAX_DIRECTIONALS ); - return mDirectionalConfig[ idx ].mIsAvailable; -} - -TCHAR * const JXInput::getDirectionalName( int idx ) const -{ - assert( idx < JXINPUT_MAX_DIRECTIONALS ); - return (char*const)mDirectionalConfig[ idx ].mName; -} - -int JXInput::getDirection( int idx ) const -{ - assert( idx < JXINPUT_MAX_DIRECTIONALS ); - return mJS.rgdwPOV[ idx ] ; -} - - -/** - * Initialize axis configuration array. - */ -void JXInput::initAxisConfig() -{ - mAxisConfig[ ID_X ].mIsAvailable = false; - mAxisConfig[ ID_X ].mType = TYPE_TRANSLATION; - mAxisConfig[ ID_X ].mGetValueMethod = &JXInput::getX; - - mAxisConfig[ ID_Y ].mIsAvailable = false; - mAxisConfig[ ID_Y ].mType = TYPE_TRANSLATION; - mAxisConfig[ ID_Y ].mGetValueMethod = &JXInput::getY; - - mAxisConfig[ ID_Z ].mIsAvailable = false; - mAxisConfig[ ID_Z ].mType = TYPE_TRANSLATION; - mAxisConfig[ ID_Z ].mGetValueMethod = &JXInput::getZ; - - mAxisConfig[ ID_ROTX ].mIsAvailable = false; - mAxisConfig[ ID_ROTX ].mType = TYPE_ROTATION; - mAxisConfig[ ID_ROTX ].mGetValueMethod = &JXInput::getRotX; - - mAxisConfig[ ID_ROTY ].mIsAvailable = false; - mAxisConfig[ ID_ROTY ].mType = TYPE_ROTATION; - mAxisConfig[ ID_ROTY ].mGetValueMethod = &JXInput::getRotY; - - mAxisConfig[ ID_ROTZ ].mIsAvailable = false; - mAxisConfig[ ID_ROTZ ].mType = TYPE_ROTATION; - mAxisConfig[ ID_ROTZ ].mGetValueMethod = &JXInput::getRotZ; - - mAxisConfig[ ID_SLIDER0 ].mIsAvailable = false; - mAxisConfig[ ID_SLIDER0 ].mType = TYPE_SLIDER; - mAxisConfig[ ID_SLIDER0 ].mGetValueMethod = &JXInput::getSlider0; - - mAxisConfig[ ID_SLIDER1 ].mIsAvailable = false; - mAxisConfig[ ID_SLIDER1 ].mType = TYPE_SLIDER; - mAxisConfig[ ID_SLIDER1 ].mGetValueMethod = &JXInput::getSlider1; -} - - -/** - * Initialize buttons configuration array. - */ -void JXInput::initButtonsConfig() -{ - for ( int i = 0; i < JXINPUT_MAX_BUTTONS; ++i ) - { - mButtonConfig[ i ].mIsAvailable = false; - mButtonConfig[ i ].mName[ 0 ] = '\0'; - mButtonConfig[ i ].mType = TYPE_PUSHBUTTON; - } - -} - - -/** - * Initialize directionals configuration array. - */ -void JXInput::initDirectionalsConfig() -{ - for ( int i = 0; i < JXINPUT_MAX_DIRECTIONALS; ++i ) - { - mDirectionalConfig[ i ].mIsAvailable = false; - mDirectionalConfig[ i ].mName[ 0 ] = '\0'; - } - -} - - - -//----------------------------------------------------------------------------- -// Name: EnumAxesCallback() -// Desc: Callback function for enumerating the axes on a joystick -//----------------------------------------------------------------------------- -BOOL CALLBACK JXInput::EnumAxesCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, - VOID* pContext ) -{ - JXInput* pThis = (JXInput*)pContext; - - AxisConfig* pAxCfg = NULL; - - // Set the UI to reflect what objects the joystick supports - // Code derived from M$ samples, really sucks, eh? - if (pdidoi->guidType == GUID_XAxis) - { - pAxCfg = & pThis->mAxisConfig[ ID_X ]; - } - if (pdidoi->guidType == GUID_YAxis) - { - pAxCfg = & pThis->mAxisConfig[ ID_Y ]; - } - if (pdidoi->guidType == GUID_ZAxis) - { - pAxCfg = & pThis->mAxisConfig[ ID_Z ]; - } - if (pdidoi->guidType == GUID_RxAxis) - { - pAxCfg = & pThis->mAxisConfig[ ID_ROTX ]; - } - if (pdidoi->guidType == GUID_RyAxis) - { - pAxCfg = & pThis->mAxisConfig[ ID_ROTY ]; - } - if (pdidoi->guidType == GUID_RzAxis) - { - pAxCfg = & pThis->mAxisConfig[ ID_ROTZ ]; - } - if (pdidoi->guidType == GUID_Slider) - { - switch( pThis->mSliderCount++ ) - { - case 0 : - pAxCfg = & pThis->mAxisConfig[ ID_SLIDER0 ]; - break; - - case 1 : - pAxCfg = & pThis->mAxisConfig[ ID_SLIDER1 ]; - break; - } - } - - // fail-safe - if( NULL == pAxCfg ) // e.g. GUID_Unknown - return DIENUM_CONTINUE; - - - // - // Perform config. - // - - DIPROPRANGE diprg; - diprg.diph.dwSize = sizeof(DIPROPRANGE); - diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER); - diprg.diph.dwHow = DIPH_BYID; - diprg.diph.dwObj = pdidoi->dwType; // Specify the enumerated axis - - // Get the range for the axis - if( FAILED( pThis->mpJoystick->GetProperty( DIPROP_RANGE, &diprg.diph ) ) ) - return DIENUM_CONTINUE; - - pAxCfg->mMinValue = diprg.lMin; - pAxCfg->mMaxValue = diprg.lMax; - - strcpy( (char*)pAxCfg->mName, (char*)pdidoi->tszName ); - pAxCfg->mIsAvailable = true; - - return DIENUM_CONTINUE; -} - - - -//----------------------------------------------------------------------------- -// Name: EnumButtonsCallback() -// Desc: Callback function for enumerating the axes on a joystick -//----------------------------------------------------------------------------- -BOOL CALLBACK JXInput::EnumButtonsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, - VOID* pContext ) -{ - JXInput* pThis = (JXInput*)pContext; - - // - // if the maximum number of buttons is already registered, - // issue a warning and stop enumeration. - // - if( JXINPUT_MAX_BUTTONS == pThis->mButtonCount ) - { - OutputDebugString( "Max. number of buttons exceeded!" ); - return DIENUM_STOP; - } - - - ButtonConfig* pBtCfg = NULL; - - if ( pdidoi->guidType == GUID_Button ) - { - assert( JXINPUT_MAX_BUTTONS > pThis->mButtonCount ); - pBtCfg = & pThis->mButtonConfig[ pThis->mButtonCount++ ]; - } - - - // fail-safe - if( NULL == pBtCfg ) // e.g. unknown stuff - return DIENUM_CONTINUE; - assert( NULL != pBtCfg ); - - // - // Perform config. - // - - strcpy( (char*)pBtCfg->mName, (char*)pdidoi->tszName ); - pBtCfg->mIsAvailable = true; - - return DIENUM_CONTINUE; -} - - -//----------------------------------------------------------------------------- -// Name: EnumPOVsCallback() -// Desc: Callback function for enumerating the axes on a joystick -//----------------------------------------------------------------------------- -BOOL CALLBACK JXInput::EnumPOVsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, - VOID* pContext ) -{ - JXInput* pThis = (JXInput*)pContext; - - // - // if the maximum number of buttons is already registered, - // issue a warning and stop enumeration. - // - if( JXINPUT_MAX_DIRECTIONALS == pThis->mPOVCount ) - { - OutputDebugString( "Max. number of POVs exceeded!" ); - return DIENUM_STOP; - } - - DirectionalConfig* pDirCfg = NULL; - - - if (pdidoi->guidType == GUID_POV) - { - assert( JXINPUT_MAX_DIRECTIONALS > pThis->mPOVCount ); - pDirCfg = & pThis->mDirectionalConfig[ pThis->mPOVCount++ ]; - } - - // fail-safe - if( NULL == pDirCfg ) // e.g. unknown stuff - return DIENUM_CONTINUE; - assert( NULL != pDirCfg ); - - // - // Perform config. - // - - strcpy( (char*)pDirCfg->mName, (char*)pdidoi->tszName ); - pDirCfg->mIsAvailable = true; - - return DIENUM_CONTINUE; -} - - - -//----------------------------------------------------------------------------- -// Name: EnumEffectsCallback() -// Desc: Callback function for enumerating the effects of a joystick -//----------------------------------------------------------------------------- -BOOL CALLBACK JXInput::EnumEffectsCallback( const DIEFFECTINFO* pdidoi, - VOID* pContext ) -{ - JXInput* pThis = (JXInput*)pContext; - - // - // Work on that!! - // - - return DIENUM_CONTINUE; -} - - - -//----------------------------------------------------------------------------- -// Name: InitDirectInput() -// Desc: Initialize the DirectInput variables. -//----------------------------------------------------------------------------- -HRESULT JXInput::InitDirectInput( HWND hWnd ) -{ - HRESULT hr; - - // Make sure we got a joystick - if( NULL == mpJoystick ) - { - return E_FAIL; - } - - - // - // Ask the device for some useful information. - // - mdiDevInfo.dwSize = sizeof( DIDEVICEINSTANCE ); - hr = mpJoystick->GetDeviceInfo( &mdiDevInfo ); - if( FAILED(hr) ) - return hr; - - // Set the data format to "simple joystick" - a predefined data format - // - // A data format specifies which controls on a device we are interested in, - // and how they should be reported. This tells DInput that we will be - // passing a DIJOYSTATE structure to IDirectInputDevice::GetDeviceState(). - hr = mpJoystick->SetDataFormat( &c_dfDIJoystick2 ); - if( FAILED(hr) ) - return hr; - - // Set the cooperative level to let DInput know how this device should - // interact with the system and with other DInput applications. -// hr = g_pJoystick->SetCooperativeLevel( hDlg, DISCL_EXCLUSIVE|DISCL_FOREGROUND ); - DWORD mode = ( NULL == hWnd ? DISCL_NONEXCLUSIVE|DISCL_BACKGROUND : DISCL_EXCLUSIVE|DISCL_BACKGROUND ); - hr = mpJoystick->SetCooperativeLevel( hWnd, mode ); - if( FAILED(hr) ) - return hr; - - // Determine how many axis the joystick has (so we don't error out setting - // properties for unavailable axis) - mdiDevCaps.dwSize = sizeof(DIDEVCAPS); - hr = mpJoystick->GetCapabilities(&mdiDevCaps); - if ( FAILED(hr) ) - return hr; - - - // Enumerate the axes of the joyctick and set the range of each axis. Note: - // we could just use the defaults, but we're just trying to show an example - // of enumerating device objects (axes, buttons, etc.). - mpJoystick->EnumObjects( EnumAxesCallback, (VOID*)this, DIDFT_AXIS ); - mpJoystick->EnumObjects( EnumButtonsCallback, (VOID*)this, DIDFT_BUTTON ); - mpJoystick->EnumObjects( EnumPOVsCallback, (VOID*)this, DIDFT_POV ); - - mpJoystick->EnumEffects( EnumEffectsCallback, (VOID*)this, DIEFT_ALL ); - - // For FF sticks, switch on autocenter as long as we do not use real FF - SwitchAutoCenter( true ); - - return S_OK; -} - - - - - -//----------------------------------------------------------------------------- -// Name: UpdateInputState() -// Desc: Get the input device's state and display it. -//----------------------------------------------------------------------------- -HRESULT JXInput::UpdateInputState() -{ - HRESULT hr; - - if( mpJoystick ) - { - - // Poll the device to read the current state - hr = mpJoystick->Poll(); - if( FAILED(hr) ) - { - // DInput is telling us that the input stream has been - // interrupted. We aren't tracking any state between polls, so - // we don't have any special reset that needs to be done. We - // just re-acquire and try again. - hr = mpJoystick->Acquire(); - while( hr == DIERR_INPUTLOST ) - hr = mpJoystick->Acquire(); - - // hr may be DIERR_OTHERAPPHASPRIO or other errors. This - // may occur when the app is minimized or in the process of - // switching, so just try again later - return S_OK; - } - - // Get the input's device state - if( FAILED( hr = mpJoystick->GetDeviceState( sizeof(DIJOYSTATE2), &mJS ) ) ) - return hr; // The device should have been acquired during the Poll() - - } - - return S_OK; -} - - - - -//----------------------------------------------------------------------------- -// Name: FreeDirectInput() -// Desc: Initialize the DirectInput variables. -//----------------------------------------------------------------------------- -HRESULT JXInput::FreeDirectInput() -{ - // Unacquire and release any DirectInputDevice objects. - if( NULL != mpJoystick ) - { - // Unacquire the device one last time just in case - // the app tried to exit while the device is still acquired. - mpJoystick->Unacquire(); - - mpJoystick->Release(); - mpJoystick = NULL; - } - - return S_OK; -} - - - -HRESULT JXInput::SwitchAutoCenter( bool onoff ) -{ - HRESULT hr; - - DIPROPDWORD DIPropAutoCenter; - - DIPropAutoCenter.diph.dwSize = sizeof(DIPropAutoCenter); - DIPropAutoCenter.diph.dwHeaderSize = sizeof(DIPROPHEADER); - DIPropAutoCenter.diph.dwObj = 0; - DIPropAutoCenter.diph.dwHow = DIPH_DEVICE; - DIPropAutoCenter.dwData = ( onoff ? DIPROPAUTOCENTER_ON : DIPROPAUTOCENTER_OFF ); - - hr = mpJoystick->SetProperty( DIPROP_AUTOCENTER, &DIPropAutoCenter.diph ); - return hr; -} diff --git a/cpp/JXInput/jxinput.dsp b/cpp/JXInput/jxinput.dsp deleted file mode 100644 index 8bc8c66..0000000 --- a/cpp/JXInput/jxinput.dsp +++ /dev/null @@ -1,175 +0,0 @@ -# Microsoft Developer Studio Project File - Name="jxinput" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** NICHT BEARBEITEN ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=jxinput - Win32 Debug -!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE -!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl -!MESSAGE -!MESSAGE NMAKE /f "jxinput.mak". -!MESSAGE -!MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben -!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: -!MESSAGE -!MESSAGE NMAKE /f "jxinput.mak" CFG="jxinput - Win32 Debug" -!MESSAGE -!MESSAGE Für die Konfiguration stehen zur Auswahl: -!MESSAGE -!MESSAGE "jxinput - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") -!MESSAGE "jxinput - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "jxinput - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JXINPUT_EXPORTS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "C:\j2sdk1.4.2\include" /I "C:\j2sdk1.4.2\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JXINPUT_EXPORTS" /FR /Yu"stdafx.h" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x407 /d "NDEBUG" -# ADD RSC /l 0x407 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 dxguid.lib dinput8.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\build\jxinput.dll" - -!ELSEIF "$(CFG)" == "jxinput - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JXINPUT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "C:\j2sdk1.4.2\include" /I "C:\j2sdk1.4.2\include\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JXINPUT_EXPORTS" /FR /Yu"stdafx.h" /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x407 /d "_DEBUG" -# ADD RSC /l 0x407 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 dxguid.lib dinput8.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\Classes\jxinput.dll" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "jxinput - Win32 Release" -# Name "jxinput - Win32 Debug" -# Begin Group "Quellcodedateien" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\de_hardcode_jxinput_directinput_DirectInputDriver.cpp -# End Source File -# Begin Source File - -SOURCE=.\dllmain.cpp -# End Source File -# Begin Source File - -SOURCE=.\jxinput.cpp -# End Source File -# Begin Source File - -SOURCE=.\JXInputManager.cpp -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.cpp -# ADD CPP /Yc"stdafx.h" -# End Source File -# End Group -# Begin Group "Header-Dateien" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\de_hardcode_jxinput_directinput_DirectInputDriver.h - -!IF "$(CFG)" == "jxinput - Win32 Release" - -# PROP Ignore_Default_Tool 1 -USERDEP__DE_HA="..\classes\de\hardcode\jxinput\directinput\DirectInputDriver.class" -# Begin Custom Build -InputPath=.\de_hardcode_jxinput_directinput_DirectInputDriver.h - -"de_hardcode_jxinput_directinput_DirectInputDriver.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - cd ..\Classes - C:\j2sdk1.4.2\bin\javah -classpath . -d ..\win32 de.hardcode.jxinput.directinput.DirectInputDriver - cd ..\win32 - -# End Custom Build - -!ELSEIF "$(CFG)" == "jxinput - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -USERDEP__DE_HA="..\classes\de\hardcode\jxinput\directinput\DirectInputDriver.class" -# Begin Custom Build -InputPath=.\de_hardcode_jxinput_directinput_DirectInputDriver.h - -"de_hardcode_jxinput_directinput_DirectInputDriver.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - cd ..\Classes - C:\j2sdk1.4.2\bin\javah -classpath . -d ..\win32 de.hardcode.jxinput.directinput.DirectInputDriver - cd ..\win32 - -# End Custom Build - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\jxinput.h -# End Source File -# Begin Source File - -SOURCE=.\JXInputManager.h -# End Source File -# Begin Source File - -SOURCE=.\StdAfx.h -# End Source File -# End Group -# Begin Group "Ressourcendateien" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project diff --git a/cpp/JXInput/jxinput.dsw b/cpp/JXInput/jxinput.dsw deleted file mode 100644 index b685e40..0000000 --- a/cpp/JXInput/jxinput.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! - -############################################################################### - -Project: "jxinput"=".\jxinput.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/cpp/JXInput/jxinput.h b/cpp/JXInput/jxinput.h deleted file mode 100644 index 6d47a31..0000000 --- a/cpp/JXInput/jxinput.h +++ /dev/null @@ -1,183 +0,0 @@ - -#define JXINPUT_MAX_AXES 8 -#define JXINPUT_MAX_BUTTONS 256 -#define JXINPUT_MAX_DIRECTIONALS 4 - - -/** - * This class will be exported by jxinput.dll. - */ -class JXINPUT_API JXInput -{ - -public: - - typedef enum AXISTYPE - { - TYPE_TRANSLATION, - TYPE_ROTATION, - TYPE_SLIDER - }; - - typedef enum BUTTONTYPE - { - TYPE_PUSHBUTTON, - TYPE_TOGGLEBUTTON - }; - - typedef enum AXISID - { - ID_X, ID_Y, ID_Z, - ID_ROTX, ID_ROTY, ID_ROTZ, - ID_SLIDER0, ID_SLIDER1 - }; - - - // - // Ctor - // - JXInput( LPDIRECTINPUTDEVICE8 pJoystick, HWND hWnd = NULL ); - - // - // Dtor - // - virtual ~JXInput(); - - // - // Operational methods - // - void update(); - - // Ask for the name - TCHAR * const getName() const; - - // - // Numbering methods - // - int getNumberOfAxes() const; - int getNumberOfButtons() const; - int getNumberOfDirectionals() const; - - - // - // Access axes - // - double getX() const; /** -1.0 .... 1.0 */ - double getY() const; /** -1.0 .... 1.0 */ - double getZ() const; /** -1.0 .... 1.0 */ - double getRotX() const; /** -1.0 .... 1.0 */ - double getRotY() const; /** -1.0 .... 1.0 */ - double getRotZ() const; /** -1.0 .... 1.0 */ - double getSlider0() const; /** 0.0 .... 1.0 */ - double getSlider1() const; /** 0.0 .... 1.0 */ - - - // - // Axis methods - // - bool isAxisAvailable( int idx ) const; - TCHAR* const getAxisName( int idx ) const; - int getAxisType( int idx ) const; - double getAxisValue( int idx ) const; - - // - // Button methods - // - bool isButtonAvailable( int idx ) const; - TCHAR* const getButtonName( int idx ) const; - int getButtonType( int idx ) const; - bool isButtonDown( int idx ) const; - - // - // Directional methods - // - bool isDirectionalAvailable( int idx ) const; - TCHAR* const getDirectionalName( int idx ) const; - int getDirection( int idx ) const; - -private://----------------------------------------------------------------------------------------- - LPDIRECTINPUTDEVICE8 mpJoystick; - - DIDEVICEINSTANCE mdiDevInfo; - DIDEVCAPS mdiDevCaps; - DIJOYSTATE2 mJS; // DInput joystick state - - int mSliderCount; - int mPOVCount; - int mButtonCount; - - double getAxisValueHelper( LONG val, int idx ) const; - - HRESULT SwitchAutoCenter( bool onoff = true ); - - HRESULT InitDirectInput( HWND hWnd = NULL ); - HRESULT FreeDirectInput(); - HRESULT UpdateInputState(); - - - static BOOL CALLBACK EnumAxesCallback - ( - const DIDEVICEOBJECTINSTANCE* pdidoi, - VOID* pContext - ); - - static BOOL CALLBACK EnumButtonsCallback - ( - const DIDEVICEOBJECTINSTANCE* pdidoi, - VOID* pContext - ); - - static BOOL CALLBACK EnumPOVsCallback - ( - const DIDEVICEOBJECTINSTANCE* pdidoi, - VOID* pContext - ); - - static BOOL CALLBACK EnumEffectsCallback - ( - const DIEFFECTINFO* pdidoi, - VOID* pContext - ); - - - class JXINPUT_API AxisConfig - { - - public: - bool mIsAvailable; - CHAR mName[MAX_PATH]; - AXISTYPE mType; - LONG mMinValue; - LONG mMaxValue; - double (JXInput::*mGetValueMethod)() const; - - } mAxisConfig [ JXINPUT_MAX_AXES ]; - - void initAxisConfig(); - - - class JXINPUT_API ButtonConfig - { - - public: - bool mIsAvailable; - CHAR mName[MAX_PATH]; - BUTTONTYPE mType; - - } mButtonConfig[ JXINPUT_MAX_BUTTONS ]; - - void initButtonsConfig(); - - - class JXINPUT_API DirectionalConfig - { - - public: - bool mIsAvailable; - CHAR mName[MAX_PATH]; - - } mDirectionalConfig[ JXINPUT_MAX_DIRECTIONALS ]; - - void initDirectionalsConfig(); -}; - diff --git a/cpp/JXInput/jxinput.sln b/cpp/JXInput/jxinput.sln deleted file mode 100644 index 714fdc7..0000000 --- a/cpp/JXInput/jxinput.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jxinput", "jxinput.vcproj", "{8AEA84DC-D8F0-4425-BEBF-A84E91115F76}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8AEA84DC-D8F0-4425-BEBF-A84E91115F76}.Debug|Win32.ActiveCfg = Debug|Win32 - {8AEA84DC-D8F0-4425-BEBF-A84E91115F76}.Debug|Win32.Build.0 = Debug|Win32 - {8AEA84DC-D8F0-4425-BEBF-A84E91115F76}.Release|Win32.ActiveCfg = Release|Win32 - {8AEA84DC-D8F0-4425-BEBF-A84E91115F76}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/cpp/JXInput/jxinput.vcproj b/cpp/JXInput/jxinput.vcproj deleted file mode 100644 index c87fc0f..0000000 --- a/cpp/JXInput/jxinput.vcproj +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cpp/JavaWinampApi/WINAMPCMD.H b/cpp/JavaWinampApi/WINAMPCMD.H deleted file mode 100644 index 9ba5de3..0000000 --- a/cpp/JavaWinampApi/WINAMPCMD.H +++ /dev/null @@ -1,62 +0,0 @@ -#define WINAMP_FILE_QUIT 40001 -#define WINAMP_OPTIONS_PREFS 40012 -#define WINAMP_OPTIONS_AOT 40019 -#define WINAMP_FILE_REPEAT 40022 -#define WINAMP_FILE_SHUFFLE 40023 -#define WINAMP_HIGH_PRIORITY 40025 -#define WINAMP_FILE_PLAY 40029 -#define WINAMP_OPTIONS_EQ 40036 -#define WINAMP_OPTIONS_ELAPSED 40037 -#define WINAMP_OPTIONS_REMAINING 40038 -#define WINAMP_OPTIONS_PLEDIT 40040 -#define WINAMP_HELP_ABOUT 40041 -#define WINAMP_MAINMENU 40043 -#define WINAMP_BUTTON1 40044 -#define WINAMP_BUTTON2 40045 -#define WINAMP_BUTTON3 40046 -#define WINAMP_BUTTON4 40047 -#define WINAMP_BUTTON5 40048 -#define WINAMP_VOLUMEUP 40058 -#define WINAMP_VOLUMEDOWN 40059 -#define WINAMP_FFWD5S 40060 -#define WINAMP_REW5S 40061 -#define WINAMP_NEXT_WINDOW 40063 -#define WINAMP_OPTIONS_WINDOWSHADE 40064 -#define WINAMP_BUTTON1_SHIFT 40144 -#define WINAMP_BUTTON2_SHIFT 40145 -#define WINAMP_BUTTON3_SHIFT 40146 -#define WINAMP_BUTTON4_SHIFT 40147 -#define WINAMP_BUTTON5_SHIFT 40148 -#define WINAMP_BUTTON1_CTRL 40154 -#define WINAMP_BUTTON2_CTRL 40155 -#define WINAMP_BUTTON3_CTRL 40156 -#define WINAMP_BUTTON4_CTRL 40157 -#define WINAMP_BUTTON5_CTRL 40158 -#define WINAMP_OPTIONS_DSIZE 40165 -#define IDC_SORT_FILENAME 40166 -#define IDC_SORT_FILETITLE 40167 -#define IDC_SORT_ENTIREFILENAME 40168 -#define IDC_SELECTALL 40169 -#define IDC_SELECTNONE 40170 -#define IDC_SELECTINV 40171 -#define IDM_EQ_LOADPRE 40172 -#define IDM_EQ_LOADMP3 40173 -#define IDM_EQ_LOADDEFAULT 40174 -#define IDM_EQ_SAVEPRE 40175 -#define IDM_EQ_SAVEMP3 40176 -#define IDM_EQ_SAVEDEFAULT 40177 -#define IDM_EQ_DELPRE 40178 -#define IDM_EQ_DELMP3 40180 -#define IDC_PLAYLIST_PLAY 40184 -#define WINAMP_FILE_LOC 40185 -#define WINAMP_OPTIONS_EASYMOVE 40186 -#define WINAMP_FILE_DIR 40187 -#define WINAMP_EDIT_ID3 40188 -#define WINAMP_TOGGLE_AUTOSCROLL 40189 -#define WINAMP_VISSETUP 40190 -#define WINAMP_PLGSETUP 40191 -#define WINAMP_VISPLUGIN 40192 -#define WINAMP_JUMP 40193 -#define WINAMP_JUMPFILE 40194 -#define WINAMP_JUMP10FWD 40195 -#define WINAMP_JUMP10BACK 40197 diff --git a/cpp/JavaWinampApi/WinampController.c b/cpp/JavaWinampApi/WinampController.c deleted file mode 100644 index 84b0db8..0000000 --- a/cpp/JavaWinampApi/WinampController.c +++ /dev/null @@ -1,587 +0,0 @@ -/* meu .h */ -#include "WinampController.h" - -/* mingw */ -#include -#include -#include - -/* winamp sdk */ -#include "wa_ipc.h" -#include "WINAMPCMD.H" - -const int WA_CLOSE = 40001 ; -const int WA_PLAY = WINAMP_BUTTON2; -const int WA_STOP = WINAMP_BUTTON4; -const int WA_PAUSE = WINAMP_BUTTON3; -const int WA_PREVTRACK = WINAMP_BUTTON1; -const int WA_NEXTTRACK = WINAMP_BUTTON5; -const int WA_FWD5SECS = WINAMP_FFWD5S; -const int WA_REW5SECS = WINAMP_REW5S; - -const int WA_PLAYLISTLEN = IPC_GETLISTLENGTH; -const int WA_SETVOLUME = IPC_SETVOLUME; -const int WA_SETPLAYLISTPOS = IPC_SETPLAYLISTPOS; -const int WA_WRITEPLAYLIST = IPC_WRITEPLAYLIST; -const int WA_ENQUEUEFILE = IPC_ENQUEUEFILE; - -const int WA_VOLUMEUP = WINAMP_VOLUMEUP; -const int WA_VOLUMEDOWN = WINAMP_VOLUMEDOWN; - -const int WA_CLEARPLAYLIST = IPC_DELETE; -const int WA_NOTHING = 0; -const int WA_TRACK_LENGTH = 1; - -const int WA_RESTART = IPC_RESTARTWINAMP; -const int WA_REFRESHPLCACHE = IPC_REFRESHPLCACHE; -const int WA_GETSHUFFLESTATUS = IPC_GET_SHUFFLE; -const int WA_GETREPEATSTATUS = IPC_GET_REPEAT; -const int WA_SETSHUFFLESTATUS = IPC_SET_SHUFFLE; -const int WA_SETREPEATSTATUS = IPC_SET_REPEAT; - -const int WA_GETSTATUS = IPC_ISPLAYING; - -const int WA_GETLISTPOS = IPC_GETLISTPOS; -const int WA_GETTITLE = IPC_GETPLAYLISTTITLE; - -const int WA_VERSION = IPC_GETVERSION; -const int WA_FILENAMEINLIST = IPC_GETPLAYLISTFILE; -const int WA_GETFILEINFO = IPC_GET_EXTENDED_FILE_INFO; - -HWND hwnd_winamp = NULL; -INT position = 0; -STARTUPINFO si; -PROCESS_INFORMATION pi; -char messageReturn[255]; -wchar_t* wMessageReturn; - -LPDWORD temp; - -void initWinampHandle() { - hwnd_winamp = NULL; - if (hwnd_winamp == NULL) { - hwnd_winamp = FindWindow("Winamp v1.x", NULL); - } - if (hwnd_winamp == NULL) { - hwnd_winamp = FindWindow("Winamp v2.x", NULL); - } - if (hwnd_winamp == NULL) { - hwnd_winamp = FindWindow("Winamp v3.x", NULL); - } -} - -jboolean runWinamp(unsigned char* pathWinamp) { - - /* STARTUPINFO si; - PROCESS_INFORMATION pi;*/ - - ZeroMemory( &si, sizeof(si) ); - si.cb = sizeof(si); - ZeroMemory( &pi, sizeof(pi) ); - - - // Start the child process. - if(!CreateProcess(pathWinamp, - NULL, - 0, - 0, - FALSE, - CREATE_NEW_CONSOLE, - 0, - 0, - &si, - &pi)) - { - return FALSE; - } - - DWORD dwResult = WaitForInputIdle(pi.hProcess,INFINITE); - if (dwResult != 0) return FALSE; - - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - - return TRUE; - - -} - -int getListPos() { - - initWinampHandle(); - if (hwnd_winamp != NULL) { - - return SendMessage(hwnd_winamp,WM_USER,WA_NOTHING,WA_GETLISTPOS); - - } - return -1; - -} - -void getPluginMessage(int param, int sendMessage) -{ - - LPCVOID message = (LPCVOID)SendMessageW(hwnd_winamp, WM_USER, param, sendMessage); - ZeroMemory( &pi, sizeof(pi)); - GetWindowThreadProcessId(hwnd_winamp, &pi.dwThreadId); - pi.hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwThreadId); - ReadProcessMemory(pi.hProcess, message, messageReturn,2056,temp); - free(temp); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_run - (JNIEnv *env, jobject obj) { - - initWinampHandle(); - - if ( hwnd_winamp == NULL ) { - - unsigned char path[MAX_PATH]=""; - DWORD size = MAX_PATH; - - HKEY key; - DWORD tipo; - - if (!RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Clients\\Media\\Winamp\\shell\\open\\command",&key)==ERROR_SUCCESS) - { - - printf("0"); - return FALSE; - - } - - if (!(RegQueryValueEx(key,"",NULL,&tipo,path,&size))==ERROR_SUCCESS) - { - - RegCloseKey(key); - return FALSE; - - } - - if (!runWinamp(path)) - { - - RegCloseKey(key); - return FALSE; - - } - return TRUE; - - } - - int version = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETVERSION); - return TRUE; - -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_exit - (JNIEnv *env, jobject obj) { - - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_CLOSE, WA_NOTHING); - return TRUE; - } - - return FALSE; - - -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_play - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - - SendMessageA(hwnd_winamp, WM_COMMAND, WA_PLAY, WA_NOTHING); - return TRUE; - - } - - return FALSE; -} - - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_stop - (JNIEnv *env, jobject obj) -{ - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_STOP, WA_NOTHING); - return TRUE; - } - - return FALSE; -} - - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_resume - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_PAUSE, WA_NOTHING); - return TRUE; - } - - return FALSE; -} - - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_pause - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_PAUSE, WA_NOTHING); - return TRUE; - } - - return FALSE; -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_previousTrack - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_PREVTRACK, WA_NOTHING); - return TRUE; - } - - return FALSE; - -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_nextTrack - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_NEXTTRACK, WA_NOTHING); - return TRUE; - } - - return FALSE; -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_fwd5Secs - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_FWD5SECS, WA_NOTHING); - return TRUE; - } - - return FALSE; -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_rew5Secs - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_REW5SECS, WA_NOTHING); - return TRUE; - } - - return FALSE; -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_increaseVolume - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_VOLUMEUP, WA_NOTHING); - return TRUE; - } - - return FALSE; - -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_decreaseVolume - (JNIEnv *env, jobject obj) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_COMMAND, WA_VOLUMEDOWN, WA_NOTHING); - return TRUE; - } - - return FALSE; - -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_increaseVolumePercent - (JNIEnv *env, jobject obj, jint percent) { - initWinampHandle(); - int i = 0; - if (hwnd_winamp != NULL) { - for(i=0;i0?1:0; -} - -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_isRepeatStatusOn - (JNIEnv *env, jobject obj) { - jint status = 0; - initWinampHandle(); - if (hwnd_winamp != NULL) { - status = (jint)SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_GETREPEATSTATUS); - } else - return -1; - - return status>0?1:0; -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setRepeatStatusOn - (JNIEnv *env, jobject obj, jboolean status) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_USER, status, WA_SETREPEATSTATUS); - return TRUE; - } - - return FALSE; -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setShuffleStatusOn - (JNIEnv *env, jobject obj, jboolean status) { - initWinampHandle(); - if (hwnd_winamp != NULL) { - SendMessageA(hwnd_winamp, WM_USER, status, WA_SETSHUFFLESTATUS); - return TRUE; - } - - return FALSE; -} - -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_appendToPlayList - (JNIEnv *env, jobject obj, jstring mp3filename) { - initWinampHandle(); - jboolean iscopy; - if (hwnd_winamp != NULL) { - wMessageReturn = (wchar_t*)(*env)->GetStringChars(env, mp3filename, &iscopy); - int length = wcslen(wMessageReturn); - COPYDATASTRUCT cds; - cds.dwData = IPC_PLAYFILEW; - cds.lpData = (void*)wMessageReturn; - cds.cbData = length * 2 + 2 ; // it sums white space - - SendMessageW(hwnd_winamp, WM_COPYDATA, WA_NOTHING, (LPARAM)&cds); - return TRUE; - } - - return FALSE; - -} - -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getStatus - (JNIEnv *env, jobject obj) { - jint status = -1; - initWinampHandle(); - if (hwnd_winamp != NULL) { - status = SendMessageA(hwnd_winamp, WM_USER, WA_NOTHING, WA_GETSTATUS); - } - - return status; - - -} - -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getListPos - (JNIEnv *env, jobject obj) { - - return getListPos(); - -} - -JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getTitle - (JNIEnv *env, jobject obj) { - - initWinampHandle(); - if (hwnd_winamp != NULL) { - - char title[500] = ""; - GetWindowText(hwnd_winamp,title,500); - return (*env)->NewStringUTF(env,title); - - - } - - return NULL; - -} - -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getTime - (JNIEnv *env, jobject obj, jint mode) { - - initWinampHandle(); - if (hwnd_winamp != NULL) { - - return SendMessage(hwnd_winamp,WM_USER,mode,IPC_GETOUTPUTTIME); - - } - - return -2; - -} - -JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getFileNameInList - (JNIEnv *env, jobject obj, jint index) -{ - - initWinampHandle(); - - if (hwnd_winamp != NULL) { - - getPluginMessage(index, WA_FILENAMEINLIST); - char* filePath = messageReturn; - jstring strReturn = (*env)->NewStringUTF(env,filePath); - return strReturn; - - } - - return NULL; - -} - -JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getFileNamePlaying - (JNIEnv *env, jobject obj) -{ - - initWinampHandle(); - - if (hwnd_winamp != NULL) { - - getPluginMessage(WA_NOTHING, IPC_GET_PLAYING_FILENAME); - wchar_t* fileName = (wchar_t*)messageReturn; - int length = wcslen(fileName); - jstring strReturn = (*env)->NewString(env,fileName,length); - return strReturn; - - } - - return NULL; - -} diff --git a/cpp/JavaWinampApi/WinampController.h b/cpp/JavaWinampApi/WinampController.h deleted file mode 100644 index b9ec6be..0000000 --- a/cpp/JavaWinampApi/WinampController.h +++ /dev/null @@ -1,285 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class WinampController */ - - -#ifndef _Included_WinampController -#define _Included_WinampController -#ifdef __cplusplus -extern "C" { -#endif - -void initWinampHandle(); - -jboolean runWinamp(unsigned char* pathWinamp); - -int getListPos(); - -void getPluginMessage(int param, int sendMessage); - -/* - * Class: WinampController - * Method: run - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_run - (JNIEnv *, jclass); -/* - * Class: WinampController - * Method: exit - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_exit - (JNIEnv *, jclass); -/* - * Class: WinampController - * Method: play - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_play - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: stop - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_stop - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: resume - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_resume - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: pause - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_pause - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: previousTrack - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_previousTrack - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: nextTrack - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_nextTrack - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: fwd5Secs - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_fwd5Secs - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: fwd5Secs - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_rew5Secs - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: increaseVolume - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_increaseVolume - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: decreaseVolume - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_decreaseVolume - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: increaseVolumePercent - * Signature: (I)V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_increaseVolumePercent - (JNIEnv *, jclass, jint); - -/* - * Class: WinampController - * Method: decreaseVolumePercent - * Signature: (I)V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_decreaseVolumePercent - (JNIEnv *, jclass, jint); - -/* - * Class: WinampController - * Method: setVolume - * Signature: (I)V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setVolume - (JNIEnv *, jclass, jint); - -/* - * Class: WinampController - * Method: setVolume - * Signature: (I)V - */ -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getVolume - (JNIEnv *, jclass, jint); - -/* - * Class: WinampController - * Method: restart - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_restart - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: setPlaylistPosition - * Signature: (I)V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setPlaylistPosition - (JNIEnv *, jclass, jint); - -/* - * Class: WinampController - * Method: clearPlayList - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_clearPlayList - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: refreshPlayListCache - * Signature: ()V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_refreshPlayListCache - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: getPlayListLength - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getPlayListLength - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: writePlayListToFile - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_writePlayListToFile - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: isShuffleStatusOn - * Signature: ()Z - */ -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_isShuffleStatusOn - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: isRepeatStatusOn - * Signature: ()Z - */ -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_isRepeatStatusOn - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: setRepeatStatusOn - * Signature: (Z)V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setRepeatStatusOn - (JNIEnv *, jclass, jboolean); - -/* - * Class: WinampController - * Method: setShuffleStatusOn - * Signature: (Z)V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_setShuffleStatusOn - (JNIEnv *, jclass, jboolean); - -/* - * Class: WinampController - * Method: appendToPlayList - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT jboolean JNICALL Java_com_qotsa_jni_controller_JNIWinamp_appendToPlayList - (JNIEnv *, jclass, jstring); - -/* - * Class: WinampController - * Method: getStatus - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getStatus - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: getListPos - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getListPos - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: getTitle - * Signature: ()I - */ -JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getTitle - (JNIEnv *, jclass); - -/* - * Class: WinampController - * Method: getTime - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getTime - (JNIEnv *, jclass, jint); - -/* - * Class: WinampController - * Method: getFileNameInList - * Signature: ()I - */ -JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getFileNameInList - (JNIEnv *, jclass, jint); - -/* - * Class: WinampController - * Method: getFileNamePlaying - * Signature: ()I - */ -JNIEXPORT jstring JNICALL Java_com_qotsa_jni_controller_JNIWinamp_getFileNamePlaying - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/JavaWinampApi/dev/copy.bat b/cpp/JavaWinampApi/dev/copy.bat deleted file mode 100644 index 6045ddb..0000000 --- a/cpp/JavaWinampApi/dev/copy.bat +++ /dev/null @@ -1 +0,0 @@ -copy wpcom.dll ..\..\..\java\native\ \ No newline at end of file diff --git a/cpp/JavaWinampApi/dev/copy.mak b/cpp/JavaWinampApi/dev/copy.mak deleted file mode 100644 index 5459618..0000000 --- a/cpp/JavaWinampApi/dev/copy.mak +++ /dev/null @@ -1,2 +0,0 @@ -all-after: - copy.bat \ No newline at end of file diff --git a/cpp/JavaWinampApi/dev/wpcom.dev b/cpp/JavaWinampApi/dev/wpcom.dev deleted file mode 100644 index 8774d56..0000000 --- a/cpp/JavaWinampApi/dev/wpcom.dev +++ /dev/null @@ -1,69 +0,0 @@ -[Project] -FileName=wpcom.dev -Name=wpcom -UnitCount=2 -Type=3 -Ver=1 -ObjFiles= -Includes=..\include;..\include\win32 -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes=copy.mak -Compiler=-DBUILDING_DLL=1_@@_ -CppCompiler=-DBUILDING_DLL=1_@@_ -Linker=--no-export-all-symbols --add-stdcall-alias_@@_ -IsCpp=0 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=wpcom.dll -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000000000000000000000 - -[Unit1] -FileName=..\WinampController.c -CompileCpp=0 -Folder=wpcom -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - -[Unit2] -FileName=..\WinampController.h -CompileCpp=0 -Folder=wpcom -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - diff --git a/cpp/JavaWinampApi/include/classfile_constants.h b/cpp/JavaWinampApi/include/classfile_constants.h deleted file mode 100644 index 30e839e..0000000 --- a/cpp/JavaWinampApi/include/classfile_constants.h +++ /dev/null @@ -1,523 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - * - */ - -#ifndef CLASSFILE_CONSTANTS_H -#define CLASSFILE_CONSTANTS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Flags */ - -enum { - JVM_ACC_PUBLIC = 0x0001, - JVM_ACC_PRIVATE = 0x0002, - JVM_ACC_PROTECTED = 0x0004, - JVM_ACC_STATIC = 0x0008, - JVM_ACC_FINAL = 0x0010, - JVM_ACC_SYNCHRONIZED = 0x0020, - JVM_ACC_SUPER = 0x0020, - JVM_ACC_VOLATILE = 0x0040, - JVM_ACC_BRIDGE = 0x0040, - JVM_ACC_TRANSIENT = 0x0080, - JVM_ACC_VARARGS = 0x0080, - JVM_ACC_NATIVE = 0x0100, - JVM_ACC_INTERFACE = 0x0200, - JVM_ACC_ABSTRACT = 0x0400, - JVM_ACC_STRICT = 0x0800, - JVM_ACC_SYNTHETIC = 0x1000, - JVM_ACC_ANNOTATION = 0x2000, - JVM_ACC_ENUM = 0x4000 -}; - -/* Used in newarray instruction. */ - -enum { - JVM_T_BOOLEAN = 4, - JVM_T_CHAR = 5, - JVM_T_FLOAT = 6, - JVM_T_DOUBLE = 7, - JVM_T_BYTE = 8, - JVM_T_SHORT = 9, - JVM_T_INT = 10, - JVM_T_LONG = 11 -}; - -/* Constant Pool Entries */ - -enum { - JVM_CONSTANT_Utf8 = 1, - JVM_CONSTANT_Unicode = 2, /* unused */ - JVM_CONSTANT_Integer = 3, - JVM_CONSTANT_Float = 4, - JVM_CONSTANT_Long = 5, - JVM_CONSTANT_Double = 6, - JVM_CONSTANT_Class = 7, - JVM_CONSTANT_String = 8, - JVM_CONSTANT_Fieldref = 9, - JVM_CONSTANT_Methodref = 10, - JVM_CONSTANT_InterfaceMethodref = 11, - JVM_CONSTANT_NameAndType = 12 -}; - -/* StackMapTable type item numbers */ - -enum { - JVM_ITEM_Top = 0, - JVM_ITEM_Integer = 1, - JVM_ITEM_Float = 2, - JVM_ITEM_Double = 3, - JVM_ITEM_Long = 4, - JVM_ITEM_Null = 5, - JVM_ITEM_UninitializedThis = 6, - JVM_ITEM_Object = 7, - JVM_ITEM_Uninitialized = 8 -}; - -/* Type signatures */ - -enum { - JVM_SIGNATURE_ARRAY = '[', - JVM_SIGNATURE_BYTE = 'B', - JVM_SIGNATURE_CHAR = 'C', - JVM_SIGNATURE_CLASS = 'L', - JVM_SIGNATURE_ENDCLASS = ';', - JVM_SIGNATURE_ENUM = 'E', - JVM_SIGNATURE_FLOAT = 'F', - JVM_SIGNATURE_DOUBLE = 'D', - JVM_SIGNATURE_FUNC = '(', - JVM_SIGNATURE_ENDFUNC = ')', - JVM_SIGNATURE_INT = 'I', - JVM_SIGNATURE_LONG = 'J', - JVM_SIGNATURE_SHORT = 'S', - JVM_SIGNATURE_VOID = 'V', - JVM_SIGNATURE_BOOLEAN = 'Z' -}; - -/* Opcodes */ - -enum { - JVM_OPC_nop = 0, - JVM_OPC_aconst_null = 1, - JVM_OPC_iconst_m1 = 2, - JVM_OPC_iconst_0 = 3, - JVM_OPC_iconst_1 = 4, - JVM_OPC_iconst_2 = 5, - JVM_OPC_iconst_3 = 6, - JVM_OPC_iconst_4 = 7, - JVM_OPC_iconst_5 = 8, - JVM_OPC_lconst_0 = 9, - JVM_OPC_lconst_1 = 10, - JVM_OPC_fconst_0 = 11, - JVM_OPC_fconst_1 = 12, - JVM_OPC_fconst_2 = 13, - JVM_OPC_dconst_0 = 14, - JVM_OPC_dconst_1 = 15, - JVM_OPC_bipush = 16, - JVM_OPC_sipush = 17, - JVM_OPC_ldc = 18, - JVM_OPC_ldc_w = 19, - JVM_OPC_ldc2_w = 20, - JVM_OPC_iload = 21, - JVM_OPC_lload = 22, - JVM_OPC_fload = 23, - JVM_OPC_dload = 24, - JVM_OPC_aload = 25, - JVM_OPC_iload_0 = 26, - JVM_OPC_iload_1 = 27, - JVM_OPC_iload_2 = 28, - JVM_OPC_iload_3 = 29, - JVM_OPC_lload_0 = 30, - JVM_OPC_lload_1 = 31, - JVM_OPC_lload_2 = 32, - JVM_OPC_lload_3 = 33, - JVM_OPC_fload_0 = 34, - JVM_OPC_fload_1 = 35, - JVM_OPC_fload_2 = 36, - JVM_OPC_fload_3 = 37, - JVM_OPC_dload_0 = 38, - JVM_OPC_dload_1 = 39, - JVM_OPC_dload_2 = 40, - JVM_OPC_dload_3 = 41, - JVM_OPC_aload_0 = 42, - JVM_OPC_aload_1 = 43, - JVM_OPC_aload_2 = 44, - JVM_OPC_aload_3 = 45, - JVM_OPC_iaload = 46, - JVM_OPC_laload = 47, - JVM_OPC_faload = 48, - JVM_OPC_daload = 49, - JVM_OPC_aaload = 50, - JVM_OPC_baload = 51, - JVM_OPC_caload = 52, - JVM_OPC_saload = 53, - JVM_OPC_istore = 54, - JVM_OPC_lstore = 55, - JVM_OPC_fstore = 56, - JVM_OPC_dstore = 57, - JVM_OPC_astore = 58, - JVM_OPC_istore_0 = 59, - JVM_OPC_istore_1 = 60, - JVM_OPC_istore_2 = 61, - JVM_OPC_istore_3 = 62, - JVM_OPC_lstore_0 = 63, - JVM_OPC_lstore_1 = 64, - JVM_OPC_lstore_2 = 65, - JVM_OPC_lstore_3 = 66, - JVM_OPC_fstore_0 = 67, - JVM_OPC_fstore_1 = 68, - JVM_OPC_fstore_2 = 69, - JVM_OPC_fstore_3 = 70, - JVM_OPC_dstore_0 = 71, - JVM_OPC_dstore_1 = 72, - JVM_OPC_dstore_2 = 73, - JVM_OPC_dstore_3 = 74, - JVM_OPC_astore_0 = 75, - JVM_OPC_astore_1 = 76, - JVM_OPC_astore_2 = 77, - JVM_OPC_astore_3 = 78, - JVM_OPC_iastore = 79, - JVM_OPC_lastore = 80, - JVM_OPC_fastore = 81, - JVM_OPC_dastore = 82, - JVM_OPC_aastore = 83, - JVM_OPC_bastore = 84, - JVM_OPC_castore = 85, - JVM_OPC_sastore = 86, - JVM_OPC_pop = 87, - JVM_OPC_pop2 = 88, - JVM_OPC_dup = 89, - JVM_OPC_dup_x1 = 90, - JVM_OPC_dup_x2 = 91, - JVM_OPC_dup2 = 92, - JVM_OPC_dup2_x1 = 93, - JVM_OPC_dup2_x2 = 94, - JVM_OPC_swap = 95, - JVM_OPC_iadd = 96, - JVM_OPC_ladd = 97, - JVM_OPC_fadd = 98, - JVM_OPC_dadd = 99, - JVM_OPC_isub = 100, - JVM_OPC_lsub = 101, - JVM_OPC_fsub = 102, - JVM_OPC_dsub = 103, - JVM_OPC_imul = 104, - JVM_OPC_lmul = 105, - JVM_OPC_fmul = 106, - JVM_OPC_dmul = 107, - JVM_OPC_idiv = 108, - JVM_OPC_ldiv = 109, - JVM_OPC_fdiv = 110, - JVM_OPC_ddiv = 111, - JVM_OPC_irem = 112, - JVM_OPC_lrem = 113, - JVM_OPC_frem = 114, - JVM_OPC_drem = 115, - JVM_OPC_ineg = 116, - JVM_OPC_lneg = 117, - JVM_OPC_fneg = 118, - JVM_OPC_dneg = 119, - JVM_OPC_ishl = 120, - JVM_OPC_lshl = 121, - JVM_OPC_ishr = 122, - JVM_OPC_lshr = 123, - JVM_OPC_iushr = 124, - JVM_OPC_lushr = 125, - JVM_OPC_iand = 126, - JVM_OPC_land = 127, - JVM_OPC_ior = 128, - JVM_OPC_lor = 129, - JVM_OPC_ixor = 130, - JVM_OPC_lxor = 131, - JVM_OPC_iinc = 132, - JVM_OPC_i2l = 133, - JVM_OPC_i2f = 134, - JVM_OPC_i2d = 135, - JVM_OPC_l2i = 136, - JVM_OPC_l2f = 137, - JVM_OPC_l2d = 138, - JVM_OPC_f2i = 139, - JVM_OPC_f2l = 140, - JVM_OPC_f2d = 141, - JVM_OPC_d2i = 142, - JVM_OPC_d2l = 143, - JVM_OPC_d2f = 144, - JVM_OPC_i2b = 145, - JVM_OPC_i2c = 146, - JVM_OPC_i2s = 147, - JVM_OPC_lcmp = 148, - JVM_OPC_fcmpl = 149, - JVM_OPC_fcmpg = 150, - JVM_OPC_dcmpl = 151, - JVM_OPC_dcmpg = 152, - JVM_OPC_ifeq = 153, - JVM_OPC_ifne = 154, - JVM_OPC_iflt = 155, - JVM_OPC_ifge = 156, - JVM_OPC_ifgt = 157, - JVM_OPC_ifle = 158, - JVM_OPC_if_icmpeq = 159, - JVM_OPC_if_icmpne = 160, - JVM_OPC_if_icmplt = 161, - JVM_OPC_if_icmpge = 162, - JVM_OPC_if_icmpgt = 163, - JVM_OPC_if_icmple = 164, - JVM_OPC_if_acmpeq = 165, - JVM_OPC_if_acmpne = 166, - JVM_OPC_goto = 167, - JVM_OPC_jsr = 168, - JVM_OPC_ret = 169, - JVM_OPC_tableswitch = 170, - JVM_OPC_lookupswitch = 171, - JVM_OPC_ireturn = 172, - JVM_OPC_lreturn = 173, - JVM_OPC_freturn = 174, - JVM_OPC_dreturn = 175, - JVM_OPC_areturn = 176, - JVM_OPC_return = 177, - JVM_OPC_getstatic = 178, - JVM_OPC_putstatic = 179, - JVM_OPC_getfield = 180, - JVM_OPC_putfield = 181, - JVM_OPC_invokevirtual = 182, - JVM_OPC_invokespecial = 183, - JVM_OPC_invokestatic = 184, - JVM_OPC_invokeinterface = 185, - JVM_OPC_xxxunusedxxx = 186, - JVM_OPC_new = 187, - JVM_OPC_newarray = 188, - JVM_OPC_anewarray = 189, - JVM_OPC_arraylength = 190, - JVM_OPC_athrow = 191, - JVM_OPC_checkcast = 192, - JVM_OPC_instanceof = 193, - JVM_OPC_monitorenter = 194, - JVM_OPC_monitorexit = 195, - JVM_OPC_wide = 196, - JVM_OPC_multianewarray = 197, - JVM_OPC_ifnull = 198, - JVM_OPC_ifnonnull = 199, - JVM_OPC_goto_w = 200, - JVM_OPC_jsr_w = 201, - JVM_OPC_MAX = 201 -}; - -/* Opcode length initializer, use with something like: - * unsigned char opcode_length[JVM_OPC_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER; - */ -#define JVM_OPCODE_LENGTH_INITIALIZER { \ - 1, /* nop */ \ - 1, /* aconst_null */ \ - 1, /* iconst_m1 */ \ - 1, /* iconst_0 */ \ - 1, /* iconst_1 */ \ - 1, /* iconst_2 */ \ - 1, /* iconst_3 */ \ - 1, /* iconst_4 */ \ - 1, /* iconst_5 */ \ - 1, /* lconst_0 */ \ - 1, /* lconst_1 */ \ - 1, /* fconst_0 */ \ - 1, /* fconst_1 */ \ - 1, /* fconst_2 */ \ - 1, /* dconst_0 */ \ - 1, /* dconst_1 */ \ - 2, /* bipush */ \ - 3, /* sipush */ \ - 2, /* ldc */ \ - 3, /* ldc_w */ \ - 3, /* ldc2_w */ \ - 2, /* iload */ \ - 2, /* lload */ \ - 2, /* fload */ \ - 2, /* dload */ \ - 2, /* aload */ \ - 1, /* iload_0 */ \ - 1, /* iload_1 */ \ - 1, /* iload_2 */ \ - 1, /* iload_3 */ \ - 1, /* lload_0 */ \ - 1, /* lload_1 */ \ - 1, /* lload_2 */ \ - 1, /* lload_3 */ \ - 1, /* fload_0 */ \ - 1, /* fload_1 */ \ - 1, /* fload_2 */ \ - 1, /* fload_3 */ \ - 1, /* dload_0 */ \ - 1, /* dload_1 */ \ - 1, /* dload_2 */ \ - 1, /* dload_3 */ \ - 1, /* aload_0 */ \ - 1, /* aload_1 */ \ - 1, /* aload_2 */ \ - 1, /* aload_3 */ \ - 1, /* iaload */ \ - 1, /* laload */ \ - 1, /* faload */ \ - 1, /* daload */ \ - 1, /* aaload */ \ - 1, /* baload */ \ - 1, /* caload */ \ - 1, /* saload */ \ - 2, /* istore */ \ - 2, /* lstore */ \ - 2, /* fstore */ \ - 2, /* dstore */ \ - 2, /* astore */ \ - 1, /* istore_0 */ \ - 1, /* istore_1 */ \ - 1, /* istore_2 */ \ - 1, /* istore_3 */ \ - 1, /* lstore_0 */ \ - 1, /* lstore_1 */ \ - 1, /* lstore_2 */ \ - 1, /* lstore_3 */ \ - 1, /* fstore_0 */ \ - 1, /* fstore_1 */ \ - 1, /* fstore_2 */ \ - 1, /* fstore_3 */ \ - 1, /* dstore_0 */ \ - 1, /* dstore_1 */ \ - 1, /* dstore_2 */ \ - 1, /* dstore_3 */ \ - 1, /* astore_0 */ \ - 1, /* astore_1 */ \ - 1, /* astore_2 */ \ - 1, /* astore_3 */ \ - 1, /* iastore */ \ - 1, /* lastore */ \ - 1, /* fastore */ \ - 1, /* dastore */ \ - 1, /* aastore */ \ - 1, /* bastore */ \ - 1, /* castore */ \ - 1, /* sastore */ \ - 1, /* pop */ \ - 1, /* pop2 */ \ - 1, /* dup */ \ - 1, /* dup_x1 */ \ - 1, /* dup_x2 */ \ - 1, /* dup2 */ \ - 1, /* dup2_x1 */ \ - 1, /* dup2_x2 */ \ - 1, /* swap */ \ - 1, /* iadd */ \ - 1, /* ladd */ \ - 1, /* fadd */ \ - 1, /* dadd */ \ - 1, /* isub */ \ - 1, /* lsub */ \ - 1, /* fsub */ \ - 1, /* dsub */ \ - 1, /* imul */ \ - 1, /* lmul */ \ - 1, /* fmul */ \ - 1, /* dmul */ \ - 1, /* idiv */ \ - 1, /* ldiv */ \ - 1, /* fdiv */ \ - 1, /* ddiv */ \ - 1, /* irem */ \ - 1, /* lrem */ \ - 1, /* frem */ \ - 1, /* drem */ \ - 1, /* ineg */ \ - 1, /* lneg */ \ - 1, /* fneg */ \ - 1, /* dneg */ \ - 1, /* ishl */ \ - 1, /* lshl */ \ - 1, /* ishr */ \ - 1, /* lshr */ \ - 1, /* iushr */ \ - 1, /* lushr */ \ - 1, /* iand */ \ - 1, /* land */ \ - 1, /* ior */ \ - 1, /* lor */ \ - 1, /* ixor */ \ - 1, /* lxor */ \ - 3, /* iinc */ \ - 1, /* i2l */ \ - 1, /* i2f */ \ - 1, /* i2d */ \ - 1, /* l2i */ \ - 1, /* l2f */ \ - 1, /* l2d */ \ - 1, /* f2i */ \ - 1, /* f2l */ \ - 1, /* f2d */ \ - 1, /* d2i */ \ - 1, /* d2l */ \ - 1, /* d2f */ \ - 1, /* i2b */ \ - 1, /* i2c */ \ - 1, /* i2s */ \ - 1, /* lcmp */ \ - 1, /* fcmpl */ \ - 1, /* fcmpg */ \ - 1, /* dcmpl */ \ - 1, /* dcmpg */ \ - 3, /* ifeq */ \ - 3, /* ifne */ \ - 3, /* iflt */ \ - 3, /* ifge */ \ - 3, /* ifgt */ \ - 3, /* ifle */ \ - 3, /* if_icmpeq */ \ - 3, /* if_icmpne */ \ - 3, /* if_icmplt */ \ - 3, /* if_icmpge */ \ - 3, /* if_icmpgt */ \ - 3, /* if_icmple */ \ - 3, /* if_acmpeq */ \ - 3, /* if_acmpne */ \ - 3, /* goto */ \ - 3, /* jsr */ \ - 2, /* ret */ \ - 99, /* tableswitch */ \ - 99, /* lookupswitch */ \ - 1, /* ireturn */ \ - 1, /* lreturn */ \ - 1, /* freturn */ \ - 1, /* dreturn */ \ - 1, /* areturn */ \ - 1, /* return */ \ - 3, /* getstatic */ \ - 3, /* putstatic */ \ - 3, /* getfield */ \ - 3, /* putfield */ \ - 3, /* invokevirtual */ \ - 3, /* invokespecial */ \ - 3, /* invokestatic */ \ - 5, /* invokeinterface */ \ - 0, /* xxxunusedxxx */ \ - 3, /* new */ \ - 2, /* newarray */ \ - 3, /* anewarray */ \ - 1, /* arraylength */ \ - 1, /* athrow */ \ - 3, /* checkcast */ \ - 3, /* instanceof */ \ - 1, /* monitorenter */ \ - 1, /* monitorexit */ \ - 0, /* wide */ \ - 4, /* multianewarray */ \ - 3, /* ifnull */ \ - 3, /* ifnonnull */ \ - 5, /* goto_w */ \ - 5 /* jsr_w */ \ -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* CLASSFILE_CONSTANTS */ diff --git a/cpp/JavaWinampApi/include/jawt.h b/cpp/JavaWinampApi/include/jawt.h deleted file mode 100644 index 87e0b18..0000000 --- a/cpp/JavaWinampApi/include/jawt.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -#ifndef _JAVASOFT_JAWT_H_ -#define _JAVASOFT_JAWT_H_ - -#include "jni.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * AWT native interface (new in JDK 1.3) - * - * The AWT native interface allows a native C or C++ application a means - * by which to access native structures in AWT. This is to facilitate moving - * legacy C and C++ applications to Java and to target the needs of the - * community who, at present, wish to do their own native rendering to canvases - * for performance reasons. Standard extensions such as Java3D also require a - * means to access the underlying native data structures of AWT. - * - * There may be future extensions to this API depending on demand. - * - * A VM does not have to implement this API in order to pass the JCK. - * It is recommended, however, that this API is implemented on VMs that support - * standard extensions, such as Java3D. - * - * Since this is a native API, any program which uses it cannot be considered - * 100% pure java. - */ - -/* - * AWT Native Drawing Surface (JAWT_DrawingSurface). - * - * For each platform, there is a native drawing surface structure. This - * platform-specific structure can be found in jawt_md.h. It is recommended - * that additional platforms follow the same model. It is also recommended - * that VMs on Win32 and Solaris support the existing structures in jawt_md.h. - * - ******************* - * EXAMPLE OF USAGE: - ******************* - * - * In Win32, a programmer wishes to access the HWND of a canvas to perform - * native rendering into it. The programmer has declared the paint() method - * for their canvas subclass to be native: - * - * - * MyCanvas.java: - * - * import java.awt.*; - * - * public class MyCanvas extends Canvas { - * - * static { - * System.loadLibrary("mylib"); - * } - * - * public native void paint(Graphics g); - * } - * - * - * myfile.c: - * - * #include "jawt_md.h" - * #include - * - * JNIEXPORT void JNICALL - * Java_MyCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics) - * { - * JAWT awt; - * JAWT_DrawingSurface* ds; - * JAWT_DrawingSurfaceInfo* dsi; - * JAWT_Win32DrawingSurfaceInfo* dsi_win; - * jboolean result; - * jint lock; - * - * // Get the AWT - * awt.version = JAWT_VERSION_1_3; - * result = JAWT_GetAWT(env, &awt); - * assert(result != JNI_FALSE); - * - * // Get the drawing surface - * ds = awt.GetDrawingSurface(env, canvas); - * assert(ds != NULL); - * - * // Lock the drawing surface - * lock = ds->Lock(ds); - * assert((lock & JAWT_LOCK_ERROR) == 0); - * - * // Get the drawing surface info - * dsi = ds->GetDrawingSurfaceInfo(ds); - * - * // Get the platform-specific drawing info - * dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo; - * - * ////////////////////////////// - * // !!! DO PAINTING HERE !!! // - * ////////////////////////////// - * - * // Free the drawing surface info - * ds->FreeDrawingSurfaceInfo(dsi); - * - * // Unlock the drawing surface - * ds->Unlock(ds); - * - * // Free the drawing surface - * awt.FreeDrawingSurface(ds); - * } - * - */ - -/* - * JAWT_Rectangle - * Structure for a native rectangle. - */ -typedef struct jawt_Rectangle { - jint x; - jint y; - jint width; - jint height; -} JAWT_Rectangle; - -struct jawt_DrawingSurface; - -/* - * JAWT_DrawingSurfaceInfo - * Structure for containing the underlying drawing information of a component. - */ -typedef struct jawt_DrawingSurfaceInfo { - /* - * Pointer to the platform-specific information. This can be safely - * cast to a JAWT_Win32DrawingSurfaceInfo on Windows or a - * JAWT_X11DrawingSurfaceInfo on Solaris. See jawt_md.h for details. - */ - void* platformInfo; - /* Cached pointer to the underlying drawing surface */ - struct jawt_DrawingSurface* ds; - /* Bounding rectangle of the drawing surface */ - JAWT_Rectangle bounds; - /* Number of rectangles in the clip */ - jint clipSize; - /* Clip rectangle array */ - JAWT_Rectangle* clip; -} JAWT_DrawingSurfaceInfo; - -#define JAWT_LOCK_ERROR 0x00000001 -#define JAWT_LOCK_CLIP_CHANGED 0x00000002 -#define JAWT_LOCK_BOUNDS_CHANGED 0x00000004 -#define JAWT_LOCK_SURFACE_CHANGED 0x00000008 - -/* - * JAWT_DrawingSurface - * Structure for containing the underlying drawing information of a component. - * All operations on a JAWT_DrawingSurface MUST be performed from the same - * thread as the call to GetDrawingSurface. - */ -typedef struct jawt_DrawingSurface { - /* - * Cached reference to the Java environment of the calling thread. - * If Lock(), Unlock(), GetDrawingSurfaceInfo() or - * FreeDrawingSurfaceInfo() are called from a different thread, - * this data member should be set before calling those functions. - */ - JNIEnv* env; - /* Cached reference to the target object */ - jobject target; - /* - * Lock the surface of the target component for native rendering. - * When finished drawing, the surface must be unlocked with - * Unlock(). This function returns a bitmask with one or more of the - * following values: - * - * JAWT_LOCK_ERROR - When an error has occurred and the surface could not - * be locked. - * - * JAWT_LOCK_CLIP_CHANGED - When the clip region has changed. - * - * JAWT_LOCK_BOUNDS_CHANGED - When the bounds of the surface have changed. - * - * JAWT_LOCK_SURFACE_CHANGED - When the surface itself has changed - */ - jint (JNICALL *Lock) - (struct jawt_DrawingSurface* ds); - /* - * Get the drawing surface info. - * The value returned may be cached, but the values may change if - * additional calls to Lock() or Unlock() are made. - * Lock() must be called before this can return a valid value. - * Returns NULL if an error has occurred. - * When finished with the returned value, FreeDrawingSurfaceInfo must be - * called. - */ - JAWT_DrawingSurfaceInfo* (JNICALL *GetDrawingSurfaceInfo) - (struct jawt_DrawingSurface* ds); - /* - * Free the drawing surface info. - */ - void (JNICALL *FreeDrawingSurfaceInfo) - (JAWT_DrawingSurfaceInfo* dsi); - /* - * Unlock the drawing surface of the target component for native rendering. - */ - void (JNICALL *Unlock) - (struct jawt_DrawingSurface* ds); -} JAWT_DrawingSurface; - -/* - * JAWT - * Structure for containing native AWT functions. - */ -typedef struct jawt { - /* - * Version of this structure. This must always be set before - * calling JAWT_GetAWT() - */ - jint version; - /* - * Return a drawing surface from a target jobject. This value - * may be cached. - * Returns NULL if an error has occurred. - * Target must be a java.awt.Component (should be a Canvas - * or Window for native rendering). - * FreeDrawingSurface() must be called when finished with the - * returned JAWT_DrawingSurface. - */ - JAWT_DrawingSurface* (JNICALL *GetDrawingSurface) - (JNIEnv* env, jobject target); - /* - * Free the drawing surface allocated in GetDrawingSurface. - */ - void (JNICALL *FreeDrawingSurface) - (JAWT_DrawingSurface* ds); - /* - * Since 1.4 - * Locks the entire AWT for synchronization purposes - */ - void (JNICALL *Lock)(JNIEnv* env); - /* - * Since 1.4 - * Unlocks the entire AWT for synchronization purposes - */ - void (JNICALL *Unlock)(JNIEnv* env); - /* - * Since 1.4 - * Returns a reference to a java.awt.Component from a native - * platform handle. On Windows, this corresponds to an HWND; - * on Solaris and Linux, this is a Drawable. For other platforms, - * see the appropriate machine-dependent header file for a description. - * The reference returned by this function is a local - * reference that is only valid in this environment. - * This function returns a NULL reference if no component could be - * found with matching platform information. - */ - jobject (JNICALL *GetComponent)(JNIEnv* env, void* platformInfo); - -} JAWT; - -/* - * Get the AWT native structure. This function returns JNI_FALSE if - * an error occurs. - */ -_JNI_IMPORT_OR_EXPORT_ -jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt); - -#define JAWT_VERSION_1_3 0x00010003 -#define JAWT_VERSION_1_4 0x00010004 - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* !_JAVASOFT_JAWT_H_ */ diff --git a/cpp/JavaWinampApi/include/jdwpTransport.h b/cpp/JavaWinampApi/include/jdwpTransport.h deleted file mode 100644 index eae435a..0000000 --- a/cpp/JavaWinampApi/include/jdwpTransport.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -/* - * Java Debug Wire Protocol Transport Service Provider Interface. - */ - -#ifndef JDWPTRANSPORT_H -#define JDWPTRANSPORT_H - -#include "jni.h" - -enum { - JDWPTRANSPORT_VERSION_1_0 = 0x00010000 -}; - -#ifdef __cplusplus -extern "C" { -#endif - -struct jdwpTransportNativeInterface_; - -struct _jdwpTransportEnv; - -#ifdef __cplusplus -typedef _jdwpTransportEnv jdwpTransportEnv; -#else -typedef const struct jdwpTransportNativeInterface_ *jdwpTransportEnv; -#endif /* __cplusplus */ - -/* - * Errors. Universal errors with JVMTI/JVMDI equivalents keep the - * values the same. - */ -typedef enum { - JDWPTRANSPORT_ERROR_NONE = 0, - JDWPTRANSPORT_ERROR_ILLEGAL_ARGUMENT = 103, - JDWPTRANSPORT_ERROR_OUT_OF_MEMORY = 110, - JDWPTRANSPORT_ERROR_INTERNAL = 113, - JDWPTRANSPORT_ERROR_ILLEGAL_STATE = 201, - JDWPTRANSPORT_ERROR_IO_ERROR = 202, - JDWPTRANSPORT_ERROR_TIMEOUT = 203, - JDWPTRANSPORT_ERROR_MSG_NOT_AVAILABLE = 204 -} jdwpTransportError; - - -/* - * Structure to define capabilities - */ -typedef struct { - unsigned int can_timeout_attach :1; - unsigned int can_timeout_accept :1; - unsigned int can_timeout_handshake :1; - unsigned int reserved3 :1; - unsigned int reserved4 :1; - unsigned int reserved5 :1; - unsigned int reserved6 :1; - unsigned int reserved7 :1; - unsigned int reserved8 :1; - unsigned int reserved9 :1; - unsigned int reserved10 :1; - unsigned int reserved11 :1; - unsigned int reserved12 :1; - unsigned int reserved13 :1; - unsigned int reserved14 :1; - unsigned int reserved15 :1; -} JDWPTransportCapabilities; - - -/* - * Structures to define packet layout. - * - * See: http://java.sun.com/j2se/1.5/docs/guide/jpda/jdwp-spec.html - */ - -enum { - JDWPTRANSPORT_FLAGS_NONE = 0x0, - JDWPTRANSPORT_FLAGS_REPLY = 0x80 -}; - -typedef struct { - jint len; - jint id; - jbyte flags; - jbyte cmdSet; - jbyte cmd; - jbyte *data; -} jdwpCmdPacket; - -typedef struct { - jint len; - jint id; - jbyte flags; - jshort errorCode; - jbyte *data; -} jdwpReplyPacket; - -typedef struct { - union { - jdwpCmdPacket cmd; - jdwpReplyPacket reply; - } type; -} jdwpPacket; - -/* - * JDWP functions called by the transport. - */ -typedef struct jdwpTransportCallback { - void *(*alloc)(jint numBytes); /* Call this for all allocations */ - void (*free)(void *buffer); /* Call this for all deallocations */ -} jdwpTransportCallback; - -typedef jint (JNICALL *jdwpTransport_OnLoad_t)(JavaVM *jvm, - jdwpTransportCallback *callback, - jint version, - jdwpTransportEnv** env); - - - -/* Function Interface */ - -struct jdwpTransportNativeInterface_ { - /* 1 : RESERVED */ - void *reserved1; - - /* 2 : Get Capabilities */ - jdwpTransportError (JNICALL *GetCapabilities)(jdwpTransportEnv* env, - JDWPTransportCapabilities *capabilities_ptr); - - /* 3 : Attach */ - jdwpTransportError (JNICALL *Attach)(jdwpTransportEnv* env, - const char* address, - jlong attach_timeout, - jlong handshake_timeout); - - /* 4: StartListening */ - jdwpTransportError (JNICALL *StartListening)(jdwpTransportEnv* env, - const char* address, - char** actual_address); - - /* 5: StopListening */ - jdwpTransportError (JNICALL *StopListening)(jdwpTransportEnv* env); - - /* 6: Accept */ - jdwpTransportError (JNICALL *Accept)(jdwpTransportEnv* env, - jlong accept_timeout, - jlong handshake_timeout); - - /* 7: IsOpen */ - jboolean (JNICALL *IsOpen)(jdwpTransportEnv* env); - - /* 8: Close */ - jdwpTransportError (JNICALL *Close)(jdwpTransportEnv* env); - - /* 9: ReadPacket */ - jdwpTransportError (JNICALL *ReadPacket)(jdwpTransportEnv* env, - jdwpPacket *pkt); - - /* 10: Write Packet */ - jdwpTransportError (JNICALL *WritePacket)(jdwpTransportEnv* env, - const jdwpPacket* pkt); - - /* 11: GetLastError */ - jdwpTransportError (JNICALL *GetLastError)(jdwpTransportEnv* env, - char** error); - -}; - - -/* - * Use inlined functions so that C++ code can use syntax such as - * env->Attach("mymachine:5000", 10*1000, 0); - * - * rather than using C's :- - * - * (*env)->Attach(env, "mymachine:5000", 10*1000, 0); - */ -struct _jdwpTransportEnv { - const struct jdwpTransportNativeInterface_ *functions; -#ifdef __cplusplus - - jdwpTransportError GetCapabilities(JDWPTransportCapabilities *capabilities_ptr) { - return functions->GetCapabilities(this, capabilities_ptr); - } - - jdwpTransportError Attach(const char* address, jlong attach_timeout, - jlong handshake_timeout) { - return functions->Attach(this, address, attach_timeout, handshake_timeout); - } - - jdwpTransportError StartListening(const char* address, - char** actual_address) { - return functions->StartListening(this, address, actual_address); - } - - jdwpTransportError StopListening(void) { - return functions->StopListening(this); - } - - jdwpTransportError Accept(jlong accept_timeout, jlong handshake_timeout) { - return functions->Accept(this, accept_timeout, handshake_timeout); - } - - jboolean IsOpen(void) { - return functions->IsOpen(this); - } - - jdwpTransportError Close(void) { - return functions->Close(this); - } - - jdwpTransportError ReadPacket(jdwpPacket *pkt) { - return functions->ReadPacket(this, pkt); - } - - jdwpTransportError WritePacket(const jdwpPacket* pkt) { - return functions->WritePacket(this, pkt); - } - - jdwpTransportError GetLastError(char** error) { - return functions->GetLastError(this, error); - } - - -#endif /* __cplusplus */ -}; - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* JDWPTRANSPORT_H */ - diff --git a/cpp/JavaWinampApi/include/jni.h b/cpp/JavaWinampApi/include/jni.h deleted file mode 100644 index 8ed7366..0000000 --- a/cpp/JavaWinampApi/include/jni.h +++ /dev/null @@ -1,1944 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -/* - * We used part of Netscape's Java Runtime Interface (JRI) as the starting - * point of our design and implementation. - */ - -/****************************************************************************** - * Java Runtime Interface - * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved. - *****************************************************************************/ - -#ifndef _JAVASOFT_JNI_H_ -#define _JAVASOFT_JNI_H_ - -#include -#include - -/* jni_md.h contains the machine-dependent typedefs for jbyte, jint - and jlong */ - -#include "jni_md.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * JNI Types - */ - -#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H - -typedef unsigned char jboolean; -typedef unsigned short jchar; -typedef short jshort; -typedef float jfloat; -typedef double jdouble; - -typedef jint jsize; - -#ifdef __cplusplus - -class _jobject {}; -class _jclass : public _jobject {}; -class _jthrowable : public _jobject {}; -class _jstring : public _jobject {}; -class _jarray : public _jobject {}; -class _jbooleanArray : public _jarray {}; -class _jbyteArray : public _jarray {}; -class _jcharArray : public _jarray {}; -class _jshortArray : public _jarray {}; -class _jintArray : public _jarray {}; -class _jlongArray : public _jarray {}; -class _jfloatArray : public _jarray {}; -class _jdoubleArray : public _jarray {}; -class _jobjectArray : public _jarray {}; - -typedef _jobject *jobject; -typedef _jclass *jclass; -typedef _jthrowable *jthrowable; -typedef _jstring *jstring; -typedef _jarray *jarray; -typedef _jbooleanArray *jbooleanArray; -typedef _jbyteArray *jbyteArray; -typedef _jcharArray *jcharArray; -typedef _jshortArray *jshortArray; -typedef _jintArray *jintArray; -typedef _jlongArray *jlongArray; -typedef _jfloatArray *jfloatArray; -typedef _jdoubleArray *jdoubleArray; -typedef _jobjectArray *jobjectArray; - -#else - -struct _jobject; - -typedef struct _jobject *jobject; -typedef jobject jclass; -typedef jobject jthrowable; -typedef jobject jstring; -typedef jobject jarray; -typedef jarray jbooleanArray; -typedef jarray jbyteArray; -typedef jarray jcharArray; -typedef jarray jshortArray; -typedef jarray jintArray; -typedef jarray jlongArray; -typedef jarray jfloatArray; -typedef jarray jdoubleArray; -typedef jarray jobjectArray; - -#endif - -typedef jobject jweak; - -typedef union jvalue { - jboolean z; - jbyte b; - jchar c; - jshort s; - jint i; - jlong j; - jfloat f; - jdouble d; - jobject l; -} jvalue; - -struct _jfieldID; -typedef struct _jfieldID *jfieldID; - -struct _jmethodID; -typedef struct _jmethodID *jmethodID; - -/* Return values from jobjectRefType */ -typedef enum _jobjectType { - JNIInvalidRefType = 0, - JNILocalRefType = 1, - JNIGlobalRefType = 2, - JNIWeakGlobalRefType = 3 -} jobjectRefType; - - -#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */ - -/* - * jboolean constants - */ - -#define JNI_FALSE 0 -#define JNI_TRUE 1 - -/* - * possible return values for JNI functions. - */ - -#define JNI_OK 0 /* success */ -#define JNI_ERR (-1) /* unknown error */ -#define JNI_EDETACHED (-2) /* thread detached from the VM */ -#define JNI_EVERSION (-3) /* JNI version error */ -#define JNI_ENOMEM (-4) /* not enough memory */ -#define JNI_EEXIST (-5) /* VM already created */ -#define JNI_EINVAL (-6) /* invalid arguments */ - -/* - * used in ReleaseScalarArrayElements - */ - -#define JNI_COMMIT 1 -#define JNI_ABORT 2 - -/* - * used in RegisterNatives to describe native method name, signature, - * and function pointer. - */ - -typedef struct { - char *name; - char *signature; - void *fnPtr; -} JNINativeMethod; - -/* - * JNI Native Method Interface. - */ - -struct JNINativeInterface_; - -struct JNIEnv_; - -#ifdef __cplusplus -typedef JNIEnv_ JNIEnv; -#else -typedef const struct JNINativeInterface_ *JNIEnv; -#endif - -/* - * JNI Invocation Interface. - */ - -struct JNIInvokeInterface_; - -struct JavaVM_; - -#ifdef __cplusplus -typedef JavaVM_ JavaVM; -#else -typedef const struct JNIInvokeInterface_ *JavaVM; -#endif - -struct JNINativeInterface_ { - void *reserved0; - void *reserved1; - void *reserved2; - - void *reserved3; - jint (JNICALL *GetVersion)(JNIEnv *env); - - jclass (JNICALL *DefineClass) - (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, - jsize len); - jclass (JNICALL *FindClass) - (JNIEnv *env, const char *name); - - jmethodID (JNICALL *FromReflectedMethod) - (JNIEnv *env, jobject method); - jfieldID (JNICALL *FromReflectedField) - (JNIEnv *env, jobject field); - - jobject (JNICALL *ToReflectedMethod) - (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic); - - jclass (JNICALL *GetSuperclass) - (JNIEnv *env, jclass sub); - jboolean (JNICALL *IsAssignableFrom) - (JNIEnv *env, jclass sub, jclass sup); - - jobject (JNICALL *ToReflectedField) - (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic); - - jint (JNICALL *Throw) - (JNIEnv *env, jthrowable obj); - jint (JNICALL *ThrowNew) - (JNIEnv *env, jclass clazz, const char *msg); - jthrowable (JNICALL *ExceptionOccurred) - (JNIEnv *env); - void (JNICALL *ExceptionDescribe) - (JNIEnv *env); - void (JNICALL *ExceptionClear) - (JNIEnv *env); - void (JNICALL *FatalError) - (JNIEnv *env, const char *msg); - - jint (JNICALL *PushLocalFrame) - (JNIEnv *env, jint capacity); - jobject (JNICALL *PopLocalFrame) - (JNIEnv *env, jobject result); - - jobject (JNICALL *NewGlobalRef) - (JNIEnv *env, jobject lobj); - void (JNICALL *DeleteGlobalRef) - (JNIEnv *env, jobject gref); - void (JNICALL *DeleteLocalRef) - (JNIEnv *env, jobject obj); - jboolean (JNICALL *IsSameObject) - (JNIEnv *env, jobject obj1, jobject obj2); - jobject (JNICALL *NewLocalRef) - (JNIEnv *env, jobject ref); - jint (JNICALL *EnsureLocalCapacity) - (JNIEnv *env, jint capacity); - - jobject (JNICALL *AllocObject) - (JNIEnv *env, jclass clazz); - jobject (JNICALL *NewObject) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *NewObjectV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jobject (JNICALL *NewObjectA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jclass (JNICALL *GetObjectClass) - (JNIEnv *env, jobject obj); - jboolean (JNICALL *IsInstanceOf) - (JNIEnv *env, jobject obj, jclass clazz); - - jmethodID (JNICALL *GetMethodID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *CallObjectMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jobject (JNICALL *CallObjectMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jobject (JNICALL *CallObjectMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jboolean (JNICALL *CallBooleanMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jboolean (JNICALL *CallBooleanMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jboolean (JNICALL *CallBooleanMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jbyte (JNICALL *CallByteMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jbyte (JNICALL *CallByteMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jbyte (JNICALL *CallByteMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jchar (JNICALL *CallCharMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jchar (JNICALL *CallCharMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jchar (JNICALL *CallCharMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jshort (JNICALL *CallShortMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jshort (JNICALL *CallShortMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jshort (JNICALL *CallShortMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jint (JNICALL *CallIntMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jint (JNICALL *CallIntMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jint (JNICALL *CallIntMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jlong (JNICALL *CallLongMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jlong (JNICALL *CallLongMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jlong (JNICALL *CallLongMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jfloat (JNICALL *CallFloatMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jfloat (JNICALL *CallFloatMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jfloat (JNICALL *CallFloatMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jdouble (JNICALL *CallDoubleMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jdouble (JNICALL *CallDoubleMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jdouble (JNICALL *CallDoubleMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - void (JNICALL *CallVoidMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - void (JNICALL *CallVoidMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - void (JNICALL *CallVoidMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jobject (JNICALL *CallNonvirtualObjectMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *CallNonvirtualObjectMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jobject (JNICALL *CallNonvirtualObjectMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jboolean (JNICALL *CallNonvirtualBooleanMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jboolean (JNICALL *CallNonvirtualBooleanMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jboolean (JNICALL *CallNonvirtualBooleanMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jbyte (JNICALL *CallNonvirtualByteMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jbyte (JNICALL *CallNonvirtualByteMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jbyte (JNICALL *CallNonvirtualByteMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jchar (JNICALL *CallNonvirtualCharMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jchar (JNICALL *CallNonvirtualCharMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jchar (JNICALL *CallNonvirtualCharMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jshort (JNICALL *CallNonvirtualShortMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jshort (JNICALL *CallNonvirtualShortMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jshort (JNICALL *CallNonvirtualShortMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jint (JNICALL *CallNonvirtualIntMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jint (JNICALL *CallNonvirtualIntMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jint (JNICALL *CallNonvirtualIntMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jlong (JNICALL *CallNonvirtualLongMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jlong (JNICALL *CallNonvirtualLongMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jlong (JNICALL *CallNonvirtualLongMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jfloat (JNICALL *CallNonvirtualFloatMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jfloat (JNICALL *CallNonvirtualFloatMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jfloat (JNICALL *CallNonvirtualFloatMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jdouble (JNICALL *CallNonvirtualDoubleMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jdouble (JNICALL *CallNonvirtualDoubleMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jdouble (JNICALL *CallNonvirtualDoubleMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - void (JNICALL *CallNonvirtualVoidMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - void (JNICALL *CallNonvirtualVoidMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - void (JNICALL *CallNonvirtualVoidMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jfieldID (JNICALL *GetFieldID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *GetObjectField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jboolean (JNICALL *GetBooleanField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jbyte (JNICALL *GetByteField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jchar (JNICALL *GetCharField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jshort (JNICALL *GetShortField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jint (JNICALL *GetIntField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jlong (JNICALL *GetLongField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jfloat (JNICALL *GetFloatField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jdouble (JNICALL *GetDoubleField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - - void (JNICALL *SetObjectField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val); - void (JNICALL *SetBooleanField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val); - void (JNICALL *SetByteField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val); - void (JNICALL *SetCharField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val); - void (JNICALL *SetShortField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val); - void (JNICALL *SetIntField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jint val); - void (JNICALL *SetLongField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val); - void (JNICALL *SetFloatField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val); - void (JNICALL *SetDoubleField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val); - - jmethodID (JNICALL *GetStaticMethodID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *CallStaticObjectMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *CallStaticObjectMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jobject (JNICALL *CallStaticObjectMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jboolean (JNICALL *CallStaticBooleanMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jboolean (JNICALL *CallStaticBooleanMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jboolean (JNICALL *CallStaticBooleanMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jbyte (JNICALL *CallStaticByteMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jbyte (JNICALL *CallStaticByteMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jbyte (JNICALL *CallStaticByteMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jchar (JNICALL *CallStaticCharMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jchar (JNICALL *CallStaticCharMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jchar (JNICALL *CallStaticCharMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jshort (JNICALL *CallStaticShortMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jshort (JNICALL *CallStaticShortMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jshort (JNICALL *CallStaticShortMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jint (JNICALL *CallStaticIntMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jint (JNICALL *CallStaticIntMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jint (JNICALL *CallStaticIntMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jlong (JNICALL *CallStaticLongMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jlong (JNICALL *CallStaticLongMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jlong (JNICALL *CallStaticLongMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jfloat (JNICALL *CallStaticFloatMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jfloat (JNICALL *CallStaticFloatMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jfloat (JNICALL *CallStaticFloatMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jdouble (JNICALL *CallStaticDoubleMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jdouble (JNICALL *CallStaticDoubleMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jdouble (JNICALL *CallStaticDoubleMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - void (JNICALL *CallStaticVoidMethod) - (JNIEnv *env, jclass cls, jmethodID methodID, ...); - void (JNICALL *CallStaticVoidMethodV) - (JNIEnv *env, jclass cls, jmethodID methodID, va_list args); - void (JNICALL *CallStaticVoidMethodA) - (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args); - - jfieldID (JNICALL *GetStaticFieldID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - jobject (JNICALL *GetStaticObjectField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jboolean (JNICALL *GetStaticBooleanField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jbyte (JNICALL *GetStaticByteField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jchar (JNICALL *GetStaticCharField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jshort (JNICALL *GetStaticShortField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jint (JNICALL *GetStaticIntField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jlong (JNICALL *GetStaticLongField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jfloat (JNICALL *GetStaticFloatField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jdouble (JNICALL *GetStaticDoubleField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - - void (JNICALL *SetStaticObjectField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value); - void (JNICALL *SetStaticBooleanField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value); - void (JNICALL *SetStaticByteField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value); - void (JNICALL *SetStaticCharField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value); - void (JNICALL *SetStaticShortField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value); - void (JNICALL *SetStaticIntField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value); - void (JNICALL *SetStaticLongField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value); - void (JNICALL *SetStaticFloatField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value); - void (JNICALL *SetStaticDoubleField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value); - - jstring (JNICALL *NewString) - (JNIEnv *env, const jchar *unicode, jsize len); - jsize (JNICALL *GetStringLength) - (JNIEnv *env, jstring str); - const jchar *(JNICALL *GetStringChars) - (JNIEnv *env, jstring str, jboolean *isCopy); - void (JNICALL *ReleaseStringChars) - (JNIEnv *env, jstring str, const jchar *chars); - - jstring (JNICALL *NewStringUTF) - (JNIEnv *env, const char *utf); - jsize (JNICALL *GetStringUTFLength) - (JNIEnv *env, jstring str); - const char* (JNICALL *GetStringUTFChars) - (JNIEnv *env, jstring str, jboolean *isCopy); - void (JNICALL *ReleaseStringUTFChars) - (JNIEnv *env, jstring str, const char* chars); - - - jsize (JNICALL *GetArrayLength) - (JNIEnv *env, jarray array); - - jobjectArray (JNICALL *NewObjectArray) - (JNIEnv *env, jsize len, jclass clazz, jobject init); - jobject (JNICALL *GetObjectArrayElement) - (JNIEnv *env, jobjectArray array, jsize index); - void (JNICALL *SetObjectArrayElement) - (JNIEnv *env, jobjectArray array, jsize index, jobject val); - - jbooleanArray (JNICALL *NewBooleanArray) - (JNIEnv *env, jsize len); - jbyteArray (JNICALL *NewByteArray) - (JNIEnv *env, jsize len); - jcharArray (JNICALL *NewCharArray) - (JNIEnv *env, jsize len); - jshortArray (JNICALL *NewShortArray) - (JNIEnv *env, jsize len); - jintArray (JNICALL *NewIntArray) - (JNIEnv *env, jsize len); - jlongArray (JNICALL *NewLongArray) - (JNIEnv *env, jsize len); - jfloatArray (JNICALL *NewFloatArray) - (JNIEnv *env, jsize len); - jdoubleArray (JNICALL *NewDoubleArray) - (JNIEnv *env, jsize len); - - jboolean * (JNICALL *GetBooleanArrayElements) - (JNIEnv *env, jbooleanArray array, jboolean *isCopy); - jbyte * (JNICALL *GetByteArrayElements) - (JNIEnv *env, jbyteArray array, jboolean *isCopy); - jchar * (JNICALL *GetCharArrayElements) - (JNIEnv *env, jcharArray array, jboolean *isCopy); - jshort * (JNICALL *GetShortArrayElements) - (JNIEnv *env, jshortArray array, jboolean *isCopy); - jint * (JNICALL *GetIntArrayElements) - (JNIEnv *env, jintArray array, jboolean *isCopy); - jlong * (JNICALL *GetLongArrayElements) - (JNIEnv *env, jlongArray array, jboolean *isCopy); - jfloat * (JNICALL *GetFloatArrayElements) - (JNIEnv *env, jfloatArray array, jboolean *isCopy); - jdouble * (JNICALL *GetDoubleArrayElements) - (JNIEnv *env, jdoubleArray array, jboolean *isCopy); - - void (JNICALL *ReleaseBooleanArrayElements) - (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode); - void (JNICALL *ReleaseByteArrayElements) - (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode); - void (JNICALL *ReleaseCharArrayElements) - (JNIEnv *env, jcharArray array, jchar *elems, jint mode); - void (JNICALL *ReleaseShortArrayElements) - (JNIEnv *env, jshortArray array, jshort *elems, jint mode); - void (JNICALL *ReleaseIntArrayElements) - (JNIEnv *env, jintArray array, jint *elems, jint mode); - void (JNICALL *ReleaseLongArrayElements) - (JNIEnv *env, jlongArray array, jlong *elems, jint mode); - void (JNICALL *ReleaseFloatArrayElements) - (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode); - void (JNICALL *ReleaseDoubleArrayElements) - (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode); - - void (JNICALL *GetBooleanArrayRegion) - (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf); - void (JNICALL *GetByteArrayRegion) - (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf); - void (JNICALL *GetCharArrayRegion) - (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf); - void (JNICALL *GetShortArrayRegion) - (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf); - void (JNICALL *GetIntArrayRegion) - (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf); - void (JNICALL *GetLongArrayRegion) - (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf); - void (JNICALL *GetFloatArrayRegion) - (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf); - void (JNICALL *GetDoubleArrayRegion) - (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf); - - void (JNICALL *SetBooleanArrayRegion) - (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf); - void (JNICALL *SetByteArrayRegion) - (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf); - void (JNICALL *SetCharArrayRegion) - (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf); - void (JNICALL *SetShortArrayRegion) - (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf); - void (JNICALL *SetIntArrayRegion) - (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf); - void (JNICALL *SetLongArrayRegion) - (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf); - void (JNICALL *SetFloatArrayRegion) - (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf); - void (JNICALL *SetDoubleArrayRegion) - (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf); - - jint (JNICALL *RegisterNatives) - (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, - jint nMethods); - jint (JNICALL *UnregisterNatives) - (JNIEnv *env, jclass clazz); - - jint (JNICALL *MonitorEnter) - (JNIEnv *env, jobject obj); - jint (JNICALL *MonitorExit) - (JNIEnv *env, jobject obj); - - jint (JNICALL *GetJavaVM) - (JNIEnv *env, JavaVM **vm); - - void (JNICALL *GetStringRegion) - (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf); - void (JNICALL *GetStringUTFRegion) - (JNIEnv *env, jstring str, jsize start, jsize len, char *buf); - - void * (JNICALL *GetPrimitiveArrayCritical) - (JNIEnv *env, jarray array, jboolean *isCopy); - void (JNICALL *ReleasePrimitiveArrayCritical) - (JNIEnv *env, jarray array, void *carray, jint mode); - - const jchar * (JNICALL *GetStringCritical) - (JNIEnv *env, jstring string, jboolean *isCopy); - void (JNICALL *ReleaseStringCritical) - (JNIEnv *env, jstring string, const jchar *cstring); - - jweak (JNICALL *NewWeakGlobalRef) - (JNIEnv *env, jobject obj); - void (JNICALL *DeleteWeakGlobalRef) - (JNIEnv *env, jweak ref); - - jboolean (JNICALL *ExceptionCheck) - (JNIEnv *env); - - jobject (JNICALL *NewDirectByteBuffer) - (JNIEnv* env, void* address, jlong capacity); - void* (JNICALL *GetDirectBufferAddress) - (JNIEnv* env, jobject buf); - jlong (JNICALL *GetDirectBufferCapacity) - (JNIEnv* env, jobject buf); - - /* New JNI 1.6 Features */ - - jobjectRefType (JNICALL *GetObjectRefType) - (JNIEnv* env, jobject obj); -}; - -/* - * We use inlined functions for C++ so that programmers can write: - * - * env->FindClass("java/lang/String") - * - * in C++ rather than: - * - * (*env)->FindClass(env, "java/lang/String") - * - * in C. - */ - -struct JNIEnv_ { - const struct JNINativeInterface_ *functions; -#ifdef __cplusplus - - jint GetVersion() { - return functions->GetVersion(this); - } - jclass DefineClass(const char *name, jobject loader, const jbyte *buf, - jsize len) { - return functions->DefineClass(this, name, loader, buf, len); - } - jclass FindClass(const char *name) { - return functions->FindClass(this, name); - } - jmethodID FromReflectedMethod(jobject method) { - return functions->FromReflectedMethod(this,method); - } - jfieldID FromReflectedField(jobject field) { - return functions->FromReflectedField(this,field); - } - - jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) { - return functions->ToReflectedMethod(this, cls, methodID, isStatic); - } - - jclass GetSuperclass(jclass sub) { - return functions->GetSuperclass(this, sub); - } - jboolean IsAssignableFrom(jclass sub, jclass sup) { - return functions->IsAssignableFrom(this, sub, sup); - } - - jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) { - return functions->ToReflectedField(this,cls,fieldID,isStatic); - } - - jint Throw(jthrowable obj) { - return functions->Throw(this, obj); - } - jint ThrowNew(jclass clazz, const char *msg) { - return functions->ThrowNew(this, clazz, msg); - } - jthrowable ExceptionOccurred() { - return functions->ExceptionOccurred(this); - } - void ExceptionDescribe() { - functions->ExceptionDescribe(this); - } - void ExceptionClear() { - functions->ExceptionClear(this); - } - void FatalError(const char *msg) { - functions->FatalError(this, msg); - } - - jint PushLocalFrame(jint capacity) { - return functions->PushLocalFrame(this,capacity); - } - jobject PopLocalFrame(jobject result) { - return functions->PopLocalFrame(this,result); - } - - jobject NewGlobalRef(jobject lobj) { - return functions->NewGlobalRef(this,lobj); - } - void DeleteGlobalRef(jobject gref) { - functions->DeleteGlobalRef(this,gref); - } - void DeleteLocalRef(jobject obj) { - functions->DeleteLocalRef(this, obj); - } - - jboolean IsSameObject(jobject obj1, jobject obj2) { - return functions->IsSameObject(this,obj1,obj2); - } - - jobject NewLocalRef(jobject ref) { - return functions->NewLocalRef(this,ref); - } - jint EnsureLocalCapacity(jint capacity) { - return functions->EnsureLocalCapacity(this,capacity); - } - - jobject AllocObject(jclass clazz) { - return functions->AllocObject(this,clazz); - } - jobject NewObject(jclass clazz, jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args, methodID); - result = functions->NewObjectV(this,clazz,methodID,args); - va_end(args); - return result; - } - jobject NewObjectV(jclass clazz, jmethodID methodID, - va_list args) { - return functions->NewObjectV(this,clazz,methodID,args); - } - jobject NewObjectA(jclass clazz, jmethodID methodID, - const jvalue *args) { - return functions->NewObjectA(this,clazz,methodID,args); - } - - jclass GetObjectClass(jobject obj) { - return functions->GetObjectClass(this,obj); - } - jboolean IsInstanceOf(jobject obj, jclass clazz) { - return functions->IsInstanceOf(this,obj,clazz); - } - - jmethodID GetMethodID(jclass clazz, const char *name, - const char *sig) { - return functions->GetMethodID(this,clazz,name,sig); - } - - jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallObjectMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jobject CallObjectMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallObjectMethodV(this,obj,methodID,args); - } - jobject CallObjectMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallObjectMethodA(this,obj,methodID,args); - } - - jboolean CallBooleanMethod(jobject obj, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallBooleanMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jboolean CallBooleanMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallBooleanMethodV(this,obj,methodID,args); - } - jboolean CallBooleanMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallBooleanMethodA(this,obj,methodID, args); - } - - jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallByteMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jbyte CallByteMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallByteMethodV(this,obj,methodID,args); - } - jbyte CallByteMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallByteMethodA(this,obj,methodID,args); - } - - jchar CallCharMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallCharMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jchar CallCharMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallCharMethodV(this,obj,methodID,args); - } - jchar CallCharMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallCharMethodA(this,obj,methodID,args); - } - - jshort CallShortMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallShortMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jshort CallShortMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallShortMethodV(this,obj,methodID,args); - } - jshort CallShortMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallShortMethodA(this,obj,methodID,args); - } - - jint CallIntMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallIntMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jint CallIntMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallIntMethodV(this,obj,methodID,args); - } - jint CallIntMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallIntMethodA(this,obj,methodID,args); - } - - jlong CallLongMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallLongMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jlong CallLongMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallLongMethodV(this,obj,methodID,args); - } - jlong CallLongMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallLongMethodA(this,obj,methodID,args); - } - - jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallFloatMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jfloat CallFloatMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallFloatMethodV(this,obj,methodID,args); - } - jfloat CallFloatMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallFloatMethodA(this,obj,methodID,args); - } - - jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallDoubleMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jdouble CallDoubleMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallDoubleMethodV(this,obj,methodID,args); - } - jdouble CallDoubleMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallDoubleMethodA(this,obj,methodID,args); - } - - void CallVoidMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallVoidMethodV(this,obj,methodID,args); - va_end(args); - } - void CallVoidMethodV(jobject obj, jmethodID methodID, - va_list args) { - functions->CallVoidMethodV(this,obj,methodID,args); - } - void CallVoidMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - functions->CallVoidMethodA(this,obj,methodID,args); - } - - jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallNonvirtualObjectMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualObjectMethodV(this,obj,clazz, - methodID,args); - } - jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualObjectMethodA(this,obj,clazz, - methodID,args); - } - - jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualBooleanMethodV(this,obj,clazz, - methodID,args); - } - jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualBooleanMethodA(this,obj,clazz, - methodID, args); - } - - jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallNonvirtualByteMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualByteMethodV(this,obj,clazz, - methodID,args); - } - jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualByteMethodA(this,obj,clazz, - methodID,args); - } - - jchar CallNonvirtualCharMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallNonvirtualCharMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualCharMethodV(this,obj,clazz, - methodID,args); - } - jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualCharMethodA(this,obj,clazz, - methodID,args); - } - - jshort CallNonvirtualShortMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallNonvirtualShortMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualShortMethodV(this,obj,clazz, - methodID,args); - } - jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualShortMethodA(this,obj,clazz, - methodID,args); - } - - jint CallNonvirtualIntMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallNonvirtualIntMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jint CallNonvirtualIntMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualIntMethodV(this,obj,clazz, - methodID,args); - } - jint CallNonvirtualIntMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualIntMethodA(this,obj,clazz, - methodID,args); - } - - jlong CallNonvirtualLongMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallNonvirtualLongMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualLongMethodV(this,obj,clazz, - methodID,args); - } - jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualLongMethodA(this,obj,clazz, - methodID,args); - } - - jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallNonvirtualFloatMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - return functions->CallNonvirtualFloatMethodV(this,obj,clazz, - methodID,args); - } - jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - return functions->CallNonvirtualFloatMethodA(this,obj,clazz, - methodID,args); - } - - jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - return functions->CallNonvirtualDoubleMethodV(this,obj,clazz, - methodID,args); - } - jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - return functions->CallNonvirtualDoubleMethodA(this,obj,clazz, - methodID,args); - } - - void CallNonvirtualVoidMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); - va_end(args); - } - void CallNonvirtualVoidMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); - } - void CallNonvirtualVoidMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args); - } - - jfieldID GetFieldID(jclass clazz, const char *name, - const char *sig) { - return functions->GetFieldID(this,clazz,name,sig); - } - - jobject GetObjectField(jobject obj, jfieldID fieldID) { - return functions->GetObjectField(this,obj,fieldID); - } - jboolean GetBooleanField(jobject obj, jfieldID fieldID) { - return functions->GetBooleanField(this,obj,fieldID); - } - jbyte GetByteField(jobject obj, jfieldID fieldID) { - return functions->GetByteField(this,obj,fieldID); - } - jchar GetCharField(jobject obj, jfieldID fieldID) { - return functions->GetCharField(this,obj,fieldID); - } - jshort GetShortField(jobject obj, jfieldID fieldID) { - return functions->GetShortField(this,obj,fieldID); - } - jint GetIntField(jobject obj, jfieldID fieldID) { - return functions->GetIntField(this,obj,fieldID); - } - jlong GetLongField(jobject obj, jfieldID fieldID) { - return functions->GetLongField(this,obj,fieldID); - } - jfloat GetFloatField(jobject obj, jfieldID fieldID) { - return functions->GetFloatField(this,obj,fieldID); - } - jdouble GetDoubleField(jobject obj, jfieldID fieldID) { - return functions->GetDoubleField(this,obj,fieldID); - } - - void SetObjectField(jobject obj, jfieldID fieldID, jobject val) { - functions->SetObjectField(this,obj,fieldID,val); - } - void SetBooleanField(jobject obj, jfieldID fieldID, - jboolean val) { - functions->SetBooleanField(this,obj,fieldID,val); - } - void SetByteField(jobject obj, jfieldID fieldID, - jbyte val) { - functions->SetByteField(this,obj,fieldID,val); - } - void SetCharField(jobject obj, jfieldID fieldID, - jchar val) { - functions->SetCharField(this,obj,fieldID,val); - } - void SetShortField(jobject obj, jfieldID fieldID, - jshort val) { - functions->SetShortField(this,obj,fieldID,val); - } - void SetIntField(jobject obj, jfieldID fieldID, - jint val) { - functions->SetIntField(this,obj,fieldID,val); - } - void SetLongField(jobject obj, jfieldID fieldID, - jlong val) { - functions->SetLongField(this,obj,fieldID,val); - } - void SetFloatField(jobject obj, jfieldID fieldID, - jfloat val) { - functions->SetFloatField(this,obj,fieldID,val); - } - void SetDoubleField(jobject obj, jfieldID fieldID, - jdouble val) { - functions->SetDoubleField(this,obj,fieldID,val); - } - - jmethodID GetStaticMethodID(jclass clazz, const char *name, - const char *sig) { - return functions->GetStaticMethodID(this,clazz,name,sig); - } - - jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, - ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallStaticObjectMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID, - va_list args) { - return functions->CallStaticObjectMethodV(this,clazz,methodID,args); - } - jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID, - const jvalue *args) { - return functions->CallStaticObjectMethodA(this,clazz,methodID,args); - } - - jboolean CallStaticBooleanMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jboolean CallStaticBooleanMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticBooleanMethodV(this,clazz,methodID,args); - } - jboolean CallStaticBooleanMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticBooleanMethodA(this,clazz,methodID,args); - } - - jbyte CallStaticByteMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallStaticByteMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jbyte CallStaticByteMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticByteMethodV(this,clazz,methodID,args); - } - jbyte CallStaticByteMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticByteMethodA(this,clazz,methodID,args); - } - - jchar CallStaticCharMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallStaticCharMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jchar CallStaticCharMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticCharMethodV(this,clazz,methodID,args); - } - jchar CallStaticCharMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticCharMethodA(this,clazz,methodID,args); - } - - jshort CallStaticShortMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallStaticShortMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jshort CallStaticShortMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticShortMethodV(this,clazz,methodID,args); - } - jshort CallStaticShortMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticShortMethodA(this,clazz,methodID,args); - } - - jint CallStaticIntMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallStaticIntMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jint CallStaticIntMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticIntMethodV(this,clazz,methodID,args); - } - jint CallStaticIntMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticIntMethodA(this,clazz,methodID,args); - } - - jlong CallStaticLongMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallStaticLongMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jlong CallStaticLongMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticLongMethodV(this,clazz,methodID,args); - } - jlong CallStaticLongMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticLongMethodA(this,clazz,methodID,args); - } - - jfloat CallStaticFloatMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallStaticFloatMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jfloat CallStaticFloatMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticFloatMethodV(this,clazz,methodID,args); - } - jfloat CallStaticFloatMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticFloatMethodA(this,clazz,methodID,args); - } - - jdouble CallStaticDoubleMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jdouble CallStaticDoubleMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticDoubleMethodV(this,clazz,methodID,args); - } - jdouble CallStaticDoubleMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticDoubleMethodA(this,clazz,methodID,args); - } - - void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallStaticVoidMethodV(this,cls,methodID,args); - va_end(args); - } - void CallStaticVoidMethodV(jclass cls, jmethodID methodID, - va_list args) { - functions->CallStaticVoidMethodV(this,cls,methodID,args); - } - void CallStaticVoidMethodA(jclass cls, jmethodID methodID, - const jvalue * args) { - functions->CallStaticVoidMethodA(this,cls,methodID,args); - } - - jfieldID GetStaticFieldID(jclass clazz, const char *name, - const char *sig) { - return functions->GetStaticFieldID(this,clazz,name,sig); - } - jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticObjectField(this,clazz,fieldID); - } - jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticBooleanField(this,clazz,fieldID); - } - jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticByteField(this,clazz,fieldID); - } - jchar GetStaticCharField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticCharField(this,clazz,fieldID); - } - jshort GetStaticShortField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticShortField(this,clazz,fieldID); - } - jint GetStaticIntField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticIntField(this,clazz,fieldID); - } - jlong GetStaticLongField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticLongField(this,clazz,fieldID); - } - jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticFloatField(this,clazz,fieldID); - } - jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticDoubleField(this,clazz,fieldID); - } - - void SetStaticObjectField(jclass clazz, jfieldID fieldID, - jobject value) { - functions->SetStaticObjectField(this,clazz,fieldID,value); - } - void SetStaticBooleanField(jclass clazz, jfieldID fieldID, - jboolean value) { - functions->SetStaticBooleanField(this,clazz,fieldID,value); - } - void SetStaticByteField(jclass clazz, jfieldID fieldID, - jbyte value) { - functions->SetStaticByteField(this,clazz,fieldID,value); - } - void SetStaticCharField(jclass clazz, jfieldID fieldID, - jchar value) { - functions->SetStaticCharField(this,clazz,fieldID,value); - } - void SetStaticShortField(jclass clazz, jfieldID fieldID, - jshort value) { - functions->SetStaticShortField(this,clazz,fieldID,value); - } - void SetStaticIntField(jclass clazz, jfieldID fieldID, - jint value) { - functions->SetStaticIntField(this,clazz,fieldID,value); - } - void SetStaticLongField(jclass clazz, jfieldID fieldID, - jlong value) { - functions->SetStaticLongField(this,clazz,fieldID,value); - } - void SetStaticFloatField(jclass clazz, jfieldID fieldID, - jfloat value) { - functions->SetStaticFloatField(this,clazz,fieldID,value); - } - void SetStaticDoubleField(jclass clazz, jfieldID fieldID, - jdouble value) { - functions->SetStaticDoubleField(this,clazz,fieldID,value); - } - - jstring NewString(const jchar *unicode, jsize len) { - return functions->NewString(this,unicode,len); - } - jsize GetStringLength(jstring str) { - return functions->GetStringLength(this,str); - } - const jchar *GetStringChars(jstring str, jboolean *isCopy) { - return functions->GetStringChars(this,str,isCopy); - } - void ReleaseStringChars(jstring str, const jchar *chars) { - functions->ReleaseStringChars(this,str,chars); - } - - jstring NewStringUTF(const char *utf) { - return functions->NewStringUTF(this,utf); - } - jsize GetStringUTFLength(jstring str) { - return functions->GetStringUTFLength(this,str); - } - const char* GetStringUTFChars(jstring str, jboolean *isCopy) { - return functions->GetStringUTFChars(this,str,isCopy); - } - void ReleaseStringUTFChars(jstring str, const char* chars) { - functions->ReleaseStringUTFChars(this,str,chars); - } - - jsize GetArrayLength(jarray array) { - return functions->GetArrayLength(this,array); - } - - jobjectArray NewObjectArray(jsize len, jclass clazz, - jobject init) { - return functions->NewObjectArray(this,len,clazz,init); - } - jobject GetObjectArrayElement(jobjectArray array, jsize index) { - return functions->GetObjectArrayElement(this,array,index); - } - void SetObjectArrayElement(jobjectArray array, jsize index, - jobject val) { - functions->SetObjectArrayElement(this,array,index,val); - } - - jbooleanArray NewBooleanArray(jsize len) { - return functions->NewBooleanArray(this,len); - } - jbyteArray NewByteArray(jsize len) { - return functions->NewByteArray(this,len); - } - jcharArray NewCharArray(jsize len) { - return functions->NewCharArray(this,len); - } - jshortArray NewShortArray(jsize len) { - return functions->NewShortArray(this,len); - } - jintArray NewIntArray(jsize len) { - return functions->NewIntArray(this,len); - } - jlongArray NewLongArray(jsize len) { - return functions->NewLongArray(this,len); - } - jfloatArray NewFloatArray(jsize len) { - return functions->NewFloatArray(this,len); - } - jdoubleArray NewDoubleArray(jsize len) { - return functions->NewDoubleArray(this,len); - } - - jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) { - return functions->GetBooleanArrayElements(this,array,isCopy); - } - jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) { - return functions->GetByteArrayElements(this,array,isCopy); - } - jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) { - return functions->GetCharArrayElements(this,array,isCopy); - } - jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) { - return functions->GetShortArrayElements(this,array,isCopy); - } - jint * GetIntArrayElements(jintArray array, jboolean *isCopy) { - return functions->GetIntArrayElements(this,array,isCopy); - } - jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) { - return functions->GetLongArrayElements(this,array,isCopy); - } - jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) { - return functions->GetFloatArrayElements(this,array,isCopy); - } - jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) { - return functions->GetDoubleArrayElements(this,array,isCopy); - } - - void ReleaseBooleanArrayElements(jbooleanArray array, - jboolean *elems, - jint mode) { - functions->ReleaseBooleanArrayElements(this,array,elems,mode); - } - void ReleaseByteArrayElements(jbyteArray array, - jbyte *elems, - jint mode) { - functions->ReleaseByteArrayElements(this,array,elems,mode); - } - void ReleaseCharArrayElements(jcharArray array, - jchar *elems, - jint mode) { - functions->ReleaseCharArrayElements(this,array,elems,mode); - } - void ReleaseShortArrayElements(jshortArray array, - jshort *elems, - jint mode) { - functions->ReleaseShortArrayElements(this,array,elems,mode); - } - void ReleaseIntArrayElements(jintArray array, - jint *elems, - jint mode) { - functions->ReleaseIntArrayElements(this,array,elems,mode); - } - void ReleaseLongArrayElements(jlongArray array, - jlong *elems, - jint mode) { - functions->ReleaseLongArrayElements(this,array,elems,mode); - } - void ReleaseFloatArrayElements(jfloatArray array, - jfloat *elems, - jint mode) { - functions->ReleaseFloatArrayElements(this,array,elems,mode); - } - void ReleaseDoubleArrayElements(jdoubleArray array, - jdouble *elems, - jint mode) { - functions->ReleaseDoubleArrayElements(this,array,elems,mode); - } - - void GetBooleanArrayRegion(jbooleanArray array, - jsize start, jsize len, jboolean *buf) { - functions->GetBooleanArrayRegion(this,array,start,len,buf); - } - void GetByteArrayRegion(jbyteArray array, - jsize start, jsize len, jbyte *buf) { - functions->GetByteArrayRegion(this,array,start,len,buf); - } - void GetCharArrayRegion(jcharArray array, - jsize start, jsize len, jchar *buf) { - functions->GetCharArrayRegion(this,array,start,len,buf); - } - void GetShortArrayRegion(jshortArray array, - jsize start, jsize len, jshort *buf) { - functions->GetShortArrayRegion(this,array,start,len,buf); - } - void GetIntArrayRegion(jintArray array, - jsize start, jsize len, jint *buf) { - functions->GetIntArrayRegion(this,array,start,len,buf); - } - void GetLongArrayRegion(jlongArray array, - jsize start, jsize len, jlong *buf) { - functions->GetLongArrayRegion(this,array,start,len,buf); - } - void GetFloatArrayRegion(jfloatArray array, - jsize start, jsize len, jfloat *buf) { - functions->GetFloatArrayRegion(this,array,start,len,buf); - } - void GetDoubleArrayRegion(jdoubleArray array, - jsize start, jsize len, jdouble *buf) { - functions->GetDoubleArrayRegion(this,array,start,len,buf); - } - - void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, - const jboolean *buf) { - functions->SetBooleanArrayRegion(this,array,start,len,buf); - } - void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, - const jbyte *buf) { - functions->SetByteArrayRegion(this,array,start,len,buf); - } - void SetCharArrayRegion(jcharArray array, jsize start, jsize len, - const jchar *buf) { - functions->SetCharArrayRegion(this,array,start,len,buf); - } - void SetShortArrayRegion(jshortArray array, jsize start, jsize len, - const jshort *buf) { - functions->SetShortArrayRegion(this,array,start,len,buf); - } - void SetIntArrayRegion(jintArray array, jsize start, jsize len, - const jint *buf) { - functions->SetIntArrayRegion(this,array,start,len,buf); - } - void SetLongArrayRegion(jlongArray array, jsize start, jsize len, - const jlong *buf) { - functions->SetLongArrayRegion(this,array,start,len,buf); - } - void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, - const jfloat *buf) { - functions->SetFloatArrayRegion(this,array,start,len,buf); - } - void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, - const jdouble *buf) { - functions->SetDoubleArrayRegion(this,array,start,len,buf); - } - - jint RegisterNatives(jclass clazz, const JNINativeMethod *methods, - jint nMethods) { - return functions->RegisterNatives(this,clazz,methods,nMethods); - } - jint UnregisterNatives(jclass clazz) { - return functions->UnregisterNatives(this,clazz); - } - - jint MonitorEnter(jobject obj) { - return functions->MonitorEnter(this,obj); - } - jint MonitorExit(jobject obj) { - return functions->MonitorExit(this,obj); - } - - jint GetJavaVM(JavaVM **vm) { - return functions->GetJavaVM(this,vm); - } - - void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) { - functions->GetStringRegion(this,str,start,len,buf); - } - void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) { - functions->GetStringUTFRegion(this,str,start,len,buf); - } - - void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) { - return functions->GetPrimitiveArrayCritical(this,array,isCopy); - } - void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) { - functions->ReleasePrimitiveArrayCritical(this,array,carray,mode); - } - - const jchar * GetStringCritical(jstring string, jboolean *isCopy) { - return functions->GetStringCritical(this,string,isCopy); - } - void ReleaseStringCritical(jstring string, const jchar *cstring) { - functions->ReleaseStringCritical(this,string,cstring); - } - - jweak NewWeakGlobalRef(jobject obj) { - return functions->NewWeakGlobalRef(this,obj); - } - void DeleteWeakGlobalRef(jweak ref) { - functions->DeleteWeakGlobalRef(this,ref); - } - - jboolean ExceptionCheck() { - return functions->ExceptionCheck(this); - } - - jobject NewDirectByteBuffer(void* address, jlong capacity) { - return functions->NewDirectByteBuffer(this, address, capacity); - } - void* GetDirectBufferAddress(jobject buf) { - return functions->GetDirectBufferAddress(this, buf); - } - jlong GetDirectBufferCapacity(jobject buf) { - return functions->GetDirectBufferCapacity(this, buf); - } - jobjectRefType GetObjectRefType(jobject obj) { - return functions->GetObjectRefType(this, obj); - } - -#endif /* __cplusplus */ -}; - -typedef struct JavaVMOption { - char *optionString; - void *extraInfo; -} JavaVMOption; - -typedef struct JavaVMInitArgs { - jint version; - - jint nOptions; - JavaVMOption *options; - jboolean ignoreUnrecognized; -} JavaVMInitArgs; - -typedef struct JavaVMAttachArgs { - jint version; - - char *name; - jobject group; -} JavaVMAttachArgs; - -/* These will be VM-specific. */ - -#define JDK1_2 -#define JDK1_4 - -/* End VM-specific. */ - -struct JNIInvokeInterface_ { - void *reserved0; - void *reserved1; - void *reserved2; - - jint (JNICALL *DestroyJavaVM)(JavaVM *vm); - - jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args); - - jint (JNICALL *DetachCurrentThread)(JavaVM *vm); - - jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version); - - jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args); -}; - -struct JavaVM_ { - const struct JNIInvokeInterface_ *functions; -#ifdef __cplusplus - - jint DestroyJavaVM() { - return functions->DestroyJavaVM(this); - } - jint AttachCurrentThread(void **penv, void *args) { - return functions->AttachCurrentThread(this, penv, args); - } - jint DetachCurrentThread() { - return functions->DetachCurrentThread(this); - } - - jint GetEnv(void **penv, jint version) { - return functions->GetEnv(this, penv, version); - } - jint AttachCurrentThreadAsDaemon(void **penv, void *args) { - return functions->AttachCurrentThreadAsDaemon(this, penv, args); - } -#endif -}; - -#ifdef _JNI_IMPLEMENTATION_ -#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT -#else -#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT -#endif -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_GetDefaultJavaVMInitArgs(void *args); - -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args); - -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *); - -/* Defined by native libraries. */ -JNIEXPORT jint JNICALL -JNI_OnLoad(JavaVM *vm, void *reserved); - -JNIEXPORT void JNICALL -JNI_OnUnload(JavaVM *vm, void *reserved); - -#define JNI_VERSION_1_1 0x00010001 -#define JNI_VERSION_1_2 0x00010002 -#define JNI_VERSION_1_4 0x00010004 -#define JNI_VERSION_1_6 0x00010006 - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !_JAVASOFT_JNI_H_ */ - - - diff --git a/cpp/JavaWinampApi/include/jvmti.h b/cpp/JavaWinampApi/include/jvmti.h deleted file mode 100644 index 865f21e..0000000 --- a/cpp/JavaWinampApi/include/jvmti.h +++ /dev/null @@ -1,2504 +0,0 @@ -#ifdef USE_PRAGMA_IDENT_HDR -#pragma ident "@(#)jvmtiLib.xsl 1.38 06/08/02 23:22:31 JVM" -#endif -/* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - - /* AUTOMATICALLY GENERATED FILE - DO NOT EDIT */ - - - /* Include file for the Java(tm) Virtual Machine Tool Interface */ - -#ifndef _JAVA_JVMTI_H_ -#define _JAVA_JVMTI_H_ - -#include "jni.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - JVMTI_VERSION_1 = 0x30010000, - JVMTI_VERSION_1_0 = 0x30010000, - JVMTI_VERSION_1_1 = 0x30010100, - - JVMTI_VERSION = 0x30000000 + (1 * 0x10000) + (1 * 0x100) + 102 /* version: 1.1.102 */ -}; - -JNIEXPORT jint JNICALL -Agent_OnLoad(JavaVM *vm, char *options, void *reserved); - -JNIEXPORT jint JNICALL -Agent_OnAttach(JavaVM* vm, char* options, void* reserved); - -JNIEXPORT void JNICALL -Agent_OnUnload(JavaVM *vm); - - /* Forward declaration of the environment */ - -struct _jvmtiEnv; - -struct jvmtiInterface_1_; - -#ifdef __cplusplus -typedef _jvmtiEnv jvmtiEnv; -#else -typedef const struct jvmtiInterface_1_ *jvmtiEnv; -#endif /* __cplusplus */ - -/* Derived Base Types */ - -typedef jobject jthread; -typedef jobject jthreadGroup; -typedef jlong jlocation; -struct _jrawMonitorID; -typedef struct _jrawMonitorID *jrawMonitorID; -typedef struct JNINativeInterface_ jniNativeInterface; - - /* Constants */ - - - /* Thread State Flags */ - -enum { - JVMTI_THREAD_STATE_ALIVE = 0x0001, - JVMTI_THREAD_STATE_TERMINATED = 0x0002, - JVMTI_THREAD_STATE_RUNNABLE = 0x0004, - JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400, - JVMTI_THREAD_STATE_WAITING = 0x0080, - JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010, - JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020, - JVMTI_THREAD_STATE_SLEEPING = 0x0040, - JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100, - JVMTI_THREAD_STATE_PARKED = 0x0200, - JVMTI_THREAD_STATE_SUSPENDED = 0x100000, - JVMTI_THREAD_STATE_INTERRUPTED = 0x200000, - JVMTI_THREAD_STATE_IN_NATIVE = 0x400000, - JVMTI_THREAD_STATE_VENDOR_1 = 0x10000000, - JVMTI_THREAD_STATE_VENDOR_2 = 0x20000000, - JVMTI_THREAD_STATE_VENDOR_3 = 0x40000000 -}; - - /* java.lang.Thread.State Conversion Masks */ - -enum { - JVMTI_JAVA_LANG_THREAD_STATE_MASK = JVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT, - JVMTI_JAVA_LANG_THREAD_STATE_NEW = 0, - JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED = JVMTI_THREAD_STATE_TERMINATED, - JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE, - JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER, - JVMTI_JAVA_LANG_THREAD_STATE_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY, - JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT -}; - - /* Thread Priority Constants */ - -enum { - JVMTI_THREAD_MIN_PRIORITY = 1, - JVMTI_THREAD_NORM_PRIORITY = 5, - JVMTI_THREAD_MAX_PRIORITY = 10 -}; - - /* Heap Filter Flags */ - -enum { - JVMTI_HEAP_FILTER_TAGGED = 0x4, - JVMTI_HEAP_FILTER_UNTAGGED = 0x8, - JVMTI_HEAP_FILTER_CLASS_TAGGED = 0x10, - JVMTI_HEAP_FILTER_CLASS_UNTAGGED = 0x20 -}; - - /* Heap Visit Control Flags */ - -enum { - JVMTI_VISIT_OBJECTS = 0x100, - JVMTI_VISIT_ABORT = 0x8000 -}; - - /* Heap Reference Enumeration */ - -typedef enum { - JVMTI_HEAP_REFERENCE_CLASS = 1, - JVMTI_HEAP_REFERENCE_FIELD = 2, - JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT = 3, - JVMTI_HEAP_REFERENCE_CLASS_LOADER = 4, - JVMTI_HEAP_REFERENCE_SIGNERS = 5, - JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN = 6, - JVMTI_HEAP_REFERENCE_INTERFACE = 7, - JVMTI_HEAP_REFERENCE_STATIC_FIELD = 8, - JVMTI_HEAP_REFERENCE_CONSTANT_POOL = 9, - JVMTI_HEAP_REFERENCE_SUPERCLASS = 10, - JVMTI_HEAP_REFERENCE_JNI_GLOBAL = 21, - JVMTI_HEAP_REFERENCE_SYSTEM_CLASS = 22, - JVMTI_HEAP_REFERENCE_MONITOR = 23, - JVMTI_HEAP_REFERENCE_STACK_LOCAL = 24, - JVMTI_HEAP_REFERENCE_JNI_LOCAL = 25, - JVMTI_HEAP_REFERENCE_THREAD = 26, - JVMTI_HEAP_REFERENCE_OTHER = 27 -} jvmtiHeapReferenceKind; - - /* Primitive Type Enumeration */ - -typedef enum { - JVMTI_PRIMITIVE_TYPE_BOOLEAN = 90, - JVMTI_PRIMITIVE_TYPE_BYTE = 66, - JVMTI_PRIMITIVE_TYPE_CHAR = 67, - JVMTI_PRIMITIVE_TYPE_SHORT = 83, - JVMTI_PRIMITIVE_TYPE_INT = 73, - JVMTI_PRIMITIVE_TYPE_LONG = 74, - JVMTI_PRIMITIVE_TYPE_FLOAT = 70, - JVMTI_PRIMITIVE_TYPE_DOUBLE = 68 -} jvmtiPrimitiveType; - - /* Heap Object Filter Enumeration */ - -typedef enum { - JVMTI_HEAP_OBJECT_TAGGED = 1, - JVMTI_HEAP_OBJECT_UNTAGGED = 2, - JVMTI_HEAP_OBJECT_EITHER = 3 -} jvmtiHeapObjectFilter; - - /* Heap Root Kind Enumeration */ - -typedef enum { - JVMTI_HEAP_ROOT_JNI_GLOBAL = 1, - JVMTI_HEAP_ROOT_SYSTEM_CLASS = 2, - JVMTI_HEAP_ROOT_MONITOR = 3, - JVMTI_HEAP_ROOT_STACK_LOCAL = 4, - JVMTI_HEAP_ROOT_JNI_LOCAL = 5, - JVMTI_HEAP_ROOT_THREAD = 6, - JVMTI_HEAP_ROOT_OTHER = 7 -} jvmtiHeapRootKind; - - /* Object Reference Enumeration */ - -typedef enum { - JVMTI_REFERENCE_CLASS = 1, - JVMTI_REFERENCE_FIELD = 2, - JVMTI_REFERENCE_ARRAY_ELEMENT = 3, - JVMTI_REFERENCE_CLASS_LOADER = 4, - JVMTI_REFERENCE_SIGNERS = 5, - JVMTI_REFERENCE_PROTECTION_DOMAIN = 6, - JVMTI_REFERENCE_INTERFACE = 7, - JVMTI_REFERENCE_STATIC_FIELD = 8, - JVMTI_REFERENCE_CONSTANT_POOL = 9 -} jvmtiObjectReferenceKind; - - /* Iteration Control Enumeration */ - -typedef enum { - JVMTI_ITERATION_CONTINUE = 1, - JVMTI_ITERATION_IGNORE = 2, - JVMTI_ITERATION_ABORT = 0 -} jvmtiIterationControl; - - /* Class Status Flags */ - -enum { - JVMTI_CLASS_STATUS_VERIFIED = 1, - JVMTI_CLASS_STATUS_PREPARED = 2, - JVMTI_CLASS_STATUS_INITIALIZED = 4, - JVMTI_CLASS_STATUS_ERROR = 8, - JVMTI_CLASS_STATUS_ARRAY = 16, - JVMTI_CLASS_STATUS_PRIMITIVE = 32 -}; - - /* Event Enable/Disable */ - -typedef enum { - JVMTI_ENABLE = 1, - JVMTI_DISABLE = 0 -} jvmtiEventMode; - - /* Extension Function/Event Parameter Types */ - -typedef enum { - JVMTI_TYPE_JBYTE = 101, - JVMTI_TYPE_JCHAR = 102, - JVMTI_TYPE_JSHORT = 103, - JVMTI_TYPE_JINT = 104, - JVMTI_TYPE_JLONG = 105, - JVMTI_TYPE_JFLOAT = 106, - JVMTI_TYPE_JDOUBLE = 107, - JVMTI_TYPE_JBOOLEAN = 108, - JVMTI_TYPE_JOBJECT = 109, - JVMTI_TYPE_JTHREAD = 110, - JVMTI_TYPE_JCLASS = 111, - JVMTI_TYPE_JVALUE = 112, - JVMTI_TYPE_JFIELDID = 113, - JVMTI_TYPE_JMETHODID = 114, - JVMTI_TYPE_CCHAR = 115, - JVMTI_TYPE_CVOID = 116, - JVMTI_TYPE_JNIENV = 117 -} jvmtiParamTypes; - - /* Extension Function/Event Parameter Kinds */ - -typedef enum { - JVMTI_KIND_IN = 91, - JVMTI_KIND_IN_PTR = 92, - JVMTI_KIND_IN_BUF = 93, - JVMTI_KIND_ALLOC_BUF = 94, - JVMTI_KIND_ALLOC_ALLOC_BUF = 95, - JVMTI_KIND_OUT = 96, - JVMTI_KIND_OUT_BUF = 97 -} jvmtiParamKind; - - /* Timer Kinds */ - -typedef enum { - JVMTI_TIMER_USER_CPU = 30, - JVMTI_TIMER_TOTAL_CPU = 31, - JVMTI_TIMER_ELAPSED = 32 -} jvmtiTimerKind; - - /* Phases of execution */ - -typedef enum { - JVMTI_PHASE_ONLOAD = 1, - JVMTI_PHASE_PRIMORDIAL = 2, - JVMTI_PHASE_START = 6, - JVMTI_PHASE_LIVE = 4, - JVMTI_PHASE_DEAD = 8 -} jvmtiPhase; - - /* Version Interface Types */ - -enum { - JVMTI_VERSION_INTERFACE_JNI = 0x00000000, - JVMTI_VERSION_INTERFACE_JVMTI = 0x30000000 -}; - - /* Version Masks */ - -enum { - JVMTI_VERSION_MASK_INTERFACE_TYPE = 0x70000000, - JVMTI_VERSION_MASK_MAJOR = 0x0FFF0000, - JVMTI_VERSION_MASK_MINOR = 0x0000FF00, - JVMTI_VERSION_MASK_MICRO = 0x000000FF -}; - - /* Version Shifts */ - -enum { - JVMTI_VERSION_SHIFT_MAJOR = 16, - JVMTI_VERSION_SHIFT_MINOR = 8, - JVMTI_VERSION_SHIFT_MICRO = 0 -}; - - /* Verbose Flag Enumeration */ - -typedef enum { - JVMTI_VERBOSE_OTHER = 0, - JVMTI_VERBOSE_GC = 1, - JVMTI_VERBOSE_CLASS = 2, - JVMTI_VERBOSE_JNI = 4 -} jvmtiVerboseFlag; - - /* JLocation Format Enumeration */ - -typedef enum { - JVMTI_JLOCATION_JVMBCI = 1, - JVMTI_JLOCATION_MACHINEPC = 2, - JVMTI_JLOCATION_OTHER = 0 -} jvmtiJlocationFormat; - - /* Resource Exhaustion Flags */ - -enum { - JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR = 0x0001, - JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP = 0x0002, - JVMTI_RESOURCE_EXHAUSTED_THREADS = 0x0004 -}; - - /* Errors */ - -typedef enum { - JVMTI_ERROR_NONE = 0, - JVMTI_ERROR_INVALID_THREAD = 10, - JVMTI_ERROR_INVALID_THREAD_GROUP = 11, - JVMTI_ERROR_INVALID_PRIORITY = 12, - JVMTI_ERROR_THREAD_NOT_SUSPENDED = 13, - JVMTI_ERROR_THREAD_SUSPENDED = 14, - JVMTI_ERROR_THREAD_NOT_ALIVE = 15, - JVMTI_ERROR_INVALID_OBJECT = 20, - JVMTI_ERROR_INVALID_CLASS = 21, - JVMTI_ERROR_CLASS_NOT_PREPARED = 22, - JVMTI_ERROR_INVALID_METHODID = 23, - JVMTI_ERROR_INVALID_LOCATION = 24, - JVMTI_ERROR_INVALID_FIELDID = 25, - JVMTI_ERROR_NO_MORE_FRAMES = 31, - JVMTI_ERROR_OPAQUE_FRAME = 32, - JVMTI_ERROR_TYPE_MISMATCH = 34, - JVMTI_ERROR_INVALID_SLOT = 35, - JVMTI_ERROR_DUPLICATE = 40, - JVMTI_ERROR_NOT_FOUND = 41, - JVMTI_ERROR_INVALID_MONITOR = 50, - JVMTI_ERROR_NOT_MONITOR_OWNER = 51, - JVMTI_ERROR_INTERRUPT = 52, - JVMTI_ERROR_INVALID_CLASS_FORMAT = 60, - JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION = 61, - JVMTI_ERROR_FAILS_VERIFICATION = 62, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED = 63, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED = 64, - JVMTI_ERROR_INVALID_TYPESTATE = 65, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED = 66, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED = 67, - JVMTI_ERROR_UNSUPPORTED_VERSION = 68, - JVMTI_ERROR_NAMES_DONT_MATCH = 69, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED = 70, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED = 71, - JVMTI_ERROR_UNMODIFIABLE_CLASS = 79, - JVMTI_ERROR_NOT_AVAILABLE = 98, - JVMTI_ERROR_MUST_POSSESS_CAPABILITY = 99, - JVMTI_ERROR_NULL_POINTER = 100, - JVMTI_ERROR_ABSENT_INFORMATION = 101, - JVMTI_ERROR_INVALID_EVENT_TYPE = 102, - JVMTI_ERROR_ILLEGAL_ARGUMENT = 103, - JVMTI_ERROR_NATIVE_METHOD = 104, - JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED = 106, - JVMTI_ERROR_OUT_OF_MEMORY = 110, - JVMTI_ERROR_ACCESS_DENIED = 111, - JVMTI_ERROR_WRONG_PHASE = 112, - JVMTI_ERROR_INTERNAL = 113, - JVMTI_ERROR_UNATTACHED_THREAD = 115, - JVMTI_ERROR_INVALID_ENVIRONMENT = 116, - JVMTI_ERROR_MAX = 116 -} jvmtiError; - - /* Event IDs */ - -typedef enum { - JVMTI_MIN_EVENT_TYPE_VAL = 50, - JVMTI_EVENT_VM_INIT = 50, - JVMTI_EVENT_VM_DEATH = 51, - JVMTI_EVENT_THREAD_START = 52, - JVMTI_EVENT_THREAD_END = 53, - JVMTI_EVENT_CLASS_FILE_LOAD_HOOK = 54, - JVMTI_EVENT_CLASS_LOAD = 55, - JVMTI_EVENT_CLASS_PREPARE = 56, - JVMTI_EVENT_VM_START = 57, - JVMTI_EVENT_EXCEPTION = 58, - JVMTI_EVENT_EXCEPTION_CATCH = 59, - JVMTI_EVENT_SINGLE_STEP = 60, - JVMTI_EVENT_FRAME_POP = 61, - JVMTI_EVENT_BREAKPOINT = 62, - JVMTI_EVENT_FIELD_ACCESS = 63, - JVMTI_EVENT_FIELD_MODIFICATION = 64, - JVMTI_EVENT_METHOD_ENTRY = 65, - JVMTI_EVENT_METHOD_EXIT = 66, - JVMTI_EVENT_NATIVE_METHOD_BIND = 67, - JVMTI_EVENT_COMPILED_METHOD_LOAD = 68, - JVMTI_EVENT_COMPILED_METHOD_UNLOAD = 69, - JVMTI_EVENT_DYNAMIC_CODE_GENERATED = 70, - JVMTI_EVENT_DATA_DUMP_REQUEST = 71, - JVMTI_EVENT_MONITOR_WAIT = 73, - JVMTI_EVENT_MONITOR_WAITED = 74, - JVMTI_EVENT_MONITOR_CONTENDED_ENTER = 75, - JVMTI_EVENT_MONITOR_CONTENDED_ENTERED = 76, - JVMTI_EVENT_RESOURCE_EXHAUSTED = 80, - JVMTI_EVENT_GARBAGE_COLLECTION_START = 81, - JVMTI_EVENT_GARBAGE_COLLECTION_FINISH = 82, - JVMTI_EVENT_OBJECT_FREE = 83, - JVMTI_EVENT_VM_OBJECT_ALLOC = 84, - JVMTI_MAX_EVENT_TYPE_VAL = 84 -} jvmtiEvent; - - - /* Pre-Declarations */ -struct _jvmtiThreadInfo; -typedef struct _jvmtiThreadInfo jvmtiThreadInfo; -struct _jvmtiMonitorStackDepthInfo; -typedef struct _jvmtiMonitorStackDepthInfo jvmtiMonitorStackDepthInfo; -struct _jvmtiThreadGroupInfo; -typedef struct _jvmtiThreadGroupInfo jvmtiThreadGroupInfo; -struct _jvmtiFrameInfo; -typedef struct _jvmtiFrameInfo jvmtiFrameInfo; -struct _jvmtiStackInfo; -typedef struct _jvmtiStackInfo jvmtiStackInfo; -struct _jvmtiHeapReferenceInfoField; -typedef struct _jvmtiHeapReferenceInfoField jvmtiHeapReferenceInfoField; -struct _jvmtiHeapReferenceInfoArray; -typedef struct _jvmtiHeapReferenceInfoArray jvmtiHeapReferenceInfoArray; -struct _jvmtiHeapReferenceInfoConstantPool; -typedef struct _jvmtiHeapReferenceInfoConstantPool jvmtiHeapReferenceInfoConstantPool; -struct _jvmtiHeapReferenceInfoStackLocal; -typedef struct _jvmtiHeapReferenceInfoStackLocal jvmtiHeapReferenceInfoStackLocal; -struct _jvmtiHeapReferenceInfoJniLocal; -typedef struct _jvmtiHeapReferenceInfoJniLocal jvmtiHeapReferenceInfoJniLocal; -struct _jvmtiHeapReferenceInfoReserved; -typedef struct _jvmtiHeapReferenceInfoReserved jvmtiHeapReferenceInfoReserved; -union _jvmtiHeapReferenceInfo; -typedef union _jvmtiHeapReferenceInfo jvmtiHeapReferenceInfo; -struct _jvmtiHeapCallbacks; -typedef struct _jvmtiHeapCallbacks jvmtiHeapCallbacks; -struct _jvmtiClassDefinition; -typedef struct _jvmtiClassDefinition jvmtiClassDefinition; -struct _jvmtiMonitorUsage; -typedef struct _jvmtiMonitorUsage jvmtiMonitorUsage; -struct _jvmtiLineNumberEntry; -typedef struct _jvmtiLineNumberEntry jvmtiLineNumberEntry; -struct _jvmtiLocalVariableEntry; -typedef struct _jvmtiLocalVariableEntry jvmtiLocalVariableEntry; -struct _jvmtiParamInfo; -typedef struct _jvmtiParamInfo jvmtiParamInfo; -struct _jvmtiExtensionFunctionInfo; -typedef struct _jvmtiExtensionFunctionInfo jvmtiExtensionFunctionInfo; -struct _jvmtiExtensionEventInfo; -typedef struct _jvmtiExtensionEventInfo jvmtiExtensionEventInfo; -struct _jvmtiTimerInfo; -typedef struct _jvmtiTimerInfo jvmtiTimerInfo; -struct _jvmtiAddrLocationMap; -typedef struct _jvmtiAddrLocationMap jvmtiAddrLocationMap; - - /* Function Types */ - -typedef void (JNICALL *jvmtiStartFunction) - (jvmtiEnv* jvmti_env, JNIEnv* jni_env, void* arg); - -typedef jint (JNICALL *jvmtiHeapIterationCallback) - (jlong class_tag, jlong size, jlong* tag_ptr, jint length, void* user_data); - -typedef jint (JNICALL *jvmtiHeapReferenceCallback) - (jvmtiHeapReferenceKind reference_kind, const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, jlong referrer_class_tag, jlong size, jlong* tag_ptr, jlong* referrer_tag_ptr, jint length, void* user_data); - -typedef jint (JNICALL *jvmtiPrimitiveFieldCallback) - (jvmtiHeapReferenceKind kind, const jvmtiHeapReferenceInfo* info, jlong object_class_tag, jlong* object_tag_ptr, jvalue value, jvmtiPrimitiveType value_type, void* user_data); - -typedef jint (JNICALL *jvmtiArrayPrimitiveValueCallback) - (jlong class_tag, jlong size, jlong* tag_ptr, jint element_count, jvmtiPrimitiveType element_type, const void* elements, void* user_data); - -typedef jint (JNICALL *jvmtiStringPrimitiveValueCallback) - (jlong class_tag, jlong size, jlong* tag_ptr, const jchar* value, jint value_length, void* user_data); - -typedef jint (JNICALL *jvmtiReservedCallback) - (); - -typedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback) - (jlong class_tag, jlong size, jlong* tag_ptr, void* user_data); - -typedef jvmtiIterationControl (JNICALL *jvmtiHeapRootCallback) - (jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, jlong* tag_ptr, void* user_data); - -typedef jvmtiIterationControl (JNICALL *jvmtiStackReferenceCallback) - (jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong thread_tag, jint depth, jmethodID method, jint slot, void* user_data); - -typedef jvmtiIterationControl (JNICALL *jvmtiObjectReferenceCallback) - (jvmtiObjectReferenceKind reference_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong referrer_tag, jint referrer_index, void* user_data); - -typedef jvmtiError (JNICALL *jvmtiExtensionFunction) - (jvmtiEnv* jvmti_env, ...); - -typedef void (JNICALL *jvmtiExtensionEvent) - (jvmtiEnv* jvmti_env, ...); - - - /* Structure Types */ -struct _jvmtiThreadInfo { - char* name; - jint priority; - jboolean is_daemon; - jthreadGroup thread_group; - jobject context_class_loader; -}; -struct _jvmtiMonitorStackDepthInfo { - jobject monitor; - jint stack_depth; -}; -struct _jvmtiThreadGroupInfo { - jthreadGroup parent; - char* name; - jint max_priority; - jboolean is_daemon; -}; -struct _jvmtiFrameInfo { - jmethodID method; - jlocation location; -}; -struct _jvmtiStackInfo { - jthread thread; - jint state; - jvmtiFrameInfo* frame_buffer; - jint frame_count; -}; -struct _jvmtiHeapReferenceInfoField { - jint index; -}; -struct _jvmtiHeapReferenceInfoArray { - jint index; -}; -struct _jvmtiHeapReferenceInfoConstantPool { - jint index; -}; -struct _jvmtiHeapReferenceInfoStackLocal { - jlong thread_tag; - jlong thread_id; - jint depth; - jmethodID method; - jlocation location; - jint slot; -}; -struct _jvmtiHeapReferenceInfoJniLocal { - jlong thread_tag; - jlong thread_id; - jint depth; - jmethodID method; -}; -struct _jvmtiHeapReferenceInfoReserved { - jlong reserved1; - jlong reserved2; - jlong reserved3; - jlong reserved4; - jlong reserved5; - jlong reserved6; - jlong reserved7; - jlong reserved8; -}; -union _jvmtiHeapReferenceInfo { - jvmtiHeapReferenceInfoField field; - jvmtiHeapReferenceInfoArray array; - jvmtiHeapReferenceInfoConstantPool constant_pool; - jvmtiHeapReferenceInfoStackLocal stack_local; - jvmtiHeapReferenceInfoJniLocal jni_local; - jvmtiHeapReferenceInfoReserved other; -}; -struct _jvmtiHeapCallbacks { - jvmtiHeapIterationCallback heap_iteration_callback; - jvmtiHeapReferenceCallback heap_reference_callback; - jvmtiPrimitiveFieldCallback primitive_field_callback; - jvmtiArrayPrimitiveValueCallback array_primitive_value_callback; - jvmtiStringPrimitiveValueCallback string_primitive_value_callback; - jvmtiReservedCallback reserved5; - jvmtiReservedCallback reserved6; - jvmtiReservedCallback reserved7; - jvmtiReservedCallback reserved8; - jvmtiReservedCallback reserved9; - jvmtiReservedCallback reserved10; - jvmtiReservedCallback reserved11; - jvmtiReservedCallback reserved12; - jvmtiReservedCallback reserved13; - jvmtiReservedCallback reserved14; - jvmtiReservedCallback reserved15; -}; -struct _jvmtiClassDefinition { - jclass klass; - jint class_byte_count; - const unsigned char* class_bytes; -}; -struct _jvmtiMonitorUsage { - jthread owner; - jint entry_count; - jint waiter_count; - jthread* waiters; - jint notify_waiter_count; - jthread* notify_waiters; -}; -struct _jvmtiLineNumberEntry { - jlocation start_location; - jint line_number; -}; -struct _jvmtiLocalVariableEntry { - jlocation start_location; - jint length; - char* name; - char* signature; - char* generic_signature; - jint slot; -}; -struct _jvmtiParamInfo { - char* name; - jvmtiParamKind kind; - jvmtiParamTypes base_type; - jboolean null_ok; -}; -struct _jvmtiExtensionFunctionInfo { - jvmtiExtensionFunction func; - char* id; - char* short_description; - jint param_count; - jvmtiParamInfo* params; - jint error_count; - jvmtiError* errors; -}; -struct _jvmtiExtensionEventInfo { - jint extension_event_index; - char* id; - char* short_description; - jint param_count; - jvmtiParamInfo* params; -}; -struct _jvmtiTimerInfo { - jlong max_value; - jboolean may_skip_forward; - jboolean may_skip_backward; - jvmtiTimerKind kind; - jlong reserved1; - jlong reserved2; -}; -struct _jvmtiAddrLocationMap { - const void* start_address; - jlocation location; -}; - -typedef struct { - unsigned int can_tag_objects : 1; - unsigned int can_generate_field_modification_events : 1; - unsigned int can_generate_field_access_events : 1; - unsigned int can_get_bytecodes : 1; - unsigned int can_get_synthetic_attribute : 1; - unsigned int can_get_owned_monitor_info : 1; - unsigned int can_get_current_contended_monitor : 1; - unsigned int can_get_monitor_info : 1; - unsigned int can_pop_frame : 1; - unsigned int can_redefine_classes : 1; - unsigned int can_signal_thread : 1; - unsigned int can_get_source_file_name : 1; - unsigned int can_get_line_numbers : 1; - unsigned int can_get_source_debug_extension : 1; - unsigned int can_access_local_variables : 1; - unsigned int can_maintain_original_method_order : 1; - unsigned int can_generate_single_step_events : 1; - unsigned int can_generate_exception_events : 1; - unsigned int can_generate_frame_pop_events : 1; - unsigned int can_generate_breakpoint_events : 1; - unsigned int can_suspend : 1; - unsigned int can_redefine_any_class : 1; - unsigned int can_get_current_thread_cpu_time : 1; - unsigned int can_get_thread_cpu_time : 1; - unsigned int can_generate_method_entry_events : 1; - unsigned int can_generate_method_exit_events : 1; - unsigned int can_generate_all_class_hook_events : 1; - unsigned int can_generate_compiled_method_load_events : 1; - unsigned int can_generate_monitor_events : 1; - unsigned int can_generate_vm_object_alloc_events : 1; - unsigned int can_generate_native_method_bind_events : 1; - unsigned int can_generate_garbage_collection_events : 1; - unsigned int can_generate_object_free_events : 1; - unsigned int can_force_early_return : 1; - unsigned int can_get_owned_monitor_stack_depth_info : 1; - unsigned int can_get_constant_pool : 1; - unsigned int can_set_native_method_prefix : 1; - unsigned int can_retransform_classes : 1; - unsigned int can_retransform_any_class : 1; - unsigned int can_generate_resource_exhaustion_heap_events : 1; - unsigned int can_generate_resource_exhaustion_threads_events : 1; - unsigned int : 7; - unsigned int : 16; - unsigned int : 16; - unsigned int : 16; - unsigned int : 16; - unsigned int : 16; -} jvmtiCapabilities; - - - /* Event Definitions */ - -typedef void (JNICALL *jvmtiEventReserved)(void); - - -typedef void (JNICALL *jvmtiEventBreakpoint) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location); - -typedef void (JNICALL *jvmtiEventClassFileLoadHook) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jclass class_being_redefined, - jobject loader, - const char* name, - jobject protection_domain, - jint class_data_len, - const unsigned char* class_data, - jint* new_class_data_len, - unsigned char** new_class_data); - -typedef void (JNICALL *jvmtiEventClassLoad) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jclass klass); - -typedef void (JNICALL *jvmtiEventClassPrepare) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jclass klass); - -typedef void (JNICALL *jvmtiEventCompiledMethodLoad) - (jvmtiEnv *jvmti_env, - jmethodID method, - jint code_size, - const void* code_addr, - jint map_length, - const jvmtiAddrLocationMap* map, - const void* compile_info); - -typedef void (JNICALL *jvmtiEventCompiledMethodUnload) - (jvmtiEnv *jvmti_env, - jmethodID method, - const void* code_addr); - -typedef void (JNICALL *jvmtiEventDataDumpRequest) - (jvmtiEnv *jvmti_env); - -typedef void (JNICALL *jvmtiEventDynamicCodeGenerated) - (jvmtiEnv *jvmti_env, - const char* name, - const void* address, - jint length); - -typedef void (JNICALL *jvmtiEventException) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location, - jobject exception, - jmethodID catch_method, - jlocation catch_location); - -typedef void (JNICALL *jvmtiEventExceptionCatch) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location, - jobject exception); - -typedef void (JNICALL *jvmtiEventFieldAccess) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location, - jclass field_klass, - jobject object, - jfieldID field); - -typedef void (JNICALL *jvmtiEventFieldModification) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location, - jclass field_klass, - jobject object, - jfieldID field, - char signature_type, - jvalue new_value); - -typedef void (JNICALL *jvmtiEventFramePop) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jboolean was_popped_by_exception); - -typedef void (JNICALL *jvmtiEventGarbageCollectionFinish) - (jvmtiEnv *jvmti_env); - -typedef void (JNICALL *jvmtiEventGarbageCollectionStart) - (jvmtiEnv *jvmti_env); - -typedef void (JNICALL *jvmtiEventMethodEntry) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method); - -typedef void (JNICALL *jvmtiEventMethodExit) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jboolean was_popped_by_exception, - jvalue return_value); - -typedef void (JNICALL *jvmtiEventMonitorContendedEnter) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object); - -typedef void (JNICALL *jvmtiEventMonitorContendedEntered) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object); - -typedef void (JNICALL *jvmtiEventMonitorWait) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object, - jlong timeout); - -typedef void (JNICALL *jvmtiEventMonitorWaited) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object, - jboolean timed_out); - -typedef void (JNICALL *jvmtiEventNativeMethodBind) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - void* address, - void** new_address_ptr); - -typedef void (JNICALL *jvmtiEventObjectFree) - (jvmtiEnv *jvmti_env, - jlong tag); - -typedef void (JNICALL *jvmtiEventResourceExhausted) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jint flags, - const void* reserved, - const char* description); - -typedef void (JNICALL *jvmtiEventSingleStep) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location); - -typedef void (JNICALL *jvmtiEventThreadEnd) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread); - -typedef void (JNICALL *jvmtiEventThreadStart) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread); - -typedef void (JNICALL *jvmtiEventVMDeath) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env); - -typedef void (JNICALL *jvmtiEventVMInit) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread); - -typedef void (JNICALL *jvmtiEventVMObjectAlloc) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object, - jclass object_klass, - jlong size); - -typedef void (JNICALL *jvmtiEventVMStart) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env); - - /* Event Callback Structure */ - -typedef struct { - /* 50 : VM Initialization Event */ - jvmtiEventVMInit VMInit; - /* 51 : VM Death Event */ - jvmtiEventVMDeath VMDeath; - /* 52 : Thread Start */ - jvmtiEventThreadStart ThreadStart; - /* 53 : Thread End */ - jvmtiEventThreadEnd ThreadEnd; - /* 54 : Class File Load Hook */ - jvmtiEventClassFileLoadHook ClassFileLoadHook; - /* 55 : Class Load */ - jvmtiEventClassLoad ClassLoad; - /* 56 : Class Prepare */ - jvmtiEventClassPrepare ClassPrepare; - /* 57 : VM Start Event */ - jvmtiEventVMStart VMStart; - /* 58 : Exception */ - jvmtiEventException Exception; - /* 59 : Exception Catch */ - jvmtiEventExceptionCatch ExceptionCatch; - /* 60 : Single Step */ - jvmtiEventSingleStep SingleStep; - /* 61 : Frame Pop */ - jvmtiEventFramePop FramePop; - /* 62 : Breakpoint */ - jvmtiEventBreakpoint Breakpoint; - /* 63 : Field Access */ - jvmtiEventFieldAccess FieldAccess; - /* 64 : Field Modification */ - jvmtiEventFieldModification FieldModification; - /* 65 : Method Entry */ - jvmtiEventMethodEntry MethodEntry; - /* 66 : Method Exit */ - jvmtiEventMethodExit MethodExit; - /* 67 : Native Method Bind */ - jvmtiEventNativeMethodBind NativeMethodBind; - /* 68 : Compiled Method Load */ - jvmtiEventCompiledMethodLoad CompiledMethodLoad; - /* 69 : Compiled Method Unload */ - jvmtiEventCompiledMethodUnload CompiledMethodUnload; - /* 70 : Dynamic Code Generated */ - jvmtiEventDynamicCodeGenerated DynamicCodeGenerated; - /* 71 : Data Dump Request */ - jvmtiEventDataDumpRequest DataDumpRequest; - /* 72 */ - jvmtiEventReserved reserved72; - /* 73 : Monitor Wait */ - jvmtiEventMonitorWait MonitorWait; - /* 74 : Monitor Waited */ - jvmtiEventMonitorWaited MonitorWaited; - /* 75 : Monitor Contended Enter */ - jvmtiEventMonitorContendedEnter MonitorContendedEnter; - /* 76 : Monitor Contended Entered */ - jvmtiEventMonitorContendedEntered MonitorContendedEntered; - /* 77 */ - jvmtiEventReserved reserved77; - /* 78 */ - jvmtiEventReserved reserved78; - /* 79 */ - jvmtiEventReserved reserved79; - /* 80 : Resource Exhausted */ - jvmtiEventResourceExhausted ResourceExhausted; - /* 81 : Garbage Collection Start */ - jvmtiEventGarbageCollectionStart GarbageCollectionStart; - /* 82 : Garbage Collection Finish */ - jvmtiEventGarbageCollectionFinish GarbageCollectionFinish; - /* 83 : Object Free */ - jvmtiEventObjectFree ObjectFree; - /* 84 : VM Object Allocation */ - jvmtiEventVMObjectAlloc VMObjectAlloc; -} jvmtiEventCallbacks; - - - /* Function Interface */ - -typedef struct jvmtiInterface_1_ { - - /* 1 : RESERVED */ - void *reserved1; - - /* 2 : Set Event Notification Mode */ - jvmtiError (JNICALL *SetEventNotificationMode) (jvmtiEnv* env, - jvmtiEventMode mode, - jvmtiEvent event_type, - jthread event_thread, - ...); - - /* 3 : RESERVED */ - void *reserved3; - - /* 4 : Get All Threads */ - jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env, - jint* threads_count_ptr, - jthread** threads_ptr); - - /* 5 : Suspend Thread */ - jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env, - jthread thread); - - /* 6 : Resume Thread */ - jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env, - jthread thread); - - /* 7 : Stop Thread */ - jvmtiError (JNICALL *StopThread) (jvmtiEnv* env, - jthread thread, - jobject exception); - - /* 8 : Interrupt Thread */ - jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env, - jthread thread); - - /* 9 : Get Thread Info */ - jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env, - jthread thread, - jvmtiThreadInfo* info_ptr); - - /* 10 : Get Owned Monitor Info */ - jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env, - jthread thread, - jint* owned_monitor_count_ptr, - jobject** owned_monitors_ptr); - - /* 11 : Get Current Contended Monitor */ - jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env, - jthread thread, - jobject* monitor_ptr); - - /* 12 : Run Agent Thread */ - jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env, - jthread thread, - jvmtiStartFunction proc, - const void* arg, - jint priority); - - /* 13 : Get Top Thread Groups */ - jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env, - jint* group_count_ptr, - jthreadGroup** groups_ptr); - - /* 14 : Get Thread Group Info */ - jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env, - jthreadGroup group, - jvmtiThreadGroupInfo* info_ptr); - - /* 15 : Get Thread Group Children */ - jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env, - jthreadGroup group, - jint* thread_count_ptr, - jthread** threads_ptr, - jint* group_count_ptr, - jthreadGroup** groups_ptr); - - /* 16 : Get Frame Count */ - jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env, - jthread thread, - jint* count_ptr); - - /* 17 : Get Thread State */ - jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env, - jthread thread, - jint* thread_state_ptr); - - /* 18 : Get Current Thread */ - jvmtiError (JNICALL *GetCurrentThread) (jvmtiEnv* env, - jthread* thread_ptr); - - /* 19 : Get Frame Location */ - jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env, - jthread thread, - jint depth, - jmethodID* method_ptr, - jlocation* location_ptr); - - /* 20 : Notify Frame Pop */ - jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env, - jthread thread, - jint depth); - - /* 21 : Get Local Variable - Object */ - jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jobject* value_ptr); - - /* 22 : Get Local Variable - Int */ - jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jint* value_ptr); - - /* 23 : Get Local Variable - Long */ - jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jlong* value_ptr); - - /* 24 : Get Local Variable - Float */ - jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jfloat* value_ptr); - - /* 25 : Get Local Variable - Double */ - jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jdouble* value_ptr); - - /* 26 : Set Local Variable - Object */ - jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jobject value); - - /* 27 : Set Local Variable - Int */ - jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jint value); - - /* 28 : Set Local Variable - Long */ - jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jlong value); - - /* 29 : Set Local Variable - Float */ - jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jfloat value); - - /* 30 : Set Local Variable - Double */ - jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jdouble value); - - /* 31 : Create Raw Monitor */ - jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env, - const char* name, - jrawMonitorID* monitor_ptr); - - /* 32 : Destroy Raw Monitor */ - jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 33 : Raw Monitor Enter */ - jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 34 : Raw Monitor Exit */ - jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 35 : Raw Monitor Wait */ - jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env, - jrawMonitorID monitor, - jlong millis); - - /* 36 : Raw Monitor Notify */ - jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 37 : Raw Monitor Notify All */ - jvmtiError (JNICALL *RawMonitorNotifyAll) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 38 : Set Breakpoint */ - jvmtiError (JNICALL *SetBreakpoint) (jvmtiEnv* env, - jmethodID method, - jlocation location); - - /* 39 : Clear Breakpoint */ - jvmtiError (JNICALL *ClearBreakpoint) (jvmtiEnv* env, - jmethodID method, - jlocation location); - - /* 40 : RESERVED */ - void *reserved40; - - /* 41 : Set Field Access Watch */ - jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env, - jclass klass, - jfieldID field); - - /* 42 : Clear Field Access Watch */ - jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env, - jclass klass, - jfieldID field); - - /* 43 : Set Field Modification Watch */ - jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env, - jclass klass, - jfieldID field); - - /* 44 : Clear Field Modification Watch */ - jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env, - jclass klass, - jfieldID field); - - /* 45 : Is Modifiable Class */ - jvmtiError (JNICALL *IsModifiableClass) (jvmtiEnv* env, - jclass klass, - jboolean* is_modifiable_class_ptr); - - /* 46 : Allocate */ - jvmtiError (JNICALL *Allocate) (jvmtiEnv* env, - jlong size, - unsigned char** mem_ptr); - - /* 47 : Deallocate */ - jvmtiError (JNICALL *Deallocate) (jvmtiEnv* env, - unsigned char* mem); - - /* 48 : Get Class Signature */ - jvmtiError (JNICALL *GetClassSignature) (jvmtiEnv* env, - jclass klass, - char** signature_ptr, - char** generic_ptr); - - /* 49 : Get Class Status */ - jvmtiError (JNICALL *GetClassStatus) (jvmtiEnv* env, - jclass klass, - jint* status_ptr); - - /* 50 : Get Source File Name */ - jvmtiError (JNICALL *GetSourceFileName) (jvmtiEnv* env, - jclass klass, - char** source_name_ptr); - - /* 51 : Get Class Modifiers */ - jvmtiError (JNICALL *GetClassModifiers) (jvmtiEnv* env, - jclass klass, - jint* modifiers_ptr); - - /* 52 : Get Class Methods */ - jvmtiError (JNICALL *GetClassMethods) (jvmtiEnv* env, - jclass klass, - jint* method_count_ptr, - jmethodID** methods_ptr); - - /* 53 : Get Class Fields */ - jvmtiError (JNICALL *GetClassFields) (jvmtiEnv* env, - jclass klass, - jint* field_count_ptr, - jfieldID** fields_ptr); - - /* 54 : Get Implemented Interfaces */ - jvmtiError (JNICALL *GetImplementedInterfaces) (jvmtiEnv* env, - jclass klass, - jint* interface_count_ptr, - jclass** interfaces_ptr); - - /* 55 : Is Interface */ - jvmtiError (JNICALL *IsInterface) (jvmtiEnv* env, - jclass klass, - jboolean* is_interface_ptr); - - /* 56 : Is Array Class */ - jvmtiError (JNICALL *IsArrayClass) (jvmtiEnv* env, - jclass klass, - jboolean* is_array_class_ptr); - - /* 57 : Get Class Loader */ - jvmtiError (JNICALL *GetClassLoader) (jvmtiEnv* env, - jclass klass, - jobject* classloader_ptr); - - /* 58 : Get Object Hash Code */ - jvmtiError (JNICALL *GetObjectHashCode) (jvmtiEnv* env, - jobject object, - jint* hash_code_ptr); - - /* 59 : Get Object Monitor Usage */ - jvmtiError (JNICALL *GetObjectMonitorUsage) (jvmtiEnv* env, - jobject object, - jvmtiMonitorUsage* info_ptr); - - /* 60 : Get Field Name (and Signature) */ - jvmtiError (JNICALL *GetFieldName) (jvmtiEnv* env, - jclass klass, - jfieldID field, - char** name_ptr, - char** signature_ptr, - char** generic_ptr); - - /* 61 : Get Field Declaring Class */ - jvmtiError (JNICALL *GetFieldDeclaringClass) (jvmtiEnv* env, - jclass klass, - jfieldID field, - jclass* declaring_class_ptr); - - /* 62 : Get Field Modifiers */ - jvmtiError (JNICALL *GetFieldModifiers) (jvmtiEnv* env, - jclass klass, - jfieldID field, - jint* modifiers_ptr); - - /* 63 : Is Field Synthetic */ - jvmtiError (JNICALL *IsFieldSynthetic) (jvmtiEnv* env, - jclass klass, - jfieldID field, - jboolean* is_synthetic_ptr); - - /* 64 : Get Method Name (and Signature) */ - jvmtiError (JNICALL *GetMethodName) (jvmtiEnv* env, - jmethodID method, - char** name_ptr, - char** signature_ptr, - char** generic_ptr); - - /* 65 : Get Method Declaring Class */ - jvmtiError (JNICALL *GetMethodDeclaringClass) (jvmtiEnv* env, - jmethodID method, - jclass* declaring_class_ptr); - - /* 66 : Get Method Modifiers */ - jvmtiError (JNICALL *GetMethodModifiers) (jvmtiEnv* env, - jmethodID method, - jint* modifiers_ptr); - - /* 67 : RESERVED */ - void *reserved67; - - /* 68 : Get Max Locals */ - jvmtiError (JNICALL *GetMaxLocals) (jvmtiEnv* env, - jmethodID method, - jint* max_ptr); - - /* 69 : Get Arguments Size */ - jvmtiError (JNICALL *GetArgumentsSize) (jvmtiEnv* env, - jmethodID method, - jint* size_ptr); - - /* 70 : Get Line Number Table */ - jvmtiError (JNICALL *GetLineNumberTable) (jvmtiEnv* env, - jmethodID method, - jint* entry_count_ptr, - jvmtiLineNumberEntry** table_ptr); - - /* 71 : Get Method Location */ - jvmtiError (JNICALL *GetMethodLocation) (jvmtiEnv* env, - jmethodID method, - jlocation* start_location_ptr, - jlocation* end_location_ptr); - - /* 72 : Get Local Variable Table */ - jvmtiError (JNICALL *GetLocalVariableTable) (jvmtiEnv* env, - jmethodID method, - jint* entry_count_ptr, - jvmtiLocalVariableEntry** table_ptr); - - /* 73 : Set Native Method Prefix */ - jvmtiError (JNICALL *SetNativeMethodPrefix) (jvmtiEnv* env, - const char* prefix); - - /* 74 : Set Native Method Prefixes */ - jvmtiError (JNICALL *SetNativeMethodPrefixes) (jvmtiEnv* env, - jint prefix_count, - char** prefixes); - - /* 75 : Get Bytecodes */ - jvmtiError (JNICALL *GetBytecodes) (jvmtiEnv* env, - jmethodID method, - jint* bytecode_count_ptr, - unsigned char** bytecodes_ptr); - - /* 76 : Is Method Native */ - jvmtiError (JNICALL *IsMethodNative) (jvmtiEnv* env, - jmethodID method, - jboolean* is_native_ptr); - - /* 77 : Is Method Synthetic */ - jvmtiError (JNICALL *IsMethodSynthetic) (jvmtiEnv* env, - jmethodID method, - jboolean* is_synthetic_ptr); - - /* 78 : Get Loaded Classes */ - jvmtiError (JNICALL *GetLoadedClasses) (jvmtiEnv* env, - jint* class_count_ptr, - jclass** classes_ptr); - - /* 79 : Get Classloader Classes */ - jvmtiError (JNICALL *GetClassLoaderClasses) (jvmtiEnv* env, - jobject initiating_loader, - jint* class_count_ptr, - jclass** classes_ptr); - - /* 80 : Pop Frame */ - jvmtiError (JNICALL *PopFrame) (jvmtiEnv* env, - jthread thread); - - /* 81 : Force Early Return - Object */ - jvmtiError (JNICALL *ForceEarlyReturnObject) (jvmtiEnv* env, - jthread thread, - jobject value); - - /* 82 : Force Early Return - Int */ - jvmtiError (JNICALL *ForceEarlyReturnInt) (jvmtiEnv* env, - jthread thread, - jint value); - - /* 83 : Force Early Return - Long */ - jvmtiError (JNICALL *ForceEarlyReturnLong) (jvmtiEnv* env, - jthread thread, - jlong value); - - /* 84 : Force Early Return - Float */ - jvmtiError (JNICALL *ForceEarlyReturnFloat) (jvmtiEnv* env, - jthread thread, - jfloat value); - - /* 85 : Force Early Return - Double */ - jvmtiError (JNICALL *ForceEarlyReturnDouble) (jvmtiEnv* env, - jthread thread, - jdouble value); - - /* 86 : Force Early Return - Void */ - jvmtiError (JNICALL *ForceEarlyReturnVoid) (jvmtiEnv* env, - jthread thread); - - /* 87 : Redefine Classes */ - jvmtiError (JNICALL *RedefineClasses) (jvmtiEnv* env, - jint class_count, - const jvmtiClassDefinition* class_definitions); - - /* 88 : Get Version Number */ - jvmtiError (JNICALL *GetVersionNumber) (jvmtiEnv* env, - jint* version_ptr); - - /* 89 : Get Capabilities */ - jvmtiError (JNICALL *GetCapabilities) (jvmtiEnv* env, - jvmtiCapabilities* capabilities_ptr); - - /* 90 : Get Source Debug Extension */ - jvmtiError (JNICALL *GetSourceDebugExtension) (jvmtiEnv* env, - jclass klass, - char** source_debug_extension_ptr); - - /* 91 : Is Method Obsolete */ - jvmtiError (JNICALL *IsMethodObsolete) (jvmtiEnv* env, - jmethodID method, - jboolean* is_obsolete_ptr); - - /* 92 : Suspend Thread List */ - jvmtiError (JNICALL *SuspendThreadList) (jvmtiEnv* env, - jint request_count, - const jthread* request_list, - jvmtiError* results); - - /* 93 : Resume Thread List */ - jvmtiError (JNICALL *ResumeThreadList) (jvmtiEnv* env, - jint request_count, - const jthread* request_list, - jvmtiError* results); - - /* 94 : RESERVED */ - void *reserved94; - - /* 95 : RESERVED */ - void *reserved95; - - /* 96 : RESERVED */ - void *reserved96; - - /* 97 : RESERVED */ - void *reserved97; - - /* 98 : RESERVED */ - void *reserved98; - - /* 99 : RESERVED */ - void *reserved99; - - /* 100 : Get All Stack Traces */ - jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env, - jint max_frame_count, - jvmtiStackInfo** stack_info_ptr, - jint* thread_count_ptr); - - /* 101 : Get Thread List Stack Traces */ - jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env, - jint thread_count, - const jthread* thread_list, - jint max_frame_count, - jvmtiStackInfo** stack_info_ptr); - - /* 102 : Get Thread Local Storage */ - jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env, - jthread thread, - void** data_ptr); - - /* 103 : Set Thread Local Storage */ - jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env, - jthread thread, - const void* data); - - /* 104 : Get Stack Trace */ - jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env, - jthread thread, - jint start_depth, - jint max_frame_count, - jvmtiFrameInfo* frame_buffer, - jint* count_ptr); - - /* 105 : RESERVED */ - void *reserved105; - - /* 106 : Get Tag */ - jvmtiError (JNICALL *GetTag) (jvmtiEnv* env, - jobject object, - jlong* tag_ptr); - - /* 107 : Set Tag */ - jvmtiError (JNICALL *SetTag) (jvmtiEnv* env, - jobject object, - jlong tag); - - /* 108 : Force Garbage Collection */ - jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env); - - /* 109 : Iterate Over Objects Reachable From Object */ - jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env, - jobject object, - jvmtiObjectReferenceCallback object_reference_callback, - const void* user_data); - - /* 110 : Iterate Over Reachable Objects */ - jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env, - jvmtiHeapRootCallback heap_root_callback, - jvmtiStackReferenceCallback stack_ref_callback, - jvmtiObjectReferenceCallback object_ref_callback, - const void* user_data); - - /* 111 : Iterate Over Heap */ - jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env, - jvmtiHeapObjectFilter object_filter, - jvmtiHeapObjectCallback heap_object_callback, - const void* user_data); - - /* 112 : Iterate Over Instances Of Class */ - jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env, - jclass klass, - jvmtiHeapObjectFilter object_filter, - jvmtiHeapObjectCallback heap_object_callback, - const void* user_data); - - /* 113 : RESERVED */ - void *reserved113; - - /* 114 : Get Objects With Tags */ - jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env, - jint tag_count, - const jlong* tags, - jint* count_ptr, - jobject** object_result_ptr, - jlong** tag_result_ptr); - - /* 115 : Follow References */ - jvmtiError (JNICALL *FollowReferences) (jvmtiEnv* env, - jint heap_filter, - jclass klass, - jobject initial_object, - const jvmtiHeapCallbacks* callbacks, - const void* user_data); - - /* 116 : Iterate Through Heap */ - jvmtiError (JNICALL *IterateThroughHeap) (jvmtiEnv* env, - jint heap_filter, - jclass klass, - const jvmtiHeapCallbacks* callbacks, - const void* user_data); - - /* 117 : RESERVED */ - void *reserved117; - - /* 118 : RESERVED */ - void *reserved118; - - /* 119 : RESERVED */ - void *reserved119; - - /* 120 : Set JNI Function Table */ - jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env, - const jniNativeInterface* function_table); - - /* 121 : Get JNI Function Table */ - jvmtiError (JNICALL *GetJNIFunctionTable) (jvmtiEnv* env, - jniNativeInterface** function_table); - - /* 122 : Set Event Callbacks */ - jvmtiError (JNICALL *SetEventCallbacks) (jvmtiEnv* env, - const jvmtiEventCallbacks* callbacks, - jint size_of_callbacks); - - /* 123 : Generate Events */ - jvmtiError (JNICALL *GenerateEvents) (jvmtiEnv* env, - jvmtiEvent event_type); - - /* 124 : Get Extension Functions */ - jvmtiError (JNICALL *GetExtensionFunctions) (jvmtiEnv* env, - jint* extension_count_ptr, - jvmtiExtensionFunctionInfo** extensions); - - /* 125 : Get Extension Events */ - jvmtiError (JNICALL *GetExtensionEvents) (jvmtiEnv* env, - jint* extension_count_ptr, - jvmtiExtensionEventInfo** extensions); - - /* 126 : Set Extension Event Callback */ - jvmtiError (JNICALL *SetExtensionEventCallback) (jvmtiEnv* env, - jint extension_event_index, - jvmtiExtensionEvent callback); - - /* 127 : Dispose Environment */ - jvmtiError (JNICALL *DisposeEnvironment) (jvmtiEnv* env); - - /* 128 : Get Error Name */ - jvmtiError (JNICALL *GetErrorName) (jvmtiEnv* env, - jvmtiError error, - char** name_ptr); - - /* 129 : Get JLocation Format */ - jvmtiError (JNICALL *GetJLocationFormat) (jvmtiEnv* env, - jvmtiJlocationFormat* format_ptr); - - /* 130 : Get System Properties */ - jvmtiError (JNICALL *GetSystemProperties) (jvmtiEnv* env, - jint* count_ptr, - char*** property_ptr); - - /* 131 : Get System Property */ - jvmtiError (JNICALL *GetSystemProperty) (jvmtiEnv* env, - const char* property, - char** value_ptr); - - /* 132 : Set System Property */ - jvmtiError (JNICALL *SetSystemProperty) (jvmtiEnv* env, - const char* property, - const char* value); - - /* 133 : Get Phase */ - jvmtiError (JNICALL *GetPhase) (jvmtiEnv* env, - jvmtiPhase* phase_ptr); - - /* 134 : Get Current Thread CPU Timer Information */ - jvmtiError (JNICALL *GetCurrentThreadCpuTimerInfo) (jvmtiEnv* env, - jvmtiTimerInfo* info_ptr); - - /* 135 : Get Current Thread CPU Time */ - jvmtiError (JNICALL *GetCurrentThreadCpuTime) (jvmtiEnv* env, - jlong* nanos_ptr); - - /* 136 : Get Thread CPU Timer Information */ - jvmtiError (JNICALL *GetThreadCpuTimerInfo) (jvmtiEnv* env, - jvmtiTimerInfo* info_ptr); - - /* 137 : Get Thread CPU Time */ - jvmtiError (JNICALL *GetThreadCpuTime) (jvmtiEnv* env, - jthread thread, - jlong* nanos_ptr); - - /* 138 : Get Timer Information */ - jvmtiError (JNICALL *GetTimerInfo) (jvmtiEnv* env, - jvmtiTimerInfo* info_ptr); - - /* 139 : Get Time */ - jvmtiError (JNICALL *GetTime) (jvmtiEnv* env, - jlong* nanos_ptr); - - /* 140 : Get Potential Capabilities */ - jvmtiError (JNICALL *GetPotentialCapabilities) (jvmtiEnv* env, - jvmtiCapabilities* capabilities_ptr); - - /* 141 : RESERVED */ - void *reserved141; - - /* 142 : Add Capabilities */ - jvmtiError (JNICALL *AddCapabilities) (jvmtiEnv* env, - const jvmtiCapabilities* capabilities_ptr); - - /* 143 : Relinquish Capabilities */ - jvmtiError (JNICALL *RelinquishCapabilities) (jvmtiEnv* env, - const jvmtiCapabilities* capabilities_ptr); - - /* 144 : Get Available Processors */ - jvmtiError (JNICALL *GetAvailableProcessors) (jvmtiEnv* env, - jint* processor_count_ptr); - - /* 145 : Get Class Version Numbers */ - jvmtiError (JNICALL *GetClassVersionNumbers) (jvmtiEnv* env, - jclass klass, - jint* minor_version_ptr, - jint* major_version_ptr); - - /* 146 : Get Constant Pool */ - jvmtiError (JNICALL *GetConstantPool) (jvmtiEnv* env, - jclass klass, - jint* constant_pool_count_ptr, - jint* constant_pool_byte_count_ptr, - unsigned char** constant_pool_bytes_ptr); - - /* 147 : Get Environment Local Storage */ - jvmtiError (JNICALL *GetEnvironmentLocalStorage) (jvmtiEnv* env, - void** data_ptr); - - /* 148 : Set Environment Local Storage */ - jvmtiError (JNICALL *SetEnvironmentLocalStorage) (jvmtiEnv* env, - const void* data); - - /* 149 : Add To Bootstrap Class Loader Search */ - jvmtiError (JNICALL *AddToBootstrapClassLoaderSearch) (jvmtiEnv* env, - const char* segment); - - /* 150 : Set Verbose Flag */ - jvmtiError (JNICALL *SetVerboseFlag) (jvmtiEnv* env, - jvmtiVerboseFlag flag, - jboolean value); - - /* 151 : Add To System Class Loader Search */ - jvmtiError (JNICALL *AddToSystemClassLoaderSearch) (jvmtiEnv* env, - const char* segment); - - /* 152 : Retransform Classes */ - jvmtiError (JNICALL *RetransformClasses) (jvmtiEnv* env, - jint class_count, - const jclass* classes); - - /* 153 : Get Owned Monitor Stack Depth Info */ - jvmtiError (JNICALL *GetOwnedMonitorStackDepthInfo) (jvmtiEnv* env, - jthread thread, - jint* monitor_info_count_ptr, - jvmtiMonitorStackDepthInfo** monitor_info_ptr); - - /* 154 : Get Object Size */ - jvmtiError (JNICALL *GetObjectSize) (jvmtiEnv* env, - jobject object, - jlong* size_ptr); - -} jvmtiInterface_1; - -struct _jvmtiEnv { - const struct jvmtiInterface_1_ *functions; -#ifdef __cplusplus - - - jvmtiError Allocate(jlong size, - unsigned char** mem_ptr) { - return functions->Allocate(this, size, mem_ptr); - } - - jvmtiError Deallocate(unsigned char* mem) { - return functions->Deallocate(this, mem); - } - - jvmtiError GetThreadState(jthread thread, - jint* thread_state_ptr) { - return functions->GetThreadState(this, thread, thread_state_ptr); - } - - jvmtiError GetCurrentThread(jthread* thread_ptr) { - return functions->GetCurrentThread(this, thread_ptr); - } - - jvmtiError GetAllThreads(jint* threads_count_ptr, - jthread** threads_ptr) { - return functions->GetAllThreads(this, threads_count_ptr, threads_ptr); - } - - jvmtiError SuspendThread(jthread thread) { - return functions->SuspendThread(this, thread); - } - - jvmtiError SuspendThreadList(jint request_count, - const jthread* request_list, - jvmtiError* results) { - return functions->SuspendThreadList(this, request_count, request_list, results); - } - - jvmtiError ResumeThread(jthread thread) { - return functions->ResumeThread(this, thread); - } - - jvmtiError ResumeThreadList(jint request_count, - const jthread* request_list, - jvmtiError* results) { - return functions->ResumeThreadList(this, request_count, request_list, results); - } - - jvmtiError StopThread(jthread thread, - jobject exception) { - return functions->StopThread(this, thread, exception); - } - - jvmtiError InterruptThread(jthread thread) { - return functions->InterruptThread(this, thread); - } - - jvmtiError GetThreadInfo(jthread thread, - jvmtiThreadInfo* info_ptr) { - return functions->GetThreadInfo(this, thread, info_ptr); - } - - jvmtiError GetOwnedMonitorInfo(jthread thread, - jint* owned_monitor_count_ptr, - jobject** owned_monitors_ptr) { - return functions->GetOwnedMonitorInfo(this, thread, owned_monitor_count_ptr, owned_monitors_ptr); - } - - jvmtiError GetOwnedMonitorStackDepthInfo(jthread thread, - jint* monitor_info_count_ptr, - jvmtiMonitorStackDepthInfo** monitor_info_ptr) { - return functions->GetOwnedMonitorStackDepthInfo(this, thread, monitor_info_count_ptr, monitor_info_ptr); - } - - jvmtiError GetCurrentContendedMonitor(jthread thread, - jobject* monitor_ptr) { - return functions->GetCurrentContendedMonitor(this, thread, monitor_ptr); - } - - jvmtiError RunAgentThread(jthread thread, - jvmtiStartFunction proc, - const void* arg, - jint priority) { - return functions->RunAgentThread(this, thread, proc, arg, priority); - } - - jvmtiError SetThreadLocalStorage(jthread thread, - const void* data) { - return functions->SetThreadLocalStorage(this, thread, data); - } - - jvmtiError GetThreadLocalStorage(jthread thread, - void** data_ptr) { - return functions->GetThreadLocalStorage(this, thread, data_ptr); - } - - jvmtiError GetTopThreadGroups(jint* group_count_ptr, - jthreadGroup** groups_ptr) { - return functions->GetTopThreadGroups(this, group_count_ptr, groups_ptr); - } - - jvmtiError GetThreadGroupInfo(jthreadGroup group, - jvmtiThreadGroupInfo* info_ptr) { - return functions->GetThreadGroupInfo(this, group, info_ptr); - } - - jvmtiError GetThreadGroupChildren(jthreadGroup group, - jint* thread_count_ptr, - jthread** threads_ptr, - jint* group_count_ptr, - jthreadGroup** groups_ptr) { - return functions->GetThreadGroupChildren(this, group, thread_count_ptr, threads_ptr, group_count_ptr, groups_ptr); - } - - jvmtiError GetStackTrace(jthread thread, - jint start_depth, - jint max_frame_count, - jvmtiFrameInfo* frame_buffer, - jint* count_ptr) { - return functions->GetStackTrace(this, thread, start_depth, max_frame_count, frame_buffer, count_ptr); - } - - jvmtiError GetAllStackTraces(jint max_frame_count, - jvmtiStackInfo** stack_info_ptr, - jint* thread_count_ptr) { - return functions->GetAllStackTraces(this, max_frame_count, stack_info_ptr, thread_count_ptr); - } - - jvmtiError GetThreadListStackTraces(jint thread_count, - const jthread* thread_list, - jint max_frame_count, - jvmtiStackInfo** stack_info_ptr) { - return functions->GetThreadListStackTraces(this, thread_count, thread_list, max_frame_count, stack_info_ptr); - } - - jvmtiError GetFrameCount(jthread thread, - jint* count_ptr) { - return functions->GetFrameCount(this, thread, count_ptr); - } - - jvmtiError PopFrame(jthread thread) { - return functions->PopFrame(this, thread); - } - - jvmtiError GetFrameLocation(jthread thread, - jint depth, - jmethodID* method_ptr, - jlocation* location_ptr) { - return functions->GetFrameLocation(this, thread, depth, method_ptr, location_ptr); - } - - jvmtiError NotifyFramePop(jthread thread, - jint depth) { - return functions->NotifyFramePop(this, thread, depth); - } - - jvmtiError ForceEarlyReturnObject(jthread thread, - jobject value) { - return functions->ForceEarlyReturnObject(this, thread, value); - } - - jvmtiError ForceEarlyReturnInt(jthread thread, - jint value) { - return functions->ForceEarlyReturnInt(this, thread, value); - } - - jvmtiError ForceEarlyReturnLong(jthread thread, - jlong value) { - return functions->ForceEarlyReturnLong(this, thread, value); - } - - jvmtiError ForceEarlyReturnFloat(jthread thread, - jfloat value) { - return functions->ForceEarlyReturnFloat(this, thread, value); - } - - jvmtiError ForceEarlyReturnDouble(jthread thread, - jdouble value) { - return functions->ForceEarlyReturnDouble(this, thread, value); - } - - jvmtiError ForceEarlyReturnVoid(jthread thread) { - return functions->ForceEarlyReturnVoid(this, thread); - } - - jvmtiError FollowReferences(jint heap_filter, - jclass klass, - jobject initial_object, - const jvmtiHeapCallbacks* callbacks, - const void* user_data) { - return functions->FollowReferences(this, heap_filter, klass, initial_object, callbacks, user_data); - } - - jvmtiError IterateThroughHeap(jint heap_filter, - jclass klass, - const jvmtiHeapCallbacks* callbacks, - const void* user_data) { - return functions->IterateThroughHeap(this, heap_filter, klass, callbacks, user_data); - } - - jvmtiError GetTag(jobject object, - jlong* tag_ptr) { - return functions->GetTag(this, object, tag_ptr); - } - - jvmtiError SetTag(jobject object, - jlong tag) { - return functions->SetTag(this, object, tag); - } - - jvmtiError GetObjectsWithTags(jint tag_count, - const jlong* tags, - jint* count_ptr, - jobject** object_result_ptr, - jlong** tag_result_ptr) { - return functions->GetObjectsWithTags(this, tag_count, tags, count_ptr, object_result_ptr, tag_result_ptr); - } - - jvmtiError ForceGarbageCollection() { - return functions->ForceGarbageCollection(this); - } - - jvmtiError IterateOverObjectsReachableFromObject(jobject object, - jvmtiObjectReferenceCallback object_reference_callback, - const void* user_data) { - return functions->IterateOverObjectsReachableFromObject(this, object, object_reference_callback, user_data); - } - - jvmtiError IterateOverReachableObjects(jvmtiHeapRootCallback heap_root_callback, - jvmtiStackReferenceCallback stack_ref_callback, - jvmtiObjectReferenceCallback object_ref_callback, - const void* user_data) { - return functions->IterateOverReachableObjects(this, heap_root_callback, stack_ref_callback, object_ref_callback, user_data); - } - - jvmtiError IterateOverHeap(jvmtiHeapObjectFilter object_filter, - jvmtiHeapObjectCallback heap_object_callback, - const void* user_data) { - return functions->IterateOverHeap(this, object_filter, heap_object_callback, user_data); - } - - jvmtiError IterateOverInstancesOfClass(jclass klass, - jvmtiHeapObjectFilter object_filter, - jvmtiHeapObjectCallback heap_object_callback, - const void* user_data) { - return functions->IterateOverInstancesOfClass(this, klass, object_filter, heap_object_callback, user_data); - } - - jvmtiError GetLocalObject(jthread thread, - jint depth, - jint slot, - jobject* value_ptr) { - return functions->GetLocalObject(this, thread, depth, slot, value_ptr); - } - - jvmtiError GetLocalInt(jthread thread, - jint depth, - jint slot, - jint* value_ptr) { - return functions->GetLocalInt(this, thread, depth, slot, value_ptr); - } - - jvmtiError GetLocalLong(jthread thread, - jint depth, - jint slot, - jlong* value_ptr) { - return functions->GetLocalLong(this, thread, depth, slot, value_ptr); - } - - jvmtiError GetLocalFloat(jthread thread, - jint depth, - jint slot, - jfloat* value_ptr) { - return functions->GetLocalFloat(this, thread, depth, slot, value_ptr); - } - - jvmtiError GetLocalDouble(jthread thread, - jint depth, - jint slot, - jdouble* value_ptr) { - return functions->GetLocalDouble(this, thread, depth, slot, value_ptr); - } - - jvmtiError SetLocalObject(jthread thread, - jint depth, - jint slot, - jobject value) { - return functions->SetLocalObject(this, thread, depth, slot, value); - } - - jvmtiError SetLocalInt(jthread thread, - jint depth, - jint slot, - jint value) { - return functions->SetLocalInt(this, thread, depth, slot, value); - } - - jvmtiError SetLocalLong(jthread thread, - jint depth, - jint slot, - jlong value) { - return functions->SetLocalLong(this, thread, depth, slot, value); - } - - jvmtiError SetLocalFloat(jthread thread, - jint depth, - jint slot, - jfloat value) { - return functions->SetLocalFloat(this, thread, depth, slot, value); - } - - jvmtiError SetLocalDouble(jthread thread, - jint depth, - jint slot, - jdouble value) { - return functions->SetLocalDouble(this, thread, depth, slot, value); - } - - jvmtiError SetBreakpoint(jmethodID method, - jlocation location) { - return functions->SetBreakpoint(this, method, location); - } - - jvmtiError ClearBreakpoint(jmethodID method, - jlocation location) { - return functions->ClearBreakpoint(this, method, location); - } - - jvmtiError SetFieldAccessWatch(jclass klass, - jfieldID field) { - return functions->SetFieldAccessWatch(this, klass, field); - } - - jvmtiError ClearFieldAccessWatch(jclass klass, - jfieldID field) { - return functions->ClearFieldAccessWatch(this, klass, field); - } - - jvmtiError SetFieldModificationWatch(jclass klass, - jfieldID field) { - return functions->SetFieldModificationWatch(this, klass, field); - } - - jvmtiError ClearFieldModificationWatch(jclass klass, - jfieldID field) { - return functions->ClearFieldModificationWatch(this, klass, field); - } - - jvmtiError GetLoadedClasses(jint* class_count_ptr, - jclass** classes_ptr) { - return functions->GetLoadedClasses(this, class_count_ptr, classes_ptr); - } - - jvmtiError GetClassLoaderClasses(jobject initiating_loader, - jint* class_count_ptr, - jclass** classes_ptr) { - return functions->GetClassLoaderClasses(this, initiating_loader, class_count_ptr, classes_ptr); - } - - jvmtiError GetClassSignature(jclass klass, - char** signature_ptr, - char** generic_ptr) { - return functions->GetClassSignature(this, klass, signature_ptr, generic_ptr); - } - - jvmtiError GetClassStatus(jclass klass, - jint* status_ptr) { - return functions->GetClassStatus(this, klass, status_ptr); - } - - jvmtiError GetSourceFileName(jclass klass, - char** source_name_ptr) { - return functions->GetSourceFileName(this, klass, source_name_ptr); - } - - jvmtiError GetClassModifiers(jclass klass, - jint* modifiers_ptr) { - return functions->GetClassModifiers(this, klass, modifiers_ptr); - } - - jvmtiError GetClassMethods(jclass klass, - jint* method_count_ptr, - jmethodID** methods_ptr) { - return functions->GetClassMethods(this, klass, method_count_ptr, methods_ptr); - } - - jvmtiError GetClassFields(jclass klass, - jint* field_count_ptr, - jfieldID** fields_ptr) { - return functions->GetClassFields(this, klass, field_count_ptr, fields_ptr); - } - - jvmtiError GetImplementedInterfaces(jclass klass, - jint* interface_count_ptr, - jclass** interfaces_ptr) { - return functions->GetImplementedInterfaces(this, klass, interface_count_ptr, interfaces_ptr); - } - - jvmtiError GetClassVersionNumbers(jclass klass, - jint* minor_version_ptr, - jint* major_version_ptr) { - return functions->GetClassVersionNumbers(this, klass, minor_version_ptr, major_version_ptr); - } - - jvmtiError GetConstantPool(jclass klass, - jint* constant_pool_count_ptr, - jint* constant_pool_byte_count_ptr, - unsigned char** constant_pool_bytes_ptr) { - return functions->GetConstantPool(this, klass, constant_pool_count_ptr, constant_pool_byte_count_ptr, constant_pool_bytes_ptr); - } - - jvmtiError IsInterface(jclass klass, - jboolean* is_interface_ptr) { - return functions->IsInterface(this, klass, is_interface_ptr); - } - - jvmtiError IsArrayClass(jclass klass, - jboolean* is_array_class_ptr) { - return functions->IsArrayClass(this, klass, is_array_class_ptr); - } - - jvmtiError IsModifiableClass(jclass klass, - jboolean* is_modifiable_class_ptr) { - return functions->IsModifiableClass(this, klass, is_modifiable_class_ptr); - } - - jvmtiError GetClassLoader(jclass klass, - jobject* classloader_ptr) { - return functions->GetClassLoader(this, klass, classloader_ptr); - } - - jvmtiError GetSourceDebugExtension(jclass klass, - char** source_debug_extension_ptr) { - return functions->GetSourceDebugExtension(this, klass, source_debug_extension_ptr); - } - - jvmtiError RetransformClasses(jint class_count, - const jclass* classes) { - return functions->RetransformClasses(this, class_count, classes); - } - - jvmtiError RedefineClasses(jint class_count, - const jvmtiClassDefinition* class_definitions) { - return functions->RedefineClasses(this, class_count, class_definitions); - } - - jvmtiError GetObjectSize(jobject object, - jlong* size_ptr) { - return functions->GetObjectSize(this, object, size_ptr); - } - - jvmtiError GetObjectHashCode(jobject object, - jint* hash_code_ptr) { - return functions->GetObjectHashCode(this, object, hash_code_ptr); - } - - jvmtiError GetObjectMonitorUsage(jobject object, - jvmtiMonitorUsage* info_ptr) { - return functions->GetObjectMonitorUsage(this, object, info_ptr); - } - - jvmtiError GetFieldName(jclass klass, - jfieldID field, - char** name_ptr, - char** signature_ptr, - char** generic_ptr) { - return functions->GetFieldName(this, klass, field, name_ptr, signature_ptr, generic_ptr); - } - - jvmtiError GetFieldDeclaringClass(jclass klass, - jfieldID field, - jclass* declaring_class_ptr) { - return functions->GetFieldDeclaringClass(this, klass, field, declaring_class_ptr); - } - - jvmtiError GetFieldModifiers(jclass klass, - jfieldID field, - jint* modifiers_ptr) { - return functions->GetFieldModifiers(this, klass, field, modifiers_ptr); - } - - jvmtiError IsFieldSynthetic(jclass klass, - jfieldID field, - jboolean* is_synthetic_ptr) { - return functions->IsFieldSynthetic(this, klass, field, is_synthetic_ptr); - } - - jvmtiError GetMethodName(jmethodID method, - char** name_ptr, - char** signature_ptr, - char** generic_ptr) { - return functions->GetMethodName(this, method, name_ptr, signature_ptr, generic_ptr); - } - - jvmtiError GetMethodDeclaringClass(jmethodID method, - jclass* declaring_class_ptr) { - return functions->GetMethodDeclaringClass(this, method, declaring_class_ptr); - } - - jvmtiError GetMethodModifiers(jmethodID method, - jint* modifiers_ptr) { - return functions->GetMethodModifiers(this, method, modifiers_ptr); - } - - jvmtiError GetMaxLocals(jmethodID method, - jint* max_ptr) { - return functions->GetMaxLocals(this, method, max_ptr); - } - - jvmtiError GetArgumentsSize(jmethodID method, - jint* size_ptr) { - return functions->GetArgumentsSize(this, method, size_ptr); - } - - jvmtiError GetLineNumberTable(jmethodID method, - jint* entry_count_ptr, - jvmtiLineNumberEntry** table_ptr) { - return functions->GetLineNumberTable(this, method, entry_count_ptr, table_ptr); - } - - jvmtiError GetMethodLocation(jmethodID method, - jlocation* start_location_ptr, - jlocation* end_location_ptr) { - return functions->GetMethodLocation(this, method, start_location_ptr, end_location_ptr); - } - - jvmtiError GetLocalVariableTable(jmethodID method, - jint* entry_count_ptr, - jvmtiLocalVariableEntry** table_ptr) { - return functions->GetLocalVariableTable(this, method, entry_count_ptr, table_ptr); - } - - jvmtiError GetBytecodes(jmethodID method, - jint* bytecode_count_ptr, - unsigned char** bytecodes_ptr) { - return functions->GetBytecodes(this, method, bytecode_count_ptr, bytecodes_ptr); - } - - jvmtiError IsMethodNative(jmethodID method, - jboolean* is_native_ptr) { - return functions->IsMethodNative(this, method, is_native_ptr); - } - - jvmtiError IsMethodSynthetic(jmethodID method, - jboolean* is_synthetic_ptr) { - return functions->IsMethodSynthetic(this, method, is_synthetic_ptr); - } - - jvmtiError IsMethodObsolete(jmethodID method, - jboolean* is_obsolete_ptr) { - return functions->IsMethodObsolete(this, method, is_obsolete_ptr); - } - - jvmtiError SetNativeMethodPrefix(const char* prefix) { - return functions->SetNativeMethodPrefix(this, prefix); - } - - jvmtiError SetNativeMethodPrefixes(jint prefix_count, - char** prefixes) { - return functions->SetNativeMethodPrefixes(this, prefix_count, prefixes); - } - - jvmtiError CreateRawMonitor(const char* name, - jrawMonitorID* monitor_ptr) { - return functions->CreateRawMonitor(this, name, monitor_ptr); - } - - jvmtiError DestroyRawMonitor(jrawMonitorID monitor) { - return functions->DestroyRawMonitor(this, monitor); - } - - jvmtiError RawMonitorEnter(jrawMonitorID monitor) { - return functions->RawMonitorEnter(this, monitor); - } - - jvmtiError RawMonitorExit(jrawMonitorID monitor) { - return functions->RawMonitorExit(this, monitor); - } - - jvmtiError RawMonitorWait(jrawMonitorID monitor, - jlong millis) { - return functions->RawMonitorWait(this, monitor, millis); - } - - jvmtiError RawMonitorNotify(jrawMonitorID monitor) { - return functions->RawMonitorNotify(this, monitor); - } - - jvmtiError RawMonitorNotifyAll(jrawMonitorID monitor) { - return functions->RawMonitorNotifyAll(this, monitor); - } - - jvmtiError SetJNIFunctionTable(const jniNativeInterface* function_table) { - return functions->SetJNIFunctionTable(this, function_table); - } - - jvmtiError GetJNIFunctionTable(jniNativeInterface** function_table) { - return functions->GetJNIFunctionTable(this, function_table); - } - - jvmtiError SetEventCallbacks(const jvmtiEventCallbacks* callbacks, - jint size_of_callbacks) { - return functions->SetEventCallbacks(this, callbacks, size_of_callbacks); - } - - jvmtiError SetEventNotificationMode(jvmtiEventMode mode, - jvmtiEvent event_type, - jthread event_thread, - ...) { - return functions->SetEventNotificationMode(this, mode, event_type, event_thread); - } - - jvmtiError GenerateEvents(jvmtiEvent event_type) { - return functions->GenerateEvents(this, event_type); - } - - jvmtiError GetExtensionFunctions(jint* extension_count_ptr, - jvmtiExtensionFunctionInfo** extensions) { - return functions->GetExtensionFunctions(this, extension_count_ptr, extensions); - } - - jvmtiError GetExtensionEvents(jint* extension_count_ptr, - jvmtiExtensionEventInfo** extensions) { - return functions->GetExtensionEvents(this, extension_count_ptr, extensions); - } - - jvmtiError SetExtensionEventCallback(jint extension_event_index, - jvmtiExtensionEvent callback) { - return functions->SetExtensionEventCallback(this, extension_event_index, callback); - } - - jvmtiError GetPotentialCapabilities(jvmtiCapabilities* capabilities_ptr) { - return functions->GetPotentialCapabilities(this, capabilities_ptr); - } - - jvmtiError AddCapabilities(const jvmtiCapabilities* capabilities_ptr) { - return functions->AddCapabilities(this, capabilities_ptr); - } - - jvmtiError RelinquishCapabilities(const jvmtiCapabilities* capabilities_ptr) { - return functions->RelinquishCapabilities(this, capabilities_ptr); - } - - jvmtiError GetCapabilities(jvmtiCapabilities* capabilities_ptr) { - return functions->GetCapabilities(this, capabilities_ptr); - } - - jvmtiError GetCurrentThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) { - return functions->GetCurrentThreadCpuTimerInfo(this, info_ptr); - } - - jvmtiError GetCurrentThreadCpuTime(jlong* nanos_ptr) { - return functions->GetCurrentThreadCpuTime(this, nanos_ptr); - } - - jvmtiError GetThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) { - return functions->GetThreadCpuTimerInfo(this, info_ptr); - } - - jvmtiError GetThreadCpuTime(jthread thread, - jlong* nanos_ptr) { - return functions->GetThreadCpuTime(this, thread, nanos_ptr); - } - - jvmtiError GetTimerInfo(jvmtiTimerInfo* info_ptr) { - return functions->GetTimerInfo(this, info_ptr); - } - - jvmtiError GetTime(jlong* nanos_ptr) { - return functions->GetTime(this, nanos_ptr); - } - - jvmtiError GetAvailableProcessors(jint* processor_count_ptr) { - return functions->GetAvailableProcessors(this, processor_count_ptr); - } - - jvmtiError AddToBootstrapClassLoaderSearch(const char* segment) { - return functions->AddToBootstrapClassLoaderSearch(this, segment); - } - - jvmtiError AddToSystemClassLoaderSearch(const char* segment) { - return functions->AddToSystemClassLoaderSearch(this, segment); - } - - jvmtiError GetSystemProperties(jint* count_ptr, - char*** property_ptr) { - return functions->GetSystemProperties(this, count_ptr, property_ptr); - } - - jvmtiError GetSystemProperty(const char* property, - char** value_ptr) { - return functions->GetSystemProperty(this, property, value_ptr); - } - - jvmtiError SetSystemProperty(const char* property, - const char* value) { - return functions->SetSystemProperty(this, property, value); - } - - jvmtiError GetPhase(jvmtiPhase* phase_ptr) { - return functions->GetPhase(this, phase_ptr); - } - - jvmtiError DisposeEnvironment() { - return functions->DisposeEnvironment(this); - } - - jvmtiError SetEnvironmentLocalStorage(const void* data) { - return functions->SetEnvironmentLocalStorage(this, data); - } - - jvmtiError GetEnvironmentLocalStorage(void** data_ptr) { - return functions->GetEnvironmentLocalStorage(this, data_ptr); - } - - jvmtiError GetVersionNumber(jint* version_ptr) { - return functions->GetVersionNumber(this, version_ptr); - } - - jvmtiError GetErrorName(jvmtiError error, - char** name_ptr) { - return functions->GetErrorName(this, error, name_ptr); - } - - jvmtiError SetVerboseFlag(jvmtiVerboseFlag flag, - jboolean value) { - return functions->SetVerboseFlag(this, flag, value); - } - - jvmtiError GetJLocationFormat(jvmtiJlocationFormat* format_ptr) { - return functions->GetJLocationFormat(this, format_ptr); - } - -#endif /* __cplusplus */ -}; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !_JAVA_JVMTI_H_ */ - diff --git a/cpp/JavaWinampApi/include/win32/jawt_md.h b/cpp/JavaWinampApi/include/win32/jawt_md.h deleted file mode 100644 index 82ba034..0000000 --- a/cpp/JavaWinampApi/include/win32/jawt_md.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -#ifndef _JAVASOFT_JAWT_MD_H_ -#define _JAVASOFT_JAWT_MD_H_ - -#include -#include "jawt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Win32-specific declarations for AWT native interface. - * See notes in jawt.h for an example of use. - */ -typedef struct jawt_Win32DrawingSurfaceInfo { - /* Native window, DDB, or DIB handle */ - union { - HWND hwnd; - HBITMAP hbitmap; - void* pbits; - }; - /* - * This HDC should always be used instead of the HDC returned from - * BeginPaint() or any calls to GetDC(). - */ - HDC hdc; - HPALETTE hpalette; -} JAWT_Win32DrawingSurfaceInfo; - -#ifdef __cplusplus -} -#endif - -#endif /* !_JAVASOFT_JAWT_MD_H_ */ diff --git a/cpp/JavaWinampApi/include/win32/jni_md.h b/cpp/JavaWinampApi/include/win32/jni_md.h deleted file mode 100644 index 9ac4718..0000000 --- a/cpp/JavaWinampApi/include/win32/jni_md.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -#ifndef _JAVASOFT_JNI_MD_H_ -#define _JAVASOFT_JNI_MD_H_ - -#define JNIEXPORT __declspec(dllexport) -#define JNIIMPORT __declspec(dllimport) -#define JNICALL __stdcall - -typedef long jint; -typedef __int64 jlong; -typedef signed char jbyte; - -#endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/cpp/JavaWinampApi/wa_ipc.h b/cpp/JavaWinampApi/wa_ipc.h deleted file mode 100644 index 2ff4275..0000000 --- a/cpp/JavaWinampApi/wa_ipc.h +++ /dev/null @@ -1,1620 +0,0 @@ -/* -** Copyright (C) 2006 Nullsoft, Inc. -** -** This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held -** liable for any damages arising from the use of this software. -** -** Permission is granted to anyone to use this software for any purpose, including commercial applications, and to -** alter it and redistribute it freely, subject to the following restrictions: -** -** 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. -** If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -** -** 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -** -** 3. This notice may not be removed or altered from any source distribution. -** -*/ - -#ifndef _WA_IPC_H_ -#define _WA_IPC_H_ - -#include -#include -#if (_MSC_VER <= 1200) -typedef int intptr_t; -#endif -/* -** This is the modern replacement for the classic 'frontend.h'. Most of these -** updates are designed for in-process use, i.e. from a plugin. -** -*/ - -/* message used to sent many messages to winamp's main window. -** most all of the IPC_* messages involve sending the message in the form of: -** result = SendMessage(hwnd_winamp,WM_WA_IPC,(parameter),IPC_*); -** -** When you use SendMessage(hwnd_winamp,WM_WA_IPC,(parameter),IPC_*) and specify a IPC_* -** which is not currently implemented/supported by the Winamp version being used then it -** will return 1 for 'result'. This is a good way of helping to check if an api being -** used which returns a function pointer, etc is even going to be valid. -*/ -#define WM_WA_IPC WM_USER -/* but some of them use WM_COPYDATA. be afraid. -*/ - -#define WINAMP_VERSION_MAJOR(winampVersion) ((winampVersion & 0x0000FF00) >> 12) -#define WINAMP_VERSION_MINOR(winampVersion) (winampVersion & 0x000000FF) // returns, i.e. 0x12 for 5.12 and 0x10 for 5.1... - -#define IPC_GETVERSION 0 -/* int version = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETVERSION); -** -** The version returned will be 0x20yx for Winamp 2.yx. -** Versions previous to Winamp 2.0 typically (but not always) use 0x1zyx for 1.zx. -** Just a bit weird but that's the way it goes. -** -** For Winamp 5.x it uses the format 0x50yx for Winamp 5.yx -** e.g. 5.01 -> 0x5001 -** 5.09 -> 0x5009 -** 5.1 -> 0x5010 -** -** Notes: For 5.02 this api will return the same value as for a 5.01 build. -** For 5.07 this api will return the same value as for a 5.06 build. -*/ -#define IPC_GETVERSIONSTRING 1 - -#define IPC_GETREGISTEREDVERSION 770 - - -typedef struct { - const char *filename; - const char *title; - int length; -} enqueueFileWithMetaStruct; // send this to a IPC_PLAYFILE in a non WM_COPYDATA, -// and you get the nice desired result. if title is NULL, it is treated as a "thing", -// otherwise it's assumed to be a file (for speed) - -typedef struct { - const wchar_t *filename; - const wchar_t *title; - int length; -} enqueueFileWithMetaStructW; - -#define IPC_PLAYFILE 100 // dont be fooled, this is really the same as enqueufile -#define IPC_ENQUEUEFILE 100 -#define IPC_PLAYFILEW 1100 -/* This is sent as a WM_COPYDATA with IPC_PLAYFILE as the dwData member and the string -** of the file / playlist to be enqueued into the playlist editor as the lpData member. -** This will just enqueue the file or files since you can use this to enqueue a playlist. -** It will not clear the current playlist or change the playback state. -** -** COPYDATASTRUCT cds = {0}; -** cds.dwData = IPC_ENQUEUEFILE; -** cds.lpData = (void*)"c:\\test\\folder\\test.mp3"; -** cds.cbData = lstrlen((char*)cds.lpData)+1; // include space for null char -** SendMessage(hwnd_winamp,WM_COPYDATA,0,(LPARAM)&cds); -** -** -** With 2.9+ and all of the 5.x versions you can send this as a normal WM_WA_IPC -** (non WM_COPYDATA) with an enqueueFileWithMetaStruct as the param. -** If the title member is null then it is treated as a "thing" otherwise it will be -** assumed to be a file (for speed). -** -** enqueueFileWithMetaStruct eFWMS = {0}; -** eFWMS.filename = "c:\\test\\folder\\test.mp3"; -** eFWMS.title = "Whipping Good"; -** eFWMS.length = 300; // this is the number of seconds for the track -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)&eFWMS,IPC_ENQUEUEFILE); -*/ - - -#define IPC_DELETE 101 -#define IPC_DELETE_INT 1101 -/* SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_DELETE); -** Use this api to clear Winamp's internal playlist. -** You should not need to use IPC_DELETE_INT since it is used internally by Winamp when -** it is dealing with some lame Windows Explorer issues (hard to believe that!). -*/ - - -#define IPC_STARTPLAY 102 -#define IPC_STARTPLAY_INT 1102 -/* SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_STARTPLAY); -** Sending this will start playback and is almost the same as hitting the play button. -** The IPC_STARTPLAY_INT version is used internally and you should not need to use it -** since it won't be any fun. -*/ - -#define IPC_CHDIR 103 -/* This is sent as a WM_COPYDATA type message with IPC_CHDIR as the dwData value and the -** directory you want to change to as the lpData member. -** -** COPYDATASTRUCT cds = {0}; -** cds.dwData = IPC_CHDIR; -** cds.lpData = (void*)"c:\\download"; -** cds.cbData = lstrlen((char*)cds.lpData)+1; // include space for null char -** SendMessage(hwnd_winamp,WM_COPYDATA,0,(LPARAM)&cds); -** -** The above example will make Winamp change to the directory 'C:\download'. -*/ - - -#define IPC_ISPLAYING 104 -/* int res = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_ISPLAYING); -** This is sent to retrieve the current playback state of Winamp. -** If it returns 1, Winamp is playing. -** If it returns 3, Winamp is paused. -** If it returns 0, Winamp is not playing. -*/ - - -#define IPC_GETOUTPUTTIME 105 -/* int res = SendMessage(hwnd_winamp,WM_WA_IPC,mode,IPC_GETOUTPUTTIME); -** This api can return two different sets of information about current playback status. -** -** If mode = 0 then it will return the position (in ms) of the currently playing track. -** Will return -1 if Winamp is not playing. -** -** If mode = 1 then it will return the current track length (in seconds). -** Will return -1 if there are no tracks (or possibly if Winamp cannot get the length). -*/ - - - -#define IPC_JUMPTOTIME 106 -/* (requires Winamp 1.60+) -** SendMessage(hwnd_winamp,WM_WA_IPC,ms,IPC_JUMPTOTIME); -** This api sets the current position (in milliseconds) for the currently playing song. -** The resulting playback position may only be an approximate time since some playback -** formats do not provide exact seeking e.g. mp3 -** This returns -1 if Winamp is not playing, 1 on end of file, or 0 if it was successful. -*/ - -#define IPC_GETMODULENAME 109 -#define IPC_EX_ISRIGHTEXE 666 -/* usually shouldnt bother using these, but here goes: -** send a WM_COPYDATA with IPC_GETMODULENAME, and an internal -** flag gets set, which if you send a normal WM_WA_IPC message with -** IPC_EX_ISRIGHTEXE, it returns whether or not that filename -** matches. lame, I know. -*/ - -#define IPC_WRITEPLAYLIST 120 -/* (requires Winamp 1.666+) -** int cur = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_WRITEPLAYLIST); -** -** IPC_WRITEPLAYLIST will write the current playlist to '\\Winamp.m3u' and -** will also return the current playlist position (see IPC_GETLISTPOS). -** -** This is kinda obsoleted by some of the newer 2.x api items but it still is good for -** use with a front-end program (instead of a plug-in) and you want to see what is in the -** current playlist. -** -** This api will only save out extended file information in the #EXTINF entry if Winamp -** has already read the data such as if the file was played of scrolled into view. If -** Winamp has not read the data then you will only find the file with its filepath entry -** (as is the base requirements for a m3u playlist). -*/ - - -#define IPC_SETPLAYLISTPOS 121 -/* (requires Winamp 2.0+) -** SendMessage(hwnd_winamp,WM_WA_IPC,position,IPC_SETPLAYLISTPOS) -** IPC_SETPLAYLISTPOS sets the playlist position to the specified 'position'. -** It will not change playback status or anything else. It will just set the current -** position in the playlist and will update the playlist view if necessary. -** -** If you use SendMessage(hwnd_winamp,WM_COMMAND,MAKEWPARAM(WINAMP_BUTTON2,0),0); -** after using IPC_SETPLAYLISTPOS then Winamp will start playing the file at 'position'. -*/ - - -#define IPC_SETVOLUME 122 -/* (requires Winamp 2.0+) -** SendMessage(hwnd_winamp,WM_WA_IPC,volume,IPC_SETVOLUME); -** IPC_SETVOLUME sets the volume of Winamp (between the range of 0 to 255). -** -** If you pass 'volume' as -666 then the message will return the current volume. -** int curvol = SendMessage(hwnd_winamp,WM_WA_IPC,-666,IPC_SETVOLUME); -*/ - - -#define IPC_SETPANNING 123 -/* (requires Winamp 2.0+) -** SendMessage(hwnd_winamp,WM_WA_IPC,panning,IPC_SETPANNING); -** IPC_SETPANNING sets the panning of Winamp from 0 (left) to 255 (right). -** -** At least in 5.x+ this works from -127 (left) to 127 (right). -** -** If you pass 'panning' as -666 to this api then it will return the current panning. -** int curpan = SendMessage(hwnd_winamp,WM_WA_IPC,-666,IPC_SETPANNING); -*/ - - -#define IPC_GETLISTLENGTH 124 -/* (requires Winamp 2.0+) -** int length = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTLENGTH); -** IPC_GETLISTLENGTH returns the length of the current playlist as the number of tracks. -*/ - - -#define IPC_GETLISTPOS 125 -/* (requires Winamp 2.05+) -** int pos=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETLISTPOS); -** IPC_GETLISTPOS returns the current playlist position (which is shown in the playlist -** editor as a differently coloured text entry e.g is yellow for the classic skin). -** -** This api is a lot like IPC_WRITEPLAYLIST but a lot faster since it does not have to -** write out the whole of the current playlist first. -*/ - - -#define IPC_GETINFO 126 -/* (requires Winamp 2.05+) -** int inf=SendMessage(hwnd_winamp,WM_WA_IPC,mode,IPC_GETINFO); -** IPC_GETINFO returns info about the current playing song. The value -** it returns depends on the value of 'mode'. -** Mode Meaning -** ------------------ -** 0 Samplerate, in kilohertz (i.e. 44) -** 1 Bitrate (i.e. 128) -** 2 Channels (i.e. 2) -** 3 (5+) Video LOWORD=w HIWORD=h -** 4 (5+) > 65536, string (video description) -** 5 (5.25+) Samplerate, in hertz (i.e. 44100) -*/ - - -#define IPC_GETEQDATA 127 -/* (requires Winamp 2.05+) -** int data=SendMessage(hwnd_winamp,WM_WA_IPC,pos,IPC_GETEQDATA); -** IPC_GETEQDATA queries the status of the EQ. -** The value returned depends on what 'pos' is set to: -** Value Meaning -** ------------------ -** 0-9 The 10 bands of EQ data. 0-63 (+20db - -20db) -** 10 The preamp value. 0-63 (+20db - -20db) -** 11 Enabled. zero if disabled, nonzero if enabled. -** 12 Autoload. zero if disabled, nonzero if enabled. -*/ - - -#define IPC_SETEQDATA 128 -/* (requires Winamp 2.05+) -** SendMessage(hwnd_winamp,WM_WA_IPC,pos,IPC_GETEQDATA); -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SETEQDATA); -** IPC_SETEQDATA sets the value of the last position retrieved -** by IPC_GETEQDATA. This is pretty lame, and we should provide -** an extended version that lets you do a MAKELPARAM(pos,value). -** someday... - - new (2.92+): - if the high byte is set to 0xDB, then the third byte specifies - which band, and the bottom word specifies the value. -*/ - -#define IPC_ADDBOOKMARK 129 -#define IPC_ADDBOOKMARKW 131 -/* (requires Winamp 2.4+) -** This is sent as a WM_COPYDATA using IPC_ADDBOOKMARK as the dwData value and the -** directory you want to change to as the lpData member. This will add the specified -** file / url to the Winamp bookmark list. -** -** COPYDATASTRUCT cds = {0}; -** cds.dwData = IPC_ADDBOOKMARK; -** cds.lpData = (void*)"http://www.blah.com/listen.pls"; -** cds.cbData = lstrlen((char*)cds.lpData)+1; // include space for null char -** SendMessage(hwnd_winamp,WM_COPYDATA,0,(LPARAM)&cds); -** -** -** In Winamp 5.0+ we use this as a normal WM_WA_IPC and the string is null separated as -** the filename and then the title of the entry. -** -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)(char*)"filename\0title\0",IPC_ADDBOOKMARK); -** -** This will notify the library / bookmark editor that a bookmark was added. -** Note that using this message in this context does not actually add the bookmark. -** Do not use, it is essentially just a notification type message :) -*/ - - -#define IPC_INSTALLPLUGIN 130 -/* This is not implemented (and is very unlikely to be done due to safety concerns). -** If it was then you could do a WM_COPYDATA with a path to a .wpz and it would then -** install the plugin for you. -** -** COPYDATASTRUCT cds = {0}; -** cds.dwData = IPC_INSTALLPLUGIN; -** cds.lpData = (void*)"c:\\path\\to\\file.wpz"; -** cds.cbData = lstrlen((char*)cds.lpData)+1; // include space for null char -** SendMessage(hwnd_winamp,WM_COPYDATA,0,(LPARAM)&cds); -*/ - - -#define IPC_RESTARTWINAMP 135 -/* (requires Winamp 2.2+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_RESTARTWINAMP); -** IPC_RESTARTWINAMP will restart Winamp (isn't that obvious ? :) ) -** If this fails to make Winamp start after closing then there is a good chance one (or -** more) of the currently installed plugins caused Winamp to crash on exit (either as a -** silent crash or a full crash log report before it could call itself start again. -*/ - - -#define IPC_ISFULLSTOP 400 -/* (requires winamp 2.7+ I think) -** int ret=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_ISFULLSTOP); -** This is useful for when you're an output plugin and you want to see if the stop/close -** happening is a full stop or if you are just between tracks. This returns non zero if -** it is a full stop or zero if it is just a new track. -*/ - - -#define IPC_INETAVAILABLE 242 -/* (requires Winamp 2.05+) -** int val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_INETAVAILABLE); -** IPC_INETAVAILABLE will return 1 if an Internet connection is available for Winamp and -** relates to the internet connection type setting on the main general preferences page -** in the Winamp preferences. -*/ - - -#define IPC_UPDTITLE 243 -/* (requires Winamp 2.2+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_UPDTITLE); -** IPC_UPDTITLE will ask Winamp to update the information about the current title and -** causes GetFileInfo(..) in the input plugin associated with the current playlist entry -** to be called. This can be called such as when an input plugin is buffering a file so -** that it can cause the buffer percentage to appear in the playlist. -*/ - - -#define IPC_REFRESHPLCACHE 247 -/* (requires Winamp 2.2+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_REFRESHPLCACHE); -** IPC_REFRESHPLCACHE will flush the playlist cache buffer and you send this if you want -** Winamp to go refetch the titles for all of the entries in the current playlist. - -5.3+: pass a wchar_t * string in wParam, and it'll do a strnicmp() before clearing the cache -*/ - - -#define IPC_GET_SHUFFLE 250 -/* (requires Winamp 2.4+) -** int val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_SHUFFLE); -** IPC_GET_SHUFFLE returns the status of the shuffle option. -** If set then it will return 1 and if not set then it will return 0. -*/ - - -#define IPC_GET_REPEAT 251 -/* (requires Winamp 2.4+) -** int val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_REPEAT); -** IPC_GET_REPEAT returns the status of the repeat option. -** If set then it will return 1 and if not set then it will return 0. -*/ - - -#define IPC_SET_SHUFFLE 252 -/* (requires Winamp 2.4+) -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SET_SHUFFLE); -** IPC_SET_SHUFFLE sets the status of the shuffle option. -** If 'value' is 1 then shuffle is turned on. -** If 'value' is 0 then shuffle is turned off. -*/ - - -#define IPC_SET_REPEAT 253 -/* (requires Winamp 2.4+) -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SET_REPEAT); -** IPC_SET_REPEAT sets the status of the repeat option. -** If 'value' is 1 then shuffle is turned on. -** If 'value' is 0 then shuffle is turned off. -*/ - - -#define IPC_ENABLEDISABLE_ALL_WINDOWS 259 // 0xdeadbeef to disable -/* (requires Winamp 2.9+) -** SendMessage(hwnd_winamp,WM_WA_IPC,(enable?0:0xdeadbeef),IPC_ENABLEDISABLE_ALL_WINDOWS); -** Sending this message with 0xdeadbeef as the param will disable all winamp windows and -** any other values will enable all of the Winamp windows again. When disabled you won't -** get any response on clicking or trying to do anything to the Winamp windows. If the -** taskbar icon is shown then you may still have control ;) -*/ - - -#define IPC_GETWND 260 -/* (requires Winamp 2.9+) -** HWND h=SendMessage(hwnd_winamp,WM_WA_IPC,IPC_GETWND_xxx,IPC_GETWND); -** returns the HWND of the window specified. -*/ - #define IPC_GETWND_EQ 0 // use one of these for the param - #define IPC_GETWND_PE 1 - #define IPC_GETWND_MB 2 - #define IPC_GETWND_VIDEO 3 -#define IPC_ISWNDVISIBLE 261 // same param as IPC_GETWND - - - - -/************************************************************************ -***************** in-process only (WE LOVE PLUGINS) -************************************************************************/ - -#define IPC_SETSKINW 199 -#define IPC_SETSKIN 200 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)"skinname",IPC_SETSKIN); -** IPC_SETSKIN sets the current skin to "skinname". Note that skinname -** can be the name of a skin, a skin .zip file, with or without path. -** If path isn't specified, the default search path is the winamp skins -** directory. -*/ - - -#define IPC_GETSKIN 201 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)skinname_buffer,IPC_GETSKIN); -** IPC_GETSKIN puts the directory where skin bitmaps can be found -** into skinname_buffer. -** skinname_buffer must be MAX_PATH characters in length. -** When using a .zip'd skin file, it'll return a temporary directory -** where the ZIP was decompressed. -*/ - - -#define IPC_EXECPLUG 202 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)"vis_file.dll",IPC_EXECPLUG); -** IPC_EXECPLUG executes a visualization plug-in pointed to by WPARAM. -** the format of this string can be: -** "vis_whatever.dll" -** "vis_whatever.dll,0" // (first mod, file in winamp plug-in dir) -** "C:\\dir\\vis_whatever.dll,1" -*/ - - -#define IPC_GETPLAYLISTFILE 211 -#define IPC_GETPLAYLISTFILEW 214 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTFILE); -** IPC_GETPLAYLISTFILE gets the filename of the playlist entry [index]. -** returns a pointer to it. returns NULL on error. -*/ - - -#define IPC_GETPLAYLISTTITLE 212 -#define IPC_GETPLAYLISTTITLEW 213 -/* (requires Winamp 2.04+, only usable from plug-ins (not external apps)) -** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTTITLE); -** -** IPC_GETPLAYLISTTITLE gets the title of the playlist entry [index]. -** returns a pointer to it. returns NULL on error. -*/ - - -#define IPC_GETHTTPGETTER 240 -/* retrieves a function pointer to a HTTP retrieval function. -** if this is unsupported, returns 1 or 0. -** the function should be: -** int (*httpRetrieveFile)(HWND hwnd, char *url, char *file, char *dlgtitle); -** if you call this function, with a parent window, a URL, an output file, and a dialog title, -** it will return 0 on successful download, 1 on error. -*/ - - -#define IPC_MBOPEN 241 -/* (requires Winamp 2.05+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_MBOPEN); -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)url,IPC_MBOPEN); -** IPC_MBOPEN will open a new URL in the minibrowser. if url is NULL, it will open the Minibrowser window. -*/ - - - -#define IPC_CHANGECURRENTFILE 245 -/* (requires Winamp 2.05+) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)file,IPC_CHANGECURRENTFILE); -** IPC_CHANGECURRENTFILE will set the current playlist item. -*/ - -#define IPC_CHANGECURRENTFILEW 1245 -/* (requires Winamp 2.05+) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)file,IPC_CHANGECURRENTFILEW); -** IPC_CHANGECURRENTFILEW will set the current playlist item. -*/ - - -#define IPC_GETMBURL 246 -/* (requires Winamp 2.2+) -** char buffer[4096]; // Urls can be VERY long -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)buffer,IPC_GETMBURL); -** IPC_GETMBURL will retrieve the current Minibrowser URL into buffer. -** buffer must be at least 4096 bytes long. -*/ - - -#define IPC_MBBLOCK 248 -/* (requires Winamp 2.4+) -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_MBBLOCK); -** -** IPC_MBBLOCK will block the Minibrowser from updates if value is set to 1 -*/ - -#define IPC_MBOPENREAL 249 -/* (requires Winamp 2.4+) -** SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)url,IPC_MBOPENREAL); -** -** IPC_MBOPENREAL works the same as IPC_MBOPEN except that it will works even if -** IPC_MBBLOCK has been set to 1 -*/ - -#define IPC_ADJUST_OPTIONSMENUPOS 280 -/* (requires Winamp 2.9+) -** int newpos=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)adjust_offset,IPC_ADJUST_OPTIONSMENUPOS); -** moves where winamp expects the Options menu in the main menu. Useful if you wish to insert a -** menu item above the options/skins/vis menus. -*/ - -#define IPC_GET_HMENU 281 -/* (requires Winamp 2.9+) -** HMENU hMenu=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GET_HMENU); -** values for data: -** 0 : main popup menu -** 1 : main menubar file menu -** 2 : main menubar options menu -** 3 : main menubar windows menu -** 4 : main menubar help menu -** other values will return NULL. -*/ - -#define IPC_GET_EXTENDED_FILE_INFO 290 //pass a pointer to the following struct in wParam -#define IPC_GET_EXTENDED_FILE_INFO_HOOKABLE 296 -/* (requires Winamp 2.9+) -** to use, create an extendedFileInfoStruct, point the values filename and metadata to the -** filename and metadata field you wish to query, and ret to a buffer, with retlen to the -** length of that buffer, and then SendMessage(hwnd_winamp,WM_WA_IPC,&struct,IPC_GET_EXTENDED_FILE_INFO); -** the results should be in the buffer pointed to by ret. -** returns 1 if the decoder supports a getExtendedFileInfo method -*/ -typedef struct { - const char *filename; - const char *metadata; - char *ret; - size_t retlen; -} extendedFileInfoStruct; - - -#define IPC_GET_BASIC_FILE_INFO 291 //pass a pointer to the following struct in wParam -typedef struct { - const char *filename; - - int quickCheck; // set to 0 to always get, 1 for quick, 2 for default (if 2, quickCheck will be set to 0 if quick wasnot used) - - // filled in by winamp - int length; - char *title; - int titlelen; -} basicFileInfoStruct; - -#define IPC_GET_BASIC_FILE_INFOW 1291 //pass a pointer to the following struct in wParam -typedef struct { - const wchar_t *filename; - - int quickCheck; // set to 0 to always get, 1 for quick, 2 for default (if 2, quickCheck will be set to 0 if quick wasnot used) - - // filled in by winamp - int length; - wchar_t *title; - int titlelen; -} basicFileInfoStructW; - - -#define IPC_GET_EXTLIST 292 //returns doublenull delimited. GlobalFree() it when done. if data is 0, returns raw extlist, if 1, returns something suitable for getopenfilename -#define IPC_GET_EXTLISTW 1292 // wide char version of above - -#define IPC_INFOBOX 293 -typedef struct { - HWND parent; - char *filename; -} infoBoxParam; - -#define IPC_INFOBOXW 1293 -typedef struct { - HWND parent; - const wchar_t *filename; -} infoBoxParamW; - -#define IPC_SET_EXTENDED_FILE_INFO 294 //pass a pointer to the a extendedFileInfoStruct in wParam -/* (requires Winamp 2.9+) -** to use, create an extendedFileInfoStruct, point the values filename and metadata to the -** filename and metadata field you wish to write in ret. (retlen is not used). and then -** SendMessage(hwnd_winamp,WM_WA_IPC,&struct,IPC_SET_EXTENDED_FILE_INFO); -** returns 1 if the metadata is supported -** Call IPC_WRITE_EXTENDED_FILE_INFO once you're done setting all the metadata you want to update -*/ - -#define IPC_WRITE_EXTENDED_FILE_INFO 295 -/* (requires Winamp 2.9+) -** writes all the metadata set thru IPC_SET_EXTENDED_FILE_INFO to the file -** returns 1 if the file has been successfully updated, 0 if error -*/ - -#define IPC_FORMAT_TITLE 297 -typedef struct -{ - char *spec; // NULL=default winamp spec - void *p; - - char *out; - int out_len; - - char * (*TAGFUNC)(const char * tag, void * p); //return 0 if not found - void (*TAGFREEFUNC)(char * tag,void * p); -} waFormatTitle; - -#define IPC_FORMAT_TITLE_EXTENDED 298 // similiar to IPC_FORMAT_TITLE, but falls back to Winamp's %tags% if your passed tag function doesn't handle it -typedef struct -{ - const wchar_t *filename; - int useExtendedInfo; // set to 1 if you want the Title Formatter to query the input plugins for any tags that your tag function fails on - const wchar_t *spec; // NULL=default winamp spec - void *p; - - wchar_t *out; - int out_len; - - wchar_t * (*TAGFUNC)(const wchar_t * tag, void * p); //return 0 if not found, -1 for empty tag - void (*TAGFREEFUNC)(wchar_t *tag, void *p); -} waFormatTitleExtended; - -#define IPC_COPY_EXTENDED_FILE_INFO 299 -typedef struct -{ - const char *source; - const char *dest; -} copyFileInfoStruct; - -#define IPC_COPY_EXTENDED_FILE_INFOW 1299 -typedef struct -{ - const wchar_t *source; - const wchar_t *dest; -} copyFileInfoStructW; - - -#define IPC_GETUNCOMPRESSINTERFACE 331 -/* returns a function pointer to uncompress(). -** int (*uncompress)(unsigned char *dest, unsigned long *destLen, const unsigned char *source, unsigned long sourceLen); -** right out of zlib, useful for decompressing zlibbed data. -** if you pass the parm of 0x10100000, it will return a wa_inflate_struct * to an inflate API. -*/ - -typedef struct { - int (*inflateReset)(void *strm); - int (*inflateInit_)(void *strm,const char *version, int stream_size); - int (*inflate)(void *strm, int flush); - int (*inflateEnd)(void *strm); - unsigned long (*crc32)(unsigned long crc, const unsigned char *buf, unsigned int len); -} wa_inflate_struct; - - -#define IPC_ADD_PREFS_DLG 332 -#define IPC_REMOVE_PREFS_DLG 333 -/* (requires Winamp 2.9+) -** to use, allocate a prefsDlgRec structure (either on the heap or some global -** data, but NOT on the stack), initialze the members: -** hInst to the DLL instance where the resource is located -** dlgID to the ID of the dialog, -** proc to the window procedure for the dialog -** name to the name of the prefs page in the prefs. -** where to 0 (eventually we may add more options) -** then, SendMessage(hwnd_winamp,WM_WA_IPC,&prefsRec,IPC_ADD_PREFS_DLG); -** -** you can also IPC_REMOVE_PREFS_DLG with the address of the same prefsRec, -** but you shouldn't really ever have to. -** -*/ -#define IPC_OPENPREFSTOPAGE 380 // pass an id of a builtin page, or a &prefsDlgRec of prefs page to open - -typedef struct _prefsDlgRec { - HINSTANCE hInst; - int dlgID; - void *proc; - - char *name; - intptr_t where; // 0 for options, 1 for plugins, 2 for skins, 3 for bookmarks, 4 for prefs - - intptr_t _id; - struct _prefsDlgRec *next; -} prefsDlgRec; - - -#define IPC_GETINIFILE 334 // returns a pointer to winamp.ini -#define IPC_GETINIDIRECTORY 335 // returns a pointer to the directory to put config files in (if you dont want to use winamp.ini) -#define IPC_GETPLUGINDIRECTORY 336 -#define IPC_GETM3UDIRECTORY 337 // returns a char pointer to the directory where winamp.m3u is stored in. -#define IPC_GETM3UDIRECTORYW 338 // returns a wchar_t pointer to the directory where winamp.m3u is stored in. - -#define IPC_SPAWNBUTTONPOPUP 361 // param = -// 0 = eject -// 1 = previous -// 2 = next -// 3 = pause -// 4 = play -// 5 = stop - -#define IPC_OPENURLBOX 360 // pass a HWND to a parent, returns a HGLOBAL that needs to be freed with GlobalFree(), if successful -#define IPC_OPENFILEBOX 362 // pass a HWND to a parent -#define IPC_OPENDIRBOX 363 // pass a HWND to a parent - -// pass an HWND to a parent. call this if you take over the whole UI so that the dialogs are not appearing on the -// bottom right of the screen since the main winamp window is at 3000x3000, call again with NULL to reset -#define IPC_SETDIALOGBOXPARENT 364 - - - -#define IPC_DRO_MIN 401 // reserved for DrO -#define IPC_SET_JTF_COMPARATOR 409 -/* pass me an int (__cdecl *)(const char *, const char *) in wParam */ -#define IPC_SET_JTF_COMPARATOR_W 410 -/* pass me an int (__cdecl *)(const wchar_t *, const wchar_t *) in wParam ... maybe someday :) */ -#define IPC_SET_JTF_DRAWTEXT 416 - -#define IPC_DRO_MAX 499 - - -// pass 0 for a copy of the skin HBITMAP -// pass 1 for name of font to use for playlist editor likeness -// pass 2 for font charset -// pass 3 for font size -#define IPC_GET_GENSKINBITMAP 503 - - -#define IPC_GET_EMBEDIF 505 // pass an embedWindowState -// returns an HWND embedWindow(embedWindowState *); if the data is NULL, otherwise returns the HWND directly -typedef struct -{ - HWND me; //hwnd of the window - - int flags; - - RECT r; - - void *user_ptr; // for application use - - intptr_t extra_data[64]; // for internal winamp use -} embedWindowState; - -#define EMBED_FLAGS_NORESIZE 0x1 // set this bit in embedWindowState.flags to keep window from being resizable -#define EMBED_FLAGS_NOTRANSPARENCY 0x2 // set this bit in embedWindowState.flags to make gen_ff turn transparency off for this wnd -#define EMBED_FLAGS_NOWINDOWMENU 0x4 // set this bit to prevent gen_ff from automatically adding your window to the right-click menu -#define EMBED_FLAGS_GUID 0x8 // call SET_EMBED_GUID(yourEmbedWindowStateStruct, GUID) to define a GUID for this window - -#define SET_EMBED_GUID(windowState, windowGUID) { windowState->flags |= EMBED_FLAGS_GUID; *((GUID *)&windowState->extra_data[4])=windowGUID; } -#define GET_EMBED_GUID(windowState) (*((GUID *)&windowState->extra_data[4])) - -#define IPC_EMBED_ENUM 532 -typedef struct embedEnumStruct -{ - int (*enumProc)(embedWindowState *ws, struct embedEnumStruct *param); // return 1 to abort - int user_data; // or more :) -} embedEnumStruct; - // pass - -#define IPC_EMBED_ISVALID 533 - -#define IPC_CONVERTFILE 506 -/* (requires Winamp 2.92+) -** Converts a given file to a different format (PCM, MP3, etc...) -** To use, pass a pointer to a waFileConvertStruct struct -** This struct can be either on the heap or some global -** data, but NOT on the stack. At least, until the conversion is done. -** -** eg: SendMessage(hwnd_winamp,WM_WA_IPC,&myConvertStruct,IPC_CONVERTFILE); -** -** Return value: -** 0: Can't start the conversion. Look at myConvertStruct->error for details. -** 1: Conversion started. Status messages will be sent to the specified callbackhwnd. -** Be sure to call IPC_CONVERTFILE_END when your callback window receives the -** IPC_CB_CONVERT_DONE message. -*/ -typedef struct -{ - char *sourcefile; // "c:\\source.mp3" - char *destfile; // "c:\\dest.pcm" - int destformat[8]; // like 'PCM ',srate,nch,bps. - //hack alert! you can set destformat[6]=mmioFOURCC('I','N','I',' '); and destformat[7]=(int)my_ini_file; (where my_ini_file is a char*) - HWND callbackhwnd; // window that will receive the IPC_CB_CONVERT notification messages - - //filled in by winamp.exe - char *error; //if IPC_CONVERTFILE returns 0, the reason will be here - - int bytes_done; //you can look at both of these values for speed statistics - int bytes_total; - int bytes_out; - - int killswitch; // don't set it manually, use IPC_CONVERTFILE_END - intptr_t extra_data[64]; // for internal winamp use -} convertFileStruct; - -#define IPC_CONVERTFILE_END 507 -/* (requires Winamp 2.92+) -** Stop/ends a convert process started from IPC_CONVERTFILE -** You need to call this when you receive the IPC_CB_CONVERTDONE message or when you -** want to abort a conversion process -** -** eg: SendMessage(hwnd_winamp,WM_WA_IPC,&myConvertStruct,IPC_CONVERTFILE_END); -** -** No return value -*/ - -typedef struct { - HWND hwndParent; - int format; - - //filled in by winamp.exe - HWND hwndConfig; - int extra_data[8]; - //hack alert! you can set extra_data[6]=mmioFOURCC('I','N','I',' '); and extra_data[7]=(int)my_ini_file; (where my_ini_file is a char*) -} convertConfigStruct; -#define IPC_CONVERT_CONFIG 508 -#define IPC_CONVERT_CONFIG_END 509 - -typedef struct -{ - void (*enumProc)(intptr_t user_data, const char *desc, int fourcc); - intptr_t user_data; -} converterEnumFmtStruct; -#define IPC_CONVERT_CONFIG_ENUMFMTS 510 -/* (requires Winamp 2.92+) -*/ - -typedef struct -{ - char cdletter; - char *playlist_file; - HWND callback_hwnd; - - //filled in by winamp.exe - char *error; -} burnCDStruct; -#define IPC_BURN_CD 511 -/* (requires Winamp 5.0+) -*/ - -typedef struct -{ - convertFileStruct *cfs; - int priority; -} convertSetPriority; -#define IPC_CONVERT_SET_PRIORITY 512 - -typedef struct -{ - unsigned int format; //fourcc value - char *item; // config item, eg "bitrate" - char *data; // buffer to recieve, or buffer that contains the data - int len; // length of the data buffer (only used when getting a config item) - char *configfile; // config file to read from -} convertConfigItem; - -#define IPC_CONVERT_CONFIG_SET_ITEM 513 // returns TRUE if successful -#define IPC_CONVERT_CONFIG_GET_ITEM 514 // returns TRUE if successful - -typedef struct -{ - const char *filename; - char *title; // 2048 bytes - int length; - int force_useformatting; // can set this to 1 if you want to force a url to use title formatting shit -} waHookTitleStruct; -// return TRUE if you hook this -#define IPC_HOOK_TITLES 850 - -typedef struct -{ - const wchar_t *filename; - wchar_t *title; // 2048 bytes - int length; - int force_useformatting; // can set this to 1 if you want to force a url to use title formatting shit -} waHookTitleStructW; -// return TRUE if you hook this -#define IPC_HOOK_TITLESW 851 - -#define IPC_GETSADATAFUNC 800 -// 0: returns a char *export_sa_get() that returns 150 bytes of data -// 1: returns a export_sa_setreq(int want); - -#define IPC_GETVUDATAFUNC 801 -// 0: returns a int export_vu_get(int channel) that returns 0-255 (or -1 for bad channel) - -#define IPC_ISMAINWNDVISIBLE 900 - - -#define IPC_SETPLEDITCOLORS 920 -typedef struct -{ - int numElems; - int *elems; - HBITMAP bm; // set if you want to override -} waSetPlColorsStruct; - - -// the following IPC use waSpawnMenuParms as parameter -#define IPC_SPAWNEQPRESETMENU 933 -#define IPC_SPAWNFILEMENU 934 //menubar -#define IPC_SPAWNOPTIONSMENU 935 //menubar -#define IPC_SPAWNWINDOWSMENU 936 //menubar -#define IPC_SPAWNHELPMENU 937 //menubar -#define IPC_SPAWNPLAYMENU 938 //menubar -#define IPC_SPAWNPEFILEMENU 939 //menubar -#define IPC_SPAWNPEPLAYLISTMENU 940 //menubar -#define IPC_SPAWNPESORTMENU 941 //menubar -#define IPC_SPAWNPEHELPMENU 942 //menubar -#define IPC_SPAWNMLFILEMENU 943 //menubar -#define IPC_SPAWNMLVIEWMENU 944 //menubar -#define IPC_SPAWNMLHELPMENU 945 //menubar -#define IPC_SPAWNPELISTOFPLAYLISTS 946 - -typedef struct -{ - HWND wnd; - int xpos; // in screen coordinates - int ypos; -} waSpawnMenuParms; - -// waSpawnMenuParms2 is used by the menubar submenus -typedef struct -{ - HWND wnd; - int xpos; // in screen coordinates - int ypos; - int width; - int height; -} waSpawnMenuParms2; - - -// system tray sends this (you might want to simulate it) -#define WM_WA_SYSTRAY WM_USER+1 - -// input plugins send this when they are done playing back -#define WM_WA_MPEG_EOF WM_USER+2 - - - -//// video stuff - -#define IPC_IS_PLAYING_VIDEO 501 // returns >1 if playing, 0 if not, 1 if old version (so who knows):) -#define IPC_GET_IVIDEOOUTPUT 500 // see below for IVideoOutput interface -#define VIDEO_MAKETYPE(A,B,C,D) ((A) | ((B)<<8) | ((C)<<16) | ((D)<<24)) -#define VIDUSER_SET_INFOSTRING 0x1000 -#define VIDUSER_GET_VIDEOHWND 0x1001 -#define VIDUSER_SET_VFLIP 0x1002 -#define VIDUSER_SET_TRACKSELINTERFACE 0x1003 // give your ITrackSelector interface as param2 -#define VIDUSER_OPENVIDEORENDERER 0x1004 -#define VIDUSER_CLOSEVIDEORENDERER 0x1005 -#define VIDUSER_GETPOPUPMENU 0x1006 - -typedef struct -{ - int w; - int h; - int vflip; - double aspectratio; - unsigned int fmt; -} VideoOpenStruct; - -#ifndef NO_IVIDEO_DECLARE -#ifdef __cplusplus - -class VideoOutput; -class SubsItem; - -#ifndef _NSV_DEC_IF_H_ -typedef struct { - unsigned char* baseAddr; - long rowBytes; -} YV12_PLANE; - -typedef struct { - YV12_PLANE y; - YV12_PLANE u; - YV12_PLANE v; -} YV12_PLANES; -#endif - -class IVideoOutput -{ - public: - virtual ~IVideoOutput() { } - virtual int open(int w, int h, int vflip, double aspectratio, unsigned int fmt)=0; - virtual void setcallback(LRESULT (*msgcallback)(void *token, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam), void *token) { (void)token; (void)msgcallback; /* to eliminate warning C4100 */ } - virtual void close()=0; - virtual void draw(void *frame)=0; - virtual void drawSubtitle(SubsItem *item) { } - virtual void showStatusMsg(const char *text) { } - virtual int get_latency() { return 0; } - virtual void notifyBufferState(int bufferstate) { } /* 0-255*/ - - virtual INT_PTR extended(INT_PTR param1, INT_PTR param2, INT_PTR param3) { return 0; } // Dispatchable, eat this! -}; - -class ITrackSelector -{ - public: - virtual int getNumAudioTracks()=0; - virtual void enumAudioTrackName(int n, const char *buf, int size)=0; - virtual int getCurAudioTrack()=0; - virtual int getNumVideoTracks()=0; - virtual void enumVideoTrackName(int n, const char *buf, int size)=0; - virtual int getCurVideoTrack()=0; - - virtual void setAudioTrack(int n)=0; - virtual void setVideoTrack(int n)=0; -}; - -#endif //cplusplus -#endif//NO_IVIDEO_DECLARE - -// these messages are callbacks that you can grab by subclassing the winamp window - -// wParam = -#define IPC_CB_WND_EQ 0 // use one of these for the param -#define IPC_CB_WND_PE 1 -#define IPC_CB_WND_MB 2 -#define IPC_CB_WND_VIDEO 3 -#define IPC_CB_WND_MAIN 4 - -#define IPC_CB_ONSHOWWND 600 -#define IPC_CB_ONHIDEWND 601 - -#define IPC_CB_GETTOOLTIP 602 - -#define IPC_CB_MISC 603 - #define IPC_CB_MISC_TITLE 0 - #define IPC_CB_MISC_VOLUME 1 // volume/pan - #define IPC_CB_MISC_STATUS 2 - #define IPC_CB_MISC_EQ 3 - #define IPC_CB_MISC_INFO 4 - #define IPC_CB_MISC_VIDEOINFO 5 - -#define IPC_CB_CONVERT_STATUS 604 // param value goes from 0 to 100 (percent) -#define IPC_CB_CONVERT_DONE 605 - -#define IPC_ADJUST_FFWINDOWSMENUPOS 606 -/* (requires Winamp 2.9+) -** int newpos=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)adjust_offset,IPC_ADJUST_FFWINDOWSMENUPOS); -** moves where winamp expects the freeform windows in the menubar windows main menu. Useful if you wish to insert a -** menu item above extra freeform windows. -*/ - -#define IPC_ISDOUBLESIZE 608 - -#define IPC_ADJUST_FFOPTIONSMENUPOS 609 -/* (requires Winamp 2.9+) -** int newpos=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)adjust_offset,IPC_ADJUST_FFOPTIONSMENUPOS); -** moves where winamp expects the freeform preferences item in the menubar windows main menu. Useful if you wish to insert a -** menu item above preferences item. -*/ - -#define IPC_GETTIMEDISPLAYMODE 610 // returns 0 if displaying elapsed time or 1 if displaying remaining time - -#define IPC_SETVISWND 611 // param is hwnd, setting this allows you to receive ID_VIS_NEXT/PREVOUS/RANDOM/FS wm_commands -#define ID_VIS_NEXT 40382 -#define ID_VIS_PREV 40383 -#define ID_VIS_RANDOM 40384 -#define ID_VIS_FS 40389 -#define ID_VIS_CFG 40390 -#define ID_VIS_MENU 40391 - -#define IPC_GETVISWND 612 // returns the vis cmd handler hwnd -#define IPC_ISVISRUNNING 613 -#define IPC_CB_VISRANDOM 628 // param is status of random - -#define IPC_SETIDEALVIDEOSIZE 614 // sent by winamp to winamp, trap it if you need it. width=HIWORD(param), height=LOWORD(param) - -#define IPC_GETSTOPONVIDEOCLOSE 615 -#define IPC_SETSTOPONVIDEOCLOSE 616 - -typedef struct { - HWND hwnd; - int uMsg; - WPARAM wParam; - LPARAM lParam; -} transAccelStruct; - -#define IPC_TRANSLATEACCELERATOR 617 - -typedef struct { - int cmd; - int x; - int y; - int align; -} windowCommand; // send this as param to an IPC_PLCMD, IPC_MBCMD, IPC_VIDCMD - -#define IPC_CB_ONTOGGLEAOT 618 - -#define IPC_GETPREFSWND 619 - -#define IPC_SET_PE_WIDTHHEIGHT 620 // data is a pointer to a POINT structure that holds width & height - -#define IPC_GETLANGUAGEPACKINSTANCE 621 - -#define IPC_CB_PEINFOTEXT 622 // data is a string, ie: "04:21/45:02" - -#define IPC_CB_OUTPUTCHANGED 623 // output plugin was changed in config - -#define IPC_GETOUTPUTPLUGIN 625 - -#define IPC_SETDRAWBORDERS 626 -#define IPC_DISABLESKINCURSORS 627 -#define IPC_CB_RESETFONT 629 - -#define IPC_IS_FULLSCREEN 630 // returns 1 if video or vis is in fullscreen mode -#define IPC_SET_VIS_FS_FLAG 631 // a vis should send this message with 1/as param to notify winamp that it has gone to or has come back from fullscreen mode - -#define IPC_SHOW_NOTIFICATION 632 - -#define IPC_GETSKININFO 633 - -#define IPC_GET_MANUALPLADVANCE 634 -/* (requires Winamp 5.03+) -** val=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_MANUALPLADVANCE); -** -** IPC_GET_MANUALPLADVANCE returns the status of the Manual Playlist Advance (1 if set) -*/ - -#define IPC_SET_MANUALPLADVANCE 635 -/* (requires Winamp 5.03+) -** SendMessage(hwnd_winamp,WM_WA_IPC,value,IPC_SET_MANUALPLADVANCE); -** -** IPC_SET_MANUALPLADVANCE sets the status of the Manual Playlist Advance option (1 to turn it on) -*/ - -#define IPC_GET_NEXT_PLITEM 636 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_EOF_GET_NEXT_PLITEM); -** -** Sent to Winamp's main window when an item has just finished playback or the next button has been pressed and -** requesting the new playlist item number to go to. -** Mainly used by gen_jumpex. Subclass this message in your application to return the new item number. -** -1 for normal winamp operation (default) or the new item number in the playlist to play. -*/ - -#define IPC_GET_PREVIOUS_PLITEM 637 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_EOF_GET_PREVIOUS_PLITEM); -** -** Sent to Winamp's main window when the previous button has been pressed and Winamp is requesting the new playlist item number to go to. -** Mainly used by gen_jumpex. Subclass this message in your application to return the new item number. -** -1 for normal winamp operation (default) or the new item number in the playlist to play. -*/ - -#define IPC_IS_WNDSHADE 638 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,wnd,IPC_IS_WNDSHADE); -** -** 'wnd' is window id as defined for IPC_GETWND, or -1 for main window -** Returns 1 if wnd is set to winshade mode, or 0 if it is not -*/ - -#define IPC_SETRATING 639 -/* (requires Winamp 5.04+ with ML) -** SendMessage(hwnd_winamp,WM_WA_IPC,rating,IPC_SETRATING); -** 'rating' is an int value from 0 (no rating) to 5 -*/ - -#define IPC_GETRATING 640 -/* (requires Winamp 5.04+ with ML) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETRATING); -** returns the current item's rating -*/ - -#define IPC_GETNUMAUDIOTRACKS 641 -/* (requires Winamp 5.04+) -** int n = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETNUMAUDIOTRACKS); -** returns the number of audio tracks for the currently playing item -*/ - -#define IPC_GETNUMVIDEOTRACKS 642 -/* (requires Winamp 5.04+) -** int n = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETNUMVIDEOTRACKS); -** returns the number of video tracks for the currently playing item -*/ - -#define IPC_GETAUDIOTRACK 643 -/* (requires Winamp 5.04+) -** int cur = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETAUDIOTRACK); -** returns the id of the current audio track for the currently playing item -*/ - -#define IPC_GETVIDEOTRACK 644 -/* (requires Winamp 5.04+) -** int cur = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETVIDEOTRACK); -** returns the id of the current video track for the currently playing item -*/ - -#define IPC_SETAUDIOTRACK 645 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,track,IPC_SETAUDIOTRACK); -** switch the currently playing item to a new audio track -*/ - -#define IPC_SETVIDEOTRACK 646 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,track,IPC_SETVIDEOTRACK); -** switch the currently playing item to a new video track -*/ - -#define IPC_PUSH_DISABLE_EXIT 647 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_PUSH_DISABLE_EXIT ); -** lets you disable or re-enable the UI exit functions (close button, -** context menu, alt-f4). -** call IPC_POP_DISABLE_EXIT when you are done doing whatever required -** preventing exit -*/ - -#define IPC_POP_DISABLE_EXIT 648 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_POP_DISABLE_EXIT ); -** see IPC_PUSH_DISABLE_EXIT -*/ - -#define IPC_IS_EXIT_ENABLED 649 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_IS_EXIT_ENABLED); -** returns 0 if exit is disabled, 1 otherwise -*/ - -#define IPC_IS_AOT 650 -/* (requires Winamp 5.04+) -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_IS_AOT); -** returns status of always on top flag. note: this may not match the actual -** TOPMOST window flag while another fullscreen application is focused -*/ - -#define IPC_USES_RECYCLEBIN 651 -/* -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_USES_RECYCLEBIN); -** returns 1 if deleted files should be sent to the recycle bin. -** returns 0 if deleted files should be deleted permanently. -** -** You should check for this option if your plugin deletes files -** so that your setting matches the winamp setting -*/ - -#define IPC_FLUSHAUDITS 652 -/* -** SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_FLUSHAUDITS); -** -** Will flush any pending audits in the global audits que -** -*/ - -#define IPC_GETPLAYITEM_START 653 -#define IPC_GETPLAYITEM_END 654 - - -#define IPC_GETVIDEORESIZE 655 -#define IPC_SETVIDEORESIZE 656 - -// >>>>>>>>>>> Next is 657 - -#define IPC_PLCMD 1000 - -#define PLCMD_ADD 0 -#define PLCMD_REM 1 -#define PLCMD_SEL 2 -#define PLCMD_MISC 3 -#define PLCMD_LIST 4 - -//#define IPC_MBCMD 1001 - -#define MBCMD_BACK 0 -#define MBCMD_FORWARD 1 -#define MBCMD_STOP 2 -#define MBCMD_RELOAD 3 -#define MBCMD_MISC 4 - -#define IPC_VIDCMD 1002 - -#define VIDCMD_FULLSCREEN 0 -#define VIDCMD_1X 1 -#define VIDCMD_2X 2 -#define VIDCMD_LIB 3 -#define VIDPOPUP_MISC 4 - -//#define IPC_MBURL 1003 //sets the URL -//#define IPC_MBGETCURURL 1004 //copies the current URL into wParam (have a 4096 buffer ready) -//#define IPC_MBGETDESC 1005 //copies the current URL description into wParam (have a 4096 buffer ready) -//#define IPC_MBCHECKLOCFILE 1006 //checks that the link file is up to date (otherwise updates it). wParam=parent HWND -//#define IPC_MBREFRESH 1007 //refreshes the "now playing" view in the library -//#define IPC_MBGETDEFURL 1008 //copies the default URL into wParam (have a 4096 buffer ready) - -#define IPC_STATS_LIBRARY_ITEMCNT 1300 // updates library count status - -// IPC 2000-3000 reserved for freeform messages, see gen_ff/ff_ipc.h -#define IPC_FF_FIRST 2000 -#define IPC_FF_LAST 3000 - - -/* -** General IPC messages in Winamp -** -** All notification messages appear in the lParam of the main window message proceedure. -*/ - - -#define IPC_GETDROPTARGET 3001 -/* (requires Winamp 5.0+) -** IDropTarget* IDrop = (IDropTarget*)SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETDROPTARGET); -** -** You call this to retrieve a copy of the IDropTarget interface which Winamp created for -** handling external drag and drop operations on to it's Windows. This is only really -** useful if you're providing an alternate interface and want your Windows to provide the -** same drag and drop support as Winamp normally provides the user. Check out MSDN or -** your prefered search facility for more information about the IDropTarget interface and -** what's needed to handle it in your own instance. -*/ - -#define IPC_PLAYLIST_MODIFIED 3002 -/* (requires Winamp 5.0+) -** This is a notification message sent to the main Winamp window whenever the playlist is -** modified in any way e.g. the addition/removal of a playlist entry. -** -** It is not a good idea to do large amounts of processing in this notification since it -** will slow down Winamp as playlist entries are modified (especially when you're adding -** in a large playlist). -** -** if(uMsg == WM_WA_IPC && lParam == IPC_PLAYLIST_MODIFIED){ -** // do what you need to do here -** } -*/ - -#define IPC_PLAYING_FILE 3003 -/* (requires Winamp 5.0+) -** This is a notification message sent to the main Winamp window when playback begins for -** a file. This passes the full filepath in the wParam of the message received. -** -** if(uMsg == WM_WA_IPC && lParam == IPC_PLAYING_FILE){ -** // do what you need to do here, e.g. -** process_file((char*)wParam); -** } -*/ - -#define IPC_PLAYING_FILEW 13003 -/* (requires Winamp 5.0+) -** This is a notification message sent to the main Winamp window when playback begins for -** a file. This passes the full filepath in the wParam of the message received. -** -** if(uMsg == WM_WA_IPC && lParam == IPC_PLAYING_FILEW){ -** // do what you need to do here, e.g. -** process_file((wchar_t*)wParam); -** } -*/ - -#define IPC_FILE_TAG_MAY_HAVE_UPDATED 3004 // sent to main wnd with the file as parm (char *) whenever a file tag might be updated -#define IPC_FILE_TAG_MAY_HAVE_UPDATEDW 3005 // sent to main wnd with the file as parm (wchar_t *) whenever a file tag might be updated -/* (requires Winamp 5.0+) -** This is a notification message sent to the main Winamp window when a file's tag -** (e.g. id3) may have been updated. This appears to be sent when the InfoBox(..) function -** of the associated input plugin returns a 1 (which is the file information dialog/editor -** call normally). -** -** if(uMsg == WM_WA_IPC && lParam == IPC_FILE_TAG_MAY_HAVE_UPDATED){ -** // do what you need to do here, e.g. -** update_info_on_file_update((char*)wParam); -** } -*/ - -#define IPC_ALLOW_PLAYTRACKING 3007 -/* (requires Winamp 5.0+) -** SendMessage(hwnd_winamp,WM_WA_IPC,allow,IPC_ALLOW_PLAYTRACKING); -** Send allow as nonzero to allow play tracking and zero to disable the mode. -*/ - -#define IPC_HOOK_OKTOQUIT 3010 -/* (requires Winamp 5.0+) -** This is a notification message sent to the main Winamp window asking if it's okay to -** close or not. Return zero to prevent Winamp from closing or return anything non-zero -** to allow Winamp to close. -** -** The best implementation of this option is to let the message pass through to the -** original window proceedure since another plugin may want to have a say in the matter -** with regards to Winamp closing. -** -** if(uMsg == WM_WA_IPC && lParam == IPC_HOOK_OKTOQUIT){ -** // do what you need to do here, e.g. -** if(no_shut_down()){ -** return 1; -** } -** } -*/ - -#define IPC_WRITECONFIG 3011 -/* (requires Winamp 5.0+) -** SendMessage(hwnd_winamp,WM_WA_IPC,write_type,IPC_WRITECONFIG); -** -** Send write_type as 2 to write all config settings and the current playlist. -** -** Send write_type as 1 to write the playlist and common settings. -** This won't save the following ini settings:: -** -** defext, titlefmt, proxy, visplugin_name, dspplugin_name, check_ft_startup, -** visplugin_num, pe_fontsize, visplugin_priority, visplugin_autoexec, dspplugin_num, -** sticon, splash, taskbar, dropaotfs, ascb_new, ttips, riol, minst, whichicon, -** whichicon2, addtolist, snap, snaplen, parent, hilite, disvis, rofiob, shownumsinpl, -** keeponscreen, eqdsize, usecursors, fixtitles, priority, shuffle_morph_rate, -** useexttitles, bifont, inet_mode, ospb, embedwnd_freesize, no_visseh -** (the above was valid for 5.1) -** -** Send write_type as 0 to write the common and less common settings and no playlist. -*/ - -#define IPC_UPDATE_URL 3012 // pass the URL (char *) in lparam, will be free()'d on done. - -// pass a string to be the name to register, and returns a value > 65536, which is a unique value you can use -// for custom WM_WA_IPC messages. - -#define IPC_GET_RANDFUNC 3015 // returns a function to get a random number -/* (requires Winamp 5.1+) -** int (*randfunc)(void) = (int(*)(void))SendMessage(plugin.hwndParent,WM_WA_IPC,0,IPC_GET_RANDFUNC); -** if(randfunc && randfunc != 1){ -** randfunc(); -** } -** -** This will return a positive 32-bit number (essentially 31-bit). -** The check for a returned value of 1 is because that's the default return value from -** SendMessage(..) when it is not handled so is good to check for it in this situation. -*/ - -#define IPC_METADATA_CHANGED 3017 -/* (requires Winamp 5.1+) -** int changed=SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)(char*)field,IPC_METADATA_CHANGED); -** a plugin can SendMessage this to winamp if internal metadata has changes. -** wParam should be a char * of what field changed -** -** Currently used for internal actions (and very few at that) the intent of this api is -** to allow a plugin to call it when metadata has changed in the current playlist entry -** e.g.a new id3v2 tag was found in a stream -** -** The wparam value can either be NULL or a pointer to an ansi string for the metadata -** which has changed. This can be thought of as an advanced version of IPC_UPDTITLE and -** could be used to allow for update of the current title when a specific tag changed. -** -** Not recommended to be used since there is not the complete handling implemented in -** Winamp for it at the moment. -*/ - -#define IPC_SKIN_CHANGED 3018 -/* (requires Winamp 5.1+) -** This is a notification message sent to the main Winamp window by itself whenever -** the skin in use is changed. There is no information sent by the wParam for this. -** -** if(message == WM_WA_IPC && lparam == IPC_SKIN_CHANGED){ -** // do what you need to do to handle skin changes, e.g. call WADlg_init(hwnd_winamp); -** } -*/ - -#define IPC_REGISTER_LOWORD_COMMAND 3019 -/* (requires Winamp 5.1+) -** WORD id = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_REGISTER_LOWORD_COMMAND); -** This will assign you a unique id for making your own commands such as for extra menu -** entries. The starting value returned by this message will potentially change as and -** when the main resource file of Winamp is updated with extra data so assumptions cannot -** be made on what will be returned and plugin loading order will affect things as well. - -** 5.33+ -** If you want to reserve more than one id, you can pass the number of ids required in wParam -*/ - -#define IPC_GET_DISPATCH_OBJECT 3020 // gets winamp main IDispatch * (for embedded webpages) -#define IPC_GET_UNIQUE_DISPATCH_ID 3021 // gives you a unique dispatch ID that won't conflict with anything in winamp's IDispatch * - -#define IPC_ADD_DISPATCH_OBJECT 3022 // add your own dispatch object into winamp's. This lets embedded webpages access your functions -// pass a pointer to DispatchInfo (see below). Winamp makes a copy of all this data so you can safely delete it later -typedef struct -{ - wchar_t *name; // filled in by plugin, make sure it's a unicode string!! (i.e. L"myObject" instead of "myObject). - struct IDispatch *dispatch; // filled in by plugin - DWORD id; // filled in by winamp on return -} DispatchInfo; - -#define IPC_GET_PROXY_STRING 3023 -/* (requires Winamp 5.11+) -** char* proxy_string=(char*)SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_PROXY_STRING); -** This will return the same string as is shown on the General Preferences page. -*/ - -#define IPC_USE_REGISTRY 3024 -/* (requires Winamp 5.11+) -** int reg_enabled=SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_USE_REGISTRY); -** This will return 0 if you should leave your grubby hands off the registry (i.e. for -** lockdown mode). This is useful if Winamp is run from a USB drive and you can't alter -** system settings, etc. -*/ - -#define IPC_GET_API_SERVICE 3025 -/* (requires Winamp 5.12+) -** api_service* api_service = (api_service)SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GET_API_SERVICE); -** This api will return Winamp's api_service pointer (which is what Winamp3 used, heh). -** If this api is not supported in the Winamp version that is being used at the time then -** the returned value from this api will be 1 which is a good version check. -** -** As of 5.12 there is support for .w5s plugins which reside in %WinampDir%\System and -** are intended for common code that can be shared amongst other plugins e.g. jnetlib.w5s -** which contains jnetlib in one instance instead of being duplicated multiple times in -** all of the plugins which need internet access. -** -** Details on the .w5s specifications will come at some stage (possibly). -*/ - - - -typedef struct { - const wchar_t *filename; - const wchar_t *metadata; - wchar_t *ret; - size_t retlen; -} extendedFileInfoStructW; - -#define IPC_GET_EXTENDED_FILE_INFOW 3026 -/* (requires Winamp 5.13+) -** Pass a pointer to the above struct in wParam -*/ -#define IPC_GET_EXTENDED_FILE_INFOW_HOOKABLE 3027 -#define IPC_SET_EXTENDED_FILE_INFOW 3028 -/* (requires Winamp 5.13+) -** Pass a pointer to the above struct in wParam -*/ - -#define IPC_PLAYLIST_GET_NEXT_SELECTED 3029 -/* (requires 5.2+) -** int pl_item = SendMessage(hwnd_winamp,WM_WA_IPC,start,IPC_PLAYLIST_GET_NEXT_SELECTED); -** -** This works just like the ListView_GetNextItem(..) macro for ListView controls. -** 'start' is the index of the playlist item that you want to begin the search after or -** set this as -1 for the search to begin with the first item of the current playlist. -** -** This will return the index of the selected playlist according to the 'start' value or -** it returns -1 if there is no selection or no more selected items according to 'start'. -** -** Quick example: -** -** int sel = -1; -** // keep incrementing the start of the search so we get all of the selected entries -** while((sel = SendMessage(hwnd_winamp,WM_WA_IPC,sel,IPC_PLAYLIST_GET_NEXT_SELECTED))!=-1){ -** // show the playlist file entry of the selected item(s) if there were any -** MessageBox(hwnd_winamp,(char*)SendMessage(hwnd_winamp,WM_WA_IPC,sel,IPC_GETPLAYLISTFILE),0,0); -** } -*/ - -#define IPC_PLAYLIST_GET_SELECTED_COUNT 3030 -/* (requires 5.2+) -** int selcnt = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_PLAYLIST_GET_SELECTED_COUNT); -** This will return the number of selected playlist entries. -*/ - -#define IPC_GET_PLAYING_FILENAME 3031 // returns wchar_t * of the currently playing filename - -#define IPC_OPEN_URL 3032 // send either ANSI or Unicode string (it'll figure it out, but it MUST start with "h"!, so don't send ftp:// or anything funny) - -#define IPC_REGISTER_WINAMP_IPCMESSAGE 65536 -/* (requires Winamp 5.0+) -** DWORD id = SendMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)name,IPC_REGISTER_WINAMP_IPCMESSAGE); -** The value 'id' returned is > 65536 and is incremented on subsequent calls for unique -** 'name' values passed to it. By using the same 'name' in different plugins will allow a -** common runtime api to be provided for the currently running instance of Winamp -** e.g. -** PostMessage(hwnd_winamp,WM_WA_IPC,(WPARAM)my_param,registered_ipc); -** Have a look at wa_hotkeys.h for an example on how this api is used in practice for a -** custom WM_WA_IPC message. -** -** if(uMsg == WM_WA_IPC && lParam == id_from_register_winamp_ipcmessage){ -** // do things -** } -*/ - -#endif//_WA_IPC_H_ diff --git a/cpp/jacob/ComThread.cpp b/cpp/jacob/ComThread.cpp deleted file mode 100644 index 36b4a35..0000000 --- a/cpp/jacob/ComThread.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "stdafx.h" -#include -#include "ComThread.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize - (JNIEnv *env, jclass cls, jint mode) -{ - int threadModel = mode; - CoInitializeEx(NULL, threadModel); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize - (JNIEnv *env, jclass cls) -{ - CoUninitialize(); -} - -} diff --git a/cpp/jacob/ComThread.h b/cpp/jacob/ComThread.h deleted file mode 100644 index 84a1980..0000000 --- a/cpp/jacob/ComThread.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -/* Header for class com_jacob_com_ComThread */ - -#ifndef _Included_com_jacob_com_ComThread -#define _Included_com_jacob_com_ComThread -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_ComThread - * Method: doCoInitialize - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoInitialize - (JNIEnv *, jclass, jint); - -/* - * Class: com_jacob_com_ComThread - * Method: doCoUninitialize - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_ComThread_doCoUninitialize - (JNIEnv *, jclass); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/jacob/Dispatch.cpp b/cpp/jacob/Dispatch.cpp deleted file mode 100644 index ff3a83d..0000000 --- a/cpp/jacob/Dispatch.cpp +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "stdafx.h" -#include -#include "Dispatch.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -#define DISP_FLD "m_pDispatch" - -// extract a IDispatch from a jobject -IDispatch *extractDispatch(JNIEnv *env, jobject arg) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, DISP_FLD, "I"); - jint anum = env->GetIntField(arg, ajf); - IDispatch *v = (IDispatch *)anum; - return v; -} - -/** - * This method finds an interface rooted on the passed in dispatch object. - * This creates a new Dispatch object so it is NOT reliable - * in the event callback thread of a JWS client where the root class loader - * does not have com.jacob.com.Dispatch in its classpath - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface - (JNIEnv *env, jobject _this, jstring _iid) -{ - // get the current IDispatch - IDispatch *pIDispatch = extractDispatch(env, _this); - if (!pIDispatch) return NULL; - // if we used env->GetStringChars() would that let us drop the conversion? - const char *siid = env->GetStringUTFChars(_iid, NULL); - USES_CONVERSION; - LPOLESTR bsIID = A2W(siid); - env->ReleaseStringUTFChars(_iid, siid); - IID iid; - HRESULT hr = IIDFromString(bsIID, &iid); - if (FAILED(hr)) { - ThrowComFail(env, "Can't get IID from String", hr); - return NULL; - } - - // try to call QI on the passed IID - IDispatch *disp; - hr = pIDispatch->QueryInterface(iid, (void **)&disp); - if (FAILED(hr)) { - ThrowComFail(env, "QI on IID from String Failed", hr); - return NULL; - } - - jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); - jmethodID autoCons = env->GetMethodID(autoClass, "", "(I)V"); - // construct a Dispatch object to return - // I am copying the pointer to java - // jacob-msg 1817 - SF 1053871 : QueryInterface already called AddRef!! - //if (disp) disp->AddRef(); - jobject newAuto = env->NewObject(autoClass, autoCons, disp); - return newAuto; -} - -/** - * starts up a new instance of the requested program (progId) - * and connects to it. does special code if the progid - * is of the alternate format (with ":") - **/ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstanceNative - (JNIEnv *env, jobject _this, jstring _progid) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); - - // if we used env->GetStringChars() would that let us drop the conversion? - const char *progid = env->GetStringUTFChars(_progid, NULL); - CLSID clsid; - HRESULT hr; - IUnknown *punk = NULL; - IDispatch *pIDispatch; - USES_CONVERSION; - LPOLESTR bsProgId = A2W(progid); - if (strchr(progid,':')) - { - env->ReleaseStringUTFChars(_progid, progid); - // it's a moniker - hr = CoGetObject(bsProgId, NULL, IID_IUnknown, (LPVOID *)&punk); - if (FAILED(hr)) { - ThrowComFail(env, "Can't find moniker", hr); - return; - } - IClassFactory *pIClass; - // if it was a clsid moniker, I may have a class factory - hr = punk->QueryInterface(IID_IClassFactory, (void **)&pIClass); - if (!SUCCEEDED(hr)) goto doDisp; - punk->Release(); - // try to create an instance - hr = pIClass->CreateInstance(NULL, IID_IUnknown, (void **)&punk); - if (FAILED(hr)) { - ThrowComFail(env, "Can't create moniker class instance", hr); - return; - } - pIClass->Release(); - goto doDisp; - } - env->ReleaseStringUTFChars(_progid, progid); - // Now, try to find an IDispatch interface for progid - hr = CLSIDFromProgID(bsProgId, &clsid); - if (FAILED(hr)) { - ThrowComFail(env, "Can't get object clsid from progid", hr); - return; - } - // standard creation - hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IUnknown, (void **)&punk); - if (!SUCCEEDED(hr)) { - ThrowComFail(env, "Can't co-create object", hr); - return; - } -doDisp: - - // now get an IDispatch pointer from the IUnknown - hr = punk->QueryInterface(IID_IDispatch, (void **)&pIDispatch); - if (!SUCCEEDED(hr)) { - ThrowComFail(env, "Can't QI object for IDispatch", hr); - return; - } - // CoCreateInstance called AddRef - punk->Release(); - env->SetIntField(_this, jf, (unsigned int)pIDispatch); -} - -/** - * attempts to connect to an running instance of the requested program - * This exists solely for the factory method connectToActiveInstance. - **/ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_getActiveInstanceNative - (JNIEnv *env, jobject _this, jstring _progid) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); - - // if we used env->GetStringChars() would that let us drop the conversion? - const char *progid = env->GetStringUTFChars(_progid, NULL); - CLSID clsid; - HRESULT hr; - IUnknown *punk = NULL; - IDispatch *pIDispatch; - USES_CONVERSION; - LPOLESTR bsProgId = A2W(progid); - env->ReleaseStringUTFChars(_progid, progid); - // Now, try to find an IDispatch interface for progid - hr = CLSIDFromProgID(bsProgId, &clsid); - if (FAILED(hr)) { - ThrowComFail(env, "Can't get object clsid from progid", hr); - return; - } - // standard connection - //printf("trying to connect to running %ls\n",bsProgId); - hr = GetActiveObject(clsid,NULL, &punk); - if (!SUCCEEDED(hr)) { - ThrowComFail(env, "Can't get active object", hr); - return; - } - // now get an IDispatch pointer from the IUnknown - hr = punk->QueryInterface(IID_IDispatch, (void **)&pIDispatch); - if (!SUCCEEDED(hr)) { - ThrowComFail(env, "Can't QI object for IDispatch", hr); - return; - } - // GetActiveObject called AddRef - punk->Release(); - env->SetIntField(_this, jf, (unsigned int)pIDispatch); -} - -/** - * starts up a new instance of the requested program (progId). - * This exists solely for the factory method connectToActiveInstance. - **/ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_coCreateInstanceNative - (JNIEnv *env, jobject _this, jstring _progid) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); - - // if we used env->GetStringChars() would that let us drop the conversion? - const char *progid = env->GetStringUTFChars(_progid, NULL); - CLSID clsid; - HRESULT hr; - IUnknown *punk = NULL; - IDispatch *pIDispatch; - USES_CONVERSION; - LPOLESTR bsProgId = A2W(progid); - env->ReleaseStringUTFChars(_progid, progid); - // Now, try to find an IDispatch interface for progid - hr = CLSIDFromProgID(bsProgId, &clsid); - if (FAILED(hr)) { - ThrowComFail(env, "Can't get object clsid from progid", hr); - return; - } - // standard creation - hr = CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IUnknown, (void **)&punk); - if (!SUCCEEDED(hr)) { - ThrowComFail(env, "Can't co-create object", hr); - return; - } - // now get an IDispatch pointer from the IUnknown - hr = punk->QueryInterface(IID_IDispatch, (void **)&pIDispatch); - if (!SUCCEEDED(hr)) { - ThrowComFail(env, "Can't QI object for IDispatch", hr); - return; - } - // CoCreateInstance called AddRef - punk->Release(); - env->SetIntField(_this, jf, (unsigned int)pIDispatch); -} - -/** - * release method - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release - (JNIEnv *env, jobject _this) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, DISP_FLD, "I"); - jint num = env->GetIntField(_this, jf); - - IDispatch *disp = (IDispatch *)num; - if (disp) { - disp->Release(); - env->SetIntField(_this, jf, (unsigned int)0); - } -} - -static HRESULT -name2ID(IDispatch *pIDispatch, const char *prop, DISPID *dispid, long lcid) -{ - HRESULT hresult; - USES_CONVERSION; - LPOLESTR propOle = A2W(prop); - hresult = pIDispatch->GetIDsOfNames(IID_NULL,(LPOLESTR*)&propOle,1,lcid,dispid); - return hresult; -} - -JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames - (JNIEnv *env, jclass clazz, jobject disp, jint lcid, jobjectArray names) -{ - IDispatch *pIDispatch = extractDispatch(env, disp); - if (!pIDispatch) return NULL; - - int l = env->GetArrayLength(names); - int i; - LPOLESTR *lps = (LPOLESTR *)CoTaskMemAlloc(l * sizeof(LPOLESTR)); - DISPID *dispid = (DISPID *)CoTaskMemAlloc(l * sizeof(DISPID)); - for(i=0;iGetObjectArrayElement(names, i); - // if we used env->GetStringChars() would that let us drop the conversion? - const char *nm = env->GetStringUTFChars(s, NULL); - LPOLESTR nmos = A2W(nm); - env->ReleaseStringUTFChars(s, nm); - lps[i] = nmos; - env->DeleteLocalRef(s); - } - HRESULT hr = pIDispatch->GetIDsOfNames(IID_NULL,lps,l,lcid,dispid); - if (FAILED(hr)) { - CoTaskMemFree(lps); - CoTaskMemFree(dispid); - char buf[1024]; - strcpy_s(buf, "Can't map names to dispid:"); - for(i=0;iGetObjectArrayElement(names, i); - const char *nm = env->GetStringUTFChars(s, NULL); - strcat_s(buf, nm); - env->ReleaseStringUTFChars(s, nm); - env->DeleteLocalRef(s); - } - ThrowComFail(env, buf, hr); - return NULL; - } - jintArray iarr = env->NewIntArray(l); - // SF 1511033 -- the 2nd parameter should be 0 and not i! - env->SetIntArrayRegion(iarr, 0, l, dispid); - CoTaskMemFree(lps); - CoTaskMemFree(dispid); - return iarr; -} - -static char* BasicToCharString(const BSTR inBasicString) -{ - char* charString = NULL; - const size_t charStrSize = ::SysStringLen(inBasicString) + 1; - if (charStrSize > 1) - { - charString = new char[charStrSize]; - size_t convertedSize; - ::wcstombs_s(&convertedSize, charString, charStrSize, inBasicString, charStrSize); - } - else - { - charString = ::_strdup(""); - } - return charString; -} - -static wchar_t* CreateErrorMsgFromResult(HRESULT inResult) -{ - wchar_t* msg = NULL; - ::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, NULL, inResult,MAKELANGID(LANG_NEUTRAL, - SUBLANG_DEFAULT), (LPWSTR) &msg, 0, NULL); - if (msg == NULL) - { - const wchar_t* message_text = L"An unknown COM error has occured."; - size_t bufferLength = (wcslen(message_text) + 1) * sizeof(wchar_t); - msg = (wchar_t*) ::LocalAlloc(LPTR, bufferLength); - wcscpy_s(msg, bufferLength, message_text); - } - - return msg; -} - -static wchar_t* CreateErrorMsgFromInfo(HRESULT inResult, EXCEPINFO* ioInfo, - const char* methName) -{ - wchar_t* msg = NULL; - size_t methNameWSize = 0; - - mbstowcs_s(&methNameWSize, NULL, 0, methName, _TRUNCATE); - - wchar_t* methNameW = new wchar_t[methNameWSize]; - - mbstowcs_s(NULL, methNameW, methNameWSize, methName, _TRUNCATE); - - // If this is a dispatch exception (triggered by an Invoke message), - // then we have to take some additional steps to process the error - // message. - if (inResult == DISP_E_EXCEPTION) - { - // Check to see if the server deferred filling in the exception - // information. If so, make the call to populate the structure. - if (ioInfo->pfnDeferredFillIn != NULL) - (*(ioInfo->pfnDeferredFillIn))(ioInfo); - - // Build the error message from exception information content. - int sourceLen = SysStringLen(ioInfo->bstrSource); - int descLen = SysStringLen(ioInfo->bstrDescription); - const size_t MSG_LEN = ::wcslen(methNameW) + sourceLen + descLen + 128; - msg = new wchar_t[MSG_LEN]; - ::wcsncpy_s(msg, MSG_LEN, L"Invoke of: ", wcslen(L"Invoke of: ")); - ::wcsncat_s(msg, MSG_LEN, methNameW, wcslen(methNameW)); - ::wcsncat_s(msg, MSG_LEN, L"\nSource: ", wcslen(L"\nSource: ")); - ::wcsncat_s(msg, MSG_LEN, ioInfo->bstrSource, sourceLen); - ::wcsncat_s(msg, MSG_LEN, L"\nDescription: ", wcslen(L"\nDescription: ")); - ::wcsncat_s(msg, MSG_LEN, ioInfo->bstrDescription, descLen); - ::wcsncat_s(msg, MSG_LEN, L"\n", wcslen(L"\n")); - } - else - { - wchar_t* msg2 = CreateErrorMsgFromResult(inResult); - const size_t MSG_LEN = ::wcslen(methNameW) + ::wcslen(msg2) + 256; - msg = new wchar_t[MSG_LEN]; - ::wcsncpy_s(msg, MSG_LEN, - L"A COM exception has been encountered:\nAt Invoke of: ", - wcslen(L"A COM exception has been encountered:\nAt Invoke of: ")); - ::wcsncat_s(msg, MSG_LEN, methNameW, wcslen(methNameW)); - ::wcsncat_s(msg, MSG_LEN, L"\nDescription: ", wcslen(L"\nDescription: ")); - ::wcsncat_s(msg, MSG_LEN, msg2, wcslen(msg2)); - // jacob-msg 1075 - SF 1053872 : Documentation says "use LocalFree"!! - //delete msg2; - LocalFree(msg2); - } - delete methNameW; - return msg; -} - - -#define SETDISPPARAMS(dp, numArgs, pvArgs, numNamed, pNamed) \ - {\ - (dp).cArgs = numArgs; \ - (dp).rgvarg = pvArgs; \ - (dp).cNamedArgs = numNamed; \ - (dp).rgdispidNamedArgs = pNamed; \ - } - -#define SETNOPARAMS(dp) SETDISPPARAMS(dp, 0, NULL, 0, NULL) - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev - (JNIEnv *env, jclass clazz, - jobject disp, jstring name, jint dispid, - jint lcid, jint wFlags, jobjectArray vArg, jintArray uArgErr) -{ - DISPPARAMS dispparams; - EXCEPINFO excepInfo; - // Sourceforge Bug Tracker 2935662 uninitialized data can be not NULL with bad results - excepInfo.pfnDeferredFillIn = NULL; - - IDispatch *pIDispatch = extractDispatch(env, disp); - if (!pIDispatch) return NULL; - - int dispID = dispid; - if (name != NULL) - { - const char *nm = env->GetStringUTFChars(name, NULL); - HRESULT hr; - if (FAILED(hr = name2ID(pIDispatch, nm, (long *)&dispID, lcid))) { - char buf[1024]; - sprintf_s(buf, 1024, "Can't map name to dispid: %s", nm); - ThrowComFail(env, buf, -1); - return NULL; - } - env->ReleaseStringUTFChars(name, nm); - } - - int num_args = env->GetArrayLength(vArg); - int i, j; - VARIANT *varr = NULL; - if (num_args) - { - varr = (VARIANT *)CoTaskMemAlloc(num_args*sizeof(VARIANT)); - /* reverse args for dispatch */ - for(i=num_args-1,j=0;0<=i;i--,j++) - { - VariantInit(&varr[j]); - jobject arg = env->GetObjectArrayElement(vArg, i); - VARIANT *v = extractVariant(env, arg); - // no escape from copy? - VariantCopy(&varr[j], v); - env->DeleteLocalRef(arg); - } - } - // prepare a new return value - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - // construct a variant to return - jobject newVariant = env->NewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - DISPID dispidPropertyPut = DISPID_PROPERTYPUT; - - // determine how to dispatch - switch (wFlags) - { - case DISPATCH_PROPERTYGET: // GET - case DISPATCH_METHOD: // METHOD - case DISPATCH_METHOD|DISPATCH_PROPERTYGET: - { - SETDISPPARAMS(dispparams, num_args, varr, 0, NULL); - break; - } - case DISPATCH_PROPERTYPUT: - case DISPATCH_PROPERTYPUTREF: // jacob-msg 1075 - SF 1053872 - { - SETDISPPARAMS(dispparams, num_args, varr, 1, &dispidPropertyPut); - break; - } - } - - HRESULT hr = 0; - jint count = env->GetArrayLength(uArgErr); - if ( count != 0 ) - { - jint *uAE = env->GetIntArrayElements(uArgErr, NULL); - hr = pIDispatch->Invoke(dispID,IID_NULL, - lcid,(WORD)wFlags,&dispparams,v,&excepInfo,(unsigned int *)uAE); // SF 1689061 - env->ReleaseIntArrayElements(uArgErr, uAE, 0); - } - else - { - hr = pIDispatch->Invoke(dispID,IID_NULL, - lcid,(WORD)wFlags,&dispparams,v,&excepInfo, NULL); // SF 1689061 - } - if (num_args) - { - // to account for inouts, I need to copy the inputs back to - // the java array after the method returns - // this occurs, for example, in the ADO wrappers - for(i=num_args-1,j=0;0<=i;i--,j++) - { - jobject arg = env->GetObjectArrayElement(vArg, i); - VARIANT *v = extractVariant(env, arg); - // reverse copy - VariantCopy(v, &varr[j]); - // clear out the temporary variant - VariantClear(&varr[j]); - env->DeleteLocalRef(arg); - } - } - - if (varr) CoTaskMemFree(varr); - - // check for error and display a somewhat verbose error message - if (!SUCCEEDED(hr)) { - // two buffers that may have to be freed later - wchar_t *buf = NULL; - char *dispIdAsName = NULL; - // this method can get called with a name or a dispatch id - // we need to handle both SF 1114159 - if (name != NULL){ - const char *nm = env->GetStringUTFChars(name, NULL); - buf = CreateErrorMsgFromInfo(hr, &excepInfo, nm); - env->ReleaseStringUTFChars(name, nm); - } else { - dispIdAsName = new char[256]; - // get the id string - _itoa_s (dispID, dispIdAsName, 256,10); - //continue on mostly as before - buf = CreateErrorMsgFromInfo(hr,&excepInfo,dispIdAsName); - } - - // jacob-msg 3696 - SF 1053866 - if(hr == DISP_E_EXCEPTION) - { - if(excepInfo.scode != 0) - { - hr = excepInfo.scode; - } - else - { - hr = _com_error::WCodeToHRESULT(excepInfo.wCode); - } - } - - ThrowComFailUnicode(env, buf, hr); - if (buf) delete buf; - if (dispIdAsName) delete dispIdAsName; - return NULL; - } - - return newVariant; -} - -/* - * Wait method added so folks could wait until a com server terminated - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Dispatch_hasExited - (JNIEnv *env,jclass clazz, jobject disp, jint dispid, jint lcid) { - IDispatch *pIDispatch = extractDispatch(env, disp); - if (!pIDispatch) { - // should we return 0? - return NULL; - } - ITypeInfo *v; - HRESULT hr = pIDispatch->GetTypeInfo(dispid, lcid, &v); - if (hr == RPC_E_SERVERCALL_RETRYLATER || hr == RPC_E_CALL_REJECTED || hr - == 0) { - return 0; - } else { - return 1; - } -} - -} - - diff --git a/cpp/jacob/Dispatch.h b/cpp/jacob/Dispatch.h deleted file mode 100644 index d8cda4e..0000000 --- a/cpp/jacob/Dispatch.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -/* Header for class Dispatch */ - -#ifndef _Included_Dispatch -#define _Included_Dispatch -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_Dispatch - * Method: QueryInterface - * Signature: (Ljava/lang/String;)Lcom/jacob/com/Dispatch; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_QueryInterface - (JNIEnv *, jobject, jstring); - -/* - * Class: Dispatch - * Method: createInstance - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_createInstanceNative - (JNIEnv *, jobject, jstring); - -/* - * Class: Dispatch - * Method: getActiveInstance - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_getActiveInstanceNative - (JNIEnv *, jobject, jstring); - -/* - * Class: Dispatch - * Method: coCreateInstance - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_coCreateInstanceNative - (JNIEnv *, jobject, jstring); - -/* - * Class: Dispatch - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Dispatch_release - (JNIEnv *, jobject); - -/* - * Class: Dispatch - * Method: getIDsOfNames - * Signature: (Ljava/lang/Object;I[Ljava/lang/String;)[I - */ -JNIEXPORT jintArray JNICALL Java_com_jacob_com_Dispatch_getIDsOfNames - (JNIEnv *, jclass, jobject, jint, jobjectArray); - -/* - * Class: Dispatch - * Method: invokev - * Signature: (Ljava/lang/Object;Ljava/lang/String;III[LVariant;[I)LVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Dispatch_invokev - (JNIEnv *, jclass, jobject, jstring, jint, jint, jint, jobjectArray, jintArray); - -/* - * Class: Dispatch - * Method: wait - * Signature: (Ljava/lang/Object;I;)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Dispatch_hasExited - (JNIEnv *, jclass, jobject, jint, jint); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/jacob/DispatchEvents.cpp b/cpp/jacob/DispatchEvents.cpp deleted file mode 100644 index 3428749..0000000 --- a/cpp/jacob/DispatchEvents.cpp +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "DispatchEvents.h" -#include "EventProxy.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include - -#include "util.h" - -extern "C" -{ - -#define PROXY_FLD "m_pConnPtProxy" - -// defined below -BOOL GetEventIID(IUnknown*, IID*, CComBSTR **, DISPID **, int *,LPOLESTR); -BOOL GetEventIIDForTypeLib(BSTR, IID*, CComBSTR **, DISPID **, int *,LPOLESTR); -BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo); -BOOL MapEventIIDs(IID*, CComBSTR **, DISPID **, int *, LPOLESTR , LPTYPEINFO ); - -// extract a EventProxy* from a jobject -EventProxy *extractProxy(JNIEnv *env, jobject arg) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I"); - jint anum = env->GetIntField(arg, ajf); - EventProxy *v = (EventProxy *)anum; - return v; -} - -/* - * pushes the EventProxy (*ep) into tje jobject in the PROXY_FLD location - */ -void putProxy(JNIEnv *env, jobject arg, EventProxy *ep) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, PROXY_FLD, "I"); - jint anum = env->GetIntField(arg, ajf); - env->SetIntField(arg, ajf, (jint)ep); -} - - -/* - * Class: com_jacob_com_DispatchEvents - * Method: init3 - * Signature: (Lcom/jacob/com/Dispatch;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init3 - (JNIEnv *env, - jobject _this, jobject src, - jobject sink, - jstring _progid, - jstring _typelib) -{ - USES_CONVERSION; - - if (_typelib != NULL && _progid == NULL){ - // both are required if typelib exists - ThrowComFail(env,"TypeLib was specified but no program id was",-1); - return; - } - - BSTR typeLib = NULL; - if (_typelib != NULL){ - // why is this UTF instead of unicode? Then we could probably drop the A2W - const char *typelib = env->GetStringUTFChars(_typelib, NULL); - typeLib = A2W(typelib); - // should we call env->ReleaseStringUTFChars(,) to free the memory like we do everywhere lese? - - //printf("we have a type lib %ls\n",typeLib); - } - - // find progid if any - LPOLESTR bsProgId = NULL; - if (_progid!=NULL) { - // why is this UTF instead of unicode? Then we could probably drop the A2W - const char *progid = env->GetStringUTFChars(_progid, NULL); - bsProgId = A2W(progid); - // should we call env->ReleaseStringUTFChars(,) to free the memory like we do everywhere lese? - //printf("we have an applicaton %ls\n",bsProgId); - } - - // get the IDispatch for the source object - IDispatch *pDisp = extractDispatch(env, src); - CComQIPtr pUnk(pDisp); - // see if it implements connection points - CComQIPtr pCPC(pUnk); - if (!pCPC) - { - // no events, throw something - ThrowComFail(env, "Can't find IConnectionPointContainer", -1); - return; - } - - IID eventIID; - CComBSTR *mNames; - DISPID *mIDs; - int n_EventMethods; - if (_typelib == NULL){ - if (!GetEventIID(pUnk, &eventIID, &mNames, &mIDs, &n_EventMethods,bsProgId)) { - ThrowComFail(env, "Can't find event iid", -1); - return; - } - } else { - if (!GetEventIIDForTypeLib(typeLib, &eventIID, &mNames, &mIDs, &n_EventMethods,bsProgId)) { - ThrowComFail(env, "Can't find event iid for type lib", -1); - return; - } - } - - // hook up to the default source iid - CComPtr pCP; - HRESULT hr = pCPC->FindConnectionPoint(eventIID, &pCP); - if (SUCCEEDED(hr)) - { - EventProxy *ep = new EventProxy(env, sink, pCP, eventIID, mNames, mIDs, n_EventMethods); - // need to store ep on _this, in case it gets collected - putProxy(env, _this, ep); - } else { - ThrowComFail(env, "Can't FindConnectionPoint", hr); - } -} - -/* - * Class: DispatchEvents - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release - (JNIEnv *env, jobject _this) -{ - EventProxy *ep = extractProxy(env, _this); - if (ep) { - // this is the line that blows up in IETest - ep->Release(); - putProxy(env, _this, NULL); - } -} - -/* - * I need a reverse map from the event interface's dispids to - * function names so that we can reflect them to java - */ -void -LoadNameCache(LPTYPEINFO pTypeInfo, LPTYPEATTR pta, - CComBSTR **mNames, DISPID **mIDs, int *nmeth) -{ - CComBSTR *names = NULL; - DISPID *ids = NULL; - int m_nCount; - - m_nCount = pta->cFuncs; - *nmeth = m_nCount; - names = m_nCount == 0 ? NULL : new CComBSTR[m_nCount]; - ids = m_nCount == 0 ? NULL : new DISPID[m_nCount]; - for (int i=0; iGetFuncDesc(i, &pfd))) - { - CComBSTR bstrName; - if (SUCCEEDED(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, NULL, NULL, NULL))) - { - names[i].Attach(bstrName.Detach()); - ids[i] = pfd->memid; - /* - USES_CONVERSION; - printf("map:%d -> %s\n", ids[i], W2A((OLECHAR *)names[i])); - */ - } - pTypeInfo->ReleaseFuncDesc(pfd); - } - } - *mNames = names; - *mIDs = ids; -} - -#define IMPLTYPE_MASK \ - (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE | IMPLTYPEFLAG_FRESTRICTED) - -#define IMPLTYPE_DEFAULTSOURCE \ - (IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE) - -BOOL GetEventIID(IUnknown *m_pObject, IID* piid, - CComBSTR **mNames, DISPID **mIDs, int *nmeth,LPOLESTR bsProgId) -{ - *piid = GUID_NULL; - ATLASSERT(m_pObject != NULL); - // I Always use IProvideClassInfo rather than IProvideClassInfo2 - // since I also need to create a mapping from dispid to name - LPPROVIDECLASSINFO pPCI = NULL; - LPTYPEINFO pClassInfo = NULL; - if (SUCCEEDED(m_pObject->QueryInterface(IID_IProvideClassInfo, (LPVOID*)&pPCI))) - { - //printf("got IProvideClassInfo\n"); - ATLASSERT(pPCI != NULL); - HRESULT hr = pPCI->GetClassInfo(&pClassInfo); - pPCI->Release(); - if (!SUCCEEDED(hr)) return false; - } - else if (getClassInfoFromProgId(bsProgId,&pClassInfo)) { - } - else { - printf("GetEventIID: couldn't get IProvideClassInfo\n"); - return false; - } - - return MapEventIIDs(piid, mNames, mIDs, nmeth, bsProgId, pClassInfo); -} - -BOOL MapEventIIDs(IID* piid, - CComBSTR **mNames, DISPID **mIDs, int *nmeth, LPOLESTR bsProgId, LPTYPEINFO pClassInfo) -{ - ATLASSERT(pClassInfo != NULL); - //printf("MapEventIIDs: got past ClassInfo assert\n"); - LPTYPEATTR pClassAttr; - if (SUCCEEDED(pClassInfo->GetTypeAttr(&pClassAttr))) - { - //printf("MapEventIIDs: got TypeAttr\n"); - ATLASSERT(pClassAttr != NULL); - ATLASSERT(pClassAttr->typekind == TKIND_COCLASS); - - // Search for typeinfo of the default events interface. - int nFlags; - HREFTYPE hRefType; - - //printf("MapEventIIDs: looking at %d class attribute impl types \n"); - for (unsigned int i = 0; i < pClassAttr->cImplTypes; i++) - { - if (SUCCEEDED(pClassInfo->GetImplTypeFlags(i, &nFlags)) && - ((nFlags & IMPLTYPE_MASK) == IMPLTYPE_DEFAULTSOURCE)) - { - // Found it. Now look at its attributes to get IID. - LPTYPEINFO pEventInfo = NULL; - if (SUCCEEDED(pClassInfo->GetRefTypeOfImplType(i, - &hRefType)) && - SUCCEEDED(pClassInfo->GetRefTypeInfo(hRefType, - &pEventInfo))) - { - ATLASSERT(pEventInfo != NULL); - LPTYPEATTR pEventAttr; - if (SUCCEEDED(pEventInfo->GetTypeAttr(&pEventAttr))) - { - ATLASSERT(pEventAttr != NULL); - - // create a mapping from dispid to string - LoadNameCache(pEventInfo, pEventAttr, - mNames, mIDs, nmeth); - - *piid = pEventAttr->guid; - pEventInfo->ReleaseTypeAttr(pEventAttr); - } - pEventInfo->Release(); - } - break; - } - } - pClassInfo->ReleaseTypeAttr(pClassAttr); - } - pClassInfo->Release(); - - return (!IsEqualIID(*piid, GUID_NULL)); -} - -BOOL getClassInfoFromProgId(LPOLESTR bsProgId,LPTYPEINFO *pClassInfo) -{ - USES_CONVERSION; - CLSID clsid; - GUID libid; - if (FAILED(CLSIDFromProgID(bsProgId, &clsid))) return false; - if (FAILED(StringFromCLSID(clsid,&bsProgId))) return false; - HKEY keySoftware, keyClasses, keyCLSID, keyXXXX, keyTypeLib; - DWORD dwType, dwCountData=50; - BYTE abData[50]; - LONG lVal; - lVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE"),0,KEY_READ,&keySoftware); - if (lVal==ERROR_SUCCESS) { - lVal = RegOpenKeyEx(keySoftware,_T("Classes"),0,KEY_READ,&keyClasses); - if (lVal==ERROR_SUCCESS) { - lVal = RegOpenKeyEx(keyClasses,_T("CLSID"),0,KEY_READ,&keyCLSID); - if (lVal==ERROR_SUCCESS) { - _TCHAR *tsProgId = W2T(bsProgId); - lVal = RegOpenKeyEx(keyCLSID,tsProgId,0,KEY_READ,&keyXXXX); - if (lVal==ERROR_SUCCESS) { - lVal = RegOpenKeyEx(keyXXXX,_T("TypeLib"),0,KEY_READ,&keyTypeLib); - if (lVal==ERROR_SUCCESS) { - lVal = RegQueryValueExA(keyTypeLib,NULL,NULL,&dwType,abData,&dwCountData); - RegCloseKey(keyTypeLib); - } - RegCloseKey(keyXXXX); - } - RegCloseKey(keyCLSID); - } - RegCloseKey(keyClasses); - } - RegCloseKey(keySoftware); - } - if (lVal!=ERROR_SUCCESS) return false; - BSTR bsLibId = A2BSTR((char*)abData); - if (FAILED(CLSIDFromString(bsLibId,&libid))) return false; - //Try loading from registry information. - ITypeLib* pITypeLib; - if (FAILED(LoadRegTypeLib(libid,1,0, LANG_NEUTRAL, &pITypeLib))) return false; - //Find ITypeInfo for coclass. - pITypeLib->GetTypeInfoOfGuid(clsid, pClassInfo); - pITypeLib->Release(); - return true; -} - -/* - * Get the class info from the progId using the given typeLib. - */ -BOOL getClassInfoFromProgIdTypeLib(BSTR typeLib, LPOLESTR bsProgId, LPTYPEINFO *pClassInfo) -{ - USES_CONVERSION; - CLSID clsid; - - if (FAILED(CLSIDFromProgID(bsProgId, &clsid))) return false; - if (FAILED(StringFromCLSID(clsid,&bsProgId))) return false; - - ITypeLib* pITypeLib; - if (FAILED(LoadTypeLib(typeLib, &pITypeLib))) return false; - - //Find ITypeInfo for coclass. - pITypeLib->GetTypeInfoOfGuid(clsid, pClassInfo); - pITypeLib->Release(); - return true; -} - -BOOL GetEventIIDForTypeLib(BSTR typeLib, IID* piid, - CComBSTR **mNames, DISPID **mIDs, int *nmeth,LPOLESTR bsProgId) -{ - LPTYPEINFO pClassInfo = NULL; - if(getClassInfoFromProgIdTypeLib(typeLib, bsProgId,&pClassInfo)) - { - if (pClassInfo == NULL){ - printf("we had a successful return but pClassInfo is null\n"); - } - return MapEventIIDs(piid, mNames, mIDs, nmeth, bsProgId, pClassInfo); - } - else - { - printf("GetEventIIDForTypeLib: couldn't get IProvideClassInfo\n"); - return false; - } -} - -} diff --git a/cpp/jacob/DispatchEvents.h b/cpp/jacob/DispatchEvents.h deleted file mode 100644 index 82289ec..0000000 --- a/cpp/jacob/DispatchEvents.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -/* Header for class DispatchEvents */ - -#ifndef _Included_DispatchEvents -#define _Included_DispatchEvents -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Class: com_jacob_com_DispatchEvents - * Method: init3 - * Signature: (Lcom/jacob/com/Dispatch;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_init3 - (JNIEnv *, jobject, jobject, jobject, jstring, jstring); - -/* - * Class: DispatchEvents - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchEvents_release - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif - - diff --git a/cpp/jacob/DispatchProxy.cpp b/cpp/jacob/DispatchProxy.cpp deleted file mode 100644 index eb2dd46..0000000 --- a/cpp/jacob/DispatchProxy.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "stdafx.h" -#include -#include "ComThread.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -// extract a IStream from a jobject -IStream *extractStream(JNIEnv *env, jobject arg) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); - jint anum = env->GetIntField(arg, ajf); - IStream *v = (IStream *)anum; - return v; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream - (JNIEnv *env, jobject _this, jobject disp) -{ - IDispatch *pIDispatch = extractDispatch(env, disp); - if (!pIDispatch) return; - IStream *ps; // this is the stream we will marshall into - HRESULT hr = CoMarshalInterThreadInterfaceInStream( - IID_IDispatch, pIDispatch, &ps); - if (!SUCCEEDED(hr)) - { - ThrowComFail(env, "Could not Marshal Dispatch into IStream", hr); - return; - } - // store the stream pointer on the object - jclass argClass = env->GetObjectClass(_this); - jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); - env->SetIntField(_this, ajf, (jint)ps); -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream - (JNIEnv *env, jobject _this) -{ - IStream *ps = extractStream(env, _this); - if (!ps) - { - ThrowComFail(env, "Could not get IStream from DispatchProxy", -1); - return NULL; - } - IDispatch *pD; - HRESULT hr = CoGetInterfaceAndReleaseStream(ps, IID_IDispatch, (void **)&pD); - // zero out the stream pointer on the object - // since the stream can only be read once - jclass argClass = env->GetObjectClass(_this); - jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); - env->SetIntField(_this, ajf, (unsigned int)0); - - if (!SUCCEEDED(hr)) - { - ThrowComFail(env, "Could not Marshal Dispatch from IStream", hr); - return NULL; - } - jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); - jmethodID autoCons = env->GetMethodID(autoClass, "", "(I)V"); - // construct a Dispatch object to return - // I am copying the pointer to java - if (pD) pD->AddRef(); - jobject newAuto = env->NewObject(autoClass, autoCons, pD); - return newAuto; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release - (JNIEnv *env, jobject _this) -{ - IStream *ps = extractStream(env, _this); - if (ps) { - ps->Release(); - jclass argClass = env->GetObjectClass(_this); - jfieldID ajf = env->GetFieldID( argClass, "m_pStream", "I"); - env->SetIntField(_this, ajf, (unsigned int)0); - } -} - -} diff --git a/cpp/jacob/DispatchProxy.h b/cpp/jacob/DispatchProxy.h deleted file mode 100644 index aeabf43..0000000 --- a/cpp/jacob/DispatchProxy.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -/* Header for class com_jacob_com_DispatchProxy */ - -#ifndef _Included_com_jacob_com_DispatchProxy -#define _Included_com_jacob_com_DispatchProxy -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_DispatchProxy - * Method: MarshalIntoStream - * Signature: (Lcom/jacob/com/Dispatch;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_MarshalIntoStream - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_DispatchProxy - * Method: MarshalFromStream - * Signature: ()Lcom/jacob/com/Dispatch; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_DispatchProxy_MarshalFromStream - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_DispatchProxy - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_DispatchProxy_release - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/jacob/EnumVariant.cpp b/cpp/jacob/EnumVariant.cpp deleted file mode 100644 index 7ff9727..0000000 --- a/cpp/jacob/EnumVariant.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "stdafx.h" -#include -#include "Dispatch.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -/** - * An implementation of IEnumVariant based on code submitted by - * Thomas Hallgren (mailto:Thomas.Hallgren@eoncompany.com) - */ -extern "C" -{ - -// extract a IDispatch from a jobject -IEnumVARIANT* extractEnumVariant(JNIEnv* env, jobject arg) -{ - jfieldID FID_pIEnumVARIANT = 0; - jclass clazz = env->GetObjectClass(arg); - FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I"); - return (IEnumVARIANT*)env->GetIntField(arg, FID_pIEnumVARIANT); -} - -JNIEXPORT jint JNICALL -Java_com_jacob_com_EnumVariant_Next(JNIEnv* env, jobject _this, jobjectArray vars) -{ - IEnumVARIANT* self = extractEnumVariant(env, _this); - //printf("self=%x\n", self); - if(self == NULL) - return 0; - - ULONG count = (ULONG)env->GetArrayLength(vars); - if(count == 0) - return 0; - - VARIANT* sink = (VARIANT*)CoTaskMemAlloc(count * sizeof(VARIANT)); - ULONG fetchCount = 0; - - HRESULT hr = self->Next(count, sink, &fetchCount); - if(FAILED(hr)) - { - CoTaskMemFree(sink); - ThrowComFail(env, "IEnumVARIANT::Next", hr); - return 0; - } - - // prepare a new return value array - // - jclass clazz = env->FindClass("com/jacob/com/Variant"); - jmethodID ctor = env->GetMethodID(clazz, "", "()V"); - - for(ULONG idx = 0; idx < fetchCount; ++idx) - { - // construct a variant to return - // - jobject newVariant = env->NewObject(clazz, ctor); - VARIANT* v = extractVariant(env, newVariant); - VariantCopy(v, sink + idx); - env->SetObjectArrayElement(vars, idx, newVariant); - env->DeleteLocalRef(newVariant); - //Sourceforge-1674179 fix memory leak - // Variants received while iterating IEnumVARIANT must be cleared when no longer needed - // The variant has been copied so no longer needed - VariantClear(sink); - } - CoTaskMemFree(sink); - return (jint)fetchCount; -} - -JNIEXPORT void JNICALL -Java_com_jacob_com_EnumVariant_release(JNIEnv* env, jobject _this) -{ - IEnumVARIANT* self = extractEnumVariant(env, _this); - if(self != NULL) - { - self->Release(); - jfieldID FID_pIEnumVARIANT = 0; - jclass clazz = env->GetObjectClass(_this); - FID_pIEnumVARIANT = env->GetFieldID(clazz, "m_pIEnumVARIANT", "I"); - env->SetIntField(_this, FID_pIEnumVARIANT, (unsigned int)0); - } -} - -JNIEXPORT void JNICALL -Java_com_jacob_com_EnumVariant_Reset(JNIEnv* env, jobject _this) -{ - IEnumVARIANT* self = extractEnumVariant(env, _this); - if(self == NULL) - return; - - HRESULT hr = self->Reset(); - if(FAILED(hr)) - ThrowComFail(env, "IEnumVARIANT::Reset", hr); -} - -JNIEXPORT void JNICALL -Java_com_jacob_com_EnumVariant_Skip(JNIEnv* env, jobject _this, jint count) -{ - IEnumVARIANT* self = extractEnumVariant(env, _this); - if(self == NULL) - return; - - HRESULT hr = self->Skip((ULONG)count); - if(FAILED(hr)) - ThrowComFail(env, "IEnumVARIANT::Skip", hr); -} - -} diff --git a/cpp/jacob/EnumVariant.h b/cpp/jacob/EnumVariant.h deleted file mode 100644 index 3465aae..0000000 --- a/cpp/jacob/EnumVariant.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef _Included_EnumVariant -#define _Included_EnumVariant - -#include - -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_EnumVariant - * Method: Next - * Signature: ([Lcom/jacob/com/Variant;)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_EnumVariant_Next - (JNIEnv *, jobject, jobjectArray); - -/* - * Class: com_jacob_com_EnumVariant - * Method: Release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_release - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_EnumVariant - * Method: Reset - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Reset - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_EnumVariant - * Method: Skip - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_EnumVariant_Skip - (JNIEnv *, jobject, jint); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/jacob/EventProxy.cpp b/cpp/jacob/EventProxy.cpp deleted file mode 100644 index 6cdfa59..0000000 --- a/cpp/jacob/EventProxy.cpp +++ /dev/null @@ -1,870 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "EventProxy.h" -#include "Variant.h" - -// hook myself up as a listener for delegate -EventProxy::EventProxy(JNIEnv *env, - jobject aSinkObj, - CComPtr pConn, - IID eid, - CComBSTR mName[], - DISPID mID[], - int mNum) : - // initialize some variables - m_cRef(0), pCP(pConn), - eventIID(eid), MethNum(mNum), MethName(mName), - MethID(mID) -{ - // keep a pointer to the sink - javaSinkObj = env->NewGlobalRef(aSinkObj); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - - // we need this to attach to the event invocation thread - env->GetJavaVM(&jvm); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - AddRef(); - Connect(env); -} - -void EventProxy::Connect(JNIEnv *env) { - HRESULT hr = pCP->Advise(this, &dwEventCookie); - if (SUCCEEDED(hr)) { - connected = 1; - } else { - connected = 0; - ThrowComFail(env, "Advise failed", hr); - } -} - -// unhook myself up as a listener and get rid of delegate -EventProxy::~EventProxy() -{ - JNIEnv *env; - Disconnect(); - jint vmConnectionStatus = JNI_EVERSION ; - jint attachReturnStatus = -1; // AttachCurrentThread return status.. negative numbers are failure return codes. - - // attach to the current running thread -- JDK 1.4 jni.h has two param cover for 3 param call - vmConnectionStatus = jvm->GetEnv((void **)&env, JNI_VERSION_1_2); - if ((env != NULL)&& env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - if (vmConnectionStatus == JNI_EDETACHED){ - //printf("Unhook: Attaching to current thread using JNI Version 1.2 (%d)\n",vmConnectionStatus); - JavaVMAttachArgs attachmentArgs; - attachmentArgs.version = JNI_VERSION_1_2; - attachmentArgs.name = NULL; - attachmentArgs.group = NULL; - attachReturnStatus = jvm->AttachCurrentThread((void **)&env, &attachmentArgs); - if ((env != NULL) && env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - } else { - // should really look for JNI_OK versus an error because it could have been JNI_EVERSION - // started method with thread hooked to VM so no need to attach again - //printf("Unhook: No need to attach because already attached %d\n",vmConnectionStatus); - } - - // we should always have an env by this point but lets be paranoid and check - if (env != NULL){ - env->DeleteGlobalRef(javaSinkObj); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - } - if (MethNum) { - delete [] MethName; - delete [] MethID; - } - // detach from thread only if we attached to it in this function - if (attachReturnStatus == 0){ - jvm->DetachCurrentThread(); - //printf("Unhook: Detached\n"); - } else { - //printf("Unhook: No need to detatch because attached prior to method\n"); - } - //fflush(stdout); -} - -void EventProxy::Disconnect() { - if (connected) { - pCP->Unadvise(dwEventCookie); - } -} - -// I only support the eventIID interface which was passed in -// by the DispatchEvent wrapper who looked it up as the -// source object's default source interface -STDMETHODIMP EventProxy::QueryInterface(REFIID rid, void **ppv) -{ - if (rid == IID_IUnknown || rid == eventIID || rid == IID_IDispatch) - { - *ppv = this; - AddRef(); - return S_OK; - } - return E_NOINTERFACE; -} - -// This should never get called - the event source fires events -// by dispid's, not by name -STDMETHODIMP EventProxy::GetIDsOfNames(REFIID riid, - OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgDispID) -{ - return E_UNEXPECTED; -} - -// The actual callback from the connection point arrives here -STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid, - LCID lcid, unsigned short wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - const char *eventMethodName = NULL; //Sourceforge report 1394001 - JNIEnv *env = NULL; - - // map dispID to jmethodID - for(int i=0;iAttachCurrentThread((void **)&env, &attachmentArgs); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - - if (!eventMethodName) - { - // could not find this signature in list - // printf("Invoke: didn't find method name for dispatch id %d\n",dispID); - // this probably leaves a native thread attached to the vm when we don't want it - ThrowComFail(env, "Event method received was not defined as part of callback interface", -1); - - // should we detatch before returning?? We probably never get here if we ThrowComFail() - // jvm->DetachCurrentThread(); - return S_OK; - } - - // find the class of the InvocationHandler - jclass javaSinkClass = env->GetObjectClass(javaSinkObj); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - //printf("Invoke: Got sink class\n"); - jmethodID invokeMethod; - invokeMethod = env->GetMethodID(javaSinkClass, "invoke", "(Ljava/lang/String;[Lcom/jacob/com/Variant;)Lcom/jacob/com/Variant;"); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - jstring eventMethodNameAsString = env->NewStringUTF(eventMethodName); - //printf("Invoke: Got method name\n"); - // now do what we need for the variant - jmethodID getVariantMethod = env->GetMethodID(javaSinkClass, "getVariant", "()Lcom/jacob/com/Variant;"); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - //printf("Invoke: Found way too getVariant\n"); - jobject aVariantObj = env->CallObjectMethod(javaSinkObj, getVariantMethod); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - //printf("Invoke: Made Variant\n"); - jclass variantClass = env->GetObjectClass(aVariantObj); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - - // create the variant parameter array - // how many params - int numVariantParams = pDispParams->cArgs; - // make an array of them - jobjectArray varr = env->NewObjectArray(numVariantParams, variantClass, 0); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - //printf("Invoke: Created Array\n"); - int i,j; - for(i=numVariantParams-1,j=0;i>=0;i--,j++) - { - // construct a java variant holder - jobject arg = env->CallObjectMethod(javaSinkObj, getVariantMethod); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - // get the empty variant from it - VARIANT *va = extractVariant(env, arg); - // copy the value - VariantCopy(va, &pDispParams->rgvarg[i]); - // put it in the array - env->SetObjectArrayElement(varr, j, arg); - env->DeleteLocalRef(arg); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - } - //printf("Invoke: Filled Array\n"); - // Set up the return value - jobject ret; - - ret = env->CallObjectMethod(javaSinkObj, invokeMethod, - eventMethodNameAsString, varr); - //printf("Invoke: Invoked callback\n"); - if (!env->ExceptionOccurred() && ret != NULL) { - VariantCopy(pVarResult, extractVariant(env,ret)); - } - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - // don't need the first variant we created to get the class - // SF 1689061 change not accepted but put in as comment for later reminder - //Java_com_jacob_com_Variant_release(env, aVariantObj); - env->DeleteLocalRef(aVariantObj); - if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear();} - - // Begin code from Jiffie team that copies parameters back from java to COM - for(i=numVariantParams-1,j=0;i>=0;i--,j++) - { - jobject arg = env->GetObjectArrayElement(varr, j); - VARIANT *java = extractVariant(env, arg); - VARIANT *com = &pDispParams->rgvarg[i]; - convertJavaVariant(java, com); - // SF 1689061 change not accepted but put in as comment for later reminder - //Java_com_jacob_com_Variant_release(env, arg); - zeroVariant(env, arg); - env->DeleteLocalRef(arg); - } - // End code from Jiffie team that copies parameters back from java to COM - // detach from thread - //printf("Invoke: Detatching\n"); - jvm->DetachCurrentThread(); - //fflush(stdout); - return S_OK; - } - return E_NOINTERFACE; -} - -void EventProxy::convertJavaVariant(VARIANT *java, VARIANT *com) { - - switch (com->vt) - { - case VT_DISPATCH: - { - switch (java->vt) - { - case VT_DISPATCH: - { - V_DISPATCH(com) = V_DISPATCH(java); - break; - } - - case VT_DISPATCH | VT_BYREF: - { - V_DISPATCH(com) = *V_DISPATCHREF(java); - break; - } - } - break; - } - - case VT_DISPATCH | VT_BYREF: - { - switch (java->vt) - { - case VT_DISPATCH: - { - *V_DISPATCHREF(com) = V_DISPATCH(java); - break; - } - - case VT_DISPATCH | VT_BYREF: - { - *V_DISPATCHREF(com) = *V_DISPATCHREF(java); - break; - } - } - break; - } - - case VT_BOOL: - { - switch (java->vt) - { - case VT_BOOL: - { - V_BOOL(com) = V_BOOL(java); - break; - } - - case VT_BOOL | VT_BYREF: - { - V_BOOL(com) = *V_BOOLREF(java); - break; - } - } - break; - } - - case VT_BOOL | VT_BYREF: - { - switch (java->vt) - { - case VT_BOOL: - { - *V_BOOLREF(com) = V_BOOL(java); - break; - } - - case VT_BOOL | VT_BYREF: - { - *V_BOOLREF(com) = *V_BOOLREF(java); - break; - } - } - break; - } - - case VT_UI1: - { - switch (java->vt) - { - case VT_UI1: - { - V_UI1(com) = V_UI1(java); - break; - } - - case VT_UI1 | VT_BYREF: - { - V_UI1(com) = *V_UI1REF(java); - break; - } - } - break; - } - - case VT_UI1 | VT_BYREF: - { - switch (java->vt) - { - case VT_UI1: - { - *V_UI1REF(com) = V_UI1(java); - break; - } - - case VT_UI1 | VT_BYREF: - { - *V_UI1REF(com) = *V_UI1REF(java); - break; - } - } - break; - } - - - case VT_I2: - { - switch (java->vt) - { - case VT_I2: - { - V_I2(com) = V_I2(java); - break; - } - - case VT_I2 | VT_BYREF: - { - V_I2(com) = *V_I2REF(java); - break; - } - } - break; - } - - case VT_I2 | VT_BYREF: - { - switch (java->vt) - { - case VT_I2: - { - *V_I2REF(com) = V_I2(java); - break; - } - - case VT_I2 | VT_BYREF: - { - *V_I2REF(com) = *V_I2REF(java); - break; - } - } - break; - } - - case VT_I4: - { - switch (java->vt) - { - case VT_I4: - { - V_I4(com) = V_I4(java); - break; - } - - case VT_I4 | VT_BYREF: - { - V_I4(com) = *V_I4REF(java); - break; - } - } - break; - } - - case VT_I4 | VT_BYREF: - { - switch (java->vt) - { - case VT_I4: - { - *V_I4REF(com) = V_I4(java); - break; - } - - case VT_I4 | VT_BYREF: - { - *V_I4REF(com) = *V_I4REF(java); - break; - } - } - break; - } - - case VT_R4: - { - switch (java->vt) - { - case VT_R4: - { - V_R4(com) = V_R4(java); - break; - } - - case VT_R4 | VT_BYREF: - { - V_R4(com) = *V_R4REF(java); - break; - } - } - break; - } - - case VT_R4 | VT_BYREF: - { - switch (java->vt) - { - case VT_R4: - { - *V_R4REF(com) = V_R4(java); - break; - } - - case VT_R4 | VT_BYREF: - { - *V_R4REF(com) = *V_R4REF(java); - break; - } - } - break; - } - - case VT_R8: - { - switch (java->vt) - { - case VT_R8: - { - V_R8(com) = V_R8(java); - break; - } - - case VT_R8 | VT_BYREF: - { - V_R8(com) = *V_R8REF(java); - break; - } - } - break; - } - - case VT_R8 | VT_BYREF: - { - switch (java->vt) - { - case VT_R8: - { - *V_R8REF(com) = V_R8(java); - break; - } - - case VT_R8 | VT_BYREF: - { - *V_R8REF(com) = *V_R8REF(java); - break; - } - } - break; - } - - case VT_I1: - { - switch (java->vt) - { - case VT_I1: - { - V_I1(com) = V_I1(java); - break; - } - - case VT_I1 | VT_BYREF: - { - V_I1(com) = *V_I1REF(java); - break; - } - } - break; - } - - case VT_I1 | VT_BYREF: - { - switch (java->vt) - { - case VT_I1: - { - *V_I1REF(com) = V_I1(java); - break; - } - - case VT_I1 | VT_BYREF: - { - *V_I1REF(com) = *V_I1REF(java); - break; - } - } - break; - } - - case VT_UI2: - { - switch (java->vt) - { - case VT_UI2: - { - V_UI2(com) = V_UI2(java); - break; - } - - case VT_UI2 | VT_BYREF: - { - V_UI2(com) = *V_UI2REF(java); - break; - } - } - break; - } - - case VT_UI2 | VT_BYREF: - { - switch (java->vt) - { - case VT_UI2: - { - *V_UI2REF(com) = V_UI2(java); - break; - } - - case VT_UI2 | VT_BYREF: - { - *V_UI2REF(com) = *V_UI2REF(java); - break; - } - } - break; - } - - case VT_UI4: - { - switch (java->vt) - { - case VT_UI4: - { - V_UI4(com) = V_UI4(java); - break; - } - - case VT_UI4 | VT_BYREF: - { - V_UI4(com) = *V_UI4REF(java); - break; - } - } - break; - } - - case VT_UI4 | VT_BYREF: - { - switch (java->vt) - { - case VT_UI4: - { - *V_UI4REF(com) = V_UI4(java); - break; - } - - case VT_UI4 | VT_BYREF: - { - *V_UI4REF(com) = *V_UI4REF(java); - break; - } - } - break; - } - - case VT_INT: - { - switch (java->vt) - { - case VT_INT: - { - V_INT(com) = V_INT(java); - break; - } - - case VT_INT | VT_BYREF: - { - V_INT(com) = *V_INTREF(java); - break; - } - } - break; - } - - case VT_INT | VT_BYREF: - { - switch (java->vt) - { - case VT_INT: - { - *V_INTREF(com) = V_INT(java); - break; - } - - case VT_INT | VT_BYREF: - { - *V_INTREF(com) = *V_INTREF(java); - break; - } - } - break; - } - - case VT_UINT: - { - switch (java->vt) - { - case VT_UINT: - { - V_UINT(com) = V_UINT(java); - break; - } - - case VT_UINT | VT_BYREF: - { - V_UINT(com) = *V_UINTREF(java); - break; - } - } - break; - } - - case VT_UINT | VT_BYREF: - { - switch (java->vt) - { - case VT_UINT: - { - *V_UINTREF(com) = V_UINT(java); - break; - } - - case VT_UINT | VT_BYREF: - { - *V_UINTREF(com) = *V_UINTREF(java); - break; - } - } - break; - } - - case VT_CY: - { - switch (java->vt) - { - case VT_CY: - { - V_CY(com) = V_CY(java); - break; - } - - case VT_CY | VT_BYREF: - { - V_CY(com) = *V_CYREF(java); - break; - } - } - break; - } - - case VT_CY | VT_BYREF: - { - switch (java->vt) - { - case VT_CY: - { - *V_CYREF(com) = V_CY(java); - break; - } - - case VT_CY | VT_BYREF: - { - *V_CYREF(com) = *V_CYREF(java); - break; - } - } - break; - } - - case VT_DATE: - { - switch (java->vt) - { - case VT_DATE: - { - V_DATE(com) = V_DATE(java); - break; - } - - case VT_DATE | VT_BYREF: - { - V_DATE(com) = *V_DATEREF(java); - break; - } - } - break; - } - - case VT_DATE | VT_BYREF: - { - switch (java->vt) - { - case VT_DATE: - { - *V_DATEREF(com) = V_DATE(java); - break; - } - - case VT_DATE | VT_BYREF: - { - *V_DATEREF(com) = *V_DATEREF(java); - break; - } - } - break; - } - - case VT_BSTR: - { - switch (java->vt) - { - case VT_BSTR: - { - V_BSTR(com) = V_BSTR(java); - break; - } - - case VT_BSTR | VT_BYREF: - { - V_BSTR(com) = *V_BSTRREF(java); - break; - } - } - break; - } - - case VT_BSTR | VT_BYREF: - { - switch (java->vt) - { - case VT_BSTR: - { - *V_BSTRREF(com) = V_BSTR(java); - break; - } - - case VT_BSTR | VT_BYREF: - { - *V_BSTRREF(com) = *V_BSTRREF(java); - break; - } - } - break; - } - - case VT_DECIMAL: - { - switch (java->vt) - { - case VT_DECIMAL: - { - V_DECIMAL(com) = V_DECIMAL(java); - break; - } - - case VT_DECIMAL | VT_BYREF: - { - V_DECIMAL(com) = *V_DECIMALREF(java); - break; - } - } - break; - } - - case VT_DECIMAL | VT_BYREF: - { - switch (java->vt) - { - case VT_DECIMAL: - { - *V_DECIMALREF(com) = V_DECIMAL(java); - break; - } - - case VT_DECIMAL | VT_BYREF: - { - *V_DECIMALREF(com) = *V_DECIMALREF(java); - break; - } - } - break; - } - - - } -} diff --git a/cpp/jacob/EventProxy.h b/cpp/jacob/EventProxy.h deleted file mode 100644 index 903fcb1..0000000 --- a/cpp/jacob/EventProxy.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -#include -#include -#include -#include -#include "stdafx.h" -#include "util.h" - -/* - * An instance of this class stands between a connection point - * and a java object. When it gets invoked from the cp, it reflects - * the call into the java object dynamically. The eventIID is passed - * in as are the valid dispids and the corresponding names. A map - * is created between the dispids and the java object's method in - * the constructor. For now, all the java event methods have to have - * the same signature: (Variant[]) - */ -class EventProxy : public IDispatch -{ -private: - int connected; - LONG m_cRef; // a reference counter - CComPtr pCP; // the connection point - DWORD dwEventCookie; // connection point cookie - jobject javaSinkObj; // the java object to delegate calls - - IID eventIID; // the interface iid passed in - int MethNum; // number of methods in the callback interface - CComBSTR *MethName; // Array of method names - DISPID *MethID; // Array of method ids, used to match invokations to method names - JavaVM *jvm; // The java vm we are running - void convertJavaVariant(VARIANT *java, VARIANT *com); - void Connect(JNIEnv *env); - void Disconnect(); -public: - // constuct with a global JNI ref to a sink object - // to which we will delegate event callbacks - EventProxy(JNIEnv *jenv, - jobject aSinkObj, - CComPtr pConn, - IID eventIID, - CComBSTR *mName, - DISPID *mID, - int mNum); - ~EventProxy(); - - // IUnknown methods - STDMETHODIMP_(ULONG) AddRef(void) - { - LONG res = InterlockedIncrement(&m_cRef); - return res; - } - - STDMETHODIMP_(ULONG) Release(void) - { - LONG res = InterlockedDecrement(&m_cRef); - if (res == 0) { - delete this; - } - return res; - - } - - STDMETHODIMP QueryInterface(REFIID rid, void **ppv); - - // IDispatch methods - STDMETHODIMP GetTypeInfoCount(UINT *num) - { - *num = 0; - return S_OK; - } - - STDMETHODIMP GetTypeInfo(UINT, LCID, ITypeInfo **pptInfo) - { - *pptInfo=NULL; - return E_NOTIMPL; - } - - // These are the actual supported methods - STDMETHODIMP GetIDsOfNames(REFIID, OLECHAR **, UINT, LCID , DISPID *); - STDMETHODIMP Invoke(DISPID, REFIID, LCID, WORD , DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *); -}; diff --git a/cpp/jacob/STA.cpp b/cpp/jacob/STA.cpp deleted file mode 100644 index 2da50b5..0000000 --- a/cpp/jacob/STA.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "stdafx.h" -#include -#include "ComThread.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump - (JNIEnv *env, jobject obj) -{ - // store the current thread id so we can kill it - jclass argClass = env->GetObjectClass(obj); - jfieldID ajf = env->GetFieldID( argClass, "threadID", "I"); - jint threadID = (jint)GetCurrentThreadId(); - env->SetIntField(obj, ajf, threadID); - - MSG msg; - - ZeroMemory(&msg, sizeof(msg)); - msg.wParam = S_OK; - - while (GetMessage(&msg, NULL, 0, 0)) - { - DispatchMessage(&msg); - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump - (JNIEnv *env, jobject obj) -{ - jclass argClass = env->GetObjectClass(obj); - jfieldID ajf = env->GetFieldID( argClass, "threadID", "I"); - jint threadID = env->GetIntField(obj, ajf); - PostThreadMessage((DWORD)threadID, WM_QUIT, 0, 0); -} - -} diff --git a/cpp/jacob/STA.h b/cpp/jacob/STA.h deleted file mode 100644 index b575849..0000000 --- a/cpp/jacob/STA.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -/* Header for class STA */ - -#ifndef _Included_com_jacob_com_STA -#define _Included_com_jacob_com_STA -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_jacob_com_STA - * Method: doMessagePump - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_STA_doMessagePump - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_STA - * Method: quitMessagePump - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_STA_quitMessagePump - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/jacob/SafeArray.cpp b/cpp/jacob/SafeArray.cpp deleted file mode 100644 index 21a5939..0000000 --- a/cpp/jacob/SafeArray.cpp +++ /dev/null @@ -1,3177 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "SafeArray.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -#define V_FLD "m_pV" - -static SAFEARRAY *makeArray(int vt, int nDims, long *lb, long *cel) -{ - if (nDims == 1) { - // no need to alloc - SAFEARRAYBOUND sab; - sab.lLbound = lb[0]; - sab.cElements = cel[0]; - SAFEARRAY *sa = SafeArrayCreate(vt,1,&sab); - return sa; - } else { - SAFEARRAYBOUND* rgsaBounds = new SAFEARRAYBOUND[nDims]; - for(int i=0;iGetObjectClass(arg); - jfieldID vf = env->GetFieldID( argClass, V_FLD, "I"); - jint vnum = env->GetIntField(arg, vf); - if (vnum != NULL) - { - // if vnum is not NULL, then there is a Variant wrapper present - VARIANT *v = (VARIANT *)vnum; - return v; - } - return NULL; -} - -// extract a SAFEARRAY from a SafeArray object -SAFEARRAY *extractSA(JNIEnv *env, jobject arg) -{ - VARIANT *v = extractWrapper(env, arg); - if (v != NULL) - { - SAFEARRAY *sa = V_ARRAY(v); - return sa; - } - return NULL; -} - -// deep copy a SAFEARRAY -SAFEARRAY *copySA(SAFEARRAY *psa) -{ - // easiest way to make a deep copy is to use VariantCopy - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - VARIANT v1, v2; - - VariantInit(&v1); - VariantInit(&v2); - V_VT(&v1) = VT_ARRAY | vt; - V_ARRAY(&v1) = psa; - VariantCopy(&v2, &v1); - SAFEARRAY *sa = V_ARRAY(&v2); - VariantInit(&v2); // make sure it's not owned by this variant - VariantClear(&v2); - VariantInit(&v1); - VariantClear(&v1); - - return sa; -} - -// create a VARIANT wrapper for the safearray -void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy) -{ - // construct a variant to hold the result - // the variant then owns the array - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, V_FLD, "I"); - jint vnum = env->GetIntField(arg, ajf); - VARIANT *v = (VARIANT *)vnum; - if (v == NULL) - { - v = new VARIANT(); - VariantInit(v); - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - V_VT(v) = VT_ARRAY | vt; - V_ARRAY(v) = copy ? copySA(sa) : sa; - env->SetIntField(arg, ajf, (unsigned int)v); -} - -/* - * Class: SafeArray - * Method: init - * Signature: (I[I[I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_init - (JNIEnv *env, jobject _this, jint vt, jintArray lb, jintArray cel) -{ - jint *lbounds = env->GetIntArrayElements(lb, NULL); - jint *celems = env->GetIntArrayElements(cel, NULL); - int nDims = env->GetArrayLength(lb); - // array lengths must match - if (nDims != env->GetArrayLength(cel)) return; - // build the sa according to params - if ( nDims > 0 ) - { - SAFEARRAY *sa = makeArray(vt, nDims, lbounds, celems); - env->ReleaseIntArrayElements(lb, lbounds, 0); - env->ReleaseIntArrayElements(cel, celems, 0); - jclass clazz = env->GetObjectClass(_this); - setSA(env, _this, sa, 0); - } -} - -/* - * Class: SafeArray - * Method: clone - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_clone - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) - { - // prepare a new return value - jclass saClass = env->GetObjectClass(_this); - jmethodID saCons = env->GetMethodID(saClass, "", "()V"); - // construct an SA to return - jobject newSA = env->NewObject(saClass, saCons); - // wrap in a Variant - setSA(env, newSA, psa, 1); - return newSA; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: destroy - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_destroy - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractWrapper(env, _this); - if (v) { - // this is the case where a Variant wrapper exists, in that - // case free the variant, but if there is just a raw SA, then - // the owning variant will free it - jclass saClass = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID(saClass, V_FLD, "I"); - VariantClear(v); - delete v; - env->SetIntField(_this, jf, (unsigned int)0); - } -} - -/* - * Class: SafeArray - * Method: getvt - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getvt - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - return (jint)vt; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: reinit - * Signature: (LSafeArray;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinit - (JNIEnv *env, jobject _this, jobject sa) -{ - // what to do here? -} - -/* - * Class: SafeArray - * Method: reinterpretType - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinterpretType - (JNIEnv *env, jobject _this, jint vt) -{ -} - -/* - * Class: SafeArray - * Method: getLBound - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__ - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint lb; - SafeArrayGetLBound(psa, 1, &lb); - return lb; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getLBound - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__I - (JNIEnv *env, jobject _this, jint dim) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint lb; - SafeArrayGetLBound(psa, dim, &lb); - return lb; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getUBound - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__ - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint lb; - SafeArrayGetUBound(psa, 1, &lb); - return lb; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getUBound - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__I - (JNIEnv *env, jobject _this, jint dim) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint lb; - SafeArrayGetUBound(psa, dim, &lb); - return lb; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getNumDim - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getNumDim - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - return SafeArrayGetDim(psa); - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getFeatures - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getFeatures - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - SafeArrayLock(psa); - jint features = psa->fFeatures; - SafeArrayUnlock(psa); - return features; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: getElemSize - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getElemSize - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (psa) { - jint siz = SafeArrayGetElemsize(psa); - return siz; - } - return NULL; -} - -static int numElements(SAFEARRAY *psa) -{ - int nDims = SafeArrayGetDim(psa); - int elems = 0; - for(int i=1;i<=nDims;i++) { - long lb, ub; - SafeArrayGetLBound(psa, i, &lb); - SafeArrayGetUBound(psa, i, &ub); - elems += ub - lb + 1; - } - return elems; -} - -/* - * Class: SafeArray - * Method: fromCharArray - * Signature: ([C)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromCharArray - (JNIEnv *env, jobject _this, jcharArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the double array - don't make a copy - jchar *arrayElements = env->GetCharArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_UI2; - for(int i=0;iReleaseCharArrayElements(a, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: fromIntArray - * Signature: ([I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromIntArray - (JNIEnv *env, jobject _this, jintArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the int array - don't make a copy - jint *arrayElements = env->GetIntArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_I4; - for(int i=0;iReleaseIntArrayElements(a, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: fromLongArray - * Signature: ([L)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromLongArray - (JNIEnv *env, jobject _this, jlongArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the long array - don't make a copy - jlong *arrayElements = env->GetLongArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_I8; - for(int i=0;iReleaseLongArrayElements(a, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: fromShortArray - * Signature: ([S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromShortArray - (JNIEnv *env, jobject _this, jshortArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the short array - don't make a copy - jshort *arrayElements = env->GetShortArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_I2; - for(int i=0;iReleaseShortArrayElements(a, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: fromDoubleArray - * Signature: ([D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromDoubleArray - (JNIEnv *env, jobject _this, jdoubleArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the double array - don't make a copy - jdouble *arrayElements = env->GetDoubleArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_R8; - for(int i=0;iReleaseDoubleArrayElements(a, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: fromStringArray - * Signature: ([Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray - (JNIEnv *env, jobject _this, jobjectArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BSTR; - for(int i=0;iGetObjectArrayElement(a, i); - // jacob report 1224219 should use unicode and not UTF-8 - // GetStringUTFChars() replaced with GetStringChars() - // (Variant modified in previous report) - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); // SR cast SF 1689061 - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - long x = i; - SafeArrayPutElement(psa,&x,&v); - env->ReleaseStringChars(s, str); - VariantClear(&v); - } - } else if (vt == VT_BSTR) { - for(int i=0;iGetObjectArrayElement(a, i); - // jacob report 1224219 should use unicode and not UTF-8 - // GetStringUTFChars() replaced with GetStringChars() - // (Variant modified in previous report) - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); // SR cast SF 1689061 - BSTR bstr = bs.Detach(); - long x = i; - SafeArrayPutElement(psa,&x,bstr); - env->ReleaseStringChars(s, str); - } - } else { - ThrowComFail(env, "safearray cannot be assigned from string\n", 0); - } -} - -/* - * Class: SafeArray - * Method: fromByteArray - * Signature: ([B)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromByteArray - (JNIEnv *env, jobject _this, jbyteArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the byte array - don't make a copy - jbyte *arrayElements = env->GetByteArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_UI1; - for(int i=0;iReleaseByteArrayElements(a, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: fromFloatArray - * Signature: ([F)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromFloatArray - (JNIEnv *env, jobject _this, jfloatArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the float array - don't make a copy - jfloat *arrayElements = env->GetFloatArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_R4; - for(int i=0;iReleaseFloatArrayElements(a, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: fromBooleanArray - * Signature: ([Z)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromBooleanArray - (JNIEnv *env, jobject _this, jbooleanArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - // get the boolean array - don't make a copy - jboolean *arrayElements = env->GetBooleanArrayElements(a, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - for(int i=0;iReleaseBooleanArrayElements(a, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: fromVariantArray - * Signature: ([LVariant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromVariantArray - (JNIEnv *env, jobject _this, jobjectArray a) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(a); - if (len > numElements(psa)) - { - // max size of memcpy - len = numElements(psa); - } - if (vt == VT_VARIANT) { - for(int i=0;iGetObjectArrayElement(a, i); - VARIANT *v = extractVariant(env, var); - long x = i; - if (v) SafeArrayPutElement(psa,&x,v); - } - } else { - ThrowComFail(env, "safearray cannot be assigned from variant", -1); - } -} - -/* - * Class: SafeArray - * Method: toCharArray - * Signature: ()[C - */ -JNIEXPORT jcharArray JNICALL Java_com_jacob_com_SafeArray_toCharArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_UI2 || vt == VT_I2) { - jcharArray arrayElements = env->NewCharArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetCharArrayRegion(arrayElements, 0, num, (jchar *)pData); - SafeArrayUnaccessData(sa); - return arrayElements; - } else if (vt == VT_VARIANT) { - jcharArray arrayElements = env->NewCharArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_UI2))) { - return NULL; - } - jchar val = V_UI2(&v); - env->SetCharArrayRegion(arrayElements, i, 1, &val); - } - return arrayElements; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toIntArray - * Signature: ()[I - */ -JNIEXPORT jintArray JNICALL Java_com_jacob_com_SafeArray_toIntArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_I4) { - jintArray arrayElements = env->NewIntArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetIntArrayRegion(arrayElements, 0, num, (jint *)pData); - SafeArrayUnaccessData(sa); - return arrayElements; - } else if (vt == VT_VARIANT) { - jintArray arrayElements = env->NewIntArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_I4))) { - return NULL; - } - jint val = V_I4(&v); - env->SetIntArrayRegion(arrayElements, i, 1, &val); - } - return arrayElements; - } - return NULL; -} - - -/* - * Class: SafeArray - * Method: toLongArray - * Signature: ()[L - */ -JNIEXPORT jlongArray JNICALL Java_com_jacob_com_SafeArray_toLongArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_I8) { - jlongArray arrayElements = env->NewLongArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetLongArrayRegion(arrayElements, 0, num, (jlong *)pData); - SafeArrayUnaccessData(sa); - return arrayElements; - } else if (vt == VT_VARIANT) { - jlongArray arrayElements = env->NewLongArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_I8))) { - return NULL; - } - jlong val = V_I8(&v); - env->SetLongArrayRegion(arrayElements, i, 1, &val); - } - return arrayElements; - } - return NULL; -} - - -/* - * Class: SafeArray - * Method: toShortArray - * Signature: ()[S - */ -JNIEXPORT jshortArray JNICALL Java_com_jacob_com_SafeArray_toShortArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_I2) { - jshortArray arrayElements = env->NewShortArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetShortArrayRegion(arrayElements, 0, num, (jshort *)pData); - SafeArrayUnaccessData(sa); - return arrayElements; - } else if (vt == VT_VARIANT) { - jshortArray arrayElements = env->NewShortArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_I2))) { - return NULL; - } - jshort val = V_I2(&v); - env->SetShortArrayRegion(arrayElements, i, 1, &val); - } - return arrayElements; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toDoubleArray - * Signature: ()[D - */ -JNIEXPORT jdoubleArray JNICALL Java_com_jacob_com_SafeArray_toDoubleArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_R8) { - jdoubleArray arrayElements = env->NewDoubleArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetDoubleArrayRegion(arrayElements, 0, num, (jdouble *)pData); - SafeArrayUnaccessData(sa); - return arrayElements; - } else if (vt == VT_VARIANT) { - jdoubleArray arrayElements = env->NewDoubleArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_R8))) { - return NULL; - } - jdouble val = V_R8(&v); - env->SetDoubleArrayRegion(arrayElements, i, 1, &val); - } - return arrayElements; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toStringArray - * Signature: ()[Ljava/lang/String; - */ -JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toStringArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) - { - jclass sClass = env->FindClass("java/lang/String"); - jobjectArray arrayElements = env->NewObjectArray(num, sClass, NULL); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { - return NULL; - } - BSTR bs = V_BSTR(&v); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - env->SetObjectArrayElement(arrayElements, i, js); - } - return arrayElements; - } else if (vt == VT_BSTR) { - jclass sClass = env->FindClass("java/lang/String"); - jobjectArray arrayElements = env->NewObjectArray(num, sClass, NULL); - for(int i=lb;i<=ub;i++) { - BSTR bs = NULL; - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &bs); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - env->SetObjectArrayElement(arrayElements, i, js); - } - return arrayElements; - } - ThrowComFail(env, "safearray cannot be converted to string[]", 0); - return NULL; -} - -/* - * Class: SafeArray - * Method: toByteArray - * Signature: ()[B - */ -JNIEXPORT jbyteArray JNICALL Java_com_jacob_com_SafeArray_toByteArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_I1 || vt == VT_UI1) { - jbyteArray arrayElements = env->NewByteArray(num); - jbyte *pData; - SafeArrayAccessData(sa, (void **)&pData); - env->SetByteArrayRegion(arrayElements, 0, num, pData); - SafeArrayUnaccessData(sa); - return arrayElements; - } else if (vt == VT_VARIANT) { - jbyteArray arrayElements = env->NewByteArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb,j=0;i<=ub;i++,j++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_UI1))) { - return NULL; - } - jbyte val = V_UI1(&v); - env->SetByteArrayRegion(arrayElements, j, 1, &val); - } - return arrayElements; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toFloatArray - * Signature: ()[F - */ -JNIEXPORT jfloatArray JNICALL Java_com_jacob_com_SafeArray_toFloatArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_R4) { - jfloatArray arrayElements = env->NewFloatArray(num); - void *pData; - SafeArrayAccessData(sa, &pData); - env->SetFloatArrayRegion(arrayElements, 0, num, (jfloat *)pData); - SafeArrayUnaccessData(sa); - return arrayElements; - } else if (vt == VT_VARIANT) { - jfloatArray arrayElements = env->NewFloatArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_R4))) { - return NULL; - } - jfloat val = V_R4(&v); - env->SetFloatArrayRegion(arrayElements, i, 1, &val); - } - return arrayElements; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toBooleanArray - * Signature: ()[Z - */ -JNIEXPORT jbooleanArray JNICALL Java_com_jacob_com_SafeArray_toBooleanArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_BOOL) { - // need to loop because jboolean=1 byte and VARIANT_BOOL=2 bytes - jbooleanArray arrayElements = env->NewBooleanArray(num); - VARIANT_BOOL v; - for(int i=lb,j=0;i<=ub;i++,j++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - jboolean val = v == VARIANT_TRUE ? JNI_TRUE : JNI_FALSE; - env->SetBooleanArrayRegion(arrayElements, j, 1, &val); - } - return arrayElements; - } else if (vt == VT_VARIANT) { - jbooleanArray arrayElements = env->NewBooleanArray(num); - VARIANT v; - VariantInit(&v); - for(int i=lb;i<=ub;i++) { - long ix = i; - SafeArrayGetElement(sa, &ix, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { - return NULL; - } - jboolean val = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE : JNI_FALSE; - env->SetBooleanArrayRegion(arrayElements, i, 1, &val); - } - return arrayElements; - } - return NULL; -} - -/* - * Class: SafeArray - * Method: toVariantArray - * Signature: ()[LVariant; - */ -JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toVariantArray - (JNIEnv *env, jobject _this) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - int num = ub - lb + 1; - jclass vClass = env->FindClass("com/jacob/com/Variant"); - // create an array of Variant's - jobjectArray varr = env->NewObjectArray(num, vClass, 0); - // fill them in - jmethodID variantCons = - env->GetMethodID(vClass, "", "()V"); - for(int i=lb;i<=ub;i++) { - long ix = i; - // construct a variant to return - jobject newVariant = env->NewObject(vClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - SafeArrayGetElement(sa, &ix, (void*) v); - // put in object array - env->SetObjectArrayElement(varr, i, newVariant); - } - return varr; -} - -// this is an ugly way to avoid copy/pasting the same code - -// returns a value extracted from a 1 dimensional SafeArray -// uses the idx variable in the object this macro is included in -#define GET1DCODE(varType, varAccess, jtyp) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; \ - } \ - if (SafeArrayGetDim(sa) != 1) { \ - ThrowComFail(env, "safearray is not 1D", -1); \ - return NULL; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - SafeArrayGetElement(sa, &idx, (void*) &v); \ - if (FAILED(VariantChangeType(&v, &v, 0, varType))) { \ - ThrowComFail(env, "VariantChangeType failed", -1); \ - return NULL; \ - } \ - return (jtyp)varAccess(&v); \ - } else if (vt == varType) { \ - jtyp jc; \ - SafeArrayGetElement(sa, &idx, (void*) &jc); \ - return jc; \ - } else { \ - return NULL; \ - } - -// returns a value extracted from a 2 dimensional SafeArray -// uses i and j from the method that this macro is included in as indexes -#define GET2DCODE(varType, varAccess, jtyp) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; \ - } \ - if (SafeArrayGetDim(sa) != 2) { \ - ThrowComFail(env, "safearray is not 2D", -1); \ - return NULL; \ - } \ - long idx[2] = {i, j}; \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - SafeArrayGetElement(sa, idx, (void*) &v); \ - if (FAILED(VariantChangeType(&v, &v, 0, varType))) { \ - ThrowComFail(env, "VariantChangeType failed", -1); \ - return NULL; \ - } \ - return (jtyp)varAccess(&v); \ - } else if (vt == varType) { \ - jtyp jc; \ - SafeArrayGetElement(sa, idx, (void*) &jc); \ - return jc; \ - } else { \ - return NULL; \ - } - - -// sets the values on a one dimensional array -#define SET1DCODE(varType, varAccess) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - if (SafeArrayGetDim(sa) != 1) { \ - ThrowComFail(env, "safearray is not 1D", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - V_VT(&v) = varType; \ - varAccess(&v) = c; \ - SafeArrayPutElement(sa,&idx,&v); \ - } else if (vt == varType) { \ - SafeArrayPutElement(sa,&idx,&c); \ - } else { \ - ThrowComFail(env, "safearray type mismatch", -1); \ - } \ - -// sets the values into a 2 dimensional array -#define SET2DCODE(varType, varAccess) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - if (SafeArrayGetDim(sa) != 2) { \ - ThrowComFail(env, "safearray is not 2D", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - long idx[2] = {i,j}; \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - V_VT(&v) = varType; \ - varAccess(&v) = c; \ - SafeArrayPutElement(sa,idx,&v); \ - } else if (vt == varType) { \ - SafeArrayPutElement(sa,idx,&c); \ - } else { \ - ThrowComFail(env, "safearray type mismatch", -1); \ - } - -#define GETARRAYCODE(varType, varType2, varAccess, jtyp, jsetArr) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == varType || vt == varType2) { \ - jtyp *pData; \ - SafeArrayAccessData(sa, (void **)&pData); \ - env->jsetArr(ja, ja_start, nelem, &pData[idx]); \ - SafeArrayUnaccessData(sa); \ - return; \ - } else if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - for(int i=idx, j=ja_start;ijsetArr(ja, j, 1, &val); \ - } \ - } - -#define SETARRAYCODE(varType, varType2, varAccess, jtyp, jgetArr, jrelArr) \ - SAFEARRAY *psa = extractSA(env, _this); \ - if (!psa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(psa, &vt); \ - jtyp *arrayElements = env->jgetArr(ja, 0); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - V_VT(&v) = varType; \ - for(int i=ja_start,j=idx;ijrelArr(ja, arrayElements, 0); - -/* - * Class: SafeArray - * Method: getChar - * Signature: (I)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_UI2, V_UI2, jchar) -} - -/* - * Class: SafeArray - * Method: getChar - * Signature: (II)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_UI2, V_UI2, jchar) -} - - -/* - * Class: SafeArray - * Method: setChar - * Signature: (IC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IC - (JNIEnv *env, jobject _this, jint idx, jchar c) -{ - SET1DCODE(VT_UI2, V_UI2); -} - -/* - * Class: SafeArray - * Method: setChar - * Signature: (IIC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IIC - (JNIEnv *env, jobject _this, jint i, jint j, jchar c) -{ - SET2DCODE(VT_UI2, V_UI2); -} - -/* - * Class: SafeArray - * Method: getChars - * Signature: (II[CI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getChars - (JNIEnv *env, jobject _this, jint idx, jint nelem, jcharArray ja, jint ja_start) -{ - GETARRAYCODE(VT_UI2, VT_I2, V_UI2, jchar, SetCharArrayRegion); -} - -/* - * Class: SafeArray - * Method: setChars - * Signature: (II[CI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChars - (JNIEnv *env, jobject _this, jint idx, jint nelem, jcharArray ja, jint ja_start) -{ - SETARRAYCODE(VT_UI2, VT_I2, V_UI2, jchar, - GetCharArrayElements, ReleaseCharArrayElements); -} - -/*----------------------- INTS ----------------------------------*/ - -/* - * Class: SafeArray - * Method: getInt - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_I4, V_I4, jint) -} - -/* - * Class: SafeArray - * Method: getInt - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_I4, V_I4, jint) -} - -/* - * Class: SafeArray - * Method: setInt - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__II - (JNIEnv *env, jobject _this, jint idx, jint c) -{ - SET1DCODE(VT_I4, V_I4); -} - -/* - * Class: SafeArray - * Method: setInt - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__III - (JNIEnv *env, jobject _this, jint i, jint j, jint c) -{ - SET2DCODE(VT_I4, V_I4); -} - -/* - * Class: SafeArray - * Method: getInts - * Signature: (II[II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getInts - (JNIEnv *env, jobject _this, jint idx, jint nelem, jintArray ja, jint ja_start) -{ - GETARRAYCODE(VT_I4, VT_I4, V_I4, jint, SetIntArrayRegion); -} - -/* - * Class: SafeArray - * Method: setInts - * Signature: (II[II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInts - (JNIEnv *env, jobject _this, jint idx, jint nelem, jintArray ja, jint ja_start) -{ - SETARRAYCODE(VT_I4, VT_I4, V_I4, jint, - GetIntArrayElements, ReleaseIntArrayElements); -} - -/*----------------------- END INTS ----------------------------------*/ -/*----------------------- LONGS ----------------------------------*/ - -/* - * Class: SafeArray - * Method: getLong - * Signature: (I)J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_SafeArray_getLong__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_I8, V_I8, jlong) -} - -/* - * Class: SafeArray - * Method: getLong - * Signature: (II)J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_SafeArray_getLong__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_I8, V_I8, jlong) -} - -/* - * Class: SafeArray - * Method: setLong - * Signature: (IJ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setLong__IJ - (JNIEnv *env, jobject _this, jint idx, jlong c) -{ - SET1DCODE(VT_I8, V_I8); -} - -/* - * Class: SafeArray - * Method: setLong - * Signature: (IIJ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setLong__IIJ - (JNIEnv *env, jobject _this, jint i, jint j, jlong c) -{ - SET2DCODE(VT_I8, V_I8); -} - -/* - * Class: SafeArray - * Method: getLongs - * Signature: (II[JI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getLongs - (JNIEnv *env, jobject _this, jint idx, jint nelem, jlongArray ja, jint ja_start) -{ - GETARRAYCODE(VT_I8, VT_I8, V_I8, jlong, SetLongArrayRegion); -} - -/* - * Class: SafeArray - * Method: setLongs - * Signature: (II[JI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setLongs - (JNIEnv *env, jobject _this, jint idx, jint nelem, jlongArray ja, jint ja_start) -{ - SETARRAYCODE(VT_I8, VT_I8, V_I8, jlong, - GetLongArrayElements, ReleaseLongArrayElements); -} - -/*------------------------ END LONGS -----------------------------*/ - - -/* - * Class: SafeArray - * Method: getShort - * Signature: (I)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_I2, V_I2, jshort) -} - -/* - * Class: SafeArray - * Method: getShort - * Signature: (II)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_I2, V_I2, jshort) -} - -/* - * Class: SafeArray - * Method: setShort - * Signature: (IS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IS - (JNIEnv *env, jobject _this, jint idx, jshort c) -{ - SET1DCODE(VT_I2, V_I2); -} - -/* - * Class: SafeArray - * Method: setShort - * Signature: (IIS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IIS - (JNIEnv *env, jobject _this, jint i, jint j, jshort c) -{ - SET2DCODE(VT_I2, V_I2); -} - -/* - * Class: SafeArray - * Method: getShorts - * Signature: (II[SI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getShorts - (JNIEnv *env, jobject _this, jint idx, jint nelem, jshortArray ja, jint ja_start) -{ - GETARRAYCODE(VT_I2, VT_I2, V_I2, jshort, SetShortArrayRegion); -} - -/* - * Class: SafeArray - * Method: setShorts - * Signature: (II[SI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShorts - (JNIEnv *env, jobject _this, jint idx, jint nelem, jshortArray ja, jint ja_start) -{ - SETARRAYCODE(VT_I2, VT_I2, V_I2, jshort, - GetShortArrayElements, ReleaseShortArrayElements); -} - -/* - * Class: SafeArray - * Method: getDouble - * Signature: (I)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_R8, V_R8, jdouble) -} - -/* - * Class: SafeArray - * Method: getDouble - * Signature: (II)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_R8, V_R8, jdouble) -} - -/* - * Class: SafeArray - * Method: setDouble - * Signature: (ID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__ID - (JNIEnv *env, jobject _this, jint idx, jdouble c) -{ - SET1DCODE(VT_R8, V_R8); -} - -/* - * Class: SafeArray - * Method: setDouble - * Signature: (IID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__IID - (JNIEnv *env, jobject _this, jint i, jint j, jdouble c) -{ - SET2DCODE(VT_R8, V_R8); -} - -/* - * Class: SafeArray - * Method: getDoubles - * Signature: (II[DI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getDoubles - (JNIEnv *env, jobject _this, jint idx, jint nelem, jdoubleArray ja, jint ja_start) -{ - GETARRAYCODE(VT_R8, VT_R8, V_R8, jdouble, SetDoubleArrayRegion); -} - -/* - * Class: SafeArray - * Method: setDoubles - * Signature: (II[DI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDoubles - (JNIEnv *env, jobject _this, jint idx, jint nelem, jdoubleArray ja, jint ja_start) -{ - SETARRAYCODE(VT_R8, VT_R8, V_R8, jdouble, - GetDoubleArrayElements, ReleaseDoubleArrayElements); -} - -/* - * Class: SafeArray - * Method: getString - * Signature: (I)Ljava/lang/String; - * - * There is supposed to be a leak in here, SourceForge 1224219 - * that should be fixed with a call to - * "StrFree, Release or VariantClear to release the memory" - * waiting on the actual patch the submitter used before modifying this - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I - (JNIEnv *env, jobject _this, jint idx) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - SafeArrayGetElement(psa, &idx, &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { - return NULL; - } - BSTR bs = V_BSTR(&v); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - // jacob report 1224219 - // SafeArrayGetElement memory must be freed http://www.canaimasoft.com/f90VB/OnlineManuals/Reference/TH_31.htm - VariantClear(&v); - return js; - } else if (vt == VT_BSTR) { - BSTR bs = NULL; - SafeArrayGetElement(psa, &idx, &bs); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - // jacob report 1224219 - // SafeArrayGetElement memory must be freed http://www.canaimasoft.com/f90VB/OnlineManuals/Reference/TH_31.htm - if (bs) SysFreeString(bs); - return js; - } - ThrowComFail(env, "safearray cannot get string", 0); - return NULL; -} - -/* - * Class: SafeArray - * Method: getString - * Signature: (II)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - long idx[2] = {i, j}; - SafeArrayGetElement(psa, idx, &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { - return NULL; - } - BSTR bs = V_BSTR(&v); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - return js; - } else if (vt == VT_BSTR) { - long idx[2] = {i, j}; - BSTR bs = NULL; - SafeArrayGetElement(psa, idx, &bs); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - return js; - } - ThrowComFail(env, "safearray cannot get string", 0); - return NULL; -} - -/* - * Class: SafeArray - * Method: setString - * Signature: (ILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__ILjava_lang_String_2 - (JNIEnv *env, jobject _this, jint idx, jstring s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); \ - return; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray not 1D", -1); \ - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - // SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars() - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - SafeArrayPutElement(sa,&idx,&v); \ - env->ReleaseStringChars(s, str); - VariantClear(&v); - } else if (vt == VT_BSTR) { - // SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars() - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); - SafeArrayPutElement(sa,&idx,bs.Detach()); - env->ReleaseStringChars(s, str); - } else { - ThrowComFail(env, "safearray cannot set string", 0); - } -} - -/* - * Class: SafeArray - * Method: setString - * Signature: (IILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__IILjava_lang_String_2 - (JNIEnv *env, jobject _this, jint i, jint j, jstring s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 2) { - ThrowComFail(env, "safearray is not 2D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - // SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars() - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - long idx[2] = {i,j}; - SafeArrayPutElement(sa,idx,&v); - env->ReleaseStringChars(s, str); - VariantClear(&v); - } else if (vt == VT_BSTR) { - long idx[2] = {i,j}; - // SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars() - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); - SafeArrayPutElement(sa,idx,bs.Detach()); - env->ReleaseStringChars(s, str); - } else { - ThrowComFail(env, "safearray cannot set string", 0); - } -} - -/* - * Class: SafeArray - * Method: getStrings - * Signature: (II[Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getStrings - (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) - { - VARIANT v; - for(int i=idx, j=ja_start;iNewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - env->SetObjectArrayElement(ja, j, js); - VariantClear(&v); - } - } - else if (vt == VT_BSTR) - { - BSTR bs = NULL; - for(int i=idx, j=ja_start;iNewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - env->SetObjectArrayElement(ja, j, js); - } - } else { - ThrowComFail(env, "safearray cannot get strings", 0); - } -} - -/* - * Class: SafeArray - * Method: setStrings - * Signature: (II[Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setStrings - (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(ja); - if (len > numElements(psa)) - { - len = numElements(psa); - } - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); - // SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars() - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - long x = j; - SafeArrayPutElement(psa,&x,&v); - VariantClear(&v); - env->ReleaseStringChars(s, str); - } - } else if (vt == VT_BSTR) { - for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); - // SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars() - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); - long x = j; - SafeArrayPutElement(psa,&x,bs.Detach()); - env->ReleaseStringChars(s, str); - } - } else { - ThrowComFail(env, "safearray cannot set strings", 0); - } -} - -/* - * Class: SafeArray - * Method: getByte - * Signature: (I)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_UI1, V_UI1, jbyte) -} - -/* - * Class: SafeArray - * Method: getByte - * Signature: (II)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_UI1, V_UI1, jbyte) -} - -/* - * Class: SafeArray - * Method: setByte - * Signature: (IB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IB - (JNIEnv *env, jobject _this, jint idx, jbyte c) -{ - SET1DCODE(VT_UI1, V_UI1); -} - -/* - * Class: SafeArray - * Method: setByte - * Signature: (IIB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IIB - (JNIEnv *env, jobject _this, jint i, jint j, jbyte c) -{ - SET2DCODE(VT_UI1, V_UI1); -} - -/* - * Class: SafeArray - * Method: getBytes - * Signature: (II[BI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBytes - (JNIEnv *env, jobject _this, jint idx, jint nelem, jbyteArray ja, jint ja_start) -{ - GETARRAYCODE(VT_UI1, VT_I1, V_UI1, jbyte, SetByteArrayRegion); -} - -/* - * Class: SafeArray - * Method: setBytes - * Signature: (II[BI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBytes - (JNIEnv *env, jobject _this, jint idx, jint nelem, jbyteArray ja, jint ja_start) -{ - SETARRAYCODE(VT_UI1, VT_I1, V_UI1, jbyte, - GetByteArrayElements, ReleaseByteArrayElements); -} - -/* - * Class: SafeArray - * Method: getFloat - * Signature: (I)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__I - (JNIEnv *env, jobject _this, jint idx) -{ - GET1DCODE(VT_R4, V_R4, jfloat) -} - -/* - * Class: SafeArray - * Method: getFloat - * Signature: (II)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - GET2DCODE(VT_R4, V_R4, jfloat) -} - -/* - * Class: SafeArray - * Method: setFloat - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IF - (JNIEnv *env, jobject _this, jint idx, jfloat c) -{ - SET1DCODE(VT_R4, V_R4); -} - -/* - * Class: SafeArray - * Method: setFloat - * Signature: (IIF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IIF - (JNIEnv *env, jobject _this, jint i, jint j, jfloat c) -{ - SET2DCODE(VT_R4, V_R4); -} - -/* - * Class: SafeArray - * Method: getFloats - * Signature: (II[FI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getFloats - (JNIEnv *env, jobject _this, jint idx, jint nelem, jfloatArray ja, jint ja_start) -{ - GETARRAYCODE(VT_R4, VT_R4, V_R4, jfloat, SetFloatArrayRegion); -} - -/* - * Class: SafeArray - * Method: setFloats - * Signature: (II[FI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloats - (JNIEnv *env, jobject _this, jint idx, jint nelem, jfloatArray ja, jint ja_start) -{ - SETARRAYCODE(VT_R4, VT_R4, V_R4, jfloat, - GetFloatArrayElements, ReleaseFloatArrayElements); -} - -/* - * Class: SafeArray - * Method: getBoolean - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__I - (JNIEnv *env, jobject _this, jint idx) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray not 1D", -1); \ - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - SafeArrayGetElement(sa, &idx, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { - ThrowComFail(env, "safearray change type failed", -1); \ - return NULL; - } - jboolean jb = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb; - SafeArrayGetElement(sa, &idx, (void*) &vb); - jboolean jb = vb == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else { - return NULL; - } -} - -/* - * Class: SafeArray - * Method: getBoolean - * Signature: (II)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - if (SafeArrayGetDim(sa) != 2) { - ThrowComFail(env, "safearray is not 2D", -1); - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - long idx[2] = {i,j}; - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - SafeArrayGetElement(sa, idx, (void*) &v); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { - ThrowComFail(env, "safearray change type failed", -1); - return NULL; - } - jboolean jb = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb; - SafeArrayGetElement(sa, idx, (void*) &vb); - jboolean jb = vb == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else { - return NULL; - } -} - -/* - * Class: SafeArray - * Method: setBoolean - * Signature: (IZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IZ - (JNIEnv *env, jobject _this, jint idx, jboolean c) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray is not 1D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - V_BOOL(&v) = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,&idx,&v); - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,&idx,&vb); - } else { - ThrowComFail(env, "safearray type mismatch", -1); - } -} - -/* - * Class: SafeArray - * Method: setBoolean - * Signature: (IIZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IIZ - (JNIEnv *env, jobject _this, jint i, jint j, jboolean c) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 2) { - ThrowComFail(env, "safearray is not 2D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - long idx[2] = {i,j}; - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - V_BOOL(&v) = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,idx,&v); - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,idx,&vb); - } else { - ThrowComFail(env, "safearray type mismatch", -1); - } -} - -/* - * Class: SafeArray - * Method: getBooleans - * Signature: (II[ZI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBooleans - (JNIEnv *env, jobject _this, jint idx, jint nelem, jbooleanArray ja, jint ja_start) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_BOOL) { - VARIANT_BOOL v; - for(int i=idx, j=ja_start;iSetBooleanArrayRegion(ja, j, 1, &val); - } - } else if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - for(int i=idx, j=ja_start;iSetBooleanArrayRegion(ja, j, 1, &val); - } - } -} - -/* - * Class: SafeArray - * Method: setBooleans - * Signature: (II[ZI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBooleans - (JNIEnv *env, jobject _this, jint idx, jint nelem, jbooleanArray ja, jint ja_start) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(ja); - if (len > numElements(psa)) - { - len = numElements(psa); - } - jboolean *arrayElements = env->GetBooleanArrayElements(ja, 0); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - for(int i=ja_start,j=idx;iReleaseBooleanArrayElements(ja, arrayElements, 0); -} - -/* - * Class: SafeArray - * Method: getVariant - * Signature: (I)LVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__I - (JNIEnv *env, jobject _this, jint idx) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - // prepare a new return value - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - // construct a variant to return - jobject newVariant = env->NewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - if (vt == VT_VARIANT) { - SafeArrayGetElement(psa, &idx, v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - IDispatch *disp; - SafeArrayGetElement(psa, &idx, (void *)&disp); - VariantClear(v); // whatever was there before - V_VT(v) = VT_DISPATCH; - V_DISPATCH(v) = disp; - // I am handing the pointer to COM - disp->AddRef(); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } - return newVariant; -} - -/* - * Class: SafeArray - * Method: getVariant - * Signature: (II)LVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__II - (JNIEnv *env, jobject _this, jint i, jint j) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - // prepare a new return value - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - // construct a variant to return - jobject newVariant = env->NewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - long idx[2] = {i,j}; - if (vt == VT_VARIANT) { - SafeArrayGetElement(psa, idx, v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - IDispatch *disp; - SafeArrayGetElement(psa, idx, (void *)&disp); - VariantClear(v); // whatever was there before - V_VT(v) = VT_DISPATCH; - V_DISPATCH(v) = disp; - // I am handing the pointer to COM - disp->AddRef(); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } - return newVariant; -} - -/* - * Class: SafeArray - * Method: setVariant - * Signature: (ILVariant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__ILcom_jacob_com_Variant_2 - (JNIEnv *env, jobject _this, jint idx, jobject s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 1) { - ThrowComFail(env, "safearray is not 1D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - VARIANT *v = extractVariant(env, s); - if (vt == VT_VARIANT) { - SafeArrayPutElement(sa,&idx,v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - if (V_VT(v) != VT_DISPATCH) { - ThrowComFail(env, "variant is not dispatch", -1); - return; - } - IDispatch *disp = V_DISPATCH(v); - disp->AddRef(); - SafeArrayPutElement(sa,&idx,disp); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } -} - -/* - * Class: SafeArray - * Method: setVariant - * Signature: (IILVariant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__IILcom_jacob_com_Variant_2 - (JNIEnv *env, jobject _this, jint i, jint j, jobject s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - if (SafeArrayGetDim(sa) != 2) { - ThrowComFail(env, "safearray is not 2D", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - long idx[2] = {i, j}; - if (vt == VT_VARIANT) { - VARIANT *v = extractVariant(env, s); - SafeArrayPutElement(sa,idx,v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - VARIANT *v = extractVariant(env, s); - if (V_VT(v) != VT_DISPATCH) { - ThrowComFail(env, "variant is not dispatch", -1); - return; - } - IDispatch *disp = V_DISPATCH(v); - SafeArrayPutElement(sa,idx,disp); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } -} - -/* - * Class: SafeArray - * Method: getVariants - * Signature: (II[LVariant;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getVariants - (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - long lb, ub; - SafeArrayGetLBound(sa, 1, &lb); - SafeArrayGetUBound(sa, 1, &ub); - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) - { - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - for(int i=idx, j=ja_start;iNewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - SafeArrayGetElement(sa, &ix, (void*) v); - env->SetObjectArrayElement(ja, j, newVariant); - } - } else { - ThrowComFail(env, "safearray type is not variant", -1); - } -} - -/* - * Class: SafeArray - * Method: setVariants - * Signature: (II[LVariant;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariants - (JNIEnv *env, jobject _this, jint idx, jint nelem, jobjectArray ja, jint ja_start) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - int len = env->GetArrayLength(ja); - if (len > numElements(psa)) - { - len = numElements(psa); - } - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - for(int i=ja_start,j=idx;iGetObjectArrayElement(ja, i); - VARIANT *v = extractVariant(env, var); - long x = j; - SafeArrayPutElement(psa,&x,v); - } - } else { - ThrowComFail(env, "safearray type is not variant", -1); - } -} - -/* PLEASE NOTE THE LINE: - jint *jIndices = env->GetIntArrayElements(indices, NULL); - which I added to replace "long idx[2] = {i,j};" from the 2D case. - Not sure if this is correct. Also, check that I am doing the null test and - dimension test correctly. - Would really like to call env->ReleaseIntArrayElements(indices, jIndices, NULL); - in here but I can't get it to work -*/ - -#define GETNDCODE(varType, varAccess, jtyp) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; \ - } \ - jint *jIndices = env->GetIntArrayElements(indices, NULL); \ - if (!jIndices) { \ - ThrowComFail(env, "null indices array", -1); \ - return NULL; \ - } \ - if (SafeArrayGetDim(sa) != env->GetArrayLength(indices)) { \ - ThrowComFail(env, "safearray and indices array have different dimensions", -1); \ - return NULL; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - SafeArrayGetElement(sa, jIndices, (void*) &v); \ - if (FAILED(VariantChangeType(&v, &v, 0, varType))) { \ - ThrowComFail(env, "VariantChangeType failed", -1); \ - return NULL; \ - } \ - return (jtyp)varAccess(&v); \ - } else if (vt == varType) { \ - jtyp jc; \ - SafeArrayGetElement(sa, jIndices, (void*) &jc); \ - return jc; \ - } else { \ - return NULL; \ - } - - -//--------------------------------- - -/* PLEASE NOTE THE LINE: - jint *jIndices = env->GetIntArrayElements(indices, NULL); - which I added to replace "long idx[2] = {i,j};" from the 2D case. - Not sure if this is correct. Also, check that I am doing the null test and - dimension test correctly. - Would really like to call env->ReleaseIntArrayElements(indices, jIndices, NULL); - in here but I can't get it to work - */ - -#define SETNDCODE(varType, varAccess) \ - SAFEARRAY *sa = extractSA(env, _this); \ - if (!sa) { \ - ThrowComFail(env, "safearray object corrupted", -1); \ - return; \ - } \ - jint *jIndices = env->GetIntArrayElements(indices, NULL); \ - if (!jIndices) { \ - ThrowComFail(env, "null indices array", -1); \ - return; \ - } \ - if (SafeArrayGetDim(sa) != env->GetArrayLength(indices)) { \ - ThrowComFail(env, "safearray and indices array have different dimensions", -1); \ - return; \ - } \ - VARTYPE vt; \ - SafeArrayGetVartype(sa, &vt); \ - if (vt == VT_VARIANT) { \ - VARIANT v; \ - VariantInit(&v); \ - V_VT(&v) = varType; \ - varAccess(&v) = c; \ - SafeArrayPutElement(sa,jIndices,&v); \ - } else if (vt == varType) { \ - SafeArrayPutElement(sa, jIndices,&c); \ - } else { \ - ThrowComFail(env, "safearray type mismatch", -1); \ - } - -/* - * Class: com_jacob_com_SafeArray - * Method: getVariant - * Signature: ([I)Lcom/jacob/com/Variant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - - // ??? Not sure if this is correct type for call to SafeArrayGetElement() - jint *jIndices = env->GetIntArrayElements(indices, NULL); - - if (!jIndices) { - ThrowComFail(env, "null indices array", -1); - return NULL; - } - if (SafeArrayGetDim(psa) != env->GetArrayLength(indices)) { - ThrowComFail(env, "safearray and indices array have different dimensions", -1); - return NULL; - } - - - // prepare a new return value - jclass variantClass = env->FindClass("com/jacob/com/Variant"); - jmethodID variantCons = - env->GetMethodID(variantClass, "", "()V"); - // construct a variant to return - jobject newVariant = env->NewObject(variantClass, variantCons); - // get the VARIANT from the newVariant - VARIANT *v = extractVariant(env, newVariant); - if (vt == VT_VARIANT) { - SafeArrayGetElement(psa, jIndices, v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - IDispatch *disp; - SafeArrayGetElement(psa, jIndices, (void *)&disp); - VariantClear(v); // whatever was there before - V_VT(v) = VT_DISPATCH; - V_DISPATCH(v) = disp; - // I am handing the pointer to COM - disp->AddRef(); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } - env->ReleaseIntArrayElements(indices, jIndices, NULL); - return newVariant; -} - -/* - * Class: com_jacob_com_SafeArray - * Method: setVariant - * Signature: ([ILcom/jacob/com/Variant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant___3ILcom_jacob_com_Variant_2 - (JNIEnv *env, jobject _this, jintArray indices, jobject s) -{ - - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - - // ??? Not sure if this is correct type for call to SafeArrayGetElement() - jint *jIndices = env->GetIntArrayElements(indices, NULL); - - if (!jIndices) { - ThrowComFail(env, "null indices array", -1); - return; - } - if (SafeArrayGetDim(sa) != env->GetArrayLength(indices)) { - ThrowComFail(env, "safearray and indices array have different dimensions", -1); - return; - } - - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - - if (vt == VT_VARIANT) { - VARIANT *v = extractVariant(env, s); - SafeArrayPutElement(sa, jIndices, v); - } else if (vt == VT_DISPATCH || vt == VT_UNKNOWN) { - VARIANT *v = extractVariant(env, s); - if (V_VT(v) != VT_DISPATCH) { - ThrowComFail(env, "variant is not dispatch", -1); - return; - } - IDispatch *disp = V_DISPATCH(v); - SafeArrayPutElement(sa, jIndices, disp); - } else { - ThrowComFail(env, "safearray type is not variant/dispatch", -1); - } - env->ReleaseIntArrayElements(indices, jIndices, NULL); -} - -/* - * Class: com_jacob_com_SafeArray - * Method: getChar - * Signature: ([I)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - GETNDCODE(VT_UI2, V_UI2, jchar) -} - -/* - * Class: com_jacob_com_SafeArray - * Method: setChar - * Signature: ([IC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar___3IC - (JNIEnv *env, jobject _this, jintArray indices, jchar c) -{ - SETNDCODE(VT_UI2, V_UI2); -} - -/*----------------------- INTS ----------------------------------*/ - -/* - * Class: com_jacob_com_SafeArray - * Method: getInt - * Signature: ([I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - GETNDCODE(VT_I4, V_I4, jint) -} - - -/* - * Class: com_jacob_com_SafeArray - * Method: setInt - * Signature: ([II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt___3II - (JNIEnv *env, jobject _this, jintArray indices, jint c) -{ - SETNDCODE(VT_I4, V_I4); -} - -/*----------------------- END INTS ----------------------------------*/ -/*----------------------- LONGS ----------------------------------*/ - -/* - * Class: com_jacob_com_SafeArray - * Method: getLong - * Signature: ([I)J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_SafeArray_getLong___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - GETNDCODE(VT_I8, V_I8, jlong) -} - - -/* - * Class: com_jacob_com_SafeArray - * Method: setLong - * Signature: ([IJ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setLong___3IJ - (JNIEnv *env, jobject _this, jintArray indices, jlong c) -{ - SETNDCODE(VT_I8, V_I8); -} - -/*----------------------- END LONGS ----------------------------------*/ - -/* - * Class: com_jacob_com_SafeArray - * Method: getShort - * Signature: ([I)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - GETNDCODE(VT_I2, V_I2, jshort) -} - -/* - * Class: com_jacob_com_SafeArray - * Method: setShort - * Signature: ([IS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort___3IS - (JNIEnv *env, jobject _this, jintArray indices, jshort c) -{ - SETNDCODE(VT_I2, V_I2); -} - -/* - * Class: com_jacob_com_SafeArray - * Method: getDouble - * Signature: ([I)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - GETNDCODE(VT_R8, V_R8, jdouble) -} - -/* - * Class: com_jacob_com_SafeArray - * Method: setDouble - * Signature: ([ID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble___3ID - (JNIEnv *env, jobject _this, jintArray indices, jdouble c) -{ - SETNDCODE(VT_R8, V_R8); -} - -/* - * Class: com_jacob_com_SafeArray - * Method: getString - * Signature: ([I)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - SAFEARRAY *psa = extractSA(env, _this); - if (!psa) { - ThrowComFail(env, "safearray object corrupted", -1); \ - return NULL; - } - - // ??? Not sure if this is correct type for call to SafeArrayGetElement() - jint *jIndices = env->GetIntArrayElements(indices, NULL); - - if (!jIndices) { - ThrowComFail(env, "null indices array", -1); - return NULL; - } - if (SafeArrayGetDim(psa) != env->GetArrayLength(indices)) { - ThrowComFail(env, "safearray and indices array have different dimensions", -1); - return NULL; - } - - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - SafeArrayGetElement(psa, jIndices, &v); - env->ReleaseIntArrayElements(indices, jIndices, NULL); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BSTR))) { - return NULL; - } - BSTR bs = V_BSTR(&v); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - return js; - } else if (vt == VT_BSTR) { - BSTR bs = NULL; - SafeArrayGetElement(psa, jIndices, &bs); - env->ReleaseIntArrayElements(indices, jIndices, NULL); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs)); // SR cast SF 1689061 - return js; - } else { - ThrowComFail(env, "safearray cannot get string", 0); - env->ReleaseIntArrayElements(indices, jIndices, NULL); - return NULL; - } -} - - -/* - * Class: com_jacob_com_SafeArray - * Method: setStringjIndices, NULL);ILjava/lang/String;)V - * - * This method has a leak in it somewhere. - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString___3ILjava_lang_String_2 - (JNIEnv *env, jobject _this, jintArray indices, jstring s) -{ - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - - // ??? Not sure if this is correct type for call to SafeArrayGetElement() - // could have individually retrieved the indicies - jint *jIndices = env->GetIntArrayElements(indices, NULL); - - if (!jIndices) { - ThrowComFail(env, "null indices array", -1); - return; - } - if (SafeArrayGetDim(sa) != env->GetArrayLength(indices)) { - ThrowComFail(env, "safearray and indices array have different dimensions", -1); - return; - } - - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - // SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars() - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); - V_VT(&v) = VT_BSTR; - V_BSTR(&v) = bs.Copy(); - SafeArrayPutElement(sa, jIndices,&v); - env->ReleaseStringChars(s, str); - VariantClear(&v); - } else if (vt == VT_BSTR) { - // SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars() - const jchar *str = env->GetStringChars(s, NULL); - CComBSTR bs((LPCOLESTR)str); - SafeArrayPutElement(sa, jIndices,bs.Detach()); - env->ReleaseStringChars(s, str); - } else { - ThrowComFail(env, "safearray cannot set string", 0); - } - // need to unpin the copied array SF: 1775889 - env->ReleaseIntArrayElements(indices, jIndices, NULL); -} - -/* - * Class: com_jacob_com_SafeArray - * Method: getByte - * Signature: ([I)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - GETNDCODE(VT_UI1, V_UI1, jbyte) -} - -/* - * Class: com_jacob_com_SafeArray - * Method: setByte - * Signature: ([IB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte___3IB - (JNIEnv *env, jobject _this, jintArray indices, jbyte c) -{ - SETNDCODE(VT_UI1, V_UI1); -} - -/* - * Class: com_jacob_com_SafeArray - * Method: getFloat - * Signature: ([I)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - GETNDCODE(VT_R4, V_R4, jfloat) -} - - -/* - * Class: com_jacob_com_SafeArray - * Method: setFloat - * Signature: ([IF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat___3IF - (JNIEnv *env, jobject _this, jintArray indices, jfloat c) -{ - SETNDCODE(VT_R4, V_R4); -} - -/* - * Class: com_jacob_com_SafeArray - * Method: getBoolean - * Signature: ([I)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean___3I - (JNIEnv *env, jobject _this, jintArray indices) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return NULL; - } - // ??? Not sure if this is correct type for call to SafeArrayGetElement() - jint *jIndices = env->GetIntArrayElements(indices, NULL); - - if (!jIndices) { - ThrowComFail(env, "null indices array", -1); - return NULL; - } - if (SafeArrayGetDim(sa) != env->GetArrayLength(indices)) { - ThrowComFail(env, "safearray and indices array have different dimensions", -1); - return NULL; - } - - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - SafeArrayGetElement(sa, jIndices, (void*) &v); - env->ReleaseIntArrayElements(indices, jIndices, NULL); - if (FAILED(VariantChangeType(&v, &v, 0, VT_BOOL))) { - ThrowComFail(env, "safearray change type failed", -1); - return NULL; - } - jboolean jb = V_BOOL(&v) == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb; - SafeArrayGetElement(sa, jIndices, (void*) &vb); - env->ReleaseIntArrayElements(indices, jIndices, NULL); - jboolean jb = vb == VARIANT_TRUE ? JNI_TRUE: JNI_FALSE; - return jb; - } else { - env->ReleaseIntArrayElements(indices, jIndices, NULL); - return NULL; - } -} - -/* - * Class: com_jacob_com_SafeArray - * Method: setBoolean - * Signature: ([IZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean___3IZ - (JNIEnv *env, jobject _this, jintArray indices, jboolean c) -{ - // code is inline because of size mismatch - SAFEARRAY *sa = extractSA(env, _this); - if (!sa) { - ThrowComFail(env, "safearray object corrupted", -1); - return; - } - // ??? Not sure if this is correct type for call to SafeArrayGetElement() - jint *jIndices = env->GetIntArrayElements(indices, NULL); - - if (!jIndices) { - ThrowComFail(env, "null indices array", -1); - return; - } - if (SafeArrayGetDim(sa) != env->GetArrayLength(indices)) { - ThrowComFail(env, "safearray and indices array have different dimensions", -1); - return; - } - - VARTYPE vt; - SafeArrayGetVartype(sa, &vt); - if (vt == VT_VARIANT) { - VARIANT v; - VariantInit(&v); - V_VT(&v) = VT_BOOL; - V_BOOL(&v) = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,jIndices,&v); - } else if (vt == VT_BOOL) { - VARIANT_BOOL vb = c == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - SafeArrayPutElement(sa,jIndices,&vb); - } else { - ThrowComFail(env, "safearray type mismatch", -1); - } - env->ReleaseIntArrayElements(indices, jIndices, NULL); -} - - -} diff --git a/cpp/jacob/SafeArray.h b/cpp/jacob/SafeArray.h deleted file mode 100644 index 8695d56..0000000 --- a/cpp/jacob/SafeArray.h +++ /dev/null @@ -1,940 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -/* Header for class com_jacob_com_SafeArray */ - -#ifndef _Included_com_jacob_com_SafeArray -#define _Included_com_jacob_com_SafeArray -#ifdef __cplusplus -extern "C" { -#endif -/* Inaccessible static: buildVersion */ -/* Inaccessible static: buildDate */ -/* Inaccessible static: DEBUG */ -/* Inaccessible static: class_00024com_00024jacob_00024com_00024JacobObject */ -/* - * Class: com_jacob_com_SafeArray - * Method: init - * Signature: (I[I[I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_init - (JNIEnv *, jobject, jint, jintArray, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: clone - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_clone - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: destroy - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_destroy - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getvt - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getvt - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: reinit - * Signature: (Lcom/jacob/com/SafeArray;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinit - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: reinterpretType - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_reinterpretType - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getLBound - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__ - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getLBound - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getLBound__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getUBound - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__ - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getUBound - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getUBound__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getNumDim - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getNumDim - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFeatures - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getFeatures - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getElemSize - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getElemSize - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromCharArray - * Signature: ([C)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromCharArray - (JNIEnv *, jobject, jcharArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromIntArray - * Signature: ([I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromIntArray - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromLongArray - * Signature: ([L)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromLongArray - (JNIEnv *, jobject, jlongArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromShortArray - * Signature: ([S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromShortArray - (JNIEnv *, jobject, jshortArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromDoubleArray - * Signature: ([D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromDoubleArray - (JNIEnv *, jobject, jdoubleArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromStringArray - * Signature: ([Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromStringArray - (JNIEnv *, jobject, jobjectArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromByteArray - * Signature: ([B)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromByteArray - (JNIEnv *, jobject, jbyteArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromFloatArray - * Signature: ([F)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromFloatArray - (JNIEnv *, jobject, jfloatArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromBooleanArray - * Signature: ([Z)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromBooleanArray - (JNIEnv *, jobject, jbooleanArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: fromVariantArray - * Signature: ([Lcom/jacob/com/Variant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_fromVariantArray - (JNIEnv *, jobject, jobjectArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: toCharArray - * Signature: ()[C - */ -JNIEXPORT jcharArray JNICALL Java_com_jacob_com_SafeArray_toCharArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toIntArray - * Signature: ()[I - */ -JNIEXPORT jintArray JNICALL Java_com_jacob_com_SafeArray_toIntArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toLongArray - * Signature: ()[L - */ -JNIEXPORT jlongArray JNICALL Java_com_jacob_com_SafeArray_toLongArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toShortArray - * Signature: ()[S - */ -JNIEXPORT jshortArray JNICALL Java_com_jacob_com_SafeArray_toShortArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toDoubleArray - * Signature: ()[D - */ -JNIEXPORT jdoubleArray JNICALL Java_com_jacob_com_SafeArray_toDoubleArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toStringArray - * Signature: ()[Ljava/lang/String; - */ -JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toStringArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toByteArray - * Signature: ()[B - */ -JNIEXPORT jbyteArray JNICALL Java_com_jacob_com_SafeArray_toByteArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toFloatArray - * Signature: ()[F - */ -JNIEXPORT jfloatArray JNICALL Java_com_jacob_com_SafeArray_toFloatArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toBooleanArray - * Signature: ()[Z - */ -JNIEXPORT jbooleanArray JNICALL Java_com_jacob_com_SafeArray_toBooleanArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: toVariantArray - * Signature: ()[Lcom/jacob/com/Variant; - */ -JNIEXPORT jobjectArray JNICALL Java_com_jacob_com_SafeArray_toVariantArray - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getChar - * Signature: (I)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getChar - * Signature: (II)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setChar - * Signature: (IC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IC - (JNIEnv *, jobject, jint, jchar); - -/* - * Class: com_jacob_com_SafeArray - * Method: setChar - * Signature: (IIC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar__IIC - (JNIEnv *, jobject, jint, jint, jchar); - -/* - * Class: com_jacob_com_SafeArray - * Method: getChars - * Signature: (II[CI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getChars - (JNIEnv *, jobject, jint, jint, jcharArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setChars - * Signature: (II[CI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChars - (JNIEnv *, jobject, jint, jint, jcharArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getInt - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getInt - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setInt - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setInt - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt__III - (JNIEnv *, jobject, jint, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getInts - * Signature: (II[II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getInts - (JNIEnv *, jobject, jint, jint, jintArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setInts - * Signature: (II[II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInts - (JNIEnv *, jobject, jint, jint, jintArray, jint); - -/* - * Class: SafeArray - * Method: getLong - * Signature: (I)J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_SafeArray_getLong__I - (JNIEnv *env, jobject _this, jint idx); - -/* - * Class: SafeArray - * Method: getLong - * Signature: (II)J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_SafeArray_getLong__II - (JNIEnv *env, jobject _this, jint i, jint j); - -/* - * Class: SafeArray - * Method: setLong - * Signature: (IJ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setLong__IJ - (JNIEnv *env, jobject _this, jint idx, jlong c); - -/* - * Class: SafeArray - * Method: setLong - * Signature: (IIJ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setLong__IIJ - (JNIEnv *env, jobject _this, jint i, jint j, jlong c); - -/* - * Class: SafeArray - * Method: getLongs - * Signature: (II[JI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getLongs - (JNIEnv *env, jobject _this, jint idx, jint nelem, jlongArray ja, jint ja_start); - -/* - * Class: SafeArray - * Method: setLongs - * Signature: (II[JI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setLongs - (JNIEnv *env, jobject _this, jint idx, jint nelem, jlongArray ja, jint ja_start); - -/* - * Class: com_jacob_com_SafeArray - * Method: getShort - * Signature: (I)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getShort - * Signature: (II)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setShort - * Signature: (IS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IS - (JNIEnv *, jobject, jint, jshort); - -/* - * Class: com_jacob_com_SafeArray - * Method: setShort - * Signature: (IIS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort__IIS - (JNIEnv *, jobject, jint, jint, jshort); - -/* - * Class: com_jacob_com_SafeArray - * Method: getShorts - * Signature: (II[SI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getShorts - (JNIEnv *, jobject, jint, jint, jshortArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setShorts - * Signature: (II[SI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShorts - (JNIEnv *, jobject, jint, jint, jshortArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getDouble - * Signature: (I)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getDouble - * Signature: (II)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setDouble - * Signature: (ID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__ID - (JNIEnv *, jobject, jint, jdouble); - -/* - * Class: com_jacob_com_SafeArray - * Method: setDouble - * Signature: (IID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble__IID - (JNIEnv *, jobject, jint, jint, jdouble); - -/* - * Class: com_jacob_com_SafeArray - * Method: getDoubles - * Signature: (II[DI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getDoubles - (JNIEnv *, jobject, jint, jint, jdoubleArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setDoubles - * Signature: (II[DI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDoubles - (JNIEnv *, jobject, jint, jint, jdoubleArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getString - * Signature: (I)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getString - * Signature: (II)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setString - * Signature: (ILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__ILjava_lang_String_2 - (JNIEnv *, jobject, jint, jstring); - -/* - * Class: com_jacob_com_SafeArray - * Method: setString - * Signature: (IILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__IILjava_lang_String_2 - (JNIEnv *, jobject, jint, jint, jstring); - -/* - * Class: com_jacob_com_SafeArray - * Method: getStrings - * Signature: (II[Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getStrings - (JNIEnv *, jobject, jint, jint, jobjectArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setStrings - * Signature: (II[Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setStrings - (JNIEnv *, jobject, jint, jint, jobjectArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getByte - * Signature: (I)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getByte - * Signature: (II)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setByte - * Signature: (IB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IB - (JNIEnv *, jobject, jint, jbyte); - -/* - * Class: com_jacob_com_SafeArray - * Method: setByte - * Signature: (IIB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte__IIB - (JNIEnv *, jobject, jint, jint, jbyte); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBytes - * Signature: (II[BI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBytes - (JNIEnv *, jobject, jint, jint, jbyteArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBytes - * Signature: (II[BI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBytes - (JNIEnv *, jobject, jint, jint, jbyteArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFloat - * Signature: (I)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFloat - * Signature: (II)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setFloat - * Signature: (IF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IF - (JNIEnv *, jobject, jint, jfloat); - -/* - * Class: com_jacob_com_SafeArray - * Method: setFloat - * Signature: (IIF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat__IIF - (JNIEnv *, jobject, jint, jint, jfloat); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFloats - * Signature: (II[FI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getFloats - (JNIEnv *, jobject, jint, jint, jfloatArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setFloats - * Signature: (II[FI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloats - (JNIEnv *, jobject, jint, jint, jfloatArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBoolean - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBoolean - * Signature: (II)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBoolean - * Signature: (IZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IZ - (JNIEnv *, jobject, jint, jboolean); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBoolean - * Signature: (IIZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean__IIZ - (JNIEnv *, jobject, jint, jint, jboolean); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBooleans - * Signature: (II[ZI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getBooleans - (JNIEnv *, jobject, jint, jint, jbooleanArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBooleans - * Signature: (II[ZI)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBooleans - (JNIEnv *, jobject, jint, jint, jbooleanArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getVariant - * Signature: (I)Lcom/jacob/com/Variant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__I - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getVariant - * Signature: (II)Lcom/jacob/com/Variant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant__II - (JNIEnv *, jobject, jint, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setVariant - * Signature: (ILcom/jacob/com/Variant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__ILcom_jacob_com_Variant_2 - (JNIEnv *, jobject, jint, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: setVariant - * Signature: (IILcom/jacob/com/Variant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant__IILcom_jacob_com_Variant_2 - (JNIEnv *, jobject, jint, jint, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getVariants - * Signature: (II[Lcom/jacob/com/Variant;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_getVariants - (JNIEnv *, jobject, jint, jint, jobjectArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: setVariants - * Signature: (II[Lcom/jacob/com/Variant;I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariants - (JNIEnv *, jobject, jint, jint, jobjectArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getVariant - * Signature: ([I)Lcom/jacob/com/Variant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_SafeArray_getVariant___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setVariant - * Signature: ([ILcom/jacob/com/Variant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setVariant___3ILcom_jacob_com_Variant_2 - (JNIEnv *, jobject, jintArray, jobject); - -/* - * Class: com_jacob_com_SafeArray - * Method: getChar - * Signature: ([I)C - */ -JNIEXPORT jchar JNICALL Java_com_jacob_com_SafeArray_getChar___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setChar - * Signature: ([IC)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setChar___3IC - (JNIEnv *, jobject, jintArray, jchar); - -/* - * Class: com_jacob_com_SafeArray - * Method: getInt - * Signature: ([I)I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_SafeArray_getInt___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setInt - * Signature: ([II)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setInt___3II - (JNIEnv *, jobject, jintArray, jint); - -/* - * Class: com_jacob_com_SafeArray - * Method: getLong - * Signature: ([I)J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_SafeArray_getLong___3I - (JNIEnv *env, jobject _this, jintArray indices); - -/* - * Class: com_jacob_com_SafeArray - * Method: setLong - * Signature: ([IJ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setLong___3IJ - (JNIEnv *env, jobject _this, jintArray indices, jlong c); - - -/* - * Class: com_jacob_com_SafeArray - * Method: getShort - * Signature: ([I)S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_SafeArray_getShort___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setShort - * Signature: ([IS)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setShort___3IS - (JNIEnv *, jobject, jintArray, jshort); - -/* - * Class: com_jacob_com_SafeArray - * Method: getDouble - * Signature: ([I)D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_SafeArray_getDouble___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setDouble - * Signature: ([ID)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setDouble___3ID - (JNIEnv *, jobject, jintArray, jdouble); - -/* - * Class: com_jacob_com_SafeArray - * Method: getString - * Signature: ([I)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_SafeArray_getString___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setString - * Signature: ([ILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString___3ILjava_lang_String_2 - (JNIEnv *, jobject, jintArray, jstring); - -/* - * Class: com_jacob_com_SafeArray - * Method: getByte - * Signature: ([I)B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_SafeArray_getByte___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setByte - * Signature: ([IB)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setByte___3IB - (JNIEnv *, jobject, jintArray, jbyte); - -/* - * Class: com_jacob_com_SafeArray - * Method: getFloat - * Signature: ([I)F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_SafeArray_getFloat___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setFloat - * Signature: ([IF)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setFloat___3IF - (JNIEnv *, jobject, jintArray, jfloat); - -/* - * Class: com_jacob_com_SafeArray - * Method: getBoolean - * Signature: ([I)Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_SafeArray_getBoolean___3I - (JNIEnv *, jobject, jintArray); - -/* - * Class: com_jacob_com_SafeArray - * Method: setBoolean - * Signature: ([IZ)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean___3IZ - (JNIEnv *, jobject, jintArray, jboolean); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/jacob/StdAfx.h b/cpp/jacob/StdAfx.h deleted file mode 100644 index 9d3d322..0000000 --- a/cpp/jacob/StdAfx.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#if !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_) -#define AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#ifndef STRICT -#define STRICT -#endif -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0400 -#endif -//#define _ATL_APARTMENT_THREADED -#include -#include -#include -#include -//You may derive a class from CComModule and use it if you want to override -//something, but do not change the name of _Module -extern CComModule _Module; -//#include - - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__9988E984_6789_11D3_A646_000000000000__INCLUDED) diff --git a/cpp/jacob/Variant.cpp b/cpp/jacob/Variant.cpp deleted file mode 100644 index 6b20d09..0000000 --- a/cpp/jacob/Variant.cpp +++ /dev/null @@ -1,1274 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "stdafx.h" -#include "Variant.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -#define VARIANT_FLD "m_pVariant" - -// extract a VARIANT from a Variant object -VARIANT *extractVariant(JNIEnv *env, jobject arg) -{ - jclass argClass = env->GetObjectClass(arg); - jfieldID ajf = env->GetFieldID( argClass, VARIANT_FLD, "I"); - jint anum = env->GetIntField(arg, ajf); - VARIANT *v = (VARIANT *)anum; - return v; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_release - (JNIEnv *env, jobject _this) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID(clazz, VARIANT_FLD, "I"); - VARIANT *v = extractVariant(env, _this); - if (v) { - // fix byref leak - if (V_VT(v) & VT_BYREF) // is this a reference - { - void *pMem = V_BSTRREF(v); // get allocated memory - if (pMem) - { - if (V_VT(v) == (VT_BYREF|VT_BSTR)) - { - BSTR *pBstr = (BSTR*)pMem; - if (*pBstr) - SysFreeString(*pBstr);// release bstr - } - CoTaskMemFree(pMem); - } - } - VariantClear(v); - delete v; - env->SetIntField(_this, jf, (unsigned int)0); - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_init - (JNIEnv *env, jobject _this) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID( clazz, VARIANT_FLD, "I"); - VARIANT *v = new VARIANT(); - VariantInit(v); - env->SetIntField(_this, jf, (unsigned int)v); -} - - -/* - * Class: com_jacob_com_Variant - * Method: zeroVariant - * Signature: ()V - * - * This should only be used on variant objects created by the - * com layer as part of a call through EventProxy. - * This zeros out the variant pointer in the Variant object - * so that the calling COM program can free the memory. - * instead of both the COM program and the Java GC doing it. - */ -void zeroVariant(JNIEnv *env, jobject _this) -{ - jclass clazz = env->GetObjectClass(_this); - jfieldID jf = env->GetFieldID(clazz, VARIANT_FLD, "I"); - env->SetIntField(_this, jf, (unsigned int)0); -} - - -/** - * This is the core of the old Save method. - * It copies this variant to a byte stream. - * The unmarshalling part of this doesn't work but it was left in - * with the hope that someone will want to fix this later - **/ -JNIEXPORT jbyteArray JNICALL Java_com_jacob_com_Variant_SerializationWriteToBytes - (JNIEnv *env, jobject _this){ - VARIANT *v = extractVariant(env, _this); - if (v) - { - DWORD flags = MSHCTX_LOCAL; - jint size = VARIANT_UserSize(&flags, 0L, v); - // allocate a byte array of the right length - jbyte* pBuf = new jbyte[size]; - // clear it out - ZeroMemory(pBuf, size); - // marshall the Variant into the buffer - VARIANT_UserMarshal(&flags, (unsigned char *)pBuf, v); - // need to convert the buffer to a java byte ba[] - jbyteArray ba = env->NewByteArray(size); - env->SetByteArrayRegion(ba, 0, size, pBuf); - // and delete the original memory - delete [] pBuf; - return ba; - } else { - jbyteArray ba = env->NewByteArray(0); - return ba; - } - } - -/** - * This is the core of the old Load method. It is broken because the - * unmarshalling code doesn't work under 2000/XP. - * - * It probably needs a custom handler. - **/ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_SerializationReadFromBytes - (JNIEnv *env, jobject _this, jbyteArray ba){ - - VARIANT *v = extractVariant(env, _this); - if (v){ - // get a buffer from it - jbyte *pBuf = env->GetByteArrayElements(ba, 0); - // unmarshall the Variant from the buffer - DWORD flags = MSHCTX_LOCAL; - printf("about to unmarshall array elements\n"); - VARIANT_UserUnmarshal(&flags, (unsigned char *)pBuf, v); - // release the byte array - printf("about to release array elements\n"); - env->ReleaseByteArrayElements(ba, pBuf, 0); - } - } - -/** - * Converts the data to a Enum Variant object and then returns it as a Dispatch - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toEnumVariant - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) - { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_UNKNOWN))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - jclass autoClass = env->FindClass("com/jacob/com/EnumVariant"); - jmethodID autoCons = - env->GetMethodID(autoClass, "", "(I)V"); - // construct an Unknown object to return - IUnknown *unk = V_UNKNOWN(v); - IEnumVARIANT *ie; - hr = unk->QueryInterface(IID_IEnumVARIANT, (void **)&ie); - if (FAILED(hr)) { - ThrowComFail(env, "[toEnumVariant]: Object does not implement IEnumVariant", hr); - return NULL; - } - // I am copying the pointer to java - // SF-1674179 fix EnumVariants memory leak - // AJ: yes, but the QueryInterface call above already incremented the reference - //if (ie) ie->AddRef(); - jobject newAuto = env->NewObject(autoClass, autoCons, ie); - return newAuto; - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantNull - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_NULL; - } -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_cloneIndirect - (JNIEnv *env, jobject _this) -{ - return NULL; -} - - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantShortRef - (JNIEnv *env, jobject _this, jshort s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - short *ps = (short *)CoTaskMemAlloc(sizeof(short)); - *ps = s; - V_VT(v) = VT_I2|VT_BYREF; - V_I2REF(v) = ps; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantIntRef - (JNIEnv *env, jobject _this, jint s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - long *ps = (long *)CoTaskMemAlloc(sizeof(long)); - *ps = s; - V_VT(v) = VT_I4|VT_BYREF; - V_I4REF(v) = ps; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDoubleRef - (JNIEnv *env, jobject _this, jdouble s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - double *ps = (double *)CoTaskMemAlloc(sizeof(double)); - *ps = s; - V_VT(v) = VT_R8|VT_BYREF; - V_R8REF(v) = ps; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDateRef - (JNIEnv *env, jobject _this, jdouble s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - double *ps = (double *)CoTaskMemAlloc(sizeof(double)); - *ps = s; - V_VT(v) = VT_DATE|VT_BYREF; - V_DATEREF(v) = ps; - } -} - -// SF 1065533 added unicode support -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantStringRef - (JNIEnv *env, jobject _this, jstring s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - - const jchar *cStr = env->GetStringChars(s,NULL); - // SF 1314116 - // DBeck: 2005-09-23: changed CComBSTR c-tor to accept - // Unicode string (no terminating NULL) provided by GetStringChars - const jsize numChars = env->GetStringLength(s); - //CComBSTR bs(cStr); - CComBSTR bs( numChars, (LPCOLESTR)cStr ); // SR cast SF 1689061 - - BSTR *pbs = (BSTR *)CoTaskMemAlloc(sizeof(BSTR)); - bs.CopyTo(pbs); - V_VT(v) = VT_BSTR|VT_BYREF; - V_BSTRREF(v) = pbs; - - env->ReleaseStringChars(s,cStr); } -} - -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getVariantShortRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_I2|VT_BYREF)) { - return NULL; - } - return (jshort)*V_I2REF(v); - } - return NULL; -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantIntRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_I4|VT_BYREF)) { - return NULL; - } - return (jint)*V_I4REF(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantShort - (JNIEnv *env, jobject _this, jshort s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_I2; - V_I2(v) = (short)s; - } -} - -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getVariantShort - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_I2) { - return NULL; - } - return (jshort)V_I2(v); - } - return NULL; -} - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getVariantDoubleRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_R8|VT_BYREF)) { - return NULL; - } - return (jdouble)*V_R8REF(v); - } - return NULL; -} - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getVariantDateRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_DATE|VT_BYREF)) { - return NULL; - } - return (jdouble)*V_DATEREF(v); - } - return NULL; -} - -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getVariantStringRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_BSTR|VT_BYREF)) { - return NULL; - } - BSTR *bs = V_BSTRREF(v); - jstring js = env->NewString((jchar*)*bs, SysStringLen(*bs)); // SR cast SF 1689061 - return js; - } - return NULL; -} - -/** - * cover for underlying C VariantClear function - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_VariantClear - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); - } -} - -/** - * Converts the data to a Dispatch object and then returns it as a Dispatch - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toVariantDispatch - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - HRESULT hr; - if (FAILED(hr = VariantChangeType(v, v, 0, VT_DISPATCH))) { - ThrowComFail(env, "VariantChangeType failed", hr); - return NULL; - } - jclass autoClass = env->FindClass("com/jacob/com/Dispatch"); - jmethodID autoCons = - env->GetMethodID(autoClass, "", "(I)V"); - // construct a Dispatch object to return - IDispatch *disp = V_DISPATCH(v); - // I am copying the pointer to java - if (disp) disp->AddRef(); - jobject newAuto = env->NewObject(autoClass, autoCons, disp); - return newAuto; - } - return NULL; -} - -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_clone - (JNIEnv *env, jobject _this) -{ - return NULL; -} - -/** - * Returns the value of this int as a Boolea if it is of that type. - * Otherwise it will return null (no conversion done) - */ - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantInt - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_I4) { - return NULL; - } - return (jint)V_I4(v); - } - return NULL; -} - -/** - * Returns the value of this Date as a Boolea if it is of that type. - * Otherwise it will return null (no conversion done) - */ - -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getVariantDate - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_DATE) { - return NULL; - } - return (jdouble)V_DATE(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantInt - (JNIEnv *env, jobject _this, jint i) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_I4; - V_I4(v) = (int)i; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDate - (JNIEnv *env, jobject _this, jdouble date) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_DATE; - V_DATE(v) = date; - } -} - -/** - * Returns the value of this Variant as a Boolea if it is of that type. - * Otherwise it will return null (no conversion done) - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getVariantBoolean - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_BOOL)) { - return NULL; - } - return (jboolean)V_BOOL(v); - } - return NULL; -} - -/** - * Returns the value of this Variant as a Byte if it is of that type. - * Otherwise it will return null (no conversion done) - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getVariantByte - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_UI1)) { - return NULL; - } - return (jbyte)V_UI1(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantBoolean - (JNIEnv *env, jobject _this, jboolean b) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_BOOL; - V_BOOL(v) = b == JNI_TRUE ? VARIANT_TRUE : VARIANT_FALSE; - } - else ThrowComFail(env, "putVariantBoolean failed", -1); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantByte - (JNIEnv *env, jobject _this, jbyte b) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_UI1; - V_UI1(v) = b; - } - else ThrowComFail(env, "putVariantByte failed", -1); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantEmpty - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_EMPTY; - } -} - -/** - * Sets the variant type to dispatch with no value object - **/ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantNothing - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_DISPATCH; - } -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantError - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_ERROR) { - return NULL; - } - return (jint)V_ERROR(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantError - (JNIEnv *env, jobject _this, jint i) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_ERROR; - V_ERROR(v) = (int)i; - } -} - - -/** - * Returns the value of this Variant as a double if it is of that type. - * Otherwise it will return null (no conversion done) - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getVariantDouble - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_R8) { - return NULL; - } - return (jdouble)V_R8(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantCurrency - (JNIEnv *env, jobject _this, jlong cur) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - CY pf; - pf.int64 = (LONGLONG)cur; - V_VT(v) = VT_CY; - V_CY(v) = pf; - } else ThrowComFail(env, "putVariantCurrency failed", -1); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantLong - (JNIEnv *env, jobject _this, jlong longValue) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_I8; - V_I8(v) = (LONGLONG)longValue; - } else ThrowComFail(env, "putVariantLong failed", -1); -} - -/** - * Accepts a dispatch object and sets the type to VT_DISPATCH. - * There is currently no way to pass NULL into this method - * to create something like "NOTHING" from VB - * */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDispatch - (JNIEnv *env, jobject _this, jobject _that) -{ - VARIANT *v = extractVariant(env, _this); - IDispatch *disp = extractDispatch(env, _that); - if (disp && v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_DISPATCH; - V_DISPATCH(v) = disp; - // I am handing the pointer to COM - disp->AddRef(); - } else ThrowComFail(env, "putObject failed", -1); -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDouble - (JNIEnv *env, jobject _this, jdouble d) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_R8; - V_R8(v) = (double)d; - } -} - -/** - * Returns the value of this Variant as a long if it is of that type. - * Otherwise it will return null (no conversion done) - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantCurrency - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_CY) { - return NULL; - } - CY cy; - cy = V_CY(v); - jlong jl; - memcpy(&jl, &cy, sizeof(jl)); // was 64. should be sizeof(x) SF 1690420 - return jl; - } - return NULL; -} - -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantLong - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_I8) { - return NULL; - } - return (jlong)V_I8(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantFloatRef - (JNIEnv *env, jobject _this, jfloat val) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - float *pf = (float *)CoTaskMemAlloc(sizeof(float)); - *pf = val; - V_VT(v) = VT_R4|VT_BYREF; - V_R4REF(v) = pf; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantCurrencyRef - (JNIEnv *env, jobject _this, jlong cur) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - CY *pf = (CY *)CoTaskMemAlloc(sizeof(CY)); - memcpy(pf, &cur, sizeof(*pf)); // was 64. should be sizeof(x) SF 1690420 - V_VT(v) = VT_BYREF|VT_CY; - V_CYREF(v) = pf; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantLongRef - (JNIEnv *env, jobject _this, jlong longValue) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - LONGLONG *ps = (LONGLONG *)CoTaskMemAlloc(sizeof(LONGLONG)); - *ps = longValue; - V_VT(v) = VT_I8|VT_BYREF; - V_I8REF(v) = ps; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantErrorRef - (JNIEnv *env, jobject _this, jint i) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_ERROR|VT_BYREF; - V_ERROR(v) = (int)i; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantBooleanRef - (JNIEnv *env, jobject _this, jboolean b) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - VARIANT_BOOL *br = (VARIANT_BOOL *)CoTaskMemAlloc(sizeof(VARIANT_BOOL)); - *br = b ? VARIANT_TRUE : VARIANT_FALSE; - V_VT(v) = VT_BOOL|VT_BYREF; - V_BOOLREF(v) = br; - } -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantByteRef - (JNIEnv *env, jobject _this, jbyte b) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - unsigned char *br = (unsigned char *)CoTaskMemAlloc(sizeof(char)); - *br = b; - V_VT(v) = VT_UI1|VT_BYREF; - V_UI1REF(v) = br; - } -} - -/** - * Returns the value of this Variant as a String if it is of that type. - * Otherwise it will return null (no conversion done) - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getVariantString - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_BSTR) { - return NULL; - } - BSTR bs = V_BSTR(v); - jstring js = env->NewString((jchar*)bs, SysStringLen(bs));// SR cast SF 1689061 - return js; - } - return NULL; -} - -/** - * SF 1065533 added unicode support - * */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantString - (JNIEnv *env, jobject _this, jstring s) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_BSTR; - - const jchar *cStr = env->GetStringChars(s,NULL); - // SF 1314116 - // DBeck: 2005-09-23: changed CComBSTR c-tor to accept - // Unicode string (no terminating NULL) provided by GetStringChars - const jsize numChars = env->GetStringLength(s); - //CComBSTR bs(cStr); - CComBSTR bs( numChars, (LPCOLESTR)cStr ); // SR cast SF 1689061 - - V_VT(v) = VT_BSTR; - V_BSTR(v) = bs.Copy(); - - env->ReleaseStringChars(s,cStr); - } -} - -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getVariantFloatRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_R4|VT_BYREF)) { - return NULL; - } - return (jfloat)*V_R4REF(v); - } - return NULL; -} - -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantCurrencyRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_CY|VT_BYREF)) { - return NULL; - } - CY *cy; - cy = V_CYREF(v); - jlong jl; - memcpy(&jl, cy, sizeof(jl)); // was 64. should be sizeof(x) SF 1690420 - return jl; - } - return NULL; -} - -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantLongRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_I8|VT_BYREF)) { - return NULL; - } - return (jlong)*V_I8REF(v); - } - return NULL; -} - -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantErrorRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_ERROR|VT_BYREF)) { - return NULL; - } - return (jint)V_ERROR(v); - } - return NULL; -} - -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getVariantBooleanRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_BOOL|VT_BYREF)) { - return NULL; - } - return (jboolean)*V_BOOLREF(v); - } - return NULL; -} - - -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getVariantByteRef - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_UI1|VT_BYREF)) { - return NULL; - } - return (jbyte)*V_UI1REF(v); - } - return NULL; -} - -/** - * Converts the data to a Safe Array object and then returns it as a Dispatch - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toVariantSafeArray - (JNIEnv *env, jobject _this, jboolean deepCopy) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if ((V_VT(v) & VT_ARRAY) == 0) - { - ThrowComFail(env, "Variant not array", -1); - return NULL; - } - // prepare a new sa obj - jclass saClass = env->FindClass("com/jacob/com/SafeArray"); - jmethodID saCons = env->GetMethodID(saClass, "", "()V"); - // construct an SA to return - jobject newSA = env->NewObject(saClass, saCons); - // pass in the deep copy indicator - setSA(env, newSA, V_ARRAY(v), deepCopy == JNI_TRUE ? 1 : 0); - return newSA; - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantSafeArrayRef - (JNIEnv *env, jobject _this, jobject sa) -{ - SAFEARRAY *psa = extractSA(env, sa); - if (psa) - { - VARIANT *v = extractVariant(env, _this); - if (v) { - VARTYPE vt; - SAFEARRAY **sa = (SAFEARRAY **)CoTaskMemAlloc(sizeof(SAFEARRAY*)); - *sa = psa; - SafeArrayGetVartype(psa, &vt); - V_VT(v) = VT_ARRAY | vt | VT_BYREF; - V_ARRAYREF(v) = sa; - return; - } - ThrowComFail(env, "Can't get variant pointer", -1); - return; - } - ThrowComFail(env, "Can't get sa pointer", -1); - return; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantSafeArray - (JNIEnv *env, jobject _this, jobject sa) -{ - SAFEARRAY *psa = extractSA(env, sa); - if (psa) - { - VARIANT *v = extractVariant(env, _this); - if (v) { - VARTYPE vt; - SafeArrayGetVartype(psa, &vt); - V_VT(v) = VT_ARRAY | vt; - V_ARRAY(v) = copySA(psa); - return; - } - ThrowComFail(env, "Can't get variant pointer", -1); - return; - } - ThrowComFail(env, "Can't get sa pointer", -1); - return; -} - -/** - * sets the type to VT_ERROR and the error message to DISP_E_PARAMNOTFOIUND - * */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantNoParam - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - V_VT(v) = VT_ERROR; - V_ERROR(v) = DISP_E_PARAMNOTFOUND; - } -} - -/** - * Returns the value of this Variant as a Float if it is of that type. - * Otherwise it will return null (no conversion done) - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getVariantFloat - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_R4)) { - return NULL; - } - return (jfloat)V_R4(v); - } - return NULL; -} - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantFloat - (JNIEnv *env, jobject _this, jfloat val) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - V_VT(v) = VT_R4; - V_R4(v) = val; - } -} - -/** - * changes the type of the underlying variant data - * */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_changeVariantType - (JNIEnv *env, jobject _this, jshort t) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantChangeType(v, v, 0, t); - } -} - -/** - * returns the variant type if it is set, otherwise - * returns null - * */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getVariantType - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (v) { - return (jshort)V_VT(v); - } - return NULL; -} - -// removed Java_com_jacob_com_Variant_putSafeArrayRefHelper - -/** - * this is a big cover method that returns TRUE if - * the variant type is - * VT_EMPTY, VT_NULL, VT_ERROR or VT_DISPATCH with no dispatch object - * */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_isVariantConsideredNull - (JNIEnv *env, jobject _this) -{ - VARIANT *v = extractVariant(env, _this); - if (!v) return JNI_TRUE; - if ((V_VT(v) & VT_ARRAY)) - { - // is it a null safearray - // prior to 4 Dec 2005 the squiggle brackets were missing - // so this did the wrong thing for the else statement - if ((V_VT(v) & VT_BYREF)) { - if (!V_ARRAYREF(v)) return JNI_TRUE; - } else { - if (!V_ARRAY(v)) return JNI_TRUE; - } - } - switch (V_VT(v)) - { - case VT_EMPTY: - case VT_NULL: - case VT_ERROR: - return JNI_TRUE; - // is it a null dispatch (Nothing in VB) - case VT_DISPATCH: - if (!V_DISPATCH(v)) return JNI_TRUE; - } - return JNI_FALSE; -} - -/** - * Puts a variant into a the Variant as its data and sets the type - * to VT_VARIANT|VT_BYREF. - * Added 1.12 pre 6 - * - * */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantVariant - (JNIEnv *env, jobject _this, jobject var) -{ - - VARIANT *vVar = extractVariant(env, var); - VARIANT *v = extractVariant(env, _this); - - if (v) { - VariantClear(v); // whatever was there before - - V_VT(v) = VT_VARIANT|VT_BYREF; - V_VARIANTREF(v) = vVar; - } - -} - -/** - * retrieves the enclosed variant when they are of type VT_VARIANT - * Added 1.12 pre 6 - * - * */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantVariant -(JNIEnv *env, jobject _this) -{ - - VARIANT *v = extractVariant(env, _this); - if (v) { - - if (V_VT(v) != (VT_VARIANT|VT_BYREF)) { - return NULL; - } - - VARIANT *refVar = V_VARIANTREF(v); - - // we could have made a copy of refV here but we aren't every going to free - // it outside of the scope of the enclosing context so we will just used the - // enclosed. This relies on the java layer to zero out its ref to this - // enclosed variant before the gc can come along and free the memory out from - // under this enclosing variant. - return (unsigned int)refVar; - } - - return NULL; -} - - /** - * puts a VT_DECIMAL by reference - * Added 1.13M4 - * */ - JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDecRef - (JNIEnv *env, jobject _this, jint signum, jbyte scale, jint lo, jint mid, jint hi) - { - VARIANT *v = extractVariant(env, _this); - if (v) { - VariantClear(v); // whatever was there before - DECIMAL *pd = (DECIMAL *)CoTaskMemAlloc(sizeof(DECIMAL)); - pd->scale = scale; - if (signum == 1 || signum == 0){ - pd->sign = 0; - } else { - pd->sign = 0x80; - } - pd->Hi32 = hi; - pd->Mid32 = mid; - pd->Lo32 = lo; - V_VT(v) = VT_DECIMAL | VT_BYREF; - V_DECIMALREF(v) = pd; - } - } - - - /** - * puts a VT_DECIMAL - * Added 1.13M4 - * */ - JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDec - (JNIEnv *env, jobject _this, jint signum, jbyte scale, jint lo, jint mid, jint hi) - { - VARIANT *v = extractVariant(env, _this); - DECIMAL *d; - if (v) { - VariantClear(v); // whatever was there before - d = (DECIMAL*)v; - d->scale = scale; - if (signum == 1 || signum == 0){ - d->sign = 0; - } else { - d->sign = 0x80; - } - d->Hi32 = hi; - d->Mid32 = mid; - d->Lo32 = lo; - V_VT(v) = VT_DECIMAL; - } - } - -/** - * utility method used by the getVariantXXX() methods to convert VT_DECIMAL to BigDecimal - * */ -jobject extractDecimal - (JNIEnv *env, DECIMAL* d) - { - jclass bigIntegerClass; - jclass bigDecimalClass; - jobject integer; - jmethodID bigIntegerConstructor; - jmethodID bigDecimalConstructor; - jbyteArray bArray; - jobject result = NULL; - jbyte* buffer; - - bigIntegerClass = env->FindClass("java/math/BigInteger"); - if (bigIntegerClass == NULL) - return NULL; - bigDecimalClass = env->FindClass("java/math/BigDecimal"); - if (bigDecimalClass == NULL) { - env->DeleteLocalRef(bigIntegerClass); - return NULL; - } - - bigIntegerConstructor = env->GetMethodID(bigIntegerClass, "", "(I[B)V"); - if (bigIntegerConstructor == NULL) { - env->DeleteLocalRef(bigIntegerClass); - env->DeleteLocalRef(bigDecimalClass); - return NULL; - } - bigDecimalConstructor = env->GetMethodID(bigDecimalClass, "", "(Ljava/math/BigInteger;I)V"); - if (bigIntegerConstructor == NULL) { - env->DeleteLocalRef(bigIntegerClass); - env->DeleteLocalRef(bigDecimalClass); - return NULL; - } - bArray = env->NewByteArray(12); - if (bArray == NULL) { - env->DeleteLocalRef(bigIntegerClass); - env->DeleteLocalRef(bigDecimalClass); - return NULL; - } - /* Unfortunately the byte ordering is completely wrong, so we remap it into buffer */ - buffer = (jbyte*)malloc(12); - buffer[11] = (byte)(d->Lo32 & 255); - buffer[10] = (byte)((d->Lo32 >> 8) & 255); - buffer[9] = (byte)((d->Lo32 >> 16) & 255); - buffer[8] = (byte)((d->Lo32 >> 24) & 255); - buffer[7] = (byte)((d->Mid32) & 255); - buffer[6] = (byte)((d->Mid32 >> 8) & 255); - buffer[5] = (byte)((d->Mid32 >> 16) & 255); - buffer[4] = (byte)((d->Mid32 >> 24) & 255); - buffer[3] = (byte)((d->Hi32) & 255); - buffer[2] = (byte)((d->Hi32 >> 8) & 255); - buffer[1] = (byte)((d->Hi32 >> 16) & 255); - buffer[0] = (byte)((d->Hi32 >> 24) & 255); - /* Load buffer into the actual array */ - env->SetByteArrayRegion(bArray, 0, 12, buffer); - /* then clean up the C array */ - free(buffer); - - /* instantiate the BigInteger */ - integer = env->NewObject(bigIntegerClass, bigIntegerConstructor, d->sign == 0x80?-1:1, bArray); - - result = env->NewObject(bigDecimalClass, bigDecimalConstructor, integer, (jint)(d->scale)); - - /* Clean up the Java global references */ - env->DeleteLocalRef(bArray); - env->DeleteLocalRef(integer); - env->DeleteLocalRef(bigIntegerClass); - return result; - } - -/** - * gets a VT_DECIMAL by ref as a BigDecimal - * Added 1.13M4 - * */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getVariantDecRef - (JNIEnv *env, jobject _this) - { - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != (VT_DECIMAL|VT_BYREF)) { - return NULL; - } - return extractDecimal(env, v->pdecVal); - } - return NULL; - } - -/** - * gets a VT_DECIMAL as a BigDecimal - * Added 1.13M4 - * */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getVariantDec - (JNIEnv *env, jobject _this) - { - VARIANT *v = extractVariant(env, _this); - if (v) { - if (V_VT(v) != VT_DECIMAL) { - return NULL; - } - return extractDecimal(env, (DECIMAL*)v); - } - return NULL; - } - -} diff --git a/cpp/jacob/Variant.h b/cpp/jacob/Variant.h deleted file mode 100644 index d2293c2..0000000 --- a/cpp/jacob/Variant.h +++ /dev/null @@ -1,605 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -/* Header for class com_jacob_com_Variant */ - -#ifndef _Included_com_jacob_com_Variant -#define _Included_com_jacob_com_Variant -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Class: com_jacob_com_Variant - * Method: toEnumVariant - * Signature: ()Lcom/jacob/com/EnumVariant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toEnumVariant - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantNull - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantNull - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: cloneIndirect - * Signature: ()Lcom_jacob_com_Variant; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_cloneIndirect - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantShortRef - * Signature: (S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantShortRef - (JNIEnv *, jobject, jshort); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantIntRef - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantIntRef - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantDoubleRef - * Signature: (D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDoubleRef - (JNIEnv *, jobject, jdouble); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantDateRef - * Signature: (D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDateRef - (JNIEnv *, jobject, jdouble); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantStringRef - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantStringRef - (JNIEnv *, jobject, jstring); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantShortRef - * Signature: ()S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getVariantShortRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantIntRef - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantIntRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantShort - * Signature: (S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantShort - (JNIEnv *, jobject, jshort); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantShort - * Signature: ()S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getVariantShort - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantDoubleRef - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getVariantDoubleRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantDateRef - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getVariantDateRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getStringRef - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getVariantStringRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: com_jacob_com_VariantClear - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_VariantClear - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toDispatch - * Signature: ()LDispatch; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toVariantDispatch - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: clone - * Signature: ()Ljava/lang/Object; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_clone - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantInt - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantInt - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantDate - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getVariantDate - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantInt - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantInt - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantDate - * Signature: (D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDate - (JNIEnv *, jobject, jdouble); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantBoolean - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getVariantBoolean - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantByte - * Signature: ()B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getVariantByte - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantBoolean - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantBoolean - (JNIEnv *, jobject, jboolean); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantByte - * Signature: (B)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantByte - (JNIEnv *, jobject, jbyte); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantEmpty - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantEmpty - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantNothing - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantNothing - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantError - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantError - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantError - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantError - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantDouble - * Signature: ()D - */ -JNIEXPORT jdouble JNICALL Java_com_jacob_com_Variant_getVariantDouble - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantCurrency - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantCurrency - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantLong - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantLong - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantDispatch - * Signature: (Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDispatch - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantDouble - * Signature: (D)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDouble - (JNIEnv *, jobject, jdouble); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantCurrency - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantCurrency - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantLong - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantLong - (JNIEnv *, jobject); -/* - * Class: com_jacob_com_Variant - * Method: putVariantFloatRef - * Signature: (F)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantFloatRef - (JNIEnv *, jobject, jfloat); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantCurrencyRef - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantCurrencyRef - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantLongRef - * Signature: (J)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantLongRef - (JNIEnv *, jobject, jlong); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantErrorRef - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantErrorRef - (JNIEnv *, jobject, jint); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantBooleanRef - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantBooleanRef - (JNIEnv *, jobject, jboolean); - -/* - * Class: com_jacob_com_Variant - * Method: putObjectRef - * Signature: (Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putObjectRef - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantByteRef - * Signature: (B)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantByteRef - (JNIEnv *, jobject, jbyte); - -/* - * Class: com_jacob_com_Variant - * Method: getString - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_jacob_com_Variant_getVariantString - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantString - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantString - (JNIEnv *, jobject, jstring); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantFloatRef - * Signature: ()F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getVariantFloatRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantCurrencyRef - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantCurrencyRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantLongRef - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_com_jacob_com_Variant_getVariantLongRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantErrorRef - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantErrorRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantBooleanRef - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_getVariantBooleanRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantByteRef - * Signature: ()B - */ -JNIEXPORT jbyte JNICALL Java_com_jacob_com_Variant_getVariantByteRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: toVariantSafeArray - * Signature: (Z)Lcom/jacob/com/SafeArray; - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_toVariantSafeArray - (JNIEnv *, jobject, jboolean); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantSafeArrayRef - * Signature: (LSafeArray;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantSafeArrayRef - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantSafeArray - * Signature: (LSafeArray;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantSafeArray - (JNIEnv *, jobject, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantNoParam - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantNoParam - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantFloat - * Signature: ()F - */ -JNIEXPORT jfloat JNICALL Java_com_jacob_com_Variant_getVariantFloat - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantFloat - * Signature: (F)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantFloat - (JNIEnv *, jobject, jfloat); - -/* - * Class: com_jacob_com_Variant - * Method: changeVariantType - * Signature: (S)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_changeVariantType - (JNIEnv *, jobject, jshort); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantType - * Signature: ()S - */ -JNIEXPORT jshort JNICALL Java_com_jacob_com_Variant_getVariantType - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: release - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_release - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: init - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_init - (JNIEnv *, jobject); - -JNIEXPORT jbyteArray JNICALL Java_com_jacob_com_Variant_SerializationWriteToBytes - (JNIEnv *, jobject); - -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_SerializationReadFromBytes - (JNIEnv *, jobject, jbyteArray); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantVariant - * Signature: (Lcom/jacob/com/Variant;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantVariant - (JNIEnv *, jobject, jobject); - - -/* - * Class: com_jacob_com_Variant - * Method: getVariantVariant - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_jacob_com_Variant_getVariantVariant - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: putVariantDecRef - * Signature: (Ljava.math.BigDecimal;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDecRef - (JNIEnv *env, jobject _this, jint signum, jbyte scale, jint lo, jint mid, jint hi); - - -/* - * Class: com_jacob_com_Variant - * Method: putVariantDec - * Signature: (Ljava.math.BigDecimal;)V - */ -JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putVariantDec - (JNIEnv *env, jobject _this, jint signum, jbyte scale, jint lo, jint mid, jint hi); - - -/* - * Class: com_jacob_com_Variant - * Method: getVariantDecRef - * Signature: ()Ljava.math.BigDecimal - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getVariantDecRef - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: getVariantDec - * Signature: ()Ljava.math.BigDecimal - */ -JNIEXPORT jobject JNICALL Java_com_jacob_com_Variant_getVariantDec - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: isVariantConsideredNull - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_jacob_com_Variant_isVariantConsideredNull - (JNIEnv *, jobject); - -/* - * Class: com_jacob_com_Variant - * Method: zeroVariant - * Signature: ()V - * - * This should only be used on variant objects created by the - * com layer as part of a call through EventProxy. - * This zeros out the variant pointer in the Variant object - * so that the calling COM program can free the memory. - * instead of both the COM program and the Java GC doing it. - */ -void zeroVariant (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/jacob/include/atlalloc.h b/cpp/jacob/include/atlalloc.h deleted file mode 100644 index 8bd1006..0000000 --- a/cpp/jacob/include/atlalloc.h +++ /dev/null @@ -1,764 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#pragma once -#ifndef __ATLALLOC_H__ -#define __ATLALLOC_H__ -#endif - -#include -#include - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ - -/* -This is more than a little unsatisfying. /Wp64 warns when we convert a size_t to an int -because it knows such a conversion won't port. -But, when we have overloaded templates, there may well exist both conversions and we need -to fool the warning into not firing on 32 bit builds -*/ -#if !defined(_ATL_W64) -#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) -#define _ATL_W64 __w64 -#else -#define _ATL_W64 -#endif -#endif - -/* Can't use ::std::numeric_limits here because we don't want to introduce a new - deprendency of this code on SCL -*/ - -template -class AtlLimits; - -template<> -class AtlLimits -{ -public: - static const int _Min=INT_MIN; - static const int _Max=INT_MAX; -}; - -template<> -class AtlLimits -{ -public: - static const unsigned int _Min=0; - static const unsigned int _Max=UINT_MAX; -}; - -template<> -class AtlLimits -{ -public: - static const long _Min=LONG_MIN; - static const long _Max=LONG_MAX; -}; - -template<> -class AtlLimits -{ -public: - static const unsigned long _Min=0; - static const unsigned long _Max=ULONG_MAX; -}; - -template<> -class AtlLimits -{ -public: - static const long long _Min=LLONG_MIN; - static const long long _Max=LLONG_MAX; -}; - -template<> -class AtlLimits -{ -public: - static const unsigned long long _Min=0; - static const unsigned long long _Max=ULLONG_MAX; -}; - -/* generic version */ -template -inline HRESULT AtlAdd(T* ptResult, T tLeft, T tRight) -{ - if(::ATL::AtlLimits::_Max-tLeft < tRight) - { - return E_INVALIDARG; - } - *ptResult= tLeft + tRight; - return S_OK; -} - -/* generic but compariatively slow version */ -template -inline HRESULT AtlMultiply(T* ptResult, T tLeft, T tRight) -{ - /* avoid divide 0 */ - if(tLeft==0) - { - *ptResult=0; - return S_OK; - } - if(::ATL::AtlLimits::_Max/tLeft < tRight) - { - return E_INVALIDARG; - } - *ptResult= tLeft * tRight; - return S_OK; -} - -/* fast version for 32 bit integers */ -template<> -inline HRESULT AtlMultiply(int _ATL_W64 *piResult, int _ATL_W64 iLeft, int _ATL_W64 iRight) -{ - __int64 i64Result=static_cast<__int64>(iLeft) * static_cast<__int64>(iRight); - if(i64Result>INT_MAX || i64Result < INT_MIN) - { - return E_INVALIDARG; - } - *piResult=static_cast(i64Result); - return S_OK; -} - -template<> -inline HRESULT AtlMultiply(unsigned int _ATL_W64 *piResult, unsigned int _ATL_W64 iLeft, unsigned int _ATL_W64 iRight) -{ - unsigned __int64 i64Result=static_cast(iLeft) * static_cast(iRight); - if(i64Result>UINT_MAX) - { - return E_INVALIDARG; - } - *piResult=static_cast(i64Result); - return S_OK; -} - -template<> -inline HRESULT AtlMultiply(long _ATL_W64 *piResult, long _ATL_W64 iLeft, long _ATL_W64 iRight) -{ - __int64 i64Result=static_cast<__int64>(iLeft) * static_cast<__int64>(iRight); - if(i64Result>LONG_MAX || i64Result < LONG_MIN) - { - return E_INVALIDARG; - } - *piResult=static_cast(i64Result); - return S_OK; -} - -template<> -inline HRESULT AtlMultiply(unsigned long _ATL_W64 *piResult, unsigned long _ATL_W64 iLeft, unsigned long _ATL_W64 iRight) -{ - unsigned __int64 i64Result=static_cast(iLeft) * static_cast(iRight); - if(i64Result>ULONG_MAX) - { - return E_INVALIDARG; - } - *piResult=static_cast(i64Result); - return S_OK; -} - -template -inline T AtlMultiplyThrow(T tLeft, T tRight) -{ - T tResult; - HRESULT hr=AtlMultiply(&tResult, tLeft, tRight); - if(FAILED(hr)) - { - AtlThrow(hr); - } - return tResult; -} - -template -inline T AtlAddThrow(T tLeft, T tRight) -{ - T tResult; - HRESULT hr=AtlAdd(&tResult, tLeft, tRight); - if(FAILED(hr)) - { - AtlThrow(hr); - } - return tResult; -} - -inline LPVOID AtlCoTaskMemCAlloc(ULONG nCount, ULONG nSize) -{ - HRESULT hr; - ULONG nBytes=0; - if( FAILED(hr=::ATL::AtlMultiply(&nBytes, nCount, nSize))) - { - return NULL; - } - return ::CoTaskMemAlloc(nBytes); -} - -inline LPVOID AtlCoTaskMemRecalloc(void *pvMemory, ULONG nCount, ULONG nSize) -{ - HRESULT hr; - ULONG nBytes=0; - if( FAILED(hr=::ATL::AtlMultiply(&nBytes, nCount, nSize))) - { - return NULL; - } - return ::CoTaskMemRealloc(pvMemory, nBytes); -} - -} // namespace ATL -#pragma pack(pop) - -#pragma pack(push,8) -namespace ATL -{ -// forward declaration of Checked::memcpy_s - -namespace Checked -{ - void __cdecl memcpy_s(__out_bcount_part(s1max,n) void *s1, __in size_t s1max, __in_bcount(n) const void *s2, __in size_t n); -} - -///////////////////////////////////////////////////////////////////////////// -// Allocation helpers - -class CCRTAllocator -{ -public: - static void* Reallocate(void* p, size_t nBytes) throw() - { - return realloc(p, nBytes); - } - - static void* Allocate(size_t nBytes) throw() - { - return malloc(nBytes); - } - - static void Free(void* p) throw() - { - free(p); - } -}; - -class CLocalAllocator -{ -public: - static void* Allocate(size_t nBytes) throw() - { - return ::LocalAlloc(LMEM_FIXED, nBytes); - } - static void* Reallocate(void* p, size_t nBytes) throw() - { - if (p==NULL){ - return ( Allocate(nBytes) ); - - } - if (nBytes==0){ - Free(p); - return NULL; - } - return ::LocalReAlloc(p, nBytes, 0); - - } - static void Free(void* p) throw() - { - ::LocalFree(p); - } -}; - -class CGlobalAllocator -{ -public: - static void* Allocate(size_t nBytes) throw() - { - return ::GlobalAlloc(GMEM_FIXED, nBytes); - } - static void* Reallocate(void* p, size_t nBytes) throw() - { - if (p==NULL){ - return ( Allocate(nBytes) ); - - } - if (nBytes==0){ - Free(p); - return NULL; - } - return ( ::GlobalReAlloc(p, nBytes, 0) ); - } - static void Free(void* p) throw() - { - ::GlobalFree(p); - } -}; - -template -class CHeapPtrBase -{ -protected: - CHeapPtrBase() throw() : - m_pData(NULL) - { - } - CHeapPtrBase(CHeapPtrBase& p) throw() - { - m_pData = p.Detach(); // Transfer ownership - } - explicit CHeapPtrBase(T* pData) throw() : - m_pData(pData) - { - } - -public: - ~CHeapPtrBase() throw() - { - Free(); - } - -protected: - CHeapPtrBase& operator=(CHeapPtrBase& p) throw() - { - if(m_pData != p.m_pData) - Attach(p.Detach()); // Transfer ownership - return *this; - } - -public: - operator T*() const throw() - { - return m_pData; - } - - T* operator->() const throw() - { - ATLASSERT(m_pData != NULL); - return m_pData; - } - - T** operator&() throw() - { -#if defined(ATLASSUME) - ATLASSUME(m_pData == NULL); -#endif - return &m_pData; - } - - // Allocate a buffer with the given number of bytes - bool AllocateBytes(size_t nBytes) throw() - { - ATLASSERT(m_pData == NULL); - m_pData = static_cast(Allocator::Allocate(nBytes)); - if (m_pData == NULL) - return false; - - return true; - } - - // Attach to an existing pointer (takes ownership) - void Attach(T* pData) throw() - { - Allocator::Free(m_pData); - m_pData = pData; - } - - // Detach the pointer (releases ownership) - T* Detach() throw() - { - T* pTemp = m_pData; - m_pData = NULL; - return pTemp; - } - - // Free the memory pointed to, and set the pointer to NULL - void Free() throw() - { - Allocator::Free(m_pData); - m_pData = NULL; - } - - // Reallocate the buffer to hold a given number of bytes - bool ReallocateBytes(size_t nBytes) throw() - { - T* pNew; - - pNew = static_cast(Allocator::Reallocate(m_pData, nBytes)); - if (pNew == NULL) - return false; - m_pData = pNew; - - return true; - } - -public: - T* m_pData; -}; - -template -class CHeapPtr : - public CHeapPtrBase -{ -public: - CHeapPtr() throw() - { - } - CHeapPtr(CHeapPtr& p) throw() : - CHeapPtrBase(p) - { - } - explicit CHeapPtr(T* p) throw() : - CHeapPtrBase(p) - { - } - - CHeapPtr& operator=(CHeapPtr& p) throw() - { - CHeapPtrBase::operator=(p); - - return *this; - } - - // Allocate a buffer with the given number of elements - bool Allocate(size_t nElements = 1) throw() - { - size_t nBytes=0; - if(FAILED(::ATL::AtlMultiply(&nBytes, nElements, sizeof(T)))) - { - return false; - } - return AllocateBytes(nBytes); - } - - // Reallocate the buffer to hold a given number of elements - bool Reallocate(size_t nElements) throw() - { - size_t nBytes=0; - if(FAILED(::ATL::AtlMultiply(&nBytes, nElements, sizeof(T)))) - { - return false; - } - return ReallocateBytes(nBytes); - } -}; - -template< typename T, int t_nFixedBytes = 128, class Allocator = CCRTAllocator > -class CTempBuffer -{ -public: - CTempBuffer() throw() : - m_p( NULL ) - { - } - CTempBuffer( size_t nElements ) throw( ... ) : - m_p( NULL ) - { - Allocate( nElements ); - } - - ~CTempBuffer() throw() - { - if( m_p != reinterpret_cast< T* >( m_abFixedBuffer ) ) - { - FreeHeap(); - } - } - - operator T*() const throw() - { - return( m_p ); - } - T* operator->() const throw() - { - ATLASSERT( m_p != NULL ); - return( m_p ); - } - - T* Allocate( size_t nElements ) throw( ... ) - { - return( AllocateBytes( ::ATL::AtlMultiplyThrow(nElements,sizeof( T )) ) ); - } - - T* Reallocate( size_t nElements ) throw( ... ) - { - ATLENSURE(nElements < size_t(-1)/sizeof(T) ); - size_t nNewSize = nElements*sizeof( T ) ; - - if (m_p == NULL) - return AllocateBytes(nNewSize); - - if (nNewSize > t_nFixedBytes) - { - if( m_p == reinterpret_cast< T* >( m_abFixedBuffer ) ) - { - // We have to allocate from the heap and copy the contents into the new buffer - AllocateHeap(nNewSize); - Checked::memcpy_s(m_p, nNewSize, m_abFixedBuffer, t_nFixedBytes); - } - else - { - ReAllocateHeap( nNewSize ); - } - } - else - { - m_p = reinterpret_cast< T* >( m_abFixedBuffer ); - } - - return m_p; - } - - T* AllocateBytes( size_t nBytes ) - { - ATLASSERT( m_p == NULL ); - if( nBytes > t_nFixedBytes ) - { - AllocateHeap( nBytes ); - } - else - { - m_p = reinterpret_cast< T* >( m_abFixedBuffer ); - } - - return( m_p ); - } - -private: - ATL_NOINLINE void AllocateHeap( size_t nBytes ) - { - T* p = static_cast< T* >( Allocator::Allocate( nBytes ) ); - if( p == NULL ) - { - AtlThrow( E_OUTOFMEMORY ); - } - m_p = p; - } - - ATL_NOINLINE void ReAllocateHeap( size_t nNewSize) - { - T* p = static_cast< T* >( Allocator::Reallocate(m_p, nNewSize) ); - if ( p == NULL ) - { - AtlThrow( E_OUTOFMEMORY ); - } - m_p = p; - } - - ATL_NOINLINE void FreeHeap() throw() - { - Allocator::Free( m_p ); - } - -private: - T* m_p; - BYTE m_abFixedBuffer[t_nFixedBytes]; -}; - - -// Allocating memory on the stack without causing stack overflow. -// Only use these through the _ATL_SAFE_ALLOCA_* macros -namespace _ATL_SAFE_ALLOCA_IMPL -{ - -#ifndef _ATL_STACK_MARGIN -#if defined(_M_IX86) -#define _ATL_STACK_MARGIN 0x2000 // Minimum stack available after call to _ATL_SAFE_ALLOCA -#else //_M_AMD64 _M_IA64 -#define _ATL_STACK_MARGIN 0x4000 -#endif -#endif //_ATL_STACK_MARGIN - -//Verifies if sufficient space is available on the stack. -//Note: This function should never be inlined, because the stack allocation -//may not be freed until the end of the calling function (instead of the end of _AtlVerifyStackAvailable). -//The use of __try/__except preverts inlining in this case. -#if (_ATL_VER > 0x0301) -inline bool _AtlVerifyStackAvailable(SIZE_T Size) -{ - bool bStackAvailable = true; - - __try - { - SIZE_T size=0; - HRESULT hrAdd=::ATL::AtlAdd(&size, Size, static_cast(_ATL_STACK_MARGIN)); - if(FAILED(hrAdd)) - { - ATLASSERT(FALSE); - bStackAvailable = false; - } - else - { - PVOID p = _alloca(size); - if (p) - { - (p); - } - } - } - __except ((EXCEPTION_STACK_OVERFLOW == GetExceptionCode()) ? - EXCEPTION_EXECUTE_HANDLER : - EXCEPTION_CONTINUE_SEARCH) - { - bStackAvailable = false; - _resetstkoflw(); - } - return bStackAvailable; -} - - -// Helper Classes to manage heap buffers for _ATL_SAFE_ALLOCA -template < class Allocator> -class CAtlSafeAllocBufferManager -{ -private : - struct CAtlSafeAllocBufferNode - { - CAtlSafeAllocBufferNode* m_pNext; -#if defined(_M_IX86) - BYTE _pad[4]; -#elif defined(_M_IA64) - BYTE _pad[8]; -#elif defined(_M_AMD64) - BYTE _pad[8]; -#else - #error Only supported for X86, AMD64 and IA64 -#endif - void* GetData() - { - return (this + 1); - } - }; - - CAtlSafeAllocBufferNode* m_pHead; -public : - - CAtlSafeAllocBufferManager() : m_pHead(NULL) {}; - void* Allocate(SIZE_T nRequestedSize) - { - CAtlSafeAllocBufferNode *p = (CAtlSafeAllocBufferNode*)Allocator::Allocate(::ATL::AtlAddThrow(nRequestedSize, static_cast(sizeof(CAtlSafeAllocBufferNode)))); - if (p == NULL) - return NULL; - - // Add buffer to the list - p->m_pNext = m_pHead; - m_pHead = p; - - return p->GetData(); - } - ~CAtlSafeAllocBufferManager() - { - // Walk the list and free the buffers - while (m_pHead != NULL) - { - CAtlSafeAllocBufferNode* p = m_pHead; - m_pHead = m_pHead->m_pNext; - Allocator::Free(p); - } - } -}; -#endif - -} // namespace _ATL_SAFE_ALLOCA_IMPL - -} // namespace ATL - #pragma pack(pop) - -// Use one of the following macros before using _ATL_SAFE_ALLOCA -// EX version allows specifying a different heap allocator -#define USES_ATL_SAFE_ALLOCA_EX(x) ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager _AtlSafeAllocaManager - -#ifndef USES_ATL_SAFE_ALLOCA -#define USES_ATL_SAFE_ALLOCA USES_ATL_SAFE_ALLOCA_EX(ATL::CCRTAllocator) -#endif - -// nRequestedSize - requested size in bytes -// nThreshold - size in bytes beyond which memory is allocated from the heap. - -#if (_ATL_VER > 0x0301) - -// Defining _ATL_SAFE_ALLOCA_ALWAYS_ALLOCATE_THRESHOLD_SIZE always allocates the size specified -// for threshold if the stack space is available irrespective of requested size. -// This available for testing purposes. It will help determine the max stack usage due to _alloca's -// Disable _alloca not within try-except prefast warning since we verify stack space is available before. -#ifdef _ATL_SAFE_ALLOCA_ALWAYS_ALLOCATE_THRESHOLD_SIZE -#define _ATL_SAFE_ALLOCA(nRequestedSize, nThreshold) \ - __pragma(warning(push))\ - __pragma(warning(disable:4616))\ - __pragma(warning(disable:6255))\ - ((nRequestedSize <= nThreshold && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(nThreshold) ) ? \ - _alloca(nThreshold) : \ - ((ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(nThreshold)) ? _alloca(nThreshold) : 0), \ - _AtlSafeAllocaManager.Allocate(nRequestedSize))\ - __pragma(warning(pop)) -#else -#define _ATL_SAFE_ALLOCA(nRequestedSize, nThreshold) \ - __pragma(warning(push))\ - __pragma(warning(disable:4616))\ - __pragma(warning(disable:6255))\ - ((nRequestedSize <= nThreshold && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(nRequestedSize) ) ? \ - _alloca(nRequestedSize) : \ - _AtlSafeAllocaManager.Allocate(nRequestedSize))\ - __pragma(warning(pop)) -#endif - -#endif - -// Use 1024 bytes as the default threshold in ATL -#ifndef _ATL_SAFE_ALLOCA_DEF_THRESHOLD -#define _ATL_SAFE_ALLOCA_DEF_THRESHOLD 1024 -#endif - -#if (_ATL_VER <= 0x0301) // from atlbase.h - -class CComAllocator -{ -public: - static void* Reallocate(void* p, size_t nBytes) throw() - { -#ifdef _WIN64 - if( nBytes > INT_MAX ) - { - return( NULL ); - } -#endif - return ::CoTaskMemRealloc(p, ULONG(nBytes)); - } - static void* Allocate(size_t nBytes) throw() - { -#ifdef _WIN64 - if( nBytes > INT_MAX ) - { - return( NULL ); - } -#endif - return ::CoTaskMemAlloc(ULONG(nBytes)); - } - static void Free(void* p) throw() - { - ::CoTaskMemFree(p); - } -}; - -template -class CComHeapPtr : - public CHeapPtr -{ -public: - CComHeapPtr() throw() - { - } - - explicit CComHeapPtr(T* pData) throw() : - CHeapPtr(pData) - { - } -}; - -#endif - diff --git a/cpp/jacob/include/atlbase.h b/cpp/jacob/include/atlbase.h deleted file mode 100644 index a0e61a0..0000000 --- a/cpp/jacob/include/atlbase.h +++ /dev/null @@ -1,7410 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLBASE_H__ -#define __ATLBASE_H__ - -#pragma once - -// Warnings outside of the push/pop sequence will be disabled for all user -// projects. The only warnings that should be disabled outside the push/pop -// are warnings that are a) benign and b) will show up in user projects -// without being directly caused by the user - -#pragma warning(disable: 4505) // unreferenced local function has been removed -#pragma warning(disable: 4710) // function couldn't be inlined -#pragma warning(disable: 4514) // unreferenced inlines are common - -// These two warnings will occur in any class that contains or derives from a -// class with a private copy constructor or copy assignment operator. -#pragma warning(disable: 4511) // copy constructor could not be generated -#pragma warning(disable: 4512) // assignment operator could not be generated - -// This is a very common pattern for us -#pragma warning(disable: 4355) // 'this' : used in base member initializer list - -// Warning 4702 is generated based on compiler backend data flow analysis. This means that for -// some specific instantiations of a template it can be generated even when the code branch is -// required for other instantiations. In future we should find a way to be more selective about this -#pragma warning(disable: 4702) // Unreachable code - -// -// [pfx_parse] - workaround for old PREfix/PREfast parser -// -#if (defined(_PREFIX_) || defined(_PREFAST_)) && (_MSC_VER < 1400) -#pragma warning (push) -#pragma warning(disable: 4081) // expected 'newline' -#endif // old PREfast parser - -#ifdef _ATL_ALL_WARNINGS -#pragma warning( push ) -#endif - -#pragma warning(disable : 4668) // is not defined as a preprocessor macro, replacing with '0' for '#if/#elif -#pragma warning(disable : 4820) // padding added after member -#pragma warning(disable : 4917) // a GUID can only be associated with a class, interface or namespace - -#pragma warning(disable : 4217) // member template functions cannot be used for copy-assignment or copy-construction - -#pragma warning(disable: 4127) // constant expression -#pragma warning(disable: 4097) // typedef name used as synonym for class-name -#pragma warning(disable: 4786) // identifier was truncated in the debug information -#pragma warning(disable: 4291) // allow placement new -#pragma warning(disable: 4201) // nameless unions are part of C++ -#pragma warning(disable: 4103) // pragma pack -#pragma warning(disable: 4268) // const static/global data initialized to zeros - -#pragma warning (push) -#pragma warning(disable: 4571) //catch(...) blocks compiled with /EHs do NOT catch or re-throw Structured Exceptions -#ifndef __cplusplus - #error ATL requires C++ compilation (use a .cpp suffix) -#endif -#ifndef ATL_NO_LEAN_AND_MEAN -#define ATL_NO_LEAN_AND_MEAN -#endif - -#include - -#ifndef _WINSOCKAPI_ -#include -#endif - -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include - -#if !defined(_ATL_MIN_CRT) & defined(_MT) -#include -#include // for _beginthreadex, _endthreadex -#endif - -#include -#include - -#include -#include -#include -#include -#include - -#define _ATL_TYPELIB_INDEX_LENGTH 10 -#define _ATL_QUOTES_SPACE 2 - -#pragma pack(push, _ATL_PACKING) - -#ifndef _ATL_NO_DEFAULT_LIBS - -#if defined(_ATL_DLL) - #pragma comment(lib, "atl.lib") - -#if !defined(_ATL_NOFORCE_MANIFEST) && !defined(_VC_NODEFAULTLIB) - -#include - -#endif // !defined(_ATL_NOFORCE_MANIFEST) && !defined(_VC_NODEFAULTLIB) - -#endif // _ATL_DLL - -#ifdef _DEBUG - #pragma comment(lib, "atlsd.lib") -#else - #pragma comment(lib, "atls.lib") -#ifdef _ATL_MIN_CRT - #pragma comment(lib, "atlmincrt.lib") -#endif -#endif - -#endif // !_ATL_NO_DEFAULT_LIBS - -#if defined(_ATL_DLL) - // Pull in obj file with manifest directive for ATL dll - #if defined(_M_IX86) - #pragma comment(linker, "/include:__forceAtlDllManifest") - #else - #pragma comment(linker, "/include:_forceAtlDllManifest") - #endif -#endif - -extern "C" const __declspec(selectany) GUID LIBID_ATLLib = {0x44EC0535,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}}; -extern "C" const __declspec(selectany) CLSID CLSID_Registrar = {0x44EC053A,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}}; -extern "C" const __declspec(selectany) IID IID_IRegistrar = {0x44EC053B,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}}; -extern "C" const __declspec(selectany) IID IID_IAxWinHostWindow = {0xb6ea2050,0x048a,0x11d1,{0x82,0xb9,0x00,0xc0,0x4f,0xb9,0x94,0x2e}}; -extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatch = {0xb6ea2051,0x048a,0x11d1,{0x82,0xb9,0x00,0xc0,0x4f,0xb9,0x94,0x2e}}; -extern "C" const __declspec(selectany) IID IID_IInternalConnection = {0x72AD0770,0x6A9F,0x11d1,{0xBC,0xEC,0x00,0x60,0x08,0x8F,0x44,0x4E}}; -extern "C" const __declspec(selectany) IID IID_IDocHostUIHandlerDispatch = {0x425B5AF0,0x65F1,0x11d1,{0x96,0x11,0x00,0x00,0xF8,0x1E,0x0D,0x0D}}; -extern "C" const __declspec(selectany) IID IID_IAxWinHostWindowLic = {0x3935BDA8,0x4ED9,0x495c,{0x86,0x50,0xE0,0x1F,0xC1,0xE3,0x8A,0x4B}}; -extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatchEx = {0xB2D0778B,0xAC99,0x4c58,{0xA5,0xC8,0xE7,0x72,0x4E,0x53,0x16,0xB5}}; - -// REVIEW: Temp until it gets back into UUID.LIB -extern "C" const __declspec(selectany) CLSID CLSID_StdGlobalInterfaceTable = {0x00000323,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; - -#ifndef _delayimp_h -extern "C" IMAGE_DOS_HEADER __ImageBase; -#endif - -#ifdef _AFX -void AFXAPI AfxOleLockApp(); -void AFXAPI AfxOleUnlockApp(); -#endif // _AFX - - - -namespace ATL -{ - -struct _ATL_CATMAP_ENTRY -{ - int iType; - const CATID* pcatid; -}; - -#define _ATL_CATMAP_ENTRY_END 0 -#define _ATL_CATMAP_ENTRY_IMPLEMENTED 1 -#define _ATL_CATMAP_ENTRY_REQUIRED 2 - -typedef HRESULT (WINAPI _ATL_CREATORFUNC)(void* pv, REFIID riid, LPVOID* ppv); -typedef HRESULT (WINAPI _ATL_CREATORARGFUNC)(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw); -typedef HRESULT (WINAPI _ATL_MODULEFUNC)(DWORD_PTR dw); -typedef LPCTSTR (WINAPI _ATL_DESCRIPTIONFUNC)(); -typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)(); -typedef void (__stdcall _ATL_TERMFUNC)(DWORD_PTR dw); - -struct _ATL_TERMFUNC_ELEM -{ - _ATL_TERMFUNC* pFunc; - DWORD_PTR dw; - _ATL_TERMFUNC_ELEM* pNext; -}; - -/* -struct _ATL_OBJMAP_ENTRY20 -{ - const CLSID* pclsid; - HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister); - _ATL_CREATORFUNC* pfnGetClassObject; - _ATL_CREATORFUNC* pfnCreateInstance; - IUnknown* pCF; - DWORD dwRegister; - _ATL_DESCRIPTIONFUNC* pfnGetObjectDescription; -}; -*/ - -// Can't inherit from _ATL_OBJMAP_ENTRY20 -// because it messes up the OBJECT_MAP macros -struct _ATL_OBJMAP_ENTRY30 -{ - const CLSID* pclsid; - HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister); - _ATL_CREATORFUNC* pfnGetClassObject; - _ATL_CREATORFUNC* pfnCreateInstance; - IUnknown* pCF; - DWORD dwRegister; - _ATL_DESCRIPTIONFUNC* pfnGetObjectDescription; - _ATL_CATMAPFUNC* pfnGetCategoryMap; - HRESULT WINAPI RevokeClassObject() - { - if (dwRegister == 0) - return S_OK; - return CoRevokeClassObject(dwRegister); - } - HRESULT WINAPI RegisterClassObject(DWORD dwClsContext, DWORD dwFlags) - { - IUnknown* p = NULL; - if (pfnGetClassObject == NULL) - return S_OK; - HRESULT hRes = pfnGetClassObject(pfnCreateInstance, __uuidof(IUnknown), (LPVOID*) &p); - if (SUCCEEDED(hRes)) - hRes = CoRegisterClassObject(*pclsid, p, dwClsContext, dwFlags, &dwRegister); - if (p != NULL) - p->Release(); - return hRes; - } -// Added in ATL 3.0 - void (WINAPI *pfnObjectMain)(bool bStarting); -}; - -typedef _ATL_OBJMAP_ENTRY30 _ATL_OBJMAP_ENTRY; - -// Auto Object Map - -#if defined(_M_IA64) || defined(_M_IX86) || defined (_M_AMD64) - -#pragma section("ATL$__a", read, shared) -#pragma section("ATL$__z", read, shared) -#pragma section("ATL$__m", read, shared) -extern "C" -{ -__declspec(selectany) __declspec(allocate("ATL$__a")) _ATL_OBJMAP_ENTRY* __pobjMapEntryFirst = NULL; -__declspec(selectany) __declspec(allocate("ATL$__z")) _ATL_OBJMAP_ENTRY* __pobjMapEntryLast = NULL; -} - -#if !defined(_M_IA64) -#pragma comment(linker, "/merge:ATL=.rdata") -#endif - -#else - -extern "C" -{ -__declspec(selectany) _ATL_OBJMAP_ENTRY* __pobjMapEntryFirst = NULL; -__declspec(selectany) _ATL_OBJMAP_ENTRY* __pobjMapEntryLast = NULL; -} - -#endif // defined(_M_IA64) || defined(_M_IX86) - -struct _ATL_REGMAP_ENTRY -{ - LPCOLESTR szKey; - LPCOLESTR szData; -}; - -struct _AtlCreateWndData -{ - void* m_pThis; - DWORD m_dwThreadID; - _AtlCreateWndData* m_pNext; -}; - - -// perfmon registration/unregistration function definitions -typedef HRESULT (*_ATL_PERFREGFUNC)(HINSTANCE hDllInstance); -typedef HRESULT (*_ATL_PERFUNREGFUNC)(); -__declspec(selectany) _ATL_PERFREGFUNC _pPerfRegFunc = NULL; -__declspec(selectany) _ATL_PERFUNREGFUNC _pPerfUnRegFunc = NULL; - -///////////////////////////////////////////////////////////////////////////// -// Threading Model Support - -template< class TLock > -class CComCritSecLock -{ -public: - CComCritSecLock( TLock& cs, bool bInitialLock = true ); - ~CComCritSecLock() throw(); - - HRESULT Lock() throw(); - void Unlock() throw(); - -// Implementation -private: - TLock& m_cs; - bool m_bLocked; - -// Private to avoid accidental use - CComCritSecLock( const CComCritSecLock& ) throw(); - CComCritSecLock& operator=( const CComCritSecLock& ) throw(); -}; - -template< class TLock > -inline CComCritSecLock< TLock >::CComCritSecLock( TLock& cs, bool bInitialLock ) : - m_cs( cs ), - m_bLocked( false ) -{ - if( bInitialLock ) - { - HRESULT hr; - - hr = Lock(); - if( FAILED( hr ) ) - { - AtlThrow( hr ); - } - } -} - -template< class TLock > -inline CComCritSecLock< TLock >::~CComCritSecLock() throw() -{ - if( m_bLocked ) - { - Unlock(); - } -} - -template< class TLock > -inline HRESULT CComCritSecLock< TLock >::Lock() throw() -{ - HRESULT hr; - - ATLASSERT( !m_bLocked ); - hr = m_cs.Lock(); - if( FAILED( hr ) ) - { - return( hr ); - } - m_bLocked = true; - - return( S_OK ); -} - -template< class TLock > -inline void CComCritSecLock< TLock >::Unlock() throw() -{ - ATLASSUME( m_bLocked ); - m_cs.Unlock(); - m_bLocked = false; -} - -class CComMultiThreadModelNoCS -{ -public: - static ULONG WINAPI Increment(LPLONG p) throw() {return InterlockedIncrement(p);} - static ULONG WINAPI Decrement(LPLONG p) throw() {return InterlockedDecrement(p);} - typedef CComFakeCriticalSection AutoCriticalSection; - typedef CComFakeCriticalSection AutoDeleteCriticalSection; - typedef CComFakeCriticalSection CriticalSection; - typedef CComMultiThreadModelNoCS ThreadModelNoCS; -}; - -class CComMultiThreadModel -{ -public: - static ULONG WINAPI Increment(LPLONG p) throw() {return InterlockedIncrement(p);} - static ULONG WINAPI Decrement(LPLONG p) throw() {return InterlockedDecrement(p);} - typedef CComAutoCriticalSection AutoCriticalSection; - typedef CComAutoDeleteCriticalSection AutoDeleteCriticalSection; - typedef CComCriticalSection CriticalSection; - typedef CComMultiThreadModelNoCS ThreadModelNoCS; -}; - -class CComSingleThreadModel -{ -public: - static ULONG WINAPI Increment(LPLONG p) throw() {return ++(*p);} - static ULONG WINAPI Decrement(LPLONG p) throw() {return --(*p);} - typedef CComFakeCriticalSection AutoCriticalSection; - typedef CComFakeCriticalSection AutoDeleteCriticalSection; - typedef CComFakeCriticalSection CriticalSection; - typedef CComSingleThreadModel ThreadModelNoCS; -}; - -#if defined(_ATL_SINGLE_THREADED) - -#if defined(_ATL_APARTMENT_THREADED) || defined(_ATL_FREE_THREADED) -#pragma message ("More than one global threading model defined.") -#endif - - typedef CComSingleThreadModel CComObjectThreadModel; - typedef CComSingleThreadModel CComGlobalsThreadModel; - -#elif defined(_ATL_APARTMENT_THREADED) - -#if defined(_ATL_SINGLE_THREADED) || defined(_ATL_FREE_THREADED) -#pragma message ("More than one global threading model defined.") -#endif - - typedef CComSingleThreadModel CComObjectThreadModel; - typedef CComMultiThreadModel CComGlobalsThreadModel; - -#elif defined(_ATL_FREE_THREADED) - -#if defined(_ATL_SINGLE_THREADED) || defined(_ATL_APARTMENT_THREADED) -#pragma message ("More than one global threading model defined.") -#endif - - typedef CComMultiThreadModel CComObjectThreadModel; - typedef CComMultiThreadModel CComGlobalsThreadModel; - -#else -#pragma message ("No global threading model defined") -#endif - -///////////////////////////////////////////////////////////////////////////// -// Module - - -// Used by COM related code in ATL -struct _ATL_COM_MODULE70 -{ - UINT cbSize; - HINSTANCE m_hInstTypeLib; - _ATL_OBJMAP_ENTRY** m_ppAutoObjMapFirst; - _ATL_OBJMAP_ENTRY** m_ppAutoObjMapLast; - CComCriticalSection m_csObjMap; -}; -typedef _ATL_COM_MODULE70 _ATL_COM_MODULE; - - -// Used by Windowing code in ATL -struct _ATL_WIN_MODULE70 -{ - UINT cbSize; - CComCriticalSection m_csWindowCreate; - _AtlCreateWndData* m_pCreateWndList; - CSimpleArray m_rgWindowClassAtoms; -}; -typedef _ATL_WIN_MODULE70 _ATL_WIN_MODULE; - - -struct _ATL_MODULE70 -{ - UINT cbSize; - LONG m_nLockCnt; - _ATL_TERMFUNC_ELEM* m_pTermFuncs; - CComCriticalSection m_csStaticDataInitAndTypeInfo; -}; -typedef _ATL_MODULE70 _ATL_MODULE; - - -///////////////////////////////////////////////////////////////////////////// -//This define makes debugging asserts easier. -#define _ATL_SIMPLEMAPENTRY ((ATL::_ATL_CREATORARGFUNC*)1) - -struct _ATL_INTMAP_ENTRY -{ - const IID* piid; // the interface id (IID) - DWORD_PTR dw; - _ATL_CREATORARGFUNC* pFunc; //NULL:end, 1:offset, n:ptr -}; - -///////////////////////////////////////////////////////////////////////////// -// Global Functions - -///////////////////////////////////////////////////////////////////////////// -// QI Support - -ATLAPI AtlInternalQueryInterface(void* pThis, - const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObject); - -///////////////////////////////////////////////////////////////////////////// -// Inproc Marshaling helpers - -ATLAPI AtlFreeMarshalStream(IStream* pStream); -ATLAPI AtlMarshalPtrInProc(IUnknown* pUnk, const IID& iid, IStream** ppStream); -ATLAPI AtlUnmarshalPtr(IStream* pStream, const IID& iid, IUnknown** ppUnk); - -ATLAPI_(BOOL) AtlWaitWithMessageLoop(HANDLE hEvent); - -///////////////////////////////////////////////////////////////////////////// -// Connection Point Helpers - -ATLAPI AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw); -ATLAPI AtlUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw); - -///////////////////////////////////////////////////////////////////////////// -// IDispatch Error handling - -ATLAPI AtlSetErrorInfo(const CLSID& clsid, LPCOLESTR lpszDesc, - DWORD dwHelpID, LPCOLESTR lpszHelpFile, const IID& iid, HRESULT hRes, - HINSTANCE hInst); - -///////////////////////////////////////////////////////////////////////////// -// Module - -ATLAPI AtlComModuleRegisterClassObjects(_ATL_COM_MODULE* pComModule, DWORD dwClsContext, DWORD dwFlags); -ATLAPI AtlComModuleRevokeClassObjects(_ATL_COM_MODULE* pComModule); - -ATLAPI AtlComModuleGetClassObject(_ATL_COM_MODULE* pComModule, REFCLSID rclsid, REFIID riid, LPVOID* ppv); - -ATLAPI AtlComModuleRegisterServer(_ATL_COM_MODULE* pComModule, BOOL bRegTypeLib, const CLSID* pCLSID = NULL); -ATLAPI AtlComModuleUnregisterServer(_ATL_COM_MODULE* pComModule, BOOL bUnRegTypeLib, const CLSID* pCLSID = NULL); - -ATLAPI AtlRegisterClassCategoriesHelper( REFCLSID clsid, const struct _ATL_CATMAP_ENTRY* pCatMap, BOOL bRegister ); - -ATLAPI AtlUpdateRegistryFromResourceD(HINSTANCE hInst, LPCOLESTR lpszRes, - BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = NULL); - -ATLAPI AtlRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex); -ATLAPI AtlUnRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex); -ATLAPI AtlLoadTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib); - -ATLAPI_(DWORD) AtlGetVersion(void* pReserved); - -ATLAPI AtlModuleAddTermFunc(_ATL_MODULE* pModule, _ATL_TERMFUNC* pFunc, DWORD_PTR dw); -ATLAPI_(void) AtlCallTermFunc(_ATL_MODULE* pModule); - -ATLAPI AtlWinModuleInit(_ATL_WIN_MODULE* pWinModule); -ATLAPIINL AtlWinModuleTerm(_ATL_WIN_MODULE* pWinModule, HINSTANCE hInst); - -ATLAPI_(void) AtlWinModuleAddCreateWndData(_ATL_WIN_MODULE* pWinModule, _AtlCreateWndData* pData, void* pObject); -ATLAPI_(void*) AtlWinModuleExtractCreateWndData(_ATL_WIN_MODULE* pWinModule); - -///////////////////////////////////////////////////////////////////////////// -// Get Registrar object from ATL DLL. - -#if !defined(_ATL_STATIC_REGISTRY) -#ifdef _ATL_DLL_IMPL -extern "C" HRESULT __stdcall AtlCreateRegistrar(IRegistrar** ppReg); -#else -extern "C" __declspec(dllimport) HRESULT __stdcall AtlCreateRegistrar(IRegistrar** ppReg); -#endif -#endif - -///////////////////////////////////////////////////////////////////////////// -// GUID comparison -inline BOOL WINAPI InlineIsEqualUnknown(REFGUID rguid1) -{ - return ( - ((PLONG) &rguid1)[0] == 0 && - ((PLONG) &rguid1)[1] == 0 && -#ifdef _ATL_BYTESWAP - ((PLONG) &rguid1)[2] == 0xC0000000 && - ((PLONG) &rguid1)[3] == 0x00000046); -#else - ((PLONG) &rguid1)[2] == 0x000000C0 && - ((PLONG) &rguid1)[3] == 0x46000000); -#endif -} - - - -template -LPCTSTR AtlDebugGetClassName(T*) -{ -#ifdef _DEBUG - const _ATL_INTMAP_ENTRY* pEntries = T::_GetEntries(); - return (LPCTSTR)pEntries[-1].dw; -#else - return NULL; -#endif -} - -// Validation macro for OUT pointer -// Used in QI and CreateInstance -#define _ATL_VALIDATE_OUT_POINTER(x)\ - do { \ - ATLASSERT(x != NULL); \ - if (x == NULL) \ - return E_POINTER; \ - *x = NULL; \ - } while(0) - -///////////////////////////////////////////////////////////////////////////// -// Win32 libraries - -#ifndef _ATL_NO_DEFAULT_LIBS -#pragma comment(lib, "kernel32.lib") -#pragma comment(lib, "user32.lib") -#pragma comment(lib, "advapi32.lib") -#pragma comment(lib, "ole32.lib") -#pragma comment(lib, "shell32.lib") -#pragma comment(lib, "oleaut32.lib") -#pragma comment(lib, "uuid.lib") -#pragma comment(lib, "shlwapi.lib") -#endif // !_ATL_NO_DEFAULT_LIBS - -template< typename T > -class CAutoVectorPtr -{ -public: - CAutoVectorPtr() throw() : - m_p( NULL ) - { - } - CAutoVectorPtr( CAutoVectorPtr< T >& p ) throw() - { - m_p = p.Detach(); // Transfer ownership - } - explicit CAutoVectorPtr( T* p ) throw() : - m_p( p ) - { - } - ~CAutoVectorPtr() throw() - { - Free(); - } - - operator T*() const throw() - { - return( m_p ); - } - - CAutoVectorPtr< T >& operator=( CAutoVectorPtr< T >& p ) throw() - { - if(*this==p) - { - if(this!=&p) - { - // If this assert fires, it means you attempted to assign one CAutoVectorPtr to another when they both contained - // a pointer to the same underlying vector. This means a bug in your code, since your vector will get - // double-deleted. - ATLASSERT(FALSE); - - // For safety, we are going to detach the other CAutoVectorPtr to avoid a double-free. Your code still - // has a bug, though. - p.Detach(); - } - else - { - // Alternatively, this branch means that you are assigning a CAutoVectorPtr to itself, which is - // pointless but permissible - - // nothing to do - } - } - else - { - Free(); - Attach( p.Detach() ); // Transfer ownership - } - return( *this ); - } - - // basic comparison operators - bool operator!=(CAutoVectorPtr& p) const - { - return !operator==(p); - } - - bool operator==(CAutoVectorPtr& p) const - { - return m_p==p.m_p; - } - - // Allocate the vector - bool Allocate( size_t nElements ) throw() - { - ATLASSUME( m_p == NULL ); - ATLTRY( m_p = new T[nElements] ); - if( m_p == NULL ) - { - return( false ); - } - - return( true ); - } - // Attach to an existing pointer (takes ownership) - void Attach( T* p ) throw() - { - ATLASSUME( m_p == NULL ); - m_p = p; - } - // Detach the pointer (releases ownership) - T* Detach() throw() - { - T* p; - - p = m_p; - m_p = NULL; - - return( p ); - } - // Delete the vector pointed to, and set the pointer to NULL - void Free() throw() - { - delete[] m_p; - m_p = NULL; - } - -public: - T* m_p; -}; - -template< typename T > -class CAutoPtr -{ -public: - CAutoPtr() throw() : - m_p( NULL ) - { - } - template< typename TSrc > - CAutoPtr( CAutoPtr< TSrc >& p ) throw() - { - m_p = p.Detach(); // Transfer ownership - } -// -// [pfx_parse] - workaround for PREfix parse problems -// -#if (!defined(_PREFIX_)) && (!defined(_PREFAST_)) - CAutoPtr( CAutoPtr< T >& p ) throw() - { - m_p = p.Detach(); // Transfer ownership - } -#endif // !_PREFIX_ - explicit CAutoPtr( T* p ) throw() : - m_p( p ) - { - } - ~CAutoPtr() throw() - { - Free(); - } - - // Templated version to allow pBase = pDerived - template< typename TSrc > - CAutoPtr< T >& operator=( CAutoPtr< TSrc >& p ) throw() - { - if(m_p==p.m_p) - { - // This means that two CAutoPtrs of two different types had the same m_p in them - // which is never correct - ATLASSERT(FALSE); - } - else - { - Free(); - Attach( p.Detach() ); // Transfer ownership - } - return( *this ); - } - CAutoPtr< T >& operator=( CAutoPtr< T >& p ) throw() - { - if(*this==p) - { - if(this!=&p) - { - // If this assert fires, it means you attempted to assign one CAutoPtr to another when they both contained - // a pointer to the same underlying object. This means a bug in your code, since your object will get - // double-deleted. -#ifdef ATL_AUTOPTR_ASSIGNMENT_ASSERT - ATLASSERT(FALSE); -#endif - - // For safety, we are going to detach the other CAutoPtr to avoid a double-free. Your code still - // has a bug, though. - p.Detach(); - } - else - { - // Alternatively, this branch means that you are assigning a CAutoPtr to itself, which is - // pointless but permissible - - // nothing to do - } - } - else - { - Free(); - Attach( p.Detach() ); // Transfer ownership - } - return( *this ); - } - - // basic comparison operators - bool operator!=(CAutoPtr& p) const - { - return !operator==(p); - } - - bool operator==(CAutoPtr& p) const - { - return m_p==p.m_p; - } - - operator T*() const throw() - { - return( m_p ); - } - T* operator->() const throw() - { - ATLASSUME( m_p != NULL ); - return( m_p ); - } - - // Attach to an existing pointer (takes ownership) - void Attach( T* p ) throw() - { - ATLASSUME( m_p == NULL ); - m_p = p; - } - // Detach the pointer (releases ownership) - T* Detach() throw() - { - T* p; - - p = m_p; - m_p = NULL; - - return( p ); - } - // Delete the object pointed to, and set the pointer to NULL - void Free() throw() - { - delete m_p; - m_p = NULL; - } - -public: - T* m_p; -}; - -/* Automatic cleanup for _malloca objects */ -template< typename T > -class CAutoStackPtr -{ -public: - CAutoStackPtr() throw() : - m_p( NULL ) - { - } - template< typename TSrc > - CAutoStackPtr( CAutoStackPtr< TSrc >& p ) throw() - { - m_p = p.Detach(); // Transfer ownership - } - CAutoStackPtr( CAutoStackPtr< T >& p ) throw() - { - m_p = p.Detach(); // Transfer ownership - } - explicit CAutoStackPtr( T* p ) throw() : - m_p( p ) - { - } - ~CAutoStackPtr() throw() - { - Free(); - } - - // Templated version to allow pBase = pDerived - template< typename TSrc > - CAutoStackPtr< T >& operator=( CAutoStackPtr< TSrc >& p ) throw() - { - if(m_p==p.m_p) - { - // This means that two CAutoPtrs of two different types had the same m_p in them - // which is never correct - ATLASSERT(FALSE); - } - else - { - Free(); - Attach( p.Detach() ); // Transfer ownership - } - return( *this ); - } - CAutoStackPtr< T >& operator=( CAutoStackPtr< T >& p ) throw() - { - if(*this==p) - { - if(this!=&p) - { - // If this assert fires, it means you attempted to assign one CAutoPtr to another when they both contained - // a pointer to the same underlying object. This means a bug in your code, since your object will get - // double-deleted. - ATLASSERT(FALSE); - - // For safety, we are going to detach the other CAutoPtr to avoid a double-free. Your code still - // has a bug, though. - p.Detach(); - } - else - { - // Alternatively, this branch means that you are assigning a CAutoPtr to itself, which is - // pointless but permissible - - // nothing to do - } - } - else - { - Free(); - Attach( p.Detach() ); // Transfer ownership - } - return( *this ); - } - - // basic comparison operators - bool operator!=(CAutoStackPtr& p) const - { - return !operator==(p); - } - - bool operator==(CAutoStackPtr& p) const - { - return m_p==p.m_p; - } - - operator T*() const throw() - { - return( m_p ); - } - T* operator->() const throw() - { - ATLASSUME( m_p != NULL ); - return( m_p ); - } - - // Attach to an existing pointer (takes ownership) - void Attach( T* p ) throw() - { - ATLASSUME( m_p == NULL ); - m_p = p; - } - // Detach the pointer (releases ownership) - T* Detach() throw() - { - T* p; - - p = m_p; - m_p = NULL; - - return( p ); - } - // Delete the object pointed to, and set the pointer to NULL - void Free() throw() - { - /* Note: _freea only actually does anything if m_p was heap allocated - If m_p was from the stack, it wouldn't be possible to actually free it here - [wrong function] unless we got inlined. But really all we do if m_p is - stack-based is ignore it and let its alloca storage disappear at the end - of the outer function. - */ - _freea(m_p); - m_p = NULL; - } - -public: - T* m_p; -}; - -// static_cast_auto template functions. Used like static_cast, only they work on CAutoPtr objects -template< class Dest, class Src > -Dest* static_cast_auto( const CAutoPtr< Src >& pSrc ) throw() -{ - return( static_cast< Dest* >( static_cast< Src* >( pSrc ) ) ); -} - - -class CComAllocator -{ -public: - static void* Reallocate(void* p, size_t nBytes) throw() - { -#ifdef _WIN64 - if( nBytes > INT_MAX ) - { - return( NULL ); - } -#endif - return ::CoTaskMemRealloc(p, ULONG(nBytes)); - } - static void* Allocate(size_t nBytes) throw() - { -#ifdef _WIN64 - if( nBytes > INT_MAX ) - { - return( NULL ); - } -#endif - return ::CoTaskMemAlloc(ULONG(nBytes)); - } - static void Free(void* p) throw() - { - ::CoTaskMemFree(p); - } -}; - -template -class CComHeapPtr : - public CHeapPtr -{ -public: - CComHeapPtr() throw() - { - } - - explicit CComHeapPtr(T* pData) throw() : - CHeapPtr(pData) - { - } -}; - -template -T* AtlSafeRealloc(T* pT, size_t cEls) throw() -{ - T* pTemp; - - size_t nBytes=0; - if(FAILED(::ATL::AtlMultiply(&nBytes, cEls, sizeof(T)))) - { - return NULL; - } - pTemp = static_cast(Reallocator::Reallocate(pT, nBytes)); - if (pTemp == NULL) - { - Reallocator::Free(pT); - return NULL; - } - pT = pTemp; - return pTemp; -} - -class CHandle -{ -public: - CHandle() throw(); - CHandle( CHandle& h ) throw(); - explicit CHandle( HANDLE h ) throw(); - ~CHandle() throw(); - - CHandle& operator=( CHandle& h ) throw(); - - operator HANDLE() const throw(); - - // Attach to an existing handle (takes ownership). - void Attach( HANDLE h ) throw(); - // Detach the handle from the object (releases ownership). - HANDLE Detach() throw(); - - // Close the handle. - void Close() throw(); - -public: - HANDLE m_h; -}; - -inline CHandle::CHandle() throw() : - m_h( NULL ) -{ -} - -inline CHandle::CHandle( CHandle& h ) throw() : - m_h( NULL ) -{ - Attach( h.Detach() ); -} - -inline CHandle::CHandle( HANDLE h ) throw() : - m_h( h ) -{ -} - -inline CHandle::~CHandle() throw() -{ - if( m_h != NULL ) - { - Close(); - } -} - -inline CHandle& CHandle::operator=( CHandle& h ) throw() -{ - if( this != &h ) - { - if( m_h != NULL ) - { - Close(); - } - Attach( h.Detach() ); - } - - return( *this ); -} - -inline CHandle::operator HANDLE() const throw() -{ - return( m_h ); -} - -inline void CHandle::Attach( HANDLE h ) throw() -{ - ATLASSUME( m_h == NULL ); - m_h = h; // Take ownership -} - -inline HANDLE CHandle::Detach() throw() -{ - HANDLE h; - - h = m_h; // Release ownership - m_h = NULL; - - return( h ); -} - -inline void CHandle::Close() throw() -{ - if( m_h != NULL ) - { - ::CloseHandle( m_h ); - m_h = NULL; - } -} - -class CCritSecLock -{ -public: - CCritSecLock( CRITICAL_SECTION& cs, bool bInitialLock = true ); - ~CCritSecLock() throw(); - - void Lock(); - void Unlock() throw(); - -// Implementation -private: - CRITICAL_SECTION& m_cs; - bool m_bLocked; - -// Private to avoid accidental use - CCritSecLock( const CCritSecLock& ) throw(); - CCritSecLock& operator=( const CCritSecLock& ) throw(); -}; - -inline CCritSecLock::CCritSecLock( CRITICAL_SECTION& cs, bool bInitialLock ) : - m_cs( cs ), - m_bLocked( false ) -{ - if( bInitialLock ) - { - Lock(); - } -} - -inline CCritSecLock::~CCritSecLock() throw() -{ - if( m_bLocked ) - { - Unlock(); - } -} - -inline void CCritSecLock::Lock() -{ - ATLASSERT( !m_bLocked ); - __try - { - ::EnterCriticalSection( &m_cs ); - } - __except( STATUS_NO_MEMORY == GetExceptionCode() ) - { - AtlThrow( E_OUTOFMEMORY ); - } - m_bLocked = true; -} - -inline void CCritSecLock::Unlock() throw() -{ - ATLASSUME( m_bLocked ); - ::LeaveCriticalSection( &m_cs ); - m_bLocked = false; -} - -///////////////////////////////////////////////////////////////////////////// -// Interface debugging -#if defined(_ATL_DEBUG_INTERFACES) || defined(_ATL_DEBUG_QI) -HRESULT WINAPI AtlDumpIID(REFIID iid, LPCTSTR pszClassName, HRESULT hr) throw(); -#endif // _ATL_DEBUG_INTERFACES || _ATL_DEBUG_QI - -#ifdef _ATL_DEBUG_INTERFACES - -struct _QIThunk -{ - STDMETHOD(QueryInterface)(REFIID iid, void** pp) - { - ATLASSUME(m_dwRef >= 0); - ATLASSUME(m_pUnk != NULL); - return m_pUnk->QueryInterface(iid, pp); - } - STDMETHOD_(ULONG, AddRef)() - { - ATLASSUME(m_pUnk != NULL); - if (m_bBreak) - DebugBreak(); - m_pUnk->AddRef(); - return InternalAddRef(); - } - ULONG InternalAddRef() - { - ATLASSUME(m_pUnk != NULL); - if (m_bBreak) - DebugBreak(); - ATLASSUME(m_dwRef >= 0); - long l = InterlockedIncrement(&m_dwRef); - - TCHAR buf[512+1]; -#if _SECURE_ATL && !defined(_ATL_MIN_CRT) - _stprintf_s(buf, _countof(buf), _T("QIThunk - %-10d\tAddRef :\tObject = 0x%p\tRefcount = %d\t"), - m_nIndex, m_pUnk, m_dwRef); -#else -#pragma warning(push) -#pragma warning(disable:4995) // wsprintf is deprecated - wsprintf(buf, _T("QIThunk - %-10d\tAddRef :\tObject = 0x%p\tRefcount = %d\t"), m_nIndex, m_pUnk, m_dwRef); -#pragma warning(pop) -#endif - buf[_countof(buf)-1] = 0; - OutputDebugString(buf); - AtlDumpIID(m_iid, m_lpszClassName, S_OK); - - if (l > m_dwMaxRef) - m_dwMaxRef = l; - return l; - } - STDMETHOD_(ULONG, Release)(); - - STDMETHOD(f3)(); - STDMETHOD(f4)(); - STDMETHOD(f5)(); - STDMETHOD(f6)(); - STDMETHOD(f7)(); - STDMETHOD(f8)(); - STDMETHOD(f9)(); - STDMETHOD(f10)(); - STDMETHOD(f11)(); - STDMETHOD(f12)(); - STDMETHOD(f13)(); - STDMETHOD(f14)(); - STDMETHOD(f15)(); - STDMETHOD(f16)(); - STDMETHOD(f17)(); - STDMETHOD(f18)(); - STDMETHOD(f19)(); - STDMETHOD(f20)(); - STDMETHOD(f21)(); - STDMETHOD(f22)(); - STDMETHOD(f23)(); - STDMETHOD(f24)(); - STDMETHOD(f25)(); - STDMETHOD(f26)(); - STDMETHOD(f27)(); - STDMETHOD(f28)(); - STDMETHOD(f29)(); - STDMETHOD(f30)(); - STDMETHOD(f31)(); - STDMETHOD(f32)(); - STDMETHOD(f33)(); - STDMETHOD(f34)(); - STDMETHOD(f35)(); - STDMETHOD(f36)(); - STDMETHOD(f37)(); - STDMETHOD(f38)(); - STDMETHOD(f39)(); - STDMETHOD(f40)(); - STDMETHOD(f41)(); - STDMETHOD(f42)(); - STDMETHOD(f43)(); - STDMETHOD(f44)(); - STDMETHOD(f45)(); - STDMETHOD(f46)(); - STDMETHOD(f47)(); - STDMETHOD(f48)(); - STDMETHOD(f49)(); - STDMETHOD(f50)(); - STDMETHOD(f51)(); - STDMETHOD(f52)(); - STDMETHOD(f53)(); - STDMETHOD(f54)(); - STDMETHOD(f55)(); - STDMETHOD(f56)(); - STDMETHOD(f57)(); - STDMETHOD(f58)(); - STDMETHOD(f59)(); - STDMETHOD(f60)(); - STDMETHOD(f61)(); - STDMETHOD(f62)(); - STDMETHOD(f63)(); - STDMETHOD(f64)(); - STDMETHOD(f65)(); - STDMETHOD(f66)(); - STDMETHOD(f67)(); - STDMETHOD(f68)(); - STDMETHOD(f69)(); - STDMETHOD(f70)(); - STDMETHOD(f71)(); - STDMETHOD(f72)(); - STDMETHOD(f73)(); - STDMETHOD(f74)(); - STDMETHOD(f75)(); - STDMETHOD(f76)(); - STDMETHOD(f77)(); - STDMETHOD(f78)(); - STDMETHOD(f79)(); - STDMETHOD(f80)(); - STDMETHOD(f81)(); - STDMETHOD(f82)(); - STDMETHOD(f83)(); - STDMETHOD(f84)(); - STDMETHOD(f85)(); - STDMETHOD(f86)(); - STDMETHOD(f87)(); - STDMETHOD(f88)(); - STDMETHOD(f89)(); - STDMETHOD(f90)(); - STDMETHOD(f91)(); - STDMETHOD(f92)(); - STDMETHOD(f93)(); - STDMETHOD(f94)(); - STDMETHOD(f95)(); - STDMETHOD(f96)(); - STDMETHOD(f97)(); - STDMETHOD(f98)(); - STDMETHOD(f99)(); - STDMETHOD(f100)(); - STDMETHOD(f101)(); - STDMETHOD(f102)(); - STDMETHOD(f103)(); - STDMETHOD(f104)(); - STDMETHOD(f105)(); - STDMETHOD(f106)(); - STDMETHOD(f107)(); - STDMETHOD(f108)(); - STDMETHOD(f109)(); - STDMETHOD(f110)(); - STDMETHOD(f111)(); - STDMETHOD(f112)(); - STDMETHOD(f113)(); - STDMETHOD(f114)(); - STDMETHOD(f115)(); - STDMETHOD(f116)(); - STDMETHOD(f117)(); - STDMETHOD(f118)(); - STDMETHOD(f119)(); - STDMETHOD(f120)(); - STDMETHOD(f121)(); - STDMETHOD(f122)(); - STDMETHOD(f123)(); - STDMETHOD(f124)(); - STDMETHOD(f125)(); - STDMETHOD(f126)(); - STDMETHOD(f127)(); - STDMETHOD(f128)(); - STDMETHOD(f129)(); - STDMETHOD(f130)(); - STDMETHOD(f131)(); - STDMETHOD(f132)(); - STDMETHOD(f133)(); - STDMETHOD(f134)(); - STDMETHOD(f135)(); - STDMETHOD(f136)(); - STDMETHOD(f137)(); - STDMETHOD(f138)(); - STDMETHOD(f139)(); - STDMETHOD(f140)(); - STDMETHOD(f141)(); - STDMETHOD(f142)(); - STDMETHOD(f143)(); - STDMETHOD(f144)(); - STDMETHOD(f145)(); - STDMETHOD(f146)(); - STDMETHOD(f147)(); - STDMETHOD(f148)(); - STDMETHOD(f149)(); - STDMETHOD(f150)(); - STDMETHOD(f151)(); - STDMETHOD(f152)(); - STDMETHOD(f153)(); - STDMETHOD(f154)(); - STDMETHOD(f155)(); - STDMETHOD(f156)(); - STDMETHOD(f157)(); - STDMETHOD(f158)(); - STDMETHOD(f159)(); - STDMETHOD(f160)(); - STDMETHOD(f161)(); - STDMETHOD(f162)(); - STDMETHOD(f163)(); - STDMETHOD(f164)(); - STDMETHOD(f165)(); - STDMETHOD(f166)(); - STDMETHOD(f167)(); - STDMETHOD(f168)(); - STDMETHOD(f169)(); - STDMETHOD(f170)(); - STDMETHOD(f171)(); - STDMETHOD(f172)(); - STDMETHOD(f173)(); - STDMETHOD(f174)(); - STDMETHOD(f175)(); - STDMETHOD(f176)(); - STDMETHOD(f177)(); - STDMETHOD(f178)(); - STDMETHOD(f179)(); - STDMETHOD(f180)(); - STDMETHOD(f181)(); - STDMETHOD(f182)(); - STDMETHOD(f183)(); - STDMETHOD(f184)(); - STDMETHOD(f185)(); - STDMETHOD(f186)(); - STDMETHOD(f187)(); - STDMETHOD(f188)(); - STDMETHOD(f189)(); - STDMETHOD(f190)(); - STDMETHOD(f191)(); - STDMETHOD(f192)(); - STDMETHOD(f193)(); - STDMETHOD(f194)(); - STDMETHOD(f195)(); - STDMETHOD(f196)(); - STDMETHOD(f197)(); - STDMETHOD(f198)(); - STDMETHOD(f199)(); - STDMETHOD(f200)(); - STDMETHOD(f201)(); - STDMETHOD(f202)(); - STDMETHOD(f203)(); - STDMETHOD(f204)(); - STDMETHOD(f205)(); - STDMETHOD(f206)(); - STDMETHOD(f207)(); - STDMETHOD(f208)(); - STDMETHOD(f209)(); - STDMETHOD(f210)(); - STDMETHOD(f211)(); - STDMETHOD(f212)(); - STDMETHOD(f213)(); - STDMETHOD(f214)(); - STDMETHOD(f215)(); - STDMETHOD(f216)(); - STDMETHOD(f217)(); - STDMETHOD(f218)(); - STDMETHOD(f219)(); - STDMETHOD(f220)(); - STDMETHOD(f221)(); - STDMETHOD(f222)(); - STDMETHOD(f223)(); - STDMETHOD(f224)(); - STDMETHOD(f225)(); - STDMETHOD(f226)(); - STDMETHOD(f227)(); - STDMETHOD(f228)(); - STDMETHOD(f229)(); - STDMETHOD(f230)(); - STDMETHOD(f231)(); - STDMETHOD(f232)(); - STDMETHOD(f233)(); - STDMETHOD(f234)(); - STDMETHOD(f235)(); - STDMETHOD(f236)(); - STDMETHOD(f237)(); - STDMETHOD(f238)(); - STDMETHOD(f239)(); - STDMETHOD(f240)(); - STDMETHOD(f241)(); - STDMETHOD(f242)(); - STDMETHOD(f243)(); - STDMETHOD(f244)(); - STDMETHOD(f245)(); - STDMETHOD(f246)(); - STDMETHOD(f247)(); - STDMETHOD(f248)(); - STDMETHOD(f249)(); - STDMETHOD(f250)(); - STDMETHOD(f251)(); - STDMETHOD(f252)(); - STDMETHOD(f253)(); - STDMETHOD(f254)(); - STDMETHOD(f255)(); - STDMETHOD(f256)(); - STDMETHOD(f257)(); - STDMETHOD(f258)(); - STDMETHOD(f259)(); - STDMETHOD(f260)(); - STDMETHOD(f261)(); - STDMETHOD(f262)(); - STDMETHOD(f263)(); - STDMETHOD(f264)(); - STDMETHOD(f265)(); - STDMETHOD(f266)(); - STDMETHOD(f267)(); - STDMETHOD(f268)(); - STDMETHOD(f269)(); - STDMETHOD(f270)(); - STDMETHOD(f271)(); - STDMETHOD(f272)(); - STDMETHOD(f273)(); - STDMETHOD(f274)(); - STDMETHOD(f275)(); - STDMETHOD(f276)(); - STDMETHOD(f277)(); - STDMETHOD(f278)(); - STDMETHOD(f279)(); - STDMETHOD(f280)(); - STDMETHOD(f281)(); - STDMETHOD(f282)(); - STDMETHOD(f283)(); - STDMETHOD(f284)(); - STDMETHOD(f285)(); - STDMETHOD(f286)(); - STDMETHOD(f287)(); - STDMETHOD(f288)(); - STDMETHOD(f289)(); - STDMETHOD(f290)(); - STDMETHOD(f291)(); - STDMETHOD(f292)(); - STDMETHOD(f293)(); - STDMETHOD(f294)(); - STDMETHOD(f295)(); - STDMETHOD(f296)(); - STDMETHOD(f297)(); - STDMETHOD(f298)(); - STDMETHOD(f299)(); - STDMETHOD(f300)(); - STDMETHOD(f301)(); - STDMETHOD(f302)(); - STDMETHOD(f303)(); - STDMETHOD(f304)(); - STDMETHOD(f305)(); - STDMETHOD(f306)(); - STDMETHOD(f307)(); - STDMETHOD(f308)(); - STDMETHOD(f309)(); - STDMETHOD(f310)(); - STDMETHOD(f311)(); - STDMETHOD(f312)(); - STDMETHOD(f313)(); - STDMETHOD(f314)(); - STDMETHOD(f315)(); - STDMETHOD(f316)(); - STDMETHOD(f317)(); - STDMETHOD(f318)(); - STDMETHOD(f319)(); - STDMETHOD(f320)(); - STDMETHOD(f321)(); - STDMETHOD(f322)(); - STDMETHOD(f323)(); - STDMETHOD(f324)(); - STDMETHOD(f325)(); - STDMETHOD(f326)(); - STDMETHOD(f327)(); - STDMETHOD(f328)(); - STDMETHOD(f329)(); - STDMETHOD(f330)(); - STDMETHOD(f331)(); - STDMETHOD(f332)(); - STDMETHOD(f333)(); - STDMETHOD(f334)(); - STDMETHOD(f335)(); - STDMETHOD(f336)(); - STDMETHOD(f337)(); - STDMETHOD(f338)(); - STDMETHOD(f339)(); - STDMETHOD(f340)(); - STDMETHOD(f341)(); - STDMETHOD(f342)(); - STDMETHOD(f343)(); - STDMETHOD(f344)(); - STDMETHOD(f345)(); - STDMETHOD(f346)(); - STDMETHOD(f347)(); - STDMETHOD(f348)(); - STDMETHOD(f349)(); - STDMETHOD(f350)(); - STDMETHOD(f351)(); - STDMETHOD(f352)(); - STDMETHOD(f353)(); - STDMETHOD(f354)(); - STDMETHOD(f355)(); - STDMETHOD(f356)(); - STDMETHOD(f357)(); - STDMETHOD(f358)(); - STDMETHOD(f359)(); - STDMETHOD(f360)(); - STDMETHOD(f361)(); - STDMETHOD(f362)(); - STDMETHOD(f363)(); - STDMETHOD(f364)(); - STDMETHOD(f365)(); - STDMETHOD(f366)(); - STDMETHOD(f367)(); - STDMETHOD(f368)(); - STDMETHOD(f369)(); - STDMETHOD(f370)(); - STDMETHOD(f371)(); - STDMETHOD(f372)(); - STDMETHOD(f373)(); - STDMETHOD(f374)(); - STDMETHOD(f375)(); - STDMETHOD(f376)(); - STDMETHOD(f377)(); - STDMETHOD(f378)(); - STDMETHOD(f379)(); - STDMETHOD(f380)(); - STDMETHOD(f381)(); - STDMETHOD(f382)(); - STDMETHOD(f383)(); - STDMETHOD(f384)(); - STDMETHOD(f385)(); - STDMETHOD(f386)(); - STDMETHOD(f387)(); - STDMETHOD(f388)(); - STDMETHOD(f389)(); - STDMETHOD(f390)(); - STDMETHOD(f391)(); - STDMETHOD(f392)(); - STDMETHOD(f393)(); - STDMETHOD(f394)(); - STDMETHOD(f395)(); - STDMETHOD(f396)(); - STDMETHOD(f397)(); - STDMETHOD(f398)(); - STDMETHOD(f399)(); - STDMETHOD(f400)(); - STDMETHOD(f401)(); - STDMETHOD(f402)(); - STDMETHOD(f403)(); - STDMETHOD(f404)(); - STDMETHOD(f405)(); - STDMETHOD(f406)(); - STDMETHOD(f407)(); - STDMETHOD(f408)(); - STDMETHOD(f409)(); - STDMETHOD(f410)(); - STDMETHOD(f411)(); - STDMETHOD(f412)(); - STDMETHOD(f413)(); - STDMETHOD(f414)(); - STDMETHOD(f415)(); - STDMETHOD(f416)(); - STDMETHOD(f417)(); - STDMETHOD(f418)(); - STDMETHOD(f419)(); - STDMETHOD(f420)(); - STDMETHOD(f421)(); - STDMETHOD(f422)(); - STDMETHOD(f423)(); - STDMETHOD(f424)(); - STDMETHOD(f425)(); - STDMETHOD(f426)(); - STDMETHOD(f427)(); - STDMETHOD(f428)(); - STDMETHOD(f429)(); - STDMETHOD(f430)(); - STDMETHOD(f431)(); - STDMETHOD(f432)(); - STDMETHOD(f433)(); - STDMETHOD(f434)(); - STDMETHOD(f435)(); - STDMETHOD(f436)(); - STDMETHOD(f437)(); - STDMETHOD(f438)(); - STDMETHOD(f439)(); - STDMETHOD(f440)(); - STDMETHOD(f441)(); - STDMETHOD(f442)(); - STDMETHOD(f443)(); - STDMETHOD(f444)(); - STDMETHOD(f445)(); - STDMETHOD(f446)(); - STDMETHOD(f447)(); - STDMETHOD(f448)(); - STDMETHOD(f449)(); - STDMETHOD(f450)(); - STDMETHOD(f451)(); - STDMETHOD(f452)(); - STDMETHOD(f453)(); - STDMETHOD(f454)(); - STDMETHOD(f455)(); - STDMETHOD(f456)(); - STDMETHOD(f457)(); - STDMETHOD(f458)(); - STDMETHOD(f459)(); - STDMETHOD(f460)(); - STDMETHOD(f461)(); - STDMETHOD(f462)(); - STDMETHOD(f463)(); - STDMETHOD(f464)(); - STDMETHOD(f465)(); - STDMETHOD(f466)(); - STDMETHOD(f467)(); - STDMETHOD(f468)(); - STDMETHOD(f469)(); - STDMETHOD(f470)(); - STDMETHOD(f471)(); - STDMETHOD(f472)(); - STDMETHOD(f473)(); - STDMETHOD(f474)(); - STDMETHOD(f475)(); - STDMETHOD(f476)(); - STDMETHOD(f477)(); - STDMETHOD(f478)(); - STDMETHOD(f479)(); - STDMETHOD(f480)(); - STDMETHOD(f481)(); - STDMETHOD(f482)(); - STDMETHOD(f483)(); - STDMETHOD(f484)(); - STDMETHOD(f485)(); - STDMETHOD(f486)(); - STDMETHOD(f487)(); - STDMETHOD(f488)(); - STDMETHOD(f489)(); - STDMETHOD(f490)(); - STDMETHOD(f491)(); - STDMETHOD(f492)(); - STDMETHOD(f493)(); - STDMETHOD(f494)(); - STDMETHOD(f495)(); - STDMETHOD(f496)(); - STDMETHOD(f497)(); - STDMETHOD(f498)(); - STDMETHOD(f499)(); - STDMETHOD(f500)(); - STDMETHOD(f501)(); - STDMETHOD(f502)(); - STDMETHOD(f503)(); - STDMETHOD(f504)(); - STDMETHOD(f505)(); - STDMETHOD(f506)(); - STDMETHOD(f507)(); - STDMETHOD(f508)(); - STDMETHOD(f509)(); - STDMETHOD(f510)(); - STDMETHOD(f511)(); - STDMETHOD(f512)(); - STDMETHOD(f513)(); - STDMETHOD(f514)(); - STDMETHOD(f515)(); - STDMETHOD(f516)(); - STDMETHOD(f517)(); - STDMETHOD(f518)(); - STDMETHOD(f519)(); - STDMETHOD(f520)(); - STDMETHOD(f521)(); - STDMETHOD(f522)(); - STDMETHOD(f523)(); - STDMETHOD(f524)(); - STDMETHOD(f525)(); - STDMETHOD(f526)(); - STDMETHOD(f527)(); - STDMETHOD(f528)(); - STDMETHOD(f529)(); - STDMETHOD(f530)(); - STDMETHOD(f531)(); - STDMETHOD(f532)(); - STDMETHOD(f533)(); - STDMETHOD(f534)(); - STDMETHOD(f535)(); - STDMETHOD(f536)(); - STDMETHOD(f537)(); - STDMETHOD(f538)(); - STDMETHOD(f539)(); - STDMETHOD(f540)(); - STDMETHOD(f541)(); - STDMETHOD(f542)(); - STDMETHOD(f543)(); - STDMETHOD(f544)(); - STDMETHOD(f545)(); - STDMETHOD(f546)(); - STDMETHOD(f547)(); - STDMETHOD(f548)(); - STDMETHOD(f549)(); - STDMETHOD(f550)(); - STDMETHOD(f551)(); - STDMETHOD(f552)(); - STDMETHOD(f553)(); - STDMETHOD(f554)(); - STDMETHOD(f555)(); - STDMETHOD(f556)(); - STDMETHOD(f557)(); - STDMETHOD(f558)(); - STDMETHOD(f559)(); - STDMETHOD(f560)(); - STDMETHOD(f561)(); - STDMETHOD(f562)(); - STDMETHOD(f563)(); - STDMETHOD(f564)(); - STDMETHOD(f565)(); - STDMETHOD(f566)(); - STDMETHOD(f567)(); - STDMETHOD(f568)(); - STDMETHOD(f569)(); - STDMETHOD(f570)(); - STDMETHOD(f571)(); - STDMETHOD(f572)(); - STDMETHOD(f573)(); - STDMETHOD(f574)(); - STDMETHOD(f575)(); - STDMETHOD(f576)(); - STDMETHOD(f577)(); - STDMETHOD(f578)(); - STDMETHOD(f579)(); - STDMETHOD(f580)(); - STDMETHOD(f581)(); - STDMETHOD(f582)(); - STDMETHOD(f583)(); - STDMETHOD(f584)(); - STDMETHOD(f585)(); - STDMETHOD(f586)(); - STDMETHOD(f587)(); - STDMETHOD(f588)(); - STDMETHOD(f589)(); - STDMETHOD(f590)(); - STDMETHOD(f591)(); - STDMETHOD(f592)(); - STDMETHOD(f593)(); - STDMETHOD(f594)(); - STDMETHOD(f595)(); - STDMETHOD(f596)(); - STDMETHOD(f597)(); - STDMETHOD(f598)(); - STDMETHOD(f599)(); - STDMETHOD(f600)(); - STDMETHOD(f601)(); - STDMETHOD(f602)(); - STDMETHOD(f603)(); - STDMETHOD(f604)(); - STDMETHOD(f605)(); - STDMETHOD(f606)(); - STDMETHOD(f607)(); - STDMETHOD(f608)(); - STDMETHOD(f609)(); - STDMETHOD(f610)(); - STDMETHOD(f611)(); - STDMETHOD(f612)(); - STDMETHOD(f613)(); - STDMETHOD(f614)(); - STDMETHOD(f615)(); - STDMETHOD(f616)(); - STDMETHOD(f617)(); - STDMETHOD(f618)(); - STDMETHOD(f619)(); - STDMETHOD(f620)(); - STDMETHOD(f621)(); - STDMETHOD(f622)(); - STDMETHOD(f623)(); - STDMETHOD(f624)(); - STDMETHOD(f625)(); - STDMETHOD(f626)(); - STDMETHOD(f627)(); - STDMETHOD(f628)(); - STDMETHOD(f629)(); - STDMETHOD(f630)(); - STDMETHOD(f631)(); - STDMETHOD(f632)(); - STDMETHOD(f633)(); - STDMETHOD(f634)(); - STDMETHOD(f635)(); - STDMETHOD(f636)(); - STDMETHOD(f637)(); - STDMETHOD(f638)(); - STDMETHOD(f639)(); - STDMETHOD(f640)(); - STDMETHOD(f641)(); - STDMETHOD(f642)(); - STDMETHOD(f643)(); - STDMETHOD(f644)(); - STDMETHOD(f645)(); - STDMETHOD(f646)(); - STDMETHOD(f647)(); - STDMETHOD(f648)(); - STDMETHOD(f649)(); - STDMETHOD(f650)(); - STDMETHOD(f651)(); - STDMETHOD(f652)(); - STDMETHOD(f653)(); - STDMETHOD(f654)(); - STDMETHOD(f655)(); - STDMETHOD(f656)(); - STDMETHOD(f657)(); - STDMETHOD(f658)(); - STDMETHOD(f659)(); - STDMETHOD(f660)(); - STDMETHOD(f661)(); - STDMETHOD(f662)(); - STDMETHOD(f663)(); - STDMETHOD(f664)(); - STDMETHOD(f665)(); - STDMETHOD(f666)(); - STDMETHOD(f667)(); - STDMETHOD(f668)(); - STDMETHOD(f669)(); - STDMETHOD(f670)(); - STDMETHOD(f671)(); - STDMETHOD(f672)(); - STDMETHOD(f673)(); - STDMETHOD(f674)(); - STDMETHOD(f675)(); - STDMETHOD(f676)(); - STDMETHOD(f677)(); - STDMETHOD(f678)(); - STDMETHOD(f679)(); - STDMETHOD(f680)(); - STDMETHOD(f681)(); - STDMETHOD(f682)(); - STDMETHOD(f683)(); - STDMETHOD(f684)(); - STDMETHOD(f685)(); - STDMETHOD(f686)(); - STDMETHOD(f687)(); - STDMETHOD(f688)(); - STDMETHOD(f689)(); - STDMETHOD(f690)(); - STDMETHOD(f691)(); - STDMETHOD(f692)(); - STDMETHOD(f693)(); - STDMETHOD(f694)(); - STDMETHOD(f695)(); - STDMETHOD(f696)(); - STDMETHOD(f697)(); - STDMETHOD(f698)(); - STDMETHOD(f699)(); - STDMETHOD(f700)(); - STDMETHOD(f701)(); - STDMETHOD(f702)(); - STDMETHOD(f703)(); - STDMETHOD(f704)(); - STDMETHOD(f705)(); - STDMETHOD(f706)(); - STDMETHOD(f707)(); - STDMETHOD(f708)(); - STDMETHOD(f709)(); - STDMETHOD(f710)(); - STDMETHOD(f711)(); - STDMETHOD(f712)(); - STDMETHOD(f713)(); - STDMETHOD(f714)(); - STDMETHOD(f715)(); - STDMETHOD(f716)(); - STDMETHOD(f717)(); - STDMETHOD(f718)(); - STDMETHOD(f719)(); - STDMETHOD(f720)(); - STDMETHOD(f721)(); - STDMETHOD(f722)(); - STDMETHOD(f723)(); - STDMETHOD(f724)(); - STDMETHOD(f725)(); - STDMETHOD(f726)(); - STDMETHOD(f727)(); - STDMETHOD(f728)(); - STDMETHOD(f729)(); - STDMETHOD(f730)(); - STDMETHOD(f731)(); - STDMETHOD(f732)(); - STDMETHOD(f733)(); - STDMETHOD(f734)(); - STDMETHOD(f735)(); - STDMETHOD(f736)(); - STDMETHOD(f737)(); - STDMETHOD(f738)(); - STDMETHOD(f739)(); - STDMETHOD(f740)(); - STDMETHOD(f741)(); - STDMETHOD(f742)(); - STDMETHOD(f743)(); - STDMETHOD(f744)(); - STDMETHOD(f745)(); - STDMETHOD(f746)(); - STDMETHOD(f747)(); - STDMETHOD(f748)(); - STDMETHOD(f749)(); - STDMETHOD(f750)(); - STDMETHOD(f751)(); - STDMETHOD(f752)(); - STDMETHOD(f753)(); - STDMETHOD(f754)(); - STDMETHOD(f755)(); - STDMETHOD(f756)(); - STDMETHOD(f757)(); - STDMETHOD(f758)(); - STDMETHOD(f759)(); - STDMETHOD(f760)(); - STDMETHOD(f761)(); - STDMETHOD(f762)(); - STDMETHOD(f763)(); - STDMETHOD(f764)(); - STDMETHOD(f765)(); - STDMETHOD(f766)(); - STDMETHOD(f767)(); - STDMETHOD(f768)(); - STDMETHOD(f769)(); - STDMETHOD(f770)(); - STDMETHOD(f771)(); - STDMETHOD(f772)(); - STDMETHOD(f773)(); - STDMETHOD(f774)(); - STDMETHOD(f775)(); - STDMETHOD(f776)(); - STDMETHOD(f777)(); - STDMETHOD(f778)(); - STDMETHOD(f779)(); - STDMETHOD(f780)(); - STDMETHOD(f781)(); - STDMETHOD(f782)(); - STDMETHOD(f783)(); - STDMETHOD(f784)(); - STDMETHOD(f785)(); - STDMETHOD(f786)(); - STDMETHOD(f787)(); - STDMETHOD(f788)(); - STDMETHOD(f789)(); - STDMETHOD(f790)(); - STDMETHOD(f791)(); - STDMETHOD(f792)(); - STDMETHOD(f793)(); - STDMETHOD(f794)(); - STDMETHOD(f795)(); - STDMETHOD(f796)(); - STDMETHOD(f797)(); - STDMETHOD(f798)(); - STDMETHOD(f799)(); - STDMETHOD(f800)(); - STDMETHOD(f801)(); - STDMETHOD(f802)(); - STDMETHOD(f803)(); - STDMETHOD(f804)(); - STDMETHOD(f805)(); - STDMETHOD(f806)(); - STDMETHOD(f807)(); - STDMETHOD(f808)(); - STDMETHOD(f809)(); - STDMETHOD(f810)(); - STDMETHOD(f811)(); - STDMETHOD(f812)(); - STDMETHOD(f813)(); - STDMETHOD(f814)(); - STDMETHOD(f815)(); - STDMETHOD(f816)(); - STDMETHOD(f817)(); - STDMETHOD(f818)(); - STDMETHOD(f819)(); - STDMETHOD(f820)(); - STDMETHOD(f821)(); - STDMETHOD(f822)(); - STDMETHOD(f823)(); - STDMETHOD(f824)(); - STDMETHOD(f825)(); - STDMETHOD(f826)(); - STDMETHOD(f827)(); - STDMETHOD(f828)(); - STDMETHOD(f829)(); - STDMETHOD(f830)(); - STDMETHOD(f831)(); - STDMETHOD(f832)(); - STDMETHOD(f833)(); - STDMETHOD(f834)(); - STDMETHOD(f835)(); - STDMETHOD(f836)(); - STDMETHOD(f837)(); - STDMETHOD(f838)(); - STDMETHOD(f839)(); - STDMETHOD(f840)(); - STDMETHOD(f841)(); - STDMETHOD(f842)(); - STDMETHOD(f843)(); - STDMETHOD(f844)(); - STDMETHOD(f845)(); - STDMETHOD(f846)(); - STDMETHOD(f847)(); - STDMETHOD(f848)(); - STDMETHOD(f849)(); - STDMETHOD(f850)(); - STDMETHOD(f851)(); - STDMETHOD(f852)(); - STDMETHOD(f853)(); - STDMETHOD(f854)(); - STDMETHOD(f855)(); - STDMETHOD(f856)(); - STDMETHOD(f857)(); - STDMETHOD(f858)(); - STDMETHOD(f859)(); - STDMETHOD(f860)(); - STDMETHOD(f861)(); - STDMETHOD(f862)(); - STDMETHOD(f863)(); - STDMETHOD(f864)(); - STDMETHOD(f865)(); - STDMETHOD(f866)(); - STDMETHOD(f867)(); - STDMETHOD(f868)(); - STDMETHOD(f869)(); - STDMETHOD(f870)(); - STDMETHOD(f871)(); - STDMETHOD(f872)(); - STDMETHOD(f873)(); - STDMETHOD(f874)(); - STDMETHOD(f875)(); - STDMETHOD(f876)(); - STDMETHOD(f877)(); - STDMETHOD(f878)(); - STDMETHOD(f879)(); - STDMETHOD(f880)(); - STDMETHOD(f881)(); - STDMETHOD(f882)(); - STDMETHOD(f883)(); - STDMETHOD(f884)(); - STDMETHOD(f885)(); - STDMETHOD(f886)(); - STDMETHOD(f887)(); - STDMETHOD(f888)(); - STDMETHOD(f889)(); - STDMETHOD(f890)(); - STDMETHOD(f891)(); - STDMETHOD(f892)(); - STDMETHOD(f893)(); - STDMETHOD(f894)(); - STDMETHOD(f895)(); - STDMETHOD(f896)(); - STDMETHOD(f897)(); - STDMETHOD(f898)(); - STDMETHOD(f899)(); - STDMETHOD(f900)(); - STDMETHOD(f901)(); - STDMETHOD(f902)(); - STDMETHOD(f903)(); - STDMETHOD(f904)(); - STDMETHOD(f905)(); - STDMETHOD(f906)(); - STDMETHOD(f907)(); - STDMETHOD(f908)(); - STDMETHOD(f909)(); - STDMETHOD(f910)(); - STDMETHOD(f911)(); - STDMETHOD(f912)(); - STDMETHOD(f913)(); - STDMETHOD(f914)(); - STDMETHOD(f915)(); - STDMETHOD(f916)(); - STDMETHOD(f917)(); - STDMETHOD(f918)(); - STDMETHOD(f919)(); - STDMETHOD(f920)(); - STDMETHOD(f921)(); - STDMETHOD(f922)(); - STDMETHOD(f923)(); - STDMETHOD(f924)(); - STDMETHOD(f925)(); - STDMETHOD(f926)(); - STDMETHOD(f927)(); - STDMETHOD(f928)(); - STDMETHOD(f929)(); - STDMETHOD(f930)(); - STDMETHOD(f931)(); - STDMETHOD(f932)(); - STDMETHOD(f933)(); - STDMETHOD(f934)(); - STDMETHOD(f935)(); - STDMETHOD(f936)(); - STDMETHOD(f937)(); - STDMETHOD(f938)(); - STDMETHOD(f939)(); - STDMETHOD(f940)(); - STDMETHOD(f941)(); - STDMETHOD(f942)(); - STDMETHOD(f943)(); - STDMETHOD(f944)(); - STDMETHOD(f945)(); - STDMETHOD(f946)(); - STDMETHOD(f947)(); - STDMETHOD(f948)(); - STDMETHOD(f949)(); - STDMETHOD(f950)(); - STDMETHOD(f951)(); - STDMETHOD(f952)(); - STDMETHOD(f953)(); - STDMETHOD(f954)(); - STDMETHOD(f955)(); - STDMETHOD(f956)(); - STDMETHOD(f957)(); - STDMETHOD(f958)(); - STDMETHOD(f959)(); - STDMETHOD(f960)(); - STDMETHOD(f961)(); - STDMETHOD(f962)(); - STDMETHOD(f963)(); - STDMETHOD(f964)(); - STDMETHOD(f965)(); - STDMETHOD(f966)(); - STDMETHOD(f967)(); - STDMETHOD(f968)(); - STDMETHOD(f969)(); - STDMETHOD(f970)(); - STDMETHOD(f971)(); - STDMETHOD(f972)(); - STDMETHOD(f973)(); - STDMETHOD(f974)(); - STDMETHOD(f975)(); - STDMETHOD(f976)(); - STDMETHOD(f977)(); - STDMETHOD(f978)(); - STDMETHOD(f979)(); - STDMETHOD(f980)(); - STDMETHOD(f981)(); - STDMETHOD(f982)(); - STDMETHOD(f983)(); - STDMETHOD(f984)(); - STDMETHOD(f985)(); - STDMETHOD(f986)(); - STDMETHOD(f987)(); - STDMETHOD(f988)(); - STDMETHOD(f989)(); - STDMETHOD(f990)(); - STDMETHOD(f991)(); - STDMETHOD(f992)(); - STDMETHOD(f993)(); - STDMETHOD(f994)(); - STDMETHOD(f995)(); - STDMETHOD(f996)(); - STDMETHOD(f997)(); - STDMETHOD(f998)(); - STDMETHOD(f999)(); - STDMETHOD(f1000)(); - STDMETHOD(f1001)(); - STDMETHOD(f1002)(); - STDMETHOD(f1003)(); - STDMETHOD(f1004)(); - STDMETHOD(f1005)(); - STDMETHOD(f1006)(); - STDMETHOD(f1007)(); - STDMETHOD(f1008)(); - STDMETHOD(f1009)(); - STDMETHOD(f1010)(); - STDMETHOD(f1011)(); - STDMETHOD(f1012)(); - STDMETHOD(f1013)(); - STDMETHOD(f1014)(); - STDMETHOD(f1015)(); - STDMETHOD(f1016)(); - STDMETHOD(f1017)(); - STDMETHOD(f1018)(); - STDMETHOD(f1019)(); - STDMETHOD(f1020)(); - STDMETHOD(f1021)(); - STDMETHOD(f1022)(); - STDMETHOD(f1023)(); - _QIThunk(IUnknown* pOrig, LPCTSTR p, const IID& i, UINT n, bool b) - { - m_lpszClassName = p; - m_iid = i; - m_nIndex = n; - m_dwRef = 0; - m_dwMaxRef = 0; - ATLENSURE(pOrig); - m_pUnk = pOrig; - m_bBreak = b; - m_bNonAddRefThunk = false; - } - IUnknown* m_pUnk; - long m_dwRef; - long m_dwMaxRef; - LPCTSTR m_lpszClassName; - IID m_iid; - UINT m_nIndex; - bool m_bBreak; - bool m_bNonAddRefThunk; - void Dump() throw(); -}; - -#endif - -///////////////////////////////////////////////////////////////////////////// -// Module Classes - - -#ifdef _ATL_STATIC_REGISTRY -#define UpdateRegistryFromResource UpdateRegistryFromResourceS -#else -#define UpdateRegistryFromResource UpdateRegistryFromResourceD -#endif // _ATL_STATIC_REGISTRY - - -class CAtlComModule : public _ATL_COM_MODULE -{ -public: - - CAtlComModule() throw() - { - cbSize = 0; - - m_hInstTypeLib = reinterpret_cast(&__ImageBase); - - m_ppAutoObjMapFirst = &__pobjMapEntryFirst + 1; - m_ppAutoObjMapLast = &__pobjMapEntryLast; - - if (FAILED(m_csObjMap.Init())) - { - ATLTRACE(atlTraceCOM, 0, _T("ERROR : Unable to initialize critical section in CAtlComModule\n")); - ATLASSERT(0); - CAtlBaseModule::m_bInitFailed = true; - return; - } - // Set cbSize on success. - cbSize = sizeof(_ATL_COM_MODULE); - } - - ~CAtlComModule() - { - Term(); - } - - // Called from ~CAtlComModule or from ~CAtlExeModule. - void Term() - { - if (cbSize == 0) - return; - - for (_ATL_OBJMAP_ENTRY** ppEntry = m_ppAutoObjMapFirst; ppEntry < m_ppAutoObjMapLast; ppEntry++) - { - if (*ppEntry != NULL) - { - _ATL_OBJMAP_ENTRY* pEntry = *ppEntry; - if (pEntry->pCF != NULL) - pEntry->pCF->Release(); - pEntry->pCF = NULL; - } - } - m_csObjMap.Term(); - // Set to 0 to indicate that this function has been called - // At this point no one should be concerned about cbsize - // having the correct value - cbSize = 0; - } - - // Registry support (helpers) - HRESULT RegisterTypeLib() - { - return AtlRegisterTypeLib(m_hInstTypeLib, NULL); - } - HRESULT RegisterTypeLib(LPCTSTR lpszIndex) - { - USES_CONVERSION_EX; - LPCOLESTR pwszTemp = NULL; - if( lpszIndex != NULL ) - { - pwszTemp = T2COLE_EX(lpszIndex, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if( pwszTemp == NULL ) - return E_OUTOFMEMORY; -#endif - } - return AtlRegisterTypeLib(m_hInstTypeLib, pwszTemp); - } - HRESULT UnRegisterTypeLib() - { - return AtlUnRegisterTypeLib(m_hInstTypeLib, NULL); - } - HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex) - { - USES_CONVERSION_EX; - LPCOLESTR pwszTemp = NULL; - if( lpszIndex != NULL ) - { - pwszTemp = T2COLE_EX(lpszIndex, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if( pwszTemp == NULL ) - return E_OUTOFMEMORY; -#endif - } - return AtlUnRegisterTypeLib(m_hInstTypeLib, pwszTemp); - } - - // RegisterServer walks the ATL Autogenerated object map and registers each object in the map - // If pCLSID is not NULL then only the object referred to by pCLSID is registered (The default case) - // otherwise all the objects are registered - HRESULT RegisterServer(BOOL bRegTypeLib = FALSE, const CLSID* pCLSID = NULL) - { - return AtlComModuleRegisterServer(this, bRegTypeLib, pCLSID); - } - - // UnregisterServer walks the ATL Autogenerated object map and unregisters each object in the map - // If pCLSID is not NULL then only the object referred to by pCLSID is unregistered (The default case) - // otherwise all the objects are unregistered. - HRESULT UnregisterServer(BOOL bRegTypeLib = FALSE, const CLSID* pCLSID = NULL) - { - return AtlComModuleUnregisterServer(this, bRegTypeLib, pCLSID); - } - - // Implementation - - // Call ObjectMain for all the objects. - void ExecuteObjectMain(bool bStarting) - { - for (_ATL_OBJMAP_ENTRY** ppEntry = m_ppAutoObjMapFirst; ppEntry < m_ppAutoObjMapLast; ppEntry++) - { - if (*ppEntry != NULL) - (*ppEntry)->pfnObjectMain(bStarting); - } - } -}; - -extern CAtlComModule _AtlComModule; - -#ifdef _ATL_DEBUG_INTERFACES - -class CAtlDebugInterfacesModule -{ -public: - CAtlDebugInterfacesModule() throw() : - m_nIndexQI( 0 ), - m_nIndexBreakAt( 0 ) - { - if (FAILED(m_cs.Init())) - { - ATLTRACE(atlTraceCOM, 0, _T("ERROR : Unable to initialize critical section in CAtlDebugInterfacesModule\n")); - ATLASSERT(0); - CAtlBaseModule::m_bInitFailed = true; - } - } - ~CAtlDebugInterfacesModule() throw() - { - // Release all class factories. - _AtlComModule.Term(); - DumpLeakedThunks(); - } - - HRESULT AddThunk(IUnknown** pp, LPCTSTR lpsz, REFIID iid) throw() - { - if ((pp == NULL) || (*pp == NULL)) - return E_POINTER; - IUnknown* p = *pp; - _QIThunk* pThunk = NULL; - CComCritSecLock lock(m_cs, false); - HRESULT hr = lock.Lock(); - if (FAILED(hr)) - { - ATLTRACE(atlTraceCOM, 0, _T("ERROR : Unable to lock critical section in CAtlDebugInterfacesModule\n")); - ATLASSERT(0); - return hr; - } - - // Check if exists for identity - if (InlineIsEqualUnknown(iid)) - { - for (int i = 0; i < m_aThunks.GetSize(); i++) - { - if (m_aThunks[i]->m_pUnk == p && InlineIsEqualGUID(m_aThunks[i]->m_iid, iid)) - { - m_aThunks[i]->InternalAddRef(); - pThunk = m_aThunks[i]; - break; - } - } - } - if (pThunk == NULL) - { - ++m_nIndexQI; - if (m_nIndexBreakAt == m_nIndexQI) - DebugBreak(); - ATLTRY(pThunk = new _QIThunk(p, lpsz, iid, m_nIndexQI, (m_nIndexBreakAt == m_nIndexQI))); - if (pThunk == NULL) - { - return E_OUTOFMEMORY; - } - pThunk->InternalAddRef(); - m_aThunks.Add(pThunk); - } - *pp = (IUnknown*)pThunk; - return S_OK; - } - HRESULT AddNonAddRefThunk(IUnknown* p, LPCTSTR lpsz, IUnknown** ppThunkRet) throw() - { - if (ppThunkRet == NULL) - return E_POINTER; - *ppThunkRet = NULL; - - _QIThunk* pThunk = NULL; - CComCritSecLock lock(m_cs, false); - HRESULT hr = lock.Lock(); - if (FAILED(hr)) - { - ATLTRACE(atlTraceCOM, 0, _T("ERROR : Unable to lock critical section in CAtlDebugInterfacesModule\n")); - ATLASSERT(0); - return hr; - } - - // Check if exists already for identity - for (int i = 0; i < m_aThunks.GetSize(); i++) - { - if (m_aThunks[i]->m_pUnk == p) - { - m_aThunks[i]->m_bNonAddRefThunk = true; - pThunk = m_aThunks[i]; - break; - } - } - if (pThunk == NULL) - { - ++m_nIndexQI; - if (m_nIndexBreakAt == m_nIndexQI) - DebugBreak(); - ATLTRY(pThunk = new _QIThunk(p, lpsz, __uuidof(IUnknown), m_nIndexQI, (m_nIndexBreakAt == m_nIndexQI))); - if (pThunk == NULL) - { - return E_OUTOFMEMORY; - } - pThunk->m_bNonAddRefThunk = true; - m_aThunks.Add(pThunk); - } - *ppThunkRet = (IUnknown*)pThunk; - return S_OK;; - } - void DeleteNonAddRefThunk(IUnknown* pUnk) throw() - { - CComCritSecLock lock(m_cs, false); - HRESULT hr = lock.Lock(); - if (FAILED(hr)) - { - ATLTRACE(atlTraceCOM, 0, _T("ERROR : Unable to lock critical section in CAtlDebugInterfacesModule\n")); - ATLASSERT(0); - return; - } - - for (int i = 0; i < m_aThunks.GetSize(); i++) - { - if (m_aThunks[i]->m_bNonAddRefThunk && m_aThunks[i]->m_pUnk == pUnk) - { - delete m_aThunks[i]; - m_aThunks.RemoveAt(i); - break; - } - } - } - void DeleteThunk(_QIThunk* p) throw() - { - CComCritSecLock lock(m_cs, false); - HRESULT hr = lock.Lock(); - if (FAILED(hr)) - { - ATLTRACE(atlTraceCOM, 0, _T("ERROR : Unable to lock critical section in CAtlDebugInterfacesModule\n")); - ATLASSERT(0); - return; - } - - int nIndex = m_aThunks.Find(p); - if (nIndex != -1) - { - m_aThunks[nIndex]->m_pUnk = NULL; - delete m_aThunks[nIndex]; - m_aThunks.RemoveAt(nIndex); - } - } - bool DumpLeakedThunks() - { - bool b = false; - for (int i = 0; i < m_aThunks.GetSize(); i++) - { - b = true; - m_aThunks[i]->Dump(); - delete m_aThunks[i]; - } - m_aThunks.RemoveAll(); - return b; - } - -public: - UINT m_nIndexQI; - UINT m_nIndexBreakAt; - CSimpleArray<_QIThunk*> m_aThunks; - CComAutoDeleteCriticalSection m_cs; -}; - -extern CAtlDebugInterfacesModule _AtlDebugInterfacesModule; - -#ifndef _ATL_STATIC_LIB_IMPL -// Should not be pulled into the static lib -__declspec (selectany) CAtlDebugInterfacesModule _AtlDebugInterfacesModule; -#endif - -inline ULONG _QIThunk::Release() -{ - ATLASSUME(m_pUnk != NULL); - if (m_bBreak) - DebugBreak(); - ATLASSUME(m_dwRef > 0); - - // save copies of member variables we wish to use after the InterlockedDecrement - UINT nIndex = m_nIndex; - IUnknown* pUnk = m_pUnk; - IID iid = m_iid; - LPCTSTR lpszClassName = m_lpszClassName; - bool bNonAddRefThunk = m_bNonAddRefThunk; - - ULONG l = InterlockedDecrement(&m_dwRef); - - TCHAR buf[512+1]; -#if _SECURE_ATL && !defined(_ATL_MIN_CRT) - _stprintf_s(buf, _countof(buf), _T("QIThunk - %-10d\tRelease :\tObject = 0x%p\tRefcount = %d\t"), nIndex, pUnk, l); -#else -#pragma warning(push) -#pragma warning(disable:4995) // wsprintf is deprecated - wsprintf(buf, _T("QIThunk - %-10d\tRelease :\tObject = 0x%p\tRefcount = %d\t"), nIndex, pUnk, l); -#pragma warning(pop) -#endif - buf[_countof(buf)-1] = 0; - OutputDebugString(buf); - AtlDumpIID(iid, lpszClassName, S_OK); - - bool bDeleteThunk = (l == 0 && !bNonAddRefThunk); - pUnk->Release(); - if (bDeleteThunk) - _AtlDebugInterfacesModule.DeleteThunk(this); - return l; -} - -#endif // _ATL_DEBUG_INTERFACES - - -class CAtlWinModule : public _ATL_WIN_MODULE -{ -public: - CAtlWinModule() - { - cbSize = sizeof(_ATL_WIN_MODULE); - HRESULT hr = AtlWinModuleInit(this); - if (FAILED(hr)) - { - ATLASSERT(0); - CAtlBaseModule::m_bInitFailed = true; - cbSize = 0; - return; - } - } - - ~CAtlWinModule() - { - Term(); - } - - void Term() - { - AtlWinModuleTerm(this, _AtlBaseModule.GetModuleInstance()); - } - - void AddCreateWndData(_AtlCreateWndData* pData, void* pObject) - { - AtlWinModuleAddCreateWndData(this, pData, pObject); - } - - void* ExtractCreateWndData() - { - return AtlWinModuleExtractCreateWndData(this); - } -}; - -extern CAtlWinModule _AtlWinModule; - -class CAtlModule; -__declspec(selectany) CAtlModule* _pAtlModule = NULL; - -#if defined(_M_CEE) && !defined(_ATL_MIXED) - -// This small class takes care of releasing the class factories at managed -// shutdown when we are compiling /clr. We can't wait to call _AtlComModule.Term() -// in _AtlComModule destructor, since _AtlComModule is a native global object, and it -// will be destructed after the managed runtime has been shutdown. - -// Notice that if the user defines _ATL_MIXED, he/she will need to take care -// of releasing the eventual managed class factories at the right time. - -class CAtlReleaseManagedClassFactories -{ -public: - CAtlReleaseManagedClassFactories() { } - ~CAtlReleaseManagedClassFactories() - { - _AtlComModule.Term(); - } -}; - -__declspec (selectany) CAtlReleaseManagedClassFactories _AtlReleaseManagedClassFactories; - -extern "C" -{ -__declspec (selectany) void *_pAtlReleaseManagedClassFactories = &_AtlReleaseManagedClassFactories; -} -#if defined(_M_IX86) - #pragma comment(linker, "/include:__pAtlReleaseManagedClassFactories") -#else - #pragma comment(linker, "/include:_pAtlReleaseManagedClassFactories") -#endif - -#endif - -class ATL_NO_VTABLE CAtlModule : public _ATL_MODULE -{ -public : - static GUID m_libid; - IGlobalInterfaceTable* m_pGIT; - - CAtlModule() throw() - { - // Should have only one instance of a class - // derived from CAtlModule in a project. - ATLASSERT(_pAtlModule == NULL); - cbSize = 0; - m_pTermFuncs = NULL; - - m_nLockCnt = 0; - _pAtlModule = this; - m_pGIT = NULL; - - if (FAILED(m_csStaticDataInitAndTypeInfo.Init())) - { - ATLTRACE(atlTraceGeneral, 0, _T("ERROR : Unable to initialize critical section in CAtlModule\n")); - ATLASSERT(0); - CAtlBaseModule::m_bInitFailed = true; - return; - } - - // Set cbSize on success. - cbSize = sizeof(_ATL_MODULE); - } - - void Term() throw() - { - // cbSize == 0 indicates that Term has already been called - if (cbSize == 0) - return; - - // Call term functions - if (m_pTermFuncs != NULL) - { - AtlCallTermFunc(this); - m_pTermFuncs = NULL; - } - - if (m_pGIT != NULL) - m_pGIT->Release(); - - m_csStaticDataInitAndTypeInfo.Term(); - - cbSize = 0; - } - - virtual ~CAtlModule() throw() - { - Term(); - } - - virtual LONG Lock() throw() - { - return CComGlobalsThreadModel::Increment(&m_nLockCnt); - } - - virtual LONG Unlock() throw() - { - return CComGlobalsThreadModel::Decrement(&m_nLockCnt); - } - - virtual LONG GetLockCount() throw() - { - return m_nLockCnt; - } - - HRESULT AddTermFunc(_ATL_TERMFUNC* pFunc, DWORD_PTR dw) throw() - { - return AtlModuleAddTermFunc(this, pFunc, dw); - } - - virtual HRESULT GetGITPtr(IGlobalInterfaceTable** ppGIT) throw() - { - ATLASSERT(ppGIT != NULL); - - if (ppGIT == NULL) - return E_POINTER; - - HRESULT hr = S_OK; - if (m_pGIT == NULL) - { - hr = ::CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_INPROC_SERVER, - __uuidof(IGlobalInterfaceTable), (void**)&m_pGIT); - } - - if (SUCCEEDED(hr)) - { - ATLASSUME(m_pGIT != NULL); - *ppGIT = m_pGIT; - m_pGIT->AddRef(); - } - return hr; - } - - virtual HRESULT AddCommonRGSReplacements(IRegistrarBase* /*pRegistrar*/) throw() = 0; - - // Resource-based Registration -#ifdef _ATL_STATIC_REGISTRY - // Statically linking to Registry Ponent - HRESULT WINAPI UpdateRegistryFromResourceS(LPCTSTR lpszRes, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw(); - HRESULT WINAPI UpdateRegistryFromResourceS(UINT nResID, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw(); -#else - HRESULT WINAPI UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw() - { - if(lpszRes == NULL) - return E_INVALIDARG; - - USES_CONVERSION_EX; - LPCOLESTR pwszTemp = T2COLE_EX(lpszRes, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifdef _UNICODE - if(pwszTemp == NULL) - return E_OUTOFMEMORY; -#endif - return UpdateRegistryFromResourceDHelper(pwszTemp, bRegister, pMapEntries); - } - HRESULT WINAPI UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw() - { - return UpdateRegistryFromResourceDHelper((LPCOLESTR)MAKEINTRESOURCE(nResID), bRegister, pMapEntries); - } -#endif - - // Implementation -#if !defined(_ATL_STATIC_REGISTRY) - inline HRESULT WINAPI UpdateRegistryFromResourceDHelper(LPCOLESTR lpszRes, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw() - { - CComPtr spRegistrar; - HRESULT hr = AtlCreateRegistrar(&spRegistrar); - if (FAILED(hr)) - return hr; - - if (NULL != pMapEntries) - { - while (NULL != pMapEntries->szKey) - { - ATLASSERT(NULL != pMapEntries->szData); - spRegistrar->AddReplacement(pMapEntries->szKey, pMapEntries->szData); - pMapEntries++; - } - } - - hr = AddCommonRGSReplacements(spRegistrar); - if (FAILED(hr)) - return hr; - - return AtlUpdateRegistryFromResourceD(_AtlBaseModule.GetModuleInstance(), lpszRes, bRegister, - NULL, spRegistrar); - } -#endif - - static void EscapeSingleQuote(__out_ecount_z(destSizeInChars) LPOLESTR lpDest,__in size_t destSizeInChars, __in_z LPCOLESTR lp) throw() - { - if (destSizeInChars == 0) - { - return; - } - UINT i = 0; - // copy charecters to the destination buffer but leave the last char to be NULL. - for (i=0; i < destSizeInChars-1 && *lp; i++) - { - lpDest[i] = *lp; - // make sure we won't promote lpDest behind the buffer limit. - if (*lp == '\'' && i < destSizeInChars-2) - lpDest[++i] = *lp; - lp++; - } - lpDest[i] = NULL; - } - - ATL_DEPRECATED("CAtlModule::EscapeSingleQuote(dest, src) is unsafe. Instead, use CAtlModule::EscapeSingleQuote(dest, size, src)") - static void EscapeSingleQuote(__out_z LPOLESTR lpDest, __in_z LPCOLESTR lp) throw() - { - EscapeSingleQuote(lpDest, SIZE_MAX/sizeof(OLECHAR), lp); - } - - // search for an occurence of string p2 in string p1 - static LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) throw() - { - while (p1 != NULL && *p1 != NULL) - { - LPCTSTR p = p2; - while (p != NULL && *p != NULL) - { - if (*p1 == *p) - return CharNext(p1); - p = CharNext(p); - } - p1 = CharNext(p1); - } - return NULL; - } -#pragma warning(push) -#pragma warning(disable : 4302) // 'type cast' : truncation from 'LPSTR' to 'TCHAR' - - static int WordCmpI(LPCTSTR psz1, LPCTSTR psz2) throw() - { - TCHAR c1 = (TCHAR)CharUpper((LPTSTR)*psz1); - TCHAR c2 = (TCHAR)CharUpper((LPTSTR)*psz2); - while (c1 != NULL && c1 == c2 && c1 != ' ' && c1 != '\t') - { - psz1 = CharNext(psz1); - psz2 = CharNext(psz2); - c1 = (TCHAR)CharUpper((LPTSTR)*psz1); - c2 = (TCHAR)CharUpper((LPTSTR)*psz2); - } - if ((c1 == NULL || c1 == ' ' || c1 == '\t') && (c2 == NULL || c2 == ' ' || c2 == '\t')) - return 0; - - return (c1 < c2) ? -1 : 1; - } - -#pragma warning (pop) -}; - -__declspec(selectany) GUID CAtlModule::m_libid = {0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} }; - -#define DECLARE_LIBID(libid) \ - static void InitLibId() throw() \ - { \ - ATL::CAtlModule::m_libid = libid; \ - } - -#define DECLARE_REGISTRY_APPID_RESOURCEID(resid, appid) \ - static LPCOLESTR GetAppId() throw() \ - { \ - return OLESTR(appid); \ - } \ - static TCHAR* GetAppIdT() throw() \ - { \ - return _T(appid); \ - } \ - static HRESULT WINAPI UpdateRegistryAppId(BOOL bRegister) throw() \ - { \ - ATL::_ATL_REGMAP_ENTRY aMapEntries [] = \ - { \ - { OLESTR("APPID"), GetAppId() }, \ - { NULL, NULL } \ - }; \ - return ATL::_pAtlModule->UpdateRegistryFromResource(resid, bRegister, aMapEntries); \ - } - -inline HRESULT AtlGetGITPtr(IGlobalInterfaceTable** ppGIT) throw() -{ - if (ppGIT == NULL) - return E_POINTER; - - if (_pAtlModule == NULL) - { - return CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_INPROC_SERVER, - __uuidof(IGlobalInterfaceTable), (void**)ppGIT); - } - else - { - return _pAtlModule->GetGITPtr(ppGIT); - } -} - -template -class ATL_NO_VTABLE CAtlModuleT : public CAtlModule -{ -public : - CAtlModuleT() throw() - { - T::InitLibId(); - } - - static void InitLibId() throw() - { - } - - HRESULT RegisterServer(BOOL bRegTypeLib = FALSE, const CLSID* pCLSID = NULL) throw() - { - (pCLSID); - (bRegTypeLib); - - HRESULT hr = S_OK; - -#ifndef _ATL_NO_COM_SUPPORT - - hr = _AtlComModule.RegisterServer(bRegTypeLib, pCLSID); - -#endif // _ATL_NO_COM_SUPPORT - - -#ifndef _ATL_NO_PERF_SUPPORT - - if (SUCCEEDED(hr) && _pPerfRegFunc != NULL) - hr = (*_pPerfRegFunc)(_AtlBaseModule.m_hInst); - -#endif - - return hr; - } - - HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = NULL) throw() - { - (bUnRegTypeLib); - (pCLSID); - - HRESULT hr = S_OK; - -#ifndef _ATL_NO_PERF_SUPPORT - - if (_pPerfUnRegFunc != NULL) - hr = (*_pPerfUnRegFunc)(); - -#endif - -#ifndef _ATL_NO_COM_SUPPORT - - if (SUCCEEDED(hr)) - hr = _AtlComModule.UnregisterServer(bUnRegTypeLib, pCLSID); - -#endif // _ATL_NO_COM_SUPPORT - - return hr; - - } - - static HRESULT WINAPI UpdateRegistryAppId(BOOL /*bRegister*/) throw() - { - return S_OK; - } - HRESULT RegisterAppId() throw() - { - return T::UpdateRegistryAppId(TRUE); - } - - HRESULT UnregisterAppId() throw() - { - return T::UpdateRegistryAppId(FALSE); - } - - virtual HRESULT AddCommonRGSReplacements(IRegistrarBase* pRegistrar) throw() - { - return pRegistrar->AddReplacement(L"APPID", T::GetAppId()); - } - static LPCOLESTR GetAppId() throw() - { - return OLESTR(""); - } -}; - -#if !defined(_ATL_NATIVE_INITIALIZATION) -#pragma warning(push) -#pragma warning(disable:4483) -namespace __identifier("") -#pragma warning(pop) -{ - __declspec(selectany) bool DllModuleInitialized = false; -} - -#endif - -template -class ATL_NO_VTABLE CAtlDllModuleT : public CAtlModuleT -{ -public : - CAtlDllModuleT() throw() - { - _AtlComModule.ExecuteObjectMain(true); -#if !defined(_ATL_NATIVE_INITIALIZATION) -#pragma warning(push) -#pragma warning(disable:4483) - using namespace __identifier(""); -#pragma warning(pop) - ATLASSERT(DllModuleInitialized == false); - DllModuleInitialized = true; - _DllMain(DLL_PROCESS_ATTACH, NULL); -#endif - } - - ~CAtlDllModuleT() throw() - { -#if !defined(_ATL_NATIVE_INITIALIZATION) -#pragma warning(push) -#pragma warning(disable:4483) - using namespace __identifier(""); -#pragma warning(pop) - ATLASSERT(DllModuleInitialized == true); - _DllMain(DLL_PROCESS_DETACH, NULL); -#endif - _AtlComModule.ExecuteObjectMain(false); - } - - BOOL WINAPI DllMain(DWORD dwReason, LPVOID lpReserved) throw(); - - BOOL WINAPI _DllMain(DWORD dwReason, LPVOID /* lpReserved */) throw() - { - if (dwReason == DLL_PROCESS_ATTACH) - { - if (CAtlBaseModule::m_bInitFailed) - { - ATLASSERT(0); - return FALSE; - } - -#ifdef _ATL_MIN_CRT - DisableThreadLibraryCalls(_AtlBaseModule.GetModuleInstance()); -#endif - } -#ifdef _DEBUG - else if (dwReason == DLL_PROCESS_DETACH) - { - // Prevent false memory leak reporting. ~CAtlWinModule may be too late. - _AtlWinModule.Term(); - } -#endif // _DEBUG - return TRUE; // ok - } - - HRESULT DllCanUnloadNow() throw() - { - T* pT = static_cast(this); - return (pT->GetLockCount()==0) ? S_OK : S_FALSE; - } - - HRESULT DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) throw() - { - T* pT = static_cast(this); - return pT->GetClassObject(rclsid, riid, ppv); - } - - HRESULT DllRegisterServer(BOOL bRegTypeLib = TRUE) throw() - { - LCID lcid = GetThreadLocale(); - SetThreadLocale(LOCALE_SYSTEM_DEFAULT); - // registers object, typelib and all interfaces in typelib - T* pT = static_cast(this); - HRESULT hr = pT->RegisterAppId(); - if (SUCCEEDED(hr)) - hr = pT->RegisterServer(bRegTypeLib); - SetThreadLocale(lcid); - return hr; - } - - HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = TRUE) throw() - { - LCID lcid = GetThreadLocale(); - SetThreadLocale(LOCALE_SYSTEM_DEFAULT); - T* pT = static_cast(this); - HRESULT hr = pT->UnregisterServer(bUnRegTypeLib); - if (SUCCEEDED(hr)) - hr = pT->UnregisterAppId(); - SetThreadLocale(lcid); - return hr; - } - - // Obtain a Class Factory - HRESULT GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) throw() - { - -#ifndef _ATL_OLEDB_CONFORMANCE_TESTS - ATLASSERT(ppv != NULL); -#endif - - return AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv); - } -}; - - -#if (_MSC_VER >= 1400) -#pragma managed(push, off) -#else -#pragma unmanaged -#endif - -template -inline BOOL WINAPI CAtlDllModuleT::DllMain(DWORD dwReason, LPVOID lpReserved) throw() -{ -#if !defined(_ATL_NATIVE_INITIALIZATION) - dwReason; lpReserved; -#pragma warning(push) -#pragma warning(disable:4483) - using namespace __identifier(""); -#pragma warning(pop) - if (dwReason == DLL_PROCESS_ATTACH) - { - ATLASSERT(DllModuleInitialized == false); - } - return TRUE; -#else - return _DllMain(dwReason, lpReserved); -#endif -} - - -#if (_MSC_VER >= 1400) -#pragma managed(pop) -#else -#pragma managed -#endif - -#ifndef _AFX - - -template -class ATL_NO_VTABLE CAtlExeModuleT : public CAtlModuleT -{ -public : -#ifndef _ATL_NO_COM_SUPPORT - - DWORD m_dwMainThreadID; - HANDLE m_hEventShutdown; - DWORD m_dwTimeOut; - DWORD m_dwPause; - bool m_bDelayShutdown; - bool m_bActivity; - bool m_bComInitialized; // Flag that indicates if ATL initialized COM - -#endif // _ATL_NO_COM_SUPPORT - - CAtlExeModuleT() throw() - -#ifndef _ATL_NO_COM_SUPPORT - - : m_dwMainThreadID(::GetCurrentThreadId()), - m_dwTimeOut(5000), - m_dwPause(1000), - m_hEventShutdown(NULL), - m_bDelayShutdown(true), - m_bComInitialized(false) - -#endif // _ATL_NO_COM_SUPPORT - - { -#if !defined(_ATL_NO_COM_SUPPORT) - HRESULT hr = T::InitializeCom(); - if (FAILED(hr)) - { - // Ignore RPC_E_CHANGED_MODE if CLR is loaded. Error is due to CLR initializing - // COM and InitializeCOM trying to initialize COM with different flags. - if (hr != RPC_E_CHANGED_MODE || GetModuleHandle(_T("Mscoree.dll")) == NULL) - { - ATLASSERT(0); - CAtlBaseModule::m_bInitFailed = true; - return; - } - } - else - { - m_bComInitialized = true; - } - - - _AtlComModule.ExecuteObjectMain(true); - -#endif // !defined(_ATL_NO_COM_SUPPORT) - - } - - ~CAtlExeModuleT() throw() - { -#ifndef _ATL_NO_COM_SUPPORT - - _AtlComModule.ExecuteObjectMain(false); - -#endif - - // Call term functions before COM is uninitialized - Term(); - -#ifndef _ATL_NO_COM_SUPPORT - - // Clean up AtlComModule before COM is uninitialized - _AtlComModule.Term(); - - if (m_bComInitialized) - T::UninitializeCom(); -#endif // _ATL_NO_COM_SUPPORT - } - - static HRESULT InitializeCom() throw() - { - -#if ((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) & defined(_ATL_FREE_THREADED) - return CoInitializeEx(NULL, COINIT_MULTITHREADED); -#else - return CoInitialize(NULL); -#endif - } - - static void UninitializeCom() throw() - { - CoUninitialize(); - } - - LONG Unlock() throw() - { - LONG lRet = CComGlobalsThreadModel::Decrement(&m_nLockCnt); - -#ifndef _ATL_NO_COM_SUPPORT - - if (lRet == 0) - { - if (m_bDelayShutdown) - { - m_bActivity = true; - ::SetEvent(m_hEventShutdown); // tell monitor that we transitioned to zero - } - else - { - ::PostThreadMessage(m_dwMainThreadID, WM_QUIT, 0, 0); - } - } - -#endif // _ATL_NO_COM_SUPPORT - - return lRet; - } -#ifndef _ATL_NO_COM_SUPPORT - - void MonitorShutdown() throw() - { - while (1) - { - ::WaitForSingleObject(m_hEventShutdown, INFINITE); - DWORD dwWait = 0; - do - { - m_bActivity = false; - dwWait = ::WaitForSingleObject(m_hEventShutdown, m_dwTimeOut); - } while (dwWait == WAIT_OBJECT_0); - // timed out - if (!m_bActivity && m_nLockCnt == 0) // if no activity let's really bail - { -#if ((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) & defined(_ATL_FREE_THREADED) - ::CoSuspendClassObjects(); - if (m_nLockCnt == 0) -#endif - break; - } - } - ::CloseHandle(m_hEventShutdown); - ::PostThreadMessage(m_dwMainThreadID, WM_QUIT, 0, 0); - } - - HANDLE StartMonitor() throw() - { - m_hEventShutdown = ::CreateEvent(NULL, false, false, NULL); - if (m_hEventShutdown == NULL) - { - return NULL; - } - DWORD dwThreadID; - HANDLE hThread = ::CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID); - if(hThread==NULL) - { - ::CloseHandle(m_hEventShutdown); - } - return hThread; - } - - static DWORD WINAPI MonitorProc(void* pv) throw() - { - CAtlExeModuleT* p = static_cast*>(pv); - p->MonitorShutdown(); - return 0; - } -#endif // _ATL_NO_COM_SUPPORT - - int WinMain(int nShowCmd) throw() - { - if (CAtlBaseModule::m_bInitFailed) - { - ATLASSERT(0); - return -1; - } - T* pT = static_cast(this); - HRESULT hr = S_OK; - - LPTSTR lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT - if (pT->ParseCommandLine(lpCmdLine, &hr) == true) - hr = pT->Run(nShowCmd); - -#ifdef _DEBUG - // Prevent false memory leak reporting. ~CAtlWinModule may be too late. - _AtlWinModule.Term(); -#endif // _DEBUG - return hr; - } - - // Scan command line and perform registration - // Return value specifies if server should run - - // Parses the command line and registers/unregisters the rgs file if necessary - bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw() - { - *pnRetCode = S_OK; - - TCHAR szTokens[] = _T("-/"); - - T* pT = static_cast(this); - LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens); - while (lpszToken != NULL) - { - if (WordCmpI(lpszToken, _T("UnregServer"))==0) - { - *pnRetCode = pT->UnregisterServer(TRUE); - if (SUCCEEDED(*pnRetCode)) - *pnRetCode = pT->UnregisterAppId(); - return false; - } - - // Register as Local Server - if (WordCmpI(lpszToken, _T("RegServer"))==0) - { - *pnRetCode = pT->RegisterAppId(); - if (SUCCEEDED(*pnRetCode)) - *pnRetCode = pT->RegisterServer(TRUE); - return false; - } - - lpszToken = FindOneOf(lpszToken, szTokens); - } - - return true; - } - - HRESULT PreMessageLoop(int /*nShowCmd*/) throw() - { - HRESULT hr = S_OK; - T* pT = static_cast(this); - pT; - -#ifndef _ATL_NO_COM_SUPPORT - -#if ((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) & defined(_ATL_FREE_THREADED) - - hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER, - REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED); - - if (FAILED(hr)) - return hr; - - if (hr == S_OK) - { - if (m_bDelayShutdown) - { - CHandle h(pT->StartMonitor()); - if (h.m_h == NULL) - { - hr = E_FAIL; - } - else - { - hr = CoResumeClassObjects(); - ATLASSERT(SUCCEEDED(hr)); - if (FAILED(hr)) - { - ::SetEvent(m_hEventShutdown); // tell monitor to shutdown - ::WaitForSingleObject(h, m_dwTimeOut * 2); - } - } - } - else - { - hr = CoResumeClassObjects(); - ATLASSERT(SUCCEEDED(hr)); - } - - if (FAILED(hr)) - pT->RevokeClassObjects(); - } - else - { - m_bDelayShutdown = false; - } - -#else - - hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER, - REGCLS_MULTIPLEUSE); - if (hr == S_OK) - { - if (m_bDelayShutdown && !pT->StartMonitor()) - { - hr = E_FAIL; - } - } - else - { - m_bDelayShutdown = false; - } - - -#endif - -#endif // _ATL_NO_COM_SUPPORT - - ATLASSERT(SUCCEEDED(hr)); - return hr; - } - - HRESULT PostMessageLoop() throw() - { - HRESULT hr = S_OK; - -#ifndef _ATL_NO_COM_SUPPORT - - T* pT = static_cast(this); - hr = pT->RevokeClassObjects(); - if (m_bDelayShutdown) - Sleep(m_dwPause); //wait for any threads to finish - -#endif // _ATL_NO_COM_SUPPORT - - return hr; - } - - void RunMessageLoop() throw() - { - MSG msg; - while (GetMessage(&msg, 0, 0, 0) > 0) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - - HRESULT Run(int nShowCmd = SW_HIDE) throw() - { - HRESULT hr = S_OK; - - T* pT = static_cast(this); - hr = pT->PreMessageLoop(nShowCmd); - - // Call RunMessageLoop only if PreMessageLoop returns S_OK. - if (hr == S_OK) - { - pT->RunMessageLoop(); - } - - // Call PostMessageLoop if PreMessageLoop returns success. - if (SUCCEEDED(hr)) - { - hr = pT->PostMessageLoop(); - } - - ATLASSERT(SUCCEEDED(hr)); - return hr; - } - - // Register/Revoke All Class Factories with the OS (EXE only) - HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw() - { - return AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags); - } - HRESULT RevokeClassObjects() throw() - { - return AtlComModuleRevokeClassObjects(&_AtlComModule); - } -}; - -#ifndef _ATL_NO_SERVICE -template -class ATL_NO_VTABLE CAtlServiceModuleT : public CAtlExeModuleT -{ -public : - - CAtlServiceModuleT() throw() - { - m_bService = TRUE; - LoadString(_AtlBaseModule.GetModuleInstance(), nServiceNameID, m_szServiceName, sizeof(m_szServiceName) / sizeof(TCHAR)); - - // set up the initial service status - m_hServiceStatus = NULL; - m_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - m_status.dwCurrentState = SERVICE_STOPPED; - m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP; - m_status.dwWin32ExitCode = 0; - m_status.dwServiceSpecificExitCode = 0; - m_status.dwCheckPoint = 0; - m_status.dwWaitHint = 0; - } - - int WinMain(int nShowCmd) throw() - { - if (CAtlBaseModule::m_bInitFailed) - { - ATLASSERT(0); - return -1; - } - - T* pT = static_cast(this); - HRESULT hr = S_OK; - - LPTSTR lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT - if (pT->ParseCommandLine(lpCmdLine, &hr) == true) - hr = pT->Start(nShowCmd); - -#ifdef _DEBUG - // Prevent false memory leak reporting. ~CAtlWinModule may be too late. - _AtlWinModule.Term(); -#endif // _DEBUG - return hr; - } - - HRESULT Start(int nShowCmd) throw() - { - T* pT = static_cast(this); - // Are we Service or Local Server - CRegKey keyAppID; - LONG lRes = keyAppID.Open(HKEY_CLASSES_ROOT, _T("AppID"), KEY_READ); - if (lRes != ERROR_SUCCESS) - { - m_status.dwWin32ExitCode = lRes; - return m_status.dwWin32ExitCode; - } - - CRegKey key; - lRes = key.Open(keyAppID, pT->GetAppIdT(), KEY_READ); - if (lRes != ERROR_SUCCESS) - { - m_status.dwWin32ExitCode = lRes; - return m_status.dwWin32ExitCode; - } - - TCHAR szValue[MAX_PATH]; - DWORD dwLen = MAX_PATH; - lRes = key.QueryStringValue(_T("LocalService"), szValue, &dwLen); - - m_bService = FALSE; - if (lRes == ERROR_SUCCESS) - m_bService = TRUE; - - if (m_bService) - { - SERVICE_TABLE_ENTRY st[] = - { - { m_szServiceName, _ServiceMain }, - { NULL, NULL } - }; - if (::StartServiceCtrlDispatcher(st) == 0) - m_status.dwWin32ExitCode = GetLastError(); - return m_status.dwWin32ExitCode; - } - // local server - call Run() directly, rather than - // from ServiceMain() - m_status.dwWin32ExitCode = pT->Run(nShowCmd); - return m_status.dwWin32ExitCode; - } - - inline HRESULT RegisterAppId(bool bService = false) throw() - { - if (IsInstalled()) - return E_FAIL; - - HRESULT hr = T::UpdateRegistryAppId(TRUE); - if (FAILED(hr)) - return hr; - - CRegKey keyAppID; - LONG lRes = keyAppID.Open(HKEY_CLASSES_ROOT, _T("AppID"), KEY_WRITE); - if (lRes != ERROR_SUCCESS) - return AtlHresultFromWin32(lRes); - - CRegKey key; - - lRes = key.Create(keyAppID, T::GetAppIdT()); - if (lRes != ERROR_SUCCESS) - return AtlHresultFromWin32(lRes); - - key.DeleteValue(_T("LocalService")); - - if (!bService) - return S_OK; - - key.SetStringValue(_T("LocalService"), m_szServiceName); - - // Create service - if (!Install()) - return E_FAIL; - return S_OK; - } - - HRESULT UnregisterAppId() throw() - { - if (!Uninstall()) - return E_FAIL; - // First remove entries not in the RGS file. - CRegKey keyAppID; - LONG lRes = keyAppID.Open(HKEY_CLASSES_ROOT, _T("AppID"), KEY_WRITE); - if (lRes != ERROR_SUCCESS) - return AtlHresultFromWin32(lRes); - - CRegKey key; - lRes = key.Open(keyAppID, T::GetAppIdT(), KEY_WRITE); - if (lRes != ERROR_SUCCESS) - return AtlHresultFromWin32(lRes); - key.DeleteValue(_T("LocalService")); - - return T::UpdateRegistryAppId(FALSE); - } - - // Parses the command line and registers/unregisters the rgs file if necessary - bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw() - { - if (!CAtlExeModuleT::ParseCommandLine(lpCmdLine, pnRetCode)) - return false; - - TCHAR szTokens[] = _T("-/"); - *pnRetCode = S_OK; - - T* pT = static_cast(this); - LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens); - while (lpszToken != NULL) - { - if (WordCmpI(lpszToken, _T("Service"))==0) - { - *pnRetCode = pT->RegisterAppId(true); - if (SUCCEEDED(*pnRetCode)) - *pnRetCode = pT->RegisterServer(TRUE); - return false; - } - lpszToken = FindOneOf(lpszToken, szTokens); - } - return true; - } - - void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw() - { - lpszArgv; - dwArgc; - // Register the control request handler - m_status.dwCurrentState = SERVICE_START_PENDING; - m_hServiceStatus = RegisterServiceCtrlHandler(m_szServiceName, _Handler); - if (m_hServiceStatus == NULL) - { - LogEvent(_T("Handler not installed")); - return; - } - SetServiceStatus(SERVICE_START_PENDING); - - m_status.dwWin32ExitCode = S_OK; - m_status.dwCheckPoint = 0; - m_status.dwWaitHint = 0; - - T* pT = static_cast(this); -#ifndef _ATL_NO_COM_SUPPORT - - HRESULT hr = E_FAIL; - hr = T::InitializeCom(); - if (FAILED(hr)) - { - // Ignore RPC_E_CHANGED_MODE if CLR is loaded. Error is due to CLR initializing - // COM and InitializeCOM trying to initialize COM with different flags. - if (hr != RPC_E_CHANGED_MODE || GetModuleHandle(_T("Mscoree.dll")) == NULL) - { - return; - } - } - else - { - m_bComInitialized = true; - } - - m_bDelayShutdown = false; -#endif //_ATL_NO_COM_SUPPORT - // When the Run function returns, the service has stopped. - m_status.dwWin32ExitCode = pT->Run(SW_HIDE); - -#ifndef _ATL_NO_COM_SUPPORT - if (m_bService && m_bComInitialized) - T::UninitializeCom(); -#endif - - SetServiceStatus(SERVICE_STOPPED); - LogEvent(_T("Service stopped")); - } - - HRESULT Run(int nShowCmd = SW_HIDE) throw() - { - HRESULT hr = S_OK; - T* pT = static_cast(this); - - hr = pT->PreMessageLoop(nShowCmd); - - if (hr == S_OK) - { - if (m_bService) - { - LogEvent(_T("Service started")); - SetServiceStatus(SERVICE_RUNNING); - } - - pT->RunMessageLoop(); - } - - if (SUCCEEDED(hr)) - { - hr = pT->PostMessageLoop(); - } - - return hr; - } - - HRESULT PreMessageLoop(int nShowCmd) throw() - { - HRESULT hr = S_OK; - if (m_bService) - { - m_dwThreadID = GetCurrentThreadId(); - - T* pT = static_cast(this); - hr = pT->InitializeSecurity(); - - if (FAILED(hr)) - return hr; - } - - hr = CAtlExeModuleT::PreMessageLoop(nShowCmd); - if (FAILED(hr)) - return hr; - - return hr; - } - - void OnStop() throw() - { - SetServiceStatus(SERVICE_STOP_PENDING); - PostThreadMessage(m_dwThreadID, WM_QUIT, 0, 0); - } - - void OnPause() throw() - { - } - - void OnContinue() throw() - { - } - - void OnInterrogate() throw() - { - } - - void OnShutdown() throw() - { - } - - void OnUnknownRequest(DWORD /*dwOpcode*/) throw() - { - LogEvent(_T("Bad service request")); - } - - void Handler(DWORD dwOpcode) throw() - { - T* pT = static_cast(this); - - switch (dwOpcode) - { - case SERVICE_CONTROL_STOP: - pT->OnStop(); - break; - case SERVICE_CONTROL_PAUSE: - pT->OnPause(); - break; - case SERVICE_CONTROL_CONTINUE: - pT->OnContinue(); - break; - case SERVICE_CONTROL_INTERROGATE: - pT->OnInterrogate(); - break; - case SERVICE_CONTROL_SHUTDOWN: - pT->OnShutdown(); - break; - default: - pT->OnUnknownRequest(dwOpcode); - } - } - - BOOL IsInstalled() throw() - { - BOOL bResult = FALSE; - - SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - - if (hSCM != NULL) - { - SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_QUERY_CONFIG); - if (hService != NULL) - { - bResult = TRUE; - ::CloseServiceHandle(hService); - } - ::CloseServiceHandle(hSCM); - } - return bResult; - } - BOOL Install() throw() - { - if (IsInstalled()) - return TRUE; - - // Get the executable file path - TCHAR szFilePath[MAX_PATH + _ATL_QUOTES_SPACE]; - DWORD dwFLen = ::GetModuleFileName(NULL, szFilePath + 1, MAX_PATH); - if( dwFLen == 0 || dwFLen == MAX_PATH ) - return FALSE; - - // Quote the FilePath before calling CreateService - szFilePath[0] = _T('\"'); - szFilePath[dwFLen + 1] = _T('\"'); - szFilePath[dwFLen + 2] = 0; - - SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - if (hSCM == NULL) - { - TCHAR szBuf[1024]; - if (AtlLoadString(ATL_SERVICE_MANAGER_OPEN_ERROR, szBuf, 1024) == 0) -#ifdef UNICODE - Checked::wcscpy_s(szBuf, _countof(szBuf), _T("Could not open Service Manager")); -#else - Checked::strcpy_s(szBuf, _countof(szBuf), _T("Could not open Service Manager")); -#endif - MessageBox(NULL, szBuf, m_szServiceName, MB_OK); - return FALSE; - } - - SC_HANDLE hService = ::CreateService( - hSCM, m_szServiceName, m_szServiceName, - SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, - SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, - szFilePath, NULL, NULL, _T("RPCSS\0"), NULL, NULL); - - if (hService == NULL) - { - ::CloseServiceHandle(hSCM); - TCHAR szBuf[1024]; - if (AtlLoadString(ATL_SERVICE_START_ERROR, szBuf, 1024) == 0) -#ifdef UNICODE - Checked::wcscpy_s(szBuf, _countof(szBuf), _T("Could not start service")); -#else - Checked::strcpy_s(szBuf, _countof(szBuf), _T("Could not start service")); -#endif - MessageBox(NULL, szBuf, m_szServiceName, MB_OK); - return FALSE; - } - - ::CloseServiceHandle(hService); - ::CloseServiceHandle(hSCM); - return TRUE; - } - - BOOL Uninstall() throw() - { - if (!IsInstalled()) - return TRUE; - - SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - - if (hSCM == NULL) - { - TCHAR szBuf[1024]; - if (AtlLoadString(ATL_SERVICE_MANAGER_OPEN_ERROR, szBuf, 1024) == 0) -#ifdef UNICODE - Checked::wcscpy_s(szBuf, _countof(szBuf), _T("Could not open Service Manager")); -#else - Checked::strcpy_s(szBuf, _countof(szBuf), _T("Could not open Service Manager")); -#endif - MessageBox(NULL, szBuf, m_szServiceName, MB_OK); - return FALSE; - } - - SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_STOP | DELETE); - - if (hService == NULL) - { - ::CloseServiceHandle(hSCM); - TCHAR szBuf[1024]; - if (AtlLoadString(ATL_SERVICE_OPEN_ERROR, szBuf, 1024) == 0) -#ifdef UNICODE - Checked::wcscpy_s(szBuf, _countof(szBuf), _T("Could not open service")); -#else - Checked::strcpy_s(szBuf, _countof(szBuf), _T("Could not open service")); -#endif - MessageBox(NULL, szBuf, m_szServiceName, MB_OK); - return FALSE; - } - SERVICE_STATUS status; - BOOL bRet = ::ControlService(hService, SERVICE_CONTROL_STOP, &status); - if (!bRet) - { - DWORD dwError = GetLastError(); - if (!((dwError == ERROR_SERVICE_NOT_ACTIVE) || (dwError == ERROR_SERVICE_CANNOT_ACCEPT_CTRL && status.dwCurrentState == SERVICE_STOP_PENDING))) - { - TCHAR szBuf[1024]; - if (AtlLoadString(ATL_SERVICE_STOP_ERROR, szBuf, 1024) == 0) -#ifdef UNICODE - Checked::wcscpy_s(szBuf, _countof(szBuf), _T("Could not stop service")); -#else - Checked::strcpy_s(szBuf, _countof(szBuf), _T("Could not stop service")); -#endif - MessageBox(NULL, szBuf, m_szServiceName, MB_OK); - } - } - - - BOOL bDelete = ::DeleteService(hService); - ::CloseServiceHandle(hService); - ::CloseServiceHandle(hSCM); - - if (bDelete) - return TRUE; - - TCHAR szBuf[1024]; - if (AtlLoadString(ATL_SERVICE_DELETE_ERROR, szBuf, 1024) == 0) -#ifdef UNICODE - Checked::wcscpy_s(szBuf, _countof(szBuf), _T("Could not delete service")); -#else - Checked::strcpy_s(szBuf, _countof(szBuf), _T("Could not delete service")); -#endif - MessageBox(NULL, szBuf, m_szServiceName, MB_OK); - return FALSE; - } - - LONG Unlock() throw() - { - LONG lRet; - if (m_bService) - { - // We are running as a service, therefore transition to zero does not - // unload the process - lRet = CAtlModuleT::Unlock(); - } - else - { - // We are running as EXE, use MonitorShutdown logic provided by CExeModule - lRet = CAtlExeModuleT::Unlock(); - } - return lRet; - } - - void LogEventEx(int id, LPCTSTR pszMessage=NULL, WORD type = EVENTLOG_INFORMATION_TYPE) throw() - { - HANDLE hEventSource; - if (m_szServiceName) - { - /* Get a handle to use with ReportEvent(). */ - hEventSource = RegisterEventSource(NULL, m_szServiceName); - if (hEventSource != NULL) - { - /* Write to event log. */ - ReportEvent(hEventSource, - type, - (WORD)0, - id, - NULL, - (WORD)(pszMessage != NULL ? 1 : 0), - 0, - pszMessage != NULL ? &pszMessage : NULL, - NULL); - DeregisterEventSource(hEventSource); - } - } - } - -#pragma warning(push) -#pragma warning(disable : 4793) - void __cdecl LogEvent(LPCTSTR pszFormat, ...) throw() - { - const int LOG_EVENT_MSG_SIZE = 256; - - TCHAR chMsg[LOG_EVENT_MSG_SIZE]; - HANDLE hEventSource; - LPTSTR lpszStrings[1]; - va_list pArg; - - va_start(pArg, pszFormat); -#if _SECURE_ATL - _vsntprintf_s(chMsg, LOG_EVENT_MSG_SIZE, LOG_EVENT_MSG_SIZE-1, pszFormat, pArg); -#else - _vsntprintf(chMsg, LOG_EVENT_MSG_SIZE, pszFormat, pArg); -#endif - va_end(pArg); - - chMsg[LOG_EVENT_MSG_SIZE - 1] = 0; - - lpszStrings[0] = chMsg; - - if (!m_bService) - { - // Not running as a service, so print out the error message - // to the console if possible - _putts(chMsg); - } - - /* Get a handle to use with ReportEvent(). */ - hEventSource = RegisterEventSource(NULL, m_szServiceName); - if (hEventSource != NULL) - { - /* Write to event log. */ - ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL); - DeregisterEventSource(hEventSource); - } - } -#pragma warning(pop) - - void SetServiceStatus(DWORD dwState) throw() - { - m_status.dwCurrentState = dwState; - ::SetServiceStatus(m_hServiceStatus, &m_status); - } - -//Implementation -protected: - static void WINAPI _ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw() - { - ((T*)_pAtlModule)->ServiceMain(dwArgc, lpszArgv); - } - static void WINAPI _Handler(DWORD dwOpcode) throw() - { - ((T*)_pAtlModule)->Handler(dwOpcode); - } - -// data members -public: - TCHAR m_szServiceName[256]; - SERVICE_STATUS_HANDLE m_hServiceStatus; - SERVICE_STATUS m_status; - BOOL m_bService; - DWORD m_dwThreadID; -}; - -#endif // _ATL_NO_SERVICE - -#endif // !_AFX - -#ifdef _AFX - -class CAtlMfcModule : public ATL::CAtlModuleT -{ -public : - virtual LONG Lock() throw() - { -#ifdef _USRDLL - AFX_MANAGE_STATE(AfxGetStaticModuleState()); -#endif - AfxOleLockApp(); - return AfxGetModuleState()->m_nObjectCount; - } - - virtual LONG Unlock() throw() - { -#ifdef _USRDLL - AFX_MANAGE_STATE(AfxGetStaticModuleState()); -#endif - AfxOleUnlockApp(); - return AfxGetModuleState()->m_nObjectCount; - } - - virtual LONG GetLockCount() throw() - { -#ifdef _USRDLL - AFX_MANAGE_STATE(AfxGetStaticModuleState()); -#endif - return AfxGetModuleState()->m_nObjectCount; - } - - // Obtain a Class Factory (DLL only) - HRESULT GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) - { - return ATL::AtlComModuleGetClassObject(&ATL::_AtlComModule, rclsid, riid, ppv); - } - - // Register/Revoke All Class Factories with the OS (EXE only) - HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) - { - return ATL::AtlComModuleRegisterClassObjects(&ATL::_AtlComModule, dwClsContext, dwFlags); - } - - HRESULT RevokeClassObjects() - { - return ATL::AtlComModuleRevokeClassObjects(&ATL::_AtlComModule); - } -}; - -#endif // _AFX - -///////////////////////////////////////////////////////////////////////////// -// CComModule - Uses the functionality provided by other modules - -#define THREADFLAGS_APARTMENT 0x1 -#define THREADFLAGS_BOTH 0x2 -#define AUTPRXFLAG 0x4 - -#ifndef _ATL_NO_COMMODULE - -class CComModule; - -#if !defined(_ATL_NATIVE_INITIALIZATION) - -#if (_MSC_VER >= 1400) -#pragma managed(push, off) -#else -#pragma unmanaged -#endif - -#pragma warning(push) -#pragma warning(disable:4483) -namespace __identifier("") -#pragma warning(pop) -{ - struct CComModuleHelper - { - CComModule* Module; - HINSTANCE Instance; - _ATL_OBJMAP_ENTRY* ObjectMap; - const GUID* LibraryId; - - // Must NOT have any constructors - // We initialize the object in DllMain *before* - // the constructors would run. - - void Initialize(CComModule* pModule, HINSTANCE hInstance, _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID) - { - Module = pModule; - Instance = hInstance; - ObjectMap = pObjMap; - LibraryId = pLibID; - } - }; - - __declspec(selectany) CComModuleHelper ComModuleHelper; - __declspec(selectany) bool ComModuleInitialized = false; -} - -#if (_MSC_VER >= 1400) -#pragma managed(pop) -#else -#pragma managed -#endif - -#endif - - -__declspec(selectany) CComModule* _pModule = NULL; -class CComModule : public CAtlModuleT -{ -public : - - CComModule() - { - // Should have only one instance of a class - // derived from CComModule in a project. - ATLASSERT(_pModule == NULL); - _pModule = this; -#if !defined(_ATL_NATIVE_INITIALIZATION) -#pragma warning(push) -#pragma warning(disable:4483) - using namespace __identifier(""); -#pragma warning(pop) - ATLASSERT(ComModuleInitialized == false); - // If ComModuleHelper.Module == NULL it mean that DllMain has not been called, so we assume CComModule lives in - // an exe and not in a dll - if (ComModuleHelper.Module != NULL) - { - ATLASSERT(ComModuleHelper.Module == this); - _DllMain(ComModuleHelper.Instance, DLL_PROCESS_ATTACH, NULL, ComModuleHelper.ObjectMap, ComModuleHelper.LibraryId); - } - ComModuleInitialized = true; -#endif - } - - ~CComModule() - { -#if !defined(_ATL_NATIVE_INITIALIZATION) -#pragma warning(push) -#pragma warning(disable:4483) - using namespace __identifier(""); -#pragma warning(pop) - ATLASSERT(ComModuleInitialized == true); - // If ComModuleHelper.Module == NULL it mean that DllMain has not been called, so we assume CComModule lives in - // an exe and not in a dll - if (ComModuleHelper.Module != NULL) - { - ATLASSERT(ComModuleHelper.Module == this); - _DllMain(ComModuleHelper.Instance, DLL_PROCESS_DETACH, NULL, ComModuleHelper.ObjectMap, ComModuleHelper.LibraryId); - } -#endif - } - - __declspec(property(get = get_m_hInst)) HINSTANCE m_hInst; - HINSTANCE& get_m_hInst() const throw() - { - return _AtlBaseModule.m_hInst; - } - - __declspec(property(get = get_m_hInstResource, put = put_m_hInstResource)) HINSTANCE m_hInstResource; - HINSTANCE& get_m_hInstResource() const throw() - { - return _AtlBaseModule.m_hInstResource; - } - void put_m_hInstResource(HINSTANCE h) throw() - { - _AtlBaseModule.SetResourceInstance(h); - } - HINSTANCE SetResourceInstance(HINSTANCE h) throw() - { - return _AtlBaseModule.SetResourceInstance(h); - } - - HINSTANCE GetModuleInstance() throw() - { - return _AtlBaseModule.m_hInst; - } - HINSTANCE GetResourceInstance() throw() - { - return _AtlBaseModule.m_hInstResource; - } - - __declspec(property(get = get_m_hInstTypeLib, put = put_m_hInstTypeLib)) HINSTANCE m_hInstTypeLib; - HINSTANCE& get_m_hInstTypeLib() const throw() - { - return _AtlComModule.m_hInstTypeLib; - } - void put_m_hInstTypeLib(HINSTANCE h) throw() - { - _AtlComModule.m_hInstTypeLib = h; - } - - HINSTANCE GetTypeLibInstance() const throw() - { - return _AtlComModule.m_hInstTypeLib; - } - - // For Backward compatibility - _ATL_OBJMAP_ENTRY* m_pObjMap; - - __declspec(property(get = get_m_csWindowCreate)) CRITICAL_SECTION m_csWindowCreate; - CRITICAL_SECTION& get_m_csWindowCreate() throw(); - - __declspec(property(get = get_m_csObjMap)) CRITICAL_SECTION m_csObjMap; - CRITICAL_SECTION& get_m_csObjMap() throw(); - - __declspec(property(get = get_m_csStaticDataInit)) CRITICAL_SECTION m_csTypeInfoHolder; - __declspec(property(get = get_m_csStaticDataInit)) CRITICAL_SECTION m_csStaticDataInit; - CRITICAL_SECTION& get_m_csStaticDataInit() throw(); - void EnterStaticDataCriticalSection() throw() - { - EnterCriticalSection(&m_csStaticDataInit); - } - - void LeaveStaticDataCriticalSection() throw() - { - LeaveCriticalSection(&m_csStaticDataInit); - } - - __declspec(property(get = get_dwAtlBuildVer)) DWORD dwAtlBuildVer; - DWORD& get_dwAtlBuildVer() throw() - { - return _AtlBaseModule.dwAtlBuildVer; - } - - __declspec(property(get = get_m_pCreateWndList, put = put_m_pCreateWndList)) _AtlCreateWndData* m_pCreateWndList; - _AtlCreateWndData*& get_m_pCreateWndList() throw(); - void put_m_pCreateWndList(_AtlCreateWndData* p) throw(); - - __declspec(property(get = get_pguidVer)) const GUID* pguidVer; - const GUID*& get_pguidVer() throw() - { - return _AtlBaseModule.pguidVer; - } - -#ifdef _ATL_DEBUG_INTERFACES - - __declspec(property(get = get_m_nIndexQI, put = put_m_nIndexQI)) UINT m_nIndexQI; - UINT& get_m_nIndexQI() throw(); - void put_m_nIndexQI(UINT nIndex) throw(); - - __declspec(property(get = get_m_nIndexBreakAt, put = put_m_nIndexBreakAt)) UINT m_nIndexBreakAt; - UINT& get_m_nIndexBreakAt() throw(); - void put_m_nIndexBreakAt(UINT nIndex) throw(); - - __declspec(property(get = get_m_paThunks)) CSimpleArray<_QIThunk*>* m_paThunks; - CSimpleArray<_QIThunk*>* get_m_paThunks() throw(); - HRESULT AddThunk(IUnknown** pp, LPCTSTR lpsz, REFIID iid) throw(); - - HRESULT AddNonAddRefThunk(IUnknown* p, LPCTSTR lpsz, IUnknown** ppThunkRet) throw(); - void DeleteNonAddRefThunk(IUnknown* pUnk) throw(); - void DeleteThunk(_QIThunk* p) throw(); - bool DumpLeakedThunks() throw(); -#endif // _ATL_DEBUG_INTERFACES - - HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = NULL) throw(); - void Term() throw(); - - HRESULT GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) throw(); - // Register/Revoke All Class Factories with the OS (EXE only) - HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw(); - HRESULT RevokeClassObjects() throw(); - // Registry support (helpers) - HRESULT RegisterTypeLib() throw(); - HRESULT RegisterTypeLib(LPCTSTR lpszIndex) throw(); - HRESULT UnRegisterTypeLib() throw(); - HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex) throw(); - HRESULT RegisterServer(BOOL bRegTypeLib = FALSE, const CLSID* pCLSID = NULL) throw(); - HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = NULL) throw(); - HRESULT UnregisterServer(const CLSID* pCLSID = NULL) throw(); - - void AddCreateWndData(_AtlCreateWndData* pData, void* pObject) throw() - { - _AtlWinModule.AddCreateWndData(pData, pObject); - } - - void* ExtractCreateWndData() throw() - { - return _AtlWinModule.ExtractCreateWndData(); - } - - // Only used in CComAutoThreadModule - HRESULT CreateInstance(void* /*pfnCreateInstance*/, REFIID /*riid*/, void** /*ppvObj*/) throw() - { - ATLASSERT(0); - ATLTRACENOTIMPL(_T("CComModule::CreateInstance")); - } - - HRESULT RegisterAppId(LPCTSTR pAppId); - HRESULT UnregisterAppId(LPCTSTR pAppId); - - // Resource-based Registration - virtual HRESULT WINAPI UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw() - { -#if defined(_ATL_STATIC_REGISTRY) - (lpszRes); - (bRegister); - (pMapEntries); - return E_FAIL; -#else - return CAtlModuleT::UpdateRegistryFromResourceD(lpszRes, bRegister, pMapEntries); -#endif - } - virtual HRESULT WINAPI UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw() - { -#if defined(_ATL_STATIC_REGISTRY) - (nResID); - (bRegister); - (pMapEntries); - return E_FAIL; -#else - return CAtlModuleT::UpdateRegistryFromResourceD(nResID, bRegister, pMapEntries); -#endif - } - - - // Statically linking to Registry Ponent - virtual HRESULT WINAPI UpdateRegistryFromResourceS(LPCTSTR lpszRes, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw() - { -#ifdef _ATL_STATIC_REGISTRY - return CAtlModuleT::UpdateRegistryFromResourceS(lpszRes, bRegister, pMapEntries); -#else - (lpszRes); - (bRegister); - (pMapEntries); - return E_FAIL; -#endif - } - virtual HRESULT WINAPI UpdateRegistryFromResourceS(UINT nResID, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries = NULL) throw() - { -#ifdef _ATL_STATIC_REGISTRY - return CAtlModuleT::UpdateRegistryFromResourceS(nResID, bRegister, pMapEntries); -#else - (nResID); - (bRegister); - (pMapEntries); - return E_FAIL; -#endif - } - - - // Use RGS file for registration - - ATL_DEPRECATED("CComModule::RegisterProgID is no longer recommended. Instead, use an RGS file for registration.") - static HRESULT RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc); - // Standard Registration - ATL_DEPRECATED("CComModule::UpdateRegistryClass is no longer recommended. Instead, use an RGS file for registration.") - HRESULT WINAPI UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister); - ATL_DEPRECATED("CComModule::UpdateRegistryClass is no longer recommended. Instead, use an RGS file for registration.") - HRESULT WINAPI UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags, BOOL bRegister); - ATL_DEPRECATED("CComModule::RegisterClassHelper is no longer recommended. Instead, use an RGS file for registration.") - HRESULT WINAPI RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags); - ATL_DEPRECATED("CComModule::UnregisterClassHelper is no longer recommended. Instead, use an RGS file for registration.") - HRESULT WINAPI UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID); - - BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /* lpReserved */, _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID); - - BOOL WINAPI _DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /* lpReserved */, _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID) - { - if (dwReason == DLL_PROCESS_ATTACH) - { - if (CAtlBaseModule::m_bInitFailed) - { - ATLASSERT(0); - return FALSE; - } - - if (FAILED(Init(pObjMap, hInstance, pLibID))) - { - Term(); - return FALSE; - } -#ifdef _ATL_MIN_CRT - DisableThreadLibraryCalls(hInstance); -#endif - } - else if (dwReason == DLL_PROCESS_DETACH) - Term(); - return TRUE; // ok - } - - HRESULT DllCanUnloadNow() throw() - { - return (GetLockCount()==0) ? S_OK : S_FALSE; - } - HRESULT DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) throw() - { - return GetClassObject(rclsid, riid, ppv); - } - - HRESULT DllRegisterServer(BOOL bRegTypeLib = TRUE) throw() - { - // registers object, typelib and all interfaces in typelib - return RegisterServer(bRegTypeLib); - } - - HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = TRUE) throw() - { - return UnregisterServer(bUnRegTypeLib); - } - -}; - - -#if (_MSC_VER >= 1400) -#pragma managed(push, off) -#else -#pragma unmanaged -#endif - -inline BOOL WINAPI CComModule::DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved, _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID) -{ -#if !defined(_ATL_NATIVE_INITIALIZATION) -#pragma warning(push) -#pragma warning(disable:4483) - using namespace __identifier(""); -#pragma warning(pop) - lpReserved; - if (dwReason == DLL_PROCESS_ATTACH) - { - ATLASSERT(ComModuleInitialized == false); - ComModuleHelper.Initialize(this, hInstance, pObjMap, pLibID); - } - return TRUE; -#else - return _DllMain(hInstance, dwReason, lpReserved, pObjMap, pLibID); -#endif -} - - -#if (_MSC_VER >= 1400) -#pragma managed(pop) -#else -#pragma managed -#endif - -#endif // !_ATL_NO_COMMODULE - -///////////////////////////////////////////////////////////////////////////// -// Thread creation helpers - -#if !defined(_ATL_MIN_CRT) && defined(_MT) -// CRTThreadTraits -// This class is for use with CThreadPool or CWorkerThread -// It should be used if the worker class will use CRT -// functions. -class CRTThreadTraits -{ -public: - static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw() - { - ATLASSERT(sizeof(DWORD) == sizeof(unsigned int)); // sanity check for pdwThreadId - - // _beginthreadex calls CreateThread which will set the last error value before it returns. - return (HANDLE) _beginthreadex(lpsa, dwStackSize, (unsigned int (__stdcall *)(void *)) pfnThreadProc, pvParam, dwCreationFlags, (unsigned int *) pdwThreadId); - } -}; - -#endif - -// Win32ThreadTraits -// This class is for use with CThreadPool or CWorkerThread -// It should be used if the worker class will not use CRT -// functions. -class Win32ThreadTraits -{ -public: - static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw() - { - return ::CreateThread(lpsa, dwStackSize, pfnThreadProc, pvParam, dwCreationFlags, pdwThreadId); - } -}; - -#if !defined(_ATL_MIN_CRT) && defined(_MT) - typedef CRTThreadTraits DefaultThreadTraits; -#else - typedef Win32ThreadTraits DefaultThreadTraits; -#endif - -template -HANDLE CreateThreadT(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, DWORD (WINAPI * pfn)(T *pparam), - T *pparam, DWORD dwCreationFlags, LPDWORD pdw) -{ - return DefaultThreadTraits::CreateThread(lpsa, - dwStackSize, - (LPTHREAD_START_ROUTINE)pfn, - pparam, - dwCreationFlags, - pdw); -} - -template -HANDLE AtlCreateThread(DWORD (WINAPI* pfn)(T *pparam), T *pparam) -{ - return CreateThreadT(0, 0, pfn, pparam, 0, 0); -} - -///////////////////////////////////////////////////////////////////////////////////////////// -// Thread Pooling classes - -class _AtlAptCreateObjData -{ -public: - _ATL_CREATORFUNC* pfnCreateInstance; - const IID* piid; - HANDLE hEvent; - LPSTREAM pStream; - HRESULT hRes; -}; - -class CComApartment -{ -public: - CComApartment() - { - m_nLockCnt = 0; - m_hThread = NULL; - } - static UINT ATL_CREATE_OBJECT; - static DWORD WINAPI _Apartment(__in void* pv) - { - ATLENSURE(pv != NULL); - return ((CComApartment*)pv)->Apartment(); - } - DWORD Apartment() - { - CoInitialize(NULL); - MSG msg; - while(GetMessage(&msg, 0, 0, 0) > 0) - { - if (msg.message == ATL_CREATE_OBJECT) - { - _AtlAptCreateObjData* pdata = (_AtlAptCreateObjData*)msg.lParam; - IUnknown* pUnk = NULL; - pdata->hRes = pdata->pfnCreateInstance(NULL, __uuidof(IUnknown), (void**)&pUnk); - if (SUCCEEDED(pdata->hRes)) - pdata->hRes = CoMarshalInterThreadInterfaceInStream(*pdata->piid, pUnk, &pdata->pStream); - if (SUCCEEDED(pdata->hRes)) - { - pUnk->Release(); - ATLTRACE(atlTraceCOM, 2, _T("Object created on thread = %d\n"), GetCurrentThreadId()); - } -#ifdef _DEBUG - else - { - ATLTRACE(atlTraceCOM, 2, _T("Failed to create Object on thread = %d\n"), GetCurrentThreadId()); - } -#endif - SetEvent(pdata->hEvent); - } - DispatchMessage(&msg); - } - CoUninitialize(); - - return 0; - } - LONG Lock() {return CComGlobalsThreadModel::Increment(&m_nLockCnt);} - LONG Unlock(){return CComGlobalsThreadModel::Decrement(&m_nLockCnt); - } - LONG GetLockCount() {return m_nLockCnt;} - - DWORD m_dwThreadID; - HANDLE m_hThread; - LONG m_nLockCnt; -}; - -__declspec(selectany) UINT CComApartment::ATL_CREATE_OBJECT = 0; - -class CComSimpleThreadAllocator -{ -public: - CComSimpleThreadAllocator() - { - m_nThread = 0; - } - int GetThread(CComApartment* /*pApt*/, int nThreads) - { - if (++m_nThread == nThreads) - m_nThread = 0; - return m_nThread; - } - int m_nThread; -}; - -__interface IAtlAutoThreadModule -{ - virtual HRESULT CreateInstance(void* pfnCreateInstance, REFIID riid, void** ppvObj); -}; - -__declspec(selectany) IAtlAutoThreadModule* _pAtlAutoThreadModule; - -template -class ATL_NO_VTABLE CAtlAutoThreadModuleT : public IAtlAutoThreadModule -{ -// This class is not for use in a DLL. -// If this class were used in a DLL, there will be a deadlock when the DLL is unloaded. -// because of dwWait's default value of INFINITE -public: - CAtlAutoThreadModuleT(int nThreads = T::GetDefaultThreads()) - { - ATLASSERT(_pAtlAutoThreadModule == NULL); - _pAtlAutoThreadModule = this; - m_pApartments = NULL; - m_nThreads= 0; - - ATLTRY(m_pApartments = new CComApartment[nThreads]); - ATLASSERT(m_pApartments != NULL); - if(m_pApartments == NULL) - { - CAtlBaseModule::m_bInitFailed = true; - ATLENSURE(0); - } - - memset(m_pApartments, 0, sizeof(CComApartment) * nThreads); - - m_nThreads = nThreads; - for (int i = 0; i < nThreads; i++) - { - -#if !defined(_ATL_MIN_CRT) && defined(_MT) - typedef unsigned ( __stdcall *pfnThread )( void * ); - m_pApartments[i].m_hThread = (HANDLE)_beginthreadex(NULL, 0, (pfnThread)CComApartment::_Apartment, &m_pApartments[i], 0, (UINT*)&m_pApartments[i].m_dwThreadID); - if (m_pApartments[i].m_hThread == NULL) - { - HRESULT hr = E_FAIL; - switch (Checked::get_errno()) - { - case EAGAIN: - hr = HRESULT_FROM_WIN32(ERROR_TOO_MANY_TCBS); - break; - case EINVAL: - hr = E_INVALIDARG; - break; - } - ATLASSERT(0); - CAtlBaseModule::m_bInitFailed = true; - break; - } - -#else - m_pApartments[i].m_hThread = ::CreateThread(NULL, 0, CComApartment::_Apartment, (void*)&m_pApartments[i], 0, &m_pApartments[i].m_dwThreadID); - // clean up allocated threads - if (m_pApartments[i].m_hThread == NULL) - { - ATLASSERT(0); - CAtlBaseModule::m_bInitFailed = true; - break; - } - -#endif - - } - if (!CAtlBaseModule::m_bInitFailed) - CComApartment::ATL_CREATE_OBJECT = RegisterWindowMessage(_T("ATL_CREATE_OBJECT")); - } - - virtual ~CAtlAutoThreadModuleT() - { - if (m_pApartments == NULL) - return; - - DWORD dwCurrentThreadId = GetCurrentThreadId(); - int nCurrentThread = -1; - for (int i=0; i < m_nThreads; i++) - { - if (m_pApartments[i].m_hThread == NULL) - continue; - if (m_pApartments[i].m_dwThreadID == dwCurrentThreadId) - { - nCurrentThread = i; - continue; - } - while (::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT, 0, 0) == 0) - { - if (GetLastError() == ERROR_INVALID_THREAD_ID) - { - ATLASSERT(FALSE); - break; - } - ::Sleep(100); - } - ::WaitForSingleObject(m_pApartments[i].m_hThread, dwWait); - CloseHandle(m_pApartments[i].m_hThread); - } - if (nCurrentThread != -1) - CloseHandle(m_pApartments[nCurrentThread].m_hThread); - - delete [] m_pApartments; - m_pApartments = NULL; - } - - HRESULT CreateInstance(void* pfnCreateInstance, REFIID riid, void** ppvObj) - { - ATLASSERT(ppvObj != NULL); - if (ppvObj == NULL) - return E_POINTER; - *ppvObj = NULL; - - _ATL_CREATORFUNC* pFunc = (_ATL_CREATORFUNC*) pfnCreateInstance; - _AtlAptCreateObjData data; - data.pfnCreateInstance = pFunc; - data.piid = &riid; - data.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - data.hRes = S_OK; - int nThread = m_Allocator.GetThread(m_pApartments, m_nThreads); - int nIterations = 0; - while(::PostThreadMessage(m_pApartments[nThread].m_dwThreadID, CComApartment::ATL_CREATE_OBJECT, 0, (LPARAM)&data) == 0 && ++nIterations < 100) - { - Sleep(100); - } - if (nIterations < 100) - { - AtlWaitWithMessageLoop(data.hEvent); - } - else - { - data.hRes = AtlHresultFromLastError(); - } - CloseHandle(data.hEvent); - if (SUCCEEDED(data.hRes)) - data.hRes = CoGetInterfaceAndReleaseStream(data.pStream, riid, ppvObj); - return data.hRes; - } - DWORD dwThreadID; - int m_nThreads; - CComApartment* m_pApartments; - ThreadAllocator m_Allocator; - static int GetDefaultThreads() - { - SYSTEM_INFO si; - GetSystemInfo(&si); - return si.dwNumberOfProcessors * 4; - } -}; - -class CAtlAutoThreadModule : public CAtlAutoThreadModuleT -{ -public : -}; - -#ifndef _ATL_NO_COMMODULE - -template -class CComAutoThreadModule : - public CComModule, - public CAtlAutoThreadModuleT, ThreadAllocator, dwWait> -{ -public: - CComAutoThreadModule(int nThreads = GetDefaultThreads()) : - CAtlAutoThreadModuleT, ThreadAllocator, dwWait>(nThreads) - { - } - HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = NULL, int nThreads = GetDefaultThreads()) - { - nThreads; - ATLASSERT(nThreads == GetDefaultThreads() && _T("Set number of threads through the constructor")); - return CComModule::Init(p, h, plibid); - } -}; - -#endif // !_ATL_NO_COMMODULE - -// Used in CThreadPool -class Win32WaitTraits -{ -public: - static DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwTimeout) - { - return ::WaitForSingleObject(hHandle, dwTimeout); - } -}; - -typedef Win32WaitTraits DefaultWaitTraits; - -///////////////////////////////////////////////////////////////////////////// -// GIT Pointer - -template -class CComGITPtr -{ -public: - CComGITPtr() throw() - { - m_dwCookie = 0; - } - CComGITPtr(T* p) - { - m_dwCookie = 0; - HRESULT hr = Attach(p); - - if (FAILED(hr)) - AtlThrow(hr); - } - CComGITPtr(const CComGITPtr& git) - { - m_dwCookie = 0; - CComPtr spT; - - HRESULT hr = git.CopyTo(&spT); - if (SUCCEEDED(hr)) - hr = Attach(spT); - - if (FAILED(hr)) - AtlThrow(hr); - } - explicit CComGITPtr(DWORD dwCookie) throw() - { - ATLASSUME(m_dwCookie != NULL); - m_dwCookie = dwCookie; - -#ifdef _DEBUG - CComPtr spT; - HRESULT hr = CopyTo(&spT); - ATLASSERT(SUCCEEDED(hr)); -#endif - } - - ~CComGITPtr() throw() - { - Revoke(); - } - CComGITPtr& operator=(const CComGITPtr& git) - { - if(*this!=git) - { - CComPtr spT; - - HRESULT hr = git.CopyTo(&spT); - if (SUCCEEDED(hr)) - { - hr = Attach(spT); - } - - if (FAILED(hr)) - { - AtlThrow(hr); - } - } - return *this; - } - CComGITPtr& operator=(T* p) - { - HRESULT hr = Attach(p); - if (FAILED(hr)) - AtlThrow(hr); - return *this; - } - CComGITPtr& operator=(DWORD dwCookie) - { - if(*this!=dwCookie) - { - HRESULT hr = Attach(dwCookie); - if (FAILED(hr)) - { - AtlThrow(hr); - } - - m_dwCookie = dwCookie; - -#ifdef _DEBUG - CComPtr spT; - hr = CopyTo(&spT); - ATLASSERT(SUCCEEDED(hr)); -#endif - } - return *this; - } - - // basic comparison operators - bool operator!=(CComGITPtr& git) const - { - return !operator==(git); - } - - bool operator!=(DWORD dwCookie) const - { - return !operator==(dwCookie); - } - - bool operator==(CComGITPtr& git) const - { - return m_dwCookie==git.GetCookie(); - } - - bool operator==(DWORD dwCookie) const - { - return m_dwCookie==dwCookie; - } - - // Get the cookie from the class - operator DWORD() const - { - return m_dwCookie; - } - // Get the cookie from the class - DWORD GetCookie() const - { - return m_dwCookie; - } - // Register the passed interface pointer in the GIT - HRESULT Attach(T* p) throw() - { - CComPtr spGIT; - HRESULT hr = E_FAIL; - hr = AtlGetGITPtr(&spGIT); - ATLASSERT(spGIT != NULL); - ATLASSERT(SUCCEEDED(hr)); - if (FAILED(hr)) - return hr; - - if (m_dwCookie != 0) - hr = spGIT->RevokeInterfaceFromGlobal(m_dwCookie); - if (FAILED(hr)) - return hr; - - return spGIT->RegisterInterfaceInGlobal(p, __uuidof(T), &m_dwCookie); - } - - HRESULT Attach(DWORD dwCookie) throw() - { - ATLASSERT(dwCookie != NULL); - HRESULT hr = Revoke(); - if (FAILED(hr)) - return hr; - m_dwCookie = dwCookie; - return S_OK; - } - - // Detach - DWORD Detach() throw() - { - DWORD dwCookie = m_dwCookie; - m_dwCookie = NULL; - return dwCookie; - } - - // Remove the interface from the GIT - HRESULT Revoke() throw() - { - HRESULT hr = S_OK; - if (m_dwCookie != 0) - { - CComPtr spGIT; - HRESULT hr = E_FAIL; - hr = AtlGetGITPtr(&spGIT); - - ATLASSERT(spGIT != NULL); - ATLASSERT(SUCCEEDED(hr)); - if (FAILED(hr)) - return hr; - - hr = spGIT->RevokeInterfaceFromGlobal(m_dwCookie); - if (SUCCEEDED(hr)) - m_dwCookie = 0; - } - return hr; - } - // Get's the interface from the GIT and copies it to the passed pointer. The pointer - // must be released by the caller when finished. - HRESULT CopyTo(T** pp) const throw() - { - CComPtr spGIT; - HRESULT hr = E_FAIL; - hr = AtlGetGITPtr(&spGIT); - - ATLASSERT(spGIT != NULL); - ATLASSERT(SUCCEEDED(hr)); - if (FAILED(hr)) - return hr; - - ATLASSUME(m_dwCookie!=NULL); - return spGIT->GetInterfaceFromGlobal(m_dwCookie, __uuidof(T), (void**)pp); - } - DWORD m_dwCookie; -}; - -///////////////////////////////////////////////////////////////////////////// -// CRegKey - -typedef LONG (WINAPI _ATL_DELETEKEYEXFUNC)(HKEY hKey, LPCTSTR lpSubKey, REGSAM samDesired, DWORD Reserved); -typedef LONG (WINAPI _ATL_DELETEKEYFUNC)(HKEY hKey, LPCTSTR lpSubKey); - -class CRegKey -{ -public: - CRegKey() throw(); - CRegKey( CRegKey& key ) throw(); - explicit CRegKey(HKEY hKey) throw(); - ~CRegKey() throw(); - - CRegKey& operator=( CRegKey& key ) throw(); - -// Attributes -public: - operator HKEY() const throw(); - HKEY m_hKey; - -private: - _ATL_DELETEKEYEXFUNC* pfnDeleteKeyEx; - _ATL_DELETEKEYFUNC* pfnDeleteKey; - -// Operations -public: - ATL_DEPRECATED("CRegKey::SetValue(DWORD, TCHAR *valueName) has been superseded by CRegKey::SetDWORDValue") - LONG SetValue(DWORD dwValue, LPCTSTR lpszValueName); - ATL_DEPRECATED("CRegKey::SetValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::SetStringValue and CRegKey::SetMultiStringValue") - LONG SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL, bool bMulti = false, int nValueLen = -1); - LONG SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) throw(); - LONG SetGUIDValue(LPCTSTR pszValueName, REFGUID guidValue) throw(); - LONG SetBinaryValue(LPCTSTR pszValueName, const void* pValue, ULONG nBytes) throw(); - LONG SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) throw(); - LONG SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) throw(); - LONG SetStringValue(__in_z_opt LPCTSTR pszValueName, __in_z LPCTSTR pszValue, __in DWORD dwType = REG_SZ) throw(...); - LONG SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) throw(...); - - ATL_DEPRECATED("CRegKey::QueryValue(DWORD, TCHAR *valueName) has been superseded by CRegKey::QueryDWORDValue") - LONG QueryValue(__out DWORD& dwValue, __in_z_opt LPCTSTR lpszValueName); - ATL_DEPRECATED("CRegKey::QueryValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::QueryStringValue and CRegKey::QueryMultiStringValue") - LONG QueryValue(__out_ecount_part_z_opt(*pdwCount, *pdwCount) LPTSTR szValue, __in_z_opt LPCTSTR lpszValueName, __inout DWORD* pdwCount); - LONG QueryValue(__in_z_opt LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) throw(); - LONG QueryGUIDValue(__in_z_opt LPCTSTR pszValueName, GUID& guidValue) throw(); - LONG QueryBinaryValue(__in_z_opt LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) throw(); - LONG QueryDWORDValue(__in_z_opt LPCTSTR pszValueName, DWORD& dwValue) throw(); - LONG QueryQWORDValue(__in_z_opt LPCTSTR pszValueName, ULONGLONG& qwValue) throw(); - LONG QueryStringValue(__in_z_opt LPCTSTR pszValueName, __out_ecount_part_z_opt(*pnChars, *pnChars) LPTSTR pszValue, __inout ULONG* pnChars) throw(); - - LONG QueryMultiStringValue(__in_z_opt LPCTSTR pszValueName, __out_ecount_part_z_opt(*pnChars, *pnChars) __out_z LPTSTR pszValue, __inout ULONG* pnChars) throw(); - - // Get the key's security attributes. - LONG GetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd, LPDWORD pnBytes) throw(); - // Set the key's security attributes. - LONG SetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd) throw(); - - LONG SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL) throw(); - static LONG WINAPI SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName, - LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL); - - // Create a new registry key (or open an existing one). - LONG Create(__in HKEY hKeyParent, __in_z LPCTSTR lpszKeyName, - __in_z_opt LPTSTR lpszClass = REG_NONE, __in DWORD dwOptions = REG_OPTION_NON_VOLATILE, - __in REGSAM samDesired = KEY_READ | KEY_WRITE, - __in_opt LPSECURITY_ATTRIBUTES lpSecAttr = NULL, - __in_opt LPDWORD lpdwDisposition = NULL) throw(); - // Open an existing registry key. - LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName, - REGSAM samDesired = KEY_READ | KEY_WRITE) throw(); - // Close the registry key. - LONG Close() throw(); - // Flush the key's data to disk. - LONG Flush() throw(); - - // Detach the CRegKey object from its HKEY. Releases ownership. - HKEY Detach() throw(); - // Attach the CRegKey object to an existing HKEY. Takes ownership. - void Attach(HKEY hKey) throw(); - - // Enumerate the subkeys of the key. - LONG EnumKey(__in DWORD iIndex, __out_ecount_part_z(*pnNameLength, *pnNameLength) LPTSTR pszName, __inout LPDWORD pnNameLength, __out_opt FILETIME* pftLastWriteTime = NULL) throw(); - LONG NotifyChangeKeyValue(BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL bAsync = TRUE) throw(); - - LONG DeleteSubKey(LPCTSTR lpszSubKey) throw(); - LONG RecurseDeleteKey(LPCTSTR lpszKey) throw(); - LONG DeleteValue(LPCTSTR lpszValue) throw(); -}; - -inline CRegKey::CRegKey() throw() : - m_hKey( NULL ), - pfnDeleteKeyEx( NULL ), - pfnDeleteKey( NULL ) -{ -} - -inline CRegKey::CRegKey( CRegKey& key ) throw() : - m_hKey( NULL ), - pfnDeleteKeyEx( NULL ), - pfnDeleteKey( NULL ) -{ - Attach( key.Detach() ); -} - -inline CRegKey::CRegKey(HKEY hKey) throw() : - m_hKey(hKey), - pfnDeleteKeyEx( NULL ), - pfnDeleteKey( NULL ) -{ -} - -inline CRegKey::~CRegKey() throw() -{Close();} - -inline CRegKey& CRegKey::operator=( CRegKey& key ) throw() -{ - if(m_hKey!=key.m_hKey) - { - Close(); - Attach( key.Detach() ); - } - return( *this ); -} - -inline CRegKey::operator HKEY() const throw() -{return m_hKey;} - -inline HKEY CRegKey::Detach() throw() -{ - HKEY hKey = m_hKey; - m_hKey = NULL; - return hKey; -} - -inline void CRegKey::Attach(HKEY hKey) throw() -{ - ATLASSUME(m_hKey == NULL); - m_hKey = hKey; -} - -#pragma warning(push) -#pragma warning(disable : 4191) // 'type cast' : unsafe conversion from 'FARPROC' to 'ATL::_ATL_DELETEKEYEXFUNC' - -inline LONG CRegKey::DeleteSubKey(LPCTSTR lpszSubKey) throw() -{ - ATLASSUME(m_hKey != NULL); - - HINSTANCE hInstDLL = NULL; - - if (pfnDeleteKeyEx == NULL && pfnDeleteKey == NULL) - { - // No DLL loaded yet -- get the appropriate one for the current OS. - // Use GetModuleHandle rather than LoadLibrary for apiset dll - // for two reasons: - // - // 1. On Win7+, it will already be loaded into the process - // - // 2. It ensures that there is no opportunity to get a rogue - // "apiset dll" loaded on a down-level machine - - hInstDLL = ::GetModuleHandle(_T("API-MS-Win-Core-LocalRegistry-L1-1-0.dll")); - if (hInstDLL != NULL) - { -#ifdef UNICODE - pfnDeleteKeyEx = (_ATL_DELETEKEYEXFUNC*)GetProcAddress(hInstDLL, "RegDeleteKeyExW"); -#else - pfnDeleteKeyEx = (_ATL_DELETEKEYEXFUNC*)GetProcAddress(hInstDLL, "RegDeleteKeyExA"); -#endif - } - else - { - // No apiset dll, so load advapi32.dll instead. - // Note that this DLL is never unloaded for two reasons: - // - // 1. It is likely that the CRegKey destructor is called - // during DLL_PROCESS_ATTACH in multiple applications. - // - // 2. Whichever DLL is found (apiset dll or advapi32.dll) - // is almost guaranteed to be in use by other DLLs in the - // process, so the unload would have little (or no) effect. - - hInstDLL = ::LoadLibrary(_T("advapi32.dll")); - if (hInstDLL != NULL) - { -#ifdef UNICODE - pfnDeleteKey = (_ATL_DELETEKEYFUNC*)GetProcAddress(hInstDLL, "RegDeleteKeyW"); -#else - pfnDeleteKey = (_ATL_DELETEKEYFUNC*)GetProcAddress(hInstDLL, "RegDeleteKeyA"); -#endif - } - } - } - - if (pfnDeleteKeyEx != NULL) - { - return pfnDeleteKeyEx(m_hKey, lpszSubKey, 0, 0); - } - else if (pfnDeleteKey != NULL) - { - return pfnDeleteKey(m_hKey, lpszSubKey); - } - - // DLL loads failed - return GetLastError(); -} - -#pragma warning(pop) - -inline LONG CRegKey::DeleteValue(LPCTSTR lpszValue) throw() -{ - ATLASSUME(m_hKey != NULL); - return RegDeleteValue(m_hKey, (LPTSTR)lpszValue); -} - -inline LONG CRegKey::Close() throw() -{ - LONG lRes = ERROR_SUCCESS; - if (m_hKey != NULL) - { - lRes = RegCloseKey(m_hKey); - m_hKey = NULL; - } - return lRes; -} - -inline LONG CRegKey::Flush() throw() -{ - ATLASSUME(m_hKey != NULL); - - return ::RegFlushKey(m_hKey); -} - -inline LONG CRegKey::EnumKey(__in DWORD iIndex, __out_ecount_part_z(*pnNameLength, *pnNameLength) LPTSTR pszName, __inout LPDWORD pnNameLength, __out_opt FILETIME* pftLastWriteTime) throw() -{ - FILETIME ftLastWriteTime; - - ATLASSUME(m_hKey != NULL); - if (pftLastWriteTime == NULL) - { - pftLastWriteTime = &ftLastWriteTime; - } - - return ::RegEnumKeyEx(m_hKey, iIndex, pszName, pnNameLength, NULL, NULL, NULL, pftLastWriteTime); -} - -inline LONG CRegKey::NotifyChangeKeyValue(BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL bAsync) throw() -{ - ATLASSUME(m_hKey != NULL); - ATLASSERT((hEvent != NULL) || !bAsync); - - return ::RegNotifyChangeKeyValue(m_hKey, bWatchSubtree, dwNotifyFilter, hEvent, bAsync); -} - -inline LONG CRegKey::Create(__in HKEY hKeyParent, __in_z LPCTSTR lpszKeyName, - __in_z_opt LPTSTR lpszClass, __in DWORD dwOptions, __in REGSAM samDesired, - __in_opt LPSECURITY_ATTRIBUTES lpSecAttr, __in_opt LPDWORD lpdwDisposition) throw() -{ - ATLASSERT(hKeyParent != NULL); - DWORD dw; - HKEY hKey = NULL; - LONG lRes = RegCreateKeyEx(hKeyParent, lpszKeyName, 0, - lpszClass, dwOptions, samDesired, lpSecAttr, &hKey, &dw); - if (lpdwDisposition != NULL) - *lpdwDisposition = dw; - if (lRes == ERROR_SUCCESS) - { - lRes = Close(); - m_hKey = hKey; - } - return lRes; -} - -inline LONG CRegKey::Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired) throw() -{ - ATLASSERT(hKeyParent != NULL); - HKEY hKey = NULL; - LONG lRes = RegOpenKeyEx(hKeyParent, lpszKeyName, 0, samDesired, &hKey); - if (lRes == ERROR_SUCCESS) - { - lRes = Close(); - ATLASSERT(lRes == ERROR_SUCCESS); - m_hKey = hKey; - } - return lRes; -} - -#pragma warning(push) -#pragma warning(disable: 4996) -inline LONG CRegKey::QueryValue(DWORD& dwValue, LPCTSTR lpszValueName) -{ - DWORD dwType = NULL; - DWORD dwCount = sizeof(DWORD); - LONG lRes = RegQueryValueEx(m_hKey, lpszValueName, NULL, &dwType, - (LPBYTE)&dwValue, &dwCount); - ATLASSERT((lRes!=ERROR_SUCCESS) || (dwType == REG_DWORD)); - ATLASSERT((lRes!=ERROR_SUCCESS) || (dwCount == sizeof(DWORD))); - if (dwType != REG_DWORD) - return ERROR_INVALID_DATA; - return lRes; -} - -// -// [pfx_parse] - workaround for PREfix parse problem -// -#if ((defined(_PREFIX_)) || (defined(_PREFAST_))) && (_MSC_VER < 1400) - // do nothing, this pragma not understood by PREfix 5.1 -#else // !_PREFIX_ -#pragma warning(disable: 6053) -#endif //!_PREFIX_ - -inline LONG CRegKey::QueryValue(__out_ecount_part_z_opt(*pdwCount, *pdwCount) LPTSTR pszValue, __in_z_opt LPCTSTR lpszValueName, __inout DWORD* pdwCount) -{ - ATLENSURE(pdwCount != NULL); - DWORD dwType = NULL; - LONG lRes = RegQueryValueEx(m_hKey, lpszValueName, NULL, &dwType, (LPBYTE)pszValue, pdwCount); - ATLASSERT((lRes!=ERROR_SUCCESS) || (dwType == REG_SZ) || - (dwType == REG_MULTI_SZ) || (dwType == REG_EXPAND_SZ)); - if (pszValue != NULL) - { - if(*pdwCount>0) - { - switch(dwType) - { - case REG_SZ: - case REG_EXPAND_SZ: - if ((*pdwCount) % sizeof(TCHAR) != 0 || pszValue[(*pdwCount) / sizeof(TCHAR) - 1] != 0) - { - pszValue[0]=_T('\0'); - return ERROR_INVALID_DATA; - } - break; - case REG_MULTI_SZ: - if ((*pdwCount) % sizeof(TCHAR) != 0 || (*pdwCount) / sizeof(TCHAR) < 1 || pszValue[(*pdwCount) / sizeof(TCHAR) -1] != 0 || (((*pdwCount) / sizeof(TCHAR))>1 && pszValue[(*pdwCount) / sizeof(TCHAR) - 2] != 0) ) - { - pszValue[0]=_T('\0'); - return ERROR_INVALID_DATA; - } - break; - default: - // Ensure termination - pszValue[0]=_T('\0'); - return ERROR_INVALID_DATA; - } - } - else - { - // this is a blank one with no data yet - // Ensure termination - pszValue[0]=_T('\0'); - } - } - return lRes; -} -#pragma warning(pop) - -inline LONG CRegKey::QueryValue(LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) throw() -{ - ATLASSUME(m_hKey != NULL); - - return( ::RegQueryValueEx(m_hKey, pszValueName, NULL, pdwType, static_cast< LPBYTE >( pData ), pnBytes) ); -} - -inline LONG CRegKey::QueryDWORDValue(LPCTSTR pszValueName, DWORD& dwValue) throw() -{ - LONG lRes; - ULONG nBytes; - DWORD dwType; - - ATLASSUME(m_hKey != NULL); - - nBytes = sizeof(DWORD); - lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(&dwValue), - &nBytes); - if (lRes != ERROR_SUCCESS) - return lRes; - if (dwType != REG_DWORD) - return ERROR_INVALID_DATA; - - return ERROR_SUCCESS; -} -inline LONG CRegKey::QueryQWORDValue(LPCTSTR pszValueName, ULONGLONG& qwValue) throw() -{ - LONG lRes; - ULONG nBytes; - DWORD dwType; - - ATLASSUME(m_hKey != NULL); - - nBytes = sizeof(ULONGLONG); - lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(&qwValue), - &nBytes); - if (lRes != ERROR_SUCCESS) - return lRes; - if (dwType != REG_QWORD) - return ERROR_INVALID_DATA; - - return ERROR_SUCCESS; -} - -inline LONG CRegKey::QueryBinaryValue(LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) throw() -{ - LONG lRes; - DWORD dwType; - - ATLASSERT(pnBytes != NULL); - ATLASSUME(m_hKey != NULL); - - lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(pValue), - pnBytes); - if (lRes != ERROR_SUCCESS) - return lRes; - if (dwType != REG_BINARY) - return ERROR_INVALID_DATA; - - return ERROR_SUCCESS; -} - -#pragma warning(push) - -// -// [pfx_parse] - workaround for PREfix parse problem -// -#if ((defined(_PREFIX_)) || (defined(_PREFAST_))) && (_MSC_VER < 1400) - // do nothing, this pragma not understood by PREfix 5.1 -#else // !_PREFIX_ -#pragma warning(disable: 6053) -#endif //!_PREFIX_ - -/* prefast noise VSW 496818 */ -inline LONG CRegKey::QueryStringValue(__in_z_opt LPCTSTR pszValueName, __out_ecount_part_z_opt(*pnChars, *pnChars) __out_z LPTSTR pszValue, __inout ULONG* pnChars) throw() -{ - LONG lRes; - DWORD dwType; - ULONG nBytes; - - ATLASSUME(m_hKey != NULL); - ATLASSERT(pnChars != NULL); - - nBytes = (*pnChars)*sizeof(TCHAR); - *pnChars = 0; - lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(pszValue), - &nBytes); - - if (lRes != ERROR_SUCCESS) - { - return lRes; - } - - if(dwType != REG_SZ && dwType != REG_EXPAND_SZ) - { - return ERROR_INVALID_DATA; - } - - if (pszValue != NULL) - { - if(nBytes!=0) - { - if ((nBytes % sizeof(TCHAR) != 0) || (pszValue[nBytes / sizeof(TCHAR) -1] != 0)) - { - return ERROR_INVALID_DATA; - } - } - else - { - pszValue[0]=_T('\0'); - } - } - - *pnChars = nBytes/sizeof(TCHAR); - - return ERROR_SUCCESS; -} -#pragma warning(pop) - -#pragma warning(push) - -// -// [pfx_parse] - workaround for PREfix parse problem -// -#if ((defined(_PREFIX_)) || (defined(_PREFAST_))) && (_MSC_VER < 1400) - // do nothing, this pragma not understood by PREfix 5.1 -#else // !_PREFIX_ -#pragma warning(disable: 6053) -#endif // !_PREFIX_ - -/* prefast noise VSW 496818 */ -inline LONG CRegKey::QueryMultiStringValue(__in_z_opt LPCTSTR pszValueName, __out_ecount_part_z_opt(*pnChars, *pnChars) __out_z LPTSTR pszValue, __inout ULONG* pnChars) throw() -{ - LONG lRes; - DWORD dwType; - ULONG nBytes; - - ATLASSUME(m_hKey != NULL); - ATLASSERT(pnChars != NULL); - - if (pszValue != NULL && *pnChars < 2) - return ERROR_INSUFFICIENT_BUFFER; - - nBytes = (*pnChars)*sizeof(TCHAR); - *pnChars = 0; - - lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(pszValue), - &nBytes); - if (lRes != ERROR_SUCCESS) - return lRes; - if (dwType != REG_MULTI_SZ) - return ERROR_INVALID_DATA; - if (pszValue != NULL && (nBytes % sizeof(TCHAR) != 0 || nBytes / sizeof(TCHAR) < 1 || pszValue[nBytes / sizeof(TCHAR) -1] != 0 || ((nBytes/sizeof(TCHAR))>1 && pszValue[nBytes / sizeof(TCHAR) - 2] != 0))) - return ERROR_INVALID_DATA; - - *pnChars = nBytes/sizeof(TCHAR); - - return ERROR_SUCCESS; -} -#pragma warning(pop) - -inline LONG CRegKey::QueryGUIDValue(LPCTSTR pszValueName, GUID& guidValue) throw() -{ - TCHAR szGUID[64]; - LONG lRes; - ULONG nCount; - HRESULT hr; - - ATLASSUME(m_hKey != NULL); - - guidValue = GUID_NULL; - - nCount = 64; - lRes = QueryStringValue(pszValueName, szGUID, &nCount); - - if (lRes != ERROR_SUCCESS) - return lRes; - - if(szGUID[0] != _T('{')) - return ERROR_INVALID_DATA; - - USES_CONVERSION_EX; - LPOLESTR lpstr = T2OLE_EX(szGUID, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(lpstr == NULL) - return E_OUTOFMEMORY; -#endif - - hr = ::CLSIDFromString(lpstr, &guidValue); - if (FAILED(hr)) - return ERROR_INVALID_DATA; - - return ERROR_SUCCESS; -} - -inline LONG WINAPI CRegKey::SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName) -{ - ATLASSERT(lpszValue != NULL); - CRegKey key; - LONG lRes = key.Create(hKeyParent, lpszKeyName); - if (lRes == ERROR_SUCCESS) - lRes = key.SetStringValue(lpszValueName, lpszValue); - return lRes; -} - -inline LONG CRegKey::SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName) throw() -{ - ATLASSERT(lpszValue != NULL); - CRegKey key; - LONG lRes = key.Create(m_hKey, lpszKeyName); - if (lRes == ERROR_SUCCESS) - lRes = key.SetStringValue(lpszValueName, lpszValue); - return lRes; -} - -#pragma warning(push) -#pragma warning(disable: 4996) -inline LONG CRegKey::SetValue(DWORD dwValue, LPCTSTR pszValueName) -{ - ATLASSUME(m_hKey != NULL); - return SetDWORDValue(pszValueName, dwValue); -} - -inline LONG CRegKey::SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName, bool bMulti, int nValueLen) -{ - ATLENSURE(lpszValue != NULL); - ATLASSUME(m_hKey != NULL); - - if (bMulti && nValueLen == -1) - return ERROR_INVALID_PARAMETER; - - if (nValueLen == -1) - nValueLen = lstrlen(lpszValue) + 1; - - DWORD dwType = bMulti ? REG_MULTI_SZ : REG_SZ; - - return ::RegSetValueEx(m_hKey, lpszValueName, NULL, dwType, - reinterpret_cast(lpszValue), nValueLen*sizeof(TCHAR)); -} -#pragma warning(pop) - -inline LONG CRegKey::SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) throw() -{ - ATLASSUME(m_hKey != NULL); - return ::RegSetValueEx(m_hKey, pszValueName, NULL, dwType, static_cast(pValue), nBytes); -} - -inline LONG CRegKey::SetBinaryValue(LPCTSTR pszValueName, const void* pData, ULONG nBytes) throw() -{ - ATLASSUME(m_hKey != NULL); - return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_BINARY, reinterpret_cast(pData), nBytes); -} - -inline LONG CRegKey::SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) throw() -{ - ATLASSUME(m_hKey != NULL); - return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_DWORD, reinterpret_cast(&dwValue), sizeof(DWORD)); -} - -inline LONG CRegKey::SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) throw() -{ - ATLASSUME(m_hKey != NULL); - return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_QWORD, reinterpret_cast(&qwValue), sizeof(ULONGLONG)); -} - -inline LONG CRegKey::SetStringValue(__in_z_opt LPCTSTR pszValueName, __in_z LPCTSTR pszValue, __in DWORD dwType) throw(...) -{ - ATLASSUME(m_hKey != NULL); - ATLENSURE(pszValue != NULL); - ATLASSERT((dwType == REG_SZ) || (dwType == REG_EXPAND_SZ)); - - return ::RegSetValueEx(m_hKey, pszValueName, NULL, dwType, reinterpret_cast(pszValue), (lstrlen(pszValue)+1)*sizeof(TCHAR)); -} - -inline LONG CRegKey::SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) throw(...) -{ - LPCTSTR pszTemp; - ULONG nBytes; - ULONG nLength; - - ATLASSUME(m_hKey != NULL); - ATLENSURE(pszValue != NULL); - - // Find the total length (in bytes) of all of the strings, including the - // terminating '\0' of each string, and the second '\0' that terminates - // the list. - nBytes = 0; - pszTemp = pszValue; - do - { - nLength = lstrlen(pszTemp)+1; - pszTemp += nLength; - nBytes += nLength*sizeof(TCHAR); - } while (nLength != 1); - - return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_MULTI_SZ, reinterpret_cast(pszValue), - nBytes); -} - -inline LONG CRegKey::SetGUIDValue(LPCTSTR pszValueName, REFGUID guidValue) throw() -{ - OLECHAR szGUID[64]; - - ATLASSUME(m_hKey != NULL); - - ::StringFromGUID2(guidValue, szGUID, 64); - - USES_CONVERSION_EX; - LPCTSTR lpstr = OLE2CT_EX(szGUID, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(lpstr == NULL) - return E_OUTOFMEMORY; -#endif - return SetStringValue(pszValueName, lpstr); -} - -inline LONG CRegKey::GetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd, LPDWORD pnBytes) throw() -{ - ATLASSUME(m_hKey != NULL); - ATLASSERT(pnBytes != NULL); - - return ::RegGetKeySecurity(m_hKey, si, psd, pnBytes); -} - -inline LONG CRegKey::SetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd) throw() -{ - ATLASSUME(m_hKey != NULL); - ATLASSERT(psd != NULL); - - return ::RegSetKeySecurity(m_hKey, si, psd); -} - -inline LONG CRegKey::RecurseDeleteKey(LPCTSTR lpszKey) throw() -{ - CRegKey key; - LONG lRes = key.Open(m_hKey, lpszKey, KEY_READ | KEY_WRITE); - if (lRes != ERROR_SUCCESS) - { - if (lRes != ERROR_FILE_NOT_FOUND && lRes != ERROR_PATH_NOT_FOUND) - { - ATLTRACE(atlTraceCOM, 0, _T("CRegKey::RecurseDeleteKey : Failed to Open Key %s(Error = %d)\n"), lpszKey, lRes); - } - return lRes; - } - FILETIME time; - DWORD dwSize = 256; - TCHAR szBuffer[256]; - while (RegEnumKeyEx(key.m_hKey, 0, szBuffer, &dwSize, NULL, NULL, NULL, - &time)==ERROR_SUCCESS) - { - lRes = key.RecurseDeleteKey(szBuffer); - if (lRes != ERROR_SUCCESS) - return lRes; - dwSize = 256; - } - key.Close(); - return DeleteSubKey(lpszKey); -} - -#ifndef _ATL_NO_COMMODULE - -inline HRESULT CComModule::RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc) -{ - CRegKey keyProgID; - LONG lRes = keyProgID.Create(HKEY_CLASSES_ROOT, lpszProgID, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE); - if (lRes == ERROR_SUCCESS) - { - lRes = keyProgID.SetStringValue(NULL, lpszUserDesc); - if (lRes == ERROR_SUCCESS) - { - lRes = keyProgID.SetKeyValue(_T("CLSID"), lpszCLSID); - if (lRes == ERROR_SUCCESS) - return S_OK; - } - } - return AtlHresultFromWin32(lRes); -} - -inline HRESULT CComModule::RegisterAppId(LPCTSTR pAppId) -{ - CRegKey keyAppID; - HRESULT hr = S_OK; - LONG lRet; - - if ( (lRet = keyAppID.Open(HKEY_CLASSES_ROOT, _T("AppID"), KEY_WRITE)) == ERROR_SUCCESS) - { - TCHAR szModule1[MAX_PATH]; - TCHAR szModule2[MAX_PATH]; - TCHAR* pszFileName; - - DWORD dwFLen = ::GetModuleFileName(GetModuleInstance(), szModule1, MAX_PATH); - if ( dwFLen != 0 && dwFLen != MAX_PATH ) - { - if (::GetFullPathName(szModule1, MAX_PATH, szModule2, &pszFileName) != 0) - { - CRegKey keyAppIDEXE; - if ( (lRet = keyAppIDEXE.Create(keyAppID, pszFileName, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE)) == ERROR_SUCCESS) - { - lRet = keyAppIDEXE.SetStringValue(_T("AppID"), pAppId); - if (lRet != ERROR_SUCCESS) - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::RegisterAppId : Failed to set app id string value\n")); - hr = AtlHresultFromWin32(lRet); - return hr; - } - } - else - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::RegisterAppId : Failed to create file name key\n")); - hr = AtlHresultFromWin32(lRet); - return hr; - } - if ( (lRet = keyAppIDEXE.Create(keyAppID, pAppId, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE)) == ERROR_SUCCESS) - { - lRet = keyAppIDEXE.SetStringValue(NULL, pszFileName); - if (lRet != ERROR_SUCCESS) - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::RegisterAppId : Failed to set file name string value\n")); - hr = AtlHresultFromWin32(lRet); - return hr; - } - } - else - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::RegisterAppId : Failed to create app id key\n")); - hr = AtlHresultFromWin32(lRet); - return hr; - } - } - else - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::RegisterAppId : Failed to get full path name for file %s\n"), szModule1); - hr = AtlHresultFromLastError(); - } - } - else - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::RegisterAppId : Failed to get module name\n")); - if( dwFLen == 0 ) - hr = AtlHresultFromLastError(); - else if( dwFLen == MAX_PATH ) - hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - } - } - else - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::RegisterAppId : Failed to open registry key\n")); - hr = AtlHresultFromWin32(lRet); - } - return hr; -} - -inline HRESULT CComModule::UnregisterAppId(LPCTSTR pAppId) -{ - CRegKey keyAppID; - HRESULT hr = S_OK; - LONG lRet = keyAppID.Open(HKEY_CLASSES_ROOT, _T("AppID"), KEY_READ | KEY_WRITE); - - if (lRet == ERROR_SUCCESS) - { - TCHAR szModule1[MAX_PATH]; - TCHAR szModule2[MAX_PATH]; - TCHAR* pszFileName; - - DWORD dwFLen = ::GetModuleFileName(GetModuleInstance(), szModule1, MAX_PATH); - if ( dwFLen != 0 && dwFLen != MAX_PATH ) - { - if (::GetFullPathName(szModule1, MAX_PATH, szModule2, &pszFileName) != 0) - { - if ((lRet = keyAppID.RecurseDeleteKey(pAppId)) != ERROR_SUCCESS) - { - if (lRet != ERROR_FILE_NOT_FOUND) - hr = AtlHresultFromWin32(lRet); - } - if ((lRet = keyAppID.RecurseDeleteKey(pszFileName)) != ERROR_SUCCESS) - { - if (lRet != ERROR_FILE_NOT_FOUND) - hr = AtlHresultFromWin32(lRet); - } - } - else - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::UnregisterAppId : Failed to get full path name for file %s\n"), szModule1); - hr = AtlHresultFromLastError(); - } - } - else - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::UnregisterAppId : Failed to get module name\n")); - if( dwFLen == 0 ) - hr = AtlHresultFromLastError(); - else if( dwFLen == MAX_PATH ) - hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - } - } - else - { - if (lRet != ERROR_FILE_NOT_FOUND && lRet != ERROR_PATH_NOT_FOUND) - { - ATLTRACE(atlTraceCOM, 0, _T("CComModule::UnregisterAppId : Failed to open registry key\n")); - hr = AtlHresultFromWin32(lRet); - } - } - return hr; -} -#endif // !_ATL_NO_COMMODULE - -#ifdef _ATL_STATIC_REGISTRY -} // namespace ATL - - -#include - - - -namespace ATL -{ - -// Statically linking to Registry Ponent -inline HRESULT WINAPI CAtlModule::UpdateRegistryFromResourceS(LPCTSTR lpszRes, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries /*= NULL*/) throw() -{ - CRegObject ro; - HRESULT hr = ro.FinalConstruct(); - if (FAILED(hr)) - { - return hr; - } - - if (pMapEntries != NULL) - { - while (pMapEntries->szKey != NULL) - { - ATLASSERT(NULL != pMapEntries->szData); - ro.AddReplacement(pMapEntries->szKey, pMapEntries->szData); - pMapEntries++; - } - } - - hr = AddCommonRGSReplacements(&ro); - if (FAILED(hr)) - return hr; - - USES_CONVERSION_EX; - TCHAR szModule[MAX_PATH]; - HINSTANCE hInst = _AtlBaseModule.GetModuleInstance(); - DWORD dwFLen = GetModuleFileName(hInst, szModule, MAX_PATH); - if( dwFLen == 0 ) - return AtlHresultFromLastError(); - else if( dwFLen == MAX_PATH ) - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - - - LPOLESTR pszModule = NULL; - pszModule = T2OLE_EX(szModule, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(pszModule == NULL) - return E_OUTOFMEMORY; -#endif - - OLECHAR pszModuleUnquoted[_MAX_PATH * 2]; - EscapeSingleQuote(pszModuleUnquoted, _countof(pszModuleUnquoted), pszModule); - - HRESULT hRes; - if ((hInst == NULL) || (hInst == GetModuleHandle(NULL))) // register as EXE - { - // If Registering as an EXE, then we quote the resultant path. - // We don't do it for a DLL, because LoadLibrary fails if the path is - // quoted - OLECHAR pszModuleQuote[(_MAX_PATH + _ATL_QUOTES_SPACE)*2]; - pszModuleQuote[0] = OLESTR('\"'); - if(!ocscpy_s(pszModuleQuote + 1, (_MAX_PATH + _ATL_QUOTES_SPACE)*2 - 1, pszModuleUnquoted)) - { - return E_FAIL; - } - size_t nLen = ocslen(pszModuleQuote); - pszModuleQuote[nLen] = OLESTR('\"'); - pszModuleQuote[nLen + 1] = 0; - - hRes = ro.AddReplacement(OLESTR("Module"), pszModuleQuote); - } - else - { - hRes = ro.AddReplacement(OLESTR("Module"), pszModuleUnquoted); - } - - if(FAILED(hRes)) - return hRes; - - hRes = ro.AddReplacement(OLESTR("Module_Raw"), pszModuleUnquoted); - if(FAILED(hRes)) - return hRes; - - LPCOLESTR szType = OLESTR("REGISTRY"); - LPCOLESTR pszRes = T2COLE_EX(lpszRes, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(pszRes == NULL) - return E_OUTOFMEMORY; -#endif - hr = (bRegister) ? ro.ResourceRegisterSz(pszModule, pszRes, szType) : - ro.ResourceUnregisterSz(pszModule, pszRes, szType); - return hr; -} -inline HRESULT WINAPI CAtlModule::UpdateRegistryFromResourceS(UINT nResID, BOOL bRegister, - struct _ATL_REGMAP_ENTRY* pMapEntries /*= NULL*/) throw() -{ - CRegObject ro; - HRESULT hr = ro.FinalConstruct(); - if (FAILED(hr)) - { - return hr; - } - - if (pMapEntries != NULL) - { - while (pMapEntries->szKey != NULL) - { - ATLASSERT(NULL != pMapEntries->szData); - ro.AddReplacement(pMapEntries->szKey, pMapEntries->szData); - pMapEntries++; - } - } - - hr = AddCommonRGSReplacements(&ro); - if (FAILED(hr)) - return hr; - - USES_CONVERSION_EX; - TCHAR szModule[MAX_PATH]; - HINSTANCE hInst = _AtlBaseModule.GetModuleInstance(); - DWORD dwFLen = GetModuleFileName(hInst, szModule, MAX_PATH); - if( dwFLen == 0 ) - return AtlHresultFromLastError(); - else if( dwFLen == MAX_PATH ) - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - - LPOLESTR pszModule = NULL; - pszModule = T2OLE_EX(szModule, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(pszModule == NULL) - return E_OUTOFMEMORY; -#endif - - OLECHAR pszModuleUnquoted[_MAX_PATH * 2]; - EscapeSingleQuote(pszModuleUnquoted, _countof(pszModuleUnquoted), pszModule); - - HRESULT hRes; - if ((hInst == NULL) || (hInst == GetModuleHandle(NULL))) // register as EXE - { - // If Registering as an EXE, then we quote the resultant path. - // We don't do it for a DLL, because LoadLibrary fails if the path is - // quoted - OLECHAR pszModuleQuote[(_MAX_PATH + _ATL_QUOTES_SPACE)*2]; - pszModuleQuote[0] = OLESTR('\"'); - if(!ocscpy_s(pszModuleQuote + 1, (_MAX_PATH + _ATL_QUOTES_SPACE)*2 - 1, pszModuleUnquoted)) - { - return E_FAIL; - } - size_t nLen = ocslen(pszModuleQuote); - pszModuleQuote[nLen] = OLESTR('\"'); - pszModuleQuote[nLen + 1] = 0; - - hRes = ro.AddReplacement(OLESTR("Module"), pszModuleQuote); - } - else - { - hRes = ro.AddReplacement(OLESTR("Module"), pszModuleUnquoted); - } - - if(FAILED(hRes)) - return hRes; - - hRes = ro.AddReplacement(OLESTR("Module_Raw"), pszModuleUnquoted); - if(FAILED(hRes)) - return hRes; - - LPCOLESTR szType = OLESTR("REGISTRY"); - hr = (bRegister) ? ro.ResourceRegister(pszModule, nResID, szType) : - ro.ResourceUnregister(pszModule, nResID, szType); - return hr; -} -#endif //_ATL_STATIC_REGISTRY - -#ifndef _ATL_NO_COMMODULE - -#pragma warning( push ) -#pragma warning( disable: 4996 ) // Disable "deprecated symbol" warning - -inline HRESULT WINAPI CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, - LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister) -{ - if (bRegister) - { - TCHAR szDesc[256]; - LoadString(m_hInst, nDescID, szDesc, 256); - return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, szDesc, dwFlags); - } - return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID); -} - -inline HRESULT WINAPI CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, - LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags, BOOL bRegister) -{ - if (bRegister) - return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, szDesc, dwFlags); - return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID); -} - -inline HRESULT WINAPI CComModule::RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, - LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags) -{ - static const TCHAR szProgID[] = _T("ProgID"); - static const TCHAR szVIProgID[] = _T("VersionIndependentProgID"); - static const TCHAR szLS32[] = _T("LocalServer32"); - static const TCHAR szIPS32[] = _T("InprocServer32"); - static const TCHAR szThreadingModel[] = _T("ThreadingModel"); - static const TCHAR szAUTPRX32[] = _T("AUTPRX32.DLL"); - static const TCHAR szApartment[] = _T("Apartment"); - static const TCHAR szBoth[] = _T("both"); - USES_CONVERSION_EX; - TCHAR szModule[_MAX_PATH + _ATL_QUOTES_SPACE]; - - ATLENSURE(lpszProgID && lpszVerIndProgID || !lpszProgID && !lpszVerIndProgID); - - if (!szDesc) - { - szDesc = _T(""); - } - - // If the ModuleFileName's length is equal or greater than the 3rd parameter - // (length of the buffer passed),GetModuleFileName fills the buffer (truncates - // if neccessary), but doesn't null terminate it. It returns the same value as - // the 3rd parameter passed. So if the return value is the same as the 3rd param - // then you have a non null terminated buffer (which may or may not be truncated) - // We pass (szModule + 1) because in case it's an EXE we need to quote the PATH - // The quote is done later in this method before the SetKeyValue is called - DWORD dwLen = GetModuleFileName(m_hInst, szModule + 1, MAX_PATH); - if (dwLen == 0) - { - return AtlHresultFromLastError(); - } - else if( dwLen == MAX_PATH ) - { - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - } - - LPOLESTR lpOleStr; - HRESULT hRes = StringFromCLSID(clsid, &lpOleStr); - if (FAILED(hRes)) - return hRes; - - LPTSTR lpszCLSID = OLE2T_EX(lpOleStr, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(lpszCLSID == NULL) - { - CoTaskMemFree(lpOleStr); - return E_OUTOFMEMORY; - } -#endif - - hRes = lpszProgID ? RegisterProgID(lpszCLSID, lpszProgID, szDesc) : S_OK; - if (hRes == S_OK) - hRes = lpszVerIndProgID ? RegisterProgID(lpszCLSID, lpszVerIndProgID, szDesc) : S_OK; - LONG lRes = ERROR_SUCCESS; - if (hRes == S_OK) - { - CRegKey key; - lRes = key.Open(HKEY_CLASSES_ROOT, _T("CLSID"), KEY_READ | KEY_WRITE); - if (lRes == ERROR_SUCCESS) - { - lRes = key.Create(key, lpszCLSID, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE); - if (lRes == ERROR_SUCCESS) - { - lRes = key.SetStringValue(NULL, szDesc); - if (lRes == ERROR_SUCCESS) - { - lRes = lpszProgID ? key.SetKeyValue(szProgID, lpszProgID) : ERROR_SUCCESS; - if (lRes == ERROR_SUCCESS) - { - lRes = lpszVerIndProgID ? key.SetKeyValue(szVIProgID, lpszVerIndProgID) : ERROR_SUCCESS; - if (lRes == ERROR_SUCCESS) - { - if ((m_hInst == NULL) || (m_hInst == GetModuleHandle(NULL))) // register as EXE - { - // If Registering as an EXE, then we quote the resultant path. - // We don't do it for a DLL, because LoadLibrary fails if the path is - // quoted - szModule[0] = _T('\"'); - szModule[dwLen + 1] = _T('\"'); - szModule[dwLen + 2] = 0; - - lRes = key.SetKeyValue(szLS32, szModule); - } - else - { - lRes = key.SetKeyValue(szIPS32, (dwFlags & AUTPRXFLAG) ? szAUTPRX32 : szModule + 1); - if (lRes == ERROR_SUCCESS) - { - LPCTSTR lpszModel = (dwFlags & THREADFLAGS_BOTH) ? szBoth : - (dwFlags & THREADFLAGS_APARTMENT) ? szApartment : NULL; - if (lpszModel != NULL) - lRes = key.SetKeyValue(szIPS32, lpszModel, szThreadingModel); - } - } - } - } - } - } - } - } - CoTaskMemFree(lpOleStr); - if (lRes != ERROR_SUCCESS) - hRes = AtlHresultFromWin32(lRes); - return hRes; -} - -inline HRESULT WINAPI CComModule::UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, - LPCTSTR lpszVerIndProgID) -{ - USES_CONVERSION_EX; - CRegKey key; - LONG lRet; - - key.Attach(HKEY_CLASSES_ROOT); - if (lpszProgID != NULL && lpszProgID[0]!=_T('\0')) - { - lRet = key.RecurseDeleteKey(lpszProgID); - if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND && lRet != ERROR_PATH_NOT_FOUND) - { - ATLTRACE(atlTraceCOM, 0, _T("Failed to Unregister ProgID : %s\n"), lpszProgID); - key.Detach(); - return AtlHresultFromWin32(lRet); - } - } - if (lpszVerIndProgID != NULL && lpszVerIndProgID[0]!=_T('\0')) - { - lRet = key.RecurseDeleteKey(lpszVerIndProgID); - if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND && lRet != ERROR_PATH_NOT_FOUND) - { - ATLTRACE(atlTraceCOM, 0, _T("Failed to Unregister Version Independent ProgID : %s\n"), lpszVerIndProgID); - key.Detach(); - return AtlHresultFromWin32(lRet); - } - } - LPOLESTR lpOleStr; - HRESULT hr = StringFromCLSID(clsid, &lpOleStr); - if (SUCCEEDED(hr)) - { - LPTSTR lpsz = OLE2T_EX(lpOleStr, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(lpsz == NULL) - { - CoTaskMemFree(lpOleStr); - return E_OUTOFMEMORY; - } -#endif - - lRet = key.Open(key, _T("CLSID"), KEY_READ | KEY_WRITE); - if (lRet == ERROR_SUCCESS) - lRet = key.RecurseDeleteKey(lpsz); - if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND && lRet != ERROR_PATH_NOT_FOUND) - { - ATLTRACE(atlTraceCOM, 0, _T("Failed to delete CLSID : %s\n"), lpsz); - hr = AtlHresultFromWin32(lRet); - } - CoTaskMemFree(lpOleStr); - } - else - { - ATLTRACE(atlTraceCOM, 0, _T("Failed to delete CLSID : {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}"), - clsid.Data1, - clsid.Data2, - clsid.Data3, - clsid.Data4[0], - clsid.Data4[1], - clsid.Data4[2], - clsid.Data4[3], - clsid.Data4[4], - clsid.Data4[5], - clsid.Data4[6], - clsid.Data4[7] - ); - } - key.Detach(); - return hr; -} - -#pragma warning( pop ) // Disable "deprecated symbol" warning - -#endif // !_ATL_NO_COMMODULE - -#ifdef _ATL_DEBUG_INTERFACES - -inline void _QIThunk::Dump() throw() -{ - TCHAR buf[512+1]; - if (m_dwRef != 0) - { -#if _SECURE_ATL && !defined(_ATL_MIN_CRT) - _stprintf_s(buf, _countof(buf), _T("ATL: QIThunk - %-10d\tLEAK :\tObject = 0x%p\tRefcount = %d\tMaxRefCount = %d\t"), - m_nIndex, m_pUnk, m_dwRef, m_dwMaxRef); -#else -#pragma warning(push) -#pragma warning(disable:4995) // wsprintf is deprecated - wsprintf(buf, _T("ATL: QIThunk - %-10d\tLEAK :\tObject = 0x%p\tRefcount = %d\tMaxRefCount = %d\t"), m_nIndex, m_pUnk, m_dwRef, m_dwMaxRef); -#pragma warning(pop) -#endif - buf[_countof(buf)-1] = 0; - OutputDebugString(buf); - AtlDumpIID(m_iid, m_lpszClassName, S_OK); - } - else - { -#if _SECURE_ATL && !defined(_ATL_MIN_CRT) - _stprintf_s(buf, _countof(buf), _T("ATL: QIThunk - %-10d\tNonAddRef LEAK :\tObject = 0x%p\t"), m_nIndex, m_pUnk); -#else -#pragma warning(push) -#pragma warning(disable:4995) // wsprintf is deprecated - wsprintf(buf, _T("ATL: QIThunk - %-10d\tNonAddRef LEAK :\tObject = 0x%p\t"), m_nIndex, m_pUnk); -#pragma warning(pop) -#endif - buf[_countof(buf)-1] = 0; - OutputDebugString(buf); - AtlDumpIID(m_iid, m_lpszClassName, S_OK); - } -} - -#endif // _ATL_DEBUG_INTERFACES - -#if defined(_ATL_DEBUG_INTERFACES) || defined(_ATL_DEBUG_QI) -__forceinline HRESULT WINAPI AtlDumpIID(REFIID iid, LPCTSTR pszClassName, HRESULT hr) throw() -{ - USES_CONVERSION_EX; - CRegKey key; - TCHAR szName[100]; - DWORD dwType; - DWORD dw = sizeof(szName); - - LPOLESTR pszGUID = NULL; - if (FAILED(StringFromCLSID(iid, &pszGUID))) - return hr; - - OutputDebugString(pszClassName); - OutputDebugString(_T(" - ")); - - LPTSTR lpszGUID = OLE2T_EX(pszGUID, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(lpszGUID == NULL) - { - CoTaskMemFree(pszGUID); - return hr; - } -#endif - // Attempt to find it in the interfaces section - if (key.Open(HKEY_CLASSES_ROOT, _T("Interface"), KEY_READ) == ERROR_SUCCESS) - { - if (key.Open(key, lpszGUID, KEY_READ) == ERROR_SUCCESS) - { - *szName = 0; - if (RegQueryValueEx(key.m_hKey, (LPTSTR)NULL, NULL, &dwType, (LPBYTE)szName, &dw) == ERROR_SUCCESS) - { - OutputDebugString(szName); - } - } - } - // Attempt to find it in the clsid section - if (key.Open(HKEY_CLASSES_ROOT, _T("CLSID"), KEY_READ) == ERROR_SUCCESS) - { - if (key.Open(key, lpszGUID, KEY_READ) == ERROR_SUCCESS) - { - *szName = 0; - dw = sizeof(szName); - if (RegQueryValueEx(key.m_hKey, (LPTSTR)NULL, NULL, &dwType, (LPBYTE)szName, &dw) == ERROR_SUCCESS) - { - OutputDebugString(_T("(CLSID\?\?\?) ")); - OutputDebugString(szName); - } - } - } - else - OutputDebugString(lpszGUID); - - if (hr != S_OK) - OutputDebugString(_T(" - failed")); - OutputDebugString(_T("\n")); - CoTaskMemFree(pszGUID); - - return hr; -} -#endif // _ATL_DEBUG_INTERFACES || _ATL_DEBUG_QI - - - -// WM_FORWARDMSG - used to forward a message to another window for processing -// WPARAM - DWORD dwUserData - defined by user -// LPARAM - LPMSG pMsg - a pointer to the MSG structure -// return value - 0 if the message was not processed, nonzero if it was -#define WM_FORWARDMSG 0x037F - -}; //namespace ATL - - -#ifndef _ATL_NO_AUTOMATIC_NAMESPACE -using namespace ATL; -#endif //!_ATL_NO_AUTOMATIC_NAMESPACE - -#ifdef _ATL_ATTRIBUTES -#include -#endif - - - -namespace ATL -{ - -// All exports go here -// Pull in if building ATL DLL or not linking to ATL DLL -#ifndef _ATL_DLL - -///////////////////////////////////////////////////////////////////////////// -// statics - -static inline UINT WINAPI AtlGetDirLen(LPCOLESTR lpszPathName) throw() -{ - ATLASSERT(lpszPathName != NULL); - if(lpszPathName == NULL) - return 0; - - // always capture the complete file name including extension (if present) - LPCOLESTR lpszTemp = lpszPathName; - for (LPCOLESTR lpsz = lpszPathName; *lpsz != NULL; ) - { - LPCOLESTR lp = CharNextO(lpsz); - // remember last directory/drive separator - if (*lpsz == OLESTR('\\') || *lpsz == OLESTR('/') || *lpsz == OLESTR(':')) - lpszTemp = lp; - lpsz = lp; - } - - return UINT( lpszTemp-lpszPathName ); -} - -static inline LPTSTR AtlFindExtension(LPCTSTR psz) -{ - if (psz == NULL) - return NULL; - LPCTSTR pszRemember = NULL; - while (*psz != NULL) - { - switch(*psz) - { - case _T('\\'): - pszRemember = NULL; - break; - case _T('.'): - pszRemember = psz; - break; - default: - break; - } - psz = CharNext(psz); - } - return (LPTSTR)((pszRemember == NULL) ? psz : pszRemember); -} - - -///////////////////////////////////////////////////////////////////////////// -// TypeLib registration - -#define _ATL_MAX_PATH_PLUS_INDEX (_MAX_PATH + _ATL_TYPELIB_INDEX_LENGTH) - -ATLINLINE ATLAPI AtlLoadTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib) -{ - ATLASSERT(pbstrPath != NULL && ppTypeLib != NULL); - if (pbstrPath == NULL || ppTypeLib == NULL) - return E_POINTER; - - *pbstrPath = NULL; - *ppTypeLib = NULL; - - USES_CONVERSION_EX; - ATLASSERT(hInstTypeLib != NULL); - TCHAR szModule[_ATL_MAX_PATH_PLUS_INDEX]; - - DWORD dwFLen = GetModuleFileName(hInstTypeLib, szModule, MAX_PATH); - if( dwFLen == 0 ) - return AtlHresultFromLastError(); - else if( dwFLen == MAX_PATH ) - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - - // get the extension pointer in case of fail - LPTSTR lpszExt = NULL; - - lpszExt = AtlFindExtension(szModule); - - if (lpszIndex != NULL) - { - LPCTSTR lpcszIndex = OLE2CT_EX(lpszIndex, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); - if(lpcszIndex == NULL) - { - return E_OUTOFMEMORY; - } - DWORD nIndexLen = lstrlen(lpcszIndex); - - DWORD newLen = dwFLen + nIndexLen; - if ((newLen < dwFLen) || (newLen < nIndexLen) || (newLen >= _ATL_MAX_PATH_PLUS_INDEX)) - return E_FAIL; -#ifdef UNICODE - Checked::wcscpy_s(szModule + dwFLen, _countof(szModule) - dwFLen, lpcszIndex); -#else - Checked::strcpy_s(szModule + dwFLen, _countof(szModule) - dwFLen, lpcszIndex); -#endif - } - LPOLESTR lpszModule = T2OLE_EX(szModule, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(lpszModule == NULL) - return E_OUTOFMEMORY; -#endif - HRESULT hr = LoadTypeLib(lpszModule, ppTypeLib); - if (!SUCCEEDED(hr)) - { - // typelib not in module, try .tlb instead - TCHAR szExt[] = _T(".tlb"); - if ((lpszExt - szModule + sizeof(szExt)/sizeof(TCHAR)) > _MAX_PATH) - return E_FAIL; - -#ifdef UNICODE - Checked::wcscpy_s(lpszExt, _countof(szModule) - (lpszExt - szModule), szExt); -#else - Checked::strcpy_s(lpszExt, _countof(szModule) - (lpszExt - szModule), szExt); -#endif - lpszModule = T2OLE_EX(szModule, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if(lpszModule == NULL) - return E_OUTOFMEMORY; -#endif - hr = LoadTypeLib(lpszModule, ppTypeLib); - } - if (SUCCEEDED(hr)) - { - *pbstrPath = ::SysAllocString(lpszModule); - if (*pbstrPath == NULL) - hr = E_OUTOFMEMORY; - } - return hr; -} - -ATLINLINE ATLAPI AtlUnRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex) -{ - CComBSTR bstrPath; - CComPtr pTypeLib; - HRESULT hr = AtlLoadTypeLib(hInstTypeLib, lpszIndex, &bstrPath, &pTypeLib); - if (SUCCEEDED(hr)) - { - TLIBATTR* ptla; - hr = pTypeLib->GetLibAttr(&ptla); - if (SUCCEEDED(hr)) - { - hr = UnRegisterTypeLib(ptla->guid, ptla->wMajorVerNum, ptla->wMinorVerNum, ptla->lcid, ptla->syskind); - pTypeLib->ReleaseTLibAttr(ptla); - } - } - return hr; -} - -ATLINLINE ATLAPI AtlRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex) -{ - CComBSTR bstrPath; - CComPtr pTypeLib; - HRESULT hr = AtlLoadTypeLib(hInstTypeLib, lpszIndex, &bstrPath, &pTypeLib); - if (SUCCEEDED(hr)) - { - CComBSTR bstrHelpFile; - hr = pTypeLib->GetDocumentation(-1, NULL, NULL, NULL, &bstrHelpFile); - if (SUCCEEDED(hr) && (bstrHelpFile.m_str != NULL)) - { - OLECHAR szDir[MAX_PATH]; - Checked::wcsncpy_s(szDir, MAX_PATH, bstrPath.m_str, bstrPath.Length()); - - szDir[MAX_PATH - 1] = 0; - - // If index is specified remove it from the path - if (lpszIndex != NULL) - { - size_t nLenPath = ocslen(szDir); - size_t nLenIndex = ocslen(lpszIndex); - if ((memcmp(szDir + nLenPath - nLenIndex, lpszIndex, nLenIndex) == 0) - && (nLenPath - nLenIndex < MAX_PATH)) - szDir[nLenPath - nLenIndex] = 0; - } - UINT nDirLen = AtlGetDirLen(szDir); - if (nDirLen < MAX_PATH) - szDir[nDirLen] = 0; - - hr = ::RegisterTypeLib(pTypeLib, bstrPath, szDir); - - } - else - { - hr = ::RegisterTypeLib(pTypeLib, bstrPath, NULL); - } - } - return hr; -} - -///////////////////////////////////////////////////////////////////////////// -// Registration - -// AtlComModuleRegisterServer walks the ATL Autogenerated Object Map and registers each object in the map -// If pCLSID is not NULL then only the object referred to by pCLSID is registered (The default case) -// otherwise all the objects are registered -ATLINLINE ATLAPI AtlComModuleRegisterServer(_ATL_COM_MODULE* pComModule, BOOL bRegTypeLib, const CLSID* pCLSID) -{ - ATLASSERT(pComModule != NULL); - if (pComModule == NULL) - return E_INVALIDARG; - ATLASSERT(pComModule->m_hInstTypeLib != NULL); - - HRESULT hr = S_OK; - - for (_ATL_OBJMAP_ENTRY** ppEntry = pComModule->m_ppAutoObjMapFirst; ppEntry < pComModule->m_ppAutoObjMapLast; ppEntry++) - { - if (*ppEntry != NULL) - { - _ATL_OBJMAP_ENTRY* pEntry = *ppEntry; - if (pCLSID != NULL) - { - if (!IsEqualGUID(*pCLSID, *pEntry->pclsid)) - continue; - } - hr = pEntry->pfnUpdateRegistry(TRUE); - if (FAILED(hr)) - break; - hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid, - pEntry->pfnGetCategoryMap(), TRUE ); - if (FAILED(hr)) - break; - } - } - - if (SUCCEEDED(hr) && bRegTypeLib) - hr = AtlRegisterTypeLib(pComModule->m_hInstTypeLib, 0); - - return hr; -} - -// AtlComUnregisterServer walks the ATL Object Map and unregisters each object in the map -// If pCLSID is not NULL then only the object referred to by pCLSID is unregistered (The default case) -// otherwise all the objects are unregistered. -ATLINLINE ATLAPI AtlComModuleUnregisterServer(_ATL_COM_MODULE* pComModule, BOOL bUnRegTypeLib, const CLSID* pCLSID) -{ - ATLASSERT(pComModule != NULL); - if (pComModule == NULL) - return E_INVALIDARG; - - HRESULT hr = S_OK; - - for (_ATL_OBJMAP_ENTRY** ppEntry = pComModule->m_ppAutoObjMapFirst; ppEntry < pComModule->m_ppAutoObjMapLast; ppEntry++) - { - if (*ppEntry != NULL) - { - _ATL_OBJMAP_ENTRY* pEntry = *ppEntry; - if (pCLSID != NULL) - { - if (!IsEqualGUID(*pCLSID, *pEntry->pclsid)) - continue; - } - hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid, pEntry->pfnGetCategoryMap(), FALSE ); - if (FAILED(hr)) - break; - hr = pEntry->pfnUpdateRegistry(FALSE); //unregister - if (FAILED(hr)) - break; - } - } - if (SUCCEEDED(hr) && bUnRegTypeLib) - hr = AtlUnRegisterTypeLib(pComModule->m_hInstTypeLib, 0); - - return hr; -} - -ATLINLINE ATLAPI AtlRegisterClassCategoriesHelper( REFCLSID clsid, - const struct _ATL_CATMAP_ENTRY* pCatMap, BOOL bRegister ) -{ - CComPtr< ICatRegister > pCatRegister; - HRESULT hResult; - const struct _ATL_CATMAP_ENTRY* pEntry; - CATID catid; - - if( pCatMap == NULL ) - { - return( S_OK ); - } - - if (InlineIsEqualGUID(clsid, GUID_NULL)) - { - ATLASSERT(0 && _T("Use OBJECT_ENTRY_NON_CREATEABLE_EX macro if you want to register class categories for non creatable objects.")); - return S_OK; - } - - hResult = CoCreateInstance( CLSID_StdComponentCategoriesMgr, NULL, - CLSCTX_INPROC_SERVER, __uuidof(ICatRegister), (void**)&pCatRegister ); - if( FAILED( hResult ) ) - { - // Since not all systems have the category manager installed, we'll allow - // the registration to succeed even though we didn't register our - // categories. If you really want to register categories on a system - // without the category manager, you can either manually add the - // appropriate entries to your registry script (.rgs), or you can - // redistribute comcat.dll. - return( S_OK ); - } - - hResult = S_OK; - pEntry = pCatMap; - while( pEntry->iType != _ATL_CATMAP_ENTRY_END ) - { - catid = *pEntry->pcatid; - if( bRegister ) - { - if( pEntry->iType == _ATL_CATMAP_ENTRY_IMPLEMENTED ) - { - hResult = pCatRegister->RegisterClassImplCategories( clsid, 1, - &catid ); - } - else - { - ATLASSERT( pEntry->iType == _ATL_CATMAP_ENTRY_REQUIRED ); - hResult = pCatRegister->RegisterClassReqCategories( clsid, 1, - &catid ); - } - if( FAILED( hResult ) ) - { - return( hResult ); - } - } - else - { - if( pEntry->iType == _ATL_CATMAP_ENTRY_IMPLEMENTED ) - { - pCatRegister->UnRegisterClassImplCategories( clsid, 1, &catid ); - } - else - { - ATLASSERT( pEntry->iType == _ATL_CATMAP_ENTRY_REQUIRED ); - pCatRegister->UnRegisterClassReqCategories( clsid, 1, &catid ); - } - } - pEntry++; - } - - // When unregistering remove "Implemented Categories" and "Required Categories" subkeys if they are empty. - if (!bRegister) - { - OLECHAR szGUID[64]; - ::StringFromGUID2(clsid, szGUID, 64); - USES_CONVERSION_EX; - TCHAR* pszGUID = OLE2T_EX(szGUID, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); - if (pszGUID != NULL) - { - TCHAR szKey[128]; -#ifdef UNICODE - Checked::wcscpy_s(szKey, _countof(szKey), _T("CLSID\\")); - Checked::wcscat_s(szKey, _countof(szKey), pszGUID); - Checked::wcscat_s(szKey, _countof(szKey), _T("\\Required Categories")); -#else - Checked::strcpy_s(szKey, _countof(szKey), _T("CLSID\\")); - Checked::strcat_s(szKey, _countof(szKey), pszGUID); - Checked::strcat_s(szKey, _countof(szKey), _T("\\Required Categories")); -#endif - - CRegKey root(HKEY_CLASSES_ROOT); - CRegKey key; - DWORD cbSubKeys = 0; - - LRESULT lRes = key.Open(root, szKey, KEY_READ); - if (lRes == ERROR_SUCCESS) - { - lRes = RegQueryInfoKey(key, NULL, NULL, NULL, &cbSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - key.Close(); - if (lRes == ERROR_SUCCESS && cbSubKeys == 0) - { - root.DeleteSubKey(szKey); - } - } - -#ifdef UNICODE - Checked::wcscpy_s(szKey, _countof(szKey), _T("CLSID\\")); - Checked::wcscat_s(szKey, _countof(szKey), pszGUID); - Checked::wcscat_s(szKey, _countof(szKey), _T("\\Implemented Categories")); -#else - Checked::strcpy_s(szKey, _countof(szKey), _T("CLSID\\")); - Checked::strcat_s(szKey, _countof(szKey), pszGUID); - Checked::strcat_s(szKey, _countof(szKey), _T("\\Implemented Categories")); -#endif - lRes = key.Open(root, szKey, KEY_READ); - if (lRes == ERROR_SUCCESS) - { - lRes = RegQueryInfoKey(key, NULL, NULL, NULL, &cbSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - key.Close(); - if (lRes == ERROR_SUCCESS && cbSubKeys == 0) - { - root.DeleteSubKey(szKey); - } - } - } - } - return( S_OK ); -} - -#endif // _ATL_DLL - -ATLINLINE ATLAPIINL -AtlWinModuleTerm(_ATL_WIN_MODULE* pWinModule, HINSTANCE hInst) -{ - if (pWinModule == NULL) - return E_INVALIDARG; - if (pWinModule->cbSize == 0) - return S_OK; - if (pWinModule->cbSize != sizeof(_ATL_WIN_MODULE)) - return E_INVALIDARG; - - for (int i = 0; i < pWinModule->m_rgWindowClassAtoms.GetSize(); i++) - UnregisterClass((LPCTSTR)pWinModule->m_rgWindowClassAtoms[i], hInst); - pWinModule->m_rgWindowClassAtoms.RemoveAll(); - pWinModule->m_csWindowCreate.Term(); - pWinModule->cbSize = 0; - return S_OK; -} - - - -///////////////////////////////////////////////////////////////////////////// -// General DLL Version Helpers - -#pragma warning(push) -#pragma warning(disable : 4191) // 'type cast' : unsafe conversion from 'FARPROC' to 'DLLGETVERSIONPROC' - -inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo) -{ - ATLENSURE(pDllVersionInfo != NULL); - - // We must get this function explicitly because some DLLs don't implement it. - DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion"); - - if(pfnDllGetVersion == NULL) - { - return E_NOTIMPL; - } - - return (*pfnDllGetVersion)(pDllVersionInfo); -} - -#pragma warning(pop) - -inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo) -{ - HINSTANCE hInstDLL = ::LoadLibrary(lpstrDllName); - if(hInstDLL == NULL) - { - return AtlHresultFromLastError(); - } - HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo); - ::FreeLibrary(hInstDLL); - return hRet; -} - -// Common Control Versions: -// Win95/WinNT 4.0 maj=4 min=00 -// IE 3.x maj=4 min=70 -// IE 4.0 maj=4 min=71 -// IE 5.0 maj=5 min=80 -// Win2000 maj=5 min=81 -inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) -{ - ATLENSURE(( pdwMajor != NULL ) && ( pdwMinor != NULL )); - - DLLVERSIONINFO dvi; - memset(&dvi, 0, sizeof(dvi)); - dvi.cbSize = sizeof(dvi); - - HRESULT hRet = AtlGetDllVersion(_T("comctl32.dll"), &dvi); - - if(SUCCEEDED(hRet)) - { - *pdwMajor = dvi.dwMajorVersion; - *pdwMinor = dvi.dwMinorVersion; - } - else if(hRet == E_NOTIMPL) - { - // If DllGetVersion is not there, then the DLL is a version - // previous to the one shipped with IE 3.x - *pdwMajor = 4; - *pdwMinor = 0; - hRet = S_OK; - } - - return hRet; -} - -// Shell Versions: -// Win95/WinNT 4.0 maj=4 min=00 -// IE 3.x, IE 4.0 without Web Integrated Desktop maj=4 min=00 -// IE 4.0 with Web Integrated Desktop maj=4 min=71 -// IE 4.01 with Web Integrated Desktop maj=4 min=72 -// Win2000 maj=5 min=00 -inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) -{ - ATLENSURE(( pdwMajor != NULL) && ( pdwMinor != NULL )); - - DLLVERSIONINFO dvi; - memset(&dvi, 0, sizeof(dvi)); - dvi.cbSize = sizeof(dvi); - HRESULT hRet = AtlGetDllVersion(_T("shell32.dll"), &dvi); - - if(SUCCEEDED(hRet)) - { - *pdwMajor = dvi.dwMajorVersion; - *pdwMinor = dvi.dwMinorVersion; - } - else if(hRet == E_NOTIMPL) - { - // If DllGetVersion is not there, then the DLL is a version - // previous to the one shipped with IE 4.x - *pdwMajor = 4; - *pdwMinor = 0; - hRet = S_OK; - } - - return hRet; -} - -inline ATL_DEPRECATED("AtlModuleRegisterClassObjects has been replaced by AtlComModuleRegisterClassObjects") -HRESULT AtlModuleRegisterClassObjects(_ATL_MODULE* /*pM*/, DWORD dwClsContext, DWORD dwFlags) -{ - return AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags); -} - -inline ATL_DEPRECATED("AtlModuleRevokeClassObjects has been replaced by AtlComModuleRevokeClassObjects") -HRESULT AtlModuleRevokeClassObjects(_ATL_MODULE* /*pM*/) -{ - return AtlComModuleRevokeClassObjects(&_AtlComModule); -} - -inline ATL_DEPRECATED("AtlModuleGetClassObject has been replaced by AtlComModuleGetClassObject") -HRESULT AtlModuleGetClassObject(_ATL_MODULE* /*pM*/, REFCLSID rclsid, REFIID riid, LPVOID* ppv) -{ -#ifndef _ATL_OLEDB_CONFORMANCE_TESTS - ATLASSERT(ppv != NULL); -#endif - - return AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv); -} - -inline ATL_DEPRECATED("AtlModuleRegisterServer has been replaced by AtlComModuleRegisterServer") -HRESULT AtlModuleRegisterServer(_ATL_MODULE* /*pM*/, BOOL bRegTypeLib, const CLSID* pCLSID = NULL) -{ - return AtlComModuleRegisterServer(&_AtlComModule, bRegTypeLib, pCLSID); -} - -inline ATL_DEPRECATED("AtlModuleUnregisterServer has been replaced by AtlComModuleUnregisterServer") -HRESULT AtlModuleUnregisterServer(_ATL_MODULE* /*pM*/, const CLSID* pCLSID = NULL) -{ - return AtlComModuleUnregisterServer(&_AtlComModule, FALSE, pCLSID); -} - -inline ATL_DEPRECATED("AtlModuleUnregisterServerEx has been replaced by AtlComModuleUnregisterServer") -HRESULT AtlModuleUnregisterServerEx(_ATL_MODULE* /*pM*/, BOOL bUnRegTypeLib, const CLSID* pCLSID = NULL) -{ - return AtlComModuleUnregisterServer(&_AtlComModule, bUnRegTypeLib, pCLSID); -} - -inline ATL_DEPRECATED("AtlModuleUpdateRegistryFromResourceD has been replaced by AtlUpdateRegistryFromResourceD") -HRESULT AtlModuleUpdateRegistryFromResourceD(_ATL_MODULE* /*pM*/, LPCOLESTR lpszRes, - BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = NULL) -{ - return AtlUpdateRegistryFromResourceD(_AtlBaseModule.GetModuleInstance(), lpszRes, bRegister, pMapEntries, pReg); -} - -inline ATL_DEPRECATED("AtlModuleRegisterTypeLib has been replaced by AtlRegisterTypeLib") -HRESULT AtlModuleRegisterTypeLib(_ATL_MODULE* /*pM*/, LPCOLESTR lpszIndex) -{ - return AtlRegisterTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex); -} - -inline ATL_DEPRECATED("AtlModuleUnRegisterTypeLib has been replaced by AtlUnRegisterTypeLib") -HRESULT AtlModuleUnRegisterTypeLib(_ATL_MODULE* /*pM*/, LPCOLESTR lpszIndex) -{ - return AtlUnRegisterTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex); -} - -inline ATL_DEPRECATED("AtlModuleLoadTypeLib has been replaced by AtlLoadTypeLib") -HRESULT AtlModuleLoadTypeLib(_ATL_MODULE* /*pM*/, LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib) -{ - return AtlLoadTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex, pbstrPath, ppTypeLib); -} - -inline ATL_DEPRECATED("AtlModuleInit is no longer required") -HRESULT AtlModuleInit(_ATL_MODULE* /*pM*/, _ATL_OBJMAP_ENTRY* /*p*/, HINSTANCE /*h*/) -{ - return S_OK; -} - -inline ATL_DEPRECATED("AtlModuleTerm is no longer required") -HRESULT AtlModuleTerm(_ATL_MODULE* /*pM*/) -{ - return S_OK; -} - -inline ATL_DEPRECATED("AtlModuleAddCreateWndData has been replaced by AtlWinModuleAddCreateWndData") -void AtlModuleAddCreateWndData(_ATL_MODULE* /*pM*/, _AtlCreateWndData* pData, void* pObject) -{ - AtlWinModuleAddCreateWndData(&_AtlWinModule, pData, pObject); -} - -inline ATL_DEPRECATED("AtlModuleExtractCreateWndData has been replaced by AtlWinModuleExtractCreateWndData") -void* AtlModuleExtractCreateWndData(_ATL_MODULE* /*pM*/) -{ - return AtlWinModuleExtractCreateWndData(&_AtlWinModule); -} - -#ifndef _ATL_NO_COMMODULE - -inline CRITICAL_SECTION& CComModule::get_m_csWindowCreate() throw() -{ - return _AtlWinModule.m_csWindowCreate.m_sec; -} - -inline CRITICAL_SECTION& CComModule::get_m_csObjMap() throw() -{ - return _AtlComModule.m_csObjMap.m_sec; -} - -inline CRITICAL_SECTION& CComModule::get_m_csStaticDataInit() throw() -{ - return m_csStaticDataInitAndTypeInfo.m_sec; -} - -inline _AtlCreateWndData*& CComModule::get_m_pCreateWndList() throw() -{ - return _AtlWinModule.m_pCreateWndList; -} -inline void CComModule::put_m_pCreateWndList(_AtlCreateWndData* p) throw() -{ - _AtlWinModule.m_pCreateWndList = p; -} -#ifdef _ATL_DEBUG_INTERFACES -inline UINT& CComModule::get_m_nIndexQI() throw() -{ - return _AtlDebugInterfacesModule.m_nIndexQI; -} -inline void CComModule::put_m_nIndexQI(UINT nIndex) throw() -{ - _AtlDebugInterfacesModule.m_nIndexQI = nIndex; -} -inline UINT& CComModule::get_m_nIndexBreakAt() throw() -{ - return _AtlDebugInterfacesModule.m_nIndexBreakAt; -} -inline void CComModule::put_m_nIndexBreakAt(UINT nIndex) throw() -{ - _AtlDebugInterfacesModule.m_nIndexBreakAt = nIndex; -} -inline CSimpleArray<_QIThunk*>* CComModule::get_m_paThunks() throw() -{ - return &_AtlDebugInterfacesModule.m_aThunks; -} -inline HRESULT CComModule::AddThunk(IUnknown** pp, LPCTSTR lpsz, REFIID iid) throw() -{ - return _AtlDebugInterfacesModule.AddThunk(pp, lpsz, iid); -} -inline HRESULT CComModule::AddNonAddRefThunk(IUnknown* p, LPCTSTR lpsz, IUnknown** ppThunkRet) throw() -{ - return _AtlDebugInterfacesModule.AddNonAddRefThunk(p, lpsz, ppThunkRet); -} - -inline void CComModule::DeleteNonAddRefThunk(IUnknown* pUnk) throw() -{ - _AtlDebugInterfacesModule.DeleteNonAddRefThunk(pUnk); -} - -inline void CComModule::DeleteThunk(_QIThunk* p) throw() -{ - _AtlDebugInterfacesModule.DeleteThunk(p); -} - -inline bool CComModule::DumpLeakedThunks() throw() -{ - return _AtlDebugInterfacesModule.DumpLeakedThunks(); -} -#endif // _ATL_DEBUG_INTERFACES - -inline HRESULT CComModule::Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE /*h*/, const GUID* plibid) throw() -{ - if (plibid != NULL) - m_libid = *plibid; - - _ATL_OBJMAP_ENTRY* pEntry; - if (p != (_ATL_OBJMAP_ENTRY*)-1) - { - m_pObjMap = p; - if (m_pObjMap != NULL) - { - pEntry = m_pObjMap; - while (pEntry->pclsid != NULL) - { - pEntry->pfnObjectMain(true); //initialize class resources - pEntry++; - } - } - } - for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++) - { - if (*ppEntry != NULL) - (*ppEntry)->pfnObjectMain(true); //initialize class resources - } - return S_OK; -} - -inline void CComModule::Term() throw() -{ - _ATL_OBJMAP_ENTRY* pEntry; - if (m_pObjMap != NULL) - { - pEntry = m_pObjMap; - while (pEntry->pclsid != NULL) - { - if (pEntry->pCF != NULL) - pEntry->pCF->Release(); - pEntry->pCF = NULL; - pEntry->pfnObjectMain(false); //cleanup class resources - pEntry++; - } - } - - for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++) - { - if (*ppEntry != NULL) - (*ppEntry)->pfnObjectMain(false); //cleanup class resources - } -#ifdef _DEBUG - // Prevent false memory leak reporting. ~CAtlWinModule may be too late. - _AtlWinModule.Term(); -#endif // _DEBUG - - CAtlModuleT::Term(); -} - -inline HRESULT CComModule::GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) throw() -{ - if (ppv == NULL) - return E_POINTER; - HRESULT hr = S_OK; - _ATL_OBJMAP_ENTRY* pEntry; - if (m_pObjMap != NULL) - { - pEntry = m_pObjMap; - while (pEntry->pclsid != NULL) - { - if ((pEntry->pfnGetClassObject != NULL) && InlineIsEqualGUID(rclsid, *pEntry->pclsid)) - { - if (pEntry->pCF == NULL) - { - CComCritSecLock lock(_AtlComModule.m_csObjMap, false); - hr = lock.Lock(); - if (FAILED(hr)) - { - ATLTRACE(atlTraceCOM, 0, _T("ERROR : Unable to lock critical section in CComModule::GetClassObject\n")); - ATLASSERT(0); - break; - } - if (pEntry->pCF == NULL) - hr = pEntry->pfnGetClassObject(pEntry->pfnCreateInstance, __uuidof(IUnknown), (LPVOID*)&pEntry->pCF); - } - if (pEntry->pCF != NULL) - hr = pEntry->pCF->QueryInterface(riid, ppv); - break; - } - pEntry++; - } - } - if (*ppv == NULL && hr == S_OK) - hr = AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv); - return hr; -} - -// Register/Revoke All Class Factories with the OS (EXE only) -inline HRESULT CComModule::RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw() -{ - HRESULT hr = S_OK; - _ATL_OBJMAP_ENTRY* pEntry; - if (m_pObjMap != NULL) - { - pEntry = m_pObjMap; - while (pEntry->pclsid != NULL && hr == S_OK) - { - hr = pEntry->RegisterClassObject(dwClsContext, dwFlags); - pEntry++; - } - } - if (hr == S_OK) - hr = AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags); - return hr; -} -inline HRESULT CComModule::RevokeClassObjects() throw() -{ - HRESULT hr = S_OK; - _ATL_OBJMAP_ENTRY* pEntry; - if (m_pObjMap != NULL) - { - pEntry = m_pObjMap; - while (pEntry->pclsid != NULL && hr == S_OK) - { - hr = pEntry->RevokeClassObject(); - pEntry++; - } - } - if (hr == S_OK) - hr = AtlComModuleRevokeClassObjects(&_AtlComModule); - return hr; -} - -// Registry support (helpers) -inline HRESULT CComModule::RegisterTypeLib() throw() -{ - return _AtlComModule.RegisterTypeLib(); -} -inline HRESULT CComModule::RegisterTypeLib(LPCTSTR lpszIndex) throw() -{ - return _AtlComModule.RegisterTypeLib(lpszIndex); -} -inline HRESULT CComModule::UnRegisterTypeLib() throw() -{ - return _AtlComModule.UnRegisterTypeLib(); -} -inline HRESULT CComModule::UnRegisterTypeLib(LPCTSTR lpszIndex) throw() -{ - return _AtlComModule.UnRegisterTypeLib(lpszIndex); -} - -inline HRESULT CComModule::RegisterServer(BOOL bRegTypeLib /*= FALSE*/, const CLSID* pCLSID /*= NULL*/) throw() -{ - HRESULT hr = S_OK; - _ATL_OBJMAP_ENTRY* pEntry = m_pObjMap; - if (pEntry != NULL) - { - for (;pEntry->pclsid != NULL; pEntry++) - { - if (pCLSID != NULL) - { - if (!IsEqualGUID(*pCLSID, *pEntry->pclsid)) - continue; - } - hr = pEntry->pfnUpdateRegistry(TRUE); - if (FAILED(hr)) - break; - hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid, - pEntry->pfnGetCategoryMap(), TRUE ); - if (FAILED(hr)) - break; - } - } - if (SUCCEEDED(hr)) - hr = CAtlModuleT::RegisterServer(bRegTypeLib, pCLSID); - return hr; -} - -inline HRESULT CComModule::UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID /*= NULL*/) throw() -{ - HRESULT hr = S_OK; - _ATL_OBJMAP_ENTRY* pEntry = m_pObjMap; - if (pEntry != NULL) - { - for (;pEntry->pclsid != NULL; pEntry++) - { - if (pCLSID != NULL) - { - if (!IsEqualGUID(*pCLSID, *pEntry->pclsid)) - continue; - } - hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid, - pEntry->pfnGetCategoryMap(), FALSE ); - if (FAILED(hr)) - break; - hr = pEntry->pfnUpdateRegistry(FALSE); //unregister - if (FAILED(hr)) - break; - } - } - if (SUCCEEDED(hr)) - hr = CAtlModuleT::UnregisterServer(bUnRegTypeLib, pCLSID); - return hr; -} - -inline HRESULT CComModule::UnregisterServer(const CLSID* pCLSID /*= NULL*/) throw() -{ - return UnregisterServer(FALSE, pCLSID); -} - -#endif // !_ATL_NO_COMMODULE - -} // namespace ATL - - -#pragma warning( pop ) - -#if !defined(_ATL_DLL) && !defined(_DEBUG) - -#include - -#endif // !_ATL_DLL && !_DEBUG - -#pragma pack(pop) -#ifdef _ATL_ALL_WARNINGS -#pragma warning( pop ) -#endif - -// -// [pfx_parse] - workaround for old PREfix/PREfast parser -// -#if (defined(_PREFIX_) || defined(_PREFAST_)) && (_MSC_VER < 1400) -#pragma warning (pop) -#endif // old PREfast parser - -///////////////////////////////////////////////////////////////////////////// - -#endif // __ATLBASE_H__ - diff --git a/cpp/jacob/include/atlbase.inl b/cpp/jacob/include/atlbase.inl deleted file mode 100644 index 0d2534c..0000000 --- a/cpp/jacob/include/atlbase.inl +++ /dev/null @@ -1,428 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLBASE_INL__ -#define __ATLBASE_INL__ - -#pragma once - -#ifndef __ATLBASE_H__ - #error atlbase.inl requires atlbase.h to be included first -#endif -#pragma warning(push) -#pragma warning(disable:4571) //catch(...) blocks compiled with /EHs do NOT catch or re-throw Structured Exceptions -namespace ATL -{ - -///////////////////////////////////////////////////////////////////////////// -// Connection Point Helpers - -ATLINLINE ATLAPI AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw) -{ - if(pUnkCP == NULL) - return E_INVALIDARG; - - CComPtr pCPC; - CComPtr pCP; - HRESULT hRes = pUnkCP->QueryInterface(__uuidof(IConnectionPointContainer), (void**)&pCPC); - if (SUCCEEDED(hRes)) - hRes = pCPC->FindConnectionPoint(iid, &pCP); - if (SUCCEEDED(hRes)) - hRes = pCP->Advise(pUnk, pdw); - return hRes; -} - -ATLINLINE ATLAPI AtlUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw) -{ - if(pUnkCP == NULL) - return E_INVALIDARG; - - CComPtr pCPC; - CComPtr pCP; - HRESULT hRes = pUnkCP->QueryInterface(__uuidof(IConnectionPointContainer), (void**)&pCPC); - if (SUCCEEDED(hRes)) - hRes = pCPC->FindConnectionPoint(iid, &pCP); - if (SUCCEEDED(hRes)) - hRes = pCP->Unadvise(dw); - return hRes; -} - -///////////////////////////////////////////////////////////////////////////// -// Inproc Marshaling helpers - -//This API should be called from the same thread that called -//AtlMarshalPtrInProc -ATLINLINE ATLAPI AtlFreeMarshalStream(IStream* pStream) -{ - HRESULT hRes=S_OK; - if (pStream != NULL) - { - LARGE_INTEGER l; - l.QuadPart = 0; - pStream->Seek(l, STREAM_SEEK_SET, NULL); - hRes=CoReleaseMarshalData(pStream); - pStream->Release(); - } - return hRes; -} - -ATLINLINE ATLAPI AtlMarshalPtrInProc(IUnknown* pUnk, const IID& iid, IStream** ppStream) -{ - ATLASSERT(ppStream != NULL); - if (ppStream == NULL) - return E_POINTER; - - HRESULT hRes = CreateStreamOnHGlobal(NULL, TRUE, ppStream); - if (SUCCEEDED(hRes)) - { - hRes = CoMarshalInterface(*ppStream, iid, - pUnk, MSHCTX_INPROC, NULL, MSHLFLAGS_TABLESTRONG); - if (FAILED(hRes)) - { - (*ppStream)->Release(); - *ppStream = NULL; - } - } - return hRes; -} - -ATLINLINE ATLAPI AtlUnmarshalPtr(IStream* pStream, const IID& iid, IUnknown** ppUnk) -{ - ATLASSERT(ppUnk != NULL); - if (ppUnk == NULL) - return E_POINTER; - - *ppUnk = NULL; - HRESULT hRes = E_INVALIDARG; - if (pStream != NULL) - { - LARGE_INTEGER l; - l.QuadPart = 0; - pStream->Seek(l, STREAM_SEEK_SET, NULL); - hRes = CoUnmarshalInterface(pStream, iid, (void**)ppUnk); - } - return hRes; -} - -///////////////////////////////////////////////////////////////////////////// -// Module - -ATLINLINE ATLAPI AtlComModuleGetClassObject(_ATL_COM_MODULE* pComModule, REFCLSID rclsid, REFIID riid, LPVOID* ppv) -{ - ATLASSERT(pComModule != NULL); - if (pComModule == NULL) - return E_INVALIDARG; - if (pComModule->cbSize == 0) // Module hasn't been initialized - return E_UNEXPECTED; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - - HRESULT hr = S_OK; - - for (_ATL_OBJMAP_ENTRY** ppEntry = pComModule->m_ppAutoObjMapFirst; ppEntry < pComModule->m_ppAutoObjMapLast; ppEntry++) - { - if (*ppEntry != NULL) - { - _ATL_OBJMAP_ENTRY* pEntry = *ppEntry; - if ((pEntry->pfnGetClassObject != NULL) && InlineIsEqualGUID(rclsid, *pEntry->pclsid)) - { - if (pEntry->pCF == NULL) - { - CComCritSecLock lock(pComModule->m_csObjMap, false); - hr = lock.Lock(); - if (FAILED(hr)) - { - ATLTRACE(atlTraceCOM, 0, _T("ERROR : Unable to lock critical section in AtlComModuleGetClassObject\n")); - ATLASSERT(0); - break; - } - if (pEntry->pCF == NULL) - hr = pEntry->pfnGetClassObject(pEntry->pfnCreateInstance, __uuidof(IUnknown), (LPVOID*)&pEntry->pCF); - } - if (pEntry->pCF != NULL) - hr = pEntry->pCF->QueryInterface(riid, ppv); - break; - } - } - } - - if (*ppv == NULL && hr == S_OK) - hr = CLASS_E_CLASSNOTAVAILABLE; - return hr; -} - -ATLINLINE ATLAPI AtlComModuleRegisterClassObjects(_ATL_COM_MODULE* pComModule, DWORD dwClsContext, DWORD dwFlags) -{ - ATLASSERT(pComModule != NULL); - if (pComModule == NULL) - return E_INVALIDARG; - - HRESULT hr = S_FALSE; - for (_ATL_OBJMAP_ENTRY** ppEntry = pComModule->m_ppAutoObjMapFirst; ppEntry < pComModule->m_ppAutoObjMapLast && SUCCEEDED(hr); ppEntry++) - { - if (*ppEntry != NULL) - hr = (*ppEntry)->RegisterClassObject(dwClsContext, dwFlags); - } - return hr; -} - -ATLINLINE ATLAPI AtlComModuleRevokeClassObjects(_ATL_COM_MODULE* pComModule) -{ - ATLASSERT(pComModule != NULL); - if (pComModule == NULL) - return E_INVALIDARG; - - HRESULT hr = S_OK; - for (_ATL_OBJMAP_ENTRY** ppEntry = pComModule->m_ppAutoObjMapFirst; ppEntry < pComModule->m_ppAutoObjMapLast && hr == S_OK; ppEntry++) - { - if (*ppEntry != NULL) - hr = (*ppEntry)->RevokeClassObject(); - } - return hr; -} - -ATLINLINE ATLAPI_(BOOL) AtlWaitWithMessageLoop(HANDLE hEvent) -{ - DWORD dwRet; - MSG msg; - - while(1) - { - dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT); - - if (dwRet == WAIT_OBJECT_0) - return TRUE; // The event was signaled - - if (dwRet != WAIT_OBJECT_0 + 1) - break; // Something else happened - - // There is one or more window message available. Dispatch them - while(PeekMessage(&msg,0,0,0,PM_NOREMOVE)) - { - // check for unicode window so we call the appropriate functions - BOOL bUnicode = ::IsWindowUnicode(msg.hwnd); - BOOL bRet; - - if (bUnicode) - bRet = ::GetMessageW(&msg, NULL, 0, 0); - else - bRet = ::GetMessageA(&msg, NULL, 0, 0); - - if (bRet > 0) - { - ::TranslateMessage(&msg); - - if (bUnicode) - ::DispatchMessageW(&msg); - else - ::DispatchMessageA(&msg); - } - - if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0) - return TRUE; // Event is now signaled. - } - } - return FALSE; -} - -///////////////////////////////////////////////////////////////////////////// -// QI support - -ATLINLINE ATLAPI AtlInternalQueryInterface(void* pThis, - const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObject) -{ - ATLASSERT(pThis != NULL); - ATLASSERT(pEntries!= NULL); - - if(pThis == NULL || pEntries == NULL) - return E_INVALIDARG ; - - // First entry in the com map should be a simple map entry - ATLASSERT(pEntries->pFunc == _ATL_SIMPLEMAPENTRY); - if (ppvObject == NULL) - return E_POINTER; - *ppvObject = NULL; - if (InlineIsEqualUnknown(iid)) // use first interface - { - IUnknown* pUnk = (IUnknown*)((INT_PTR)pThis+pEntries->dw); - pUnk->AddRef(); - *ppvObject = pUnk; - return S_OK; - } - while (pEntries->pFunc != NULL) - { - BOOL bBlind = (pEntries->piid == NULL); - if (bBlind || InlineIsEqualGUID(*(pEntries->piid), iid)) - { - if (pEntries->pFunc == _ATL_SIMPLEMAPENTRY) //offset - { - ATLASSERT(!bBlind); - IUnknown* pUnk = (IUnknown*)((INT_PTR)pThis+pEntries->dw); - pUnk->AddRef(); - *ppvObject = pUnk; - return S_OK; - } - else //actual function call - { - HRESULT hRes = pEntries->pFunc(pThis, - iid, ppvObject, pEntries->dw); - if (hRes == S_OK || (!bBlind && FAILED(hRes))) - return hRes; - } - } - pEntries++; - } - return E_NOINTERFACE; -} - -ATLINLINE ATLAPI_(DWORD) AtlGetVersion(void* /* pReserved */) -{ - return _ATL_VER; -} - -///////////////////////////////////////////////////////////////////////////// -// Windowing - -ATLINLINE ATLAPI_(void) AtlWinModuleAddCreateWndData(_ATL_WIN_MODULE* pWinModule, _AtlCreateWndData* pData, void* pObject) -{ - if (pWinModule == NULL) - _AtlRaiseException((DWORD)EXCEPTION_ACCESS_VIOLATION); - - ATLASSERT(pData != NULL && pObject != NULL); - if(pData == NULL || pObject == NULL) - _AtlRaiseException((DWORD)EXCEPTION_ACCESS_VIOLATION); - - pData->m_pThis = pObject; - pData->m_dwThreadID = ::GetCurrentThreadId(); - CComCritSecLock lock(pWinModule->m_csWindowCreate, false); - if (FAILED(lock.Lock())) - { - ATLTRACE(atlTraceWindowing, 0, _T("ERROR : Unable to lock critical section in AtlWinModuleAddCreateWndData\n")); - ATLASSERT(0); - return; - } - pData->m_pNext = pWinModule->m_pCreateWndList; - pWinModule->m_pCreateWndList = pData; -} - -ATLINLINE ATLAPI_(void*) AtlWinModuleExtractCreateWndData(_ATL_WIN_MODULE* pWinModule) -{ - if (pWinModule == NULL) - return NULL; - - void* pv = NULL; - CComCritSecLock lock(pWinModule->m_csWindowCreate, false); - if (FAILED(lock.Lock())) - { - ATLTRACE(atlTraceWindowing, 0, _T("ERROR : Unable to lock critical section in AtlWinModuleExtractCreateWndData\n")); - ATLASSERT(0); - return pv; - } - _AtlCreateWndData* pEntry = pWinModule->m_pCreateWndList; - if(pEntry != NULL) - { - DWORD dwThreadID = ::GetCurrentThreadId(); - _AtlCreateWndData* pPrev = NULL; - while(pEntry != NULL) - { - if(pEntry->m_dwThreadID == dwThreadID) - { - if(pPrev == NULL) - pWinModule->m_pCreateWndList = pEntry->m_pNext; - else - pPrev->m_pNext = pEntry->m_pNext; - pv = pEntry->m_pThis; - break; - } - pPrev = pEntry; - pEntry = pEntry->m_pNext; - } - } - return pv; -} - - -ATLINLINE ATLAPI AtlWinModuleInit(_ATL_WIN_MODULE* pWinModule) -{ - if (pWinModule == NULL) - return E_INVALIDARG; - - // check only in the DLL - if (pWinModule->cbSize != sizeof(_ATL_WIN_MODULE)) - return E_INVALIDARG; - - pWinModule->m_pCreateWndList = NULL; - - HRESULT hr = pWinModule->m_csWindowCreate.Init(); - if (FAILED(hr)) - { - ATLTRACE(atlTraceWindowing, 0, _T("ERROR : Unable to initialize critical section in AtlWinModuleInit\n")); - ATLASSERT(0); - } - return hr; -} - -///////////////////////////////////////////////////////////////////////////// -// Module - -ATLINLINE ATLAPI AtlModuleAddTermFunc(_ATL_MODULE* pModule, _ATL_TERMFUNC* pFunc, DWORD_PTR dw) -{ - if (pModule == NULL) - return E_INVALIDARG; - - HRESULT hr = S_OK; - _ATL_TERMFUNC_ELEM* pNew = NULL; - ATLTRY(pNew = new _ATL_TERMFUNC_ELEM); - if (pNew == NULL) - hr = E_OUTOFMEMORY; - else - { - pNew->pFunc = pFunc; - pNew->dw = dw; - CComCritSecLock lock(pModule->m_csStaticDataInitAndTypeInfo, false); - hr = lock.Lock(); - if (SUCCEEDED(hr)) - { - pNew->pNext = pModule->m_pTermFuncs; - pModule->m_pTermFuncs = pNew; - } - else - { - delete pNew; - ATLTRACE(atlTraceGeneral, 0, _T("ERROR : Unable to lock critical section in AtlModuleAddTermFunc\n")); - ATLASSERT(0); - } - } - return hr; -} - -ATLINLINE ATLAPI_(void) AtlCallTermFunc(_ATL_MODULE* pModule) -{ - if (pModule == NULL) - _AtlRaiseException((DWORD)EXCEPTION_ACCESS_VIOLATION); - - _ATL_TERMFUNC_ELEM* pElem = pModule->m_pTermFuncs; - _ATL_TERMFUNC_ELEM* pNext = NULL; - while (pElem != NULL) - { - pElem->pFunc(pElem->dw); - pNext = pElem->pNext; - delete pElem; - pElem = pNext; - } - pModule->m_pTermFuncs = NULL; -} - -} // namespace ATL -#pragma warning(pop) -#endif // __ATLBASE_INL__ - diff --git a/cpp/jacob/include/atlchecked.h b/cpp/jacob/include/atlchecked.h deleted file mode 100644 index aadb522..0000000 --- a/cpp/jacob/include/atlchecked.h +++ /dev/null @@ -1,605 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLCHECKED_H__ -#define __ATLCHECKED_H__ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#pragma warning(push) -#pragma warning(disable:4127) - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ - -inline errno_t AtlCrtErrorCheck(errno_t nError) -{ - switch(nError) - { - case ENOMEM: - AtlThrow(E_OUTOFMEMORY); - break; - case EINVAL: - case ERANGE: - AtlThrow(E_INVALIDARG); - break; - case 0: - case STRUNCATE: - break; - default: - AtlThrow(E_FAIL); - break; - } - return nError; -} - -///////////////////////////////////////////////////////////////////////////// -// Secure (Checked) CRT functions - -namespace Checked -{ - -#if _SECURE_ATL - -#ifdef _AFX -#define ATLMFC_CRT_ERRORCHECK(expr) AFX_CRT_ERRORCHECK(expr) -#else -#define ATLMFC_CRT_ERRORCHECK(expr) ATL_CRT_ERRORCHECK(expr) -#endif - -inline void __cdecl memcpy_s(__out_bcount_part(_S1max,_N) void *_S1, __in size_t _S1max, __in_bcount(_N) const void *_S2, __in size_t _N) -{ - ATLMFC_CRT_ERRORCHECK(::memcpy_s(_S1, _S1max, _S2, _N)); -} - -inline void __cdecl wmemcpy_s(__out_ecount_part(_N1,_N) wchar_t *_S1, __in size_t _N1, __in_ecount(_N) const wchar_t *_S2, __in size_t _N) -{ - ATLMFC_CRT_ERRORCHECK(::wmemcpy_s(_S1, _N1, _S2, _N)); -} - -inline void __cdecl memmove_s(__out_bcount_part(_S1max,_N) void *_S1, __in size_t _S1max, __in_bcount(_N) const void *_S2, size_t _N) -{ - ATLMFC_CRT_ERRORCHECK(::memmove_s(_S1, _S1max, _S2, _N)); -} - -inline void __cdecl strcpy_s(__out_ecount(_S1max) char *_S1, __in size_t _S1max, __in_z const char *_S2) -{ - ATLMFC_CRT_ERRORCHECK(::strcpy_s(_S1, _S1max, _S2)); -} - -inline void __cdecl wcscpy_s(__out_ecount(_S1max) wchar_t *_S1, __in size_t _S1max, __in_z const wchar_t *_S2) -{ - ATLMFC_CRT_ERRORCHECK(::wcscpy_s(_S1, _S1max, _S2)); -} - -inline void __cdecl tcscpy_s(__out_ecount(_SizeInChars) TCHAR * _Dst, __in size_t _SizeInChars, __in_z const TCHAR * _Src) -{ -#ifndef _ATL_MIN_CRT - ATLMFC_CRT_ERRORCHECK(::_tcscpy_s(_Dst, _SizeInChars, _Src)); -#else -#ifdef UNICODE - ATLMFC_CRT_ERRORCHECK(::wcscpy_s(_Dst, _SizeInChars, _Src)); -#else - ATLMFC_CRT_ERRORCHECK(::strcpy_s(_Dst, _SizeInChars, _Src)); -#endif -#endif -} - -inline errno_t __cdecl strncpy_s(__out_ecount(_SizeInChars) char *_Dest, __in size_t _SizeInChars, __in_z const char *_Source, __in size_t _Count) -{ - return ATLMFC_CRT_ERRORCHECK(::strncpy_s(_Dest, _SizeInChars, _Source,_Count)); -} - -inline errno_t __cdecl wcsncpy_s(__out_ecount(_SizeInChars) wchar_t *_Dest, __in size_t _SizeInChars, __in_z const wchar_t *_Source, __in size_t _Count) -{ - return ATLMFC_CRT_ERRORCHECK(::wcsncpy_s(_Dest, _SizeInChars, _Source,_Count)); -} - -inline errno_t __cdecl tcsncpy_s(__out_ecount(_SizeInChars) TCHAR *_Dest, __in size_t _SizeInChars, __in_z const TCHAR *_Source, __in size_t _Count) -{ -#ifndef _ATL_MIN_CRT - return ATLMFC_CRT_ERRORCHECK(::_tcsncpy_s(_Dest, _SizeInChars, _Source,_Count)); -#else -#ifdef UNICODE - return ATLMFC_CRT_ERRORCHECK(::wcsncpy_s(_Dest, _SizeInChars, _Source,_Count)); -#else - return ATLMFC_CRT_ERRORCHECK(::strncpy_s(_Dest, _SizeInChars, _Source,_Count)); -#endif -#endif -} - -inline void __cdecl strcat_s(__inout_ecount_z(_SizeInChars) char * _Dst, __in size_t _SizeInChars, __in_z const char * _Src) -{ - ATLMFC_CRT_ERRORCHECK(::strcat_s(_Dst, _SizeInChars, _Src)); -} - -inline void __cdecl wcscat_s(__inout_ecount_z(_SizeInChars) wchar_t * _Dst, __in size_t _SizeInChars, __in_z const wchar_t * _Src) -{ - ATLMFC_CRT_ERRORCHECK(::wcscat_s(_Dst, _SizeInChars, _Src)); -} - -inline void __cdecl tcscat_s(__inout_ecount_z(_SizeInChars) TCHAR * _Dst, __in size_t _SizeInChars, __in_z const TCHAR * _Src) -{ -#ifndef _ATL_MIN_CRT - ATLMFC_CRT_ERRORCHECK(::_tcscat_s(_Dst, _SizeInChars, _Src)); -#else -#ifdef UNICODE - ATLMFC_CRT_ERRORCHECK(::wcscat_s(_Dst, _SizeInChars, _Src)); -#else - ATLMFC_CRT_ERRORCHECK(::strcat_s(_Dst, _SizeInChars, _Src)); -#endif -#endif -} - -inline void __cdecl strlwr_s(__inout_ecount_z(_SizeInChars) char * _Str, __in size_t _SizeInChars) -{ - ATLMFC_CRT_ERRORCHECK(::_strlwr_s(_Str, _SizeInChars)); -} - -inline void __cdecl wcslwr_s(__inout_ecount_z(_SizeInChars) wchar_t * _Str, __in size_t _SizeInChars) -{ - ATLMFC_CRT_ERRORCHECK(::_wcslwr_s(_Str, _SizeInChars)); -} - -#if !defined(_MANAGED) -inline void __cdecl mbslwr_s(__inout_bcount_z(_SizeInChars) unsigned char * _Str, __in size_t _SizeInChars) -{ - ATLMFC_CRT_ERRORCHECK(::_mbslwr_s(_Str, _SizeInChars)); -} -#endif - -inline void __cdecl tcslwr_s(__inout_ecount_z(_SizeInChars) TCHAR * _Str, __in size_t _SizeInChars) -{ -#ifndef _ATL_MIN_CRT - ATLMFC_CRT_ERRORCHECK(::_tcslwr_s(_Str, _SizeInChars)); -#else -#ifdef UNICODE - ATLMFC_CRT_ERRORCHECK(::_wcslwr_s(_Str, _SizeInChars)); -#else - ATLMFC_CRT_ERRORCHECK(::_strlwr_s(_Str, _SizeInChars)); -#endif -#endif -} - -inline void __cdecl strupr_s(__inout_ecount_z(_SizeInChars) char * _Str, __in size_t _SizeInChars) -{ - ATLMFC_CRT_ERRORCHECK(::_strupr_s(_Str, _SizeInChars)); -} - -inline void __cdecl wcsupr_s(__inout_ecount_z(_SizeInChars) wchar_t * _Str, __in size_t _SizeInChars) -{ - ATLMFC_CRT_ERRORCHECK(::_wcsupr_s(_Str, _SizeInChars)); -} - -#if !defined(_MANAGED) -inline void __cdecl mbsupr_s(__inout_bcount_z(_SizeInChars) unsigned char * _Str, __in size_t _SizeInChars) -{ - ATLMFC_CRT_ERRORCHECK(::_mbsupr_s(_Str, _SizeInChars)); -} -#endif - -inline void __cdecl tcsupr_s(__inout_ecount_z(_SizeInChars) TCHAR * _Str, __in size_t _SizeInChars) -{ - ATLMFC_CRT_ERRORCHECK(::_tcsupr_s(_Str, _SizeInChars)); -} - -inline void __cdecl itoa_s(__in int _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_itoa_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl itot_s(__in int _Val, __out_ecount_z(_SizeInChars) TCHAR *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_itot_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl ltoa_s(__in long _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_ltoa_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl ltot_s(__in long _Val, __out_ecount_z(_SizeInChars) TCHAR *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_ltot_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl ultoa_s(__in unsigned long _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_ultoa_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl ultow_s(__in unsigned long _Val, __out_ecount_z(_SizeInChars) wchar_t *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_ultow_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl ultot_s(__in unsigned long _Val, __out_ecount_z(_SizeInChars) TCHAR *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_ultot_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl i64toa_s(__in __int64 _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_i64toa_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl i64tow_s(__in __int64 _Val, __out_ecount_z(_SizeInChars) wchar_t *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_i64tow_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl ui64toa_s(__in unsigned __int64 _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_ui64toa_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl ui64tow_s(__in unsigned __int64 _Val, __out_ecount_z(_SizeInChars) wchar_t *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - ATLMFC_CRT_ERRORCHECK(::_ui64tow_s(_Val, _Buf, _SizeInChars, _Radix)); -} - -inline void __cdecl gcvt_s(__out_ecount_z(_SizeInChars) char *_Buffer, __in size_t _SizeInChars, __in double _Value, __in int _Ndec) -{ - ATLMFC_CRT_ERRORCHECK(::_gcvt_s(_Buffer, _SizeInChars, _Value, _Ndec)); -} - -inline void __cdecl tsplitpath_s(__in_z const TCHAR *_Path, __out_ecount_z_opt(_Drive_len) TCHAR *_Drive, __in size_t _Drive_len, - __out_ecount_z_opt(_Dir_len) TCHAR *_Dir, __in size_t _Dir_len, - __out_ecount_z_opt(_Fname_len) TCHAR *_Fname, __in size_t _Fname_len, - __out_ecount_z_opt(_Ext_len) TCHAR *_Ext, __in size_t _Ext_len) -{ - ATLMFC_CRT_ERRORCHECK(::_tsplitpath_s(_Path, _Drive, _Drive_len, _Dir, _Dir_len, _Fname, _Fname_len, _Ext, _Ext_len)); -} - -inline void __cdecl tmakepath_s(__out_ecount_z(_SizeInChars) TCHAR *_Path, __in size_t _SizeInChars, __in_z const TCHAR *_Drive, - __in_z const TCHAR *_Dir, __in_z const TCHAR *_Fname, __in_z const TCHAR *_Ext) -{ - ATLMFC_CRT_ERRORCHECK(::_tmakepath_s(_Path, _SizeInChars, _Drive, _Dir, _Fname, _Ext)); -} - -inline size_t __cdecl strnlen(__in_ecount(_Maxsize) const char *_Str, __in size_t _Maxsize) -{ - return ::strnlen(_Str, _Maxsize); -} - -inline size_t __cdecl wcsnlen(__in_ecount(_Maxsize) const wchar_t *_Wcs, __in size_t _Maxsize) -{ - return ::wcsnlen(_Wcs, _Maxsize); -} - -inline size_t __cdecl tcsnlen(__in_ecount(_Maxsize) const TCHAR *_Str, __in size_t _Maxsize) -{ - return ::_tcsnlen(_Str, _Maxsize); -} - -inline int get_errno() -{ - int nErrNo; - ATLMFC_CRT_ERRORCHECK(::_get_errno(&nErrNo)); - return nErrNo; -} - -inline void set_errno(__in int _Value) -{ - ATLMFC_CRT_ERRORCHECK(::_set_errno(_Value)); -} - -#else // !_SECURE_ATL - -#define ATLMFC_CRT_ERRORCHECK(expr) do { expr; } while (0) - -inline void __cdecl memcpy_s(__out_bcount(_S1max) void *_S1, __in size_t _S1max, __in_bcount(_N) const void *_S2, size_t _N) -{ - (_S1max); - memcpy(_S1, _S2, _N); -} - -inline void __cdecl wmemcpy_s(__out_ecount(_N1) wchar_t *_S1, __in size_t _N1, __in_ecount(_N) const wchar_t *_S2, __in size_t _N) -{ - (_N1); - ::wmemcpy(_S1, _S2, _N); -} - -inline void __cdecl memmove_s(__out_bcount(_S1max) void *_S1, __in size_t _S1max, __in_bcount(_N) const void *_S2, __in size_t _N) -{ - (_S1max); - memmove(_S1, _S2, _N); -} - -inline void __cdecl strcpy_s(__out_ecount_z(_S1max) char *_S1, __in size_t _S1max, __in_z const char *_S2) -{ - (_S1max); - ::strcpy(_S1, _S2); -} - -inline void __cdecl wcscpy_s(__out_ecount_z(_S1max) wchar_t *_S1, __in size_t _S1max, __in_z const wchar_t *_S2) -{ - (_S1max); - ::wcscpy(_S1, _S2); -} - -inline void __cdecl tcscpy_s(__out_ecount_z(_SizeInChars) TCHAR * _Dst, __in size_t _SizeInChars, __in_z const TCHAR * _Src) -{ - (_SizeInChars); -#ifndef _ATL_MIN_CRT - ::_tcscpy(_Dst, _Src); -#else -#ifdef UNICODE - ::wcscpy(_Dst, _Src); -#else - ::strcpy(_Dst, _Src); -#endif -#endif -} - -/* ensure that strncpy_s null-terminate the dest string */ -inline errno_t __cdecl strncpy_s(__out_ecount_z(_SizeInChars) char *_Dest, __in size_t _SizeInChars, __in_z const char *_Source,__in size_t _Count) -{ - if (_Count == _TRUNCATE) - { - _Count = _SizeInChars - 1; - } - while (_Count > 0 && *_Source != 0) - { - *_Dest++ = *_Source++; - --_Count; - } - *_Dest = 0; - - return (*_Source!=0) ? STRUNCATE : 0; -} - -inline errno_t __cdecl wcsncpy_s(__out_ecount_z(_SizeInChars) wchar_t *_Dest, __in size_t _SizeInChars, __in_z const wchar_t *_Source, __in size_t _Count) -{ - if (_Count == _TRUNCATE) - { - _Count = _SizeInChars - 1; - } - while (_Count > 0 && *_Source != 0) - { - *_Dest++ = *_Source++; - --_Count; - } - *_Dest = 0; - - return (*_Source!=0) ? STRUNCATE : 0; -} - -inline errno_t __cdecl tcsncpy_s(__out_ecount_z(_SizeInChars) TCHAR *_Dest, __in size_t _SizeInChars, __in_z const TCHAR *_Source,__in size_t _Count) -{ - if (_Count == _TRUNCATE) - { - if(_SizeInChars>0) - { - _Count = _SizeInChars - 1; - } - else - { - _Count =0; - } - } - -#ifndef _ATL_MIN_CRT -#pragma warning(push) -#pragma warning(disable: 6535) - ::_tcsncpy(_Dest,_Source,_Count); -#pragma warning(pop) - if(_SizeInChars>0) - { - size_t nulCount = __min(_SizeInChars-1, _Count); - _Dest[nulCount] = 0; - } -#else - while (_Count > 0 && *_Source != 0) - { - *_Dest++ = *_Source++; - --_Count; - } - *_Dest = 0; -#endif - - return (*_Source!=0) ? STRUNCATE : 0; -} - -inline void __cdecl strcat_s(__inout_ecount_z(_SizeInChars) char * _Dst, __in size_t _SizeInChars, __in_z const char * _Src) -{ - (_SizeInChars); - ::strcat(_Dst, _Src); -} - -inline void __cdecl wcscat_s(__inout_ecount_z(_SizeInChars) wchar_t * _Dst, __in size_t _SizeInChars, __in_z const wchar_t * _Src) -{ - (_SizeInChars); - ::wcscat(_Dst, _Src); -} - -inline void __cdecl tcscat_s(__inout_ecount_z(_SizeInChars) TCHAR * _Dst, __in size_t _SizeInChars, __in_z const TCHAR * _Src) -{ - (_SizeInChars); -#ifndef _ATL_MIN_CRT - ::_tcscat(_Dst, _Src); -#else -#ifdef UNICODE - ::wcscat(_Dst, _Src); -#else - ::strcat(_Dst, _Src); -#endif -#endif -} - -inline void __cdecl strlwr_s(__inout_ecount_z(_SizeInChars) char * _Str, size_t _SizeInChars) -{ - (_SizeInChars); - ::_strlwr(_Str); -} - -inline void __cdecl wcslwr_s(__inout_ecount_z(_SizeInChars) wchar_t * _Str, size_t _SizeInChars) -{ - (_SizeInChars); - ::_wcslwr(_Str); -} - -inline void __cdecl mbslwr_s(__inout_bcount_z(_SizeInChars) unsigned char * _Str, size_t _SizeInChars) -{ - (_SizeInChars); - ::_mbslwr(_Str); -} - -inline void __cdecl tcslwr_s(__inout_ecount_z(_SizeInChars) TCHAR * _Str, size_t _SizeInChars) -{ - (_SizeInChars); -#ifndef _ATL_MIN_CRT - ::_tcslwr(_Str); -#else -#ifdef UNICODE - ::_wcslwr(_Str); -#else - ::_strlwr(_Str); -#endif -#endif -} - -inline void __cdecl itoa_s(__in int _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_itoa_s(_Val, _Buf, _SizeInChars, _Radix); -} - -inline void __cdecl itot_s(__in int _Val, __out_ecount_z(_SizeInChars) TCHAR *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_itot(_Val, _Buf, _Radix); -} - -inline void __cdecl ltoa_s(__in long _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_ltoa(_Val, _Buf, _Radix); -} - -inline void __cdecl ltot_s(__in long _Val, __out_ecount_z(_SizeInChars) TCHAR *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_ltot(_Val, _Buf, _Radix); -} - -inline void __cdecl ultoa_s(__in unsigned long _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_ultoa(_Val, _Buf, _Radix); -} - -inline void __cdecl ultow_s(__in unsigned long _Val, __out_ecount_z(_SizeInChars) wchar_t *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_ultow(_Val, _Buf, _Radix); -} - -inline void __cdecl ultot_s(__in unsigned long _Val, __out_ecount_z(_SizeInChars) TCHAR *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_ultot(_Val, _Buf, _Radix); -} - -inline void __cdecl i64toa_s(__in __int64 _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_i64toa(_Val, _Buf, _Radix); -} - -inline void __cdecl i64tow_s(__in __int64 _Val, __out_ecount_z(_SizeInChars) wchar_t *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_i64tow(_Val, _Buf, _Radix); -} - -inline void __cdecl ui64toa_s(__in unsigned __int64 _Val, __out_ecount_z(_SizeInChars) char *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_ui64toa(_Val, _Buf, _Radix); -} - -inline void __cdecl ui64tow_s(__in unsigned __int64 _Val, __out_ecount_z(_SizeInChars) wchar_t *_Buf, __in size_t _SizeInChars, __in int _Radix) -{ - (_SizeInChars); - ::_ui64tow(_Val, _Buf, _Radix); -} - -inline void __cdecl gcvt_s(__out_ecount_z(_SizeInChars) char *_Buffer, __in size_t _SizeInChars, __in double _Value, __in int _Ndec) -{ - (_SizeInChars); - ::_gcvt(_Value, _Ndec, _Buffer); -} - -inline void __cdecl tsplitpath_s(__in_z const TCHAR *_Path, __out_ecount_z_opt(_Drive_len) TCHAR *_Drive, __in size_t _Drive_len, - __out_ecount_z_opt(_Dir_len) TCHAR *_Dir, __in size_t _Dir_len, - __out_ecount_z_opt(_Fname_ext) TCHAR *_Fname, __in size_t _Fname_len, - __out_ecount_z_opt(_Ext_len) TCHAR *_Ext, __in size_t _Ext_len) -{ - (_Drive_len, _Dir_len, _Fname_len, _Ext_len); - ::_tsplitpath(_Path, _Drive, _Dir, _Fname, _Ext); -} - -inline void __cdecl tmakepath_s(__out_ecount_z(_SizeInChars) TCHAR *_Path, __in size_t _SizeInChars, __in_z const TCHAR *_Drive, - __in_z const TCHAR *_Dir, __in_z const TCHAR *_Fname, __in_z const TCHAR *_Ext) -{ - (_SizeInChars); - ::_tmakepath(_Path, _Drive, _Dir, _Fname, _Ext); -} - -inline size_t __cdecl strnlen(__in_ecount(_Maxsize) const char *_Str, __in size_t _Maxsize) -{ - (_Maxsize); - return ::strlen(_Str); -} - -inline size_t __cdecl wcsnlen(__in_ecount(_Maxsize) const wchar_t *_Wcs, __in size_t _Maxsize) -{ - (_Maxsize); - return ::wcslen(_Wcs); -} - -inline size_t __cdecl tcsnlen(__in_ecount(_Maxsize) const TCHAR *_Str, __in size_t _Maxsize) -{ - (_Maxsize); - return ::_tcslen(_Str); -} - -inline int get_errno() -{ - return errno; -} - -inline void set_errno(__in int _Value) -{ - errno = _Value; -} - -#endif // _SECURE_ATL - -} // namespace Checked - -} // namespace ATL -#pragma warning(pop) -#pragma pack(pop) - -#endif // __ATLCHECKED_H__ - -///////////////////////////////////////////////////////////////////////////// - diff --git a/cpp/jacob/include/atlcomcli.h b/cpp/jacob/include/atlcomcli.h deleted file mode 100644 index f0d71cd..0000000 --- a/cpp/jacob/include/atlcomcli.h +++ /dev/null @@ -1,2874 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLCOMCLI_H__ -#define __ATLCOMCLI_H__ - -#pragma once - -#include -#include -#include - -#pragma warning (push) -#pragma warning (disable: 4127) // conditional expression constant -#pragma warning (disable: 4571) //catch(...) blocks compiled with /EHs do NOT catch or re-throw Structured Exceptions - - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ -///////////////////////////////////////////////////////////////////////////// -// Error to HRESULT helpers - -ATL_NOINLINE inline HRESULT AtlHresultFromLastError() throw() -{ - DWORD dwErr = ::GetLastError(); - return HRESULT_FROM_WIN32(dwErr); -} - -ATL_NOINLINE inline HRESULT AtlHresultFromWin32(__in DWORD nError) throw() -{ - return( HRESULT_FROM_WIN32( nError ) ); -} - -///////////////////////////////////////////////////////////////////////////// -// Smart Pointer helpers - -ATLAPI_(IUnknown*) AtlComPtrAssign(__deref_out_opt IUnknown** pp, __in_opt IUnknown* lp); -ATLAPI_(IUnknown*) AtlComQIPtrAssign(__deref_out_opt IUnknown** pp, __in_opt IUnknown* lp, REFIID riid); - -#ifndef _ATL_DLL - -ATLINLINE ATLAPI_(IUnknown*) AtlComPtrAssign(__deref_out_opt IUnknown** pp, __in_opt IUnknown* lp) -{ - if (pp == NULL) - return NULL; - - if (lp != NULL) - lp->AddRef(); - if (*pp) - (*pp)->Release(); - *pp = lp; - return lp; -} - -ATLINLINE ATLAPI_(IUnknown*) AtlComQIPtrAssign(__deref_out_opt IUnknown** pp, __in_opt IUnknown* lp, REFIID riid) -{ - if (pp == NULL) - return NULL; - - IUnknown* pTemp = *pp; - *pp = NULL; - if (lp != NULL) - lp->QueryInterface(riid, (void**)pp); - if (pTemp) - pTemp->Release(); - return *pp; -} - -#endif // _ATL_DLL - -///////////////////////////////////////////////////////////////////////////// -// COM Smart pointers - -template -class _NoAddRefReleaseOnCComPtr : public T -{ - private: - STDMETHOD_(ULONG, AddRef)()=0; - STDMETHOD_(ULONG, Release)()=0; -}; - -inline __checkReturn HRESULT AtlSetChildSite(__inout IUnknown* punkChild, __in_opt IUnknown* punkParent) -{ - if (punkChild == NULL) - return E_POINTER; - - HRESULT hr; - IObjectWithSite* pChildSite = NULL; - hr = punkChild->QueryInterface(__uuidof(IObjectWithSite), (void**)&pChildSite); - if (SUCCEEDED(hr) && pChildSite != NULL) - { - hr = pChildSite->SetSite(punkParent); - pChildSite->Release(); - } - return hr; -} - - -//CComPtrBase provides the basis for all other smart pointers -//The other smartpointers add their own constructors and operators -template -class CComPtrBase -{ -protected: - CComPtrBase() throw() - { - p = NULL; - } - CComPtrBase(__in int nNull) throw() - { - ATLASSERT(nNull == 0); - (void)nNull; - p = NULL; - } - CComPtrBase(__in_opt T* lp) throw() - { - p = lp; - if (p != NULL) - p->AddRef(); - } -public: - typedef T _PtrClass; - ~CComPtrBase() throw() - { - if (p) - p->Release(); - } - operator T*() const throw() - { - return p; - } - T& operator*() const - { - ATLENSURE(p!=NULL); - return *p; - } - //The assert on operator& usually indicates a bug. If this is really - //what is needed, however, take the address of the p member explicitly. - T** operator&() throw() - { - ATLASSERT(p==NULL); - return &p; - } - _NoAddRefReleaseOnCComPtr* operator->() const throw() - { - ATLASSERT(p!=NULL); - return (_NoAddRefReleaseOnCComPtr*)p; - } - bool operator!() const throw() - { - return (p == NULL); - } - bool operator<(__in_opt T* pT) const throw() - { - return p < pT; - } - bool operator!=(__in_opt T* pT) const - { - return !operator==(pT); - } - bool operator==(__in_opt T* pT) const throw() - { - return p == pT; - } - - // Release the interface and set to NULL - void Release() throw() - { - T* pTemp = p; - if (pTemp) - { - p = NULL; - pTemp->Release(); - } - } - // Compare two objects for equivalence - bool IsEqualObject(__in_opt IUnknown* pOther) throw() - { - if (p == NULL && pOther == NULL) - return true; // They are both NULL objects - - if (p == NULL || pOther == NULL) - return false; // One is NULL the other is not - - CComPtr punk1; - CComPtr punk2; - p->QueryInterface(__uuidof(IUnknown), (void**)&punk1); - pOther->QueryInterface(__uuidof(IUnknown), (void**)&punk2); - return punk1 == punk2; - } - // Attach to an existing interface (does not AddRef) - void Attach(__in T* p2) throw() - { - if (p) - p->Release(); - p = p2; - } - // Detach the interface (does not Release) - T* Detach() throw() - { - T* pt = p; - p = NULL; - return pt; - } - __checkReturn HRESULT CopyTo(__deref_out_opt T** ppT) throw() - { - ATLASSERT(ppT != NULL); - if (ppT == NULL) - return E_POINTER; - *ppT = p; - if (p) - p->AddRef(); - return S_OK; - } - __checkReturn HRESULT SetSite(__in_opt IUnknown* punkParent) throw() - { - return AtlSetChildSite(p, punkParent); - } - __checkReturn HRESULT Advise(__in IUnknown* pUnk, __in const IID& iid, __out LPDWORD pdw) throw() - { - return AtlAdvise(p, pUnk, iid, pdw); - } - __checkReturn HRESULT CoCreateInstance(__in REFCLSID rclsid, __in_opt LPUNKNOWN pUnkOuter = NULL, __in DWORD dwClsContext = CLSCTX_ALL) throw() - { - ATLASSERT(p == NULL); - return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p); - } - __checkReturn HRESULT CoCreateInstance(__in LPCOLESTR szProgID, __in_opt LPUNKNOWN pUnkOuter = NULL, __in DWORD dwClsContext = CLSCTX_ALL) throw() - { - CLSID clsid; - HRESULT hr = CLSIDFromProgID(szProgID, &clsid); - ATLASSERT(p == NULL); - if (SUCCEEDED(hr)) - hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p); - return hr; - } - template - __checkReturn HRESULT QueryInterface(__deref_out_opt Q** pp) const throw() - { - ATLASSERT(pp != NULL); - return p->QueryInterface(__uuidof(Q), (void**)pp); - } - T* p; -}; - -template -class CComPtr : public CComPtrBase -{ -public: - CComPtr() throw() - { - } - CComPtr(int nNull) throw() : - CComPtrBase(nNull) - { - } - CComPtr(T* lp) throw() : - CComPtrBase(lp) - - { - } - CComPtr(__in const CComPtr& lp) throw() : - CComPtrBase(lp.p) - { - } - T* operator=(__in_opt T* lp) throw() - { - if(*this!=lp) - { - return static_cast(AtlComPtrAssign((IUnknown**)&p, lp)); - } - return *this; - } - template - T* operator=(__in const CComPtr& lp) throw() - { - if( !IsEqualObject(lp) ) - { - return static_cast(AtlComQIPtrAssign((IUnknown**)&p, lp, __uuidof(T))); - } - return *this; - } - T* operator=(__in const CComPtr& lp) throw() - { - if(*this!=lp) - { - return static_cast(AtlComPtrAssign((IUnknown**)&p, lp)); - } - return *this; - } -}; - -//specialization for IDispatch -template <> -class CComPtr : public CComPtrBase -{ -public: - CComPtr() throw() - { - } - CComPtr(IDispatch* lp) throw() : - CComPtrBase(lp) - { - } - CComPtr(const CComPtr& lp) throw() : - CComPtrBase(lp.p) - { - } - IDispatch* operator=(IDispatch* lp) throw() - { - if(*this!=lp) - { - return static_cast(AtlComPtrAssign((IUnknown**)&p, lp)); - } - return *this; - } - IDispatch* operator=(const CComPtr& lp) throw() - { - if(*this!=lp) - { - return static_cast(AtlComPtrAssign((IUnknown**)&p, lp.p)); - } - return *this; - } - -// IDispatch specific stuff - __checkReturn HRESULT GetPropertyByName(__in LPCOLESTR lpsz, __out VARIANT* pVar) throw() - { - ATLASSERT(p); - ATLASSERT(pVar); - DISPID dwDispID; - HRESULT hr = GetIDOfName(lpsz, &dwDispID); - if (SUCCEEDED(hr)) - hr = GetProperty(dwDispID, pVar); - return hr; - } - __checkReturn HRESULT GetProperty(__in DISPID dwDispID, __out VARIANT* pVar) throw() - { - return GetProperty(p, dwDispID, pVar); - } - __checkReturn HRESULT PutPropertyByName(__in LPCOLESTR lpsz, __in VARIANT* pVar) throw() - { - ATLASSERT(p); - ATLASSERT(pVar); - DISPID dwDispID; - HRESULT hr = GetIDOfName(lpsz, &dwDispID); - if (SUCCEEDED(hr)) - hr = PutProperty(dwDispID, pVar); - return hr; - } - __checkReturn HRESULT PutProperty(__in DISPID dwDispID, __in VARIANT* pVar) throw() - { - return PutProperty(p, dwDispID, pVar); - } - __checkReturn HRESULT GetIDOfName(__in LPCOLESTR lpsz, __out DISPID* pdispid) throw() - { - return p->GetIDsOfNames(IID_NULL, const_cast(&lpsz), 1, LOCALE_USER_DEFAULT, pdispid); - } - // Invoke a method by DISPID with no parameters - __checkReturn HRESULT Invoke0(__in DISPID dispid, __out_opt VARIANT* pvarRet = NULL) throw() - { - DISPPARAMS dispparams = { NULL, NULL, 0, 0}; - return p->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL); - } - // Invoke a method by name with no parameters - __checkReturn HRESULT Invoke0(__in LPCOLESTR lpszName, __out_opt VARIANT* pvarRet = NULL) throw() - { - HRESULT hr; - DISPID dispid; - hr = GetIDOfName(lpszName, &dispid); - if (SUCCEEDED(hr)) - hr = Invoke0(dispid, pvarRet); - return hr; - } - // Invoke a method by DISPID with a single parameter - __checkReturn HRESULT Invoke1(__in DISPID dispid, VARIANT* pvarParam1, __out_opt VARIANT* pvarRet = NULL) throw() - { - DISPPARAMS dispparams = { pvarParam1, NULL, 1, 0}; - return p->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL); - } - // Invoke a method by name with a single parameter - __checkReturn HRESULT Invoke1(__in LPCOLESTR lpszName, VARIANT* pvarParam1, __out_opt VARIANT* pvarRet = NULL) throw() - { - HRESULT hr; - DISPID dispid; - hr = GetIDOfName(lpszName, &dispid); - if (SUCCEEDED(hr)) - hr = Invoke1(dispid, pvarParam1, pvarRet); - return hr; - } - // Invoke a method by DISPID with two parameters - __checkReturn HRESULT Invoke2(__in DISPID dispid, __in VARIANT* pvarParam1, __in VARIANT* pvarParam2, __out_opt VARIANT* pvarRet = NULL) throw(); - // Invoke a method by name with two parameters - __checkReturn HRESULT Invoke2(__in LPCOLESTR lpszName, __in VARIANT* pvarParam1, __in VARIANT* pvarParam2, __out_opt VARIANT* pvarRet = NULL) throw() - { - HRESULT hr; - DISPID dispid; - hr = GetIDOfName(lpszName, &dispid); - if (SUCCEEDED(hr)) - hr = Invoke2(dispid, pvarParam1, pvarParam2, pvarRet); - return hr; - } - // Invoke a method by DISPID with N parameters - __checkReturn HRESULT InvokeN(DISPID dispid, VARIANT* pvarParams, int nParams, VARIANT* pvarRet = NULL) throw() - { - DISPPARAMS dispparams = { pvarParams, NULL, nParams, 0}; - return p->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL); - } - // Invoke a method by name with Nparameters - __checkReturn HRESULT InvokeN(LPCOLESTR lpszName, VARIANT* pvarParams, int nParams, VARIANT* pvarRet = NULL) throw() - { - HRESULT hr; - DISPID dispid; - hr = GetIDOfName(lpszName, &dispid); - if (SUCCEEDED(hr)) - hr = InvokeN(dispid, pvarParams, nParams, pvarRet); - return hr; - } - static __checkReturn HRESULT PutProperty(__inout IDispatch* p, __in DISPID dwDispID, __in VARIANT* pVar) throw() - { - ATLASSERT(p); - ATLASSERT(pVar != NULL); - if (pVar == NULL) - return E_POINTER; - - if(p == NULL) - return E_INVALIDARG; - - ATLTRACE(atlTraceCOM, 2, _T("CPropertyHelper::PutProperty\n")); - DISPPARAMS dispparams = {NULL, NULL, 1, 1}; - dispparams.rgvarg = pVar; - DISPID dispidPut = DISPID_PROPERTYPUT; - dispparams.rgdispidNamedArgs = &dispidPut; - - if (pVar->vt == VT_UNKNOWN || pVar->vt == VT_DISPATCH || - (pVar->vt & VT_ARRAY) || (pVar->vt & VT_BYREF)) - { - HRESULT hr = p->Invoke(dwDispID, IID_NULL, - LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUTREF, - &dispparams, NULL, NULL, NULL); - if (SUCCEEDED(hr)) - return hr; - } - return p->Invoke(dwDispID, IID_NULL, - LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, - &dispparams, NULL, NULL, NULL); - } - static __checkReturn HRESULT GetProperty(__in IDispatch* p, __in DISPID dwDispID, __out VARIANT* pVar) throw() - { - ATLASSERT(p); - ATLASSERT(pVar != NULL); - if (pVar == NULL) - return E_POINTER; - - if(p == NULL) - return E_INVALIDARG; - - ATLTRACE(atlTraceCOM, 2, _T("CPropertyHelper::GetProperty\n")); - DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; - return p->Invoke(dwDispID, IID_NULL, - LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, - &dispparamsNoArgs, pVar, NULL, NULL); - } -}; - -template -class CComQIPtr : public CComPtr -{ -public: - CComQIPtr() throw() - { - } - CComQIPtr(__in T* lp) throw() : - CComPtr(lp) - { - } - CComQIPtr(__in const CComQIPtr& lp) throw() : - CComPtr(lp.p) - { - } - CComQIPtr(__in_opt IUnknown* lp) throw() - { - if (lp != NULL) - lp->QueryInterface(*piid, (void **)&p); - } - T* operator=(__in T* lp) throw() - { - if(*this!=lp) - { - return static_cast(AtlComPtrAssign((IUnknown**)&p, lp)); - } - return *this; - } - T* operator=(__in const CComQIPtr& lp) throw() - { - if(*this!=lp) - { - return static_cast(AtlComPtrAssign((IUnknown**)&p, lp.p)); - } - return *this; - } - T* operator=(__in IUnknown* lp) throw() - { - if(*this!=lp) - { - return static_cast(AtlComQIPtrAssign((IUnknown**)&p, lp, *piid)); - } - return *this; - } -}; - -//Specialization to make it work -template<> -class CComQIPtr : public CComPtr -{ -public: - CComQIPtr() throw() - { - } - CComQIPtr(__in IUnknown* lp) throw() - { - //Actually do a QI to get identity - if (lp != NULL) - lp->QueryInterface(__uuidof(IUnknown), (void **)&p); - } - CComQIPtr(__in const CComQIPtr& lp) throw() : - CComPtr(lp.p) - { - } - IUnknown* operator=(__in IUnknown* lp) throw() - { - if(*this!=lp) - { - //Actually do a QI to get identity - return AtlComQIPtrAssign((IUnknown**)&p, lp, __uuidof(IUnknown)); - } - return *this; - } - - IUnknown* operator=(__in const CComQIPtr& lp) throw() - { - if(*this!=lp) - { - return AtlComPtrAssign((IUnknown**)&p, lp.p); - } - return *this; - } -}; - -typedef CComQIPtr CComDispatchDriver; - -#define com_cast ATL::CComQIPtr -#ifndef _ATL_STREAM_MAX_SIZE -#define _ATL_STREAM_MAX_SIZE 0x100000 -#endif - - -///////////////////////////////////////////////////////////////////////////// -// CComBSTR - -class CComBSTR -{ -public: - BSTR m_str; - - CComBSTR() throw() - { - m_str = NULL; - } - - CComBSTR(__in int nSize) - { - if (nSize == 0) - m_str = NULL; - else - { - m_str = ::SysAllocStringLen(NULL, nSize); - if (!*this) - { - AtlThrow(E_OUTOFMEMORY); - } - } - } - - CComBSTR(__in int nSize, __in_ecount_opt(nSize) LPCOLESTR sz) - { - if (nSize == 0) - { - m_str = NULL; - } - else - { - m_str = ::SysAllocStringLen(sz, nSize); - if (!*this) - { - AtlThrow(E_OUTOFMEMORY); - } - } - } - - CComBSTR(__in_opt LPCOLESTR pSrc) - { - if (pSrc == NULL) - { - m_str = NULL; - } - else - { - m_str = ::SysAllocString(pSrc); - if (!*this) - { - AtlThrow(E_OUTOFMEMORY); - } - } - } - - CComBSTR(__in const CComBSTR& src) - { - m_str = src.Copy(); - if (!!src && !*this) - { - AtlThrow(E_OUTOFMEMORY); - } - } - - CComBSTR(__in REFGUID guid) - { - OLECHAR szGUID[64]; - ::StringFromGUID2(guid, szGUID, 64); - m_str = ::SysAllocString(szGUID); - if (!*this) - { - AtlThrow(E_OUTOFMEMORY); - } - } - - CComBSTR& operator=(__in const CComBSTR& src) - { - if (m_str != src.m_str) - { - ::SysFreeString(m_str); - m_str = src.Copy(); - if (!!src && !*this) - { - AtlThrow(E_OUTOFMEMORY); - } - } - return *this; - } - - CComBSTR& operator=(__in_opt LPCOLESTR pSrc) - { - if (pSrc != m_str) - { - ::SysFreeString(m_str); - if (pSrc != NULL) - { - m_str = ::SysAllocString(pSrc); - if (!*this) - { - AtlThrow(E_OUTOFMEMORY); - } - } - else - { - m_str = NULL; - } - } - return *this; - } - - ~CComBSTR() throw(); - - unsigned int Length() const throw() - { - return ::SysStringLen(m_str); - } - - unsigned int ByteLength() const throw() - { - return ::SysStringByteLen(m_str); - } - - operator BSTR() const throw() - { - return m_str; - } - - -#ifndef ATL_CCOMBSTR_ADDRESS_OF_ASSERT -// Temp disable CComBSTR::operator& Assert -#define ATL_NO_CCOMBSTR_ADDRESS_OF_ASSERT -#endif - - - BSTR* operator&() throw() - { -#ifndef ATL_NO_CCOMBSTR_ADDRESS_OF_ASSERT -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "We are deliberately checking if this has already been allocated") - ATLASSERT(!*this); -#pragma prefast(pop) -#pragma warning(pop) -#endif - return &m_str; - } - - BSTR Copy() const throw() - { - if (!*this) - { - return NULL; - } - return ::SysAllocStringByteLen((char*)m_str, ::SysStringByteLen(m_str)); - } - - __checkReturn HRESULT CopyTo(__inout_opt BSTR* pbstr) throw() - { - ATLASSERT(pbstr != NULL); - if (pbstr == NULL) - { - return E_POINTER; - } - *pbstr = Copy(); -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "We are checking allocation semantics here") - if ((*pbstr == NULL) && (m_str != NULL)) - { - return E_OUTOFMEMORY; - } -#pragma prefast(pop) -#pragma warning(pop) - return S_OK; - } - - // copy BSTR to VARIANT - __checkReturn HRESULT CopyTo(__out_opt VARIANT *pvarDest) throw() - { - ATLASSERT(pvarDest != NULL); - HRESULT hRes = E_POINTER; - if (pvarDest != NULL) - { - pvarDest->vt = VT_BSTR; - pvarDest->bstrVal = Copy(); -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "We are checking allocation semantics here") - if (pvarDest->bstrVal == NULL && m_str != NULL) - { - hRes = E_OUTOFMEMORY; - } -#pragma prefast(pop) -#pragma warning(pop) - else - { - hRes = S_OK; - } - } - return hRes; - } - - void Attach(__in BSTR src) throw() - { - if (m_str != src) - { - ::SysFreeString(m_str); - m_str = src; - } - } - - BSTR Detach() throw() - { - BSTR s = m_str; - m_str = NULL; - return s; - } - - void Empty() throw() - { - ::SysFreeString(m_str); - m_str = NULL; - } - - bool operator!() const throw() - { -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - return (m_str == NULL); -#pragma prefast(pop) -#pragma warning(pop) - } - - __checkReturn HRESULT Append(__in const CComBSTR& bstrSrc) throw() - { - return AppendBSTR(bstrSrc.m_str); - } - - __checkReturn HRESULT Append(__in_opt LPCOLESTR lpsz) throw() - { - return Append(lpsz, UINT(ocslen(lpsz))); - } - - // a BSTR is just a LPCOLESTR so we need a special version to signify - // that we are appending a BSTR - __checkReturn HRESULT AppendBSTR(__in_opt BSTR p) throw() - { - if (::SysStringLen(p) == 0) - { - return S_OK; - } - BSTR bstrNew = NULL; - HRESULT hr; - hr = VarBstrCat(m_str, p, &bstrNew); - if (SUCCEEDED(hr)) - { - ::SysFreeString(m_str); - m_str = bstrNew; - } - return hr; - } - - __checkReturn HRESULT Append(__in_ecount_opt(nLen) LPCOLESTR lpsz, __in int nLen) throw() - { -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - if (lpsz == NULL || (m_str != NULL && nLen == 0)) -#pragma prefast(pop) -#pragma warning(pop) - return S_OK; - int n1 = Length(); - if (n1+nLen < n1) - return E_OUTOFMEMORY; - BSTR b; - b = ::SysAllocStringLen(NULL, n1+nLen); -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - if (b == NULL) -#pragma prefast(pop) -#pragma warning(pop) - return E_OUTOFMEMORY; - if(::SysStringLen(m_str) > 0) - { - Checked::memcpy_s(b, (n1+nLen)*sizeof(OLECHAR), m_str, n1*sizeof(OLECHAR)); - } - Checked::memcpy_s(b+n1, nLen*sizeof(OLECHAR), lpsz, nLen*sizeof(OLECHAR)); - b[n1+nLen] = NULL; - SysFreeString(m_str); - m_str = b; - return S_OK; - } - - __checkReturn HRESULT Append(__in char ch) throw() - { - OLECHAR chO = ch; - - return( Append( &chO, 1 ) ); - } - - __checkReturn HRESULT Append(__in wchar_t ch) throw() - { - return( Append( &ch, 1 ) ); - } - - __checkReturn HRESULT AppendBytes(__in_ecount_opt(nLen) const char* lpsz, __in int nLen) throw() - { - if (lpsz == NULL || nLen == 0) - return S_OK; - int n1 = ByteLength(); - if (n1+nLen < n1) - return E_OUTOFMEMORY; - BSTR b; - b = ::SysAllocStringByteLen(NULL, n1+nLen); - if (b == NULL) - { - return E_OUTOFMEMORY; - } - Checked::memcpy_s(b, n1+nLen, m_str, n1); - Checked::memcpy_s(((char*)b)+n1, nLen, lpsz, nLen); - *((OLECHAR*)(((char*)b)+n1+nLen)) = NULL; - SysFreeString(m_str); - m_str = b; - return S_OK; - } - - __checkReturn HRESULT AssignBSTR(const BSTR bstrSrc) throw() - { - HRESULT hr = S_OK; - if (m_str != bstrSrc) - { - ::SysFreeString(m_str); -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - if (bstrSrc != NULL) -#pragma prefast(pop) -#pragma warning(pop) - { - m_str = ::SysAllocStringByteLen((char*)bstrSrc, ::SysStringByteLen(bstrSrc)); - if (!*this) - { - hr = E_OUTOFMEMORY; - } - } - else - { - m_str = NULL; - } - } - - return hr; - } - - __checkReturn HRESULT ToLower() throw() - { - if (::SysStringLen(m_str) > 0) - { -#ifdef _UNICODE - // Convert in place - CharLowerBuff(m_str, Length()); -#else - // Cannot use conversion macros due to possible embedded NULLs - UINT _acp = _AtlGetConversionACP(); - int _convert = WideCharToMultiByte(_acp, 0, m_str, Length(), NULL, 0, NULL, NULL); - CTempBuffer pszA; - ATLTRY(pszA.Allocate(_convert)); - if (pszA == NULL) - return E_OUTOFMEMORY; - - int nRet = WideCharToMultiByte(_acp, 0, m_str, Length(), pszA, _convert, NULL, NULL); - if (nRet == 0) - { - ATLASSERT(0); - return AtlHresultFromLastError(); - } - - CharLowerBuff(pszA, nRet); - - _convert = MultiByteToWideChar(_acp, 0, pszA, nRet, NULL, 0); - - CTempBuffer pszW; - ATLTRY(pszW.Allocate(_convert)); - if (pszW == NULL) - return E_OUTOFMEMORY; - - nRet = MultiByteToWideChar(_acp, 0, pszA, nRet, pszW, _convert); - if (nRet <= 0) - { - ATLASSERT(0); - return AtlHresultFromLastError(); - } - - UINT nBytes=0; - HRESULT hr=S_OK; - if( FAILED(hr=::ATL::AtlMultiply(&nBytes, static_cast(nRet), static_cast(sizeof(OLECHAR))))) - { - return hr; - } - BSTR b = ::SysAllocStringByteLen((LPCSTR) (LPWSTR) pszW, nBytes); - if (b == NULL) - return E_OUTOFMEMORY; - SysFreeString(m_str); - m_str = b; -#endif - } - return S_OK; - } - __checkReturn HRESULT ToUpper() throw() - { - if (::SysStringLen(m_str) > 0) - { -#ifdef _UNICODE - // Convert in place - CharUpperBuff(m_str, Length()); -#else - // Cannot use conversion macros due to possible embedded NULLs - UINT _acp = _AtlGetConversionACP(); - int _convert = WideCharToMultiByte(_acp, 0, m_str, Length(), NULL, 0, NULL, NULL); - CTempBuffer pszA; - ATLTRY(pszA.Allocate(_convert)); - if (pszA == NULL) - return E_OUTOFMEMORY; - - int nRet = WideCharToMultiByte(_acp, 0, m_str, Length(), pszA, _convert, NULL, NULL); - if (nRet == 0) - { - ATLASSERT(0); - return AtlHresultFromLastError(); - } - - CharUpperBuff(pszA, nRet); - - _convert = MultiByteToWideChar(_acp, 0, pszA, nRet, NULL, 0); - - CTempBuffer pszW; - ATLTRY(pszW.Allocate(_convert)); - if (pszW == NULL) - return E_OUTOFMEMORY; - - nRet = MultiByteToWideChar(_acp, 0, pszA, nRet, pszW, _convert); - if (nRet <= 0) - { - ATLASSERT(0); - return AtlHresultFromLastError(); - } - - UINT nBytes=0; - HRESULT hr=S_OK; - if( FAILED(hr=::ATL::AtlMultiply(&nBytes, static_cast(nRet), static_cast(sizeof(OLECHAR))))) - { - return hr; - } - BSTR b = ::SysAllocStringByteLen((LPCSTR) (LPWSTR) pszW, nBytes); - if (b == NULL) - return E_OUTOFMEMORY; - SysFreeString(m_str); - m_str = b; -#endif - } - return S_OK; - } - - bool LoadString(__in HINSTANCE hInst, __in UINT nID) throw() - { - ::SysFreeString(m_str); - m_str = NULL; - return LoadStringResource(hInst, nID, m_str); - } - - bool LoadString(__in UINT nID) throw() - { - ::SysFreeString(m_str); - m_str = NULL; - return LoadStringResource(nID, m_str); - } - - CComBSTR& operator+=(__in const CComBSTR& bstrSrc) - { - HRESULT hr; - hr = AppendBSTR(bstrSrc.m_str); - if (FAILED(hr)) - AtlThrow(hr); - return *this; - } - - CComBSTR& operator+=(__in_opt LPCOLESTR pszSrc) - { - HRESULT hr; - hr = Append(pszSrc); - if (FAILED(hr)) - AtlThrow(hr); - return *this; - } - - bool operator<(const CComBSTR& bstrSrc) const throw() - { - return VarBstrCmp(m_str, bstrSrc.m_str, LOCALE_USER_DEFAULT, 0) == static_cast(VARCMP_LT); - } - bool operator<(__in_z LPCOLESTR pszSrc) const - { - CComBSTR bstr2(pszSrc); - return operator<(bstr2); - } - bool operator<(__in_z LPOLESTR pszSrc) const - { - return operator<((LPCOLESTR)pszSrc); - } - - bool operator>(const CComBSTR& bstrSrc) const throw() - { - return VarBstrCmp(m_str, bstrSrc.m_str, LOCALE_USER_DEFAULT, 0) == static_cast(VARCMP_GT); - } - bool operator>(__in_z LPCOLESTR pszSrc) const - { - CComBSTR bstr2(pszSrc); - return operator>(bstr2); - } - bool operator>(__in_z LPOLESTR pszSrc) const - { - return operator>((LPCOLESTR)pszSrc); - } - - bool operator!=(const CComBSTR& bstrSrc) const throw() - { - return !operator==(bstrSrc); - } - bool operator!=(__in_z LPCOLESTR pszSrc) const - { - return !operator==(pszSrc); - } - bool operator!=(int nNull) const throw() - { - return !operator==(nNull); - } - bool operator!=(__in_z LPOLESTR pszSrc) const - { - return operator!=((LPCOLESTR)pszSrc); - } - - bool operator==(const CComBSTR& bstrSrc) const throw() - { - return VarBstrCmp(m_str, bstrSrc.m_str, LOCALE_USER_DEFAULT, 0) == static_cast(VARCMP_EQ); - } - bool operator==(__in_z LPCOLESTR pszSrc) const - { - CComBSTR bstr2(pszSrc); - return operator==(bstr2); - } - bool operator==(__in_z LPOLESTR pszSrc) const - { - return operator==((LPCOLESTR)pszSrc); - } - - bool operator==(int nNull) const throw() - { - ATLASSERT(nNull == NULL); - (void)nNull; - return (!*this); - } - - CComBSTR(__in LPCSTR pSrc) - { - if (pSrc != NULL) - { - m_str = A2WBSTR(pSrc); - if (!*this) - { - AtlThrow(E_OUTOFMEMORY); - } - } - else - { - m_str = NULL; - } - } - - CComBSTR(__in int nSize, __in_ecount_opt(nSize) LPCSTR sz) - { - if (nSize != 0 && sz == NULL) - { - m_str = ::SysAllocStringLen(NULL, nSize); - if (!*this) - { - AtlThrow(E_OUTOFMEMORY); - } - return; - } - - m_str = A2WBSTR(sz, nSize); - if (!*this && nSize != 0) - { - AtlThrow(E_OUTOFMEMORY); - } - } - - __checkReturn HRESULT Append(__in LPCSTR lpsz) throw() - { - if (lpsz == NULL) - return S_OK; - - CComBSTR bstrTemp; - ATLTRY(bstrTemp = lpsz); - if (!bstrTemp) - { - return E_OUTOFMEMORY; - } - return Append(bstrTemp); - } - - CComBSTR& operator=(__in LPCSTR pSrc) - { - ::SysFreeString(m_str); - m_str = A2WBSTR(pSrc); - if (!*this && pSrc != NULL) - { - AtlThrow(E_OUTOFMEMORY); - } - return *this; - } - - bool operator<(__in_z LPCSTR pszSrc) const - { - CComBSTR bstr2(pszSrc); - return operator<(bstr2); - } - bool operator>(__in_z LPCSTR pszSrc) const - { - CComBSTR bstr2(pszSrc); - return operator>(bstr2); - } - bool operator!=(__in_z LPCSTR pszSrc) const - { - return !operator==(pszSrc); - } - bool operator==(__in_z LPCSTR pszSrc) const - { - CComBSTR bstr2(pszSrc); - return operator==(bstr2); - } - - __checkReturn HRESULT WriteToStream(__inout IStream* pStream) throw() - { - ATLASSERT(pStream != NULL); - if(pStream == NULL) - return E_INVALIDARG; - - ULONG cb; - ULONG cbStrLen = CComBSTR::GetStreamSize(m_str) - sizeof(ULONG); - HRESULT hr = pStream->Write((void*) &cbStrLen, sizeof(cbStrLen), &cb); - if (FAILED(hr)) - return hr; - return cbStrLen ? pStream->Write((void*) m_str, cbStrLen, &cb) : S_OK; - } - - __checkReturn HRESULT ReadFromStream(__inout IStream* pStream) throw() - { - ATLASSERT(pStream != NULL); - if(pStream == NULL) - { - return E_INVALIDARG; - } - - ATLASSERT(!*this); // should be empty - Empty(); - - HRESULT hrSeek; - ULARGE_INTEGER nBegOffset; - { - LARGE_INTEGER nZeroOffset; - nZeroOffset.QuadPart = 0L; - hrSeek = pStream->Seek(nZeroOffset, STREAM_SEEK_CUR, &nBegOffset); - } - - ULONG cbRead = 0; - ULONG cbStrLen = 0; - HRESULT hr = pStream->Read(reinterpret_cast(&cbStrLen), sizeof(cbStrLen), &cbRead); - - if (SUCCEEDED(hr)) - { - // invalid data sizes - if (sizeof(cbStrLen) != cbRead) - { - ATLTRACE(atlTraceCOM, 0, _T("Input stream is corrupted.")); - hr = E_FAIL; - } - // check for NULL bstr - else if (cbStrLen == 0) - { - } - // security checks when system hang for huge stream of data - else if (cbStrLen > _ATL_STREAM_MAX_SIZE) - { - ATLTRACE(atlTraceCOM, 0, _T("String exceeded the maximum allowed size see _ATL_STREAM_MAX_SIZE.")); - hr = E_ACCESSDENIED; - } - else - { - //subtract size for terminating NULL which we wrote out - cbStrLen -= sizeof(OLECHAR); - - m_str = ::SysAllocStringByteLen(NULL, cbStrLen); - if (!*this) - { - hr = E_OUTOFMEMORY; - } - else - { - hr = pStream->Read(reinterpret_cast(m_str), cbStrLen, &cbRead); - - if (SUCCEEDED(hr)) - { - if (cbRead != cbStrLen) - { - ATLTRACE(atlTraceCOM, 0, _T("Length of string data is different than expected.")); - hr = E_FAIL; - } - else - { - OLECHAR ch; - hr = pStream->Read(reinterpret_cast(&ch), sizeof(OLECHAR), &cbRead); - - if (SUCCEEDED(hr)) - { - if (cbRead != sizeof(OLECHAR)) - { - ATLTRACE(atlTraceCOM, 0, _T("Cannot read NULL terminator from stream.")); - hr = E_FAIL; - } - else - { - //check if string is properly terminated with NULL - ATLASSERT(ch == L'\0'); - } - } - } - } - - if (FAILED(hr)) - { - ::SysFreeString(m_str); - m_str = NULL; - } - } - } - } - - // If SysAllocStringByteLen or IStream::Read failed, reset seek - // pointer to start of BSTR size. - if (FAILED(hr) && SUCCEEDED(hrSeek)) - { - LARGE_INTEGER nOffset; - nOffset.QuadPart = static_cast(nBegOffset.QuadPart); - pStream->Seek(nOffset, STREAM_SEEK_SET, NULL); - } - - return hr; - } - - static bool LoadStringResource(__in HINSTANCE hInstance, __in UINT uID, __deref_out_opt BSTR& bstrText) throw() - { - const ATLSTRINGRESOURCEIMAGE* pImage; - -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - ATLASSERT(bstrText == NULL); -#pragma prefast(pop) -#pragma warning(pop) - - pImage = AtlGetStringResourceImage(hInstance, uID); - if (pImage != NULL) - { - bstrText = ::SysAllocStringLen(pImage->achString, pImage->nLength); - } -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - return (bstrText != NULL) ? true : false; -#pragma prefast(pop) -#pragma warning(pop) - } - - static bool LoadStringResource(__in UINT uID, __deref_out_opt BSTR& bstrText) throw() - { - const ATLSTRINGRESOURCEIMAGE* pImage; - -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - ATLASSERT(bstrText == NULL); -#pragma prefast(pop) -#pragma warning(pop) - - pImage = AtlGetStringResourceImage(uID); - if (pImage != NULL) - { - bstrText = ::SysAllocStringLen(pImage->achString, pImage->nLength); - } - -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - return (bstrText != NULL) ? true : false; -#pragma prefast(pop) -#pragma warning(pop) - } - - // each character in BSTR is copied to each element in SAFEARRAY - __success(return>=0) HRESULT BSTRToArray(__deref_out LPSAFEARRAY *ppArray) throw() - { - return VectorFromBstr(m_str, ppArray); - } - - // first character of each element in SAFEARRAY is copied to BSTR - __checkReturn HRESULT ArrayToBSTR(__in const SAFEARRAY *pSrc) throw() - { - ::SysFreeString(m_str); - return BstrFromVector((LPSAFEARRAY)pSrc, &m_str); - } - static ULONG GetStreamSize(BSTR bstr) - { - ULONG ulSize=sizeof(ULONG); -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - if (bstr != NULL) -#pragma prefast(pop) -#pragma warning(pop) - { - ulSize += SysStringByteLen(bstr) + sizeof(OLECHAR); - } - return ulSize; - } -}; - -inline CComBSTR::~CComBSTR() throw() - { - ::SysFreeString(m_str); - } - -inline void SysFreeStringHelper(__in CComBSTR& bstr) -{ - bstr.Empty(); -} - -inline void SysFreeStringHelper(BSTR bstr) -{ - ::SysFreeString(bstr); -} - -inline __checkReturn HRESULT SysAllocStringHelper(__out_opt CComBSTR& bstrDest,BSTR bstrSrc) -{ - bstrDest=bstrSrc; - return !bstrDest ? E_OUTOFMEMORY : S_OK; -} - -inline __checkReturn HRESULT SysAllocStringHelper(__out_opt BSTR& bstrDest,BSTR bstrSrc) -{ - bstrDest=::SysAllocString(bstrSrc); -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "The semantics of this function are about allocation, not content") - return bstrDest==NULL ? E_OUTOFMEMORY : S_OK; -#pragma prefast(pop) -#pragma warning(pop) -} - -///////////////////////////////////////////////////////////// -// Class to Adapt CComBSTR and CComPtr for use with STL containers -// the syntax to use it is -// std::vector< CAdapt > vect; - -template -class CAdapt -{ -public: - CAdapt() - { - } - CAdapt(__in const T& rSrc) : - m_T( rSrc ) - { - } - - CAdapt(__in const CAdapt& rSrCA) : - m_T( rSrCA.m_T ) - { - } - - CAdapt& operator=(__in const T& rSrc) - { - m_T = rSrc; - return *this; - } - bool operator<(__in const T& rSrc) const - { - return m_T < rSrc; - } - bool operator==(__in const T& rSrc) const - { - return m_T == rSrc; - } - operator T&() - { - return m_T; - } - - operator const T&() const - { - return m_T; - } - - T m_T; -}; - -///////////////////////////////////////////////////////////////////////////// -// CComVariant - - -#define ATL_VARIANT_TRUE VARIANT_BOOL( -1 ) -#define ATL_VARIANT_FALSE VARIANT_BOOL( 0 ) - -template< typename T > -class CVarTypeInfo -{ -// static const VARTYPE VT; // VARTYPE corresponding to type T -// static T VARIANT::* const pmField; // Pointer-to-member of corresponding field in VARIANT struct -}; - -template<> -class CVarTypeInfo< char > -{ -public: - static const VARTYPE VT = VT_I1; - static char VARIANT::* const pmField; -}; - -__declspec( selectany ) char VARIANT::* const CVarTypeInfo< char >::pmField = &VARIANT::cVal; - -template<> -class CVarTypeInfo< unsigned char > -{ -public: - static const VARTYPE VT = VT_UI1; - static unsigned char VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned char VARIANT::* const CVarTypeInfo< unsigned char >::pmField = &VARIANT::bVal; - -template<> -class CVarTypeInfo< char* > -{ -public: - static const VARTYPE VT = VT_I1|VT_BYREF; - static char* VARIANT::* const pmField; -}; - -__declspec( selectany ) char* VARIANT::* const CVarTypeInfo< char* >::pmField = &VARIANT::pcVal; - -template<> -class CVarTypeInfo< unsigned char* > -{ -public: - static const VARTYPE VT = VT_UI1|VT_BYREF; - static unsigned char* VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned char* VARIANT::* const CVarTypeInfo< unsigned char* >::pmField = &VARIANT::pbVal; - -template<> -class CVarTypeInfo< short > -{ -public: - static const VARTYPE VT = VT_I2; - static short VARIANT::* const pmField; -}; - -__declspec( selectany ) short VARIANT::* const CVarTypeInfo< short >::pmField = &VARIANT::iVal; - -template<> -class CVarTypeInfo< short* > -{ -public: - static const VARTYPE VT = VT_I2|VT_BYREF; - static short* VARIANT::* const pmField; -}; - -__declspec( selectany ) short* VARIANT::* const CVarTypeInfo< short* >::pmField = &VARIANT::piVal; - -template<> -class CVarTypeInfo< unsigned short > -{ -public: - static const VARTYPE VT = VT_UI2; - static unsigned short VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned short VARIANT::* const CVarTypeInfo< unsigned short >::pmField = &VARIANT::uiVal; - -#ifdef _NATIVE_WCHAR_T_DEFINED // Only treat unsigned short* as VT_UI2|VT_BYREF if BSTR isn't the same as unsigned short* -template<> -class CVarTypeInfo< unsigned short* > -{ -public: - static const VARTYPE VT = VT_UI2|VT_BYREF; - static unsigned short* VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned short* VARIANT::* const CVarTypeInfo< unsigned short* >::pmField = &VARIANT::puiVal; -#endif // _NATIVE_WCHAR_T_DEFINED - -template<> -class CVarTypeInfo< int > -{ -public: - static const VARTYPE VT = VT_I4; - static int VARIANT::* const pmField; -}; - -__declspec( selectany ) int VARIANT::* const CVarTypeInfo< int >::pmField = &VARIANT::intVal; - -template<> -class CVarTypeInfo< int* > -{ -public: - static const VARTYPE VT = VT_I4|VT_BYREF; - static int* VARIANT::* const pmField; -}; - -__declspec( selectany ) int* VARIANT::* const CVarTypeInfo< int* >::pmField = &VARIANT::pintVal; - -template<> -class CVarTypeInfo< unsigned int > -{ -public: - static const VARTYPE VT = VT_UI4; - static unsigned int VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned int VARIANT::* const CVarTypeInfo< unsigned int >::pmField = &VARIANT::uintVal; - -template<> -class CVarTypeInfo< unsigned int* > -{ -public: - static const VARTYPE VT = VT_UI4|VT_BYREF; - static unsigned int* VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned int* VARIANT::* const CVarTypeInfo< unsigned int* >::pmField = &VARIANT::puintVal; - -template<> -class CVarTypeInfo< long > -{ -public: - static const VARTYPE VT = VT_I4; - static long VARIANT::* const pmField; -}; - -__declspec( selectany ) long VARIANT::* const CVarTypeInfo< long >::pmField = &VARIANT::lVal; - -template<> -class CVarTypeInfo< long* > -{ -public: - static const VARTYPE VT = VT_I4|VT_BYREF; - static long* VARIANT::* const pmField; -}; - -__declspec( selectany ) long* VARIANT::* const CVarTypeInfo< long* >::pmField = &VARIANT::plVal; - -template<> -class CVarTypeInfo< unsigned long > -{ -public: - static const VARTYPE VT = VT_UI4; - static unsigned long VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned long VARIANT::* const CVarTypeInfo< unsigned long >::pmField = &VARIANT::ulVal; - -template<> -class CVarTypeInfo< unsigned long* > -{ -public: - static const VARTYPE VT = VT_UI4|VT_BYREF; - static unsigned long* VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned long* VARIANT::* const CVarTypeInfo< unsigned long* >::pmField = &VARIANT::pulVal; - -template<> -class CVarTypeInfo< __int64 > -{ -public: - static const VARTYPE VT = VT_I8; - static __int64 VARIANT::* const pmField; -}; - -__declspec( selectany ) __int64 VARIANT::* const CVarTypeInfo< __int64 >::pmField = &VARIANT::llVal; - -template<> -class CVarTypeInfo< __int64* > -{ -public: - static const VARTYPE VT = VT_I8|VT_BYREF; - static __int64* VARIANT::* const pmField; -}; - -__declspec( selectany ) __int64* VARIANT::* const CVarTypeInfo< __int64* >::pmField = &VARIANT::pllVal; - -template<> -class CVarTypeInfo< unsigned __int64 > -{ -public: - static const VARTYPE VT = VT_UI8; - static unsigned __int64 VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned __int64 VARIANT::* const CVarTypeInfo< unsigned __int64 >::pmField = &VARIANT::ullVal; - -template<> -class CVarTypeInfo< unsigned __int64* > -{ -public: - static const VARTYPE VT = VT_UI8|VT_BYREF; - static unsigned __int64* VARIANT::* const pmField; -}; - -__declspec( selectany ) unsigned __int64* VARIANT::* const CVarTypeInfo< unsigned __int64* >::pmField = &VARIANT::pullVal; - -template<> -class CVarTypeInfo< float > -{ -public: - static const VARTYPE VT = VT_R4; - static float VARIANT::* const pmField; -}; - -__declspec( selectany ) float VARIANT::* const CVarTypeInfo< float >::pmField = &VARIANT::fltVal; - -template<> -class CVarTypeInfo< float* > -{ -public: - static const VARTYPE VT = VT_R4|VT_BYREF; - static float* VARIANT::* const pmField; -}; - -__declspec( selectany ) float* VARIANT::* const CVarTypeInfo< float* >::pmField = &VARIANT::pfltVal; - -template<> -class CVarTypeInfo< double > -{ -public: - static const VARTYPE VT = VT_R8; - static double VARIANT::* const pmField; -}; - -__declspec( selectany ) double VARIANT::* const CVarTypeInfo< double >::pmField = &VARIANT::dblVal; - -template<> -class CVarTypeInfo< double* > -{ -public: - static const VARTYPE VT = VT_R8|VT_BYREF; - static double* VARIANT::* const pmField; -}; - -__declspec( selectany ) double* VARIANT::* const CVarTypeInfo< double* >::pmField = &VARIANT::pdblVal; - -template<> -class CVarTypeInfo< VARIANT > -{ -public: - static const VARTYPE VT = VT_VARIANT; -}; - -template<> -class CVarTypeInfo< BSTR > -{ -public: - static const VARTYPE VT = VT_BSTR; - static BSTR VARIANT::* const pmField; -}; - -__declspec( selectany ) BSTR VARIANT::* const CVarTypeInfo< BSTR >::pmField = &VARIANT::bstrVal; - -template<> -class CVarTypeInfo< BSTR* > -{ -public: - static const VARTYPE VT = VT_BSTR|VT_BYREF; - static BSTR* VARIANT::* const pmField; -}; - -__declspec( selectany ) BSTR* VARIANT::* const CVarTypeInfo< BSTR* >::pmField = &VARIANT::pbstrVal; - -template<> -class CVarTypeInfo< IUnknown* > -{ -public: - static const VARTYPE VT = VT_UNKNOWN; - static IUnknown* VARIANT::* const pmField; -}; - -__declspec( selectany ) IUnknown* VARIANT::* const CVarTypeInfo< IUnknown* >::pmField = &VARIANT::punkVal; - -template<> -class CVarTypeInfo< IUnknown** > -{ -public: - static const VARTYPE VT = VT_UNKNOWN|VT_BYREF; - static IUnknown** VARIANT::* const pmField; -}; - -__declspec( selectany ) IUnknown** VARIANT::* const CVarTypeInfo< IUnknown** >::pmField = &VARIANT::ppunkVal; - -template<> -class CVarTypeInfo< IDispatch* > -{ -public: - static const VARTYPE VT = VT_DISPATCH; - static IDispatch* VARIANT::* const pmField; -}; - -__declspec( selectany ) IDispatch* VARIANT::* const CVarTypeInfo< IDispatch* >::pmField = &VARIANT::pdispVal; - -template<> -class CVarTypeInfo< IDispatch** > -{ -public: - static const VARTYPE VT = VT_DISPATCH|VT_BYREF; - static IDispatch** VARIANT::* const pmField; -}; - -__declspec( selectany ) IDispatch** VARIANT::* const CVarTypeInfo< IDispatch** >::pmField = &VARIANT::ppdispVal; - -template<> -class CVarTypeInfo< CY > -{ -public: - static const VARTYPE VT = VT_CY; - static CY VARIANT::* const pmField; -}; - -__declspec( selectany ) CY VARIANT::* const CVarTypeInfo< CY >::pmField = &VARIANT::cyVal; - -template<> -class CVarTypeInfo< CY* > -{ -public: - static const VARTYPE VT = VT_CY|VT_BYREF; - static CY* VARIANT::* const pmField; -}; - -__declspec( selectany ) CY* VARIANT::* const CVarTypeInfo< CY* >::pmField = &VARIANT::pcyVal; - -class CComVariant : public tagVARIANT -{ -// Constructors -public: - CComVariant() throw() - { - ::VariantInit(this); - } - ~CComVariant() throw() - { - Clear(); - } - - CComVariant(__in const VARIANT& varSrc) - { - vt = VT_EMPTY; - InternalCopy(&varSrc); - } - - CComVariant(__in const CComVariant& varSrc) - { - vt = VT_EMPTY; - InternalCopy(&varSrc); - } - CComVariant(__in LPCOLESTR lpszSrc) - { - vt = VT_EMPTY; - *this = lpszSrc; - } - - CComVariant(__in LPCSTR lpszSrc) - { - vt = VT_EMPTY; - *this = lpszSrc; - } - - CComVariant(__in bool bSrc) - { - vt = VT_BOOL; - boolVal = bSrc ? ATL_VARIANT_TRUE : ATL_VARIANT_FALSE; - } - - CComVariant(__in int nSrc, __in VARTYPE vtSrc = VT_I4) throw() - { - ATLASSERT(vtSrc == VT_I4 || vtSrc == VT_INT); - vt = vtSrc; - intVal = nSrc; - } - CComVariant(__in BYTE nSrc) throw() - { - vt = VT_UI1; - bVal = nSrc; - } - CComVariant(__in short nSrc) throw() - { - vt = VT_I2; - iVal = nSrc; - } - CComVariant(__in long nSrc, __in VARTYPE vtSrc = VT_I4) throw() - { - ATLASSERT(vtSrc == VT_I4 || vtSrc == VT_ERROR); - vt = vtSrc; - lVal = nSrc; - } - CComVariant(__in float fltSrc) throw() - { - vt = VT_R4; - fltVal = fltSrc; - } - CComVariant(__in double dblSrc, __in VARTYPE vtSrc = VT_R8) throw() - { - ATLASSERT(vtSrc == VT_R8 || vtSrc == VT_DATE); - vt = vtSrc; - dblVal = dblSrc; - } -#if (_WIN32_WINNT >= 0x0501) || defined(_ATL_SUPPORT_VT_I8) - CComVariant(__in LONGLONG nSrc) throw() - { - vt = VT_I8; - llVal = nSrc; - } - CComVariant(__in ULONGLONG nSrc) throw() - { - vt = VT_UI8; - ullVal = nSrc; - } -#endif - CComVariant(CY __in cySrc) throw() - { - vt = VT_CY; - cyVal.Hi = cySrc.Hi; - cyVal.Lo = cySrc.Lo; - } - CComVariant(__in_opt IDispatch* pSrc) throw() - { - vt = VT_DISPATCH; - pdispVal = pSrc; - // Need to AddRef as VariantClear will Release - if (pdispVal != NULL) - pdispVal->AddRef(); - } - CComVariant(__in_opt IUnknown* pSrc) throw() - { - vt = VT_UNKNOWN; - punkVal = pSrc; - // Need to AddRef as VariantClear will Release - if (punkVal != NULL) - punkVal->AddRef(); - } - CComVariant(__in char cSrc) throw() - { - vt = VT_I1; - cVal = cSrc; - } - CComVariant(__in unsigned short nSrc) throw() - { - vt = VT_UI2; - uiVal = nSrc; - } - CComVariant(__in unsigned long nSrc) throw() - { - vt = VT_UI4; - ulVal = nSrc; - } - CComVariant(__in unsigned int nSrc, __in VARTYPE vtSrc = VT_UI4) throw() - { - ATLASSERT(vtSrc == VT_UI4 || vtSrc == VT_UINT); - vt = vtSrc; - uintVal= nSrc; - } - CComVariant(__in const CComBSTR& bstrSrc) - { - vt = VT_EMPTY; - *this = bstrSrc; - } - CComVariant(__in_opt const SAFEARRAY *pSrc) - { - LPSAFEARRAY pCopy; - if (pSrc != NULL) - { - HRESULT hRes = ::SafeArrayCopy((LPSAFEARRAY)pSrc, &pCopy); - if (SUCCEEDED(hRes) && pCopy != NULL) - { - ::ATL::AtlSafeArrayGetActualVartype((LPSAFEARRAY)pSrc, &vt); - vt |= VT_ARRAY; - parray = pCopy; - } - else - { - vt = VT_ERROR; - scode = hRes; -#ifndef _ATL_NO_VARIANT_THROW - ATLENSURE_THROW(FALSE, E_OUTOFMEMORY); -#endif - } - } - else - { - vt = VT_EMPTY; - } - } -// Assignment Operators -public: - CComVariant& operator=(__in const CComVariant& varSrc) - { - if(this!=&varSrc) - { - InternalCopy(&varSrc); - } - return *this; - } - CComVariant& operator=(__in const VARIANT& varSrc) - { - if(static_cast(this)!=&varSrc) - { - InternalCopy(&varSrc); - } - return *this; - } - - CComVariant& operator=(__in const CComBSTR& bstrSrc) - { - Clear(); - vt = VT_BSTR; - bstrVal = bstrSrc.Copy(); -#pragma warning(push) -#pragma warning(disable:4068) -#pragma prefast(push) -#pragma prefast(disable:325, "We are checking allocation semantics here") - if (bstrVal == NULL && bstrSrc.m_str != NULL) - { - vt = VT_ERROR; - scode = E_OUTOFMEMORY; -#ifndef _ATL_NO_VARIANT_THROW - ATLENSURE_THROW(FALSE, E_OUTOFMEMORY); -#endif - } -#pragma prefast(pop) -#pragma warning(pop) - return *this; - } - - CComVariant& operator=(__in LPCOLESTR lpszSrc) - { - Clear(); - vt = VT_BSTR; - bstrVal = ::SysAllocString(lpszSrc); - - if (bstrVal == NULL && lpszSrc != NULL) - { - vt = VT_ERROR; - scode = E_OUTOFMEMORY; -#ifndef _ATL_NO_VARIANT_THROW - ATLENSURE_THROW(FALSE, E_OUTOFMEMORY); -#endif - - } - return *this; - } - - CComVariant& operator=(__in LPCSTR lpszSrc) - { - USES_CONVERSION_EX; - Clear(); - vt = VT_BSTR; - bstrVal = ::SysAllocString(A2COLE_EX(lpszSrc, _ATL_SAFE_ALLOCA_DEF_THRESHOLD)); - - if (bstrVal == NULL && lpszSrc != NULL) - { - vt = VT_ERROR; - scode = E_OUTOFMEMORY; -#ifndef _ATL_NO_VARIANT_THROW - ATLENSURE_THROW(FALSE, E_OUTOFMEMORY); -#endif - } - return *this; - } - - CComVariant& operator=(__in bool bSrc) - { - if (vt != VT_BOOL) - { - Clear(); - vt = VT_BOOL; - } - boolVal = bSrc ? ATL_VARIANT_TRUE : ATL_VARIANT_FALSE; - return *this; - } - - CComVariant& operator=(__in int nSrc) throw() - { - if (vt != VT_I4) - { - Clear(); - vt = VT_I4; - } - intVal = nSrc; - - return *this; - } - - CComVariant& operator=(__in BYTE nSrc) throw() - { - if (vt != VT_UI1) - { - Clear(); - vt = VT_UI1; - } - bVal = nSrc; - return *this; - } - - CComVariant& operator=(__in short nSrc) throw() - { - if (vt != VT_I2) - { - Clear(); - vt = VT_I2; - } - iVal = nSrc; - return *this; - } - - CComVariant& operator=(__in long nSrc) throw() - { - if (vt != VT_I4) - { - Clear(); - vt = VT_I4; - } - lVal = nSrc; - return *this; - } - - CComVariant& operator=(__in float fltSrc) throw() - { - if (vt != VT_R4) - { - Clear(); - vt = VT_R4; - } - fltVal = fltSrc; - return *this; - } - - CComVariant& operator=(__in double dblSrc) throw() - { - if (vt != VT_R8) - { - Clear(); - vt = VT_R8; - } - dblVal = dblSrc; - return *this; - } - - CComVariant& operator=(__in CY cySrc) throw() - { - if (vt != VT_CY) - { - Clear(); - vt = VT_CY; - } - cyVal.Hi = cySrc.Hi; - cyVal.Lo = cySrc.Lo; - return *this; - } - - CComVariant& operator=(__in_opt IDispatch* pSrc) throw() - { - Clear(); - vt = VT_DISPATCH; - pdispVal = pSrc; - // Need to AddRef as VariantClear will Release - if (pdispVal != NULL) - pdispVal->AddRef(); - return *this; - } - - CComVariant& operator=(__in_opt IUnknown* pSrc) throw() - { - Clear(); - vt = VT_UNKNOWN; - punkVal = pSrc; - - // Need to AddRef as VariantClear will Release - if (punkVal != NULL) - punkVal->AddRef(); - return *this; - } - - CComVariant& operator=(__in char cSrc) throw() - { - if (vt != VT_I1) - { - Clear(); - vt = VT_I1; - } - cVal = cSrc; - return *this; - } - - CComVariant& operator=(__in unsigned short nSrc) throw() - { - if (vt != VT_UI2) - { - Clear(); - vt = VT_UI2; - } - uiVal = nSrc; - return *this; - } - - CComVariant& operator=(__in unsigned long nSrc) throw() - { - if (vt != VT_UI4) - { - Clear(); - vt = VT_UI4; - } - ulVal = nSrc; - return *this; - } - - CComVariant& operator=(__in unsigned int nSrc) throw() - { - if (vt != VT_UI4) - { - Clear(); - vt = VT_UI4; - } - uintVal= nSrc; - return *this; - } - - CComVariant& operator=(__in_opt BYTE* pbSrc) throw() - { - if (vt != (VT_UI1|VT_BYREF)) - { - Clear(); - vt = VT_UI1|VT_BYREF; - } - pbVal = pbSrc; - return *this; - } - - CComVariant& operator=(__in_opt short* pnSrc) throw() - { - if (vt != (VT_I2|VT_BYREF)) - { - Clear(); - vt = VT_I2|VT_BYREF; - } - piVal = pnSrc; - return *this; - } - -#ifdef _NATIVE_WCHAR_T_DEFINED - CComVariant& operator=(__in_opt USHORT* pnSrc) throw() - { - if (vt != (VT_UI2|VT_BYREF)) - { - Clear(); - vt = VT_UI2|VT_BYREF; - } - puiVal = pnSrc; - return *this; - } -#endif - - CComVariant& operator=(__in_opt int* pnSrc) throw() - { - if (vt != (VT_I4|VT_BYREF)) - { - Clear(); - vt = VT_I4|VT_BYREF; - } - pintVal = pnSrc; - return *this; - } - - CComVariant& operator=(__in_opt UINT* pnSrc) throw() - { - if (vt != (VT_UI4|VT_BYREF)) - { - Clear(); - vt = VT_UI4|VT_BYREF; - } - puintVal = pnSrc; - return *this; - } - - CComVariant& operator=(__in_opt long* pnSrc) throw() - { - if (vt != (VT_I4|VT_BYREF)) - { - Clear(); - vt = VT_I4|VT_BYREF; - } - plVal = pnSrc; - return *this; - } - - CComVariant& operator=(__in_opt ULONG* pnSrc) throw() - { - if (vt != (VT_UI4|VT_BYREF)) - { - Clear(); - vt = VT_UI4|VT_BYREF; - } - pulVal = pnSrc; - return *this; - } - -#if (_WIN32_WINNT >= 0x0501) || defined(_ATL_SUPPORT_VT_I8) - CComVariant& operator=(__in LONGLONG nSrc) throw() - { - if (vt != VT_I8) - { - Clear(); - vt = VT_I8; - } - llVal = nSrc; - - return *this; - } - - CComVariant& operator=(__in_opt LONGLONG* pnSrc) throw() - { - if (vt != (VT_I8|VT_BYREF)) - { - Clear(); - vt = VT_I8|VT_BYREF; - } - pllVal = pnSrc; - return *this; - } - - CComVariant& operator=(__in ULONGLONG nSrc) throw() - { - if (vt != VT_UI8) - { - Clear(); - vt = VT_UI8; - } - ullVal = nSrc; - - return *this; - } - - CComVariant& operator=(__in_opt ULONGLONG* pnSrc) throw() - { - if (vt != (VT_UI8|VT_BYREF)) - { - Clear(); - vt = VT_UI8|VT_BYREF; - } - pullVal = pnSrc; - return *this; - } -#endif - -#pragma warning(push) -#pragma warning(disable: 28110) - - CComVariant& operator=(__in_opt float* pfSrc) throw() - { - if (vt != (VT_R4|VT_BYREF)) - { - Clear(); - vt = VT_R4|VT_BYREF; - } - pfltVal = pfSrc; - return *this; - } - - CComVariant& operator=(__in_opt double* pfSrc) throw() - { - if (vt != (VT_R8|VT_BYREF)) - { - Clear(); - vt = VT_R8|VT_BYREF; - } - pdblVal = pfSrc; - return *this; - } - -#pragma warning(pop) - - CComVariant& operator=(__in_opt const SAFEARRAY *pSrc) - { - Clear(); - LPSAFEARRAY pCopy; - if (pSrc != NULL) - { - HRESULT hRes = ::SafeArrayCopy((LPSAFEARRAY)pSrc, &pCopy); - if (SUCCEEDED(hRes) && pCopy != NULL) - { - ::ATL::AtlSafeArrayGetActualVartype((LPSAFEARRAY)pSrc, &vt); - vt |= VT_ARRAY; - parray = pCopy; - } - else - { - vt = VT_ERROR; - scode = hRes; -#ifndef _ATL_NO_VARIANT_THROW - ATLENSURE_THROW(FALSE, E_OUTOFMEMORY); -#endif - } - } - return *this; - } - -// Comparison Operators -public: - bool operator==(__in const VARIANT& varSrc) const throw() - { - // For backwards compatibility - if (vt == VT_NULL && varSrc.vt == VT_NULL) - { - return true; - } - // Variants not equal if types don't match - if (vt != varSrc.vt) - { - return false; - } - return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT, 0) == static_cast(VARCMP_EQ); - } - - bool operator!=(__in const VARIANT& varSrc) const throw() - { - return !operator==(varSrc); - } - - bool operator<(__in const VARIANT& varSrc) const throw() - { - if (vt == VT_NULL && varSrc.vt == VT_NULL) - return false; - return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT, 0)== static_cast(VARCMP_LT); - } - - bool operator>(__in const VARIANT& varSrc) const throw() - { - if (vt == VT_NULL && varSrc.vt == VT_NULL) - return false; - return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT, 0)== static_cast(VARCMP_GT); - } - -// Operations -public: - HRESULT Clear() { return ::VariantClear(this); } - HRESULT ClearToZero() - { - HRESULT hr = ::VariantClear(this); - if( FAILED(hr) ) - { - return hr; - } - memset(this ,0 ,sizeof(tagVARIANT)); - vt = VT_EMPTY; - return hr; - } - - HRESULT Copy(__in const VARIANT* pSrc) { return ::VariantCopy(this, const_cast(pSrc)); } - // copy VARIANT to BSTR - HRESULT CopyTo(__out BSTR *pstrDest) - { - ATLASSERT(pstrDest != NULL && vt == VT_BSTR); - HRESULT hRes = E_POINTER; - if (pstrDest != NULL && vt == VT_BSTR) - { - *pstrDest = ::SysAllocStringByteLen((char*)bstrVal, ::SysStringByteLen(bstrVal)); - if (*pstrDest == NULL) - hRes = E_OUTOFMEMORY; - else - hRes = S_OK; - } - else if (vt != VT_BSTR) - hRes = DISP_E_TYPEMISMATCH; - return hRes; - } - HRESULT Attach(__in VARIANT* pSrc) - { - if(pSrc == NULL) - return E_INVALIDARG; - - // Clear out the variant - HRESULT hr = Clear(); - if (!FAILED(hr)) - { - // Copy the contents and give control to CComVariant - Checked::memcpy_s(this, sizeof(CComVariant), pSrc, sizeof(VARIANT)); - pSrc->vt = VT_EMPTY; - hr = S_OK; - } - return hr; - } - - HRESULT Detach(__out VARIANT* pDest) - { - ATLASSERT(pDest != NULL); - if(pDest == NULL) - return E_POINTER; - - // Clear out the variant - HRESULT hr = ::VariantClear(pDest); - if (!FAILED(hr)) - { - // Copy the contents and remove control from CComVariant - Checked::memcpy_s(pDest, sizeof(VARIANT), this, sizeof(VARIANT)); - vt = VT_EMPTY; - hr = S_OK; - } - return hr; - } - - HRESULT ChangeType(__in VARTYPE vtNew, __in_opt const VARIANT* pSrc = NULL) - { - VARIANT* pVar = const_cast(pSrc); - // Convert in place if pSrc is NULL - if (pVar == NULL) - pVar = this; - // Do nothing if doing in place convert and vts not different - return ::VariantChangeType(this, pVar, 0, vtNew); - } - - template< typename T > - void SetByRef( __in T* pT ) throw() - { - Clear(); - vt = CVarTypeInfo< T >::VT|VT_BYREF; - byref = pT; - } - - HRESULT WriteToStream(__inout IStream* pStream); - HRESULT WriteToStream(__inout IStream* pStream, VARTYPE vtWrite) - { - if (vtWrite != VT_EMPTY && vtWrite != vt) - { - CComVariant varConv; - HRESULT hr = varConv.ChangeType(vtWrite, this); - if (FAILED(hr)) - { - return hr; - } - return varConv.WriteToStream(pStream); - } - return WriteToStream(pStream); - } - HRESULT ReadFromStream(__inout IStream* pStream, VARTYPE vtExpected = VT_EMPTY); - - // Return the size in bytes of the current contents - ULONG GetSize() const; - -// Implementation -public: - HRESULT InternalClear() - { - HRESULT hr = Clear(); - ATLASSERT(SUCCEEDED(hr)); - if (FAILED(hr)) - { - vt = VT_ERROR; - scode = hr; -#ifndef _ATL_NO_VARIANT_THROW - AtlThrow(hr); -#endif - } - return hr; - } - - void InternalCopy(__in const VARIANT* pSrc) - { - HRESULT hr = Copy(pSrc); - if (FAILED(hr)) - { - vt = VT_ERROR; - scode = hr; -#ifndef _ATL_NO_VARIANT_THROW - AtlThrow(hr); -#endif - } - } -}; - -#pragma warning(push) -#pragma warning(disable: 4702) -inline HRESULT CComVariant::WriteToStream(__inout IStream* pStream) -{ - if(pStream == NULL) - return E_INVALIDARG; - - HRESULT hr = pStream->Write(&vt, sizeof(VARTYPE), NULL); - if (FAILED(hr)) - return hr; - - int cbWrite = 0; - switch (vt) - { - case VT_UNKNOWN: - case VT_DISPATCH: - { - CComPtr spStream; - if (punkVal != NULL) - { - hr = punkVal->QueryInterface(__uuidof(IPersistStream), (void**)&spStream); - if (FAILED(hr)) - { - hr = punkVal->QueryInterface(__uuidof(IPersistStreamInit), (void**)&spStream); - if (FAILED(hr)) - return hr; - } - } - if (spStream != NULL) - return OleSaveToStream(spStream, pStream); - return WriteClassStm(pStream, CLSID_NULL); - } - case VT_UI1: - case VT_I1: - cbWrite = sizeof(BYTE); - break; - case VT_I2: - case VT_UI2: - case VT_BOOL: - cbWrite = sizeof(short); - break; - case VT_I4: - case VT_UI4: - case VT_R4: - case VT_INT: - case VT_UINT: - case VT_ERROR: - cbWrite = sizeof(long); - break; - case VT_I8: - case VT_UI8: - cbWrite = sizeof(LONGLONG); - break; - case VT_R8: - case VT_CY: - case VT_DATE: - cbWrite = sizeof(double); - break; - default: - break; - } - if (cbWrite != 0) - return pStream->Write((void*) &bVal, cbWrite, NULL); - - CComBSTR bstrWrite; - CComVariant varBSTR; - if (vt != VT_BSTR) - { - hr = VariantChangeType(&varBSTR, this, VARIANT_NOVALUEPROP, VT_BSTR); - if (FAILED(hr)) - return hr; - bstrWrite.Attach(varBSTR.bstrVal); - } - else - bstrWrite.Attach(bstrVal); - - hr = bstrWrite.WriteToStream(pStream); - bstrWrite.Detach(); - return hr; -} -#pragma warning(pop) // C4702 - -inline HRESULT CComVariant::ReadFromStream(__inout IStream* pStream, VARTYPE vtExpected /* = VT_EMPTY */ ) -{ - ATLASSERT(pStream != NULL); - if(pStream == NULL) - return E_INVALIDARG; - - HRESULT hr; - hr = VariantClear(this); - if (FAILED(hr)) - return hr; - VARTYPE vtRead = VT_EMPTY; - ULONG cbRead = 0; - hr = pStream->Read(&vtRead, sizeof(VARTYPE), &cbRead); - if (hr == S_FALSE || (cbRead != sizeof(VARTYPE) && hr == S_OK)) - hr = E_FAIL; - if (FAILED(hr)) - return hr; - if (vtExpected != VT_EMPTY && vtRead != vtExpected) - return E_FAIL; - - vt = vtRead; - cbRead = 0; - switch (vtRead) - { - case VT_UNKNOWN: - case VT_DISPATCH: - { - punkVal = NULL; - hr = OleLoadFromStream(pStream, - (vtRead == VT_UNKNOWN) ? __uuidof(IUnknown) : __uuidof(IDispatch), - (void**)&punkVal); - // If IPictureDisp or IFontDisp property is not set, - // OleLoadFromStream() will return REGDB_E_CLASSNOTREG. - if (hr == REGDB_E_CLASSNOTREG) - hr = S_OK; - return hr; - } - case VT_UI1: - case VT_I1: - cbRead = sizeof(BYTE); - break; - case VT_I2: - case VT_UI2: - case VT_BOOL: - cbRead = sizeof(short); - break; - case VT_I4: - case VT_UI4: - case VT_R4: - case VT_INT: - case VT_UINT: - case VT_ERROR: - cbRead = sizeof(long); - break; - case VT_I8: - case VT_UI8: - cbRead = sizeof(LONGLONG); - break; - case VT_R8: - case VT_CY: - case VT_DATE: - cbRead = sizeof(double); - break; - default: - break; - } - if (cbRead != 0) - { - hr = pStream->Read((void*) &bVal, cbRead, NULL); - if (hr == S_FALSE) - hr = E_FAIL; - return hr; - } - CComBSTR bstrRead; - - hr = bstrRead.ReadFromStream(pStream); - if (FAILED(hr)) - { - // If CComBSTR::ReadFromStream failed, reset seek pointer to start of - // variant type. - LARGE_INTEGER nOffset; - nOffset.QuadPart = -(static_cast(sizeof(VARTYPE))); - pStream->Seek(nOffset, STREAM_SEEK_CUR, NULL); - vt = VT_EMPTY; - return hr; - } - vt = VT_BSTR; - bstrVal = bstrRead.Detach(); - if (vtRead != VT_BSTR) - hr = ChangeType(vtRead); - return hr; -} - -inline ULONG CComVariant::GetSize() const -{ - ULONG nSize = sizeof(VARTYPE); - HRESULT hr; - - switch (vt) - { - case VT_UNKNOWN: - case VT_DISPATCH: - { - CComPtr spStream; - if (punkVal != NULL) - { - hr = punkVal->QueryInterface(__uuidof(IPersistStream), (void**)&spStream); - if (FAILED(hr)) - { - hr = punkVal->QueryInterface(__uuidof(IPersistStreamInit), (void**)&spStream); - if (FAILED(hr)) - break; - } - } - if (spStream != NULL) - { - ULARGE_INTEGER nPersistSize; - nPersistSize.QuadPart = 0; - spStream->GetSizeMax(&nPersistSize); - nSize += nPersistSize.LowPart + sizeof(CLSID); - } - else - nSize += sizeof(CLSID); - } - break; - case VT_UI1: - case VT_I1: - nSize += sizeof(BYTE); - break; - case VT_I2: - case VT_UI2: - case VT_BOOL: - nSize += sizeof(short); - break; - case VT_I4: - case VT_UI4: - case VT_R4: - case VT_INT: - case VT_UINT: - case VT_ERROR: - nSize += sizeof(long); - break; - case VT_I8: - case VT_UI8: - nSize += sizeof(LONGLONG); - break; - case VT_R8: - case VT_CY: - case VT_DATE: - nSize += sizeof(double); - break; - default: - break; - } - if (nSize == sizeof(VARTYPE)) - { - VARTYPE vtTmp = vt; - BSTR bstr = NULL; - CComVariant varBSTR; - if (vtTmp != VT_BSTR) - { - hr = VariantChangeType(&varBSTR, const_cast((const VARIANT*)this), VARIANT_NOVALUEPROP, VT_BSTR); - if (SUCCEEDED(hr)) - { - bstr = varBSTR.bstrVal; - vtTmp = VT_BSTR; - } - } else - { - bstr = bstrVal; - } - - if (vtTmp == VT_BSTR) - { - // Add the size of the length + string (in bytes) + NULL terminator. - nSize += CComBSTR::GetStreamSize(bstr); - } - } - return nSize; -} - -__checkReturn inline HRESULT CComPtr::Invoke2(__in DISPID dispid, __in VARIANT* pvarParam1, __in VARIANT* pvarParam2, __out_opt VARIANT* pvarRet) throw() -{ - if(pvarParam1 == NULL || pvarParam2 == NULL) - return E_INVALIDARG; - - CComVariant varArgs[2] = { *pvarParam2, *pvarParam1 }; - DISPPARAMS dispparams = { &varArgs[0], NULL, 2, 0}; - return p->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL); -} - -} // namespace ATL -#pragma pack(pop) - -#pragma warning (pop) - -#ifndef _ATL_NO_AUTOMATIC_NAMESPACE -using namespace ATL; -#endif //!_ATL_NO_AUTOMATIC_NAMESPACE - -#endif // __ATLCOMCLI_H__ - diff --git a/cpp/jacob/include/atlconv.h b/cpp/jacob/include/atlconv.h deleted file mode 100644 index 338109d..0000000 --- a/cpp/jacob/include/atlconv.h +++ /dev/null @@ -1,1302 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLCONV_H__ -#define __ATLCONV_H__ - -#pragma once - -#ifndef _ATL_NO_PRAGMA_WARNINGS -#pragma warning (push) -#pragma warning(disable: 4127) // unreachable code -#endif //!_ATL_NO_PRAGMA_WARNINGS - -// -// [pfx_parse] - workaround for old PREfix/PREfast parser -// -#if (defined(_PREFIX_) || defined(_PREFAST_)) && (_MSC_VER < 1400) -#pragma warning (push) -#pragma warning(disable: 4081) // expected 'newline' -#endif // old PREfast parser - -#ifndef __cplusplus - #error ATL requires C++ compilation (use a .cpp suffix) -#endif - -#include -#include -#include - -#ifndef __wtypes_h__ - -#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86) -#define _X86_ -#endif - -#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_AMD64) -#define _AMD64_ -#endif - -#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_M68K) -#define _68K_ -#endif - -#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_MPPC) -#define _MPPC_ -#endif - -#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_M_IX86) && !defined(_AMD64_) && defined(_M_IA64) -#if !defined(_IA64_) -#define _IA64_ -#endif // !_IA64_ -#endif - -#include -#include -#include -#include - -#if defined(_WIN32) && !defined(OLE2ANSI) - -typedef WCHAR OLECHAR; -typedef OLECHAR *LPOLESTR; -typedef const OLECHAR *LPCOLESTR; -#define OLESTR(str) L##str - -#else - -typedef char OLECHAR; -typedef LPSTR LPOLESTR; -typedef LPCSTR LPCOLESTR; -#define OLESTR(str) str - -#endif // _WIN32 && !OLE2ANSI -#endif // __wtypes_h__ - -#ifndef _OLEAUTO_H_ -typedef LPWSTR BSTR;// must (semantically) match typedef in oleauto.h - -extern "C" -{ -__declspec(dllimport) BSTR __stdcall SysAllocString(const OLECHAR *); -__declspec(dllimport) BSTR __stdcall SysAllocStringLen(const OLECHAR *, UINT); -__declspec(dllimport) INT __stdcall SysReAllocStringLen(BSTR *, const OLECHAR *, UINT); -__declspec(dllimport) void __stdcall SysFreeString(BSTR); -} -#endif - -// we use our own implementation of InterlockedExchangePointer because of problems with the one in system headers -#ifdef _M_IX86 -#undef InterlockedExchangePointer -inline void* WINAPI InterlockedExchangePointer(void** pp, void* pNew) throw() -{ - return( reinterpret_cast(static_cast(::InterlockedExchange(reinterpret_cast(pp), static_cast(reinterpret_cast(pNew))))) ); -} -#endif - -#ifndef _SECURECRT_FILL_BUFFER_PATTERN -#define _SECURECRT_FILL_BUFFER_PATTERN 0xFD -#endif - -#define ATLCONV_DEADLAND_FILL _SECURECRT_FILL_BUFFER_PATTERN - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ -#ifndef _CONVERSION_DONT_USE_THREAD_LOCALE -inline UINT WINAPI _AtlGetConversionACP() throw() -{ - return( CP_THREAD_ACP ); -} - -#else - -inline UINT WINAPI _AtlGetConversionACP() throw() -{ - return( CP_ACP ); -} - -#endif // _CONVERSION_DONT_USE_THREAD_LOCALE -template -inline void AtlConvAllocMemory(__deref_ecount_opt(nLength) _CharType** ppBuff,__in int nLength,__inout_ecount(nFixedBufferLength) _CharType* pszFixedBuffer,__in int nFixedBufferLength) -{ - ATLENSURE_THROW(ppBuff != NULL, E_INVALIDARG); - ATLENSURE_THROW(nLength >= 0, E_INVALIDARG); - ATLENSURE_THROW(pszFixedBuffer != NULL, E_INVALIDARG); - - //if buffer malloced, try to realloc. - if (*ppBuff != pszFixedBuffer) - { - if( nLength > nFixedBufferLength ) - { - _CharType* ppReallocBuf = static_cast< _CharType* >( _recalloc(*ppBuff, nLength,sizeof( _CharType ) ) ); - if (ppReallocBuf == NULL) - { - AtlThrow( E_OUTOFMEMORY ); - } - *ppBuff = ppReallocBuf; - } else - { - free(*ppBuff); - *ppBuff=pszFixedBuffer; - } - - } else //Buffer is not currently malloced. - { - if( nLength > nFixedBufferLength ) - { - *ppBuff = static_cast< _CharType* >( calloc(nLength,sizeof( _CharType ) ) ); - } else - { - *ppBuff=pszFixedBuffer; - } - } - - if (*ppBuff == NULL) - { - AtlThrow( E_OUTOFMEMORY ); - } - -} - -template -inline void AtlConvFreeMemory(_CharType* pBuff,_CharType* pszFixedBuffer,int nFixedBufferLength) -{ - (nFixedBufferLength); - if( pBuff != pszFixedBuffer ) - { - free( pBuff ); - } -#ifdef _DEBUG - else - { - memset(pszFixedBuffer,ATLCONV_DEADLAND_FILL,nFixedBufferLength*sizeof(_CharType)); - } -#endif - -} - -template< int t_nBufferLength = 128 > -class CW2WEX -{ -public: - CW2WEX( __in_opt LPCWSTR psz ) throw(...) : - m_psz( m_szBuffer ) - { - Init( psz ); - } - CW2WEX( __in_opt LPCWSTR psz, UINT nCodePage ) throw(...) : - m_psz( m_szBuffer ) - { - (void)nCodePage; // Code page doesn't matter - - Init( psz ); - } - ~CW2WEX() throw() - { - AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength); - } - - operator LPWSTR() const throw() - { - return( m_psz ); - } - -private: - void Init( __in_opt LPCWSTR psz ) throw(...) - { - if (psz == NULL) - { - m_psz = NULL; - return; - } - int nLength = lstrlenW( psz )+1; - AtlConvAllocMemory(&m_psz,nLength,m_szBuffer,t_nBufferLength); - Checked::memcpy_s( m_psz, nLength*sizeof( wchar_t ), psz, nLength*sizeof( wchar_t )); - } - -public: - LPWSTR m_psz; - wchar_t m_szBuffer[t_nBufferLength]; - -private: - CW2WEX( const CW2WEX& ) throw(); - CW2WEX& operator=( const CW2WEX& ) throw(); -}; -typedef CW2WEX<> CW2W; - -template< int t_nBufferLength = 128 > -class CA2AEX -{ -public: - CA2AEX( __in_opt LPCSTR psz ) throw(...) : - m_psz( m_szBuffer ) - { - Init( psz ); - } - CA2AEX( __in_opt LPCSTR psz, UINT nCodePage ) throw(...) : - m_psz( m_szBuffer ) - { - (void)nCodePage; // Code page doesn't matter - - Init( psz ); - } - ~CA2AEX() throw() - { - AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength); - } - - operator LPSTR() const throw() - { - return( m_psz ); - } - -private: - void Init( __in_opt LPCSTR psz ) throw(...) - { - if (psz == NULL) - { - m_psz = NULL; - return; - } - int nLength = lstrlenA( psz )+1; - AtlConvAllocMemory(&m_psz,nLength,m_szBuffer,t_nBufferLength); - Checked::memcpy_s( m_psz, nLength*sizeof( char ), psz, nLength*sizeof( char )); - } - -public: - LPSTR m_psz; - char m_szBuffer[t_nBufferLength]; - -private: - CA2AEX( const CA2AEX& ) throw(); - CA2AEX& operator=( const CA2AEX& ) throw(); -}; -typedef CA2AEX<> CA2A; - -template< int t_nBufferLength = 128 > -class CA2CAEX -{ -public: - CA2CAEX( __in LPCSTR psz ) throw(...) : - m_psz( psz ) - { - } - CA2CAEX( __in LPCSTR psz, UINT nCodePage ) throw(...) : - m_psz( psz ) - { - (void)nCodePage; - } - ~CA2CAEX() throw() - { - } - - operator LPCSTR() const throw() - { - return( m_psz ); - } - -public: - LPCSTR m_psz; - -private: - CA2CAEX( const CA2CAEX& ) throw(); - CA2CAEX& operator=( const CA2CAEX& ) throw(); -}; -typedef CA2CAEX<> CA2CA; - -template< int t_nBufferLength = 128 > -class CW2CWEX -{ -public: - CW2CWEX( __in LPCWSTR psz ) throw(...) : - m_psz( psz ) - { - } - CW2CWEX( __in LPCWSTR psz, UINT nCodePage ) throw(...) : - m_psz( psz ) - { - (void)nCodePage; - } - ~CW2CWEX() throw() - { - } - - operator LPCWSTR() const throw() - { - return( m_psz ); - } - -public: - LPCWSTR m_psz; - -private: - CW2CWEX( const CW2CWEX& ) throw(); - CW2CWEX& operator=( const CW2CWEX& ) throw(); -}; -typedef CW2CWEX<> CW2CW; - -template< int t_nBufferLength = 128 > -class CA2WEX -{ -public: - CA2WEX( __in_opt LPCSTR psz ) throw(...) : - m_psz( m_szBuffer ) - { - Init( psz, _AtlGetConversionACP() ); - } - CA2WEX( __in_opt LPCSTR psz, UINT nCodePage ) throw(...) : - m_psz( m_szBuffer ) - { - Init( psz, nCodePage ); - } - ~CA2WEX() throw() - { - AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength); - } - - operator LPWSTR() const throw() - { - return( m_psz ); - } - -private: - void Init( __in_opt LPCSTR psz, UINT nCodePage ) throw(...) - { - if (psz == NULL) - { - m_psz = NULL; - return; - } - int nLengthA = lstrlenA( psz )+1; - int nLengthW = nLengthA; - - AtlConvAllocMemory(&m_psz,nLengthW,m_szBuffer,t_nBufferLength); - - BOOL bFailed=(0 == ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, m_psz, nLengthW ) ); - if (bFailed) - { - if (GetLastError()==ERROR_INSUFFICIENT_BUFFER) - { - nLengthW = ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, NULL, 0); - AtlConvAllocMemory(&m_psz,nLengthW,m_szBuffer,t_nBufferLength); - bFailed=(0 == ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, m_psz, nLengthW ) ); - } - } - if (bFailed) - { - AtlThrowLastWin32(); - } - } - -public: - LPWSTR m_psz; - wchar_t m_szBuffer[t_nBufferLength]; - -private: - CA2WEX( const CA2WEX& ) throw(); - CA2WEX& operator=( const CA2WEX& ) throw(); -}; -typedef CA2WEX<> CA2W; - -template< int t_nBufferLength = 128 > -class CW2AEX -{ -public: - CW2AEX( __in_opt LPCWSTR psz ) throw(...) : - m_psz( m_szBuffer ) - { - Init( psz, _AtlGetConversionACP() ); - } - CW2AEX( __in_opt LPCWSTR psz, UINT nCodePage ) throw(...) : - m_psz( m_szBuffer ) - { - Init( psz, nCodePage ); - } - ~CW2AEX() throw() - { - AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength); - } - - operator LPSTR() const throw() - { - return( m_psz ); - } - -private: - void Init( __in_opt LPCWSTR psz, __in UINT nConvertCodePage ) throw(...) - { - if (psz == NULL) - { - m_psz = NULL; - return; - } - int nLengthW = lstrlenW( psz )+1; - int nLengthA = nLengthW*4; - - AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength); - - BOOL bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, NULL, NULL )); - if (bFailed) - { - if (GetLastError()==ERROR_INSUFFICIENT_BUFFER) - { - nLengthA = ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, NULL, 0, NULL, NULL ); - AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength); - bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, NULL, NULL )); - } - } - if (bFailed) - { - AtlThrowLastWin32(); - } - } - -public: - LPSTR m_psz; - char m_szBuffer[t_nBufferLength]; - -private: - CW2AEX( const CW2AEX& ) throw(); - CW2AEX& operator=( const CW2AEX& ) throw(); -}; -typedef CW2AEX<> CW2A; - -#ifdef _UNICODE - - #define CW2T CW2W - #define CW2TEX CW2WEX - #define CW2CT CW2CW - #define CW2CTEX CW2CWEX - #define CT2W CW2W - #define CT2WEX CW2WEX - #define CT2CW CW2CW - #define CT2CWEX CW2CWEX - - #define CA2T CA2W - #define CA2TEX CA2WEX - #define CA2CT CA2W - #define CA2CTEX CA2WEX - #define CT2A CW2A - #define CT2AEX CW2AEX - #define CT2CA CW2A - #define CT2CAEX CW2AEX - -#else // !_UNICODE - - #define CW2T CW2A - #define CW2TEX CW2AEX - #define CW2CT CW2A - #define CW2CTEX CW2AEX - #define CT2W CA2W - #define CT2WEX CA2WEX - #define CT2CW CA2W - #define CT2CWEX CA2WEX - - #define CA2T CA2A - #define CA2TEX CA2AEX - #define CA2CT CA2CA - #define CA2CTEX CA2CAEX - #define CT2A CA2A - #define CT2AEX CA2AEX - #define CT2CA CA2CA - #define CT2CAEX CA2CAEX - -#endif // !_UNICODE - -#define COLE2T CW2T -#define COLE2TEX CW2TEX -#define COLE2CT CW2CT -#define COLE2CTEX CW2CTEX -#define CT2OLE CT2W -#define CT2OLEEX CT2WEX -#define CT2COLE CT2CW -#define CT2COLEEX CT2CWEX - -}; // namespace ATL -#pragma pack(pop) - -#pragma pack(push,8) - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - -#ifndef _DEBUG - #define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa) -#else - #define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa) -#endif - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#ifndef _DEBUG - #define USES_CONVERSION_EX int _convert_ex; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex; (_lpw_ex); LPCSTR _lpa_ex; (_lpa_ex); USES_ATL_SAFE_ALLOCA -#else - #define USES_CONVERSION_EX int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = NULL; (_lpw_ex); LPCSTR _lpa_ex = NULL; (_lpa_ex); USES_ATL_SAFE_ALLOCA -#endif - -#ifdef _WINGDI_ - ATLAPI_(LPDEVMODEA) AtlDevModeW2A(__out LPDEVMODEA lpDevModeA, __in const DEVMODEW* lpDevModeW); -#endif - -///////////////////////////////////////////////////////////////////////////// -// Global UNICODE<>ANSI translation helpers -inline __out_ecount_z_opt(nChars) LPWSTR WINAPI AtlA2WHelper(__out_ecount_z(nChars) LPWSTR lpw, __in_z LPCSTR lpa, __in int nChars, __in UINT acp) throw() -{ - ATLASSERT(lpa != NULL); - ATLASSERT(lpw != NULL); - if (lpw == NULL || lpa == NULL) - return NULL; - // verify that no illegal character present - // since lpw was allocated based on the size of lpa - // don't worry about the number of chars - lpw[0] = '\0'; - int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars); - if(ret == 0) - { - ATLASSERT(FALSE); - return NULL; - } - return lpw; -} - -inline __out_ecount_z_opt(nChars) LPSTR WINAPI AtlW2AHelper(__out_ecount_z(nChars) LPSTR lpa, __in_z LPCWSTR lpw, __in int nChars, __in UINT acp) throw() -{ - ATLASSERT(lpw != NULL); - ATLASSERT(lpa != NULL); - if (lpa == NULL || lpw == NULL) - return NULL; - // verify that no illegal character present - // since lpa was allocated based on the size of lpw - // don't worry about the number of chars - lpa[0] = '\0'; - int ret = WideCharToMultiByte(acp, 0, lpw, -1, lpa, nChars, NULL, NULL); - if(ret == 0) - { - ATLASSERT(FALSE); - return NULL; - } - return lpa; -} -inline __out_ecount_z_opt(nChars) LPWSTR WINAPI AtlA2WHelper(__out_ecount_z(nChars) LPWSTR lpw, __in_z LPCSTR lpa, __in int nChars) throw() -{ - return AtlA2WHelper(lpw, lpa, nChars, CP_ACP); -} - -inline __out_ecount_z_opt(nChars) LPSTR WINAPI AtlW2AHelper(__out_ecount_z(nChars) LPSTR lpa, __in_z LPCWSTR lpw, __in int nChars) throw() -{ - return AtlW2AHelper(lpa, lpw, nChars, CP_ACP); -} - -#ifndef _CONVERSION_DONT_USE_THREAD_LOCALE - #ifdef ATLA2WHELPER - #undef ATLA2WHELPER - #undef ATLW2AHELPER - #endif - #define ATLA2WHELPER AtlA2WHelper - #define ATLW2AHELPER AtlW2AHelper -#else - #ifndef ATLA2WHELPER - #define ATLA2WHELPER AtlA2WHelper - #define ATLW2AHELPER AtlW2AHelper - #endif -#endif - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - -#define A2W(lpa) (\ - ((_lpa = lpa) == NULL) ? NULL : (\ - _convert = (lstrlenA(_lpa)+1),\ - (INT_MAX/2<_convert)? NULL : \ - ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp))) - -#define W2A(lpw) (\ - ((_lpw = lpw) == NULL) ? NULL : (\ - (_convert = (lstrlenW(_lpw)+1), \ - (_convert>INT_MAX/2) ? NULL : \ - ATLW2AHELPER((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), _acp)))) - -#define A2W_CP(lpa, cp) (\ - ((_lpa = lpa) == NULL) ? NULL : (\ - _convert = (lstrlenA(_lpa)+1),\ - (INT_MAX/2<_convert)? NULL : \ - ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, (cp)))) - -#define W2A_CP(lpw, cp) (\ - ((_lpw = lpw) == NULL) ? NULL : (\ - (_convert = (lstrlenW(_lpw)+1), \ - (_convert>INT_MAX/2) ? NULL : \ - ATLW2AHELPER((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), (cp))))) - -#endif - -// The call to _alloca will not cause stack overflow if _AtlVerifyStackAvailable returns TRUE. -// Notice that nChars is never used in these conversion functions. We cannot change the behavior of -// these functions to actually use nChars because we could potentially break a lot of legacy code. -#define A2W_EX(lpa, nChars) (\ - ((_lpa_ex = lpa) == NULL) ? NULL : (\ - _convert_ex = (lstrlenA(_lpa_ex)+1),\ - FAILED(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast(sizeof(WCHAR)))) ? NULL : \ - ATLA2WHELPER( \ - (LPWSTR)_ATL_SAFE_ALLOCA(_convert_ex, _ATL_SAFE_ALLOCA_DEF_THRESHOLD), \ - _lpa_ex, \ - _convert_ex / sizeof(WCHAR), \ - _acp_ex))) - -#define A2W_EX_DEF(lpa) A2W_EX(lpa, _ATL_SAFE_ALLOCA_DEF_THRESHOLD) - -#define W2A_EX(lpw, nChars) (\ - ((_lpw_ex = lpw) == NULL) ? NULL : (\ - _convert_ex = (lstrlenW(_lpw_ex)+1),\ - FAILED(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast(sizeof(WCHAR)))) ? NULL : \ - ATLW2AHELPER( \ - (LPSTR)_ATL_SAFE_ALLOCA(_convert_ex, _ATL_SAFE_ALLOCA_DEF_THRESHOLD), \ - _lpw_ex, \ - _convert_ex, \ - _acp_ex))) - -#define W2A_EX_DEF(lpa) W2A_EX(lpa, _ATL_SAFE_ALLOCA_DEF_THRESHOLD) - -#define A2W_CP_EX(lpa, nChars, cp) (\ - ((_lpa_ex = lpa) == NULL) ? NULL : (\ - _convert_ex = (lstrlenA(_lpa_ex)+1),\ - FAILED(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast(sizeof(WCHAR)))) ? NULL : \ - ATLA2WHELPER( \ - (LPWSTR)_ATL_SAFE_ALLOCA(_convert_ex, _ATL_SAFE_ALLOCA_DEF_THRESHOLD), \ - _lpa_ex, \ - _convert_ex / sizeof(WCHAR), \ - (cp)))) - -#define W2A_CP_EX(lpw, nChars, cp) (\ - ((_lpw_ex = lpw) == NULL) ? NULL : (\ - _convert_ex = (lstrlenW(_lpw_ex)+1),\ - FAILED(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast(sizeof(WCHAR)))) ? NULL : \ - ATLW2AHELPER( \ - (LPSTR)_ATL_SAFE_ALLOCA(_convert_ex, _ATL_SAFE_ALLOCA_DEF_THRESHOLD), \ - _lpw_ex, \ - _convert_ex, \ - (cp)))) - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - -#define A2CW(lpa) ((LPCWSTR)A2W(lpa)) -#define W2CA(lpw) ((LPCSTR)W2A(lpw)) - -#define A2CW_CP(lpa, cp) ((LPCWSTR)A2W_CP(lpa, (cp))) -#define W2CA_CP(lpw, cp) ((LPCSTR)W2A_CP(lpw, (cp))) - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#define A2CW_EX(lpa, nChar) ((LPCWSTR)A2W_EX(lpa, nChar)) -#define A2CW_EX_DEF(lpa) ((LPCWSTR)A2W_EX_DEF(lpa)) -#define W2CA_EX(lpw, nChar) ((LPCSTR)W2A_EX(lpw, nChar)) -#define W2CA_EX_DEF(lpw) ((LPCSTR)W2A_EX_DEF(lpw)) - -#define A2CW_CP_EX(lpa, nChar, cp) ((LPCWSTR)A2W_CP_EX(lpa, nChar, (cp))) -#define W2CA_CP_EX(lpw, nChar, cp) ((LPCSTR)W2A_CP_EX(lpw, nChar, (cp))) - - inline int ocslen(__in_z LPCOLESTR x) throw() { return lstrlenW(x); } - -#if _SECURE_ATL - inline bool ocscpy_s(__out_ecount_z(maxSize) LPOLESTR dest, __in size_t maxSize, __in_z LPCOLESTR src) throw() - { return 0 == memcpy_s(dest, maxSize*sizeof(WCHAR), src, (ocslen(src)+1)*sizeof(WCHAR)); } - inline bool ocscat_s(__out_ecount_z(maxSize) LPOLESTR dest, __in size_t maxSize, __in_z LPCOLESTR src) throw() - { return 0 == wcscat_s(dest, maxSize,src); } -#else - inline bool ocscpy_s(__out_ecount_z(maxSize) LPOLESTR dest, __in size_t maxSize, __in_z LPCOLESTR src) throw() - { (void)maxSize; memcpy(dest, src, (ocslen(src)+1)*sizeof(WCHAR)); return true; } - inline bool ocscat_s(__out_ecount_z(maxSize) LPOLESTR dest, __in size_t maxSize, __in_z LPCOLESTR src) throw() - { (void)maxSize; wcscat(dest, src); } -#endif - -#if defined(_UNICODE) - -// in these cases the default (TCHAR) is the same as OLECHAR - -#if _SECURE_ATL - _ATL_INSECURE_DEPRECATE("ocscpy is not safe. Intead, use ocscpy_s") - inline OLECHAR* ocscpy(__out_z LPOLESTR dest, __in_z LPCOLESTR src) throw() - { -#pragma warning(push) -#pragma warning(disable:4995) // use of deprecated function -#pragma warning(disable:4996) -#pragma warning(disable:28719) // use of Banned API - return wcscpy(dest, src); -#pragma warning(pop) - } - _ATL_INSECURE_DEPRECATE("ocscat is not safe. Intead, use ocscat_s") - inline OLECHAR* ocscat(__out_z LPOLESTR dest, __in_z LPCOLESTR src) throw() - { -#pragma warning(push) -#pragma warning(disable:4995) // use of deprecated function -#pragma warning(disable:4996) -#pragma warning(disable:28719) // use of Banned API - return wcscat(dest, src); -#pragma warning(pop) - } -#else -#pragma warning(push) -#pragma warning(disable:4995) // use of deprecated function - inline OLECHAR* ocscpy(__out_z LPOLESTR dest, __in_z LPCOLESTR src) throw() { return lstrcpyW(dest, src); } - inline OLECHAR* ocscat(__out_z LPOLESTR dest, __in_z LPCOLESTR src) throw() { return lstrcatW(dest, src); } -#pragma warning(pop) -#endif - - inline LPCOLESTR T2COLE_EX(__in_opt LPCTSTR lp, UINT) { return lp; } - inline LPCOLESTR T2COLE_EX_DEF(__in_opt LPCTSTR lp) { return lp; } - inline LPCTSTR OLE2CT_EX(__in_opt LPCOLESTR lp, UINT) { return lp; } - inline LPCTSTR OLE2CT_EX_DEF(__in_opt LPCOLESTR lp) { return lp; } - inline LPOLESTR T2OLE_EX(__in_opt LPTSTR lp, UINT) { return lp; } - inline LPOLESTR T2OLE_EX_DEF(__in_opt LPTSTR lp) { return lp; } - inline LPTSTR OLE2T_EX(__in_opt LPOLESTR lp, UINT) { return lp; } - inline LPTSTR OLE2T_EX_DEF(__in_opt LPOLESTR lp) { return lp; } - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - - inline LPCOLESTR T2COLE(__in_opt LPCTSTR lp) { return lp; } - inline LPCTSTR OLE2CT(__in_opt LPCOLESTR lp) { return lp; } - inline LPOLESTR T2OLE(__in_opt LPTSTR lp) { return lp; } - inline LPTSTR OLE2T(__in_opt LPOLESTR lp) { return lp; } - inline LPOLESTR CharNextO(__in LPCOLESTR lp) throw() {return CharNextW(lp);} - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#else // !defined(_UNICODE) - -#if _SECURE_ATL - - _ATL_INSECURE_DEPRECATE("ocscpy is not safe. Intead, use ocscpy_s") - inline OLECHAR* ocscpy(__out_z LPOLESTR dest, __in_z LPCOLESTR src) throw() - { -#pragma warning(push) -#pragma warning(disable:4995) // use of deprecated function -#pragma warning(disable:4996) - return (LPOLESTR) memcpy(dest, src, (lstrlenW(src)+1)*sizeof(WCHAR)); -#pragma warning(pop) - } - _ATL_INSECURE_DEPRECATE("ocscat is not safe. Intead, use ocscat_s") - inline OLECHAR* ocscat(__inout_z LPOLESTR dest, __in_z LPCOLESTR src) throw() - { -#pragma warning(push) -#pragma warning(disable:4995) // use of deprecated function -#pragma warning(disable:4996) - return ocscpy(dest+ocslen(dest), src); -#pragma warning(pop) - } - -#else - - //lstrcpyW doesn't work on Win95, so we do this - inline OLECHAR* ocscpy(__out_z LPOLESTR dest, __in_z LPCOLESTR src) throw() - { - return (LPOLESTR) memcpy(dest, src, (lstrlenW(src)+1)*sizeof(WCHAR)); - } - inline OLECHAR* ocscat(__out_z LPOLESTR dest, __in_z LPCOLESTR src) throw() - { - return ocscpy(dest+ocslen(dest), src); - } - -#endif - - //CharNextW doesn't work on Win95 so we use this - #define T2COLE_EX(lpa, nChar) A2CW_EX(lpa, nChar) - #define T2COLE_EX_DEF(lpa) A2CW_EX_DEF(lpa) - #define T2OLE_EX(lpa, nChar) A2W_EX(lpa, nChar) - #define T2OLE_EX_DEF(lpa) A2W_EX_DEF(lpa) - #define OLE2CT_EX(lpo, nChar) W2CA_EX(lpo, nChar) - #define OLE2CT_EX_DEF(lpo) W2CA_EX_DEF(lpo) - #define OLE2T_EX(lpo, nChar) W2A_EX(lpo, nChar) - #define OLE2T_EX_DEF(lpo) W2A_EX_DEF(lpo) - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - - #define T2COLE(lpa) A2CW(lpa) - #define T2OLE(lpa) A2W(lpa) - #define OLE2CT(lpo) W2CA(lpo) - #define OLE2T(lpo) W2A(lpo) - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - - inline LPOLESTR CharNextO(LPCOLESTR lp) throw() {return (LPOLESTR) ((*lp) ? (lp+1) : lp);} - -#endif // defined(_UNICODE) - - inline LPOLESTR W2OLE_EX(__in_opt LPWSTR lp, UINT) { return lp; } - inline LPOLESTR W2OLE_EX_DEF(__in_opt LPWSTR lp) { return lp; } - inline LPWSTR OLE2W_EX(__in_opt LPOLESTR lp, UINT) { return lp; } - inline LPWSTR OLE2W_EX_DEF(__in_opt LPOLESTR lp) { return lp; } - #define A2OLE_EX A2W_EX - #define A2OLE_EX_DEF A2W_EX_DEF - #define OLE2A_EX W2A_EX - #define OLE2A_EX_DEF W2A_EX_DEF - inline LPCOLESTR W2COLE_EX(__in_opt LPCWSTR lp, UINT) { return lp; } - inline LPCOLESTR W2COLE_EX_DEF(__in_opt LPCWSTR lp) { return lp; } - inline LPCWSTR OLE2CW_EX(__in_opt LPCOLESTR lp, UINT) { return lp; } - inline LPCWSTR OLE2CW_EX_DEF(__in_opt LPCOLESTR lp) { return lp; } - #define A2COLE_EX A2CW_EX - #define A2COLE_EX_DEF A2CW_EX_DEF - #define OLE2CA_EX W2CA_EX - #define OLE2CA_EX_DEF W2CA_EX_DEF - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - - inline LPOLESTR W2OLE(__in_opt LPWSTR lp) { return lp; } - inline LPWSTR OLE2W(__in_opt LPOLESTR lp) { return lp; } - #define A2OLE A2W - #define OLE2A W2A - inline LPCOLESTR W2COLE(__in_opt LPCWSTR lp) { return lp; } - inline LPCWSTR OLE2CW(__in_opt LPCOLESTR lp) { return lp; } - #define A2COLE A2CW - #define OLE2CA W2CA - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#if defined(_UNICODE) - - #define T2A_EX W2A_EX - #define T2A_EX_DEF W2A_EX_DEF - #define A2T_EX A2W_EX - #define A2T_EX_DEF A2W_EX_DEF - inline LPWSTR T2W_EX(__in_opt LPTSTR lp, UINT) { return lp; } - inline LPWSTR T2W_EX_DEF(__in_opt LPTSTR lp) { return lp; } - inline LPTSTR W2T_EX(__in_opt LPWSTR lp, UINT) { return lp; } - inline LPTSTR W2T_DEF(__in_opt LPWSTR lp) { return lp; } - #define T2CA_EX W2CA_EX - #define T2CA_EX_DEF W2CA_EX_DEF - #define A2CT_EX A2CW_EX - #define A2CT_EX_DEF A2CW_EX_DEF - inline LPCWSTR T2CW_EX(__in_opt LPCTSTR lp, UINT) { return lp; } - inline LPCWSTR T2CW_EX_DEF(__in_opt LPCTSTR lp) { return lp; } - inline LPCTSTR W2CT_EX(__in_opt LPCWSTR lp, UINT) { return lp; } - inline LPCTSTR W2CT_EX_DEF(__in_opt LPCWSTR lp) { return lp; } - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - - #define T2A W2A - #define A2T A2W - inline LPWSTR T2W(__in_opt LPTSTR lp) { return lp; } - inline LPTSTR W2T(__in_opt LPWSTR lp) { return lp; } - #define T2CA W2CA - #define A2CT A2CW - inline LPCWSTR T2CW(__in_opt LPCTSTR lp) { return lp; } - inline LPCTSTR W2CT(__in_opt LPCWSTR lp) { return lp; } - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#else // !defined(_UNICODE) - - #define T2W_EX A2W_EX - #define T2W_EX_DEF A2W_EX_DEF - #define W2T_EX W2A_EX - #define W2T_EX_DEF W2A_EX_DEF - inline LPSTR T2A_EX(__in_opt LPTSTR lp, UINT) { return lp; } - inline LPSTR T2A_EX_DEF(__in_opt LPTSTR lp) { return lp; } - inline LPTSTR A2T_EX(__in_opt LPSTR lp, UINT) { return lp; } - inline LPTSTR A2T_EX_DEF(__in_opt LPSTR lp) { return lp; } - #define T2CW_EX A2CW_EX - #define T2CW_EX_DEF A2CW_EX_DEF - #define W2CT_EX W2CA_EX - #define W2CT_EX_DEF W2CA_EX_DEF - inline LPCSTR T2CA_EX(__in_opt LPCTSTR lp, UINT) { return lp; } - inline LPCSTR T2CA_EX_DEF(__in_opt LPCTSTR lp) { return lp; } - inline LPCTSTR A2CT_EX(__in_opt LPCSTR lp, UINT) { return lp; } - inline LPCTSTR A2CT_EX_DEF(__in_opt LPCSTR lp) { return lp; } - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - - #define T2W A2W - #define W2T W2A - inline LPSTR T2A(__in_opt LPTSTR lp) { return lp; } - inline LPTSTR A2T(__in_opt LPSTR lp) { return lp; } - #define T2CW A2CW - #define W2CT W2CA - inline LPCSTR T2CA(__in_opt LPCTSTR lp) { return lp; } - inline LPCTSTR A2CT(__in_opt LPCSTR lp) { return lp; } - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#endif // defined(_UNICODE) - -inline __checkReturn BSTR A2WBSTR(__in_opt LPCSTR lp, int nLen = -1) -{ - if (lp == NULL || nLen == 0) - return NULL; - USES_CONVERSION_EX; - BSTR str = NULL; - int nConvertedLen = MultiByteToWideChar(_acp_ex, 0, lp, - nLen, NULL, NULL); - int nAllocLen = nConvertedLen; - if (nLen == -1) - nAllocLen -= 1; // Don't allocate terminating '\0' - str = ::SysAllocStringLen(NULL, nAllocLen); - - if (str != NULL) - { - int nResult; - nResult = MultiByteToWideChar(_acp_ex, 0, lp, nLen, str, nConvertedLen); - ATLASSERT(nResult == nConvertedLen); - if(nResult != nConvertedLen) - { - SysFreeString(str); - return NULL; - } - - } - return str; -} - -inline BSTR OLE2BSTR(__in_opt LPCOLESTR lp) {return ::SysAllocString(lp);} -#if defined(_UNICODE) -// in these cases the default (TCHAR) is the same as OLECHAR - inline BSTR T2BSTR_EX(__in_opt LPCTSTR lp) {return ::SysAllocString(lp);} - inline BSTR A2BSTR_EX(__in_opt LPCSTR lp) {return A2WBSTR(lp);} - inline BSTR W2BSTR_EX(__in_opt LPCWSTR lp) {return ::SysAllocString(lp);} - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - - inline BSTR T2BSTR(__in_opt LPCTSTR lp) {return ::SysAllocString(lp);} - inline BSTR A2BSTR(__in_opt LPCSTR lp) {return A2WBSTR(lp);} - inline BSTR W2BSTR(__in_opt LPCWSTR lp) {return ::SysAllocString(lp);} - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#else // !defined(_UNICODE) - inline BSTR T2BSTR_EX(__in_opt LPCTSTR lp) {return A2WBSTR(lp);} - inline BSTR A2BSTR_EX(__in_opt LPCSTR lp) {return A2WBSTR(lp);} - inline BSTR W2BSTR_EX(__in_opt LPCWSTR lp) {return ::SysAllocString(lp);} - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - - inline BSTR T2BSTR(__in_opt LPCTSTR lp) {return A2WBSTR(lp);} - inline BSTR A2BSTR(__in_opt LPCSTR lp) {return A2WBSTR(lp);} - inline BSTR W2BSTR(__in_opt LPCWSTR lp) {return ::SysAllocString(lp);} - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#endif // defined(_UNICODE) - -#ifdef _WINGDI_ -///////////////////////////////////////////////////////////////////////////// -// Global UNICODE<>ANSI translation helpers -inline LPDEVMODEW AtlDevModeA2W(__out LPDEVMODEW lpDevModeW, __in const DEVMODEA* lpDevModeA) -{ - USES_CONVERSION_EX; - ATLASSERT(lpDevModeW != NULL); - if (lpDevModeA == NULL || lpDevModeW == NULL) - { - return NULL; - } - - AtlA2WHelper(lpDevModeW->dmDeviceName, (LPCSTR)lpDevModeA->dmDeviceName, 32, _acp_ex); - -#if _SECURE_ATL - if(0 != memcpy_s(&lpDevModeW->dmSpecVersion, offsetof(DEVMODEW, dmFormName) - offsetof(DEVMODEW, dmSpecVersion), - &lpDevModeA->dmSpecVersion, offsetof(DEVMODEW, dmFormName) - offsetof(DEVMODEW, dmSpecVersion))) - { - return NULL; - } -#else - memcpy(&lpDevModeW->dmSpecVersion, &lpDevModeA->dmSpecVersion, - offsetof(DEVMODEW, dmFormName) - offsetof(DEVMODEW, dmSpecVersion)); -#endif - - AtlA2WHelper(lpDevModeW->dmFormName, (LPCSTR)lpDevModeA->dmFormName, 32, _acp_ex); - -#if _SECURE_ATL - if(0 != memcpy_s(&lpDevModeW->dmLogPixels, sizeof(DEVMODEW) - offsetof(DEVMODEW, dmLogPixels), - &lpDevModeA->dmLogPixels, sizeof(DEVMODEW) - offsetof(DEVMODEW, dmLogPixels))) - { - return NULL; - } -#else - memcpy(&lpDevModeW->dmLogPixels, &lpDevModeA->dmLogPixels, - sizeof(DEVMODEW) - offsetof(DEVMODEW, dmLogPixels)); -#endif - - if (lpDevModeA->dmDriverExtra != 0) - { - // lpDevModeW holds more info -#pragma warning(push) -// -// [pfx_parse] - workaround for PREfix parse problem -// -#if ((defined(_PREFIX_)) || (defined(_PREFAST_))) && (_MSC_VER < 1400) - // do nothing, this pragma not understood by PREfix 5.1 -#else // !_PREFIX_ -#pragma warning(disable:26000) -#endif -#if _SECURE_ATL - if(0 != memcpy_s(lpDevModeW+1, lpDevModeA->dmDriverExtra, lpDevModeA+1, lpDevModeA->dmDriverExtra)) - { - return NULL; - } -#else - memcpy(lpDevModeW+1, lpDevModeA+1, lpDevModeA->dmDriverExtra); -#endif -#pragma warning(pop) - } - lpDevModeW->dmSize = sizeof(DEVMODEW); - return lpDevModeW; -} - -inline LPTEXTMETRICW AtlTextMetricA2W(__out LPTEXTMETRICW lptmW, __in LPTEXTMETRICA lptmA) -{ - USES_CONVERSION_EX; - ATLASSERT(lptmW != NULL); - if (lptmA == NULL || lptmW == NULL) - return NULL; - -#if _SECURE_ATL - if(0 != memcpy_s(lptmW, sizeof(LONG) * 11, lptmA, sizeof(LONG) * 11)) - { - return NULL; - } -#else - memcpy(lptmW, lptmA, sizeof(LONG) * 11); -#endif - -#if _SECURE_ATL - if(0 != memcpy_s(&lptmW->tmItalic, sizeof(BYTE) * 5, &lptmA->tmItalic, sizeof(BYTE) * 5)) - { - return NULL; - } -#else - memcpy(&lptmW->tmItalic, &lptmA->tmItalic, sizeof(BYTE) * 5); -#endif - - if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmFirstChar, 1, &lptmW->tmFirstChar, 1) == 0) - { - ATLASSERT(FALSE); - return NULL; - } - - if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmLastChar, 1, &lptmW->tmLastChar, 1) == 0) - { - ATLASSERT(FALSE); - return NULL; - } - - if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmDefaultChar, 1, &lptmW->tmDefaultChar, 1)== 0) - { - ATLASSERT(FALSE); - return NULL; - } - - if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmBreakChar, 1, &lptmW->tmBreakChar, 1) == 0) - { - ATLASSERT(FALSE); - return NULL; - } - - return lptmW; -} - -inline LPTEXTMETRICA AtlTextMetricW2A(__out LPTEXTMETRICA lptmA, __in LPTEXTMETRICW lptmW) -{ - USES_CONVERSION_EX; - ATLASSERT(lptmA != NULL); - if (lptmW == NULL || lptmA == NULL) - { - return NULL; - } - -#if _SECURE_ATL - if(0 != memcpy_s(lptmA, sizeof(LONG) * 11, lptmW, sizeof(LONG) * 11)) - { - return NULL; - } -#else - memcpy(lptmA, lptmW, sizeof(LONG) * 11); -#endif - -#if _SECURE_ATL - if(0 != memcpy_s(&lptmA->tmItalic, sizeof(BYTE) * 5, &lptmW->tmItalic, sizeof(BYTE) * 5)) - { - return NULL; - } -#else - memcpy(&lptmA->tmItalic, &lptmW->tmItalic, sizeof(BYTE) * 5); -#endif - - if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmFirstChar, 1, (LPSTR)&lptmA->tmFirstChar, 1, NULL, NULL) == 0) - { - ATLASSERT(FALSE); - return NULL; - } - - if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmLastChar, 1, (LPSTR)&lptmA->tmLastChar, 1, NULL, NULL) == 0) - { - ATLASSERT(FALSE); - return NULL; - } - - if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmDefaultChar, 1, (LPSTR)&lptmA->tmDefaultChar, 1, NULL, NULL) == 0) - { - ATLASSERT(FALSE); - return NULL; - } - - if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmBreakChar, 1, (LPSTR)&lptmA->tmBreakChar, 1, NULL, NULL) == 0) - { - ATLASSERT(FALSE); - return NULL; - } - - return lptmA; -} - -#ifndef ATLDEVMODEA2W -#define ATLDEVMODEA2W AtlDevModeA2W -#define ATLDEVMODEW2A AtlDevModeW2A -#define ATLTEXTMETRICA2W AtlTextMetricA2W -#define ATLTEXTMETRICW2A AtlTextMetricW2A -#endif - -// Requires USES_CONVERSION_EX or USES_ATL_SAFE_ALLOCA macro before using the _EX versions of the macros -#define DEVMODEW2A_EX(lpw)\ - (((lpw) == NULL) ? NULL : ATLDEVMODEW2A((LPDEVMODEA)_ATL_SAFE_ALLOCA(sizeof(DEVMODEA)+(lpw)->dmDriverExtra, _ATL_SAFE_ALLOCA_DEF_THRESHOLD), (lpw))) -#define DEVMODEA2W_EX(lpa)\ - (((lpa) == NULL) ? NULL : ATLDEVMODEA2W((LPDEVMODEW)_ATL_SAFE_ALLOCA(sizeof(DEVMODEW)+(lpa)->dmDriverExtra, _ATL_SAFE_ALLOCA_DEF_THRESHOLD), (lpa))) -#define TEXTMETRICW2A_EX(lptmw)\ - (((lptmw) == NULL) ? NULL : ATLTEXTMETRICW2A((LPTEXTMETRICA)_ATL_SAFE_ALLOCA(sizeof(TEXTMETRICA), _ATL_SAFE_ALLOCA_DEF_THRESHOLD), (lptmw))) -#define TEXTMETRICA2W_EX(lptma)\ - (((lptma) == NULL) ? NULL : ATLTEXTMETRICA2W((LPTEXTMETRICW)_ATL_SAFE_ALLOCA(sizeof(TEXTMETRICW), _ATL_SAFE_ALLOCA_DEF_THRESHOLD), (lptma))) - -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - -#define DEVMODEW2A(lpw)\ - ((lpw == NULL) ? NULL : ATLDEVMODEW2A((LPDEVMODEA)alloca(sizeof(DEVMODEA)+lpw->dmDriverExtra), lpw)) -#define DEVMODEA2W(lpa)\ - ((lpa == NULL) ? NULL : ATLDEVMODEA2W((LPDEVMODEW)alloca(sizeof(DEVMODEW)+lpa->dmDriverExtra), lpa)) -#define TEXTMETRICW2A(lptmw)\ - ((lptmw == NULL) ? NULL : ATLTEXTMETRICW2A((LPTEXTMETRICA)alloca(sizeof(TEXTMETRICA)), lptmw)) -#define TEXTMETRICA2W(lptma)\ - ((lptma == NULL) ? NULL : ATLTEXTMETRICA2W((LPTEXTMETRICW)alloca(sizeof(TEXTMETRICW)), lptma)) - -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#define DEVMODEOLE DEVMODEW -#define LPDEVMODEOLE LPDEVMODEW -#define TEXTMETRICOLE TEXTMETRICW -#define LPTEXTMETRICOLE LPTEXTMETRICW - -#if defined(_UNICODE) -// in these cases the default (TCHAR) is the same as OLECHAR - inline LPDEVMODEW DEVMODEOLE2T_EX(LPDEVMODEOLE lp) { return lp; } - inline LPDEVMODEOLE DEVMODET2OLE_EX(LPDEVMODEW lp) { return lp; } - inline LPTEXTMETRICW TEXTMETRICOLE2T_EX(LPTEXTMETRICOLE lp) { return lp; } - inline LPTEXTMETRICOLE TEXTMETRICT2OLE_EX(LPTEXTMETRICW lp) { return lp; } -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - inline LPDEVMODEW DEVMODEOLE2T(LPDEVMODEOLE lp) { return lp; } - inline LPDEVMODEOLE DEVMODET2OLE(LPDEVMODEW lp) { return lp; } - inline LPTEXTMETRICW TEXTMETRICOLE2T(LPTEXTMETRICOLE lp) { return lp; } - inline LPTEXTMETRICOLE TEXTMETRICT2OLE(LPTEXTMETRICW lp) { return lp; } -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#else // !defined(_UNICODE) - #define DEVMODEOLE2T_EX(lpo) DEVMODEW2A_EX(lpo) - #define DEVMODET2OLE_EX(lpa) DEVMODEA2W_EX(lpa) - #define TEXTMETRICOLE2T_EX(lptmw) TEXTMETRICW2A_EX(lptmw) - #define TEXTMETRICT2OLE_EX(lptma) TEXTMETRICA2W_EX(lptma) -#ifndef _ATL_EX_CONVERSION_MACROS_ONLY - #define DEVMODEOLE2T(lpo) DEVMODEW2A(lpo) - #define DEVMODET2OLE(lpa) DEVMODEA2W(lpa) - #define TEXTMETRICOLE2T(lptmw) TEXTMETRICW2A(lptmw) - #define TEXTMETRICT2OLE(lptma) TEXTMETRICA2W(lptma) -#endif // _ATL_EX_CONVERSION_MACROS_ONLY - -#endif // defined(_UNICODE) - -#endif //_WINGDI_ - -#pragma pack(pop) - -///////////////////////////////////////////////////////////////////////////// - -#ifndef _ATL_DLL - -#ifdef _WINGDI_ - -ATLINLINE ATLAPI_(LPDEVMODEA) AtlDevModeW2A(__out LPDEVMODEA lpDevModeA, __in const DEVMODEW* lpDevModeW) -{ - USES_CONVERSION_EX; - ATLASSERT(lpDevModeA != NULL); - if (lpDevModeW == NULL || lpDevModeA == NULL) - return NULL; - - AtlW2AHelper((LPSTR)lpDevModeA->dmDeviceName, lpDevModeW->dmDeviceName, 32, _acp_ex); - -#if _SECURE_ATL - if(0 != memcpy_s(&lpDevModeA->dmSpecVersion, offsetof(DEVMODEA, dmFormName) - offsetof(DEVMODEA, dmSpecVersion), - &lpDevModeW->dmSpecVersion, offsetof(DEVMODEA, dmFormName) - offsetof(DEVMODEA, dmSpecVersion))) - { - return NULL; - } -#else - memcpy(&lpDevModeA->dmSpecVersion, &lpDevModeW->dmSpecVersion, - offsetof(DEVMODEA, dmFormName) - offsetof(DEVMODEA, dmSpecVersion)); -#endif - - AtlW2AHelper((LPSTR)lpDevModeA->dmFormName, lpDevModeW->dmFormName, 32, _acp_ex); - -#if _SECURE_ATL - if(0 != memcpy_s(&lpDevModeA->dmLogPixels, sizeof(DEVMODEA) - offsetof(DEVMODEA, dmLogPixels), - &lpDevModeW->dmLogPixels, sizeof(DEVMODEA) - offsetof(DEVMODEA, dmLogPixels))) - { - return NULL; - } -#else - memcpy(&lpDevModeA->dmLogPixels, &lpDevModeW->dmLogPixels, - sizeof(DEVMODEA) - offsetof(DEVMODEA, dmLogPixels)); -#endif - - if (lpDevModeW->dmDriverExtra != 0) - { - // lpDevModeW holds more info -#pragma warning(push) -// -// [pfx_parse] - workaround for PREfix parse problem -// -#if ((defined(_PREFIX_)) || (defined(_PREFAST_))) && (_MSC_VER < 1400) - // do nothing, this pragma not understood by PREfix 5.1 -#else // !_PREFIX_ -#pragma warning(disable:26000) -#endif -#if _SECURE_ATL - if(0 != memcpy_s(lpDevModeA+1, lpDevModeW->dmDriverExtra, lpDevModeW+1, lpDevModeW->dmDriverExtra)) - { - return NULL; - } -#else - memcpy(lpDevModeA+1, lpDevModeW+1, lpDevModeW->dmDriverExtra); -#endif -#pragma warning(pop) - } - - lpDevModeA->dmSize = sizeof(DEVMODEA); - return lpDevModeA; -} - -#endif //_WINGDI - -#endif // !_ATL_DLL - -// -// [pfx_parse] - workaround for old PREfix/PREfast parser -// -#if (defined(_PREFIX_) || defined(_PREFAST_)) && (_MSC_VER < 1400) -#pragma warning (pop) -#endif // old PREfast parser - -#ifndef _ATL_NO_PRAGMA_WARNINGS -#pragma warning (pop) -#endif //!_ATL_NO_PRAGMA_WARNINGS - -#endif // __ATLCONV_H__ - diff --git a/cpp/jacob/include/atlcore.h b/cpp/jacob/include/atlcore.h deleted file mode 100644 index 2313070..0000000 --- a/cpp/jacob/include/atlcore.h +++ /dev/null @@ -1,554 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLCORE_H__ -#define __ATLCORE_H__ - -#pragma once - -#ifdef _ATL_ALL_WARNINGS -#pragma warning( push ) -#endif - -#pragma warning(disable: 4786) // identifier was truncated in the debug information -#pragma warning(disable: 4127) // constant expression - -#include -#include -#include - -#include -#include -#include - -#include -#include - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ -///////////////////////////////////////////////////////////////////////////// -// Verify that a null-terminated string points to valid memory -inline BOOL AtlIsValidString(LPCWSTR psz, size_t nMaxLength = INT_MAX) -{ - (nMaxLength); - return (psz != NULL); -} - -// Verify that a null-terminated string points to valid memory -inline BOOL AtlIsValidString(LPCSTR psz, size_t nMaxLength = UINT_MAX) -{ - (nMaxLength); - return (psz != NULL); -} - -// Verify that a pointer points to valid memory -inline BOOL AtlIsValidAddress(const void* p, size_t nBytes, - BOOL bReadWrite = TRUE) -{ - (bReadWrite); - (nBytes); - return (p != NULL); -} - -template -inline void AtlAssertValidObject(const T *pOb) -{ - ATLASSERT(pOb); - ATLASSERT(AtlIsValidAddress(pOb, sizeof(T))); - if(pOb) - pOb->AssertValid(); -} -#ifdef _DEBUG -#define ATLASSERT_VALID(x) ATL::AtlAssertValidObject(x) -#else -#define ATLASSERT_VALID(x) __noop; -#endif - -// COM Sync Classes -class CComCriticalSection -{ -public: - CComCriticalSection() throw() - { - memset(&m_sec, 0, sizeof(CRITICAL_SECTION)); - } - ~CComCriticalSection() - { - } - HRESULT Lock() throw() - { - EnterCriticalSection(&m_sec); - return S_OK; - } - HRESULT Unlock() throw() - { - LeaveCriticalSection(&m_sec); - return S_OK; - } - HRESULT Init() throw() - { - HRESULT hRes = E_FAIL; - __try - { - InitializeCriticalSection(&m_sec); - hRes = S_OK; - } - // structured exception may be raised in low memory situations - __except(STATUS_NO_MEMORY == GetExceptionCode()) - { - hRes = E_OUTOFMEMORY; - } - return hRes; - } - - HRESULT Term() throw() - { - DeleteCriticalSection(&m_sec); - return S_OK; - } - CRITICAL_SECTION m_sec; -}; - -class CComAutoCriticalSection : public CComCriticalSection -{ -public: - CComAutoCriticalSection() - { - HRESULT hr = CComCriticalSection::Init(); - if (FAILED(hr)) - AtlThrow(hr); - } - ~CComAutoCriticalSection() throw() - { - CComCriticalSection::Term(); - } -private : - HRESULT Init(); // Not implemented. CComAutoCriticalSection::Init should never be called - HRESULT Term(); // Not implemented. CComAutoCriticalSection::Term should never be called -}; - -class CComSafeDeleteCriticalSection : public CComCriticalSection -{ -public: - CComSafeDeleteCriticalSection(): m_bInitialized(false) - { - } - - ~CComSafeDeleteCriticalSection() throw() - { - if (!m_bInitialized) - { - return; - } - m_bInitialized = false; - CComCriticalSection::Term(); - } - - HRESULT Init() throw() - { - ATLASSERT( !m_bInitialized ); - HRESULT hr = CComCriticalSection::Init(); - if (SUCCEEDED(hr)) - { - m_bInitialized = true; - } - return hr; - } - - HRESULT Term() throw() - { - if (!m_bInitialized) - { - return S_OK; - } - m_bInitialized = false; - return CComCriticalSection::Term(); - } - - HRESULT Lock() - { - // CComSafeDeleteCriticalSection::Init or CComAutoDeleteCriticalSection::Init - // not called or failed. - // m_critsec member of CComObjectRootEx is now of type - // CComAutoDeleteCriticalSection. It has to be initialized - // by calling CComObjectRootEx::_AtlInitialConstruct - ATLASSUME(m_bInitialized); - return CComCriticalSection::Lock(); - } - -private: - bool m_bInitialized; -}; - -class CComAutoDeleteCriticalSection : public CComSafeDeleteCriticalSection -{ -private: - // CComAutoDeleteCriticalSection::Term should never be called - HRESULT Term() throw(); -}; - -class CComFakeCriticalSection -{ -public: - HRESULT Lock() throw() { return S_OK; } - HRESULT Unlock() throw() { return S_OK; } - HRESULT Init() throw() { return S_OK; } - HRESULT Term() throw() { return S_OK; } -}; - -///////////////////////////////////////////////////////////////////////////// -// Module - -// Used by any project that uses ATL -struct _ATL_BASE_MODULE70 -{ - UINT cbSize; - HINSTANCE m_hInst; - HINSTANCE m_hInstResource; - bool m_bNT5orWin98; - DWORD dwAtlBuildVer; - const GUID* pguidVer; - CComCriticalSection m_csResource; - CSimpleArray m_rgResourceInstance; -}; -typedef _ATL_BASE_MODULE70 _ATL_BASE_MODULE; - -class CAtlBaseModule : public _ATL_BASE_MODULE -{ -public : - static bool m_bInitFailed; - CAtlBaseModule() throw(); - ~CAtlBaseModule() throw (); - - HINSTANCE GetModuleInstance() throw() - { - return m_hInst; - } - HINSTANCE GetResourceInstance() throw() - { - return m_hInstResource; - } - HINSTANCE SetResourceInstance(HINSTANCE hInst) throw() - { - return static_cast< HINSTANCE >(InterlockedExchangePointer((void**)&m_hInstResource, hInst)); - } - - bool AddResourceInstance(HINSTANCE hInst) throw(); - bool RemoveResourceInstance(HINSTANCE hInst) throw(); - HINSTANCE GetHInstanceAt(int i) throw(); -}; - -__declspec(selectany) bool CAtlBaseModule::m_bInitFailed = false; -extern CAtlBaseModule _AtlBaseModule; - -///////////////////////////////////////////////////////////////////////////// -// String resource helpers - -#pragma warning(push) -#pragma warning(disable: 4200) - struct ATLSTRINGRESOURCEIMAGE - { - WORD nLength; - __field_ecount(nLength) WCHAR achString[]; - }; -#pragma warning(pop) // C4200 - -inline const ATLSTRINGRESOURCEIMAGE* _AtlGetStringResourceImage( HINSTANCE hInstance, HRSRC hResource, UINT id ) throw() -{ - const ATLSTRINGRESOURCEIMAGE* pImage; - const ATLSTRINGRESOURCEIMAGE* pImageEnd; - ULONG nResourceSize; - HGLOBAL hGlobal; - UINT iIndex; - - hGlobal = ::LoadResource( hInstance, hResource ); - if( hGlobal == NULL ) - { - return( NULL ); - } - - pImage = (const ATLSTRINGRESOURCEIMAGE*)::LockResource( hGlobal ); - if( pImage == NULL ) - { - return( NULL ); - } - - nResourceSize = ::SizeofResource( hInstance, hResource ); - pImageEnd = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+nResourceSize); - iIndex = id&0x000f; - - while( (iIndex > 0) && (pImage < pImageEnd) ) - { - pImage = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+(sizeof( ATLSTRINGRESOURCEIMAGE )+(pImage->nLength*sizeof( WCHAR )))); - iIndex--; - } - if( pImage >= pImageEnd ) - { - return( NULL ); - } - if( pImage->nLength == 0 ) - { - return( NULL ); - } - - return( pImage ); -} - -inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id ) throw() -{ - HRSRC hResource; - - hResource = ::FindResource( hInstance, MAKEINTRESOURCE( ((id>>4)+1) ), RT_STRING ); - if( hResource == NULL ) - { - return( NULL ); - } - - return _AtlGetStringResourceImage( hInstance, hResource, id ); -} - -inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id, WORD wLanguage ) throw() -{ - HRSRC hResource; - - hResource = ::FindResourceEx( hInstance, RT_STRING, MAKEINTRESOURCE( ((id>>4)+1) ), wLanguage ); - if( hResource == NULL ) - { - return( NULL ); - } - - return _AtlGetStringResourceImage( hInstance, hResource, id ); -} - -inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id ) throw() -{ - const ATLSTRINGRESOURCEIMAGE* p = NULL; - HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0); - - for (int i = 1; hInst != NULL && p == NULL; hInst = _AtlBaseModule.GetHInstanceAt(i++)) - { - p = AtlGetStringResourceImage(hInst, id); - } - return p; -} - -inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id, WORD wLanguage ) throw() -{ - const ATLSTRINGRESOURCEIMAGE* p = NULL; - HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0); - - for (int i = 1; hInst != NULL && p == NULL; hInst = _AtlBaseModule.GetHInstanceAt(i++)) - { - p = AtlGetStringResourceImage(hInst, id, wLanguage); - } - return p; -} - -inline int AtlLoadString(__in UINT nID, __out_ecount_part_z(nBufferMax, return + 1) LPTSTR lpBuffer, __in int nBufferMax) throw() -{ - HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0); - int nRet = 0; - - for (int i = 1; hInst != NULL && nRet == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++)) - { - nRet = LoadString(hInst, nID, lpBuffer, nBufferMax); - } - return nRet; -} - -inline HINSTANCE AtlFindResourceInstance(LPCTSTR lpName, LPCTSTR lpType, WORD wLanguage = 0) throw() -{ - ATLASSERT(lpType != RT_STRING); // Call AtlFindStringResourceInstance to find the string - if (lpType == RT_STRING) - return NULL; - - if (ATL_IS_INTRESOURCE(lpType)) - { - /* Prefast false warnings caused by bad-shaped definition of MAKEINTRESOURCE macro from PSDK */ - if (lpType == ATL_RT_ICON) - { - lpType = ATL_RT_GROUP_ICON; - } - else if (lpType == ATL_RT_CURSOR) - { - lpType = ATL_RT_GROUP_CURSOR; - } - } - - HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0); - HRSRC hResource = NULL; - - for (int i = 1; hInst != NULL; hInst = _AtlBaseModule.GetHInstanceAt(i++)) - { - hResource = ::FindResourceEx(hInst, lpType, lpName, wLanguage); - if (hResource != NULL) - { - return hInst; - } - } - - return NULL; -} - -inline HINSTANCE AtlFindResourceInstance(UINT nID, LPCTSTR lpType, WORD wLanguage = 0) throw() -{ - return AtlFindResourceInstance(MAKEINTRESOURCE(nID), lpType, wLanguage); -} - -inline HINSTANCE AtlFindStringResourceInstance(UINT nID, WORD wLanguage = 0) throw() -{ - const ATLSTRINGRESOURCEIMAGE* p = NULL; - HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0); - - for (int i = 1; hInst != NULL && p == NULL; hInst = _AtlBaseModule.GetHInstanceAt(i++)) - { - p = AtlGetStringResourceImage(hInst, nID, wLanguage); - if (p != NULL) - return hInst; - } - - return NULL; -} - -/* -Needed by both atlcomcli and atlsafe, so needs to be in here -*/ -inline HRESULT AtlSafeArrayGetActualVartype -( - SAFEARRAY *psaArray, - VARTYPE *pvtType -) -{ - HRESULT hrSystem=::SafeArrayGetVartype(psaArray, pvtType); - - if(FAILED(hrSystem)) - { - return hrSystem; - } - - /* - When Windows has a SAFEARRAY of type VT_DISPATCH with FADF_HAVEIID, - it returns VT_UNKNOWN instead of VT_DISPATCH. We patch the value to be correct - */ - if(pvtType && *pvtType==VT_UNKNOWN) - { - if(psaArray && ((psaArray->fFeatures & FADF_HAVEIID)!=0)) - { - if(psaArray->fFeatures & FADF_DISPATCH) - { - *pvtType=VT_DISPATCH; - } - } - } - - return hrSystem; -} -template -inline _CharType* AtlCharNext(const _CharType* p) throw() -{ - ATLASSUME(p != NULL); // Too expensive to check separately here - if (*p == '\0') // ::CharNextA won't increment if we're at a \0 already - return const_cast<_CharType*>(p+1); - else - return ::CharNextA(p); -} - -template <> -inline wchar_t* AtlCharNext(const wchar_t* p) throw() -{ - return const_cast< wchar_t* >( p+1 ); -} -template -inline const CharType* AtlstrchrT(const CharType* p, CharType ch) throw() -{ - ATLASSERT(p != NULL); - if(p==NULL) - { - return NULL; - } - while( *p != 0 ) - { - if (*p == ch) - { - return p; - } - p = AtlCharNext(p); - } - //strchr for '\0' should succeed - the while loop terminates - //*p == 0, but ch also == 0, so NULL terminator address is returned - return (*p == ch) ? p : NULL; -} -//Ansi and Unicode versions of printf, used with templated CharType trait classes. -#pragma warning(push) -#pragma warning(disable : 4793) -template -inline int AtlprintfT(const CharType* pszFormat,... ) throw() -{ - int retval=0; - va_list argList; - va_start( argList, pszFormat ); - retval=vprintf(pszFormat,argList); - va_end( argList ); - return retval; -} -#pragma warning(pop) - -#pragma warning(push) -#pragma warning(disable : 4793) -template<> -inline int AtlprintfT(const wchar_t* pszFormat,... ) throw() -{ - int retval=0; - va_list argList; - va_start( argList, pszFormat ); - retval=vwprintf(pszFormat, argList); - va_end( argList ); - return retval; -} -#pragma warning(pop) - -#pragma warning(push) -#pragma warning(disable : 4068 28110) - -inline BOOL AtlConvertSystemTimeToVariantTime(const SYSTEMTIME& systimeSrc,double* pVarDtTm) -{ - ATLENSURE(pVarDtTm!=NULL); - //Convert using ::SystemTimeToVariantTime and store the result in pVarDtTm then - //convert variant time back to system time and compare to original system time. - - BOOL ok = ::SystemTimeToVariantTime(const_cast(&systimeSrc), pVarDtTm); - - SYSTEMTIME sysTime; - ::ZeroMemory(&sysTime, sizeof(SYSTEMTIME)); - - ok = ok && ::VariantTimeToSystemTime(*pVarDtTm, &sysTime); - ok = ok && (systimeSrc.wYear == sysTime.wYear && - systimeSrc.wMonth == sysTime.wMonth && - systimeSrc.wDay == sysTime.wDay && - systimeSrc.wHour == sysTime.wHour && - systimeSrc.wMinute == sysTime.wMinute && - systimeSrc.wSecond == sysTime.wSecond); - - return ok; -} -#pragma warning(pop) - -///////////////////////////////////////////////////////////////////////////// - -} // namespace ATL -#pragma pack(pop) - -#ifdef _ATL_ALL_WARNINGS -#pragma warning( pop ) -#endif - -#endif // __ATLCORE_H__ - diff --git a/cpp/jacob/include/atldef.h b/cpp/jacob/include/atldef.h deleted file mode 100644 index bfd2bce..0000000 --- a/cpp/jacob/include/atldef.h +++ /dev/null @@ -1,668 +0,0 @@ - -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLDEF_H__ -#define __ATLDEF_H__ - -#pragma once - -#pragma warning(disable : 4619) // there is no warning number - -#include -#include -#include - -#ifndef RC_INVOKED - -#ifndef __cplusplus - #error ATL requires C++ compilation (use a .cpp suffix) -#endif - -#ifdef UNDER_CE - #error This version of ATL is not currently supported for CE. Look for the CE specific version. -#endif - -// If you are mixing compilation units that are built as -// native code with those that are built /clr, you must define -// the symbol '_ATL_MIXED'. _ATL_MIXED must be defined for all -// compilation units in an executable or it must be defined for none of them. -#if !defined(_ATL_MIXED) -namespace Inconsistent_definition_of_symbol__ATL_MIXED -{ - struct _Please_define_it_the_same_throughout_your_project { }; -} -#else -namespace Inconsistent_definition_of_symbol__ATL_MIXED -{ -#ifdef _M_IX86 -#pragma comment(linker, "/include:??3@YAXPAX@Z") -#else -#pragma comment(linker, "/include:??3@YAXPEAX@Z") -#endif - struct _Please_define_it_the_same_throughout_your_project { virtual void one(){} }; -} -#endif -namespace Inconsistent_definition_of_symbol__ATL_MIXED -{ - __declspec(selectany) _Please_define_it_the_same_throughout_your_project clash = _Please_define_it_the_same_throughout_your_project (); -} - -#if !defined(_ATL_MIXED) -namespace Define_the_symbol__ATL_MIXED -{ -#if defined(_M_CEE) - struct Thank_you { }; -#else -#ifdef _M_IX86 -#pragma comment(linker, "/include:??3@YAXPAX@Z") -#else -#pragma comment(linker, "/include:??3@YAXPEAX@Z") -#endif - struct Thank_you { virtual void one(){} }; -#endif - __declspec(selectany) Thank_you clash = Thank_you(); -} -#endif - -#if defined(_ATL_MIXED) -#define _ATL_NATIVE_INITIALIZATION -#endif - -#if !defined(_M_CEE) -#define _ATL_NATIVE_INITIALIZATION -#endif - -#ifdef _UNICODE -#ifndef UNICODE -#define UNICODE // UNICODE is used by Windows headers -#endif -#endif - -#ifdef UNICODE -#ifndef _UNICODE -#define _UNICODE // _UNICODE is used by C-runtime/MFC headers -#endif -#endif - -#ifdef _DEBUG -#ifndef DEBUG -#define DEBUG -#endif -#endif - -#ifdef _WIN64 -#define _ATL_SUPPORT_VT_I8 // Always support VT_I8 on Win64. -#endif - -#if !defined(UNALIGNED) -#if defined(_M_IA64) || defined(_M_AMD64) -#define UNALIGNED __unaligned -#else -#define UNALIGNED -#endif -#endif - -#if !defined(_countof) -#if !defined(__cplusplus) -#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) -#else -extern "C++" -{ -template -char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; -#define _countof(_Array) sizeof(*__countof_helper(_Array)) -} -#endif -#endif - -#ifndef AtlThrow -#ifndef _ATL_CUSTOM_THROW -#define AtlThrow ATL::AtlThrowImpl -#endif -#endif // AtlThrow - -#ifndef ATLASSERT -#define ATLASSERT(expr) _ASSERTE(expr) -#endif // ATLASSERT - -/* -Why does ATLASSUME exist? - -ATL 8 has two existing validation models - -ATLASSERT/ATLVERIFY - These are used to make sure a debug build reports a problem with the expression/invariant -ATLENSURE - Debug is the same as ATLVERIFY, retail throws a C++ exception - -We added ATLENSURE because there were too many unreported error paths in ATL and we wanted to bail out of more -error conditions rather than just trying to continue in retail. - -There might be a case for changing 'lots' of ATLASSERT to ATLENSURE, but we chose an incremental approach and only -changed over where we saw a problem with code reported from a customer or test case. This reduces code churn in our -code for this version. - -In general, our approach is to try to make sure that when something goes wrong -- the client does not continue to run, because we report an error condition -- debug builds see an assertion about the problem - -Sometimes we have code like - -HRESULT ComMethod(void) -{ - ATLASSUME(m_pFoo); - return m_pFoo->Method(); -} - -We could add - if(!m_pFoo) return E_POINTER; - -But this is very unlikely to help, since it removes the ability of the developer to debug this problem if it's seen in a retail -build of the application. - -We could try something more severe - - if(!m_pFoo) terminate(); // or your favourite shutdown function - -This would ensure good reporting (because VC8 terminate generates a Windows Error Report and crash dump), but hardly seems a big win -over the previous crash. - -ATLENSURE might seem slightly better. It is debuggable and consistent with ATL in general. In fact, many parts of ATL do just this. -But in this specific context, it doesn't look like a great choice. COM methods should not in general be emitting native C++ exceptions -as an error reporting strategy. - -So we find ourselves in a quandry. For these kinds of methods, the traditional code (ATLASSERT followed by a crash), seems be the most -debuggable thing to do in this situation. At least for VS8, we have decided to stick with this shape. - ---- - -Now consider the impact of cl /analyze. We want cl /analyze to not warn about our potential dereferences when they refer to member variables -whose state was previously validated by another method. But we do want to see the impact of function contracts on the parameters of the -function. - -So we've done a broad replace of all the member-related ATLASSERT to ATLASSUME. - -*/ - -#ifndef ATLASSUME -#define ATLASSUME(expr) do { ATLASSERT(expr); __analysis_assume(!!(expr)); } while(0) -#endif // ATLASSERT - -#ifndef ATLVERIFY -#ifdef _DEBUG -#define ATLVERIFY(expr) ATLASSERT(expr) -#else -#define ATLVERIFY(expr) (expr) -#endif // DEBUG -#endif // ATLVERIFY - -#ifndef ATLENSURE_THROW -#define ATLENSURE_THROW(expr, hr) \ -do { \ - int __atl_condVal=!!(expr); \ - ATLASSERT(__atl_condVal); \ - if(!(__atl_condVal)) AtlThrow(hr); \ -} while (0) -#endif // ATLENSURE - -#ifndef ATLENSURE -#define ATLENSURE(expr) ATLENSURE_THROW(expr, E_FAIL) -#endif // ATLENSURE - -#ifndef ATLENSURE_SUCCEEDED -#define ATLENSURE_SUCCEEDED(hr) ATLENSURE_THROW(SUCCEEDED(hr), hr) -#endif // ATLENSURE - -/* Used inside COM methods that do not want to throw */ -#ifndef ATLENSURE_RETURN_HR -#define ATLENSURE_RETURN_HR(expr, hr) \ -do { \ - int __atl_condVal=!!(expr); \ - ATLASSERT(__atl_condVal); \ - if(!(__atl_condVal)) return hr; \ -} while (0) -#endif - -/* Used inside COM methods that do not want to throw */ -#ifndef ATLENSURE_RETURN -#define ATLENSURE_RETURN(expr) ATLENSURE_RETURN_HR(expr, E_FAIL) -#endif - -/* generic version that returns 2nd expr if 1st is false; no implication of HRESULT */ -#ifndef ATLENSURE_RETURN_VAL -#define ATLENSURE_RETURN_VAL ATLENSURE_RETURN_HR -#endif - -#if defined(_SECURE_ATL) -#error Do not define _SECURE_ATL. -#undef _SECURE_ATL -#endif -#define _SECURE_ATL 1 - -#if _SECURE_ATL - -#ifndef ATL_CRT_ERRORCHECK -#define ATL_CRT_ERRORCHECK(expr) AtlCrtErrorCheck(expr) -#endif // ATL_CRT_ERRORCHECK - -#ifndef ATL_CRT_ERRORCHECK_SPRINTF -#define ATL_CRT_ERRORCHECK_SPRINTF(expr) \ -do { \ - errno_t _saveErrno = errno; \ - errno = 0; \ - (expr); \ - if(0 != errno) \ - { \ - AtlCrtErrorCheck(errno); \ - } \ - else \ - { \ - errno = _saveErrno; \ - } \ -} while (0) -#endif // ATL_CRT_ERRORCHECK_SPRINTF - -#else // !_SECURE_ATL - -#define ATL_CRT_ERRORCHECK(expr) do { expr; } while (0) -#define ATL_CRT_ERRORCHECK_SPRINTF(expr) do { expr; } while (0) - -#endif // _SECURE_ATL - -/////////////////////////////////////////////////////////////////////////////// -// __declspec(novtable) is used on a class declaration to prevent the vtable -// pointer from being initialized in the constructor and destructor for the -// class. This has many benefits because the linker can now eliminate the -// vtable and all the functions pointed to by the vtable. Also, the actual -// constructor and destructor code are now smaller. -/////////////////////////////////////////////////////////////////////////////// -// This should only be used on a class that is not directly createable but is -// rather only used as a base class. Additionally, the constructor and -// destructor (if provided by the user) should not call anything that may cause -// a virtual function call to occur back on the object. -/////////////////////////////////////////////////////////////////////////////// -// By default, the wizards will generate new ATL object classes with this -// attribute (through the ATL_NO_VTABLE macro). This is normally safe as long -// the restriction mentioned above is followed. It is always safe to remove -// this macro from your class, so if in doubt, remove it. -/////////////////////////////////////////////////////////////////////////////// - -#ifdef _ATL_DISABLE_NO_VTABLE -#define ATL_NO_VTABLE -#else -#define ATL_NO_VTABLE __declspec(novtable) -#endif - -#ifdef _ATL_DISABLE_NOTHROW -#define ATL_NOTHROW -#else -#define ATL_NOTHROW __declspec(nothrow) -#endif - -#ifdef _ATL_DISABLE_FORCEINLINE -#define ATL_FORCEINLINE -#else -#define ATL_FORCEINLINE __forceinline -#endif - -#ifdef _ATL_DISABLE_NOINLINE -#define ATL_NOINLINE -#else -#define ATL_NOINLINE __declspec( noinline ) -#endif - -#if defined(_ATL_DISABLE_DEPRECATED) || (defined(_PREFAST_) && (_MSC_VER < 1400)) -#define ATL_DEPRECATED(_Message) -#else -#define ATL_DEPRECATED(_Message) __declspec( deprecated(_Message) ) -#endif - -// If ATL80.DLL is being used then _ATL_STATIC_REGISTRY doesn't really make sense -#ifdef _ATL_DLL -#undef _ATL_STATIC_REGISTRY -#else -// If not linking to ATL80.DLL, use the static registrar and not building atl.dll -#ifndef _ATL_DLL_IMPL -#ifndef _ATL_STATIC_REGISTRY -#define _ATL_STATIC_REGISTRY -#endif -#endif -#endif - -#ifdef _ATL_DEBUG_REFCOUNT -#ifndef _ATL_DEBUG_INTERFACES -#define _ATL_DEBUG_INTERFACES -#endif -#endif - -#ifdef _DEBUG -#ifndef _ATL_DEBUG -#define _ATL_DEBUG -#endif // _ATL_DEBUG -#endif // _DEBUG - -#ifdef _ATL_DEBUG_INTERFACES -#ifndef _ATL_DEBUG -#define _ATL_DEBUG -#endif // _ATL_DEBUG -#endif // _ATL_DEBUG_INTERFACES - -#ifndef _ATL_HEAPFLAGS -#ifdef _MALLOC_ZEROINIT -#define _ATL_HEAPFLAGS HEAP_ZERO_MEMORY -#else -#define _ATL_HEAPFLAGS 0 -#endif -#endif - -#ifndef _ATL_PACKING -#define _ATL_PACKING 8 -#endif - -#if defined(_ATL_DLL) - #define ATLAPI extern "C" HRESULT __declspec(dllimport) __stdcall - #define ATLAPI_(x) extern "C" __declspec(dllimport) x __stdcall - #define ATLINLINE - #define ATLAPIINL extern "C" inline HRESULT __stdcall - #define ATLAPIINL_(x) extern "C" inline x __stdcall -#elif defined(_ATL_DLL_IMPL) - #define ATLAPI extern "C" inline HRESULT __stdcall - #define ATLAPI_(x) extern "C" inline x __stdcall - #define ATLAPIINL ATLAPI - #define ATLAPIINL_(x) ATLAPI_(x) - #define ATLINLINE -#else - #define ATLAPI __declspec(nothrow) HRESULT __stdcall - #define ATLAPI_(x) __declspec(nothrow) x __stdcall - #define ATLAPIINL ATLAPI - #define ATLAPIINL_(x) ATLAPI_(x) - #define ATLINLINE inline -#endif - -#ifdef _ATL_NO_EXCEPTIONS - #ifdef _AFX - #error MFC projects cannot define _ATL_NO_EXCEPTIONS - #endif -#else - #ifndef _CPPUNWIND - #define _ATL_NO_EXCEPTIONS - #endif -#endif - -#ifdef _CPPUNWIND - -#ifndef ATLTRYALLOC - -#ifdef _AFX -#define ATLTRYALLOC(x) try{x;} catch(CException* e){e->Delete();} -#else -/* prefast noise VSW 489981 */ -#define ATLTRYALLOC(x) __pragma(warning(push)) __pragma(warning(disable: 4571)) try{x;} catch(...) {} __pragma(warning(pop)) -#endif //__AFX - -#endif //ATLTRYALLOC - -// If you define _ATLTRY before including this file, then -// you should define _ATLCATCH and _ATLRETHROW as well. -#ifndef _ATLTRY -#define _ATLTRY try -#ifdef _AFX -#define _ATLCATCH( e ) catch( CException* e ) -#else -#define _ATLCATCH( e ) catch( CAtlException e ) -#endif - -#define _ATLCATCHALL() __pragma(warning(push)) __pragma(warning(disable: 4571)) catch( ... ) __pragma(warning(pop)) - -#ifdef _AFX -#define _ATLDELETEEXCEPTION(e) e->Delete(); -#else -#define _ATLDELETEEXCEPTION(e) e; -#endif - -#define _ATLRETHROW throw -#endif // _ATLTRY - -/* -COM functions should not throw. Which means we should protect their callers from C++ exceptions leaking out. These macros -can help with that, though they have not yet been applied to the whole of ATL, which uses a variety of patterns to achieve -this end -*/ - -#ifndef _ATL_COM_BEGIN -#define _ATL_COM_BEGIN \ - HRESULT __hrAtlComMethod=S_OK; \ - try \ - { -#endif - -#ifdef _AFX -/* Nice to do something more complex here in future to translate an MFC exception to a better HR */ -#define _AFX_COM_END_PART \ - catch(CException *e) \ - { \ - if(e) \ - { \ - e->Delete(); \ - } \ - __hrAtlComMethod=E_FAIL; \ - } -#else -#define _AFX_COM_END_PART \ - catch(CAtlException e) \ - { \ - __hrAtlComMethod=e.m_hr; \ - } -#endif - -#ifndef _ATL_COM_END -#define _ATL_COM_END \ - _AFX_COM_END_PART \ - catch(...) \ - { \ - __hrAtlComMethod=E_FAIL; \ - } \ - return hr; -#endif - - - -#else //_CPPUNWIND - -#ifndef ATLTRYALLOC -#define ATLTRYALLOC(x) x; -#endif //ATLTRYALLOC - -// if _ATLTRY is defined before including this file then -// _ATLCATCH and _ATLRETHROW should be defined as well. -#ifndef _ATLTRY -#define _ATLTRY -#define _ATLCATCH( e ) __pragma(warning(push)) __pragma(warning(disable: 4127)) if( false ) __pragma(warning(pop)) -#define _ATLCATCHALL() __pragma(warning(push)) __pragma(warning(disable: 4127)) if( false ) __pragma(warning(pop)) -#define _ATLDELETEEXCEPTION(e) -#define _ATLRETHROW -#endif // _ATLTRY - -#endif //_CPPUNWIND - -#ifndef ATLTRY -#define ATLTRY(x) ATLTRYALLOC(x) -#endif //ATLTRY - -#define offsetofclass(base, derived) ((DWORD_PTR)(static_cast((derived*)_ATL_PACKING))-_ATL_PACKING) - -///////////////////////////////////////////////////////////////////////////// -// Master version numbers - -#define _ATL 1 // Active Template Library -#define _ATL_VER 0x0800 // Active Template Library version 8.00 - -///////////////////////////////////////////////////////////////////////////// -// Threading - -#ifndef _ATL_SINGLE_THREADED -#ifndef _ATL_APARTMENT_THREADED -#ifndef _ATL_FREE_THREADED -#define _ATL_FREE_THREADED -#endif -#endif -#endif - -// UUIDOF -#ifndef _ATL_NO_UUIDOF -#define _ATL_IIDOF(x) __uuidof(x) -#else -#define _ATL_IIDOF(x) IID_##x -#endif - -// Lean and mean -#ifndef ATL_NO_LEAN_AND_MEAN -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#ifndef NOMCX -#define NOMCX -#endif -#endif // ATL_NO_LEAN_AND_MEAN - -#ifdef NOSERVICE -#ifndef _ATL_NO_SERVICE -#define _ATL_NO_SERVICE -#endif // _ATL_NO_SERVICE -#else -#ifdef _ATL_NO_SERVICE -#ifndef NOSERVICE -#define NOSERVICE -#endif // NOSERVICE -#endif // _ATL_NO_SERVICE -#endif // NOSERVICE - -#include -#ifdef _DEBUG -#include -#endif -#ifndef _ATL_NO_DEBUG_CRT -// Warning: if you define the above symbol, you will have -// to provide your own definition of the ATLASSERT(x) macro -// in order to compile ATL - #include -#endif - -#endif // RC_INVOKED - -#define ATLAXWIN_CLASS "AtlAxWin80" -#define ATLAXWINLIC_CLASS "AtlAxWinLic80" - -// _ATL_INSECURE_DEPRECATE define -#ifndef _ATL_INSECURE_DEPRECATE -#if defined(_ATL_SECURE_NO_DEPRECATE) || (defined(_PREFAST_) && (_MSC_VER < 1400)) -#define _ATL_INSECURE_DEPRECATE(_Message) -#else -#define _ATL_INSECURE_DEPRECATE(_Message) __declspec(deprecated(_Message)) -#endif // _ATL_SECURE_NO_DEPRECATE -#endif // _ATL_INSECURE_DEPRECATE - -/* -This is called when something really bad happens -- so bad -that we consider it dangerous to even throw an exception -*/ -#ifndef _ATL_FATAL_SHUTDOWN -#define _ATL_FATAL_SHUTDOWN do { ::TerminateProcess(::GetCurrentProcess(), 0); } while(0); -#endif - -//ATL/MFC code should use standard pointer to member standard syntax &MyClass::MyMethod, instead -//of the legacy non-standard syntax - MyMethod. -#ifdef _ATL_ENABLE_PTM_WARNING -#define PTM_WARNING_DISABLE -#define PTM_WARNING_RESTORE -#else -#define PTM_WARNING_DISABLE \ - __pragma(warning( push )) \ - __pragma(warning( disable : 4867 )) -#define PTM_WARNING_RESTORE \ - __pragma(warning( pop )) -#endif //_ATL_ENABLE_PTM_WARNING - -/* we have to define our own versions of MAKEINTRESOURCE and IS_INTRESOURCE to - * fix warning 6268. At least until those macros are not cleanend in PSDK. - Same comes true for those definitions of constants which use the above macros -*/ -#define ATL_MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i)))) -#define ATL_MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i)))) -#ifdef UNICODE -#define ATL_MAKEINTRESOURCE ATL_MAKEINTRESOURCEW -#else -#define ATL_MAKEINTRESOURCE ATL_MAKEINTRESOURCEA -#endif // !UNICODE -#define ATL_IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0) - -/* - * Predefined Resource Types - */ -#define ATL_RT_CURSOR ATL_MAKEINTRESOURCE(1) -#define ATL_RT_BITMAP ATL_MAKEINTRESOURCE(2) -#define ATL_RT_ICON ATL_MAKEINTRESOURCE(3) -#define ATL_RT_MENU ATL_MAKEINTRESOURCE(4) -#define ATL_RT_DIALOG ATL_MAKEINTRESOURCE(5) -#define ATL_RT_STRING ATL_MAKEINTRESOURCE(6) -#define ATL_RT_FONTDIR ATL_MAKEINTRESOURCE(7) -#define ATL_RT_FONT ATL_MAKEINTRESOURCE(8) -#define ATL_RT_ACCELERATOR ATL_MAKEINTRESOURCE(9) -#define ATL_RT_RCDATA ATL_MAKEINTRESOURCE(10) -#define ATL_RT_MESSAGETABLE ATL_MAKEINTRESOURCE(11) - -#define ATL_DIFFERENCE 11 -#define ATL_RT_GROUP_CURSOR ATL_MAKEINTRESOURCE((ULONG_PTR)ATL_RT_CURSOR + ATL_DIFFERENCE) -#define ATL_RT_GROUP_ICON ATL_MAKEINTRESOURCE((ULONG_PTR)ATL_RT_ICON + ATL_DIFFERENCE) -#define ATL_RT_VERSION ATL_MAKEINTRESOURCE(16) -#define ATL_RT_DLGINCLUDE ATL_MAKEINTRESOURCE(17) -#if(WINVER >= 0x0400) -#define ATL_RT_PLUGPLAY ATL_MAKEINTRESOURCE(19) -#define ATL_RT_VXD ATL_MAKEINTRESOURCE(20) -#define ATL_RT_ANICURSOR ATL_MAKEINTRESOURCE(21) -#define ATL_RT_ANIICON ATL_MAKEINTRESOURCE(22) -#endif /* WINVER >= 0x0400 */ -#define ATL_RT_HTML ATL_MAKEINTRESOURCE(23) -#ifdef RC_INVOKED -#define ATL_RT_MANIFEST 24 -#define ATL_CREATEPROCESS_MANIFEST_RESOURCE_ID 1 -#define ATL_ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2 -#define ATL_ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3 -#define ATL_MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1 /* inclusive */ -#define ATL_MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16 /* inclusive */ -#else /* RC_INVOKED */ -#define ATL_RT_MANIFEST ATL_MAKEINTRESOURCE(24) -#define ATL_CREATEPROCESS_MANIFEST_RESOURCE_ID ATL_MAKEINTRESOURCE( 1) -#define ATL_ISOLATIONAWARE_MANIFEST_RESOURCE_ID ATL_MAKEINTRESOURCE(2) -#define ATL_ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID ATL_MAKEINTRESOURCE(3) -#define ATL_MINIMUM_RESERVED_MANIFEST_RESOURCE_ID ATL_MAKEINTRESOURCE( 1 /*inclusive*/) -#define ATL_MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID ATL_MAKEINTRESOURCE(16 /*inclusive*/) -#endif /* RC_INVOKED */ - -/* sal.h stuff that is not in the current LKG */ -#ifndef __out_ecount_part_z -#define __out_ecount_part_z(size,length) __out_ecount_part(size,length) __post __nullterminated -#endif - -#ifndef __out_ecount_part_z_opt -#define __out_ecount_part_z_opt(size,length) __out_ecount_part_opt(size,length) __post __nullterminated -#endif - -#ifndef __deref_opt_out_z -#define __deref_opt_out_z __deref_opt_out __post __deref __nullterminated -#endif - -#ifndef __out_bcount_part_z -#define __out_bcount_part_z(size,length) __out_bcount_part(size,length) __post __nullterminated -#endif - -#endif // __ATLDEF_H__ - -///////////////////////////////////////////////////////////////////////////// - diff --git a/cpp/jacob/include/atlexcept.h b/cpp/jacob/include/atlexcept.h deleted file mode 100644 index 119208b..0000000 --- a/cpp/jacob/include/atlexcept.h +++ /dev/null @@ -1,123 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLEXCEPT_H__ -#define __ATLEXCEPT_H__ - -#pragma once - -#include -#include - - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ - -///////////////////////////////////////////////////////////////////////////// -// Exception raise (for functions that cannot return an error code) - -inline void __declspec(noreturn) _AtlRaiseException( DWORD dwExceptionCode, DWORD dwExceptionFlags = EXCEPTION_NONCONTINUABLE ) -{ - RaiseException( dwExceptionCode, dwExceptionFlags, 0, NULL ); -} - -class CAtlException -{ -public: - CAtlException() throw() : - m_hr( E_FAIL ) - { - } - - CAtlException( HRESULT hr ) throw() : - m_hr( hr ) - { - } - - operator HRESULT() const throw() - { - return( m_hr ); - } - -public: - HRESULT m_hr; -}; - -#ifndef _ATL_NO_EXCEPTIONS - -// Throw a CAtlException with the given HRESULT -#if defined( _ATL_CUSTOM_THROW ) // You can define your own AtlThrow to throw a custom exception. -#ifdef _AFX -#error MFC projects must use default implementation of AtlThrow() -#endif -#else -ATL_NOINLINE __declspec(noreturn) inline void WINAPI AtlThrowImpl( HRESULT hr ) -{ - ATLTRACE(atlTraceException, 0, _T("AtlThrow: hr = 0x%x\n"), hr ); -#ifdef _AFX - if( hr == E_OUTOFMEMORY ) - { - AfxThrowMemoryException(); - } - else - { - AfxThrowOleException( hr ); - } -#else - throw CAtlException( hr ); -#endif -}; -#endif - -// Throw a CAtlException corresponding to the result of ::GetLastError -ATL_NOINLINE __declspec(noreturn) inline void WINAPI AtlThrowLastWin32() -{ - DWORD dwError = ::GetLastError(); - AtlThrow( HRESULT_FROM_WIN32( dwError ) ); -} - -#else // no exception handling - -// Throw a CAtlException with the given HRESULT -#if !defined( _ATL_CUSTOM_THROW ) // You can define your own AtlThrow - -ATL_NOINLINE inline void WINAPI AtlThrowImpl( HRESULT hr ) -{ - ATLTRACE(atlTraceException, 0, _T("AtlThrow: hr = 0x%x\n"), hr ); - ATLASSERT( false ); - DWORD dwExceptionCode; - switch(hr) - { - case E_OUTOFMEMORY: - dwExceptionCode = DWORD(STATUS_NO_MEMORY); - break; - default: - dwExceptionCode = DWORD(EXCEPTION_ILLEGAL_INSTRUCTION); - break; - } - _AtlRaiseException(dwExceptionCode); -} -#endif - -// Throw a CAtlException corresponding to the result of ::GetLastError -ATL_NOINLINE inline void WINAPI AtlThrowLastWin32() -{ - DWORD dwError = ::GetLastError(); - AtlThrow( HRESULT_FROM_WIN32( dwError ) ); -} - -#endif // no exception handling - -}; // namespace ATL -#pragma pack(pop) - -#endif // __ATLEXCEPT_H__ - diff --git a/cpp/jacob/include/atliface.h b/cpp/jacob/include/atliface.h deleted file mode 100644 index 3736c90..0000000 --- a/cpp/jacob/include/atliface.h +++ /dev/null @@ -1,2956 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#pragma warning( disable: 4049 ) /* more than 64k source lines */ - -/* this ALWAYS GENERATED file contains the definitions for the interfaces */ - - - /* File created by MIDL compiler version 6.00.0342 */ -/* at Mon Feb 12 21:31:09 2001 - */ -/* Compiler settings for atliface.idl: - Oicf, W1, Zp8, env=Win32 (32b run) - protocol : dce , ms_ext, c_ext - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: - __declspec(uuid()), __declspec(selectany), __declspec(novtable) - DECLSPEC_UUID(), MIDL_INTERFACE() -*/ -//@@MIDL_FILE_HEADING( ) - - -/* verify that the version is high enough to compile this file*/ -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 440 -#endif - -#include "rpc.h" -#include "rpcndr.h" - -#ifndef __RPCNDR_H_VERSION__ -#error this stub requires an updated version of -#endif // __RPCNDR_H_VERSION__ - -#ifndef COM_NO_WINDOWS_H -#include "windows.h" -#include "ole2.h" -#endif /*COM_NO_WINDOWS_H*/ - -#ifndef __atliface_h__ -#define __atliface_h__ - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -#pragma once -#endif - -/* Forward Declarations */ - -#ifndef __IRegistrarBase_FWD_DEFINED__ -#define __IRegistrarBase_FWD_DEFINED__ -typedef interface IRegistrarBase IRegistrarBase; -#endif /* __IRegistrarBase_FWD_DEFINED__ */ - - -#ifndef __IRegistrar_FWD_DEFINED__ -#define __IRegistrar_FWD_DEFINED__ -typedef interface IRegistrar IRegistrar; -#endif /* __IRegistrar_FWD_DEFINED__ */ - - -#ifndef __IDocHostUIHandlerDispatch_FWD_DEFINED__ -#define __IDocHostUIHandlerDispatch_FWD_DEFINED__ -typedef interface IDocHostUIHandlerDispatch IDocHostUIHandlerDispatch; -#endif /* __IDocHostUIHandlerDispatch_FWD_DEFINED__ */ - - -#ifndef __IAxWinHostWindow_FWD_DEFINED__ -#define __IAxWinHostWindow_FWD_DEFINED__ -typedef interface IAxWinHostWindow IAxWinHostWindow; -#endif /* __IAxWinHostWindow_FWD_DEFINED__ */ - - -#ifndef __IAxWinHostWindowLic_FWD_DEFINED__ -#define __IAxWinHostWindowLic_FWD_DEFINED__ -typedef interface IAxWinHostWindowLic IAxWinHostWindowLic; -#endif /* __IAxWinHostWindowLic_FWD_DEFINED__ */ - - -#ifndef __IAxWinAmbientDispatch_FWD_DEFINED__ -#define __IAxWinAmbientDispatch_FWD_DEFINED__ -typedef interface IAxWinAmbientDispatch IAxWinAmbientDispatch; -#endif /* __IAxWinAmbientDispatch_FWD_DEFINED__ */ - - -#ifndef __IAxWinAmbientDispatchEx_FWD_DEFINED__ -#define __IAxWinAmbientDispatchEx_FWD_DEFINED__ -typedef interface IAxWinAmbientDispatchEx IAxWinAmbientDispatchEx; -#endif /* __IAxWinAmbientDispatchEx_FWD_DEFINED__ */ - - -#ifndef __IInternalConnection_FWD_DEFINED__ -#define __IInternalConnection_FWD_DEFINED__ -typedef interface IInternalConnection IInternalConnection; -#endif /* __IInternalConnection_FWD_DEFINED__ */ - - -#ifndef __IAccessibleProxy_FWD_DEFINED__ -#define __IAccessibleProxy_FWD_DEFINED__ -typedef interface IAccessibleProxy IAccessibleProxy; -#endif /* __IAccessibleProxy_FWD_DEFINED__ */ - - -#ifndef __IAccessibleServer_FWD_DEFINED__ -#define __IAccessibleServer_FWD_DEFINED__ -typedef interface IAccessibleServer IAccessibleServer; -#endif /* __IAccessibleServer_FWD_DEFINED__ */ - - -/* header files for imported files */ -#include "oaidl.h" -#include "ocidl.h" -#include "oleacc.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void * __RPC_USER MIDL_user_allocate(size_t size); -void __RPC_USER MIDL_user_free(__inout void * ); - -/* interface __MIDL_itf_atliface_0000 */ -/* [local] */ - -EXTERN_C const CLSID CLSID_Registrar; - - -extern RPC_IF_HANDLE __MIDL_itf_atliface_0000_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_atliface_0000_v0_0_s_ifspec; - -#ifndef __IRegistrarBase_INTERFACE_DEFINED__ -#define __IRegistrarBase_INTERFACE_DEFINED__ - -/* interface IRegistrarBase */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IRegistrarBase; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("e21f8a85-b05d-4243-8183-c7cb405588f7") - IRegistrarBase : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE AddReplacement( - /* [in] */ LPCOLESTR key, - /* [in] */ LPCOLESTR item) = 0; - - virtual HRESULT STDMETHODCALLTYPE ClearReplacements( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IRegistrarBaseVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IRegistrarBase * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IRegistrarBase * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IRegistrarBase * This); - - HRESULT ( STDMETHODCALLTYPE *AddReplacement )( - IRegistrarBase * This, - /* [in] */ LPCOLESTR key, - /* [in] */ LPCOLESTR item); - - HRESULT ( STDMETHODCALLTYPE *ClearReplacements )( - IRegistrarBase * This); - - END_INTERFACE - } IRegistrarBaseVtbl; - - interface IRegistrarBase - { - CONST_VTBL struct IRegistrarBaseVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IRegistrarBase_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IRegistrarBase_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IRegistrarBase_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IRegistrarBase_AddReplacement(This,key,item) \ - (This)->lpVtbl -> AddReplacement(This,key,item) - -#define IRegistrarBase_ClearReplacements(This) \ - (This)->lpVtbl -> ClearReplacements(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IRegistrarBase_AddReplacement_Proxy( - IRegistrarBase * This, - /* [in] */ LPCOLESTR key, - /* [in] */ LPCOLESTR item); - - -void __RPC_STUB IRegistrarBase_AddReplacement_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegistrarBase_ClearReplacements_Proxy( - IRegistrarBase * This); - - -void __RPC_STUB IRegistrarBase_ClearReplacements_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IRegistrarBase_INTERFACE_DEFINED__ */ - - -#ifndef __IRegistrar_INTERFACE_DEFINED__ -#define __IRegistrar_INTERFACE_DEFINED__ - -/* interface IRegistrar */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IRegistrar; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("44EC053B-400F-11D0-9DCD-00A0C90391D3") - IRegistrar : public IRegistrarBase - { - public: - virtual HRESULT STDMETHODCALLTYPE ResourceRegisterSz( - /* [in] */ LPCOLESTR resFileName, - /* [in] */ LPCOLESTR szID, - /* [in] */ LPCOLESTR szType) = 0; - - virtual HRESULT STDMETHODCALLTYPE ResourceUnregisterSz( - /* [in] */ LPCOLESTR resFileName, - /* [in] */ LPCOLESTR szID, - /* [in] */ LPCOLESTR szType) = 0; - - virtual HRESULT STDMETHODCALLTYPE FileRegister( - /* [in] */ LPCOLESTR fileName) = 0; - - virtual HRESULT STDMETHODCALLTYPE FileUnregister( - /* [in] */ LPCOLESTR fileName) = 0; - - virtual HRESULT STDMETHODCALLTYPE StringRegister( - /* [in] */ LPCOLESTR data) = 0; - - virtual HRESULT STDMETHODCALLTYPE StringUnregister( - /* [in] */ LPCOLESTR data) = 0; - - virtual HRESULT STDMETHODCALLTYPE ResourceRegister( - /* [in] */ LPCOLESTR resFileName, - /* [in] */ UINT nID, - /* [in] */ LPCOLESTR szType) = 0; - - virtual HRESULT STDMETHODCALLTYPE ResourceUnregister( - /* [in] */ LPCOLESTR resFileName, - /* [in] */ UINT nID, - /* [in] */ LPCOLESTR szType) = 0; - - }; - -#else /* C style interface */ - - typedef struct IRegistrarVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IRegistrar * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IRegistrar * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IRegistrar * This); - - HRESULT ( STDMETHODCALLTYPE *AddReplacement )( - IRegistrar * This, - /* [in] */ LPCOLESTR key, - /* [in] */ LPCOLESTR item); - - HRESULT ( STDMETHODCALLTYPE *ClearReplacements )( - IRegistrar * This); - - HRESULT ( STDMETHODCALLTYPE *ResourceRegisterSz )( - IRegistrar * This, - /* [in] */ LPCOLESTR resFileName, - /* [in] */ LPCOLESTR szID, - /* [in] */ LPCOLESTR szType); - - HRESULT ( STDMETHODCALLTYPE *ResourceUnregisterSz )( - IRegistrar * This, - /* [in] */ LPCOLESTR resFileName, - /* [in] */ LPCOLESTR szID, - /* [in] */ LPCOLESTR szType); - - HRESULT ( STDMETHODCALLTYPE *FileRegister )( - IRegistrar * This, - /* [in] */ LPCOLESTR fileName); - - HRESULT ( STDMETHODCALLTYPE *FileUnregister )( - IRegistrar * This, - /* [in] */ LPCOLESTR fileName); - - HRESULT ( STDMETHODCALLTYPE *StringRegister )( - IRegistrar * This, - /* [in] */ LPCOLESTR data); - - HRESULT ( STDMETHODCALLTYPE *StringUnregister )( - IRegistrar * This, - /* [in] */ LPCOLESTR data); - - HRESULT ( STDMETHODCALLTYPE *ResourceRegister )( - IRegistrar * This, - /* [in] */ LPCOLESTR resFileName, - /* [in] */ UINT nID, - /* [in] */ LPCOLESTR szType); - - HRESULT ( STDMETHODCALLTYPE *ResourceUnregister )( - IRegistrar * This, - /* [in] */ LPCOLESTR resFileName, - /* [in] */ UINT nID, - /* [in] */ LPCOLESTR szType); - - END_INTERFACE - } IRegistrarVtbl; - - interface IRegistrar - { - CONST_VTBL struct IRegistrarVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IRegistrar_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IRegistrar_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IRegistrar_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IRegistrar_AddReplacement(This,key,item) \ - (This)->lpVtbl -> AddReplacement(This,key,item) - -#define IRegistrar_ClearReplacements(This) \ - (This)->lpVtbl -> ClearReplacements(This) - - -#define IRegistrar_ResourceRegisterSz(This,resFileName,szID,szType) \ - (This)->lpVtbl -> ResourceRegisterSz(This,resFileName,szID,szType) - -#define IRegistrar_ResourceUnregisterSz(This,resFileName,szID,szType) \ - (This)->lpVtbl -> ResourceUnregisterSz(This,resFileName,szID,szType) - -#define IRegistrar_FileRegister(This,fileName) \ - (This)->lpVtbl -> FileRegister(This,fileName) - -#define IRegistrar_FileUnregister(This,fileName) \ - (This)->lpVtbl -> FileUnregister(This,fileName) - -#define IRegistrar_StringRegister(This,data) \ - (This)->lpVtbl -> StringRegister(This,data) - -#define IRegistrar_StringUnregister(This,data) \ - (This)->lpVtbl -> StringUnregister(This,data) - -#define IRegistrar_ResourceRegister(This,resFileName,nID,szType) \ - (This)->lpVtbl -> ResourceRegister(This,resFileName,nID,szType) - -#define IRegistrar_ResourceUnregister(This,resFileName,nID,szType) \ - (This)->lpVtbl -> ResourceUnregister(This,resFileName,nID,szType) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IRegistrar_ResourceRegisterSz_Proxy( - IRegistrar * This, - /* [in] */ LPCOLESTR resFileName, - /* [in] */ LPCOLESTR szID, - /* [in] */ LPCOLESTR szType); - - -void __RPC_STUB IRegistrar_ResourceRegisterSz_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegistrar_ResourceUnregisterSz_Proxy( - IRegistrar * This, - /* [in] */ LPCOLESTR resFileName, - /* [in] */ LPCOLESTR szID, - /* [in] */ LPCOLESTR szType); - - -void __RPC_STUB IRegistrar_ResourceUnregisterSz_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegistrar_FileRegister_Proxy( - IRegistrar * This, - /* [in] */ LPCOLESTR fileName); - - -void __RPC_STUB IRegistrar_FileRegister_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegistrar_FileUnregister_Proxy( - IRegistrar * This, - /* [in] */ LPCOLESTR fileName); - - -void __RPC_STUB IRegistrar_FileUnregister_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegistrar_StringRegister_Proxy( - IRegistrar * This, - /* [in] */ LPCOLESTR data); - - -void __RPC_STUB IRegistrar_StringRegister_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegistrar_StringUnregister_Proxy( - IRegistrar * This, - /* [in] */ LPCOLESTR data); - - -void __RPC_STUB IRegistrar_StringUnregister_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegistrar_ResourceRegister_Proxy( - IRegistrar * This, - /* [in] */ LPCOLESTR resFileName, - /* [in] */ UINT nID, - /* [in] */ LPCOLESTR szType); - - -void __RPC_STUB IRegistrar_ResourceRegister_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IRegistrar_ResourceUnregister_Proxy( - IRegistrar * This, - /* [in] */ LPCOLESTR resFileName, - /* [in] */ UINT nID, - /* [in] */ LPCOLESTR szType); - - -void __RPC_STUB IRegistrar_ResourceUnregister_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IRegistrar_INTERFACE_DEFINED__ */ - - -#ifndef __IDocHostUIHandlerDispatch_INTERFACE_DEFINED__ -#define __IDocHostUIHandlerDispatch_INTERFACE_DEFINED__ - -/* interface IDocHostUIHandlerDispatch */ -/* [object][unique][helpstring][uuid][local] */ - -typedef -enum tagDOCHOSTUIDBLCLKDispatch - { docHostUIDblClkDEFAULT = 0, - docHostUIDblClkSHOWPROPERTIES = 1, - docHostUIDblClkSHOWCODE = 2 - } DOCHOSTUIDBLCLKDispatch; - -typedef -enum tagDocHostUIFlagDispatch - { docHostUIFlagDIALOG = 1, - docHostUIFlagDISABLE_HELP_MENU = 2, - docHostUIFlagNO3DBORDER = 4, - docHostUIFlagSCROLL_NO = 8, - docHostUIFlagDISABLE_SCRIPT_INACTIVE = 16, - docHostUIFlagOPENNEWWIN = 32, - docHostUIFlagDISABLE_OFFSCREEN = 64, - docHostUIFlagFLAT_SCROLLBAR = 128, - docHostUIFlagDIV_BLOCKDEFAULT = 256, - docHostUIFlagACTIVATE_CLIENTHIT_ONLY = 512 - } DocHostUIFlagDispatch; - - -EXTERN_C const IID IID_IDocHostUIHandlerDispatch; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("425B5AF0-65F1-11d1-9611-0000F81E0D0D") - IDocHostUIHandlerDispatch : public IDispatch - { - public: - virtual HRESULT STDMETHODCALLTYPE ShowContextMenu( - /* [in] */ DWORD dwID, - /* [in] */ DWORD x, - /* [in] */ DWORD y, - /* [in] */ IUnknown *pcmdtReserved, - /* [in] */ IDispatch *pdispReserved, - /* [retval][out] */ HRESULT *dwRetVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHostInfo( - /* [out][in] */ DWORD *pdwFlags, - /* [out][in] */ DWORD *pdwDoubleClick) = 0; - - virtual HRESULT STDMETHODCALLTYPE ShowUI( - /* [in] */ DWORD dwID, - /* [in] */ IUnknown *pActiveObject, - /* [in] */ IUnknown *pCommandTarget, - /* [in] */ IUnknown *pFrame, - /* [in] */ IUnknown *pDoc, - /* [retval][out] */ HRESULT *dwRetVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE HideUI( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE UpdateUI( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnableModeless( - /* [in] */ VARIANT_BOOL fEnable) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate( - /* [in] */ VARIANT_BOOL fActivate) = 0; - - virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate( - /* [in] */ VARIANT_BOOL fActivate) = 0; - - virtual HRESULT STDMETHODCALLTYPE ResizeBorder( - /* [in] */ long left, - /* [in] */ long top, - /* [in] */ long right, - /* [in] */ long bottom, - /* [in] */ IUnknown *pUIWindow, - /* [in] */ VARIANT_BOOL fFrameWindow) = 0; - - virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( - /* [in] */ DWORD_PTR hWnd, - /* [in] */ DWORD nMessage, - /* [in] */ DWORD_PTR wParam, - /* [in] */ DWORD_PTR lParam, - /* [in] */ BSTR bstrGuidCmdGroup, - /* [in] */ DWORD nCmdID, - /* [retval][out] */ HRESULT *dwRetVal) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath( - /* [out] */ BSTR *pbstrKey, - /* [in] */ DWORD dw) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetDropTarget( - /* [in] */ IUnknown *pDropTarget, - /* [out] */ IUnknown **ppDropTarget) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetExternal( - /* [out] */ IDispatch **ppDispatch) = 0; - - virtual HRESULT STDMETHODCALLTYPE TranslateUrl( - /* [in] */ DWORD dwTranslate, - /* [in] */ BSTR bstrURLIn, - /* [out] */ BSTR *pbstrURLOut) = 0; - - virtual HRESULT STDMETHODCALLTYPE FilterDataObject( - /* [in] */ IUnknown *pDO, - /* [out] */ IUnknown **ppDORet) = 0; - - }; - -#else /* C style interface */ - - typedef struct IDocHostUIHandlerDispatchVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IDocHostUIHandlerDispatch * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IDocHostUIHandlerDispatch * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IDocHostUIHandlerDispatch * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IDocHostUIHandlerDispatch * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IDocHostUIHandlerDispatch * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IDocHostUIHandlerDispatch * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IDocHostUIHandlerDispatch * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - HRESULT ( STDMETHODCALLTYPE *ShowContextMenu )( - IDocHostUIHandlerDispatch * This, - /* [in] */ DWORD dwID, - /* [in] */ DWORD x, - /* [in] */ DWORD y, - /* [in] */ IUnknown *pcmdtReserved, - /* [in] */ IDispatch *pdispReserved, - /* [retval][out] */ HRESULT *dwRetVal); - - HRESULT ( STDMETHODCALLTYPE *GetHostInfo )( - IDocHostUIHandlerDispatch * This, - /* [out][in] */ DWORD *pdwFlags, - /* [out][in] */ DWORD *pdwDoubleClick); - - HRESULT ( STDMETHODCALLTYPE *ShowUI )( - IDocHostUIHandlerDispatch * This, - /* [in] */ DWORD dwID, - /* [in] */ IUnknown *pActiveObject, - /* [in] */ IUnknown *pCommandTarget, - /* [in] */ IUnknown *pFrame, - /* [in] */ IUnknown *pDoc, - /* [retval][out] */ HRESULT *dwRetVal); - - HRESULT ( STDMETHODCALLTYPE *HideUI )( - IDocHostUIHandlerDispatch * This); - - HRESULT ( STDMETHODCALLTYPE *UpdateUI )( - IDocHostUIHandlerDispatch * This); - - HRESULT ( STDMETHODCALLTYPE *EnableModeless )( - IDocHostUIHandlerDispatch * This, - /* [in] */ VARIANT_BOOL fEnable); - - HRESULT ( STDMETHODCALLTYPE *OnDocWindowActivate )( - IDocHostUIHandlerDispatch * This, - /* [in] */ VARIANT_BOOL fActivate); - - HRESULT ( STDMETHODCALLTYPE *OnFrameWindowActivate )( - IDocHostUIHandlerDispatch * This, - /* [in] */ VARIANT_BOOL fActivate); - - HRESULT ( STDMETHODCALLTYPE *ResizeBorder )( - IDocHostUIHandlerDispatch * This, - /* [in] */ long left, - /* [in] */ long top, - /* [in] */ long right, - /* [in] */ long bottom, - /* [in] */ IUnknown *pUIWindow, - /* [in] */ VARIANT_BOOL fFrameWindow); - - HRESULT ( STDMETHODCALLTYPE *TranslateAccelerator )( - IDocHostUIHandlerDispatch * This, - /* [in] */ DWORD_PTR hWnd, - /* [in] */ DWORD nMessage, - /* [in] */ DWORD_PTR wParam, - /* [in] */ DWORD_PTR lParam, - /* [in] */ BSTR bstrGuidCmdGroup, - /* [in] */ DWORD nCmdID, - /* [retval][out] */ HRESULT *dwRetVal); - - HRESULT ( STDMETHODCALLTYPE *GetOptionKeyPath )( - IDocHostUIHandlerDispatch * This, - /* [out] */ BSTR *pbstrKey, - /* [in] */ DWORD dw); - - HRESULT ( STDMETHODCALLTYPE *GetDropTarget )( - IDocHostUIHandlerDispatch * This, - /* [in] */ IUnknown *pDropTarget, - /* [out] */ IUnknown **ppDropTarget); - - HRESULT ( STDMETHODCALLTYPE *GetExternal )( - IDocHostUIHandlerDispatch * This, - /* [out] */ IDispatch **ppDispatch); - - HRESULT ( STDMETHODCALLTYPE *TranslateUrl )( - IDocHostUIHandlerDispatch * This, - /* [in] */ DWORD dwTranslate, - /* [in] */ BSTR bstrURLIn, - /* [out] */ BSTR *pbstrURLOut); - - HRESULT ( STDMETHODCALLTYPE *FilterDataObject )( - IDocHostUIHandlerDispatch * This, - /* [in] */ IUnknown *pDO, - /* [out] */ IUnknown **ppDORet); - - END_INTERFACE - } IDocHostUIHandlerDispatchVtbl; - - interface IDocHostUIHandlerDispatch - { - CONST_VTBL struct IDocHostUIHandlerDispatchVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IDocHostUIHandlerDispatch_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IDocHostUIHandlerDispatch_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IDocHostUIHandlerDispatch_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IDocHostUIHandlerDispatch_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IDocHostUIHandlerDispatch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IDocHostUIHandlerDispatch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IDocHostUIHandlerDispatch_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IDocHostUIHandlerDispatch_ShowContextMenu(This,dwID,x,y,pcmdtReserved,pdispReserved,dwRetVal) \ - (This)->lpVtbl -> ShowContextMenu(This,dwID,x,y,pcmdtReserved,pdispReserved,dwRetVal) - -#define IDocHostUIHandlerDispatch_GetHostInfo(This,pdwFlags,pdwDoubleClick) \ - (This)->lpVtbl -> GetHostInfo(This,pdwFlags,pdwDoubleClick) - -#define IDocHostUIHandlerDispatch_ShowUI(This,dwID,pActiveObject,pCommandTarget,pFrame,pDoc,dwRetVal) \ - (This)->lpVtbl -> ShowUI(This,dwID,pActiveObject,pCommandTarget,pFrame,pDoc,dwRetVal) - -#define IDocHostUIHandlerDispatch_HideUI(This) \ - (This)->lpVtbl -> HideUI(This) - -#define IDocHostUIHandlerDispatch_UpdateUI(This) \ - (This)->lpVtbl -> UpdateUI(This) - -#define IDocHostUIHandlerDispatch_EnableModeless(This,fEnable) \ - (This)->lpVtbl -> EnableModeless(This,fEnable) - -#define IDocHostUIHandlerDispatch_OnDocWindowActivate(This,fActivate) \ - (This)->lpVtbl -> OnDocWindowActivate(This,fActivate) - -#define IDocHostUIHandlerDispatch_OnFrameWindowActivate(This,fActivate) \ - (This)->lpVtbl -> OnFrameWindowActivate(This,fActivate) - -#define IDocHostUIHandlerDispatch_ResizeBorder(This,left,top,right,bottom,pUIWindow,fFrameWindow) \ - (This)->lpVtbl -> ResizeBorder(This,left,top,right,bottom,pUIWindow,fFrameWindow) - -#define IDocHostUIHandlerDispatch_TranslateAccelerator(This,hWnd,nMessage,wParam,lParam,bstrGuidCmdGroup,nCmdID,dwRetVal) \ - (This)->lpVtbl -> TranslateAccelerator(This,hWnd,nMessage,wParam,lParam,bstrGuidCmdGroup,nCmdID,dwRetVal) - -#define IDocHostUIHandlerDispatch_GetOptionKeyPath(This,pbstrKey,dw) \ - (This)->lpVtbl -> GetOptionKeyPath(This,pbstrKey,dw) - -#define IDocHostUIHandlerDispatch_GetDropTarget(This,pDropTarget,ppDropTarget) \ - (This)->lpVtbl -> GetDropTarget(This,pDropTarget,ppDropTarget) - -#define IDocHostUIHandlerDispatch_GetExternal(This,ppDispatch) \ - (This)->lpVtbl -> GetExternal(This,ppDispatch) - -#define IDocHostUIHandlerDispatch_TranslateUrl(This,dwTranslate,bstrURLIn,pbstrURLOut) \ - (This)->lpVtbl -> TranslateUrl(This,dwTranslate,bstrURLIn,pbstrURLOut) - -#define IDocHostUIHandlerDispatch_FilterDataObject(This,pDO,ppDORet) \ - (This)->lpVtbl -> FilterDataObject(This,pDO,ppDORet) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_ShowContextMenu_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ DWORD dwID, - /* [in] */ DWORD x, - /* [in] */ DWORD y, - /* [in] */ IUnknown *pcmdtReserved, - /* [in] */ IDispatch *pdispReserved, - /* [retval][out] */ HRESULT *dwRetVal); - - -void __RPC_STUB IDocHostUIHandlerDispatch_ShowContextMenu_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_GetHostInfo_Proxy( - IDocHostUIHandlerDispatch * This, - /* [out][in] */ DWORD *pdwFlags, - /* [out][in] */ DWORD *pdwDoubleClick); - - -void __RPC_STUB IDocHostUIHandlerDispatch_GetHostInfo_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_ShowUI_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ DWORD dwID, - /* [in] */ IUnknown *pActiveObject, - /* [in] */ IUnknown *pCommandTarget, - /* [in] */ IUnknown *pFrame, - /* [in] */ IUnknown *pDoc, - /* [retval][out] */ HRESULT *dwRetVal); - - -void __RPC_STUB IDocHostUIHandlerDispatch_ShowUI_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_HideUI_Proxy( - IDocHostUIHandlerDispatch * This); - - -void __RPC_STUB IDocHostUIHandlerDispatch_HideUI_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_UpdateUI_Proxy( - IDocHostUIHandlerDispatch * This); - - -void __RPC_STUB IDocHostUIHandlerDispatch_UpdateUI_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_EnableModeless_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ VARIANT_BOOL fEnable); - - -void __RPC_STUB IDocHostUIHandlerDispatch_EnableModeless_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_OnDocWindowActivate_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ VARIANT_BOOL fActivate); - - -void __RPC_STUB IDocHostUIHandlerDispatch_OnDocWindowActivate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_OnFrameWindowActivate_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ VARIANT_BOOL fActivate); - - -void __RPC_STUB IDocHostUIHandlerDispatch_OnFrameWindowActivate_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_ResizeBorder_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ long left, - /* [in] */ long top, - /* [in] */ long right, - /* [in] */ long bottom, - /* [in] */ IUnknown *pUIWindow, - /* [in] */ VARIANT_BOOL fFrameWindow); - - -void __RPC_STUB IDocHostUIHandlerDispatch_ResizeBorder_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_TranslateAccelerator_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ DWORD_PTR hWnd, - /* [in] */ DWORD nMessage, - /* [in] */ DWORD_PTR wParam, - /* [in] */ DWORD_PTR lParam, - /* [in] */ BSTR bstrGuidCmdGroup, - /* [in] */ DWORD nCmdID, - /* [retval][out] */ HRESULT *dwRetVal); - - -void __RPC_STUB IDocHostUIHandlerDispatch_TranslateAccelerator_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_GetOptionKeyPath_Proxy( - IDocHostUIHandlerDispatch * This, - /* [out] */ BSTR *pbstrKey, - /* [in] */ DWORD dw); - - -void __RPC_STUB IDocHostUIHandlerDispatch_GetOptionKeyPath_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_GetDropTarget_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ IUnknown *pDropTarget, - /* [out] */ IUnknown **ppDropTarget); - - -void __RPC_STUB IDocHostUIHandlerDispatch_GetDropTarget_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_GetExternal_Proxy( - IDocHostUIHandlerDispatch * This, - /* [out] */ IDispatch **ppDispatch); - - -void __RPC_STUB IDocHostUIHandlerDispatch_GetExternal_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_TranslateUrl_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ DWORD dwTranslate, - /* [in] */ BSTR bstrURLIn, - /* [out] */ BSTR *pbstrURLOut); - - -void __RPC_STUB IDocHostUIHandlerDispatch_TranslateUrl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IDocHostUIHandlerDispatch_FilterDataObject_Proxy( - IDocHostUIHandlerDispatch * This, - /* [in] */ IUnknown *pDO, - /* [out] */ IUnknown **ppDORet); - - -void __RPC_STUB IDocHostUIHandlerDispatch_FilterDataObject_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IDocHostUIHandlerDispatch_INTERFACE_DEFINED__ */ - - -#ifndef __IAxWinHostWindow_INTERFACE_DEFINED__ -#define __IAxWinHostWindow_INTERFACE_DEFINED__ - -/* interface IAxWinHostWindow */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_IAxWinHostWindow; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B6EA2050-048A-11d1-82B9-00C04FB9942E") - IAxWinHostWindow : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE CreateControl( - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateControlEx( - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [out] */ IUnknown **ppUnk, - /* [in] */ REFIID riidAdvise, - /* [in] */ IUnknown *punkAdvise) = 0; - - virtual HRESULT STDMETHODCALLTYPE AttachControl( - /* [in] */ IUnknown *pUnkControl, - /* [in] */ HWND hWnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryControl( - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetExternalDispatch( - /* [in] */ IDispatch *pDisp) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetExternalUIHandler( - /* [in] */ IDocHostUIHandlerDispatch *pDisp) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAxWinHostWindowVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAxWinHostWindow * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAxWinHostWindow * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAxWinHostWindow * This); - - HRESULT ( STDMETHODCALLTYPE *CreateControl )( - IAxWinHostWindow * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream); - - HRESULT ( STDMETHODCALLTYPE *CreateControlEx )( - IAxWinHostWindow * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [out] */ IUnknown **ppUnk, - /* [in] */ REFIID riidAdvise, - /* [in] */ IUnknown *punkAdvise); - - HRESULT ( STDMETHODCALLTYPE *AttachControl )( - IAxWinHostWindow * This, - /* [in] */ IUnknown *pUnkControl, - /* [in] */ HWND hWnd); - - HRESULT ( STDMETHODCALLTYPE *QueryControl )( - IAxWinHostWindow * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - HRESULT ( STDMETHODCALLTYPE *SetExternalDispatch )( - IAxWinHostWindow * This, - /* [in] */ IDispatch *pDisp); - - HRESULT ( STDMETHODCALLTYPE *SetExternalUIHandler )( - IAxWinHostWindow * This, - /* [in] */ IDocHostUIHandlerDispatch *pDisp); - - END_INTERFACE - } IAxWinHostWindowVtbl; - - interface IAxWinHostWindow - { - CONST_VTBL struct IAxWinHostWindowVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAxWinHostWindow_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAxWinHostWindow_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAxWinHostWindow_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAxWinHostWindow_CreateControl(This,lpTricsData,hWnd,pStream) \ - (This)->lpVtbl -> CreateControl(This,lpTricsData,hWnd,pStream) - -#define IAxWinHostWindow_CreateControlEx(This,lpTricsData,hWnd,pStream,ppUnk,riidAdvise,punkAdvise) \ - (This)->lpVtbl -> CreateControlEx(This,lpTricsData,hWnd,pStream,ppUnk,riidAdvise,punkAdvise) - -#define IAxWinHostWindow_AttachControl(This,pUnkControl,hWnd) \ - (This)->lpVtbl -> AttachControl(This,pUnkControl,hWnd) - -#define IAxWinHostWindow_QueryControl(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryControl(This,riid,ppvObject) - -#define IAxWinHostWindow_SetExternalDispatch(This,pDisp) \ - (This)->lpVtbl -> SetExternalDispatch(This,pDisp) - -#define IAxWinHostWindow_SetExternalUIHandler(This,pDisp) \ - (This)->lpVtbl -> SetExternalUIHandler(This,pDisp) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAxWinHostWindow_CreateControl_Proxy( - IAxWinHostWindow * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream); - - -void __RPC_STUB IAxWinHostWindow_CreateControl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAxWinHostWindow_CreateControlEx_Proxy( - IAxWinHostWindow * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [out] */ IUnknown **ppUnk, - /* [in] */ REFIID riidAdvise, - /* [in] */ IUnknown *punkAdvise); - - -void __RPC_STUB IAxWinHostWindow_CreateControlEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAxWinHostWindow_AttachControl_Proxy( - IAxWinHostWindow * This, - /* [in] */ IUnknown *pUnkControl, - /* [in] */ HWND hWnd); - - -void __RPC_STUB IAxWinHostWindow_AttachControl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAxWinHostWindow_QueryControl_Proxy( - IAxWinHostWindow * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - -void __RPC_STUB IAxWinHostWindow_QueryControl_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAxWinHostWindow_SetExternalDispatch_Proxy( - IAxWinHostWindow * This, - /* [in] */ IDispatch *pDisp); - - -void __RPC_STUB IAxWinHostWindow_SetExternalDispatch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAxWinHostWindow_SetExternalUIHandler_Proxy( - IAxWinHostWindow * This, - /* [in] */ IDocHostUIHandlerDispatch *pDisp); - - -void __RPC_STUB IAxWinHostWindow_SetExternalUIHandler_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAxWinHostWindow_INTERFACE_DEFINED__ */ - - -#ifndef __IAxWinHostWindowLic_INTERFACE_DEFINED__ -#define __IAxWinHostWindowLic_INTERFACE_DEFINED__ - -/* interface IAxWinHostWindowLic */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_IAxWinHostWindowLic; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3935BDA8-4ED9-495c-8650-E01FC1E38A4B") - IAxWinHostWindowLic : public IAxWinHostWindow - { - public: - virtual HRESULT STDMETHODCALLTYPE CreateControlLic( - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [in] */ BSTR bstrLic) = 0; - - virtual HRESULT STDMETHODCALLTYPE CreateControlLicEx( - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [out] */ IUnknown **ppUnk, - /* [in] */ REFIID riidAdvise, - /* [in] */ IUnknown *punkAdvise, - /* [in] */ BSTR bstrLic) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAxWinHostWindowLicVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAxWinHostWindowLic * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAxWinHostWindowLic * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAxWinHostWindowLic * This); - - HRESULT ( STDMETHODCALLTYPE *CreateControl )( - IAxWinHostWindowLic * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream); - - HRESULT ( STDMETHODCALLTYPE *CreateControlEx )( - IAxWinHostWindowLic * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [out] */ IUnknown **ppUnk, - /* [in] */ REFIID riidAdvise, - /* [in] */ IUnknown *punkAdvise); - - HRESULT ( STDMETHODCALLTYPE *AttachControl )( - IAxWinHostWindowLic * This, - /* [in] */ IUnknown *pUnkControl, - /* [in] */ HWND hWnd); - - HRESULT ( STDMETHODCALLTYPE *QueryControl )( - IAxWinHostWindowLic * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - HRESULT ( STDMETHODCALLTYPE *SetExternalDispatch )( - IAxWinHostWindowLic * This, - /* [in] */ IDispatch *pDisp); - - HRESULT ( STDMETHODCALLTYPE *SetExternalUIHandler )( - IAxWinHostWindowLic * This, - /* [in] */ IDocHostUIHandlerDispatch *pDisp); - - HRESULT ( STDMETHODCALLTYPE *CreateControlLic )( - IAxWinHostWindowLic * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [in] */ BSTR bstrLic); - - HRESULT ( STDMETHODCALLTYPE *CreateControlLicEx )( - IAxWinHostWindowLic * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [out] */ IUnknown **ppUnk, - /* [in] */ REFIID riidAdvise, - /* [in] */ IUnknown *punkAdvise, - /* [in] */ BSTR bstrLic); - - END_INTERFACE - } IAxWinHostWindowLicVtbl; - - interface IAxWinHostWindowLic - { - CONST_VTBL struct IAxWinHostWindowLicVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAxWinHostWindowLic_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAxWinHostWindowLic_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAxWinHostWindowLic_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAxWinHostWindowLic_CreateControl(This,lpTricsData,hWnd,pStream) \ - (This)->lpVtbl -> CreateControl(This,lpTricsData,hWnd,pStream) - -#define IAxWinHostWindowLic_CreateControlEx(This,lpTricsData,hWnd,pStream,ppUnk,riidAdvise,punkAdvise) \ - (This)->lpVtbl -> CreateControlEx(This,lpTricsData,hWnd,pStream,ppUnk,riidAdvise,punkAdvise) - -#define IAxWinHostWindowLic_AttachControl(This,pUnkControl,hWnd) \ - (This)->lpVtbl -> AttachControl(This,pUnkControl,hWnd) - -#define IAxWinHostWindowLic_QueryControl(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryControl(This,riid,ppvObject) - -#define IAxWinHostWindowLic_SetExternalDispatch(This,pDisp) \ - (This)->lpVtbl -> SetExternalDispatch(This,pDisp) - -#define IAxWinHostWindowLic_SetExternalUIHandler(This,pDisp) \ - (This)->lpVtbl -> SetExternalUIHandler(This,pDisp) - - -#define IAxWinHostWindowLic_CreateControlLic(This,lpTricsData,hWnd,pStream,bstrLic) \ - (This)->lpVtbl -> CreateControlLic(This,lpTricsData,hWnd,pStream,bstrLic) - -#define IAxWinHostWindowLic_CreateControlLicEx(This,lpTricsData,hWnd,pStream,ppUnk,riidAdvise,punkAdvise,bstrLic) \ - (This)->lpVtbl -> CreateControlLicEx(This,lpTricsData,hWnd,pStream,ppUnk,riidAdvise,punkAdvise,bstrLic) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAxWinHostWindowLic_CreateControlLic_Proxy( - IAxWinHostWindowLic * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [in] */ BSTR bstrLic); - - -void __RPC_STUB IAxWinHostWindowLic_CreateControlLic_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAxWinHostWindowLic_CreateControlLicEx_Proxy( - IAxWinHostWindowLic * This, - /* [in] */ LPCOLESTR lpTricsData, - /* [in] */ HWND hWnd, - /* [in] */ IStream *pStream, - /* [out] */ IUnknown **ppUnk, - /* [in] */ REFIID riidAdvise, - /* [in] */ IUnknown *punkAdvise, - /* [in] */ BSTR bstrLic); - - -void __RPC_STUB IAxWinHostWindowLic_CreateControlLicEx_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAxWinHostWindowLic_INTERFACE_DEFINED__ */ - - -#ifndef __IAxWinAmbientDispatch_INTERFACE_DEFINED__ -#define __IAxWinAmbientDispatch_INTERFACE_DEFINED__ - -/* interface IAxWinAmbientDispatch */ -/* [unique][helpstring][uuid][dual][object] */ - - -EXTERN_C const IID IID_IAxWinAmbientDispatch; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B6EA2051-048A-11d1-82B9-00C04FB9942E") - IAxWinAmbientDispatch : public IDispatch - { - public: - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_AllowWindowlessActivation( - /* [in] */ VARIANT_BOOL bCanWindowlessActivate) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_AllowWindowlessActivation( - /* [retval][out] */ VARIANT_BOOL *pbCanWindowlessActivate) = 0; - - virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_BackColor( - /* [in] */ OLE_COLOR clrBackground) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_BackColor( - /* [retval][out] */ OLE_COLOR *pclrBackground) = 0; - - virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_ForeColor( - /* [in] */ OLE_COLOR clrForeground) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ForeColor( - /* [retval][out] */ OLE_COLOR *pclrForeground) = 0; - - virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_LocaleID( - /* [in] */ LCID lcidLocaleID) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_LocaleID( - /* [retval][out] */ LCID *plcidLocaleID) = 0; - - virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_UserMode( - /* [in] */ VARIANT_BOOL bUserMode) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_UserMode( - /* [retval][out] */ VARIANT_BOOL *pbUserMode) = 0; - - virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_DisplayAsDefault( - /* [in] */ VARIANT_BOOL bDisplayAsDefault) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_DisplayAsDefault( - /* [retval][out] */ VARIANT_BOOL *pbDisplayAsDefault) = 0; - - virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Font( - /* [in] */ IFontDisp *pFont) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Font( - /* [retval][out] */ IFontDisp **pFont) = 0; - - virtual /* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_MessageReflect( - /* [in] */ VARIANT_BOOL bMsgReflect) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_MessageReflect( - /* [retval][out] */ VARIANT_BOOL *pbMsgReflect) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ShowGrabHandles( - /* [retval][out] */ VARIANT_BOOL *pbShowGrabHandles) = 0; - - virtual /* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_ShowHatching( - /* [retval][out] */ VARIANT_BOOL *pbShowHatching) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_DocHostFlags( - /* [in] */ DWORD dwDocHostFlags) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_DocHostFlags( - /* [retval][out] */ DWORD *pdwDocHostFlags) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_DocHostDoubleClickFlags( - /* [in] */ DWORD dwDocHostDoubleClickFlags) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_DocHostDoubleClickFlags( - /* [retval][out] */ DWORD *pdwDocHostDoubleClickFlags) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_AllowContextMenu( - /* [in] */ VARIANT_BOOL bAllowContextMenu) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_AllowContextMenu( - /* [retval][out] */ VARIANT_BOOL *pbAllowContextMenu) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_AllowShowUI( - /* [in] */ VARIANT_BOOL bAllowShowUI) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_AllowShowUI( - /* [retval][out] */ VARIANT_BOOL *pbAllowShowUI) = 0; - - virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_OptionKeyPath( - /* [in] */ BSTR bstrOptionKeyPath) = 0; - - virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_OptionKeyPath( - /* [retval][out] */ BSTR *pbstrOptionKeyPath) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAxWinAmbientDispatchVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAxWinAmbientDispatch * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAxWinAmbientDispatch * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAxWinAmbientDispatch * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IAxWinAmbientDispatch * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IAxWinAmbientDispatch * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IAxWinAmbientDispatch * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IAxWinAmbientDispatch * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AllowWindowlessActivation )( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bCanWindowlessActivate); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AllowWindowlessActivation )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbCanWindowlessActivate); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_BackColor )( - IAxWinAmbientDispatch * This, - /* [in] */ OLE_COLOR clrBackground); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackColor )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ OLE_COLOR *pclrBackground); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ForeColor )( - IAxWinAmbientDispatch * This, - /* [in] */ OLE_COLOR clrForeground); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ForeColor )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ OLE_COLOR *pclrForeground); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LocaleID )( - IAxWinAmbientDispatch * This, - /* [in] */ LCID lcidLocaleID); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LocaleID )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ LCID *plcidLocaleID); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UserMode )( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bUserMode); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UserMode )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbUserMode); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DisplayAsDefault )( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bDisplayAsDefault); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DisplayAsDefault )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbDisplayAsDefault); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Font )( - IAxWinAmbientDispatch * This, - /* [in] */ IFontDisp *pFont); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Font )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ IFontDisp **pFont); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MessageReflect )( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bMsgReflect); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MessageReflect )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbMsgReflect); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ShowGrabHandles )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbShowGrabHandles); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ShowHatching )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbShowHatching); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DocHostFlags )( - IAxWinAmbientDispatch * This, - /* [in] */ DWORD dwDocHostFlags); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DocHostFlags )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ DWORD *pdwDocHostFlags); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DocHostDoubleClickFlags )( - IAxWinAmbientDispatch * This, - /* [in] */ DWORD dwDocHostDoubleClickFlags); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DocHostDoubleClickFlags )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ DWORD *pdwDocHostDoubleClickFlags); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AllowContextMenu )( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bAllowContextMenu); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AllowContextMenu )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbAllowContextMenu); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AllowShowUI )( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bAllowShowUI); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AllowShowUI )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbAllowShowUI); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OptionKeyPath )( - IAxWinAmbientDispatch * This, - /* [in] */ BSTR bstrOptionKeyPath); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OptionKeyPath )( - IAxWinAmbientDispatch * This, - /* [retval][out] */ BSTR *pbstrOptionKeyPath); - - END_INTERFACE - } IAxWinAmbientDispatchVtbl; - - interface IAxWinAmbientDispatch - { - CONST_VTBL struct IAxWinAmbientDispatchVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAxWinAmbientDispatch_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAxWinAmbientDispatch_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAxWinAmbientDispatch_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAxWinAmbientDispatch_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IAxWinAmbientDispatch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IAxWinAmbientDispatch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IAxWinAmbientDispatch_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IAxWinAmbientDispatch_put_AllowWindowlessActivation(This,bCanWindowlessActivate) \ - (This)->lpVtbl -> put_AllowWindowlessActivation(This,bCanWindowlessActivate) - -#define IAxWinAmbientDispatch_get_AllowWindowlessActivation(This,pbCanWindowlessActivate) \ - (This)->lpVtbl -> get_AllowWindowlessActivation(This,pbCanWindowlessActivate) - -#define IAxWinAmbientDispatch_put_BackColor(This,clrBackground) \ - (This)->lpVtbl -> put_BackColor(This,clrBackground) - -#define IAxWinAmbientDispatch_get_BackColor(This,pclrBackground) \ - (This)->lpVtbl -> get_BackColor(This,pclrBackground) - -#define IAxWinAmbientDispatch_put_ForeColor(This,clrForeground) \ - (This)->lpVtbl -> put_ForeColor(This,clrForeground) - -#define IAxWinAmbientDispatch_get_ForeColor(This,pclrForeground) \ - (This)->lpVtbl -> get_ForeColor(This,pclrForeground) - -#define IAxWinAmbientDispatch_put_LocaleID(This,lcidLocaleID) \ - (This)->lpVtbl -> put_LocaleID(This,lcidLocaleID) - -#define IAxWinAmbientDispatch_get_LocaleID(This,plcidLocaleID) \ - (This)->lpVtbl -> get_LocaleID(This,plcidLocaleID) - -#define IAxWinAmbientDispatch_put_UserMode(This,bUserMode) \ - (This)->lpVtbl -> put_UserMode(This,bUserMode) - -#define IAxWinAmbientDispatch_get_UserMode(This,pbUserMode) \ - (This)->lpVtbl -> get_UserMode(This,pbUserMode) - -#define IAxWinAmbientDispatch_put_DisplayAsDefault(This,bDisplayAsDefault) \ - (This)->lpVtbl -> put_DisplayAsDefault(This,bDisplayAsDefault) - -#define IAxWinAmbientDispatch_get_DisplayAsDefault(This,pbDisplayAsDefault) \ - (This)->lpVtbl -> get_DisplayAsDefault(This,pbDisplayAsDefault) - -#define IAxWinAmbientDispatch_put_Font(This,pFont) \ - (This)->lpVtbl -> put_Font(This,pFont) - -#define IAxWinAmbientDispatch_get_Font(This,pFont) \ - (This)->lpVtbl -> get_Font(This,pFont) - -#define IAxWinAmbientDispatch_put_MessageReflect(This,bMsgReflect) \ - (This)->lpVtbl -> put_MessageReflect(This,bMsgReflect) - -#define IAxWinAmbientDispatch_get_MessageReflect(This,pbMsgReflect) \ - (This)->lpVtbl -> get_MessageReflect(This,pbMsgReflect) - -#define IAxWinAmbientDispatch_get_ShowGrabHandles(This,pbShowGrabHandles) \ - (This)->lpVtbl -> get_ShowGrabHandles(This,pbShowGrabHandles) - -#define IAxWinAmbientDispatch_get_ShowHatching(This,pbShowHatching) \ - (This)->lpVtbl -> get_ShowHatching(This,pbShowHatching) - -#define IAxWinAmbientDispatch_put_DocHostFlags(This,dwDocHostFlags) \ - (This)->lpVtbl -> put_DocHostFlags(This,dwDocHostFlags) - -#define IAxWinAmbientDispatch_get_DocHostFlags(This,pdwDocHostFlags) \ - (This)->lpVtbl -> get_DocHostFlags(This,pdwDocHostFlags) - -#define IAxWinAmbientDispatch_put_DocHostDoubleClickFlags(This,dwDocHostDoubleClickFlags) \ - (This)->lpVtbl -> put_DocHostDoubleClickFlags(This,dwDocHostDoubleClickFlags) - -#define IAxWinAmbientDispatch_get_DocHostDoubleClickFlags(This,pdwDocHostDoubleClickFlags) \ - (This)->lpVtbl -> get_DocHostDoubleClickFlags(This,pdwDocHostDoubleClickFlags) - -#define IAxWinAmbientDispatch_put_AllowContextMenu(This,bAllowContextMenu) \ - (This)->lpVtbl -> put_AllowContextMenu(This,bAllowContextMenu) - -#define IAxWinAmbientDispatch_get_AllowContextMenu(This,pbAllowContextMenu) \ - (This)->lpVtbl -> get_AllowContextMenu(This,pbAllowContextMenu) - -#define IAxWinAmbientDispatch_put_AllowShowUI(This,bAllowShowUI) \ - (This)->lpVtbl -> put_AllowShowUI(This,bAllowShowUI) - -#define IAxWinAmbientDispatch_get_AllowShowUI(This,pbAllowShowUI) \ - (This)->lpVtbl -> get_AllowShowUI(This,pbAllowShowUI) - -#define IAxWinAmbientDispatch_put_OptionKeyPath(This,bstrOptionKeyPath) \ - (This)->lpVtbl -> put_OptionKeyPath(This,bstrOptionKeyPath) - -#define IAxWinAmbientDispatch_get_OptionKeyPath(This,pbstrOptionKeyPath) \ - (This)->lpVtbl -> get_OptionKeyPath(This,pbstrOptionKeyPath) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_AllowWindowlessActivation_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bCanWindowlessActivate); - - -void __RPC_STUB IAxWinAmbientDispatch_put_AllowWindowlessActivation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_AllowWindowlessActivation_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbCanWindowlessActivate); - - -void __RPC_STUB IAxWinAmbientDispatch_get_AllowWindowlessActivation_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_BackColor_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ OLE_COLOR clrBackground); - - -void __RPC_STUB IAxWinAmbientDispatch_put_BackColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_BackColor_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ OLE_COLOR *pclrBackground); - - -void __RPC_STUB IAxWinAmbientDispatch_get_BackColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_ForeColor_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ OLE_COLOR clrForeground); - - -void __RPC_STUB IAxWinAmbientDispatch_put_ForeColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_ForeColor_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ OLE_COLOR *pclrForeground); - - -void __RPC_STUB IAxWinAmbientDispatch_get_ForeColor_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_LocaleID_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ LCID lcidLocaleID); - - -void __RPC_STUB IAxWinAmbientDispatch_put_LocaleID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_LocaleID_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ LCID *plcidLocaleID); - - -void __RPC_STUB IAxWinAmbientDispatch_get_LocaleID_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_UserMode_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bUserMode); - - -void __RPC_STUB IAxWinAmbientDispatch_put_UserMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_UserMode_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbUserMode); - - -void __RPC_STUB IAxWinAmbientDispatch_get_UserMode_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_DisplayAsDefault_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bDisplayAsDefault); - - -void __RPC_STUB IAxWinAmbientDispatch_put_DisplayAsDefault_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_DisplayAsDefault_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbDisplayAsDefault); - - -void __RPC_STUB IAxWinAmbientDispatch_get_DisplayAsDefault_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_Font_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ IFontDisp *pFont); - - -void __RPC_STUB IAxWinAmbientDispatch_put_Font_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_Font_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ IFontDisp **pFont); - - -void __RPC_STUB IAxWinAmbientDispatch_get_Font_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_MessageReflect_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bMsgReflect); - - -void __RPC_STUB IAxWinAmbientDispatch_put_MessageReflect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_MessageReflect_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbMsgReflect); - - -void __RPC_STUB IAxWinAmbientDispatch_get_MessageReflect_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_ShowGrabHandles_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbShowGrabHandles); - - -void __RPC_STUB IAxWinAmbientDispatch_get_ShowGrabHandles_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [id][helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_ShowHatching_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbShowHatching); - - -void __RPC_STUB IAxWinAmbientDispatch_get_ShowHatching_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_DocHostFlags_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ DWORD dwDocHostFlags); - - -void __RPC_STUB IAxWinAmbientDispatch_put_DocHostFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_DocHostFlags_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ DWORD *pdwDocHostFlags); - - -void __RPC_STUB IAxWinAmbientDispatch_get_DocHostFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_DocHostDoubleClickFlags_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ DWORD dwDocHostDoubleClickFlags); - - -void __RPC_STUB IAxWinAmbientDispatch_put_DocHostDoubleClickFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_DocHostDoubleClickFlags_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ DWORD *pdwDocHostDoubleClickFlags); - - -void __RPC_STUB IAxWinAmbientDispatch_get_DocHostDoubleClickFlags_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_AllowContextMenu_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bAllowContextMenu); - - -void __RPC_STUB IAxWinAmbientDispatch_put_AllowContextMenu_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_AllowContextMenu_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbAllowContextMenu); - - -void __RPC_STUB IAxWinAmbientDispatch_get_AllowContextMenu_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_AllowShowUI_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ VARIANT_BOOL bAllowShowUI); - - -void __RPC_STUB IAxWinAmbientDispatch_put_AllowShowUI_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_AllowShowUI_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ VARIANT_BOOL *pbAllowShowUI); - - -void __RPC_STUB IAxWinAmbientDispatch_get_AllowShowUI_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_put_OptionKeyPath_Proxy( - IAxWinAmbientDispatch * This, - /* [in] */ BSTR bstrOptionKeyPath); - - -void __RPC_STUB IAxWinAmbientDispatch_put_OptionKeyPath_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatch_get_OptionKeyPath_Proxy( - IAxWinAmbientDispatch * This, - /* [retval][out] */ BSTR *pbstrOptionKeyPath); - - -void __RPC_STUB IAxWinAmbientDispatch_get_OptionKeyPath_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAxWinAmbientDispatch_INTERFACE_DEFINED__ */ - - -#ifndef __IAxWinAmbientDispatchEx_INTERFACE_DEFINED__ -#define __IAxWinAmbientDispatchEx_INTERFACE_DEFINED__ - -/* interface IAxWinAmbientDispatchEx */ -/* [unique][helpstring][uuid][dual][object] */ - - -EXTERN_C const IID IID_IAxWinAmbientDispatchEx; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("B2D0778B-AC99-4c58-A5C8-E7724E5316B5") - IAxWinAmbientDispatchEx : public IAxWinAmbientDispatch - { - public: - virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetAmbientDispatch( - /* [in] */ IDispatch *pDispatch) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAxWinAmbientDispatchExVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAxWinAmbientDispatchEx * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAxWinAmbientDispatchEx * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAxWinAmbientDispatchEx * This); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( - IAxWinAmbientDispatchEx * This, - /* [out] */ UINT *pctinfo); - - HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( - IAxWinAmbientDispatchEx * This, - /* [in] */ UINT iTInfo, - /* [in] */ LCID lcid, - /* [out] */ ITypeInfo **ppTInfo); - - HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( - IAxWinAmbientDispatchEx * This, - /* [in] */ REFIID riid, - /* [size_is][in] */ LPOLESTR *rgszNames, - /* [in] */ UINT cNames, - /* [in] */ LCID lcid, - /* [size_is][out] */ DISPID *rgDispId); - - /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( - IAxWinAmbientDispatchEx * This, - /* [in] */ DISPID dispIdMember, - /* [in] */ REFIID riid, - /* [in] */ LCID lcid, - /* [in] */ WORD wFlags, - /* [out][in] */ DISPPARAMS *pDispParams, - /* [out] */ VARIANT *pVarResult, - /* [out] */ EXCEPINFO *pExcepInfo, - /* [out] */ UINT *puArgErr); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AllowWindowlessActivation )( - IAxWinAmbientDispatchEx * This, - /* [in] */ VARIANT_BOOL bCanWindowlessActivate); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AllowWindowlessActivation )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ VARIANT_BOOL *pbCanWindowlessActivate); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_BackColor )( - IAxWinAmbientDispatchEx * This, - /* [in] */ OLE_COLOR clrBackground); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_BackColor )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ OLE_COLOR *pclrBackground); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_ForeColor )( - IAxWinAmbientDispatchEx * This, - /* [in] */ OLE_COLOR clrForeground); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ForeColor )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ OLE_COLOR *pclrForeground); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_LocaleID )( - IAxWinAmbientDispatchEx * This, - /* [in] */ LCID lcidLocaleID); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_LocaleID )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ LCID *plcidLocaleID); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_UserMode )( - IAxWinAmbientDispatchEx * This, - /* [in] */ VARIANT_BOOL bUserMode); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_UserMode )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ VARIANT_BOOL *pbUserMode); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DisplayAsDefault )( - IAxWinAmbientDispatchEx * This, - /* [in] */ VARIANT_BOOL bDisplayAsDefault); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DisplayAsDefault )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ VARIANT_BOOL *pbDisplayAsDefault); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Font )( - IAxWinAmbientDispatchEx * This, - /* [in] */ IFontDisp *pFont); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_Font )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ IFontDisp **pFont); - - /* [id][helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_MessageReflect )( - IAxWinAmbientDispatchEx * This, - /* [in] */ VARIANT_BOOL bMsgReflect); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_MessageReflect )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ VARIANT_BOOL *pbMsgReflect); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ShowGrabHandles )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ VARIANT_BOOL *pbShowGrabHandles); - - /* [id][helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_ShowHatching )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ VARIANT_BOOL *pbShowHatching); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DocHostFlags )( - IAxWinAmbientDispatchEx * This, - /* [in] */ DWORD dwDocHostFlags); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DocHostFlags )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ DWORD *pdwDocHostFlags); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_DocHostDoubleClickFlags )( - IAxWinAmbientDispatchEx * This, - /* [in] */ DWORD dwDocHostDoubleClickFlags); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_DocHostDoubleClickFlags )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ DWORD *pdwDocHostDoubleClickFlags); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AllowContextMenu )( - IAxWinAmbientDispatchEx * This, - /* [in] */ VARIANT_BOOL bAllowContextMenu); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AllowContextMenu )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ VARIANT_BOOL *pbAllowContextMenu); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_AllowShowUI )( - IAxWinAmbientDispatchEx * This, - /* [in] */ VARIANT_BOOL bAllowShowUI); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_AllowShowUI )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ VARIANT_BOOL *pbAllowShowUI); - - /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_OptionKeyPath )( - IAxWinAmbientDispatchEx * This, - /* [in] */ BSTR bstrOptionKeyPath); - - /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE *get_OptionKeyPath )( - IAxWinAmbientDispatchEx * This, - /* [retval][out] */ BSTR *pbstrOptionKeyPath); - - /* [id] */ HRESULT ( STDMETHODCALLTYPE *SetAmbientDispatch )( - IAxWinAmbientDispatchEx * This, - /* [in] */ IDispatch *pDispatch); - - END_INTERFACE - } IAxWinAmbientDispatchExVtbl; - - interface IAxWinAmbientDispatchEx - { - CONST_VTBL struct IAxWinAmbientDispatchExVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAxWinAmbientDispatchEx_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAxWinAmbientDispatchEx_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAxWinAmbientDispatchEx_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAxWinAmbientDispatchEx_GetTypeInfoCount(This,pctinfo) \ - (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) - -#define IAxWinAmbientDispatchEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ - (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) - -#define IAxWinAmbientDispatchEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ - (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) - -#define IAxWinAmbientDispatchEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ - (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) - - -#define IAxWinAmbientDispatchEx_put_AllowWindowlessActivation(This,bCanWindowlessActivate) \ - (This)->lpVtbl -> put_AllowWindowlessActivation(This,bCanWindowlessActivate) - -#define IAxWinAmbientDispatchEx_get_AllowWindowlessActivation(This,pbCanWindowlessActivate) \ - (This)->lpVtbl -> get_AllowWindowlessActivation(This,pbCanWindowlessActivate) - -#define IAxWinAmbientDispatchEx_put_BackColor(This,clrBackground) \ - (This)->lpVtbl -> put_BackColor(This,clrBackground) - -#define IAxWinAmbientDispatchEx_get_BackColor(This,pclrBackground) \ - (This)->lpVtbl -> get_BackColor(This,pclrBackground) - -#define IAxWinAmbientDispatchEx_put_ForeColor(This,clrForeground) \ - (This)->lpVtbl -> put_ForeColor(This,clrForeground) - -#define IAxWinAmbientDispatchEx_get_ForeColor(This,pclrForeground) \ - (This)->lpVtbl -> get_ForeColor(This,pclrForeground) - -#define IAxWinAmbientDispatchEx_put_LocaleID(This,lcidLocaleID) \ - (This)->lpVtbl -> put_LocaleID(This,lcidLocaleID) - -#define IAxWinAmbientDispatchEx_get_LocaleID(This,plcidLocaleID) \ - (This)->lpVtbl -> get_LocaleID(This,plcidLocaleID) - -#define IAxWinAmbientDispatchEx_put_UserMode(This,bUserMode) \ - (This)->lpVtbl -> put_UserMode(This,bUserMode) - -#define IAxWinAmbientDispatchEx_get_UserMode(This,pbUserMode) \ - (This)->lpVtbl -> get_UserMode(This,pbUserMode) - -#define IAxWinAmbientDispatchEx_put_DisplayAsDefault(This,bDisplayAsDefault) \ - (This)->lpVtbl -> put_DisplayAsDefault(This,bDisplayAsDefault) - -#define IAxWinAmbientDispatchEx_get_DisplayAsDefault(This,pbDisplayAsDefault) \ - (This)->lpVtbl -> get_DisplayAsDefault(This,pbDisplayAsDefault) - -#define IAxWinAmbientDispatchEx_put_Font(This,pFont) \ - (This)->lpVtbl -> put_Font(This,pFont) - -#define IAxWinAmbientDispatchEx_get_Font(This,pFont) \ - (This)->lpVtbl -> get_Font(This,pFont) - -#define IAxWinAmbientDispatchEx_put_MessageReflect(This,bMsgReflect) \ - (This)->lpVtbl -> put_MessageReflect(This,bMsgReflect) - -#define IAxWinAmbientDispatchEx_get_MessageReflect(This,pbMsgReflect) \ - (This)->lpVtbl -> get_MessageReflect(This,pbMsgReflect) - -#define IAxWinAmbientDispatchEx_get_ShowGrabHandles(This,pbShowGrabHandles) \ - (This)->lpVtbl -> get_ShowGrabHandles(This,pbShowGrabHandles) - -#define IAxWinAmbientDispatchEx_get_ShowHatching(This,pbShowHatching) \ - (This)->lpVtbl -> get_ShowHatching(This,pbShowHatching) - -#define IAxWinAmbientDispatchEx_put_DocHostFlags(This,dwDocHostFlags) \ - (This)->lpVtbl -> put_DocHostFlags(This,dwDocHostFlags) - -#define IAxWinAmbientDispatchEx_get_DocHostFlags(This,pdwDocHostFlags) \ - (This)->lpVtbl -> get_DocHostFlags(This,pdwDocHostFlags) - -#define IAxWinAmbientDispatchEx_put_DocHostDoubleClickFlags(This,dwDocHostDoubleClickFlags) \ - (This)->lpVtbl -> put_DocHostDoubleClickFlags(This,dwDocHostDoubleClickFlags) - -#define IAxWinAmbientDispatchEx_get_DocHostDoubleClickFlags(This,pdwDocHostDoubleClickFlags) \ - (This)->lpVtbl -> get_DocHostDoubleClickFlags(This,pdwDocHostDoubleClickFlags) - -#define IAxWinAmbientDispatchEx_put_AllowContextMenu(This,bAllowContextMenu) \ - (This)->lpVtbl -> put_AllowContextMenu(This,bAllowContextMenu) - -#define IAxWinAmbientDispatchEx_get_AllowContextMenu(This,pbAllowContextMenu) \ - (This)->lpVtbl -> get_AllowContextMenu(This,pbAllowContextMenu) - -#define IAxWinAmbientDispatchEx_put_AllowShowUI(This,bAllowShowUI) \ - (This)->lpVtbl -> put_AllowShowUI(This,bAllowShowUI) - -#define IAxWinAmbientDispatchEx_get_AllowShowUI(This,pbAllowShowUI) \ - (This)->lpVtbl -> get_AllowShowUI(This,pbAllowShowUI) - -#define IAxWinAmbientDispatchEx_put_OptionKeyPath(This,bstrOptionKeyPath) \ - (This)->lpVtbl -> put_OptionKeyPath(This,bstrOptionKeyPath) - -#define IAxWinAmbientDispatchEx_get_OptionKeyPath(This,pbstrOptionKeyPath) \ - (This)->lpVtbl -> get_OptionKeyPath(This,pbstrOptionKeyPath) - - -#define IAxWinAmbientDispatchEx_SetAmbientDispatch(This,pDispatch) \ - (This)->lpVtbl -> SetAmbientDispatch(This,pDispatch) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -/* [id] */ HRESULT STDMETHODCALLTYPE IAxWinAmbientDispatchEx_SetAmbientDispatch_Proxy( - IAxWinAmbientDispatchEx * This, - /* [in] */ IDispatch *pDispatch); - - -void __RPC_STUB IAxWinAmbientDispatchEx_SetAmbientDispatch_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAxWinAmbientDispatchEx_INTERFACE_DEFINED__ */ - - -#ifndef __IInternalConnection_INTERFACE_DEFINED__ -#define __IInternalConnection_INTERFACE_DEFINED__ - -/* interface IInternalConnection */ -/* [object][unique][helpstring][uuid] */ - - -EXTERN_C const IID IID_IInternalConnection; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("72AD0770-6A9F-11d1-BCEC-0060088F444E") - IInternalConnection : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE AddConnection( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE ReleaseConnection( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IInternalConnectionVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IInternalConnection * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IInternalConnection * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IInternalConnection * This); - - HRESULT ( STDMETHODCALLTYPE *AddConnection )( - IInternalConnection * This); - - HRESULT ( STDMETHODCALLTYPE *ReleaseConnection )( - IInternalConnection * This); - - END_INTERFACE - } IInternalConnectionVtbl; - - interface IInternalConnection - { - CONST_VTBL struct IInternalConnectionVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IInternalConnection_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IInternalConnection_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IInternalConnection_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IInternalConnection_AddConnection(This) \ - (This)->lpVtbl -> AddConnection(This) - -#define IInternalConnection_ReleaseConnection(This) \ - (This)->lpVtbl -> ReleaseConnection(This) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IInternalConnection_AddConnection_Proxy( - IInternalConnection * This); - - -void __RPC_STUB IInternalConnection_AddConnection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IInternalConnection_ReleaseConnection_Proxy( - IInternalConnection * This); - - -void __RPC_STUB IInternalConnection_ReleaseConnection_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IInternalConnection_INTERFACE_DEFINED__ */ - - -/* interface __MIDL_itf_atliface_0257 */ -/* [local] */ - - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ -#ifdef __cplusplus -#include -#else -#define ATLAPI EXTERN_C HRESULT __declspec(dllimport) __stdcall -#define ATLAPI_(x) EXTERN_C __declspec(dllimport) x __stdcall -#define ATLINLINE -#endif // __cplusplus - -ATLAPI_(INT_PTR) AtlAxDialogBoxW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam); -ATLAPI_(INT_PTR) AtlAxDialogBoxA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam); -#ifdef UNICODE -#define AtlAxDialogBox AtlAxDialogBoxW -#else -#define AtlAxDialogBox AtlAxDialogBoxA -#endif - -ATLAPI_(HWND) AtlAxCreateDialogW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam); -ATLAPI_(HWND) AtlAxCreateDialogA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam); -#ifdef UNICODE -#define AtlAxCreateDialog AtlAxCreateDialogW -#else -#define AtlAxCreateDialog AtlAxCreateDialogA -#endif - -ATLAPI AtlAxCreateControl(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer); -#ifdef __cplusplus -ATLAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, - IUnknown** ppUnkContainer, IUnknown** ppUnkControl, - REFIID iidSink=IID_NULL, IUnknown* punkSink=NULL); -ATLAPI AtlAxCreateControlLic(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer, BSTR bstrLic = NULL); -ATLAPI AtlAxCreateControlLicEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, - IUnknown** ppUnkContainer, IUnknown** ppUnkControl, - REFIID iidSink=IID_NULL, IUnknown* punkSink=NULL, BSTR bstrLic = NULL); -#else -ATLAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, - IUnknown** ppUnkContainer, IUnknown** ppUnkControl, - REFIID iidSink, IUnknown* punkSink); -ATLAPI AtlAxCreateControlLic(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer, BSTR bstrLic); -ATLAPI AtlAxCreateControlLicEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, - IUnknown** ppUnkContainer, IUnknown** ppUnkControl, - REFIID iidSink, IUnknown* punkSink, BSTR bstrLic); -#endif // __cplusplus -ATLAPI AtlAxAttachControl(IUnknown* pControl, HWND hWnd, IUnknown** ppUnkContainer); -ATLAPI_(BOOL) AtlAxWinInit(); - -ATLAPI AtlAxGetHost(HWND h, IUnknown** pp); -ATLAPI AtlAxGetControl(HWND h, IUnknown** pp); - -}; //namespace ATL -#pragma pack(pop) - -extern RPC_IF_HANDLE __MIDL_itf_atliface_0257_v0_0_c_ifspec; -extern RPC_IF_HANDLE __MIDL_itf_atliface_0257_v0_0_s_ifspec; - -#ifndef __IAccessibleProxy_INTERFACE_DEFINED__ -#define __IAccessibleProxy_INTERFACE_DEFINED__ - -/* interface IAccessibleProxy */ -/* [unique][helpstring][dual][uuid][object] */ - - -EXTERN_C const IID IID_IAccessibleProxy; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("7A7D9DCF-B7A1-4019-9031-258268846980") - IAccessibleProxy : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetServer( - /* [in] */ IAccessible *pAccessible, - /* [in] */ IAccessibleServer *pServer) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAccessibleProxyVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAccessibleProxy * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAccessibleProxy * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAccessibleProxy * This); - - HRESULT ( STDMETHODCALLTYPE *SetServer )( - IAccessibleProxy * This, - /* [in] */ IAccessible *pAccessible, - /* [in] */ IAccessibleServer *pServer); - - END_INTERFACE - } IAccessibleProxyVtbl; - - interface IAccessibleProxy - { - CONST_VTBL struct IAccessibleProxyVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAccessibleProxy_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAccessibleProxy_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAccessibleProxy_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAccessibleProxy_SetServer(This,pAccessible,pServer) \ - (This)->lpVtbl -> SetServer(This,pAccessible,pServer) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAccessibleProxy_SetServer_Proxy( - IAccessibleProxy * This, - /* [in] */ IAccessible *pAccessible, - /* [in] */ IAccessibleServer *pServer); - - -void __RPC_STUB IAccessibleProxy_SetServer_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAccessibleProxy_INTERFACE_DEFINED__ */ - - -#ifndef __IAccessibleServer_INTERFACE_DEFINED__ -#define __IAccessibleServer_INTERFACE_DEFINED__ - -/* interface IAccessibleServer */ -/* [unique][helpstring][uuid][object] */ - - -EXTERN_C const IID IID_IAccessibleServer; - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("52C8FB5E-D779-4e77-AE9F-F611FA7E9D7A") - IAccessibleServer : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE SetProxy( - /* [in] */ IAccessibleProxy *pUnknown) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetHWND( - /* [out] */ HWND *phWnd) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetEnumVariant( - /* [out] */ IEnumVARIANT **ppEnumVariant) = 0; - - }; - -#else /* C style interface */ - - typedef struct IAccessibleServerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IAccessibleServer * This, - /* [in] */ REFIID riid, - /* [iid_is][out] */ void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IAccessibleServer * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IAccessibleServer * This); - - HRESULT ( STDMETHODCALLTYPE *SetProxy )( - IAccessibleServer * This, - /* [in] */ IAccessibleProxy *pUnknown); - - HRESULT ( STDMETHODCALLTYPE *GetHWND )( - IAccessibleServer * This, - /* [out] */ HWND *phWnd); - - HRESULT ( STDMETHODCALLTYPE *GetEnumVariant )( - IAccessibleServer * This, - /* [out] */ IEnumVARIANT **ppEnumVariant); - - END_INTERFACE - } IAccessibleServerVtbl; - - interface IAccessibleServer - { - CONST_VTBL struct IAccessibleServerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IAccessibleServer_QueryInterface(This,riid,ppvObject) \ - (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) - -#define IAccessibleServer_AddRef(This) \ - (This)->lpVtbl -> AddRef(This) - -#define IAccessibleServer_Release(This) \ - (This)->lpVtbl -> Release(This) - - -#define IAccessibleServer_SetProxy(This,pUnknown) \ - (This)->lpVtbl -> SetProxy(This,pUnknown) - -#define IAccessibleServer_GetHWND(This,phWnd) \ - (This)->lpVtbl -> GetHWND(This,phWnd) - -#define IAccessibleServer_GetEnumVariant(This,ppEnumVariant) \ - (This)->lpVtbl -> GetEnumVariant(This,ppEnumVariant) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - -HRESULT STDMETHODCALLTYPE IAccessibleServer_SetProxy_Proxy( - IAccessibleServer * This, - /* [in] */ IAccessibleProxy *pUnknown); - - -void __RPC_STUB IAccessibleServer_SetProxy_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAccessibleServer_GetHWND_Proxy( - IAccessibleServer * This, - /* [out] */ HWND *phWnd); - - -void __RPC_STUB IAccessibleServer_GetHWND_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - -HRESULT STDMETHODCALLTYPE IAccessibleServer_GetEnumVariant_Proxy( - IAccessibleServer * This, - /* [out] */ IEnumVARIANT **ppEnumVariant); - - -void __RPC_STUB IAccessibleServer_GetEnumVariant_Stub( - IRpcStubBuffer *This, - IRpcChannelBuffer *_pRpcChannelBuffer, - PRPC_MESSAGE _pRpcMessage, - DWORD *_pdwStubPhase); - - - -#endif /* __IAccessibleServer_INTERFACE_DEFINED__ */ - - -/* Additional Prototypes for ALL interfaces */ - -unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * ); -unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * ); -unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); -void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * ); - -unsigned long __RPC_USER HWND_UserSize( unsigned long *, unsigned long , HWND * ); -unsigned char * __RPC_USER HWND_UserMarshal( unsigned long *, unsigned char *, HWND * ); -unsigned char * __RPC_USER HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); -void __RPC_USER HWND_UserFree( unsigned long *, HWND * ); - -/* end of Additional Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif - - - diff --git a/cpp/jacob/include/atlrc.h b/cpp/jacob/include/atlrc.h deleted file mode 100644 index a231b99..0000000 --- a/cpp/jacob/include/atlrc.h +++ /dev/null @@ -1,28 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#pragma once - -#ifndef __ATLRC_H__ - -#define ATL_RESID_BASE 0xD800 -#define ATL_STRING_BASE ATL_RESID_BASE - -#define ATL_IDS_DATETIME_INVALID (ATL_STRING_BASE + 0) -#define ATL_IDS_DATETIMESPAN_INVALID (ATL_STRING_BASE + 1) - -#define ATL_SERVICE_MANAGER_OPEN_ERROR (ATL_STRING_BASE + 10) -#define ATL_SERVICE_START_ERROR (ATL_STRING_BASE + 11) -#define ATL_SERVICE_OPEN_ERROR (ATL_STRING_BASE + 12) -#define ATL_SERVICE_DELETE_ERROR (ATL_STRING_BASE + 13) -#define ATL_SERVICE_STOP_ERROR (ATL_STRING_BASE + 14) - -#endif // __ATLRC_H__ - diff --git a/cpp/jacob/include/atlsimpcoll.h b/cpp/jacob/include/atlsimpcoll.h deleted file mode 100644 index 8a5277d..0000000 --- a/cpp/jacob/include/atlsimpcoll.h +++ /dev/null @@ -1,489 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLSIMPCOLL_H__ -#define __ATLSIMPCOLL_H__ - -#pragma once - -#include -#include -#include - -#pragma push_macro("malloc") -#undef malloc -#pragma push_macro("calloc") -#undef calloc -#pragma push_macro("realloc") -#undef realloc -#pragma push_macro("_recalloc") -#undef _recalloc -#pragma push_macro("free") -#undef free - -#pragma warning(push) -#pragma warning(disable: 4800) // forcing 'int' value to bool - - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ - -#pragma push_macro("new") -#undef new - -///////////////////////////////////////////////////////////////////////////// -// Collection helpers - CSimpleArray & CSimpleMap - -// template class helpers with functions for comparing elements -// override if using complex types without operator== -template -class CSimpleArrayEqualHelper -{ -public: - static bool IsEqual(const T& t1, const T& t2) - { - return (t1 == t2); - } -}; - -template -class CSimpleArrayEqualHelperFalse -{ -public: - static bool IsEqual(const T&, const T&) - { - ATLASSERT(false); - return false; - } -}; - -template -class CSimpleMapEqualHelper -{ -public: - static bool IsEqualKey(const TKey& k1, const TKey& k2) - { - return CSimpleArrayEqualHelper::IsEqual(k1, k2); - } - - static bool IsEqualValue(const TVal& v1, const TVal& v2) - { - return CSimpleArrayEqualHelper::IsEqual(v1, v2); - } -}; - -template -class CSimpleMapEqualHelperFalse -{ -public: - static bool IsEqualKey(const TKey& k1, const TKey& k2) - { - return CSimpleArrayEqualHelper::IsEqual(k1, k2); - } - - static bool IsEqualValue(const TVal&, const TVal&) - { - ATLASSERT(FALSE); - return false; - } -}; - -template > -class CSimpleArray -{ -public: -// Construction/destruction - CSimpleArray() : m_aT(NULL), m_nSize(0), m_nAllocSize(0) - { } - - ~CSimpleArray(); - - CSimpleArray(const CSimpleArray< T, TEqual >& src) : m_aT(NULL), m_nSize(0), m_nAllocSize(0) - { - if (src.GetSize()) - { - m_aT = (T*)calloc(src.GetSize(), sizeof(T)); - if (m_aT != NULL) - { - m_nAllocSize = src.GetSize(); - for (int i=0; i& operator=(const CSimpleArray< T, TEqual >& src) - { - if (GetSize() != src.GetSize()) - { - RemoveAll(); - m_aT = (T*)calloc(src.GetSize(), sizeof(T)); - if (m_aT != NULL) - m_nAllocSize = src.GetSize(); - } - else - { - for (int i = GetSize(); i > 0; i--) - RemoveAt(i - 1); - } - for (int i=0; iINT_MAX/sizeof(T)) - { - - - return FALSE; - - } - - - - aT = (T*)_recalloc(m_aT, nNewAllocSize, sizeof(T)); - if(aT == NULL) - return FALSE; - m_nAllocSize = nNewAllocSize; - m_aT = aT; - - } - InternalSetAtIndex(m_nSize, t); - m_nSize++; - return TRUE; - } - BOOL Remove(const T& t) - { - int nIndex = Find(t); - if(nIndex == -1) - return FALSE; - return RemoveAt(nIndex); - } - BOOL RemoveAt(int nIndex) - { - ATLASSERT(nIndex >= 0 && nIndex < m_nSize); - if (nIndex < 0 || nIndex >= m_nSize) - return FALSE; - m_aT[nIndex].~T(); - if(nIndex != (m_nSize - 1)) - Checked::memmove_s((void*)(m_aT + nIndex), (m_nSize - nIndex) * sizeof(T), (void*)(m_aT + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(T)); - m_nSize--; - return TRUE; - } - void RemoveAll() - { - if(m_aT != NULL) - { - for(int i = 0; i < m_nSize; i++) - m_aT[i].~T(); - free(m_aT); - m_aT = NULL; - } - m_nSize = 0; - m_nAllocSize = 0; - } - const T& operator[] (int nIndex) const - { - ATLASSERT(nIndex >= 0 && nIndex < m_nSize); - if(nIndex < 0 || nIndex >= m_nSize) - { - _AtlRaiseException((DWORD)EXCEPTION_ARRAY_BOUNDS_EXCEEDED); - } - return m_aT[nIndex]; - } - T& operator[] (int nIndex) - { - ATLASSERT(nIndex >= 0 && nIndex < m_nSize); - if(nIndex < 0 || nIndex >= m_nSize) - { - _AtlRaiseException((DWORD)EXCEPTION_ARRAY_BOUNDS_EXCEEDED); - } - return m_aT[nIndex]; - } - T* GetData() const - { - return m_aT; - } - - int Find(const T& t) const - { - for(int i = 0; i < m_nSize; i++) - { - if(TEqual::IsEqual(m_aT[i], t)) - return i; - } - return -1; // not found - } - - BOOL SetAtIndex(int nIndex, const T& t) - { - if (nIndex < 0 || nIndex >= m_nSize) - return FALSE; - InternalSetAtIndex(nIndex, t); - return TRUE; - } - -// Implementation - class Wrapper - { - public: - Wrapper(const T& _t) : t(_t) - { - } - template - void * __cdecl operator new(size_t, _Ty* p) - { - return p; - } - template - void __cdecl operator delete(void* /* pv */, _Ty* /* p */) - { - } - T t; - }; - -// Implementation - void InternalSetAtIndex(int nIndex, const T& t) - { - new(m_aT + nIndex) Wrapper(t); - } - - typedef T _ArrayElementType; - T* m_aT; - int m_nSize; - int m_nAllocSize; - -}; - -#define CSimpleValArray CSimpleArray - - template inline CSimpleArray::~CSimpleArray() - { - RemoveAll(); - } - -// intended for small number of simple types or pointers -template > -class CSimpleMap -{ -public: - TKey* m_aKey; - TVal* m_aVal; - int m_nSize; - - typedef TKey _ArrayKeyType; - typedef TVal _ArrayElementType; - -// Construction/destruction - CSimpleMap() : m_aKey(NULL), m_aVal(NULL), m_nSize(0) - { } - - ~CSimpleMap() - { - RemoveAll(); - } - -// Operations - int GetSize() const - { - return m_nSize; - } - BOOL Add(const TKey& key, const TVal& val) - { - TKey* pKey; - pKey = (TKey*)_recalloc(m_aKey, (m_nSize + 1), sizeof(TKey)); - if(pKey == NULL) - return FALSE; - m_aKey = pKey; - TVal* pVal; - pVal = (TVal*)_recalloc(m_aVal, (m_nSize + 1), sizeof(TVal)); - if(pVal == NULL) - return FALSE; - m_aVal = pVal; - InternalSetAtIndex(m_nSize, key, val); - m_nSize++; - return TRUE; - } - BOOL Remove(const TKey& key) - { - int nIndex = FindKey(key); - if(nIndex == -1) - return FALSE; - return RemoveAt(nIndex); - } - BOOL RemoveAt(int nIndex) - { - ATLASSERT(nIndex >= 0 && nIndex < m_nSize); - if (nIndex < 0 || nIndex >= m_nSize) - return FALSE; - m_aKey[nIndex].~TKey(); - m_aVal[nIndex].~TVal(); - if(nIndex != (m_nSize - 1)) - { - Checked::memmove_s((void*)(m_aKey + nIndex), (m_nSize - nIndex) * sizeof(TKey), (void*)(m_aKey + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(TKey)); - Checked::memmove_s((void*)(m_aVal + nIndex), (m_nSize - nIndex) * sizeof(TVal), (void*)(m_aVal + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(TVal)); - } - TKey* pKey; - pKey = (TKey*)_recalloc(m_aKey, (m_nSize - 1), sizeof(TKey)); - if(pKey != NULL || m_nSize == 1) - m_aKey = pKey; - TVal* pVal; - pVal = (TVal*)_recalloc(m_aVal, (m_nSize - 1), sizeof(TVal)); - if(pVal != NULL || m_nSize == 1) - m_aVal = pVal; - m_nSize--; - return TRUE; - } - void RemoveAll() - { - if(m_aKey != NULL) - { - for(int i = 0; i < m_nSize; i++) - { - m_aKey[i].~TKey(); - m_aVal[i].~TVal(); - } - free(m_aKey); - m_aKey = NULL; - } - if(m_aVal != NULL) - { - free(m_aVal); - m_aVal = NULL; - } - - m_nSize = 0; - } - BOOL SetAt(const TKey& key, const TVal& val) - { - int nIndex = FindKey(key); - if(nIndex == -1) - return FALSE; - ATLASSERT(nIndex >= 0 && nIndex < m_nSize); - m_aKey[nIndex].~TKey(); - m_aVal[nIndex].~TVal(); - InternalSetAtIndex(nIndex, key, val); - return TRUE; - } - TVal Lookup(const TKey& key) const - { - int nIndex = FindKey(key); - if(nIndex == -1) - return NULL; // must be able to convert - return GetValueAt(nIndex); - } - TKey ReverseLookup(const TVal& val) const - { - int nIndex = FindVal(val); - if(nIndex == -1) - return NULL; // must be able to convert - return GetKeyAt(nIndex); - } - TKey& GetKeyAt(int nIndex) const - { - ATLASSERT(nIndex >= 0 && nIndex < m_nSize); - if(nIndex < 0 || nIndex >= m_nSize) - _AtlRaiseException((DWORD)EXCEPTION_ARRAY_BOUNDS_EXCEEDED); - - return m_aKey[nIndex]; - } - TVal& GetValueAt(int nIndex) const - { - ATLASSERT(nIndex >= 0 && nIndex < m_nSize); - if(nIndex < 0 || nIndex >= m_nSize) - _AtlRaiseException((DWORD)EXCEPTION_ARRAY_BOUNDS_EXCEEDED); - - return m_aVal[nIndex]; - } - - int FindKey(const TKey& key) const - { - for(int i = 0; i < m_nSize; i++) - { - if(TEqual::IsEqualKey(m_aKey[i], key)) - return i; - } - return -1; // not found - } - int FindVal(const TVal& val) const - { - for(int i = 0; i < m_nSize; i++) - { - if(TEqual::IsEqualValue(m_aVal[i], val)) - return i; - } - return -1; // not found - } - - BOOL SetAtIndex(int nIndex, const TKey& key, const TVal& val) - { - if (nIndex < 0 || nIndex >= m_nSize) - return FALSE; - InternalSetAtIndex(nIndex, key, val); - return TRUE; - } - - -// Implementation - - template - class Wrapper - { - public: - Wrapper(const T& _t) : t(_t) - { - } - template - void *operator new(size_t, _Ty* p) - { - return p; - } - template - void operator delete(void* /* pv */, _Ty* /* p */) - { - } - T t; - }; - void InternalSetAtIndex(int nIndex, const TKey& key, const TVal& val) - { - new(m_aKey + nIndex) Wrapper(key); - new(m_aVal + nIndex) Wrapper(val); - } -}; - -#pragma pop_macro("new") - -}; // namespace ATL -#pragma pack(pop) - -#pragma warning(pop) - -#pragma pop_macro("free") -#pragma pop_macro("realloc") -#pragma pop_macro("_recalloc") -#pragma pop_macro("malloc") -#pragma pop_macro("calloc") - - -#endif // __ATLSIMPCOLL_H__ - diff --git a/cpp/jacob/include/atltrace.h b/cpp/jacob/include/atltrace.h deleted file mode 100644 index bcd05b3..0000000 --- a/cpp/jacob/include/atltrace.h +++ /dev/null @@ -1,450 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __ATLTRACE_H__ -#define __ATLTRACE_H__ - -#pragma once - -#include -#include - -#ifdef _DEBUG -#include -#include -#endif - -#ifdef _DEBUG -#include - -extern "C" IMAGE_DOS_HEADER __ImageBase; -#endif // _DEBUG - - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ - -// Declare a global instance of this class to automatically register a custom trace category at startup -class CTraceCategory -{ -public: - explicit CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel = 0 ) throw(); - -#ifdef _DEBUG - UINT GetLevel() const throw(); - void SetLevel( UINT nLevel ) throw(); - ATLTRACESTATUS GetStatus() const throw(); - void SetStatus( ATLTRACESTATUS eStatus) throw(); -#endif - - operator DWORD_PTR() const throw(); - -public: -#ifdef _DEBUG - DWORD_PTR m_dwCategory; -#endif -}; - -#ifdef _DEBUG - -class CTrace -{ -public: - typedef int (__cdecl *fnCrtDbgReport_t)(int,const char *,int,const char *,const char *,...); - -private: - CTrace( -#ifdef _ATL_NO_DEBUG_CRT - fnCrtDbgReport_t pfnCrtDbgReport = NULL) -#else - fnCrtDbgReport_t pfnCrtDbgReport = _CrtDbgReport) -#endif - : m_hInst(reinterpret_cast(&__ImageBase)), - m_dwModule( 0 ) - { - m_dwModule = AtlTraceRegister(m_hInst, pfnCrtDbgReport); - } - - ~CTrace() - { - AtlTraceUnregister(m_dwModule); - } - -public: - bool ChangeCategory(DWORD_PTR dwCategory, UINT nLevel, ATLTRACESTATUS eStatus) - { - return 0 != - AtlTraceModifyCategory(0, dwCategory, nLevel, eStatus); - } - - bool GetCategory(DWORD_PTR dwCategory, UINT *pnLevel, ATLTRACESTATUS *peStatus) - { - ATLASSERT(pnLevel && peStatus); - return 0 != AtlTraceGetCategory(0, dwCategory, pnLevel, peStatus); - } - UINT GetLevel() - { - ATLTRACESTATUS eStatus; - UINT nLevel; - AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus); - - return nLevel; - } - void SetLevel(UINT nLevel) - { - AtlTraceModifyModule(0, m_dwModule, nLevel, ATLTRACESTATUS_ENABLED); - } - ATLTRACESTATUS GetStatus() - { - ATLTRACESTATUS eStatus; - UINT nLevel; - AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus); - - return eStatus; - } - void SetStatus(ATLTRACESTATUS eStatus) - { - ATLTRACESTATUS eOldStatus; - UINT nLevel; - AtlTraceGetModule(0, m_dwModule, &nLevel, &eOldStatus); - AtlTraceModifyModule(0, m_dwModule, nLevel, eStatus); - } - void __cdecl TraceV(const char *pszFileName, int nLine, - DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const; - void __cdecl TraceV(const char *pszFileName, int nLine, - DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const; - - DWORD_PTR RegisterCategory(LPCSTR pszCategory) - {return(AtlTraceRegisterCategoryA(m_dwModule, pszCategory));} -#ifdef _UNICODE - DWORD_PTR RegisterCategory(LPCWSTR pszCategory) - {return(AtlTraceRegisterCategoryU(m_dwModule, pszCategory));} -#endif - - bool LoadSettings(LPCTSTR pszFileName = NULL) const - {return 0 != AtlTraceLoadSettings(pszFileName);} - void SaveSettings(LPCTSTR pszFileName = NULL) const - {AtlTraceSaveSettings(pszFileName);} - -public: - static CTrace s_trace; - -protected: - HINSTANCE m_hInst; - DWORD_PTR m_dwModule; -}; - - inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine, - DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const - { - AtlTraceVA(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args); - } - inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine, - DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const - { - AtlTraceVU(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args); - } - -extern CTraceCategory atlTraceGeneral; - -class CTraceFileAndLineInfo -{ -public: - CTraceFileAndLineInfo(const char *pszFileName, int nLineNo) - : m_pszFileName(pszFileName), m_nLineNo(nLineNo) - {} - -#pragma warning(push) -#pragma warning(disable : 4793) - void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const char *pszFmt, ...) const - { - va_list ptr; va_start(ptr, pszFmt); - ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr); - va_end(ptr); - } -#pragma warning(pop) - -#pragma warning(push) -#pragma warning(disable : 4793) - void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const wchar_t *pszFmt, ...) const - { - va_list ptr; va_start(ptr, pszFmt); - ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr); - va_end(ptr); - } -#pragma warning(pop) - -#pragma warning(push) -#pragma warning(disable : 4793) - void __cdecl operator()(const char *pszFmt, ...) const - { - va_list ptr; va_start(ptr, pszFmt); - ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr); - va_end(ptr); - } -#pragma warning(pop) - -#pragma warning(push) -#pragma warning(disable : 4793) - void __cdecl operator()(const wchar_t *pszFmt, ...) const - { - va_list ptr; va_start(ptr, pszFmt); - ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr); - va_end(ptr); - } -#pragma warning(pop) - -private: - /* unimplemented */ - CTraceFileAndLineInfo &__cdecl operator=(const CTraceFileAndLineInfo &right); - - const char *const m_pszFileName; - const int m_nLineNo; -}; - -#endif // _DEBUG - -#ifdef _DEBUG - -inline CTraceCategory::CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel ) throw() : - m_dwCategory( 0 ) -{ - m_dwCategory = ATL::CTrace::s_trace.RegisterCategory( pszCategoryName ); - ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nStartingLevel, ATLTRACESTATUS_INHERIT); -} - -inline CTraceCategory::operator DWORD_PTR() const throw() -{ - return( m_dwCategory ); -} - -inline UINT CTraceCategory::GetLevel() const throw() -{ - UINT nLevel; - ATLTRACESTATUS eStatus; - ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus ); - - return( nLevel ); -} - -inline void CTraceCategory::SetLevel( UINT nLevel ) throw() -{ - ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, ATLTRACESTATUS_ENABLED ); -} - -inline ATLTRACESTATUS CTraceCategory::GetStatus() const throw() -{ - UINT nLevel; - ATLTRACESTATUS eStatus; - ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus ); - - return( eStatus ); -} - -inline void CTraceCategory::SetStatus( ATLTRACESTATUS eStatus ) throw() -{ - UINT nLevel; - ATLTRACESTATUS eOldStatus; - ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eOldStatus ); - ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, eStatus ); -} - -#else // !_DEBUG - -inline CTraceCategory::CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel ) throw() -{ - (void)pszCategoryName; - (void)nStartingLevel; -} - -inline CTraceCategory::operator DWORD_PTR() const throw() -{ - return( 0 ); -} - -#endif // _DEBUG - -} // namespace ATL - -namespace ATL -{ - -#ifdef _DEBUG -#define DECLARE_TRACE_CATEGORY( name ) extern ATL::CTraceCategory name; -#else -#define DECLARE_TRACE_CATEGORY( name ) const DWORD_PTR name = 0; -#endif - -DECLARE_TRACE_CATEGORY( atlTraceGeneral ) -DECLARE_TRACE_CATEGORY( atlTraceCOM ) -DECLARE_TRACE_CATEGORY( atlTraceQI ) -DECLARE_TRACE_CATEGORY( atlTraceRegistrar ) -DECLARE_TRACE_CATEGORY( atlTraceRefcount ) -DECLARE_TRACE_CATEGORY( atlTraceWindowing ) -DECLARE_TRACE_CATEGORY( atlTraceControls ) -DECLARE_TRACE_CATEGORY( atlTraceHosting ) -DECLARE_TRACE_CATEGORY( atlTraceDBClient ) -DECLARE_TRACE_CATEGORY( atlTraceDBProvider ) -DECLARE_TRACE_CATEGORY( atlTraceSnapin ) -DECLARE_TRACE_CATEGORY( atlTraceNotImpl ) -DECLARE_TRACE_CATEGORY( atlTraceAllocation ) -DECLARE_TRACE_CATEGORY( atlTraceException ) -DECLARE_TRACE_CATEGORY( atlTraceTime ) -DECLARE_TRACE_CATEGORY( atlTraceCache ) -DECLARE_TRACE_CATEGORY( atlTraceStencil ) -DECLARE_TRACE_CATEGORY( atlTraceString ) -DECLARE_TRACE_CATEGORY( atlTraceMap ) -DECLARE_TRACE_CATEGORY( atlTraceUtil ) -DECLARE_TRACE_CATEGORY( atlTraceSecurity ) -DECLARE_TRACE_CATEGORY( atlTraceSync ) -DECLARE_TRACE_CATEGORY( atlTraceISAPI ) - -// atlTraceUser categories are no longer needed. Just declare your own trace category using CTraceCategory. -DECLARE_TRACE_CATEGORY( atlTraceUser ) -DECLARE_TRACE_CATEGORY( atlTraceUser2 ) -DECLARE_TRACE_CATEGORY( atlTraceUser3 ) -DECLARE_TRACE_CATEGORY( atlTraceUser4 ) - -#pragma deprecated( atlTraceUser ) -#pragma deprecated( atlTraceUser2 ) -#pragma deprecated( atlTraceUser3 ) -#pragma deprecated( atlTraceUser4 ) - -#ifdef _DEBUG - -#ifndef _ATL_NO_DEBUG_CRT -class CNoUIAssertHook -{ -public: - CNoUIAssertHook() - { - ATLASSERT( s_pfnPrevHook == NULL ); - s_pfnPrevHook = _CrtSetReportHook(CrtHookProc); - } - ~CNoUIAssertHook() - { - _CrtSetReportHook(s_pfnPrevHook); - s_pfnPrevHook = NULL; - } - -private: - static int __cdecl CrtHookProc(__in int eReportType, __in_z char* pszMessage, __out int* pnRetVal) - { - - if (eReportType == _CRT_ASSERT) - { - ::OutputDebugStringA( "ASSERTION FAILED\n" ); - ::OutputDebugStringA( pszMessage ); - //If caller doesn't want retVal, so be it. - if (pnRetVal != NULL) - { - *pnRetVal = 1; - } - return TRUE; - } - - if (s_pfnPrevHook != NULL) - { - return s_pfnPrevHook(eReportType, pszMessage, pnRetVal); - } - else - { - return FALSE; - } - } - -private: - static _CRT_REPORT_HOOK s_pfnPrevHook; -}; - -__declspec( selectany ) _CRT_REPORT_HOOK CNoUIAssertHook::s_pfnPrevHook = NULL; - -#define DECLARE_NOUIASSERT() ATL::CNoUIAssertHook _g_NoUIAssertHook; - -#endif // _ATL_NO_DEBUG_CRT - -#ifndef ATLTRACE -#define ATLTRACE ATL::CTraceFileAndLineInfo(__FILE__, __LINE__) -#define ATLTRACE2 ATLTRACE -#endif - -#pragma warning(push) -#pragma warning(disable : 4793) -inline void __cdecl AtlTrace(LPCSTR pszFormat, ...) -{ - va_list ptr; - va_start(ptr, pszFormat); - ATL::CTrace::s_trace.TraceV(NULL, -1, atlTraceGeneral, 0, pszFormat, ptr); - va_end(ptr); -} -#pragma warning(pop) - -#pragma warning(push) -#pragma warning(disable : 4793) -inline void __cdecl AtlTrace(LPCWSTR pszFormat, ...) -{ - va_list ptr; - va_start(ptr, pszFormat); - ATL::CTrace::s_trace.TraceV(NULL, -1, atlTraceGeneral, 0, pszFormat, ptr); - va_end(ptr); -} -#pragma warning(pop) - -#pragma warning(push) -#pragma warning(disable : 4793) -inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFormat, ...) -{ - va_list ptr; - va_start(ptr, pszFormat); - ATL::CTrace::s_trace.TraceV(NULL, -1, dwCategory, nLevel, pszFormat, ptr); - va_end(ptr); -} -#pragma warning(pop) - -#pragma warning(push) -#pragma warning(disable : 4793) -inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFormat, ...) -{ - va_list ptr; - va_start(ptr, pszFormat); - ATL::CTrace::s_trace.TraceV(NULL, -1, dwCategory, nLevel, pszFormat, ptr); - va_end(ptr); -} -#pragma warning(pop) - -#define ATLTRACENOTIMPL(funcname) do { ATLTRACE(ATL::atlTraceNotImpl, 0, _T("ATL: %s not implemented.\n"), funcname); return E_NOTIMPL; } while(0) - -#else // !DEBUG - -#pragma warning(push) -#pragma warning(disable : 4793) -inline void __cdecl AtlTraceNull(...){} -inline void __cdecl AtlTrace(LPCSTR , ...){} -inline void __cdecl AtlTrace2(DWORD_PTR, UINT, LPCSTR , ...){} -inline void __cdecl AtlTrace(LPCWSTR , ...){} -inline void __cdecl AtlTrace2(DWORD_PTR, UINT, LPCWSTR , ...){} -#pragma warning(pop) - -#ifndef ATLTRACE - -#define ATLTRACE __noop -#define ATLTRACE2 __noop -#endif //ATLTRACE -#define ATLTRACENOTIMPL(funcname) return E_NOTIMPL -#define DECLARE_NOUIASSERT() - -#endif //!_DEBUG - -}; // namespace ATL -#pragma pack(pop) - -#endif // __ATLTRACE_H__ - diff --git a/cpp/jacob/include/statreg.h b/cpp/jacob/include/statreg.h deleted file mode 100644 index 2dc76aa..0000000 --- a/cpp/jacob/include/statreg.h +++ /dev/null @@ -1,1509 +0,0 @@ -// This is a part of the Active Template Library. -// Copyright (C) Microsoft Corporation -// All rights reserved. -// -// This source code is only intended as a supplement to the -// Active Template Library Reference and related -// electronic documentation provided with the library. -// See these sources for detailed information regarding the -// Active Template Library product. - -#ifndef __STATREG_H__ -#define __STATREG_H__ - -#pragma once - -#ifndef __cplusplus - #error ATL requires C++ compilation (use a .cpp suffix) -#endif - -#ifndef __ATLBASE_H__ - #error statreg.h requires atlbase.h to be included first -#endif - -#pragma warning(push) -#pragma warning(disable:4571) //catch(...) blocks compiled with /EHs do NOT catch or re-throw Structured Exceptions - -// SAL requires macro definition -#define MAX_VALUE_VALUE 4096 - -#define E_ATL_REGISTRAR_DESC 0x0201 -#define E_ATL_NOT_IN_MAP 0x0202 -#define E_ATL_UNEXPECTED_EOS 0x0203 -#define E_ATL_VALUE_SET_FAILED 0x0204 -#define E_ATL_RECURSE_DELETE_FAILED 0x0205 -#define E_ATL_EXPECTING_EQUAL 0x0206 -#define E_ATL_CREATE_KEY_FAILED 0x0207 -#define E_ATL_DELETE_KEY_FAILED 0x0208 -#define E_ATL_OPEN_KEY_FAILED 0x0209 -#define E_ATL_CLOSE_KEY_FAILED 0x020A -#define E_ATL_UNABLE_TO_COERCE 0x020B -#define E_ATL_BAD_HKEY 0x020C -#define E_ATL_MISSING_OPENKEY_TOKEN 0x020D -#define E_ATL_CONVERT_FAILED 0x020E -#define E_ATL_TYPE_NOT_SUPPORTED 0x020F -#define E_ATL_COULD_NOT_CONCAT 0x0210 -#define E_ATL_COMPOUND_KEY 0x0211 -#define E_ATL_INVALID_MAPKEY 0x0212 -#define E_ATL_UNSUPPORTED_VT 0x0213 -#define E_ATL_VALUE_GET_FAILED 0x0214 -#define E_ATL_VALUE_TOO_LARGE 0x0215 -#define E_ATL_MISSING_VALUE_DELIMETER 0x0216 -#define E_ATL_DATA_NOT_BYTE_ALIGNED 0x0217 - -#pragma pack(push,_ATL_PACKING) -namespace ATL -{ -const TCHAR chDirSep = _T('\\'); -const TCHAR chRightBracket = _T('}'); -const TCHAR chLeftBracket = _T('{'); -const TCHAR chQuote = _T('\''); -const TCHAR chEquals = _T('='); -const LPCTSTR szStringVal = _T("S"); -const LPCTSTR multiszStringVal = _T("M"); -const LPCTSTR szDwordVal = _T("D"); -const LPCTSTR szBinaryVal = _T("B"); -const LPCTSTR szValToken = _T("Val"); -const LPCTSTR szForceRemove = _T("ForceRemove"); -const LPCTSTR szNoRemove = _T("NoRemove"); -const LPCTSTR szDelete = _T("Delete"); - - -// Implementation helper -class CExpansionVectorEqualHelper -{ -public: - static bool IsEqualKey(__in_z const LPTSTR k1, __in_z const LPTSTR k2) - { - if (lstrcmpi(k1, k2) == 0) - return true; - return false; - } - - // Not used - static bool IsEqualValue(const LPCOLESTR /*v1*/, const LPCOLESTR /*v2*/) - { - return false; - } -}; - -// Implementation helper -class CExpansionVector : public CSimpleMap -{ -public: - ~CExpansionVector() - { - ClearReplacements(); - } - - BOOL Add(LPCTSTR lpszKey, LPCOLESTR lpszValue) - { - ATLASSERT(lpszKey != NULL && lpszValue != NULL); - if (lpszKey == NULL || lpszValue == NULL) - return FALSE; - - HRESULT hRes = S_OK; - - size_t cbKey = (lstrlen(lpszKey)+1)*sizeof(TCHAR); - TCHAR* szKey = NULL; - -#pragma warning(push) -#pragma warning(disable: 28197 28198) - - ATLTRY(szKey = new TCHAR[cbKey];) - -#pragma warning(pop) - - CAutoVectorPtr spKey; - spKey.Attach(szKey); - - size_t cbValue = (ocslen(lpszValue)+1)*sizeof(OLECHAR); - LPOLESTR szValue = NULL; - -#pragma warning(push) -#pragma warning(disable: 28197) - - ATLTRY(szValue = new OLECHAR[cbValue];) - -#pragma warning(pop) - - CAutoVectorPtr spValue; - spValue.Attach(szValue); - - if (szKey == NULL || szValue == NULL) - hRes = E_OUTOFMEMORY; - else - { - Checked::memcpy_s(szKey, cbKey, lpszKey, cbKey); - Checked::memcpy_s(szValue, cbValue, lpszValue, cbValue); - if (!CSimpleMap::Add(szKey, szValue)) - hRes = E_OUTOFMEMORY; - } - if (SUCCEEDED(hRes)) - { - spKey.Detach(); - spValue.Detach(); - } - return SUCCEEDED(hRes); - } - HRESULT ClearReplacements() - { - for (int i = 0; i < GetSize(); i++) - { - delete []GetKeyAt(i); - delete []GetValueAt(i); - } - RemoveAll(); - return S_OK; - } -}; - -class CRegObject; - -class CRegParser -{ -public: - CRegParser(CRegObject* pRegObj); - - HRESULT PreProcessBuffer(__in_z LPTSTR lpszReg, __deref_out_z LPTSTR* ppszReg); - HRESULT RegisterBuffer(__in_z LPTSTR szReg, BOOL bRegister); - -protected: - - void SkipWhiteSpace(); - HRESULT NextToken(__out_ecount_z(MAX_VALUE_VALUE) LPTSTR szToken); - HRESULT AddValue(__in CRegKey& rkParent, __in_z_opt LPCTSTR szValueName, __out_ecount_z(MAX_VALUE_VALUE) LPTSTR szToken); - BOOL CanForceRemoveKey(LPCTSTR szKey); - BOOL HasSubKeys(HKEY hkey); - BOOL HasValues(HKEY hkey); - HRESULT RegisterSubkeys(__out_ecount_z(MAX_VALUE_VALUE) LPTSTR szToken, __in HKEY hkParent, __in BOOL bRegister, __in BOOL bInRecovery = FALSE); - BOOL IsSpace(TCHAR ch); - LPTSTR m_pchCur; - - CRegObject* m_pRegObj; - - HRESULT GenerateError(UINT) {return DISP_E_EXCEPTION;} - //HRESULT HandleReplacements(LPTSTR& szToken); - HRESULT SkipAssignment(__inout_ecount_z(MAX_VALUE_VALUE) LPTSTR szToken); - - BOOL EndOfVar() { return chQuote == *m_pchCur && chQuote != *CharNext(m_pchCur); } - static LPTSTR StrChr(__in_z LPTSTR lpsz, __in TCHAR ch); - static HKEY HKeyFromString(__in_z LPTSTR szToken); - static BYTE ChToByte(const TCHAR ch); - static BOOL VTFromRegType(LPCTSTR szValueType, VARTYPE& vt); - static const TCHAR* const rgszNeverDelete[]; - static const int cbNeverDelete; - static const int MAX_VALUE = MAX_VALUE_VALUE; - static const int MAX_TYPE = 4096; - - - // Implementation Helper - class CParseBuffer - { - public: - int nPos; - int nSize; - __field_ecount(nSize) LPTSTR p; - CParseBuffer(int nInitial) - { - if (nInitial < 100) - nInitial = 1000; - nPos = 0; - nSize = nInitial; - p = (LPTSTR) ::ATL::AtlCoTaskMemCAlloc(nSize,static_cast(sizeof(TCHAR))); - if (p != NULL) - *p = NULL; - } - ~CParseBuffer() - { - CoTaskMemFree(p); - } - BOOL Append(const TCHAR* pch, int nChars) - { - ATLASSERT(p != NULL); - int newSize = nPos + nChars + 1; - if ((newSize <= nPos) || (newSize <= nChars)) - return FALSE; - - if (newSize >= nSize) - { - int nTempSize = nSize; - while (newSize >= nTempSize) { - if (nTempSize > INT_MAX / 2) - return FALSE; - nTempSize *= 2; - } - LPTSTR pTemp = (LPTSTR)::ATL::AtlCoTaskMemRecalloc(p, nTempSize, sizeof(TCHAR)); - if (pTemp == NULL) - return FALSE; - p = pTemp; - nSize = nTempSize; - } - if ((nPos < 0) || (nPos >= nSize) || nSize - nPos > nSize) - return FALSE; - -#pragma warning(push) -// -// [pfx_parse] - workaround for PREfix parse problem -// -#if ((defined(_PREFIX_)) || (defined(_PREFAST_))) && (_MSC_VER < 1400) - // do nothing, this pragma not understood by PREfix 5.1 -#else // !_PREFIX_ -#pragma warning(disable: 22008) -#endif - /* Prefast false warning is fired here despite the all above checks */ - Checked::memcpy_s(p + nPos, (nSize-nPos) * sizeof(TCHAR), pch, int(nChars * sizeof(TCHAR))); - nPos += nChars; - *(p + nPos) = NULL; -#pragma warning(pop) - return TRUE; - } - - BOOL AddChar(const TCHAR* pch) - { -#ifndef _UNICODE - int nChars = int(CharNext(pch) - pch); -#else - int nChars = 1; -#endif - return Append(pch, nChars); - - } - BOOL AddString(LPCOLESTR lpsz) - { - if (lpsz == NULL) - { - return FALSE; - } - USES_CONVERSION_EX; - LPCTSTR lpszT = OLE2CT_EX(lpsz, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); - if (lpszT == NULL) - { - return FALSE; - } - return Append(lpszT, (int)lstrlen(lpszT)); - } - LPTSTR Detach() - { - LPTSTR lp = p; - p = NULL; - nSize = nPos = 0; - return lp; - } - - }; -}; - -#if defined(_ATL_DLL) || defined(_ATL_DLL_IMPL) -class ATL_NO_VTABLE CRegObject - : public IRegistrar -#else -class CRegObject : public IRegistrarBase -#endif -{ -public: - -#if defined(_ATL_DLL) || defined(_ATL_DLL_IMPL) - -#else - STDMETHOD(QueryInterface)(const IID &,void **ppv) - { - ATLASSERT(_T("statically linked in CRegObject is not a com object. Do not callthis function")); - if (ppv) *ppv = NULL; - return E_NOTIMPL; - } - - STDMETHOD_(ULONG, AddRef)(void) - { - ATLASSERT(_T("statically linked in CRegObject is not a com object. Do not callthis function")); - return 1; - } - STDMETHOD_(ULONG, Release)(void) - { - ATLASSERT(_T("statically linked in CRegObject is not a com object. Do not callthis function")); - return 0; - } -#endif - virtual ~CRegObject(){ClearReplacements();} - HRESULT FinalConstruct() { return m_csMap.Init(); } - void FinalRelease() {} - - - // Map based methods - HRESULT STDMETHODCALLTYPE AddReplacement(LPCOLESTR lpszKey, LPCOLESTR lpszItem); - HRESULT STDMETHODCALLTYPE ClearReplacements(); - LPCOLESTR StrFromMap(__in_z LPTSTR lpszKey); - - // Register via a given mechanism - HRESULT STDMETHODCALLTYPE ResourceRegister(LPCOLESTR pszFileName, UINT nID, LPCOLESTR pszType); - HRESULT STDMETHODCALLTYPE ResourceRegisterSz(LPCOLESTR pszFileName, LPCOLESTR pszID, LPCOLESTR pszType); - HRESULT STDMETHODCALLTYPE ResourceUnregister(LPCOLESTR pszFileName, UINT nID, LPCOLESTR pszType); - HRESULT STDMETHODCALLTYPE ResourceUnregisterSz(LPCOLESTR pszFileName, LPCOLESTR pszID, LPCOLESTR pszType); - HRESULT STDMETHODCALLTYPE FileRegister(LPCOLESTR bstrFileName) - { - return CommonFileRegister(bstrFileName, TRUE); - } - - HRESULT STDMETHODCALLTYPE FileUnregister(LPCOLESTR bstrFileName) - { - return CommonFileRegister(bstrFileName, FALSE); - } - - HRESULT STDMETHODCALLTYPE StringRegister(LPCOLESTR bstrData) - { - return RegisterWithString(bstrData, TRUE); - } - - HRESULT STDMETHODCALLTYPE StringUnregister(LPCOLESTR bstrData) - { - return RegisterWithString(bstrData, FALSE); - } - -protected: - - HRESULT CommonFileRegister(LPCOLESTR pszFileName, BOOL bRegister); - HRESULT RegisterFromResource(LPCOLESTR pszFileName, LPCTSTR pszID, LPCTSTR pszType, BOOL bRegister); - HRESULT RegisterWithString(LPCOLESTR pszData, BOOL bRegister); - - static HRESULT GenerateError(UINT) {return DISP_E_EXCEPTION;} - - CExpansionVector m_RepMap; - CComObjectThreadModel::AutoDeleteCriticalSection m_csMap; -}; - -inline HRESULT STDMETHODCALLTYPE CRegObject::AddReplacement(LPCOLESTR lpszKey, LPCOLESTR lpszItem) -{ - if (lpszKey == NULL || lpszItem == NULL) - return E_INVALIDARG; - m_csMap.Lock(); - USES_CONVERSION_EX; - - LPCTSTR lpszT = OLE2CT_EX(lpszKey, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); - -#ifndef _UNICODE - if(lpszT == NULL) { - m_csMap.Unlock(); - return E_OUTOFMEMORY; - } -#endif - - BOOL bRet = m_RepMap.Add(lpszT, lpszItem); - m_csMap.Unlock(); - return bRet ? S_OK : E_OUTOFMEMORY; -} - -inline HRESULT CRegObject::RegisterFromResource(LPCOLESTR bstrFileName, LPCTSTR szID, - LPCTSTR szType, BOOL bRegister) -{ - USES_CONVERSION_EX; - - HRESULT hr; - CRegParser parser(this); - HINSTANCE hInstResDll; - HRSRC hrscReg; - HGLOBAL hReg; - DWORD dwSize; - LPSTR szRegA; - CTempBuffer szReg; - - LPCTSTR lpszBSTRFileName = OLE2CT_EX(bstrFileName, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if (lpszBSTRFileName == NULL) - { - return E_OUTOFMEMORY; - } -#endif // _UNICODE - - hInstResDll = LoadLibraryEx(lpszBSTRFileName, NULL, LOAD_LIBRARY_AS_DATAFILE); - - if (NULL == hInstResDll) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Failed to LoadLibrary on %s\n"), bstrFileName); - hr = AtlHresultFromLastError(); - goto ReturnHR; - } - - hrscReg =FindResource((HMODULE)hInstResDll, szID, szType); - - if (NULL == hrscReg) - { - ATLTRACE(atlTraceRegistrar, 0, (HIWORD(szID) == NULL) ? - _T("Failed to FindResource on ID:%d TYPE:%s\n") : - _T("Failed to FindResource on ID:%s TYPE:%s\n"), - szID, szType); - hr = AtlHresultFromLastError(); - goto ReturnHR; - } - hReg = LoadResource((HMODULE)hInstResDll, hrscReg); - - if (NULL == hReg) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Failed to LoadResource\n")); - hr = AtlHresultFromLastError(); - goto ReturnHR; - } - - dwSize = SizeofResource((HMODULE)hInstResDll, hrscReg); - szRegA = (LPSTR)hReg; - - // Allocate extra space for NULL. - if (dwSize + 1 < dwSize) - return E_OUTOFMEMORY; - ATLTRY(szReg.Allocate(dwSize + 1)); - if (szReg == NULL) - { - hr = E_OUTOFMEMORY; - goto ReturnHR; - } - -#ifdef _UNICODE - DWORD uniSize = ::MultiByteToWideChar(_AtlGetConversionACP(), 0, szRegA, dwSize, szReg, dwSize); - if (uniSize == 0) - { - hr = AtlHresultFromLastError(); - goto ReturnHR; - } - // Append a NULL at the end. - szReg[uniSize] = NULL; -#else - Checked::memcpy_s(szReg, dwSize, szRegA, dwSize); - // Append a NULL at the end. - szReg[dwSize] = NULL; -#endif - - - - hr = parser.RegisterBuffer(szReg, bRegister); - -ReturnHR: - - if (NULL != hInstResDll) - FreeLibrary((HMODULE)hInstResDll); - return hr; -} - -inline HRESULT STDMETHODCALLTYPE CRegObject::ResourceRegister(LPCOLESTR szFileName, UINT nID, LPCOLESTR szType) -{ - USES_CONVERSION_EX; - - LPCTSTR lpszT = OLE2CT_EX(szType, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if (lpszT == NULL) - { - return E_OUTOFMEMORY; - } -#endif // _UNICODE - - return RegisterFromResource(szFileName, MAKEINTRESOURCE(nID), lpszT, TRUE); -} - -inline HRESULT STDMETHODCALLTYPE CRegObject::ResourceRegisterSz(LPCOLESTR szFileName, LPCOLESTR szID, LPCOLESTR szType) -{ - USES_CONVERSION_EX; - if (szID == NULL || szType == NULL) - return E_INVALIDARG; - - LPCTSTR lpszID = OLE2CT_EX(szID, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); - LPCTSTR lpszType = OLE2CT_EX(szType, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if (lpszID == NULL || lpszType==NULL) - { - return E_OUTOFMEMORY; - } -#endif // _UNICODE - return RegisterFromResource(szFileName, lpszID, lpszType, TRUE); -} - -inline HRESULT STDMETHODCALLTYPE CRegObject::ResourceUnregister(LPCOLESTR szFileName, UINT nID, LPCOLESTR szType) -{ - USES_CONVERSION_EX; - - LPCTSTR lpszT = OLE2CT_EX(szType, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if (lpszT == NULL) - { - return E_OUTOFMEMORY; - } -#endif // _UNICODE - return RegisterFromResource(szFileName, MAKEINTRESOURCE(nID), lpszT, FALSE); -} - -inline HRESULT STDMETHODCALLTYPE CRegObject::ResourceUnregisterSz(LPCOLESTR szFileName, LPCOLESTR szID, LPCOLESTR szType) -{ - USES_CONVERSION_EX; - if (szID == NULL || szType == NULL) - return E_INVALIDARG; - - LPCTSTR lpszID = OLE2CT_EX(szID, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); - LPCTSTR lpszType = OLE2CT_EX(szType, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if (lpszID == NULL || lpszType == NULL) - { - return E_OUTOFMEMORY; - } -#endif // _UNICODE - - return RegisterFromResource(szFileName, lpszID, lpszType, FALSE); -} - -inline HRESULT CRegObject::RegisterWithString(LPCOLESTR bstrData, BOOL bRegister) -{ - USES_CONVERSION_EX; - CRegParser parser(this); - - LPCTSTR szReg = OLE2CT_EX(bstrData, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if (szReg == NULL) - { - return E_OUTOFMEMORY; - } -#endif // _UNICODE - - HRESULT hr = parser.RegisterBuffer((LPTSTR)szReg, bRegister); - - return hr; -} - -inline HRESULT CRegObject::ClearReplacements() -{ - m_csMap.Lock(); - HRESULT hr = m_RepMap.ClearReplacements(); - m_csMap.Unlock(); - return hr; -} - - -inline LPCOLESTR CRegObject::StrFromMap(__in_z LPTSTR lpszKey) -{ - m_csMap.Lock(); - LPCOLESTR lpsz = m_RepMap.Lookup(lpszKey); - if (lpsz == NULL) // not found!! - ATLTRACE(atlTraceRegistrar, 0, _T("Map Entry not found\n")); - m_csMap.Unlock(); - return lpsz; -} - -inline HRESULT CRegObject::CommonFileRegister(LPCOLESTR bstrFileName, BOOL bRegister) -{ - USES_CONVERSION_EX; - - CRegParser parser(this); - - LPCTSTR lpszBSTRFileName = OLE2CT_EX(bstrFileName, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); -#ifndef _UNICODE - if (lpszBSTRFileName == NULL) - { - return E_OUTOFMEMORY; - } -#endif // _UNICODE - - HANDLE hFile = CreateFile(lpszBSTRFileName, GENERIC_READ, 0, NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_READONLY, - NULL); - if (INVALID_HANDLE_VALUE == hFile) - { - ATLTRACE2(atlTraceRegistrar, 0, _T("Failed to CreateFile on %s\n"), lpszBSTRFileName); - return AtlHresultFromLastError(); - } - - HRESULT hRes = S_OK; - DWORD cbRead; - DWORD cbFile = GetFileSize(hFile, NULL); // No HiOrder DWORD required - - CTempBuffer szReg; - // Extra space for NULL. - ATLTRY(szReg.Allocate(cbFile + 1)); - if (szReg == NULL) - { - hRes = E_OUTOFMEMORY; - goto ReturnHR; - } - - if (ReadFile(hFile, szReg, cbFile, &cbRead, NULL) == 0) - { - ATLTRACE2(atlTraceRegistrar, 0, "Read Failed on file%s\n", lpszBSTRFileName); - hRes = AtlHresultFromLastError(); - } - if (SUCCEEDED(hRes)) - { - szReg[cbRead] = NULL; - -#ifdef _UNICODE - CTempBuffer szConverted; - ATLTRY(szConverted.Allocate(cbFile + 1)); - if (szConverted == NULL) - { - hRes = E_OUTOFMEMORY; - goto ReturnHR; - - } - if (::MultiByteToWideChar(_AtlGetConversionACP(), 0, szReg, cbFile + 1, szConverted, cbFile + 1) == 0) - { - hRes = AtlHresultFromLastError(); - goto ReturnHR; - } - - - - -#else - LPTSTR szConverted = szReg; -#endif - hRes = parser.RegisterBuffer(szConverted, bRegister); - } -ReturnHR: - CloseHandle(hFile); - return hRes; -} - -__declspec(selectany) const TCHAR* const CRegParser::rgszNeverDelete[] = -{ - _T("AppID"), - _T("CLSID"), - _T("Component Categories"), - _T("FileType"), - _T("Interface"), - _T("Hardware"), - _T("Mime"), - _T("SAM"), - _T("SECURITY"), - _T("SYSTEM"), - _T("Software"), - _T("TypeLib") -}; - -__declspec(selectany) const int CRegParser::cbNeverDelete = sizeof(rgszNeverDelete) / sizeof(LPCTSTR*); - - -inline BOOL CRegParser::VTFromRegType(LPCTSTR szValueType, VARTYPE& vt) -{ -// -// [pfx_parse] - workaround for PREfix parse problem -// -#if defined(_PREFIX_) || defined(_PREFAST_) - UNREFERENCED_PARAMETER(szValueType); - UNREFERENCED_PARAMETER(vt); - return FALSE; -#else - - struct typemap - { - LPCTSTR lpsz; - VARTYPE vt; - }; -#pragma warning (push) -#pragma warning (disable : 4640) // construction of local static object is not thread-safe - - static const typemap map[] = { - {szStringVal, VT_BSTR}, - {multiszStringVal, VT_BSTR | VT_BYREF}, - {szDwordVal, VT_UI4}, - {szBinaryVal, VT_UI1} - }; - -#pragma warning (pop) - - for (int i=0;i= szOrig + MAX_VALUE) - return GenerateError(E_ATL_VALUE_TOO_LARGE); - - for (int i = 0; i < (int)nChars; i++, szToken++, pchPrev++) - *szToken = *pchPrev; - } - - if (NULL == *m_pchCur) - { - ATLTRACE(atlTraceRegistrar, 0, _T("NextToken : Unexpected End of File\n")); - return GenerateError(E_ATL_UNEXPECTED_EOS); - } - - *szToken = NULL; - m_pchCur = CharNext(m_pchCur); - } - - else - { - // Handle non-quoted ie parse up till first "White Space" - while (NULL != *m_pchCur && !IsSpace(*m_pchCur)) - { - LPTSTR pchPrev = m_pchCur; - m_pchCur = CharNext(m_pchCur); - - INT_PTR nChars = m_pchCur - pchPrev; - - // Make sure we have room for nChars plus terminating NULL - if ((szToken + nChars + 1) >= szOrig + MAX_VALUE) - return GenerateError(E_ATL_VALUE_TOO_LARGE); - - for (int i = 0; i < (int)nChars; i++, szToken++, pchPrev++) - *szToken = *pchPrev; - } - - *szToken = NULL; - } - return S_OK; -} - -inline HRESULT CRegParser::AddValue(__in CRegKey& rkParent, __in_z_opt LPCTSTR szValueName, __out_ecount_z(MAX_VALUE_VALUE) LPTSTR szToken) -{ - HRESULT hr; - - TCHAR szValue[MAX_VALUE]; - VARTYPE vt = VT_EMPTY; - LONG lRes = ERROR_SUCCESS; - UINT nIDRes = 0; - - if (FAILED(hr = NextToken(szValue))) - return hr; - if (!VTFromRegType(szValue, vt)) - { - ATLTRACE(atlTraceRegistrar, 0, _T("%s Type not supported\n"), szValue); - return GenerateError(E_ATL_TYPE_NOT_SUPPORTED); - } - - SkipWhiteSpace(); - if (FAILED(hr = NextToken(szValue))) - return hr; - - switch (vt) - { - case VT_BSTR: - { - lRes = rkParent.SetStringValue(szValueName, szValue); - ATLTRACE(atlTraceRegistrar, 2, _T("Setting Value %s at %s\n"), szValue, !szValueName ? _T("default") : szValueName); - break; - } - case VT_BSTR | VT_BYREF: - { - ATLTRACE(atlTraceRegistrar, 2, _T("Setting Value %s at %s\n"), szValue, !szValueName ? _T("default") : szValueName); - int nLen = lstrlen(szValue) + 2; //Allocate space for double null termination. - CTempBuffer pszDestValue; - //nLen should be >= the max size of the target buffer. - ATLTRY(pszDestValue.Allocate(nLen)); - if (pszDestValue != NULL) - { - TCHAR* p = pszDestValue; - TCHAR* q = szValue; - nLen = 0; - while (*q != _T('\0')) - { - TCHAR* r = CharNext(q); - if (*q == _T('\\') && *r == _T('0')) - { - *p++ = NULL; - q = CharNext(r); - } - else - { - *p = *q; -#ifndef _UNICODE - if (IsDBCSLeadByte(*q)) - { - p++; - q++; - //Protect from Lead byte followed by the zero terminator.May skip beyond the end of the string. - if (*q == _T('\0')) { break; } - *p = *q; - } -#endif - p++; - q++; - } - nLen ++; - } - //Always terminate with 2 NULLs. - *p = NULL; - p++; - *p = NULL; - lRes = rkParent.SetMultiStringValue(szValueName, pszDestValue); - } - else - { - lRes = ERROR_OUTOFMEMORY; - } - } - break; - case VT_UI4: - { - ULONG ulVal; - USES_CONVERSION_EX; - - LPOLESTR lpszV = T2OLE_EX(szValue, _ATL_SAFE_ALLOCA_DEF_THRESHOLD); - #ifndef _UNICODE - if(lpszV == NULL) - return E_OUTOFMEMORY; - #endif - VarUI4FromStr(lpszV, 0, 0, &ulVal); - - lRes = rkParent.SetDWORDValue(szValueName, ulVal); - ATLTRACE(atlTraceRegistrar, 2, _T("Setting Value %d at %s\n"), ulVal, !szValueName ? _T("default") : szValueName); - break; - } - case VT_UI1: - { - int cbValue = lstrlen(szValue); - if (cbValue & 0x00000001) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Binary Data does not fall on BYTE boundries\n")); - return E_FAIL; - } - int cbValDiv2 = cbValue/2; - CTempBuffer rgBinary; - ATLTRY(rgBinary.Allocate(cbValDiv2)); - if (rgBinary == NULL) - return E_FAIL; - memset(rgBinary, 0, cbValDiv2); - for (int irg = 0; irg < cbValue; irg++) - rgBinary[(irg/2)] |= (ChToByte(szValue[irg])) << (4*(1 - (irg & 0x00000001))); - lRes = RegSetValueEx(rkParent, szValueName, 0, REG_BINARY, rgBinary, cbValDiv2); - break; - } - } - - if (ERROR_SUCCESS != lRes) - { - nIDRes = E_ATL_VALUE_SET_FAILED; - return AtlHresultFromWin32(lRes); - } - - if (FAILED(hr = NextToken(szToken))) - return hr; - - return S_OK; -} - -inline BOOL CRegParser::CanForceRemoveKey(LPCTSTR szKey) -{ - for (int iNoDel = 0; iNoDel < cbNeverDelete; iNoDel++) - if (!lstrcmpi(szKey, rgszNeverDelete[iNoDel])) - return FALSE; // We cannot delete it - - return TRUE; -} - -inline BOOL CRegParser::HasSubKeys(HKEY hkey) -{ - DWORD cbSubKeys = 0; - - if (RegQueryInfoKey(hkey, NULL, NULL, NULL, - &cbSubKeys, NULL, NULL, - NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Should not be here!!\n")); - ATLASSERT(FALSE); - return FALSE; - } - - return cbSubKeys > 0; -} - -inline BOOL CRegParser::HasValues(HKEY hkey) -{ - DWORD cbValues = 0; - - LONG lResult = RegQueryInfoKey(hkey, NULL, NULL, NULL, - NULL, NULL, NULL, - &cbValues, NULL, NULL, NULL, NULL); - if (ERROR_SUCCESS != lResult) - { - ATLTRACE(atlTraceRegistrar, 0, _T("RegQueryInfoKey Failed ")); - ATLASSERT(FALSE); - return FALSE; - } - - if (1 == cbValues) - { - DWORD cbMaxName= MAX_VALUE; - TCHAR szValueName[MAX_VALUE]; - // Check to see if the Value is default or named - lResult = RegEnumValue(hkey, 0, szValueName, &cbMaxName, NULL, NULL, NULL, NULL); - if (ERROR_SUCCESS == lResult && (szValueName[0] != NULL)) - return TRUE; // Named Value means we have a value - return FALSE; - } - - return cbValues > 0; // More than 1 means we have a non-default value -} - -inline HRESULT CRegParser::SkipAssignment(__inout_ecount_z(MAX_VALUE_VALUE) LPTSTR szToken) -{ - HRESULT hr; - TCHAR szValue[MAX_VALUE]; - - if (*szToken == chEquals) - { - if (FAILED(hr = NextToken(szToken))) - return hr; - // Skip assignment - SkipWhiteSpace(); - if (FAILED(hr = NextToken(szValue))) - return hr; - if (FAILED(hr = NextToken(szToken))) - return hr; - } - - return S_OK; -} - -inline HRESULT CRegParser::PreProcessBuffer(__in_z LPTSTR lpszReg, __deref_out_z LPTSTR* ppszReg) -{ - ATLASSERT(lpszReg != NULL); - ATLASSERT(ppszReg != NULL); - - if (lpszReg == NULL || ppszReg == NULL) - return E_POINTER; - - *ppszReg = NULL; - int nSize = lstrlen(lpszReg)*2; - CParseBuffer pb(nSize); - if (pb.p == NULL) - return E_OUTOFMEMORY; - m_pchCur = lpszReg; - HRESULT hr = S_OK; - - while (*m_pchCur != NULL) // look for end - { - if (*m_pchCur == _T('%')) - { - m_pchCur = CharNext(m_pchCur); - if (*m_pchCur == _T('%')) - { - if (!pb.AddChar(m_pchCur)) - { - hr = E_OUTOFMEMORY; - break; - } - } - else - { - LPTSTR lpszNext = StrChr(m_pchCur, _T('%')); - if (lpszNext == NULL) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Error no closing %% found\n")); - hr = GenerateError(E_ATL_UNEXPECTED_EOS); - break; - } - if ((lpszNext-m_pchCur) > 31) - { - hr = E_FAIL; - break; - } - int nLength = int(lpszNext - m_pchCur); - TCHAR buf[32]; - Checked::tcsncpy_s(buf, _countof(buf), m_pchCur, nLength); - LPCOLESTR lpszVar = m_pRegObj->StrFromMap(buf); - if (lpszVar == NULL) - { - hr = GenerateError(E_ATL_NOT_IN_MAP); - break; - } - if (!pb.AddString(lpszVar)) - { - hr = E_OUTOFMEMORY; - break; - } - - while (m_pchCur != lpszNext) - m_pchCur = CharNext(m_pchCur); - } - } - else - { - if (!pb.AddChar(m_pchCur)) - { - hr = E_OUTOFMEMORY; - break; - } - } - - m_pchCur = CharNext(m_pchCur); - } - if (SUCCEEDED(hr)) - *ppszReg = pb.Detach(); - return hr; -} - -inline HRESULT CRegParser::RegisterBuffer(__in_z LPTSTR szBuffer, __in BOOL bRegister) -{ - TCHAR szToken[MAX_VALUE]; - HRESULT hr = S_OK; - - LPTSTR szReg = NULL; - hr = PreProcessBuffer(szBuffer, &szReg); - if (FAILED(hr)) - return hr; - - ATLTRACE(atlTraceRegistrar, 0, _T("%s\n"), szReg); - - m_pchCur = szReg; - - // Preprocess szReg - - while (NULL != *m_pchCur) - { - if (FAILED(hr = NextToken(szToken))) - break; - HKEY hkBase; - if ((hkBase = HKeyFromString(szToken)) == NULL) - { - ATLTRACE(atlTraceRegistrar, 0, _T("HKeyFromString failed on %s\n"), szToken); - hr = GenerateError(E_ATL_BAD_HKEY); - break; - } - - if (FAILED(hr = NextToken(szToken))) - break; - - if (chLeftBracket != *szToken) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Syntax error, expecting a {, found a %s\n"), szToken); - hr = GenerateError(E_ATL_MISSING_OPENKEY_TOKEN); - break; - } - if (bRegister) - { - LPTSTR szRegAtRegister = m_pchCur; - hr = RegisterSubkeys(szToken, hkBase, bRegister); - if (FAILED(hr)) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Failed to register, cleaning up!\n")); - m_pchCur = szRegAtRegister; - RegisterSubkeys(szToken, hkBase, FALSE); - break; - } - } - else - { - if (FAILED(hr = RegisterSubkeys(szToken, hkBase, bRegister))) - break; - } - - SkipWhiteSpace(); - } - CoTaskMemFree(szReg); - return hr; -} - -inline HRESULT CRegParser::RegisterSubkeys(__out_ecount_z(MAX_VALUE_VALUE) LPTSTR szToken, __in HKEY hkParent, __in BOOL bRegister, __in BOOL bRecover) -{ - CRegKey keyCur; - LONG lRes; - TCHAR szKey[_MAX_PATH]; - BOOL bDelete = TRUE; - BOOL bInRecovery = bRecover; - HRESULT hr = S_OK; - - ATLTRACE(atlTraceRegistrar, 2, _T("Num Els = %d\n"), cbNeverDelete); - if (FAILED(hr = NextToken(szToken))) - return hr; - - - while (*szToken != chRightBracket) // Continue till we see a } - { - - - bDelete = TRUE; - BOOL bTokenDelete = !lstrcmpi(szToken, szDelete); - - if (!lstrcmpi(szToken, szForceRemove) || bTokenDelete) - { - if (FAILED(hr = NextToken(szToken))) - break; - - if (bRegister) - { - CRegKey rkForceRemove; - - if (StrChr(szToken, chDirSep) != NULL) - return GenerateError(E_ATL_COMPOUND_KEY); - - if (CanForceRemoveKey(szToken)) - { - rkForceRemove.Attach(hkParent); - // Error not returned. We will overwrite the values any way. - rkForceRemove.RecurseDeleteKey(szToken); - rkForceRemove.Detach(); - } - if (bTokenDelete) - { - if (FAILED(hr = NextToken(szToken))) - break; - if (FAILED(hr = SkipAssignment(szToken))) - break; - goto EndCheck; - } - } - - } - - if (!lstrcmpi(szToken, szNoRemove)) - { - bDelete = FALSE; // set even for register - if (FAILED(hr = NextToken(szToken))) - break; - } - - if (!lstrcmpi(szToken, szValToken)) // need to add a value to hkParent - { - TCHAR szValueName[MAX_VALUE]; - - if (FAILED(hr = NextToken(szValueName))) - break; - if (FAILED(hr = NextToken(szToken))) - break; - - if (*szToken != chEquals) - return GenerateError(E_ATL_EXPECTING_EQUAL); - - if (bRegister) - { - CRegKey rk; - - rk.Attach(hkParent); - hr = AddValue(rk, szValueName, szToken); - rk.Detach(); - - if (FAILED(hr)) - return hr; - - goto EndCheck; - } - else - { - if (!bRecover && bDelete) - { - ATLTRACE(atlTraceRegistrar, 1, _T("Deleting %s\n"), szValueName); - // We have to open the key for write to be able to delete. - CRegKey rkParent; - lRes = rkParent.Open(hkParent, NULL, KEY_WRITE); - if (lRes == ERROR_SUCCESS) - { - lRes = rkParent.DeleteValue(szValueName); - if (lRes != ERROR_SUCCESS && lRes != ERROR_FILE_NOT_FOUND) - { - // Key not present is not an error - hr = AtlHresultFromWin32(lRes); - break; - } - } - else - { - hr = AtlHresultFromWin32(lRes); - break; - } - } - if (FAILED(hr = SkipAssignment(szToken))) - break; - continue; // can never have a subkey - } - } - - if (StrChr(szToken, chDirSep) != NULL) - return GenerateError(E_ATL_COMPOUND_KEY); - - if (bRegister) - { - lRes = keyCur.Open(hkParent, szToken, KEY_READ | KEY_WRITE); - if (ERROR_SUCCESS != lRes) - { - // Failed all access try read only - lRes = keyCur.Open(hkParent, szToken, KEY_READ); - if (ERROR_SUCCESS != lRes) - { - // Finally try creating it - ATLTRACE(atlTraceRegistrar, 2, _T("Creating key %s\n"), szToken); - lRes = keyCur.Create(hkParent, szToken, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE); - if (lRes != ERROR_SUCCESS) - return AtlHresultFromWin32(lRes); - } - } - - if (FAILED(hr = NextToken(szToken))) - break; - - - if (*szToken == chEquals) - { - if (FAILED(hr = AddValue(keyCur, NULL, szToken))) // NULL == default - break; - } - } - else //Unregister - { - if (!bRecover) - { - lRes = keyCur.Open(hkParent, szToken, KEY_READ); - - } - else - lRes = ERROR_FILE_NOT_FOUND; - - - // Open failed set recovery mode - if (lRes != ERROR_SUCCESS) - bRecover = true; - - // TRACE out Key open status and if in recovery mode -#ifdef _DEBUG - if (!bRecover) - ATLTRACE(atlTraceRegistrar, 1, _T("Opened Key %s\n"), szToken); - else - ATLTRACE(atlTraceRegistrar, 0, _T("Ignoring Open key on %s : In Recovery mode\n"), szToken); -#endif //_DEBUG - - // Remember Subkey - Checked::tcsncpy_s(szKey, _countof(szKey), szToken, _TRUNCATE); - - if (FAILED(hr = NextToken(szToken))) - break; - if (FAILED(hr = SkipAssignment(szToken))) - break; - - if (*szToken == chLeftBracket && lstrlen(szToken) == 1) - { - hr = RegisterSubkeys(szToken, keyCur.m_hKey, bRegister, bRecover); - // In recover mode ignore error - if (FAILED(hr) && !bRecover) - break; - // Skip the } - if (FAILED(hr = NextToken(szToken))) - break; - } - -#ifdef _DEBUG - if (bRecover != bInRecovery) - ATLTRACE(atlTraceRegistrar, 0, _T("Ending Recovery Mode\n")); -#endif - bRecover = bInRecovery; - - if (lRes == ERROR_FILE_NOT_FOUND) - // Key already not present so not an error. - continue; - - if (lRes != ERROR_SUCCESS) - { - // We are recovery mode continue on errors else break - if (bRecover) - continue; - else - { - hr = AtlHresultFromWin32(lRes); - break; - } - } - - // If in recovery mode - if (bRecover && HasSubKeys(keyCur)) - { - // See if the KEY is in the NeverDelete list and if so, don't - if (CanForceRemoveKey(szKey) && bDelete) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Deleting non-empty subkey %s by force\n"), szKey); - // Error not returned since we are in recovery mode. The error that caused recovery mode is returned - keyCur.RecurseDeleteKey(szKey); - } - continue; - } - - BOOL bHasSubKeys=HasSubKeys(keyCur); - lRes = keyCur.Close(); - if (lRes != ERROR_SUCCESS) - return AtlHresultFromWin32(lRes); - - if (bDelete&& !bHasSubKeys) - { - ATLTRACE(atlTraceRegistrar, 0, _T("Deleting Key %s\n"), szKey); - CRegKey rkParent; - rkParent.Attach(hkParent); - lRes = rkParent.DeleteSubKey(szKey); - rkParent.Detach(); - if (lRes != ERROR_SUCCESS) - { - - hr = AtlHresultFromWin32(lRes); - break; - } - } - - - - - } - -EndCheck: - - if (bRegister) - { - if (*szToken == chLeftBracket && lstrlen(szToken) == 1) - { - if (FAILED(hr = RegisterSubkeys(szToken, keyCur.m_hKey, bRegister, FALSE))) - break; - if (FAILED(hr = NextToken(szToken))) - break; - } - } - } - - return hr; -} - -}; //namespace ATL - -#pragma pack(pop) -#pragma warning(pop) - -#endif //__STATREG_H__ - diff --git a/cpp/jacob/lib/atls.lib b/cpp/jacob/lib/atls.lib deleted file mode 100644 index 48cd9c0a63b331f2b5da88ec4be3695929525a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3030360 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

pF1ZQ5*Lhiv_*lW9M8ubIJK%y6a7S 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 z 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

  • 3BSd$Dt?ZhyCOM9Ed&tcj6 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%0AT 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

    RkK(d)tm4Klt}M|CMvm4}O`}o7+&}yt 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±GPPfTXSwnJu<&>}U?qjU)` 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 F?>dYv|bAO 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%0DbAZ}lSI`g-j&G)RwinmWx4Aeg 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
    $1~- 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 od8}#BsQGMRQg^y?%4 zj(^rMQts-^y>suKIp^Ga&bjBD*>~T$|L<@9{NaCyw(_{RLwt1opt!TCzYlGKECWJ( z3=Q6Ybp85uyHf}>ZVo{t2_8PFx;i_XzRDaDCvpoR(ebhVZF4v*UbU93Y zS9?W0r5)#1fv z5x^G##{iE4jsv~~I01MJ@MXYBz!1O(@B_XA2mrW0AwU=~42S@t0OB}>dK7RPFa|gS z7zaEKcmgm1P&6mdP6ASZNx)YD96RUKPdfD!>ZbtHfEmEkfD3?GfO;3}_VP`PXPr6E zqW-qi)==l1cKb7XasStUz5UX)jfvPxufFp9XyRAzfs`$kg#?y2dqZq%XkUORFQQ&{ zR9hE$2=)>b%|Km7OBV&y8s^a8)S-5qp9d_UHxDzALz{|N5HXmARc!gZ_#nFW;&*)? z9{uHOFTeG6@`V*8^3BV%CE7Xp{RAca))m?ULNswYJ6F@Iwd{rRVs^P|F6en{scu;1 zCB0DAvR1WTSO~3h-(Qrry)8N6cd8s!Tw3S+(obW z>EBRyS<=9>j63pNLz^~O2VO6{^ZBFTpEi#6(kp)2-UBqcC`n+;K?O>Z^QyRrHL!qv z9{t^T=ktTWPrS6bUh&g!p)iuhh!9vQf6y{4=DqhMv5B^1N*5RX#UsnN^*9-XnEyuh~C9&MUje zbQ7D3WoJPWreVO2V7G{}pGzbK?;wx+0bW>mwr{tnP29=zMLgWQV`K?>v;vLd>ASfo zJG6OZYdw^vR{%C2wpUw%P0?WA2H{bZVdbdNgYarr#VPnGkAb2o^ye|l#E6N5j(&JX zTA@0gG;qg5ur7~F6L&%QJbpkHcuc%`N!rK}+@FIbNuegEyr&g0FkZyH5SLvkYqvjf zP^07NMOZ}>lrSdfWQR_`{?M1BKj_u|@Vux3SlaQ^|EKNsdIB5=e)^h>Q@!G+?Nk15 zJAUp|1?xQv?(3kk+c`k|#7iCWil4D^ybl)?cl>MEJ)X#hJ<;U~{1Pv5v$#xa>85|G zI`&>NDesm-zbmzKl(xKUCw(n1>T=_3W0zU(!-vEO+>w6qT3_;X0KfH-;YcEODi!ku zN1`d;a5OgJi-%$nUnCNW29lGJXm~V!X+ye!{+0YHJ;jYJ`Hr(zAy!=V&u?t3Cj+T= z`J007(W)>HaM95PQ#|Kt1BSLCf1kl}q@5*c$A5GC(@aV0S`I`17-upj^(z0L!(65R zv^Vtls?d5`+=f1=%!D1j(B9G((l>0jh^M!~f3yB2@!mWv4TB=SxtY@$jL|3UJD zKm9r8<-GEL6m!Sv1fv9FkwnxN4@X9Q!>Qq*Z!{ha_`>06WHb~?gkqu4rC0Y(GSe}C zetFpz%jeaCIb*wcbB1g($esqwn7IZr5Jn;dKD|!Pj~-AeTzs+t~5Nix%hYJ|1i!nAiv7TvHh$f zXe-J1i|c7;0ypDk5B$$QewQ2oc=dlqFt_3a2-AqM7N9|l)!Ti%478(LVg8fmk};iE z{4vZ`@ks*QQW;pJlDegFl`8#ZTsrAO0YJMZLSd z?l#Z;Q=YpNQVa+SfZaSD$2-`uX1@3>YN3brXBL@`7<_{~v}+l-m~UR`AwHfSOTalV z^_W`Kz)c^}Xv5vAZ)rSLhsCgN{2!x=w{<#$k$>2c{$)VVV4K#1OwR@X|B#U^b4p(I z|7)1L;$Z0X|BobWgUVC85k&h(XPoD`SNznyYZQ8vIQGkg{&SV9sJ+@<`)S(Ut*<|G zZzr4=^zwtft=aUedUd*IQ>VIbH|7Wu}Ip_m2 zie*&R%>&v_{4s}hRQdN#_Ln{>qlHd|_?gdE+t_KY8v6zs-*axd;SZ~aTx!~Xg`2g@ zw3hB~;qHe{PdEHbA$BU{pWDx~-7Eg@VD1k9EX%!<-jhu V{~lig5zPzel?h4x?aNMA;D531M*;u< diff --git a/cpp/jacob/msvc/jacob.vcxproj b/cpp/jacob/msvc/jacob.vcxproj deleted file mode 100644 index 8c3a22c..0000000 --- a/cpp/jacob/msvc/jacob.vcxproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {745CA8EA-176E-46A7-B2A5-55260DF5639B} - Win32Proj - jacob - - - - DynamicLibrary - true - Unicode - - - DynamicLibrary - false - true - Unicode - - - - - - - - - - - - - true - - - false - ..\include;C:\Program Files %28x86%29\Java\jdk1.6.0_23\include;C:\Program Files %28x86%29\Java\jdk1.6.0_23\include\win32;$(IncludePath) - ..\lib;$(LibraryPath) - - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;JACOB_EXPORTS;%(PreprocessorDefinitions) - - - Windows - true - - - - - Level3 - NotUsing - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;JACOB_EXPORTS;%(PreprocessorDefinitions) - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cpp/jacob/msvc/jacob.vcxproj.filters b/cpp/jacob/msvc/jacob.vcxproj.filters deleted file mode 100644 index 5729cab..0000000 --- a/cpp/jacob/msvc/jacob.vcxproj.filters +++ /dev/null @@ -1,87 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/cpp/jacob/msvc/jacob.vcxproj.user b/cpp/jacob/msvc/jacob.vcxproj.user deleted file mode 100644 index 695b5c7..0000000 --- a/cpp/jacob/msvc/jacob.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/cpp/jacob/util.cpp b/cpp/jacob/util.cpp deleted file mode 100644 index b0f6c19..0000000 --- a/cpp/jacob/util.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "Dispatch.h" -// Win32 support for Ole Automation -#include -#include -#include -#include -#include -#include -#include "util.h" - -extern "C" -{ - -void ThrowComFail(JNIEnv *env, const char* desc, jint hr) -{ - jclass failClass = env->FindClass("com/jacob/com/ComFailException"); - // call the constructor that takes hr and message - jmethodID failCons = - env->GetMethodID(failClass, "", "(ILjava/lang/String;)V"); - if (!desc) { - desc = "Java/COM Error"; - } - jstring js = env->NewStringUTF(desc); - jthrowable fail = (jthrowable)env->NewObject(failClass, failCons, hr, js); - env->Throw(fail); -} - -void ThrowComFailUnicode(JNIEnv *env, const wchar_t* desc, jint hr) -{ - if (!desc) { - ThrowComFail(env, "Java/COM Error", hr); - } - jclass failClass = env->FindClass("com/jacob/com/ComFailException"); - // call the constructor that takes hr and message - jmethodID failCons = - env->GetMethodID(failClass, "", "(ILjava/lang/String;)V"); - jstring js = env->NewString((const jchar *) desc, wcslen(desc)); - jthrowable fail = (jthrowable)env->NewObject(failClass, failCons, hr, js); - env->Throw(fail); -} - -// if env's are different throw on the 1st env -int CheckEnv(JNIEnv *env1, JNIEnv *env2) -{ - if (env1 != env2) { - jclass failClass = env1->FindClass("com/jacob/com/WrongThreadException"); - // call the constructor that takes hr and message - jmethodID failCons = - env1->GetMethodID(failClass, "", "()V"); - env1->ThrowNew(failClass, "Wrong Thread"); - return 0; - } - return 1; -} - -} diff --git a/cpp/jacob/util.h b/cpp/jacob/util.h deleted file mode 100644 index 5835154..0000000 --- a/cpp/jacob/util.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 1999-2004 Sourceforge JACOB Project. - * All rights reserved. Originator: Dan Adler (http://danadler.com). - * Get more information about JACOB at http://sourceforge.net/projects/jacob-project - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -extern "C" { - VARIANT *extractVariant(JNIEnv *env, jobject arg); - void ThrowComFail(JNIEnv *env, const char* desc, jint hr); - void ThrowComFailUnicode(JNIEnv *env, const wchar_t* desc, jint hr); - IDispatch *extractDispatch(JNIEnv *env, jobject arg); - SAFEARRAY *extractSA(JNIEnv *env, jobject arg); - void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy); - SAFEARRAY *copySA(SAFEARRAY *psa); -} diff --git a/cpp/jintellitype/JIntellitype.cpp b/cpp/jintellitype/JIntellitype.cpp deleted file mode 100644 index 3481412..0000000 --- a/cpp/jintellitype/JIntellitype.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - JIntellitype (http://www.melloware.com/) - Java JNI API for Windows Intellitype commands and global keystrokes. - - Copyright (C) 1999, 2008 Emil A. Lefkof III, info@melloware.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Compiled with Mingw port of GCC, - Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html) -*/ -#include "stdafx.h" -#include "com_melloware_jintellitype_JIntellitype.h" -#include "JIntellitypeHandler.h" - -HINSTANCE g_instance = NULL; - - -BOOL WINAPI DllMain -( - HINSTANCE hinstDLL, // handle to DLL module - DWORD fdwReason, // reason for calling function - LPVOID lpvReserved // reserved -) -{ - switch( fdwReason ) - { - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - - case DLL_PROCESS_ATTACH: - g_instance = hinstDLL; - - break; - } - return TRUE; -} - - -extern "C" -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: initializeLibrary - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_melloware_jintellitype_JIntellitype_initializeLibrary - (JNIEnv *env, jobject object) -{ - // Get handler - JIntellitypeHandler *l_handler = JIntellitypeHandler::extract( env, object ); - - // Create our handler - l_handler = new JIntellitypeHandler( env, object ); - - // Enable it - if( l_handler ) - l_handler->initialize(env, g_instance); -} - -extern "C" -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: regHotKey - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_com_melloware_jintellitype_JIntellitype_regHotKey - (JNIEnv *env, jobject object, jint identifier, jint modifier, jint keycode) -{ - // Get handler - JIntellitypeHandler *l_handler = JIntellitypeHandler::extract( env, object ); - - if( l_handler ) - { - l_handler->regHotKey(identifier, modifier, keycode); - } - else - { - // throw exception - jclass JIntellitypeException = env->FindClass("com/melloware/jintellitype/JIntellitypeException"); - env->ThrowNew(JIntellitypeException,"JIntellitype was not initialized properly."); - } -} - -extern "C" -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: unregHotKey - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_melloware_jintellitype_JIntellitype_unregHotKey - (JNIEnv *env, jobject object, jint identifier) -{ - // Get handler - JIntellitypeHandler *l_handler = JIntellitypeHandler::extract( env, object ); - - if( l_handler ) - { - l_handler->unregHotKey(identifier); - } - else - { - // throw exception - jclass JIntellitypeException = env->FindClass("com/melloware/jintellitype/JIntellitypeException"); - env->ThrowNew(JIntellitypeException,"JIntellitype was not initialized properly."); - } - -} - -extern "C" -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: terminate - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_melloware_jintellitype_JIntellitype_terminate - (JNIEnv *env, jobject object) -{ - // Get handler - JIntellitypeHandler *l_handler = JIntellitypeHandler::extract( env, object ); - - // Clean up all resources allocated by this API - if( l_handler ) - l_handler->terminate(); - -} - -extern "C" -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: isRunning - * Signature: (Ljava/lang/String;)Z - */ -JNIEXPORT jboolean JNICALL Java_com_melloware_jintellitype_JIntellitype_isRunning - (JNIEnv *env, jclass, jstring wndName) -{ - // App name for the hidden window's registered class - CHAR szAppName[] = "SunAwtFrame"; - const char *cWndName = env->GetStringUTFChars(wndName, 0); - // Find out if there's a hidden window with the given title - HWND mHwnd = FindWindow((LPCWSTR)szAppName, (LPCWSTR)cWndName); - env->ReleaseStringUTFChars(wndName, cWndName); - // If there is, another instance of our app is already running - return mHwnd != NULL; -} - diff --git a/cpp/jintellitype/JIntellitypeHandler.cpp b/cpp/jintellitype/JIntellitypeHandler.cpp deleted file mode 100644 index b937c10..0000000 --- a/cpp/jintellitype/JIntellitypeHandler.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/* - JIntellitype (http://www.melloware.com/) - Java JNI API for Windows Intellitype commands and global keystrokes. - - Copyright (C) 1999, 2008 Emil A. Lefkof III, info@melloware.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Compiled with Mingw port of GCC, - Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html) -*/ -#include "stdafx.h" -#include "JIntellitypeHandler.h" -#include "JIntellitypeThread.h" -#include - - -UINT WM_SHELLHOOK = 0; - -/* - * Extract the unique handlerID from the java object - */ -JIntellitypeHandler *JIntellitypeHandler::extract( JNIEnv *env, jobject object ) -{ - // Get field ID - jfieldID l_handlerId = env->GetFieldID( env->GetObjectClass( object ), "handler", "I" ); - - // Get field - JIntellitypeHandler *l_handler = (JIntellitypeHandler *) env->GetIntField( object, l_handlerId ); - - return l_handler; -} - -/* - * Constructor - */ -JIntellitypeHandler::JIntellitypeHandler( JNIEnv *env, jobject object ) -{ - m_window = NULL; - - // Reference object - m_object = env->NewGlobalRef(object ); - - // Get method IDs - m_fireHotKey = env->GetMethodID( env->GetObjectClass( m_object ) , "onHotKey", "(I)V" ); - m_fireIntellitype = env->GetMethodID( env->GetObjectClass( m_object ) , "onIntellitype", "(I)V" ); - - // Get field ID - jfieldID l_handlerId = env->GetFieldID( env->GetObjectClass( m_object ) , "handler", "I" ); - - // Set field - env->SetIntField( m_object, l_handlerId, (jint) this ); -} - -/* - * Destructor - */ -JIntellitypeHandler::~JIntellitypeHandler() -{ - // Get field ID - jfieldID l_handlerId = g_JIntellitypeThread.m_env->GetFieldID( g_JIntellitypeThread.m_env->GetObjectClass( m_object ), "handler", "I" ); - - // Set field - g_JIntellitypeThread.m_env->SetIntField( m_object, l_handlerId, 0 ); - - // Release our reference - g_JIntellitypeThread.m_env->DeleteGlobalRef( m_object ); - - // unregister the shell hook - DeregisterShellHookWindow( m_window ); - - // Destroy window - DestroyWindow( m_window ); -} - - -/* - * Perform initialization of the object and thread. - */ -void JIntellitypeHandler::initialize( JNIEnv *env, HINSTANCE instance ) -{ - m_instance = instance; - g_JIntellitypeThread.MakeSureThreadIsUp( env ); - while( !PostThreadMessage( g_JIntellitypeThread, WM_JINTELLITYPE, INITIALIZE_CODE, (LPARAM) this ) ) - Sleep( 0 ); -} - -/* - * Callback method that creates the hidden window on initialization to receive - * any WM_HOTKEY messages and process them. - */ -void JIntellitypeHandler::doInitialize() -{ - // Register window class - WNDCLASSEX l_Class; - l_Class.cbSize = sizeof( l_Class ); - l_Class.style = CS_HREDRAW | CS_VREDRAW; - l_Class.lpszClassName = TEXT( "JIntellitypeHandlerClass" ); - l_Class.lpfnWndProc = WndProc; - l_Class.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - l_Class.hCursor = NULL; - l_Class.hIcon = NULL; - l_Class.hIconSm = NULL; - l_Class.lpszMenuName = NULL; - l_Class.cbClsExtra = 0; - l_Class.cbWndExtra = 0; - l_Class.hInstance = m_instance; - - if( !RegisterClassEx( &l_Class ) ) - return; - - // Create window - m_window = CreateWindow - ( - TEXT( "JIntellitypeHandlerClass" ), - TEXT( "JIntellitypeHandler" ), - WS_OVERLAPPEDWINDOW, - 0, 0, 0, 0, - NULL, - NULL, - m_instance, - NULL - ); - - if( !m_window ) - return; - - //Set pointer to this object inside the Window's USERDATA section - SetWindowLong( m_window, GWL_USERDATA, (LONG) this ); - - // hide the window - ShowWindow(m_window, SW_HIDE); - UpdateWindow(m_window); - - //register this window as a shell hook to intercept WM_APPCOMMAND messages - WM_SHELLHOOK = RegisterWindowMessage(TEXT("SHELLHOOK")); - BOOL (__stdcall *RegisterShellHookWindow)(HWND) = NULL; - RegisterShellHookWindow = (BOOL (__stdcall *)(HWND))GetProcAddress(GetModuleHandle((LPCWSTR)"USER32.DLL"), "RegisterShellHookWindow"); - - //make sure it worked - if (!RegisterShellHookWindow(m_window)) { - // throw exception - jclass JIntellitypeException = g_JIntellitypeThread.m_env->FindClass("com/melloware/jintellitype/JIntellitypeException"); - g_JIntellitypeThread.m_env->ThrowNew(JIntellitypeException,"Could not register window as a shell hook window."); - } -} - -/* - * Registers a hotkey. - * identifier - unique identifier assigned to this key comination - * modifier - ALT, SHIFT, CTRL, WIN or combination of - * keycode- Ascii keycode, 65 for A, 66 for B etc - */ -void JIntellitypeHandler::regHotKey( jint identifier, jint modifier, jint keycode ) -{ - JIntellitypeHandlerCallback *callback = (JIntellitypeHandlerCallback*) malloc(sizeof(JIntellitypeHandlerCallback)); - callback->identifier = identifier; - callback->modifier = modifier; - callback->keycode = keycode; - callback->handler = this; - PostThreadMessage( g_JIntellitypeThread, WM_JINTELLITYPE, REGISTER_HOTKEY_CODE, (LPARAM) callback ); -} - -/* - * Actually registers the hotkey using the Win32API RegisterHotKey call. - */ -void JIntellitypeHandler::doRegHotKey(LPARAM callback_) -{ - JIntellitypeHandlerCallback *callback = (JIntellitypeHandlerCallback*) callback_; - RegisterHotKey(m_window, callback->identifier, callback->modifier, callback->keycode); - free(callback); -} - -/* - * Unregisters a previously assigned hotkey. - * identifier - unique identifier assigned to this key comination - */ -void JIntellitypeHandler::unregHotKey( jint identifier ) -{ - JIntellitypeHandlerCallback *callback = (JIntellitypeHandlerCallback*) malloc(sizeof(JIntellitypeHandlerCallback)); - callback->identifier = identifier; - callback->handler = this; - PostThreadMessage( g_JIntellitypeThread, WM_JINTELLITYPE, UNREGISTER_HOTKEY_CODE, (LPARAM) callback ); -} - -/* - * Actually unregisters the hotkey using the Win32API UnregisterHotKey call. - */ -void JIntellitypeHandler::doUnregisterHotKey(LPARAM callback_) -{ - JIntellitypeHandlerCallback *callback = (JIntellitypeHandlerCallback*) callback_; - UnregisterHotKey(m_window, callback->identifier); - free(callback); -} - -/* - * When an intellitype command is recieved by the JFrame this method is called - * to perform a callback to the Intellitype java listeners. - * commandId - the unique command Id from the WM_APPCOMMAND listings - */ -void JIntellitypeHandler::intellitype( jint commandId ) -{ - JIntellitypeHandlerCallback *callback = (JIntellitypeHandlerCallback*) malloc(sizeof(JIntellitypeHandlerCallback)); - callback->command = commandId; - callback->handler = this; - PostThreadMessage( g_JIntellitypeThread, WM_JINTELLITYPE, INTELLITYPE_CODE, (LPARAM) callback ); -} - -/* - * Call the correct JVM with the intellitype command for the listeners listening. - */ -void JIntellitypeHandler::doIntellitype(LPARAM callback_) -{ - JIntellitypeHandlerCallback *callback = (JIntellitypeHandlerCallback*) callback_; - g_JIntellitypeThread.m_env->CallVoidMethod(m_object, m_fireIntellitype, callback->command); - free(callback); -} - -/* - * Cleans up resources allocated by JIntellitype. - */ -void JIntellitypeHandler::terminate() -{ - PostThreadMessage( g_JIntellitypeThread, WM_JINTELLITYPE, TERMINATE_CODE, (LPARAM) this ); -} - -/* - * Callback method to send hotkey to the Java HotKeyListeners registered. - */ -void JIntellitypeHandler::fireHotKey(jint hotkeyId) -{ - g_JIntellitypeThread.m_env->CallVoidMethod(m_object, m_fireHotKey, hotkeyId); -} - - -/* - * WndProc method registered to the hidden window to listen for WM_HOTKEY - * messages and send them back to the Java listeners. - */ -LRESULT CALLBACK JIntellitypeHandler::WndProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ) -{ - - // check for Intellitype messages and if found send them to Intellitype listeners - if (uMessage == WM_SHELLHOOK) { - if (wParam == HSHELL_APPCOMMAND) { - jint cmd = GET_APPCOMMAND_LPARAM(lParam); - JIntellitypeHandler *l_this = (JIntellitypeHandler *) GetWindowLong( hWnd, GWL_USERDATA ); - l_this->intellitype(cmd); - } - return TRUE; - } - - // check for registered hotkey messages and send them to HotKeyListeners - switch( uMessage ) { - case WM_HOTKEY: { - JIntellitypeHandler *l_this = (JIntellitypeHandler *) GetWindowLong( hWnd, GWL_USERDATA ); - l_this->fireHotKey(wParam); - return TRUE; - break; - } - default: - return DefWindowProc( hWnd, uMessage, wParam, lParam ); - } - -} - - - diff --git a/cpp/jintellitype/JIntellitypeHandler.h b/cpp/jintellitype/JIntellitypeHandler.h deleted file mode 100644 index d003ff9..0000000 --- a/cpp/jintellitype/JIntellitypeHandler.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - JIntellitype (http://www.melloware.com/) - Java JNI API for Windows Intellitype commands and global keystrokes. - - Copyright (C) 1999, 2008 Emil A. Lefkof III, info@melloware.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Compiled with Mingw port of GCC, - Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html) -*/ -#ifndef __JIntellitypeHandler_h__ -#define __JIntellitypeHandler_h__ - -#include "JIntellitypeThread.h" - -class JIntellitypeHandler -{ - friend DWORD WINAPI JIntellitypeThread::ThreadProc( LPVOID lpParameter ); - -public: - - static JIntellitypeHandler *extract( JNIEnv *env, jobject object ); - - JIntellitypeHandler( JNIEnv *env, jobject object ); - - void initialize( JNIEnv *env, HINSTANCE instance ); - void regHotKey( jint identifier, jint modifier, jint keycode ); - void unregHotKey( jint identifier ); - void intellitype( jint commandId ); - void terminate(); - -private: - - enum - { - INITIALIZE_CODE = 1, - REGISTER_HOTKEY_CODE = 2, - UNREGISTER_HOTKEY_CODE = 3, - TERMINATE_CODE = 4, - INTELLITYPE_CODE = 5 - }; - - ~JIntellitypeHandler(); - - void createHiddenWindow(); - void doInitialize(); - void doRegHotKey(LPARAM callback); - void doUnregisterHotKey(LPARAM callback); - void doIntellitype(LPARAM callback); - void fireHotKey(jint hotkeyId); - void fireIntellitype(jint commandId); - - HINSTANCE m_instance; - HWND m_window; - jobject m_object; - jmethodID m_fireHotKey; - jmethodID m_fireIntellitype; - - static LRESULT CALLBACK WndProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ); - static DWORD WINAPI ThreadProc( LPVOID lpParameter ); -}; - -typedef struct { - JIntellitypeHandler *handler; - jint identifier; - jint modifier; - jint keycode; - jint command; -} JIntellitypeHandlerCallback; - - -#ifndef WM_APPCOMMAND -#define WM_APPCOMMAND 0x319 -#define FAPPCOMMAND_MASK 0x8000 -#define GET_APPCOMMAND_LPARAM(lParam) ((short)(HIWORD(lParam) & ~FAPPCOMMAND_MASK)) -#define HSHELL_APPCOMMAND 12 - -#endif - - -#endif diff --git a/cpp/jintellitype/JIntellitypeThread.cpp b/cpp/jintellitype/JIntellitypeThread.cpp deleted file mode 100644 index dc55048..0000000 --- a/cpp/jintellitype/JIntellitypeThread.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - JIntellitype (http://www.melloware.com/) - Java JNI API for Windows Intellitype commands and global keystrokes. - - Copyright (C) 1999, 2008 Emil A. Lefkof III, info@melloware.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Compiled with Mingw port of GCC, - Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html) -*/ -#include "stdafx.h" -#include "JIntellitypeThread.h" -#include "JIntellitypeHandler.h" - -JIntellitypeThread g_JIntellitypeThread; - - -JIntellitypeThread::JIntellitypeThread() -{ - m_env = NULL; - m_thread = 0; - m_vm = NULL; - m_handlerCount = 0; -} - - -void JIntellitypeThread::MakeSureThreadIsUp( JNIEnv *env ) -{ - if( !m_thread ) - { - // Get VM - env->GetJavaVM( &m_vm ); - - // Start "native" thread - CreateThread - ( - NULL, - 0, - ThreadProc, - this, - 0, - &m_thread - ); - } -} - - -JIntellitypeThread::operator DWORD () -{ - return m_thread; -} - - -DWORD WINAPI JIntellitypeThread::ThreadProc( LPVOID lpParameter ) -{ - JIntellitypeThread *l_this = (JIntellitypeThread *) lpParameter; - - // Attach the thread to the VM - l_this->m_vm->AttachCurrentThread( (void**) &l_this->m_env, NULL ); - - MSG msg; - while( GetMessage( &msg, NULL, 0, 0 ) ) - { - if( msg.message == WM_JINTELLITYPE ) - { - // Extract handler - JIntellitypeHandler *l_handler; - - switch( msg.wParam ) - { - case JIntellitypeHandler::INITIALIZE_CODE: - l_handler = (JIntellitypeHandler*) msg.lParam; - l_this->m_handlerCount++; - l_handler->doInitialize(); - break; - case JIntellitypeHandler::REGISTER_HOTKEY_CODE: - l_handler = ((JIntellitypeHandlerCallback*) msg.lParam)->handler; - l_handler->doRegHotKey(msg.lParam); - break; - - case JIntellitypeHandler::UNREGISTER_HOTKEY_CODE: - l_handler = ((JIntellitypeHandlerCallback*) msg.lParam)->handler; - l_handler->doUnregisterHotKey(msg.lParam); - break; - case JIntellitypeHandler::INTELLITYPE_CODE: - l_handler = ((JIntellitypeHandlerCallback*) msg.lParam)->handler; - l_handler->doIntellitype(msg.lParam); - break; - - case JIntellitypeHandler::TERMINATE_CODE: - l_handler = (JIntellitypeHandler*) msg.lParam; - - // Destroy it! - delete l_handler; - - // No more handlers? - if( !--l_this->m_handlerCount ) - { - l_this->m_thread = 0; - - // Detach thread from VM - l_this->m_vm->DetachCurrentThread(); - - // Time to die - ExitThread( 0 ); - } - break; - } - } - else - { - TranslateMessage( &msg ); - DispatchMessage( &msg ); - } - } - - // Detach thread from VM - l_this->m_vm->DetachCurrentThread(); - - return 0; -} diff --git a/cpp/jintellitype/JIntellitypeThread.h b/cpp/jintellitype/JIntellitypeThread.h deleted file mode 100644 index 10b09f9..0000000 --- a/cpp/jintellitype/JIntellitypeThread.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - JIntellitype (http://www.melloware.com/) - Java JNI API for Windows Intellitype commands and global keystrokes. - - Copyright (C) 1999, 2008 Emil A. Lefkof III, info@melloware.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Compiled with Mingw port of GCC, - Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html) -*/ -#ifndef __JIntellitypeThread_h__ -#define __JIntellitypeThread_h__ - - -class JIntellitypeThread -{ -public: - - JIntellitypeThread(); - - void MakeSureThreadIsUp( JNIEnv *env ); - - JNIEnv *m_env; - static DWORD WINAPI ThreadProc( LPVOID lpParameter ); - - operator DWORD (); - -private: - - DWORD m_thread; - JavaVM *m_vm; - int m_handlerCount; - - -}; - -extern JIntellitypeThread g_JIntellitypeThread; - - -#define WM_JINTELLITYPE (WM_USER+1) - - -#endif diff --git a/cpp/jintellitype/JIntellitype_private.h b/cpp/jintellitype/JIntellitype_private.h deleted file mode 100644 index 1c7f45e..0000000 --- a/cpp/jintellitype/JIntellitype_private.h +++ /dev/null @@ -1,23 +0,0 @@ -/* THIS FILE WILL BE OVERWRITTEN BY DEV-C++ */ -/* DO NOT EDIT ! */ - -#ifndef JINTELLITYPE_PRIVATE_H -#define JINTELLITYPE_PRIVATE_H - -/* VERSION DEFINITIONS */ -#define VER_STRING "1.0.0.465" -#define VER_MAJOR 1 -#define VER_MINOR 0 -#define VER_RELEASE 0 -#define VER_BUILD 465 -#define COMPANY_NAME "Melloware Inc (www.melloware.com)" -#define FILE_VERSION "1.0" -#define FILE_DESCRIPTION "Java JNI bridge to MS Intellitype commands" -#define INTERNAL_NAME "" -#define LEGAL_COPYRIGHT "Copyright 2006 Melloware Inc" -#define LEGAL_TRADEMARKS "Copyright 2006 Melloware Inc" -#define ORIGINAL_FILENAME "" -#define PRODUCT_NAME "JIntellitype" -#define PRODUCT_VERSION "1.0" - -#endif /*JINTELLITYPE_PRIVATE_H*/ diff --git a/cpp/jintellitype/StdAfx.cpp b/cpp/jintellitype/StdAfx.cpp deleted file mode 100644 index a10ee7b..0000000 --- a/cpp/jintellitype/StdAfx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// win32.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/cpp/jintellitype/StdAfx.h b/cpp/jintellitype/StdAfx.h deleted file mode 100644 index 7203ae8..0000000 --- a/cpp/jintellitype/StdAfx.h +++ /dev/null @@ -1,24 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__1F571525_24C2_11D3_B0CF_0000E85D9A83__INCLUDED_) -#define AFX_STDAFX_H__1F571525_24C2_11D3_B0CF_0000E85D9A83__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -// Insert your headers here -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include -#include - -#include - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__1F571525_24C2_11D3_B0CF_0000E85D9A83__INCLUDED_) diff --git a/cpp/jintellitype/com_melloware_jintellitype_JIntellitype.h b/cpp/jintellitype/com_melloware_jintellitype_JIntellitype.h deleted file mode 100644 index 2394ca6..0000000 --- a/cpp/jintellitype/com_melloware_jintellitype_JIntellitype.h +++ /dev/null @@ -1,53 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_melloware_jintellitype_JIntellitype */ - -#ifndef _Included_com_melloware_jintellitype_JIntellitype -#define _Included_com_melloware_jintellitype_JIntellitype -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: initializeLibrary - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_melloware_jintellitype_JIntellitype_initializeLibrary - (JNIEnv *, jobject); - -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: regHotKey - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_com_melloware_jintellitype_JIntellitype_regHotKey - (JNIEnv *, jobject, jint, jint, jint); - -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: terminate - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_melloware_jintellitype_JIntellitype_terminate - (JNIEnv *, jobject); - -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: unregHotKey - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_melloware_jintellitype_JIntellitype_unregHotKey - (JNIEnv *, jobject, jint); - -/* - * Class: com_melloware_jintellitype_JIntellitype - * Method: isRunning - * Signature: (Ljava/lang/String;)Z - */ -JNIEXPORT jboolean JNICALL Java_com_melloware_jintellitype_JIntellitype_isRunning - (JNIEnv *, jclass, jstring); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/jintellitype/msvc/copy.bat b/cpp/jintellitype/msvc/copy.bat deleted file mode 100644 index 3f521b0..0000000 --- a/cpp/jintellitype/msvc/copy.bat +++ /dev/null @@ -1 +0,0 @@ -copy Release\jintellitype.dll ..\..\..\java\native\ \ No newline at end of file diff --git a/cpp/jintellitype/msvc/jintellitype.sln b/cpp/jintellitype/msvc/jintellitype.sln deleted file mode 100644 index 8acae3c..0000000 --- a/cpp/jintellitype/msvc/jintellitype.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C++ Express 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jintellitype", "jintellitype.vcxproj", "{29297EB4-DE7D-4F2B-9FD7-FEB53409AA7D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {29297EB4-DE7D-4F2B-9FD7-FEB53409AA7D}.Debug|Win32.ActiveCfg = Debug|Win32 - {29297EB4-DE7D-4F2B-9FD7-FEB53409AA7D}.Debug|Win32.Build.0 = Debug|Win32 - {29297EB4-DE7D-4F2B-9FD7-FEB53409AA7D}.Release|Win32.ActiveCfg = Release|Win32 - {29297EB4-DE7D-4F2B-9FD7-FEB53409AA7D}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/cpp/jintellitype/msvc/jintellitype.suo b/cpp/jintellitype/msvc/jintellitype.suo deleted file mode 100644 index 13fcffd545df9d137675d0bef531a41b3de1cdf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 - - - - Debug - Win32 - - - Release - Win32 - - - - {29297EB4-DE7D-4F2B-9FD7-FEB53409AA7D} - Win32Proj - jintellitype - - - - DynamicLibrary - true - Unicode - - - DynamicLibrary - false - true - Unicode - - - - - - - - - - - - - true - C:\Program Files %28x86%29\Java\jdk1.6.0_23\include;C:\Program Files %28x86%29\Java\jdk1.6.0_23\include\win32;$(IncludePath) - - - false - C:\Program Files %28x86%29\Java\jdk1.6.0_23\include;C:\Program Files %28x86%29\Java\jdk1.6.0_23\include\win32;$(IncludePath) - - - - - - Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;JINTELLITYPE_EXPORTS;%(PreprocessorDefinitions) - - - Windows - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;JINTELLITYPE_EXPORTS;%(PreprocessorDefinitions) - - - Windows - true - true - true - - - copy.bat - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cpp/jintellitype/msvc/jintellitype.vcxproj.filters b/cpp/jintellitype/msvc/jintellitype.vcxproj.filters deleted file mode 100644 index 4374356..0000000 --- a/cpp/jintellitype/msvc/jintellitype.vcxproj.filters +++ /dev/null @@ -1,45 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/cpp/jintellitype/msvc/jintellitype.vcxproj.user b/cpp/jintellitype/msvc/jintellitype.vcxproj.user deleted file mode 100644 index 695b5c7..0000000 --- a/cpp/jintellitype/msvc/jintellitype.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/cpp/list/dev/copy.bat b/cpp/list/dev/copy.bat deleted file mode 100644 index cbff225..0000000 --- a/cpp/list/dev/copy.bat +++ /dev/null @@ -1 +0,0 @@ -copy list.exe ..\..\..\java\native\ \ No newline at end of file diff --git a/cpp/list/dev/copy.mak b/cpp/list/dev/copy.mak deleted file mode 100644 index 5459618..0000000 --- a/cpp/list/dev/copy.mak +++ /dev/null @@ -1,2 +0,0 @@ -all-after: - copy.bat \ No newline at end of file diff --git a/cpp/list/dev/list.dev b/cpp/list/dev/list.dev deleted file mode 100644 index b9b5046..0000000 --- a/cpp/list/dev/list.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=list.dev -Name=list -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes= -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes=copy.mak -Compiler= -CppCompiler= -Linker= -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=List.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000000000000000000000 - -[Unit1] -FileName=..\main.cpp -CompileCpp=1 -Folder= -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/cpp/list/main.cpp b/cpp/list/main.cpp deleted file mode 100644 index 95b444a..0000000 --- a/cpp/list/main.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include -#include -#include - -BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam); -BOOL GetProcessList(); - -using namespace std; - -int main(int argc, char **argv) { - if (argc == 2) { - if (*argv[1] == 'w') { - printf("handle\tpid\ttitle\n"); - EnumWindows(EnumProc, 0); - return 0; - } else if (*argv[1] == 'p') { - printf("pid\tname\n"); - GetProcessList(); - return 0; - } - } - return 1; -} - -BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam) { - DWORD processId; - GetWindowThreadProcessId(hWnd, &processId); - TCHAR title[500]; - ZeroMemory(title, sizeof(title)); - GetWindowText(hWnd, title, sizeof(title) / sizeof(title[0])); - printf("%d\t%d\t%s\n", hWnd, processId, title); - return TRUE; -} - -BOOL GetProcessList() { - HANDLE hProcessSnap; - HANDLE hProcess; - PROCESSENTRY32 pe32; - - hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if (hProcessSnap == INVALID_HANDLE_VALUE) { - return FALSE; - } - - pe32.dwSize = sizeof(PROCESSENTRY32); - if(!Process32First( hProcessSnap, &pe32 ) ) { - CloseHandle(hProcessSnap); - return FALSE; - } - - do { - hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); - if( hProcess != NULL ) { - CloseHandle( hProcess ); - } - printf("%d\t%s\n", pe32.th32ProcessID, pe32.szExeFile); - } while (Process32Next(hProcessSnap, &pe32)); - - CloseHandle( hProcessSnap ); - return TRUE; -} diff --git a/cpp/nativecall/IntCall.cpp b/cpp/nativecall/IntCall.cpp deleted file mode 100644 index ba49558..0000000 --- a/cpp/nativecall/IntCall.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/* - * IntCall.cpp - * - * Created on 11.09.2004. - * - * $Id: IntCall.cpp,v 1.3 2006/04/19 20:54:55 grnull Exp $ - * - * eaio: NativeCall - calling operating system methods from Java - * Copyright (c) 2004-2006 Johann Burkard () - * - * - * 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 - * AUTHORS OR 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. - * - */ - -#include -#include "com_eaio_nativecall_IntCall.h" - -#ifdef _WINDOWS -#include -#include -#endif - -#ifdef _WINDOWS -#ifdef _X86_ - -#define _push(x) __asm { push x }; - -#endif -#endif - -// NativeCall fields - -extern jfieldID fieldFunction, fieldModule, fieldFunctionHandle, - fieldModuleHandle, fieldLastErrorCode; - -// Holder fields - -extern jfieldID fieldHolderO; - -// Classes - -extern jclass classBoolean,/* classByte, classCharacter, classShort,*/ - classInteger, /* classLong, classFloat, classDouble,*/ classString, - classByteArray, classCharArray, /*classIntArray,*/ classHolder; - -// Wrapper class methods - -extern jmethodID methodBooleanValue,/* methodByteValue, methodCharValue, -methodShortValue,*/ methodIntValue/*, methodLongValue, methodFloatValue, -methodDoubleValue*/; - -// Constructors - -extern jmethodID newIntegerInt, newBooleanBoolean; - -/* - * Class: com_eaio_nativecall_IntCall - * Method: executeCall - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_eaio_nativecall_IntCall_executeCall -(JNIEnv *env, jobject obj) { - - jint functionHandle = env->GetIntField(obj, fieldFunctionHandle); - jint outVal; - -#ifdef _WINDOWS -#ifdef _X86_ - - __asm { - - call functionHandle - mov outVal, eax - - } - -#endif -#endif - - env->SetIntField(obj, fieldLastErrorCode, GetLastError()); - - return outVal; - -} - -/* - * Class: com_eaio_nativecall_IntCall - * Method: executeCall0 - * Signature: ([Ljava/lang/Object;)I - */ -JNIEXPORT jint JNICALL Java_com_eaio_nativecall_IntCall_executeCall0 -(JNIEnv *env, jobject obj, jobjectArray params) { - - const int len = env->GetArrayLength(params); - - int* arrays = NULL; - if (!(arrays = new int[len])) { - env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), NULL); - return 0; - } - memset(arrays, 0, (sizeof(int) * len)); - - jobject param; - - for (int i = len - 1; i >= 0; i--) { - - param = env->GetObjectArrayElement(params, i); - - if (param == NULL) { - _push(0); - } - else if (env->IsInstanceOf(param, classInteger)) { - int intArg = env->CallIntMethod(param, methodIntValue); - _push(intArg) - } - else if (env->IsInstanceOf(param, classByteArray)) { - char* byteArrayArg = (char*) env->GetPrimitiveArrayCritical((jarray) param, 0); - arrays[i] = (int) &byteArrayArg; - _push(byteArrayArg) - } - else if (env->IsInstanceOf(param, classCharArray)) { - unsigned short* charArrayArg = (unsigned short*) env->GetPrimitiveArrayCritical( - (jarray) param, 0); - arrays[i] = (int) &charArrayArg; - _push(charArrayArg) - } - else if (env->IsInstanceOf(param, classBoolean)) { - jboolean booleanArg = env->CallBooleanMethod(param, methodBooleanValue); - int tempArg = (booleanArg == JNI_FALSE ? 0 : 1); - _push(tempArg) - } - else if (env->IsInstanceOf(param, classHolder)) { - - /* Holder */ - - jobject o = env->GetObjectField(param, fieldHolderO); - - if (env->IsInstanceOf(o, classInteger)) { - int *intPtr = new int; - *intPtr = env->CallIntMethod(o, methodIntValue); - arrays[i] = (int) intPtr; - _push(intPtr); - } - else if (env->IsInstanceOf(o, classByteArray)) { - char* byteArrayArg = (char*) env->GetPrimitiveArrayCritical((jarray) o, 0); - arrays[i] = (int) &byteArrayArg; - _push(byteArrayArg) - } - else if (env->IsInstanceOf(o, classCharArray)) { - unsigned short* charArrayArg = (unsigned short*) env->GetPrimitiveArrayCritical( - (jarray) o, 0); - arrays[i] = (int) &charArrayArg; - _push(charArrayArg) - } - else if (env->IsInstanceOf(o, classBoolean)) { - jboolean booleanArg = env->CallBooleanMethod(o, methodBooleanValue); - int *tempPtr = new int; - *tempPtr = (booleanArg == JNI_FALSE ? 0 : 1); - arrays[i] = (int) tempPtr; - _push(tempPtr); - } - - /* end Holder */ - - } - - } - - jint functionHandle = env->GetIntField(obj, fieldFunctionHandle); - jint outVal; - -#ifdef _WINDOWS -#ifdef _X86_ - - __asm { - - call functionHandle - mov outVal, eax - - } - -#endif -#endif - - for (int j = 0; j < len; ++j) { - param = env->GetObjectArrayElement(params, j); - if (param == NULL) {} - else if (env->IsInstanceOf(param, classByteArray) || env->IsInstanceOf(param, classCharArray)) { - env->ReleasePrimitiveArrayCritical((jarray) param, (void*) arrays[j], 0); - } - else if (env->IsInstanceOf(param, classHolder)) { - - jobject o = env->GetObjectField(param, fieldHolderO); - - if (env->IsInstanceOf(o, classInteger)) { - int* out = (int*) arrays[j]; - env->SetObjectField(param, fieldHolderO, env->NewObject(classInteger, newIntegerInt, *out)); - delete out; - } - else if (env->IsInstanceOf(o, classByteArray) || env->IsInstanceOf(o, classCharArray)) { - env->ReleasePrimitiveArrayCritical((jarray) o, (void*) arrays[j], 0); - } - else if (env->IsInstanceOf(o, classBoolean)) { - int* out = (int*) arrays[j]; - env->SetObjectField(param, fieldHolderO, env->NewObject(classBoolean, newBooleanBoolean, (*out == 0 ? JNI_FALSE : JNI_TRUE))); - delete out; - } - - } - - } - - delete [] arrays; - - env->SetIntField(obj, fieldLastErrorCode, GetLastError()); - - return outVal; - -} diff --git a/cpp/nativecall/NativeCall.cpp b/cpp/nativecall/NativeCall.cpp deleted file mode 100644 index 5ab390c..0000000 --- a/cpp/nativecall/NativeCall.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/* - * NativeCall.cpp - * - * Created on 11.09.2004. - * - * $Id: NativeCall.cpp,v 1.4 2006/04/19 20:54:55 grnull Exp $ - * - * eaio: NativeCall - calling operating system methods from Java - * Copyright (c) 2004-2006 Johann Burkard () - * - * - * 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 - * AUTHORS OR 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. - * - */ - -#include -#include "com_eaio_nativecall_NativeCall.h" - -#ifdef _WINDOWS -#include -#include -#endif - -// NativeCall fields - -jfieldID fieldFunction, fieldModule, fieldFunctionHandle, - fieldModuleHandle, fieldLastErrorCode; - -// Holder fields - -jfieldID fieldHolderO; - -// Classes - -jclass classBoolean,/* classByte, classCharacter, classShort,*/ - classInteger, /* classLong, classFloat, classDouble,*/ classString, - classByteArray, classCharArray, /*classIntArray,*/ classHolder; - -// Wrapper class methods - -jmethodID methodBooleanValue,/* methodByteValue, methodCharValue, -methodShortValue,*/ methodIntValue/*, methodLongValue, methodFloatValue, -methodDoubleValue*/; - -// Constructors - -jmethodID newIntegerInt, newBooleanBoolean; - -/* - * Class: com_eaio_nativecall_NativeCall - * Method: initIDs - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_eaio_nativecall_NativeCall_initIDs -(JNIEnv *env, jclass cls) { - - // NativeCall fields - - fieldFunction = env->GetFieldID(cls, "function", "Ljava/lang/String;"); - fieldModule = env->GetFieldID(cls, "module", "Ljava/lang/String;"); - - fieldFunctionHandle = env->GetFieldID(cls, "functionHandle", "I"); - fieldModuleHandle = env-> GetFieldID(cls, "moduleHandle", "I"); - - fieldLastErrorCode = env->GetFieldID(cls, "lastErrorCode", "I"); - - // Holder fields - - classHolder = (jclass) env->NewGlobalRef(env->FindClass("com/eaio/nativecall/Holder")); - fieldHolderO = env->GetFieldID(classHolder, "o", "Ljava/lang/Object;"); - - // Other classes - - classBoolean = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Boolean")); - /*classByte = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Byte")); - classCharacter = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Character")); - classShort = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Short"));*/ - classInteger = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Integer")); - /*classLong = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Long")); - classFloat = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Float")); - classDouble = (jclass) env->NewGlobalRef(env->FindClass("java/lang/Double"));*/ - classString = (jclass) env->NewGlobalRef(env->FindClass("java/lang/String")); - classByteArray = (jclass) env->NewGlobalRef(env->FindClass("[B")); - classCharArray = (jclass) env->NewGlobalRef(env->FindClass("[C")); - /*classIntArray = (jclass) env->NewGlobalRef(env->FindClass("[I"));*/ - - // Wrapper class methods - - methodBooleanValue = env->GetMethodID(classBoolean, - "booleanValue", "()Z"); - /*methodByteValue = env->GetMethodID(classByte, - "byteValue", "()B"); - methodCharValue = env->GetMethodID(classCharacter, - "charValue", "()C"); - methodShortValue = env->GetMethodID(classShort, - "shortValue", "()S");*/ - methodIntValue = env->GetMethodID(classInteger, - "intValue", "()I"); - /*methodLongValue = env->GetMethodID(classLong, - "longValue", "()J"); - methodFloatValue = env->GetMethodID(classFloat, - "floatValue", "()F"); - methodDoubleValue = env->GetMethodID(classDouble, - "doubleValue", "()D");*/ - - // Constructors - - newIntegerInt = env->GetMethodID(classInteger, "", "(I)V"); - newBooleanBoolean = env->GetMethodID(classBoolean, "", "(Z)V"); - -} - -/* - * Class: com_eaio_nativecall_NativeCall - * Method: initHandles - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_eaio_nativecall_NativeCall_initHandles -(JNIEnv *env, jobject obj) { - - bool out = JNI_TRUE; - - jstring moduleNameS = (jstring) env->GetObjectField(obj, fieldModule); - jstring functionNameS = (jstring) env->GetObjectField(obj, fieldFunction); - - const char* moduleName = env->GetStringUTFChars(moduleNameS, 0); - const char* functionName = env->GetStringUTFChars(functionNameS, 0); - -#ifdef _WINDOWS - - HMODULE mod = LoadLibrary((LPCWSTR) moduleName); - - if (mod == NULL) { - /* no such module or DllMain returned FALSE */ - env->SetIntField(obj, fieldLastErrorCode, GetLastError()); - out = JNI_FALSE; - } - else { - FARPROC addr = GetProcAddress(mod, functionName); - if (addr == NULL) { - /* function not found */ - FreeLibrary(mod); - env->SetIntField(obj, fieldLastErrorCode, GetLastError()); - out = JNI_FALSE; - } - else { - /* all ok */ - env->SetIntField(obj, fieldModuleHandle, (jint) mod); - env->SetIntField(obj, fieldFunctionHandle, (jint) addr); - } - } - -#endif - - env->ReleaseStringUTFChars(moduleNameS, moduleName); - env->ReleaseStringUTFChars(functionNameS, functionName); - - return out; - -} - -/* - * Class: com_eaio_nativecall_NativeCall - * Method: getLastError - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_eaio_nativecall_NativeCall_getLastError -(JNIEnv *env, jobject obj) { - - jint lastError = env->GetIntField(obj, fieldLastErrorCode); - - if (lastError == 0) return NULL; - - jstring out = NULL; - -#ifdef _WINDOWS - - LPVOID msgBufPtr = NULL; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, NULL, lastError, 0, - (LPWSTR) &msgBufPtr, 0, NULL); - - out = env->NewStringUTF((char*) msgBufPtr); - - LocalFree(msgBufPtr); - -#endif - - return out; - -} - -/* - * Class: com_eaio_nativecall_NativeCall - * Method: destroy - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_eaio_nativecall_NativeCall_destroy -(JNIEnv *env, jobject obj) { - - jint module = env->GetIntField(obj, fieldModuleHandle); - - if (module == 0) return; - -#ifdef _WINDOWS - - if (FreeLibrary((HMODULE) module) == 0) { - env->SetIntField(obj, fieldLastErrorCode, GetLastError()); - } - -#endif - - env->SetIntField(obj, fieldModuleHandle, 0); - env->SetIntField(obj, fieldFunctionHandle, 0); - - return; - -} \ No newline at end of file diff --git a/cpp/nativecall/VoidCall.cpp b/cpp/nativecall/VoidCall.cpp deleted file mode 100644 index 8c9a1b9..0000000 --- a/cpp/nativecall/VoidCall.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* - * VoidCall.cpp - * - * Created on 16.09.2004. - * - * $Id: VoidCall.cpp,v 1.4 2006/04/20 05:50:15 grnull Exp $ - * - * eaio: NativeCall - calling operating system methods from Java - * Copyright (c) 2004-2006 Johann Burkard () - * - * - * 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 - * AUTHORS OR 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. - * - */ - -#include -#include "com_eaio_nativecall_VoidCall.h" - -#ifdef _WINDOWS -#include -#include -#endif - -#ifdef _WINDOWS -#ifdef _X86_ - -#define _push(x) __asm { push x }; - -#endif -#endif - -// NativeCall fields - -extern jfieldID fieldFunction, fieldModule, fieldFunctionHandle, - fieldModuleHandle, fieldLastErrorCode; - -// Holder fields - -extern jfieldID fieldHolderO; - -// Classes - -extern jclass classBoolean,/* classByte, classCharacter, classShort,*/ - classInteger, /* classLong, classFloat, classDouble,*/ classString, - classByteArray, classCharArray, /*classIntArray,*/ classHolder; - -// Wrapper class methods - -extern jmethodID methodBooleanValue,/* methodByteValue, methodCharValue, -methodShortValue,*/ methodIntValue/*, methodLongValue, methodFloatValue, -methodDoubleValue*/; - -// Constructors - -extern jmethodID newIntegerInt, newBooleanBoolean; - -/* - * Class: com_eaio_nativecall_VoidCall - * Method: executeCall - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_eaio_nativecall_VoidCall_executeCall -(JNIEnv *env, jobject obj) { - - jint functionHandle = env->GetIntField(obj, fieldFunctionHandle); - -#ifdef _WINDOWS -#ifdef _X86_ - - __asm { - - call functionHandle - - } - -#endif -#endif - - env->SetIntField(obj, fieldLastErrorCode, GetLastError()); - -} - -/* - * Class: com_eaio_nativecall_VoidCall - * Method: executeCall0 - * Signature: ([Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_com_eaio_nativecall_VoidCall_executeCall0 -(JNIEnv *env, jobject obj, jobjectArray params) { - - const int len = env->GetArrayLength(params); - - int* arrays = NULL; - if (!(arrays = new int[len])) { - env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), NULL); - return; - } - memset(arrays, 0, (sizeof(int) * len)); - - jobject param; - - for (int i = len - 1; i >= 0; i--) { - - param = env->GetObjectArrayElement(params, i); - - if (param == NULL) { - _push(0); - } - else if (env->IsInstanceOf(param, classInteger)) { - int intArg = env->CallIntMethod(param, methodIntValue); - _push(intArg) - } - else if (env->IsInstanceOf(param, classByteArray)) { - char* byteArrayArg = (char*) env->GetPrimitiveArrayCritical((jarray) param, 0); - arrays[i] = (int) &byteArrayArg; - _push(byteArrayArg) - } - else if (env->IsInstanceOf(param, classCharArray)) { - unsigned short* charArrayArg = (unsigned short*) env->GetPrimitiveArrayCritical( - (jarray) param, 0); - arrays[i] = (int) &charArrayArg; - _push(charArrayArg) - } - else if (env->IsInstanceOf(param, classBoolean)) { - jboolean booleanArg = env->CallBooleanMethod(param, methodBooleanValue); - int tempArg = (booleanArg == JNI_FALSE ? 0 : 1); - _push(tempArg) - } - else if (env->IsInstanceOf(param, classHolder)) { - - /* Holder */ - - jobject o = env->GetObjectField(param, fieldHolderO); - - if (env->IsInstanceOf(o, classInteger)) { - int *intPtr = new int; - *intPtr = env->CallIntMethod(o, methodIntValue); - arrays[i] = (int) intPtr; - _push(intPtr); - } - else if (env->IsInstanceOf(o, classByteArray)) { - char* byteArrayArg = (char*) env->GetPrimitiveArrayCritical((jarray) o, 0); - arrays[i] = (int) &byteArrayArg; - _push(byteArrayArg) - } - else if (env->IsInstanceOf(o, classCharArray)) { - unsigned short* charArrayArg = (unsigned short*) env->GetPrimitiveArrayCritical( - (jarray) o, 0); - arrays[i] = (int) &charArrayArg; - _push(charArrayArg) - } - else if (env->IsInstanceOf(o, classBoolean)) { - jboolean booleanArg = env->CallBooleanMethod(o, methodBooleanValue); - int *tempPtr = new int; - *tempPtr = (booleanArg == JNI_FALSE ? 0 : 1); - arrays[i] = (int) tempPtr; - _push(tempPtr); - } - - /* end Holder */ - - } - - } - - jint functionHandle = env->GetIntField(obj, fieldFunctionHandle); - -#ifdef _WINDOWS -#ifdef _X86_ - - __asm { - - call functionHandle - - } - -#endif -#endif - - for (int j = 0; j < len; ++j) { - param = env->GetObjectArrayElement(params, j); - if (param == NULL) {} - else if (env->IsInstanceOf(param, classByteArray) || env->IsInstanceOf(param, classCharArray)) { - env->ReleasePrimitiveArrayCritical((jarray) param, (void*) arrays[j], 0); - } - else if (env->IsInstanceOf(param, classHolder)) { - - jobject o = env->GetObjectField(param, fieldHolderO); - - if (env->IsInstanceOf(o, classInteger)) { - int* out = (int*) arrays[j]; - env->SetObjectField(param, fieldHolderO, env->NewObject(classInteger, newIntegerInt, *out)); - delete out; - } - else if (env->IsInstanceOf(o, classByteArray) || env->IsInstanceOf(o, classCharArray)) { - env->ReleasePrimitiveArrayCritical((jarray) o, (void*) arrays[j], 0); - } - else if (env->IsInstanceOf(o, classBoolean)) { - int* out = (int*) arrays[j]; - env->SetObjectField(param, fieldHolderO, env->NewObject(classBoolean, newBooleanBoolean, (*out == 0 ? JNI_FALSE : JNI_TRUE))); - delete out; - } - - } - - } - - delete [] arrays; - - env->SetIntField(obj, fieldLastErrorCode, GetLastError()); - -} \ No newline at end of file diff --git a/cpp/nativecall/com_eaio_nativecall_IntCall.h b/cpp/nativecall/com_eaio_nativecall_IntCall.h deleted file mode 100644 index 3940b16..0000000 --- a/cpp/nativecall/com_eaio_nativecall_IntCall.h +++ /dev/null @@ -1,29 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_eaio_nativecall_IntCall */ - -#ifndef _Included_com_eaio_nativecall_IntCall -#define _Included_com_eaio_nativecall_IntCall -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_eaio_nativecall_IntCall - * Method: executeCall - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_eaio_nativecall_IntCall_executeCall - (JNIEnv *, jobject); - -/* - * Class: com_eaio_nativecall_IntCall - * Method: executeCall0 - * Signature: ([Ljava/lang/Object;)I - */ -JNIEXPORT jint JNICALL Java_com_eaio_nativecall_IntCall_executeCall0 - (JNIEnv *, jobject, jobjectArray); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/nativecall/com_eaio_nativecall_NativeCall.h b/cpp/nativecall/com_eaio_nativecall_NativeCall.h deleted file mode 100644 index 2e92b91..0000000 --- a/cpp/nativecall/com_eaio_nativecall_NativeCall.h +++ /dev/null @@ -1,45 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_eaio_nativecall_NativeCall */ - -#ifndef _Included_com_eaio_nativecall_NativeCall -#define _Included_com_eaio_nativecall_NativeCall -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_eaio_nativecall_NativeCall - * Method: initIDs - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_eaio_nativecall_NativeCall_initIDs - (JNIEnv *, jclass); - -/* - * Class: com_eaio_nativecall_NativeCall - * Method: initHandles - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_com_eaio_nativecall_NativeCall_initHandles - (JNIEnv *, jobject); - -/* - * Class: com_eaio_nativecall_NativeCall - * Method: getLastError - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_eaio_nativecall_NativeCall_getLastError - (JNIEnv *, jobject); - -/* - * Class: com_eaio_nativecall_NativeCall - * Method: destroy - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_eaio_nativecall_NativeCall_destroy - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/nativecall/com_eaio_nativecall_VoidCall.h b/cpp/nativecall/com_eaio_nativecall_VoidCall.h deleted file mode 100644 index e72afb9..0000000 --- a/cpp/nativecall/com_eaio_nativecall_VoidCall.h +++ /dev/null @@ -1,29 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_eaio_nativecall_VoidCall */ - -#ifndef _Included_com_eaio_nativecall_VoidCall -#define _Included_com_eaio_nativecall_VoidCall -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_eaio_nativecall_VoidCall - * Method: executeCall - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_eaio_nativecall_VoidCall_executeCall - (JNIEnv *, jobject); - -/* - * Class: com_eaio_nativecall_VoidCall - * Method: executeCall0 - * Signature: ([Ljava/lang/Object;)V - */ -JNIEXPORT void JNICALL Java_com_eaio_nativecall_VoidCall_executeCall0 - (JNIEnv *, jobject, jobjectArray); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/cpp/nativecall/include/classfile_constants.h b/cpp/nativecall/include/classfile_constants.h deleted file mode 100644 index 30e839e..0000000 --- a/cpp/nativecall/include/classfile_constants.h +++ /dev/null @@ -1,523 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - * - */ - -#ifndef CLASSFILE_CONSTANTS_H -#define CLASSFILE_CONSTANTS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Flags */ - -enum { - JVM_ACC_PUBLIC = 0x0001, - JVM_ACC_PRIVATE = 0x0002, - JVM_ACC_PROTECTED = 0x0004, - JVM_ACC_STATIC = 0x0008, - JVM_ACC_FINAL = 0x0010, - JVM_ACC_SYNCHRONIZED = 0x0020, - JVM_ACC_SUPER = 0x0020, - JVM_ACC_VOLATILE = 0x0040, - JVM_ACC_BRIDGE = 0x0040, - JVM_ACC_TRANSIENT = 0x0080, - JVM_ACC_VARARGS = 0x0080, - JVM_ACC_NATIVE = 0x0100, - JVM_ACC_INTERFACE = 0x0200, - JVM_ACC_ABSTRACT = 0x0400, - JVM_ACC_STRICT = 0x0800, - JVM_ACC_SYNTHETIC = 0x1000, - JVM_ACC_ANNOTATION = 0x2000, - JVM_ACC_ENUM = 0x4000 -}; - -/* Used in newarray instruction. */ - -enum { - JVM_T_BOOLEAN = 4, - JVM_T_CHAR = 5, - JVM_T_FLOAT = 6, - JVM_T_DOUBLE = 7, - JVM_T_BYTE = 8, - JVM_T_SHORT = 9, - JVM_T_INT = 10, - JVM_T_LONG = 11 -}; - -/* Constant Pool Entries */ - -enum { - JVM_CONSTANT_Utf8 = 1, - JVM_CONSTANT_Unicode = 2, /* unused */ - JVM_CONSTANT_Integer = 3, - JVM_CONSTANT_Float = 4, - JVM_CONSTANT_Long = 5, - JVM_CONSTANT_Double = 6, - JVM_CONSTANT_Class = 7, - JVM_CONSTANT_String = 8, - JVM_CONSTANT_Fieldref = 9, - JVM_CONSTANT_Methodref = 10, - JVM_CONSTANT_InterfaceMethodref = 11, - JVM_CONSTANT_NameAndType = 12 -}; - -/* StackMapTable type item numbers */ - -enum { - JVM_ITEM_Top = 0, - JVM_ITEM_Integer = 1, - JVM_ITEM_Float = 2, - JVM_ITEM_Double = 3, - JVM_ITEM_Long = 4, - JVM_ITEM_Null = 5, - JVM_ITEM_UninitializedThis = 6, - JVM_ITEM_Object = 7, - JVM_ITEM_Uninitialized = 8 -}; - -/* Type signatures */ - -enum { - JVM_SIGNATURE_ARRAY = '[', - JVM_SIGNATURE_BYTE = 'B', - JVM_SIGNATURE_CHAR = 'C', - JVM_SIGNATURE_CLASS = 'L', - JVM_SIGNATURE_ENDCLASS = ';', - JVM_SIGNATURE_ENUM = 'E', - JVM_SIGNATURE_FLOAT = 'F', - JVM_SIGNATURE_DOUBLE = 'D', - JVM_SIGNATURE_FUNC = '(', - JVM_SIGNATURE_ENDFUNC = ')', - JVM_SIGNATURE_INT = 'I', - JVM_SIGNATURE_LONG = 'J', - JVM_SIGNATURE_SHORT = 'S', - JVM_SIGNATURE_VOID = 'V', - JVM_SIGNATURE_BOOLEAN = 'Z' -}; - -/* Opcodes */ - -enum { - JVM_OPC_nop = 0, - JVM_OPC_aconst_null = 1, - JVM_OPC_iconst_m1 = 2, - JVM_OPC_iconst_0 = 3, - JVM_OPC_iconst_1 = 4, - JVM_OPC_iconst_2 = 5, - JVM_OPC_iconst_3 = 6, - JVM_OPC_iconst_4 = 7, - JVM_OPC_iconst_5 = 8, - JVM_OPC_lconst_0 = 9, - JVM_OPC_lconst_1 = 10, - JVM_OPC_fconst_0 = 11, - JVM_OPC_fconst_1 = 12, - JVM_OPC_fconst_2 = 13, - JVM_OPC_dconst_0 = 14, - JVM_OPC_dconst_1 = 15, - JVM_OPC_bipush = 16, - JVM_OPC_sipush = 17, - JVM_OPC_ldc = 18, - JVM_OPC_ldc_w = 19, - JVM_OPC_ldc2_w = 20, - JVM_OPC_iload = 21, - JVM_OPC_lload = 22, - JVM_OPC_fload = 23, - JVM_OPC_dload = 24, - JVM_OPC_aload = 25, - JVM_OPC_iload_0 = 26, - JVM_OPC_iload_1 = 27, - JVM_OPC_iload_2 = 28, - JVM_OPC_iload_3 = 29, - JVM_OPC_lload_0 = 30, - JVM_OPC_lload_1 = 31, - JVM_OPC_lload_2 = 32, - JVM_OPC_lload_3 = 33, - JVM_OPC_fload_0 = 34, - JVM_OPC_fload_1 = 35, - JVM_OPC_fload_2 = 36, - JVM_OPC_fload_3 = 37, - JVM_OPC_dload_0 = 38, - JVM_OPC_dload_1 = 39, - JVM_OPC_dload_2 = 40, - JVM_OPC_dload_3 = 41, - JVM_OPC_aload_0 = 42, - JVM_OPC_aload_1 = 43, - JVM_OPC_aload_2 = 44, - JVM_OPC_aload_3 = 45, - JVM_OPC_iaload = 46, - JVM_OPC_laload = 47, - JVM_OPC_faload = 48, - JVM_OPC_daload = 49, - JVM_OPC_aaload = 50, - JVM_OPC_baload = 51, - JVM_OPC_caload = 52, - JVM_OPC_saload = 53, - JVM_OPC_istore = 54, - JVM_OPC_lstore = 55, - JVM_OPC_fstore = 56, - JVM_OPC_dstore = 57, - JVM_OPC_astore = 58, - JVM_OPC_istore_0 = 59, - JVM_OPC_istore_1 = 60, - JVM_OPC_istore_2 = 61, - JVM_OPC_istore_3 = 62, - JVM_OPC_lstore_0 = 63, - JVM_OPC_lstore_1 = 64, - JVM_OPC_lstore_2 = 65, - JVM_OPC_lstore_3 = 66, - JVM_OPC_fstore_0 = 67, - JVM_OPC_fstore_1 = 68, - JVM_OPC_fstore_2 = 69, - JVM_OPC_fstore_3 = 70, - JVM_OPC_dstore_0 = 71, - JVM_OPC_dstore_1 = 72, - JVM_OPC_dstore_2 = 73, - JVM_OPC_dstore_3 = 74, - JVM_OPC_astore_0 = 75, - JVM_OPC_astore_1 = 76, - JVM_OPC_astore_2 = 77, - JVM_OPC_astore_3 = 78, - JVM_OPC_iastore = 79, - JVM_OPC_lastore = 80, - JVM_OPC_fastore = 81, - JVM_OPC_dastore = 82, - JVM_OPC_aastore = 83, - JVM_OPC_bastore = 84, - JVM_OPC_castore = 85, - JVM_OPC_sastore = 86, - JVM_OPC_pop = 87, - JVM_OPC_pop2 = 88, - JVM_OPC_dup = 89, - JVM_OPC_dup_x1 = 90, - JVM_OPC_dup_x2 = 91, - JVM_OPC_dup2 = 92, - JVM_OPC_dup2_x1 = 93, - JVM_OPC_dup2_x2 = 94, - JVM_OPC_swap = 95, - JVM_OPC_iadd = 96, - JVM_OPC_ladd = 97, - JVM_OPC_fadd = 98, - JVM_OPC_dadd = 99, - JVM_OPC_isub = 100, - JVM_OPC_lsub = 101, - JVM_OPC_fsub = 102, - JVM_OPC_dsub = 103, - JVM_OPC_imul = 104, - JVM_OPC_lmul = 105, - JVM_OPC_fmul = 106, - JVM_OPC_dmul = 107, - JVM_OPC_idiv = 108, - JVM_OPC_ldiv = 109, - JVM_OPC_fdiv = 110, - JVM_OPC_ddiv = 111, - JVM_OPC_irem = 112, - JVM_OPC_lrem = 113, - JVM_OPC_frem = 114, - JVM_OPC_drem = 115, - JVM_OPC_ineg = 116, - JVM_OPC_lneg = 117, - JVM_OPC_fneg = 118, - JVM_OPC_dneg = 119, - JVM_OPC_ishl = 120, - JVM_OPC_lshl = 121, - JVM_OPC_ishr = 122, - JVM_OPC_lshr = 123, - JVM_OPC_iushr = 124, - JVM_OPC_lushr = 125, - JVM_OPC_iand = 126, - JVM_OPC_land = 127, - JVM_OPC_ior = 128, - JVM_OPC_lor = 129, - JVM_OPC_ixor = 130, - JVM_OPC_lxor = 131, - JVM_OPC_iinc = 132, - JVM_OPC_i2l = 133, - JVM_OPC_i2f = 134, - JVM_OPC_i2d = 135, - JVM_OPC_l2i = 136, - JVM_OPC_l2f = 137, - JVM_OPC_l2d = 138, - JVM_OPC_f2i = 139, - JVM_OPC_f2l = 140, - JVM_OPC_f2d = 141, - JVM_OPC_d2i = 142, - JVM_OPC_d2l = 143, - JVM_OPC_d2f = 144, - JVM_OPC_i2b = 145, - JVM_OPC_i2c = 146, - JVM_OPC_i2s = 147, - JVM_OPC_lcmp = 148, - JVM_OPC_fcmpl = 149, - JVM_OPC_fcmpg = 150, - JVM_OPC_dcmpl = 151, - JVM_OPC_dcmpg = 152, - JVM_OPC_ifeq = 153, - JVM_OPC_ifne = 154, - JVM_OPC_iflt = 155, - JVM_OPC_ifge = 156, - JVM_OPC_ifgt = 157, - JVM_OPC_ifle = 158, - JVM_OPC_if_icmpeq = 159, - JVM_OPC_if_icmpne = 160, - JVM_OPC_if_icmplt = 161, - JVM_OPC_if_icmpge = 162, - JVM_OPC_if_icmpgt = 163, - JVM_OPC_if_icmple = 164, - JVM_OPC_if_acmpeq = 165, - JVM_OPC_if_acmpne = 166, - JVM_OPC_goto = 167, - JVM_OPC_jsr = 168, - JVM_OPC_ret = 169, - JVM_OPC_tableswitch = 170, - JVM_OPC_lookupswitch = 171, - JVM_OPC_ireturn = 172, - JVM_OPC_lreturn = 173, - JVM_OPC_freturn = 174, - JVM_OPC_dreturn = 175, - JVM_OPC_areturn = 176, - JVM_OPC_return = 177, - JVM_OPC_getstatic = 178, - JVM_OPC_putstatic = 179, - JVM_OPC_getfield = 180, - JVM_OPC_putfield = 181, - JVM_OPC_invokevirtual = 182, - JVM_OPC_invokespecial = 183, - JVM_OPC_invokestatic = 184, - JVM_OPC_invokeinterface = 185, - JVM_OPC_xxxunusedxxx = 186, - JVM_OPC_new = 187, - JVM_OPC_newarray = 188, - JVM_OPC_anewarray = 189, - JVM_OPC_arraylength = 190, - JVM_OPC_athrow = 191, - JVM_OPC_checkcast = 192, - JVM_OPC_instanceof = 193, - JVM_OPC_monitorenter = 194, - JVM_OPC_monitorexit = 195, - JVM_OPC_wide = 196, - JVM_OPC_multianewarray = 197, - JVM_OPC_ifnull = 198, - JVM_OPC_ifnonnull = 199, - JVM_OPC_goto_w = 200, - JVM_OPC_jsr_w = 201, - JVM_OPC_MAX = 201 -}; - -/* Opcode length initializer, use with something like: - * unsigned char opcode_length[JVM_OPC_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER; - */ -#define JVM_OPCODE_LENGTH_INITIALIZER { \ - 1, /* nop */ \ - 1, /* aconst_null */ \ - 1, /* iconst_m1 */ \ - 1, /* iconst_0 */ \ - 1, /* iconst_1 */ \ - 1, /* iconst_2 */ \ - 1, /* iconst_3 */ \ - 1, /* iconst_4 */ \ - 1, /* iconst_5 */ \ - 1, /* lconst_0 */ \ - 1, /* lconst_1 */ \ - 1, /* fconst_0 */ \ - 1, /* fconst_1 */ \ - 1, /* fconst_2 */ \ - 1, /* dconst_0 */ \ - 1, /* dconst_1 */ \ - 2, /* bipush */ \ - 3, /* sipush */ \ - 2, /* ldc */ \ - 3, /* ldc_w */ \ - 3, /* ldc2_w */ \ - 2, /* iload */ \ - 2, /* lload */ \ - 2, /* fload */ \ - 2, /* dload */ \ - 2, /* aload */ \ - 1, /* iload_0 */ \ - 1, /* iload_1 */ \ - 1, /* iload_2 */ \ - 1, /* iload_3 */ \ - 1, /* lload_0 */ \ - 1, /* lload_1 */ \ - 1, /* lload_2 */ \ - 1, /* lload_3 */ \ - 1, /* fload_0 */ \ - 1, /* fload_1 */ \ - 1, /* fload_2 */ \ - 1, /* fload_3 */ \ - 1, /* dload_0 */ \ - 1, /* dload_1 */ \ - 1, /* dload_2 */ \ - 1, /* dload_3 */ \ - 1, /* aload_0 */ \ - 1, /* aload_1 */ \ - 1, /* aload_2 */ \ - 1, /* aload_3 */ \ - 1, /* iaload */ \ - 1, /* laload */ \ - 1, /* faload */ \ - 1, /* daload */ \ - 1, /* aaload */ \ - 1, /* baload */ \ - 1, /* caload */ \ - 1, /* saload */ \ - 2, /* istore */ \ - 2, /* lstore */ \ - 2, /* fstore */ \ - 2, /* dstore */ \ - 2, /* astore */ \ - 1, /* istore_0 */ \ - 1, /* istore_1 */ \ - 1, /* istore_2 */ \ - 1, /* istore_3 */ \ - 1, /* lstore_0 */ \ - 1, /* lstore_1 */ \ - 1, /* lstore_2 */ \ - 1, /* lstore_3 */ \ - 1, /* fstore_0 */ \ - 1, /* fstore_1 */ \ - 1, /* fstore_2 */ \ - 1, /* fstore_3 */ \ - 1, /* dstore_0 */ \ - 1, /* dstore_1 */ \ - 1, /* dstore_2 */ \ - 1, /* dstore_3 */ \ - 1, /* astore_0 */ \ - 1, /* astore_1 */ \ - 1, /* astore_2 */ \ - 1, /* astore_3 */ \ - 1, /* iastore */ \ - 1, /* lastore */ \ - 1, /* fastore */ \ - 1, /* dastore */ \ - 1, /* aastore */ \ - 1, /* bastore */ \ - 1, /* castore */ \ - 1, /* sastore */ \ - 1, /* pop */ \ - 1, /* pop2 */ \ - 1, /* dup */ \ - 1, /* dup_x1 */ \ - 1, /* dup_x2 */ \ - 1, /* dup2 */ \ - 1, /* dup2_x1 */ \ - 1, /* dup2_x2 */ \ - 1, /* swap */ \ - 1, /* iadd */ \ - 1, /* ladd */ \ - 1, /* fadd */ \ - 1, /* dadd */ \ - 1, /* isub */ \ - 1, /* lsub */ \ - 1, /* fsub */ \ - 1, /* dsub */ \ - 1, /* imul */ \ - 1, /* lmul */ \ - 1, /* fmul */ \ - 1, /* dmul */ \ - 1, /* idiv */ \ - 1, /* ldiv */ \ - 1, /* fdiv */ \ - 1, /* ddiv */ \ - 1, /* irem */ \ - 1, /* lrem */ \ - 1, /* frem */ \ - 1, /* drem */ \ - 1, /* ineg */ \ - 1, /* lneg */ \ - 1, /* fneg */ \ - 1, /* dneg */ \ - 1, /* ishl */ \ - 1, /* lshl */ \ - 1, /* ishr */ \ - 1, /* lshr */ \ - 1, /* iushr */ \ - 1, /* lushr */ \ - 1, /* iand */ \ - 1, /* land */ \ - 1, /* ior */ \ - 1, /* lor */ \ - 1, /* ixor */ \ - 1, /* lxor */ \ - 3, /* iinc */ \ - 1, /* i2l */ \ - 1, /* i2f */ \ - 1, /* i2d */ \ - 1, /* l2i */ \ - 1, /* l2f */ \ - 1, /* l2d */ \ - 1, /* f2i */ \ - 1, /* f2l */ \ - 1, /* f2d */ \ - 1, /* d2i */ \ - 1, /* d2l */ \ - 1, /* d2f */ \ - 1, /* i2b */ \ - 1, /* i2c */ \ - 1, /* i2s */ \ - 1, /* lcmp */ \ - 1, /* fcmpl */ \ - 1, /* fcmpg */ \ - 1, /* dcmpl */ \ - 1, /* dcmpg */ \ - 3, /* ifeq */ \ - 3, /* ifne */ \ - 3, /* iflt */ \ - 3, /* ifge */ \ - 3, /* ifgt */ \ - 3, /* ifle */ \ - 3, /* if_icmpeq */ \ - 3, /* if_icmpne */ \ - 3, /* if_icmplt */ \ - 3, /* if_icmpge */ \ - 3, /* if_icmpgt */ \ - 3, /* if_icmple */ \ - 3, /* if_acmpeq */ \ - 3, /* if_acmpne */ \ - 3, /* goto */ \ - 3, /* jsr */ \ - 2, /* ret */ \ - 99, /* tableswitch */ \ - 99, /* lookupswitch */ \ - 1, /* ireturn */ \ - 1, /* lreturn */ \ - 1, /* freturn */ \ - 1, /* dreturn */ \ - 1, /* areturn */ \ - 1, /* return */ \ - 3, /* getstatic */ \ - 3, /* putstatic */ \ - 3, /* getfield */ \ - 3, /* putfield */ \ - 3, /* invokevirtual */ \ - 3, /* invokespecial */ \ - 3, /* invokestatic */ \ - 5, /* invokeinterface */ \ - 0, /* xxxunusedxxx */ \ - 3, /* new */ \ - 2, /* newarray */ \ - 3, /* anewarray */ \ - 1, /* arraylength */ \ - 1, /* athrow */ \ - 3, /* checkcast */ \ - 3, /* instanceof */ \ - 1, /* monitorenter */ \ - 1, /* monitorexit */ \ - 0, /* wide */ \ - 4, /* multianewarray */ \ - 3, /* ifnull */ \ - 3, /* ifnonnull */ \ - 5, /* goto_w */ \ - 5 /* jsr_w */ \ -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* CLASSFILE_CONSTANTS */ diff --git a/cpp/nativecall/include/jawt.h b/cpp/nativecall/include/jawt.h deleted file mode 100644 index 87e0b18..0000000 --- a/cpp/nativecall/include/jawt.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -#ifndef _JAVASOFT_JAWT_H_ -#define _JAVASOFT_JAWT_H_ - -#include "jni.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * AWT native interface (new in JDK 1.3) - * - * The AWT native interface allows a native C or C++ application a means - * by which to access native structures in AWT. This is to facilitate moving - * legacy C and C++ applications to Java and to target the needs of the - * community who, at present, wish to do their own native rendering to canvases - * for performance reasons. Standard extensions such as Java3D also require a - * means to access the underlying native data structures of AWT. - * - * There may be future extensions to this API depending on demand. - * - * A VM does not have to implement this API in order to pass the JCK. - * It is recommended, however, that this API is implemented on VMs that support - * standard extensions, such as Java3D. - * - * Since this is a native API, any program which uses it cannot be considered - * 100% pure java. - */ - -/* - * AWT Native Drawing Surface (JAWT_DrawingSurface). - * - * For each platform, there is a native drawing surface structure. This - * platform-specific structure can be found in jawt_md.h. It is recommended - * that additional platforms follow the same model. It is also recommended - * that VMs on Win32 and Solaris support the existing structures in jawt_md.h. - * - ******************* - * EXAMPLE OF USAGE: - ******************* - * - * In Win32, a programmer wishes to access the HWND of a canvas to perform - * native rendering into it. The programmer has declared the paint() method - * for their canvas subclass to be native: - * - * - * MyCanvas.java: - * - * import java.awt.*; - * - * public class MyCanvas extends Canvas { - * - * static { - * System.loadLibrary("mylib"); - * } - * - * public native void paint(Graphics g); - * } - * - * - * myfile.c: - * - * #include "jawt_md.h" - * #include - * - * JNIEXPORT void JNICALL - * Java_MyCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics) - * { - * JAWT awt; - * JAWT_DrawingSurface* ds; - * JAWT_DrawingSurfaceInfo* dsi; - * JAWT_Win32DrawingSurfaceInfo* dsi_win; - * jboolean result; - * jint lock; - * - * // Get the AWT - * awt.version = JAWT_VERSION_1_3; - * result = JAWT_GetAWT(env, &awt); - * assert(result != JNI_FALSE); - * - * // Get the drawing surface - * ds = awt.GetDrawingSurface(env, canvas); - * assert(ds != NULL); - * - * // Lock the drawing surface - * lock = ds->Lock(ds); - * assert((lock & JAWT_LOCK_ERROR) == 0); - * - * // Get the drawing surface info - * dsi = ds->GetDrawingSurfaceInfo(ds); - * - * // Get the platform-specific drawing info - * dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo; - * - * ////////////////////////////// - * // !!! DO PAINTING HERE !!! // - * ////////////////////////////// - * - * // Free the drawing surface info - * ds->FreeDrawingSurfaceInfo(dsi); - * - * // Unlock the drawing surface - * ds->Unlock(ds); - * - * // Free the drawing surface - * awt.FreeDrawingSurface(ds); - * } - * - */ - -/* - * JAWT_Rectangle - * Structure for a native rectangle. - */ -typedef struct jawt_Rectangle { - jint x; - jint y; - jint width; - jint height; -} JAWT_Rectangle; - -struct jawt_DrawingSurface; - -/* - * JAWT_DrawingSurfaceInfo - * Structure for containing the underlying drawing information of a component. - */ -typedef struct jawt_DrawingSurfaceInfo { - /* - * Pointer to the platform-specific information. This can be safely - * cast to a JAWT_Win32DrawingSurfaceInfo on Windows or a - * JAWT_X11DrawingSurfaceInfo on Solaris. See jawt_md.h for details. - */ - void* platformInfo; - /* Cached pointer to the underlying drawing surface */ - struct jawt_DrawingSurface* ds; - /* Bounding rectangle of the drawing surface */ - JAWT_Rectangle bounds; - /* Number of rectangles in the clip */ - jint clipSize; - /* Clip rectangle array */ - JAWT_Rectangle* clip; -} JAWT_DrawingSurfaceInfo; - -#define JAWT_LOCK_ERROR 0x00000001 -#define JAWT_LOCK_CLIP_CHANGED 0x00000002 -#define JAWT_LOCK_BOUNDS_CHANGED 0x00000004 -#define JAWT_LOCK_SURFACE_CHANGED 0x00000008 - -/* - * JAWT_DrawingSurface - * Structure for containing the underlying drawing information of a component. - * All operations on a JAWT_DrawingSurface MUST be performed from the same - * thread as the call to GetDrawingSurface. - */ -typedef struct jawt_DrawingSurface { - /* - * Cached reference to the Java environment of the calling thread. - * If Lock(), Unlock(), GetDrawingSurfaceInfo() or - * FreeDrawingSurfaceInfo() are called from a different thread, - * this data member should be set before calling those functions. - */ - JNIEnv* env; - /* Cached reference to the target object */ - jobject target; - /* - * Lock the surface of the target component for native rendering. - * When finished drawing, the surface must be unlocked with - * Unlock(). This function returns a bitmask with one or more of the - * following values: - * - * JAWT_LOCK_ERROR - When an error has occurred and the surface could not - * be locked. - * - * JAWT_LOCK_CLIP_CHANGED - When the clip region has changed. - * - * JAWT_LOCK_BOUNDS_CHANGED - When the bounds of the surface have changed. - * - * JAWT_LOCK_SURFACE_CHANGED - When the surface itself has changed - */ - jint (JNICALL *Lock) - (struct jawt_DrawingSurface* ds); - /* - * Get the drawing surface info. - * The value returned may be cached, but the values may change if - * additional calls to Lock() or Unlock() are made. - * Lock() must be called before this can return a valid value. - * Returns NULL if an error has occurred. - * When finished with the returned value, FreeDrawingSurfaceInfo must be - * called. - */ - JAWT_DrawingSurfaceInfo* (JNICALL *GetDrawingSurfaceInfo) - (struct jawt_DrawingSurface* ds); - /* - * Free the drawing surface info. - */ - void (JNICALL *FreeDrawingSurfaceInfo) - (JAWT_DrawingSurfaceInfo* dsi); - /* - * Unlock the drawing surface of the target component for native rendering. - */ - void (JNICALL *Unlock) - (struct jawt_DrawingSurface* ds); -} JAWT_DrawingSurface; - -/* - * JAWT - * Structure for containing native AWT functions. - */ -typedef struct jawt { - /* - * Version of this structure. This must always be set before - * calling JAWT_GetAWT() - */ - jint version; - /* - * Return a drawing surface from a target jobject. This value - * may be cached. - * Returns NULL if an error has occurred. - * Target must be a java.awt.Component (should be a Canvas - * or Window for native rendering). - * FreeDrawingSurface() must be called when finished with the - * returned JAWT_DrawingSurface. - */ - JAWT_DrawingSurface* (JNICALL *GetDrawingSurface) - (JNIEnv* env, jobject target); - /* - * Free the drawing surface allocated in GetDrawingSurface. - */ - void (JNICALL *FreeDrawingSurface) - (JAWT_DrawingSurface* ds); - /* - * Since 1.4 - * Locks the entire AWT for synchronization purposes - */ - void (JNICALL *Lock)(JNIEnv* env); - /* - * Since 1.4 - * Unlocks the entire AWT for synchronization purposes - */ - void (JNICALL *Unlock)(JNIEnv* env); - /* - * Since 1.4 - * Returns a reference to a java.awt.Component from a native - * platform handle. On Windows, this corresponds to an HWND; - * on Solaris and Linux, this is a Drawable. For other platforms, - * see the appropriate machine-dependent header file for a description. - * The reference returned by this function is a local - * reference that is only valid in this environment. - * This function returns a NULL reference if no component could be - * found with matching platform information. - */ - jobject (JNICALL *GetComponent)(JNIEnv* env, void* platformInfo); - -} JAWT; - -/* - * Get the AWT native structure. This function returns JNI_FALSE if - * an error occurs. - */ -_JNI_IMPORT_OR_EXPORT_ -jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt); - -#define JAWT_VERSION_1_3 0x00010003 -#define JAWT_VERSION_1_4 0x00010004 - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* !_JAVASOFT_JAWT_H_ */ diff --git a/cpp/nativecall/include/jdwpTransport.h b/cpp/nativecall/include/jdwpTransport.h deleted file mode 100644 index eae435a..0000000 --- a/cpp/nativecall/include/jdwpTransport.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -/* - * Java Debug Wire Protocol Transport Service Provider Interface. - */ - -#ifndef JDWPTRANSPORT_H -#define JDWPTRANSPORT_H - -#include "jni.h" - -enum { - JDWPTRANSPORT_VERSION_1_0 = 0x00010000 -}; - -#ifdef __cplusplus -extern "C" { -#endif - -struct jdwpTransportNativeInterface_; - -struct _jdwpTransportEnv; - -#ifdef __cplusplus -typedef _jdwpTransportEnv jdwpTransportEnv; -#else -typedef const struct jdwpTransportNativeInterface_ *jdwpTransportEnv; -#endif /* __cplusplus */ - -/* - * Errors. Universal errors with JVMTI/JVMDI equivalents keep the - * values the same. - */ -typedef enum { - JDWPTRANSPORT_ERROR_NONE = 0, - JDWPTRANSPORT_ERROR_ILLEGAL_ARGUMENT = 103, - JDWPTRANSPORT_ERROR_OUT_OF_MEMORY = 110, - JDWPTRANSPORT_ERROR_INTERNAL = 113, - JDWPTRANSPORT_ERROR_ILLEGAL_STATE = 201, - JDWPTRANSPORT_ERROR_IO_ERROR = 202, - JDWPTRANSPORT_ERROR_TIMEOUT = 203, - JDWPTRANSPORT_ERROR_MSG_NOT_AVAILABLE = 204 -} jdwpTransportError; - - -/* - * Structure to define capabilities - */ -typedef struct { - unsigned int can_timeout_attach :1; - unsigned int can_timeout_accept :1; - unsigned int can_timeout_handshake :1; - unsigned int reserved3 :1; - unsigned int reserved4 :1; - unsigned int reserved5 :1; - unsigned int reserved6 :1; - unsigned int reserved7 :1; - unsigned int reserved8 :1; - unsigned int reserved9 :1; - unsigned int reserved10 :1; - unsigned int reserved11 :1; - unsigned int reserved12 :1; - unsigned int reserved13 :1; - unsigned int reserved14 :1; - unsigned int reserved15 :1; -} JDWPTransportCapabilities; - - -/* - * Structures to define packet layout. - * - * See: http://java.sun.com/j2se/1.5/docs/guide/jpda/jdwp-spec.html - */ - -enum { - JDWPTRANSPORT_FLAGS_NONE = 0x0, - JDWPTRANSPORT_FLAGS_REPLY = 0x80 -}; - -typedef struct { - jint len; - jint id; - jbyte flags; - jbyte cmdSet; - jbyte cmd; - jbyte *data; -} jdwpCmdPacket; - -typedef struct { - jint len; - jint id; - jbyte flags; - jshort errorCode; - jbyte *data; -} jdwpReplyPacket; - -typedef struct { - union { - jdwpCmdPacket cmd; - jdwpReplyPacket reply; - } type; -} jdwpPacket; - -/* - * JDWP functions called by the transport. - */ -typedef struct jdwpTransportCallback { - void *(*alloc)(jint numBytes); /* Call this for all allocations */ - void (*free)(void *buffer); /* Call this for all deallocations */ -} jdwpTransportCallback; - -typedef jint (JNICALL *jdwpTransport_OnLoad_t)(JavaVM *jvm, - jdwpTransportCallback *callback, - jint version, - jdwpTransportEnv** env); - - - -/* Function Interface */ - -struct jdwpTransportNativeInterface_ { - /* 1 : RESERVED */ - void *reserved1; - - /* 2 : Get Capabilities */ - jdwpTransportError (JNICALL *GetCapabilities)(jdwpTransportEnv* env, - JDWPTransportCapabilities *capabilities_ptr); - - /* 3 : Attach */ - jdwpTransportError (JNICALL *Attach)(jdwpTransportEnv* env, - const char* address, - jlong attach_timeout, - jlong handshake_timeout); - - /* 4: StartListening */ - jdwpTransportError (JNICALL *StartListening)(jdwpTransportEnv* env, - const char* address, - char** actual_address); - - /* 5: StopListening */ - jdwpTransportError (JNICALL *StopListening)(jdwpTransportEnv* env); - - /* 6: Accept */ - jdwpTransportError (JNICALL *Accept)(jdwpTransportEnv* env, - jlong accept_timeout, - jlong handshake_timeout); - - /* 7: IsOpen */ - jboolean (JNICALL *IsOpen)(jdwpTransportEnv* env); - - /* 8: Close */ - jdwpTransportError (JNICALL *Close)(jdwpTransportEnv* env); - - /* 9: ReadPacket */ - jdwpTransportError (JNICALL *ReadPacket)(jdwpTransportEnv* env, - jdwpPacket *pkt); - - /* 10: Write Packet */ - jdwpTransportError (JNICALL *WritePacket)(jdwpTransportEnv* env, - const jdwpPacket* pkt); - - /* 11: GetLastError */ - jdwpTransportError (JNICALL *GetLastError)(jdwpTransportEnv* env, - char** error); - -}; - - -/* - * Use inlined functions so that C++ code can use syntax such as - * env->Attach("mymachine:5000", 10*1000, 0); - * - * rather than using C's :- - * - * (*env)->Attach(env, "mymachine:5000", 10*1000, 0); - */ -struct _jdwpTransportEnv { - const struct jdwpTransportNativeInterface_ *functions; -#ifdef __cplusplus - - jdwpTransportError GetCapabilities(JDWPTransportCapabilities *capabilities_ptr) { - return functions->GetCapabilities(this, capabilities_ptr); - } - - jdwpTransportError Attach(const char* address, jlong attach_timeout, - jlong handshake_timeout) { - return functions->Attach(this, address, attach_timeout, handshake_timeout); - } - - jdwpTransportError StartListening(const char* address, - char** actual_address) { - return functions->StartListening(this, address, actual_address); - } - - jdwpTransportError StopListening(void) { - return functions->StopListening(this); - } - - jdwpTransportError Accept(jlong accept_timeout, jlong handshake_timeout) { - return functions->Accept(this, accept_timeout, handshake_timeout); - } - - jboolean IsOpen(void) { - return functions->IsOpen(this); - } - - jdwpTransportError Close(void) { - return functions->Close(this); - } - - jdwpTransportError ReadPacket(jdwpPacket *pkt) { - return functions->ReadPacket(this, pkt); - } - - jdwpTransportError WritePacket(const jdwpPacket* pkt) { - return functions->WritePacket(this, pkt); - } - - jdwpTransportError GetLastError(char** error) { - return functions->GetLastError(this, error); - } - - -#endif /* __cplusplus */ -}; - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* JDWPTRANSPORT_H */ - diff --git a/cpp/nativecall/include/jni.h b/cpp/nativecall/include/jni.h deleted file mode 100644 index 8ed7366..0000000 --- a/cpp/nativecall/include/jni.h +++ /dev/null @@ -1,1944 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -/* - * We used part of Netscape's Java Runtime Interface (JRI) as the starting - * point of our design and implementation. - */ - -/****************************************************************************** - * Java Runtime Interface - * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved. - *****************************************************************************/ - -#ifndef _JAVASOFT_JNI_H_ -#define _JAVASOFT_JNI_H_ - -#include -#include - -/* jni_md.h contains the machine-dependent typedefs for jbyte, jint - and jlong */ - -#include "jni_md.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * JNI Types - */ - -#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H - -typedef unsigned char jboolean; -typedef unsigned short jchar; -typedef short jshort; -typedef float jfloat; -typedef double jdouble; - -typedef jint jsize; - -#ifdef __cplusplus - -class _jobject {}; -class _jclass : public _jobject {}; -class _jthrowable : public _jobject {}; -class _jstring : public _jobject {}; -class _jarray : public _jobject {}; -class _jbooleanArray : public _jarray {}; -class _jbyteArray : public _jarray {}; -class _jcharArray : public _jarray {}; -class _jshortArray : public _jarray {}; -class _jintArray : public _jarray {}; -class _jlongArray : public _jarray {}; -class _jfloatArray : public _jarray {}; -class _jdoubleArray : public _jarray {}; -class _jobjectArray : public _jarray {}; - -typedef _jobject *jobject; -typedef _jclass *jclass; -typedef _jthrowable *jthrowable; -typedef _jstring *jstring; -typedef _jarray *jarray; -typedef _jbooleanArray *jbooleanArray; -typedef _jbyteArray *jbyteArray; -typedef _jcharArray *jcharArray; -typedef _jshortArray *jshortArray; -typedef _jintArray *jintArray; -typedef _jlongArray *jlongArray; -typedef _jfloatArray *jfloatArray; -typedef _jdoubleArray *jdoubleArray; -typedef _jobjectArray *jobjectArray; - -#else - -struct _jobject; - -typedef struct _jobject *jobject; -typedef jobject jclass; -typedef jobject jthrowable; -typedef jobject jstring; -typedef jobject jarray; -typedef jarray jbooleanArray; -typedef jarray jbyteArray; -typedef jarray jcharArray; -typedef jarray jshortArray; -typedef jarray jintArray; -typedef jarray jlongArray; -typedef jarray jfloatArray; -typedef jarray jdoubleArray; -typedef jarray jobjectArray; - -#endif - -typedef jobject jweak; - -typedef union jvalue { - jboolean z; - jbyte b; - jchar c; - jshort s; - jint i; - jlong j; - jfloat f; - jdouble d; - jobject l; -} jvalue; - -struct _jfieldID; -typedef struct _jfieldID *jfieldID; - -struct _jmethodID; -typedef struct _jmethodID *jmethodID; - -/* Return values from jobjectRefType */ -typedef enum _jobjectType { - JNIInvalidRefType = 0, - JNILocalRefType = 1, - JNIGlobalRefType = 2, - JNIWeakGlobalRefType = 3 -} jobjectRefType; - - -#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */ - -/* - * jboolean constants - */ - -#define JNI_FALSE 0 -#define JNI_TRUE 1 - -/* - * possible return values for JNI functions. - */ - -#define JNI_OK 0 /* success */ -#define JNI_ERR (-1) /* unknown error */ -#define JNI_EDETACHED (-2) /* thread detached from the VM */ -#define JNI_EVERSION (-3) /* JNI version error */ -#define JNI_ENOMEM (-4) /* not enough memory */ -#define JNI_EEXIST (-5) /* VM already created */ -#define JNI_EINVAL (-6) /* invalid arguments */ - -/* - * used in ReleaseScalarArrayElements - */ - -#define JNI_COMMIT 1 -#define JNI_ABORT 2 - -/* - * used in RegisterNatives to describe native method name, signature, - * and function pointer. - */ - -typedef struct { - char *name; - char *signature; - void *fnPtr; -} JNINativeMethod; - -/* - * JNI Native Method Interface. - */ - -struct JNINativeInterface_; - -struct JNIEnv_; - -#ifdef __cplusplus -typedef JNIEnv_ JNIEnv; -#else -typedef const struct JNINativeInterface_ *JNIEnv; -#endif - -/* - * JNI Invocation Interface. - */ - -struct JNIInvokeInterface_; - -struct JavaVM_; - -#ifdef __cplusplus -typedef JavaVM_ JavaVM; -#else -typedef const struct JNIInvokeInterface_ *JavaVM; -#endif - -struct JNINativeInterface_ { - void *reserved0; - void *reserved1; - void *reserved2; - - void *reserved3; - jint (JNICALL *GetVersion)(JNIEnv *env); - - jclass (JNICALL *DefineClass) - (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, - jsize len); - jclass (JNICALL *FindClass) - (JNIEnv *env, const char *name); - - jmethodID (JNICALL *FromReflectedMethod) - (JNIEnv *env, jobject method); - jfieldID (JNICALL *FromReflectedField) - (JNIEnv *env, jobject field); - - jobject (JNICALL *ToReflectedMethod) - (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic); - - jclass (JNICALL *GetSuperclass) - (JNIEnv *env, jclass sub); - jboolean (JNICALL *IsAssignableFrom) - (JNIEnv *env, jclass sub, jclass sup); - - jobject (JNICALL *ToReflectedField) - (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic); - - jint (JNICALL *Throw) - (JNIEnv *env, jthrowable obj); - jint (JNICALL *ThrowNew) - (JNIEnv *env, jclass clazz, const char *msg); - jthrowable (JNICALL *ExceptionOccurred) - (JNIEnv *env); - void (JNICALL *ExceptionDescribe) - (JNIEnv *env); - void (JNICALL *ExceptionClear) - (JNIEnv *env); - void (JNICALL *FatalError) - (JNIEnv *env, const char *msg); - - jint (JNICALL *PushLocalFrame) - (JNIEnv *env, jint capacity); - jobject (JNICALL *PopLocalFrame) - (JNIEnv *env, jobject result); - - jobject (JNICALL *NewGlobalRef) - (JNIEnv *env, jobject lobj); - void (JNICALL *DeleteGlobalRef) - (JNIEnv *env, jobject gref); - void (JNICALL *DeleteLocalRef) - (JNIEnv *env, jobject obj); - jboolean (JNICALL *IsSameObject) - (JNIEnv *env, jobject obj1, jobject obj2); - jobject (JNICALL *NewLocalRef) - (JNIEnv *env, jobject ref); - jint (JNICALL *EnsureLocalCapacity) - (JNIEnv *env, jint capacity); - - jobject (JNICALL *AllocObject) - (JNIEnv *env, jclass clazz); - jobject (JNICALL *NewObject) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *NewObjectV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jobject (JNICALL *NewObjectA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jclass (JNICALL *GetObjectClass) - (JNIEnv *env, jobject obj); - jboolean (JNICALL *IsInstanceOf) - (JNIEnv *env, jobject obj, jclass clazz); - - jmethodID (JNICALL *GetMethodID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *CallObjectMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jobject (JNICALL *CallObjectMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jobject (JNICALL *CallObjectMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jboolean (JNICALL *CallBooleanMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jboolean (JNICALL *CallBooleanMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jboolean (JNICALL *CallBooleanMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jbyte (JNICALL *CallByteMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jbyte (JNICALL *CallByteMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jbyte (JNICALL *CallByteMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jchar (JNICALL *CallCharMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jchar (JNICALL *CallCharMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jchar (JNICALL *CallCharMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jshort (JNICALL *CallShortMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jshort (JNICALL *CallShortMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jshort (JNICALL *CallShortMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jint (JNICALL *CallIntMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jint (JNICALL *CallIntMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jint (JNICALL *CallIntMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jlong (JNICALL *CallLongMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jlong (JNICALL *CallLongMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jlong (JNICALL *CallLongMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jfloat (JNICALL *CallFloatMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jfloat (JNICALL *CallFloatMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jfloat (JNICALL *CallFloatMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jdouble (JNICALL *CallDoubleMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jdouble (JNICALL *CallDoubleMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jdouble (JNICALL *CallDoubleMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - void (JNICALL *CallVoidMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - void (JNICALL *CallVoidMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - void (JNICALL *CallVoidMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jobject (JNICALL *CallNonvirtualObjectMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *CallNonvirtualObjectMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jobject (JNICALL *CallNonvirtualObjectMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jboolean (JNICALL *CallNonvirtualBooleanMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jboolean (JNICALL *CallNonvirtualBooleanMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jboolean (JNICALL *CallNonvirtualBooleanMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jbyte (JNICALL *CallNonvirtualByteMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jbyte (JNICALL *CallNonvirtualByteMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jbyte (JNICALL *CallNonvirtualByteMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jchar (JNICALL *CallNonvirtualCharMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jchar (JNICALL *CallNonvirtualCharMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jchar (JNICALL *CallNonvirtualCharMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jshort (JNICALL *CallNonvirtualShortMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jshort (JNICALL *CallNonvirtualShortMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jshort (JNICALL *CallNonvirtualShortMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jint (JNICALL *CallNonvirtualIntMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jint (JNICALL *CallNonvirtualIntMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jint (JNICALL *CallNonvirtualIntMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jlong (JNICALL *CallNonvirtualLongMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jlong (JNICALL *CallNonvirtualLongMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jlong (JNICALL *CallNonvirtualLongMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jfloat (JNICALL *CallNonvirtualFloatMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jfloat (JNICALL *CallNonvirtualFloatMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jfloat (JNICALL *CallNonvirtualFloatMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jdouble (JNICALL *CallNonvirtualDoubleMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jdouble (JNICALL *CallNonvirtualDoubleMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jdouble (JNICALL *CallNonvirtualDoubleMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - void (JNICALL *CallNonvirtualVoidMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - void (JNICALL *CallNonvirtualVoidMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - void (JNICALL *CallNonvirtualVoidMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jfieldID (JNICALL *GetFieldID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *GetObjectField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jboolean (JNICALL *GetBooleanField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jbyte (JNICALL *GetByteField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jchar (JNICALL *GetCharField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jshort (JNICALL *GetShortField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jint (JNICALL *GetIntField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jlong (JNICALL *GetLongField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jfloat (JNICALL *GetFloatField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jdouble (JNICALL *GetDoubleField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - - void (JNICALL *SetObjectField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val); - void (JNICALL *SetBooleanField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val); - void (JNICALL *SetByteField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val); - void (JNICALL *SetCharField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val); - void (JNICALL *SetShortField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val); - void (JNICALL *SetIntField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jint val); - void (JNICALL *SetLongField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val); - void (JNICALL *SetFloatField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val); - void (JNICALL *SetDoubleField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val); - - jmethodID (JNICALL *GetStaticMethodID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *CallStaticObjectMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *CallStaticObjectMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jobject (JNICALL *CallStaticObjectMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jboolean (JNICALL *CallStaticBooleanMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jboolean (JNICALL *CallStaticBooleanMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jboolean (JNICALL *CallStaticBooleanMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jbyte (JNICALL *CallStaticByteMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jbyte (JNICALL *CallStaticByteMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jbyte (JNICALL *CallStaticByteMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jchar (JNICALL *CallStaticCharMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jchar (JNICALL *CallStaticCharMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jchar (JNICALL *CallStaticCharMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jshort (JNICALL *CallStaticShortMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jshort (JNICALL *CallStaticShortMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jshort (JNICALL *CallStaticShortMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jint (JNICALL *CallStaticIntMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jint (JNICALL *CallStaticIntMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jint (JNICALL *CallStaticIntMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jlong (JNICALL *CallStaticLongMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jlong (JNICALL *CallStaticLongMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jlong (JNICALL *CallStaticLongMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jfloat (JNICALL *CallStaticFloatMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jfloat (JNICALL *CallStaticFloatMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jfloat (JNICALL *CallStaticFloatMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jdouble (JNICALL *CallStaticDoubleMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jdouble (JNICALL *CallStaticDoubleMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jdouble (JNICALL *CallStaticDoubleMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - void (JNICALL *CallStaticVoidMethod) - (JNIEnv *env, jclass cls, jmethodID methodID, ...); - void (JNICALL *CallStaticVoidMethodV) - (JNIEnv *env, jclass cls, jmethodID methodID, va_list args); - void (JNICALL *CallStaticVoidMethodA) - (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args); - - jfieldID (JNICALL *GetStaticFieldID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - jobject (JNICALL *GetStaticObjectField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jboolean (JNICALL *GetStaticBooleanField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jbyte (JNICALL *GetStaticByteField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jchar (JNICALL *GetStaticCharField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jshort (JNICALL *GetStaticShortField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jint (JNICALL *GetStaticIntField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jlong (JNICALL *GetStaticLongField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jfloat (JNICALL *GetStaticFloatField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jdouble (JNICALL *GetStaticDoubleField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - - void (JNICALL *SetStaticObjectField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value); - void (JNICALL *SetStaticBooleanField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value); - void (JNICALL *SetStaticByteField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value); - void (JNICALL *SetStaticCharField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value); - void (JNICALL *SetStaticShortField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value); - void (JNICALL *SetStaticIntField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value); - void (JNICALL *SetStaticLongField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value); - void (JNICALL *SetStaticFloatField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value); - void (JNICALL *SetStaticDoubleField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value); - - jstring (JNICALL *NewString) - (JNIEnv *env, const jchar *unicode, jsize len); - jsize (JNICALL *GetStringLength) - (JNIEnv *env, jstring str); - const jchar *(JNICALL *GetStringChars) - (JNIEnv *env, jstring str, jboolean *isCopy); - void (JNICALL *ReleaseStringChars) - (JNIEnv *env, jstring str, const jchar *chars); - - jstring (JNICALL *NewStringUTF) - (JNIEnv *env, const char *utf); - jsize (JNICALL *GetStringUTFLength) - (JNIEnv *env, jstring str); - const char* (JNICALL *GetStringUTFChars) - (JNIEnv *env, jstring str, jboolean *isCopy); - void (JNICALL *ReleaseStringUTFChars) - (JNIEnv *env, jstring str, const char* chars); - - - jsize (JNICALL *GetArrayLength) - (JNIEnv *env, jarray array); - - jobjectArray (JNICALL *NewObjectArray) - (JNIEnv *env, jsize len, jclass clazz, jobject init); - jobject (JNICALL *GetObjectArrayElement) - (JNIEnv *env, jobjectArray array, jsize index); - void (JNICALL *SetObjectArrayElement) - (JNIEnv *env, jobjectArray array, jsize index, jobject val); - - jbooleanArray (JNICALL *NewBooleanArray) - (JNIEnv *env, jsize len); - jbyteArray (JNICALL *NewByteArray) - (JNIEnv *env, jsize len); - jcharArray (JNICALL *NewCharArray) - (JNIEnv *env, jsize len); - jshortArray (JNICALL *NewShortArray) - (JNIEnv *env, jsize len); - jintArray (JNICALL *NewIntArray) - (JNIEnv *env, jsize len); - jlongArray (JNICALL *NewLongArray) - (JNIEnv *env, jsize len); - jfloatArray (JNICALL *NewFloatArray) - (JNIEnv *env, jsize len); - jdoubleArray (JNICALL *NewDoubleArray) - (JNIEnv *env, jsize len); - - jboolean * (JNICALL *GetBooleanArrayElements) - (JNIEnv *env, jbooleanArray array, jboolean *isCopy); - jbyte * (JNICALL *GetByteArrayElements) - (JNIEnv *env, jbyteArray array, jboolean *isCopy); - jchar * (JNICALL *GetCharArrayElements) - (JNIEnv *env, jcharArray array, jboolean *isCopy); - jshort * (JNICALL *GetShortArrayElements) - (JNIEnv *env, jshortArray array, jboolean *isCopy); - jint * (JNICALL *GetIntArrayElements) - (JNIEnv *env, jintArray array, jboolean *isCopy); - jlong * (JNICALL *GetLongArrayElements) - (JNIEnv *env, jlongArray array, jboolean *isCopy); - jfloat * (JNICALL *GetFloatArrayElements) - (JNIEnv *env, jfloatArray array, jboolean *isCopy); - jdouble * (JNICALL *GetDoubleArrayElements) - (JNIEnv *env, jdoubleArray array, jboolean *isCopy); - - void (JNICALL *ReleaseBooleanArrayElements) - (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode); - void (JNICALL *ReleaseByteArrayElements) - (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode); - void (JNICALL *ReleaseCharArrayElements) - (JNIEnv *env, jcharArray array, jchar *elems, jint mode); - void (JNICALL *ReleaseShortArrayElements) - (JNIEnv *env, jshortArray array, jshort *elems, jint mode); - void (JNICALL *ReleaseIntArrayElements) - (JNIEnv *env, jintArray array, jint *elems, jint mode); - void (JNICALL *ReleaseLongArrayElements) - (JNIEnv *env, jlongArray array, jlong *elems, jint mode); - void (JNICALL *ReleaseFloatArrayElements) - (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode); - void (JNICALL *ReleaseDoubleArrayElements) - (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode); - - void (JNICALL *GetBooleanArrayRegion) - (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf); - void (JNICALL *GetByteArrayRegion) - (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf); - void (JNICALL *GetCharArrayRegion) - (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf); - void (JNICALL *GetShortArrayRegion) - (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf); - void (JNICALL *GetIntArrayRegion) - (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf); - void (JNICALL *GetLongArrayRegion) - (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf); - void (JNICALL *GetFloatArrayRegion) - (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf); - void (JNICALL *GetDoubleArrayRegion) - (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf); - - void (JNICALL *SetBooleanArrayRegion) - (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf); - void (JNICALL *SetByteArrayRegion) - (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf); - void (JNICALL *SetCharArrayRegion) - (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf); - void (JNICALL *SetShortArrayRegion) - (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf); - void (JNICALL *SetIntArrayRegion) - (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf); - void (JNICALL *SetLongArrayRegion) - (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf); - void (JNICALL *SetFloatArrayRegion) - (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf); - void (JNICALL *SetDoubleArrayRegion) - (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf); - - jint (JNICALL *RegisterNatives) - (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, - jint nMethods); - jint (JNICALL *UnregisterNatives) - (JNIEnv *env, jclass clazz); - - jint (JNICALL *MonitorEnter) - (JNIEnv *env, jobject obj); - jint (JNICALL *MonitorExit) - (JNIEnv *env, jobject obj); - - jint (JNICALL *GetJavaVM) - (JNIEnv *env, JavaVM **vm); - - void (JNICALL *GetStringRegion) - (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf); - void (JNICALL *GetStringUTFRegion) - (JNIEnv *env, jstring str, jsize start, jsize len, char *buf); - - void * (JNICALL *GetPrimitiveArrayCritical) - (JNIEnv *env, jarray array, jboolean *isCopy); - void (JNICALL *ReleasePrimitiveArrayCritical) - (JNIEnv *env, jarray array, void *carray, jint mode); - - const jchar * (JNICALL *GetStringCritical) - (JNIEnv *env, jstring string, jboolean *isCopy); - void (JNICALL *ReleaseStringCritical) - (JNIEnv *env, jstring string, const jchar *cstring); - - jweak (JNICALL *NewWeakGlobalRef) - (JNIEnv *env, jobject obj); - void (JNICALL *DeleteWeakGlobalRef) - (JNIEnv *env, jweak ref); - - jboolean (JNICALL *ExceptionCheck) - (JNIEnv *env); - - jobject (JNICALL *NewDirectByteBuffer) - (JNIEnv* env, void* address, jlong capacity); - void* (JNICALL *GetDirectBufferAddress) - (JNIEnv* env, jobject buf); - jlong (JNICALL *GetDirectBufferCapacity) - (JNIEnv* env, jobject buf); - - /* New JNI 1.6 Features */ - - jobjectRefType (JNICALL *GetObjectRefType) - (JNIEnv* env, jobject obj); -}; - -/* - * We use inlined functions for C++ so that programmers can write: - * - * env->FindClass("java/lang/String") - * - * in C++ rather than: - * - * (*env)->FindClass(env, "java/lang/String") - * - * in C. - */ - -struct JNIEnv_ { - const struct JNINativeInterface_ *functions; -#ifdef __cplusplus - - jint GetVersion() { - return functions->GetVersion(this); - } - jclass DefineClass(const char *name, jobject loader, const jbyte *buf, - jsize len) { - return functions->DefineClass(this, name, loader, buf, len); - } - jclass FindClass(const char *name) { - return functions->FindClass(this, name); - } - jmethodID FromReflectedMethod(jobject method) { - return functions->FromReflectedMethod(this,method); - } - jfieldID FromReflectedField(jobject field) { - return functions->FromReflectedField(this,field); - } - - jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) { - return functions->ToReflectedMethod(this, cls, methodID, isStatic); - } - - jclass GetSuperclass(jclass sub) { - return functions->GetSuperclass(this, sub); - } - jboolean IsAssignableFrom(jclass sub, jclass sup) { - return functions->IsAssignableFrom(this, sub, sup); - } - - jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) { - return functions->ToReflectedField(this,cls,fieldID,isStatic); - } - - jint Throw(jthrowable obj) { - return functions->Throw(this, obj); - } - jint ThrowNew(jclass clazz, const char *msg) { - return functions->ThrowNew(this, clazz, msg); - } - jthrowable ExceptionOccurred() { - return functions->ExceptionOccurred(this); - } - void ExceptionDescribe() { - functions->ExceptionDescribe(this); - } - void ExceptionClear() { - functions->ExceptionClear(this); - } - void FatalError(const char *msg) { - functions->FatalError(this, msg); - } - - jint PushLocalFrame(jint capacity) { - return functions->PushLocalFrame(this,capacity); - } - jobject PopLocalFrame(jobject result) { - return functions->PopLocalFrame(this,result); - } - - jobject NewGlobalRef(jobject lobj) { - return functions->NewGlobalRef(this,lobj); - } - void DeleteGlobalRef(jobject gref) { - functions->DeleteGlobalRef(this,gref); - } - void DeleteLocalRef(jobject obj) { - functions->DeleteLocalRef(this, obj); - } - - jboolean IsSameObject(jobject obj1, jobject obj2) { - return functions->IsSameObject(this,obj1,obj2); - } - - jobject NewLocalRef(jobject ref) { - return functions->NewLocalRef(this,ref); - } - jint EnsureLocalCapacity(jint capacity) { - return functions->EnsureLocalCapacity(this,capacity); - } - - jobject AllocObject(jclass clazz) { - return functions->AllocObject(this,clazz); - } - jobject NewObject(jclass clazz, jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args, methodID); - result = functions->NewObjectV(this,clazz,methodID,args); - va_end(args); - return result; - } - jobject NewObjectV(jclass clazz, jmethodID methodID, - va_list args) { - return functions->NewObjectV(this,clazz,methodID,args); - } - jobject NewObjectA(jclass clazz, jmethodID methodID, - const jvalue *args) { - return functions->NewObjectA(this,clazz,methodID,args); - } - - jclass GetObjectClass(jobject obj) { - return functions->GetObjectClass(this,obj); - } - jboolean IsInstanceOf(jobject obj, jclass clazz) { - return functions->IsInstanceOf(this,obj,clazz); - } - - jmethodID GetMethodID(jclass clazz, const char *name, - const char *sig) { - return functions->GetMethodID(this,clazz,name,sig); - } - - jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallObjectMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jobject CallObjectMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallObjectMethodV(this,obj,methodID,args); - } - jobject CallObjectMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallObjectMethodA(this,obj,methodID,args); - } - - jboolean CallBooleanMethod(jobject obj, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallBooleanMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jboolean CallBooleanMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallBooleanMethodV(this,obj,methodID,args); - } - jboolean CallBooleanMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallBooleanMethodA(this,obj,methodID, args); - } - - jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallByteMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jbyte CallByteMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallByteMethodV(this,obj,methodID,args); - } - jbyte CallByteMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallByteMethodA(this,obj,methodID,args); - } - - jchar CallCharMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallCharMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jchar CallCharMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallCharMethodV(this,obj,methodID,args); - } - jchar CallCharMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallCharMethodA(this,obj,methodID,args); - } - - jshort CallShortMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallShortMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jshort CallShortMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallShortMethodV(this,obj,methodID,args); - } - jshort CallShortMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallShortMethodA(this,obj,methodID,args); - } - - jint CallIntMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallIntMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jint CallIntMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallIntMethodV(this,obj,methodID,args); - } - jint CallIntMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallIntMethodA(this,obj,methodID,args); - } - - jlong CallLongMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallLongMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jlong CallLongMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallLongMethodV(this,obj,methodID,args); - } - jlong CallLongMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallLongMethodA(this,obj,methodID,args); - } - - jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallFloatMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jfloat CallFloatMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallFloatMethodV(this,obj,methodID,args); - } - jfloat CallFloatMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallFloatMethodA(this,obj,methodID,args); - } - - jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallDoubleMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jdouble CallDoubleMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallDoubleMethodV(this,obj,methodID,args); - } - jdouble CallDoubleMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallDoubleMethodA(this,obj,methodID,args); - } - - void CallVoidMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallVoidMethodV(this,obj,methodID,args); - va_end(args); - } - void CallVoidMethodV(jobject obj, jmethodID methodID, - va_list args) { - functions->CallVoidMethodV(this,obj,methodID,args); - } - void CallVoidMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - functions->CallVoidMethodA(this,obj,methodID,args); - } - - jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallNonvirtualObjectMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualObjectMethodV(this,obj,clazz, - methodID,args); - } - jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualObjectMethodA(this,obj,clazz, - methodID,args); - } - - jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualBooleanMethodV(this,obj,clazz, - methodID,args); - } - jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualBooleanMethodA(this,obj,clazz, - methodID, args); - } - - jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallNonvirtualByteMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualByteMethodV(this,obj,clazz, - methodID,args); - } - jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualByteMethodA(this,obj,clazz, - methodID,args); - } - - jchar CallNonvirtualCharMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallNonvirtualCharMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualCharMethodV(this,obj,clazz, - methodID,args); - } - jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualCharMethodA(this,obj,clazz, - methodID,args); - } - - jshort CallNonvirtualShortMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallNonvirtualShortMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualShortMethodV(this,obj,clazz, - methodID,args); - } - jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualShortMethodA(this,obj,clazz, - methodID,args); - } - - jint CallNonvirtualIntMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallNonvirtualIntMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jint CallNonvirtualIntMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualIntMethodV(this,obj,clazz, - methodID,args); - } - jint CallNonvirtualIntMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualIntMethodA(this,obj,clazz, - methodID,args); - } - - jlong CallNonvirtualLongMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallNonvirtualLongMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualLongMethodV(this,obj,clazz, - methodID,args); - } - jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualLongMethodA(this,obj,clazz, - methodID,args); - } - - jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallNonvirtualFloatMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - return functions->CallNonvirtualFloatMethodV(this,obj,clazz, - methodID,args); - } - jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - return functions->CallNonvirtualFloatMethodA(this,obj,clazz, - methodID,args); - } - - jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - return functions->CallNonvirtualDoubleMethodV(this,obj,clazz, - methodID,args); - } - jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - return functions->CallNonvirtualDoubleMethodA(this,obj,clazz, - methodID,args); - } - - void CallNonvirtualVoidMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); - va_end(args); - } - void CallNonvirtualVoidMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); - } - void CallNonvirtualVoidMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args); - } - - jfieldID GetFieldID(jclass clazz, const char *name, - const char *sig) { - return functions->GetFieldID(this,clazz,name,sig); - } - - jobject GetObjectField(jobject obj, jfieldID fieldID) { - return functions->GetObjectField(this,obj,fieldID); - } - jboolean GetBooleanField(jobject obj, jfieldID fieldID) { - return functions->GetBooleanField(this,obj,fieldID); - } - jbyte GetByteField(jobject obj, jfieldID fieldID) { - return functions->GetByteField(this,obj,fieldID); - } - jchar GetCharField(jobject obj, jfieldID fieldID) { - return functions->GetCharField(this,obj,fieldID); - } - jshort GetShortField(jobject obj, jfieldID fieldID) { - return functions->GetShortField(this,obj,fieldID); - } - jint GetIntField(jobject obj, jfieldID fieldID) { - return functions->GetIntField(this,obj,fieldID); - } - jlong GetLongField(jobject obj, jfieldID fieldID) { - return functions->GetLongField(this,obj,fieldID); - } - jfloat GetFloatField(jobject obj, jfieldID fieldID) { - return functions->GetFloatField(this,obj,fieldID); - } - jdouble GetDoubleField(jobject obj, jfieldID fieldID) { - return functions->GetDoubleField(this,obj,fieldID); - } - - void SetObjectField(jobject obj, jfieldID fieldID, jobject val) { - functions->SetObjectField(this,obj,fieldID,val); - } - void SetBooleanField(jobject obj, jfieldID fieldID, - jboolean val) { - functions->SetBooleanField(this,obj,fieldID,val); - } - void SetByteField(jobject obj, jfieldID fieldID, - jbyte val) { - functions->SetByteField(this,obj,fieldID,val); - } - void SetCharField(jobject obj, jfieldID fieldID, - jchar val) { - functions->SetCharField(this,obj,fieldID,val); - } - void SetShortField(jobject obj, jfieldID fieldID, - jshort val) { - functions->SetShortField(this,obj,fieldID,val); - } - void SetIntField(jobject obj, jfieldID fieldID, - jint val) { - functions->SetIntField(this,obj,fieldID,val); - } - void SetLongField(jobject obj, jfieldID fieldID, - jlong val) { - functions->SetLongField(this,obj,fieldID,val); - } - void SetFloatField(jobject obj, jfieldID fieldID, - jfloat val) { - functions->SetFloatField(this,obj,fieldID,val); - } - void SetDoubleField(jobject obj, jfieldID fieldID, - jdouble val) { - functions->SetDoubleField(this,obj,fieldID,val); - } - - jmethodID GetStaticMethodID(jclass clazz, const char *name, - const char *sig) { - return functions->GetStaticMethodID(this,clazz,name,sig); - } - - jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, - ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallStaticObjectMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID, - va_list args) { - return functions->CallStaticObjectMethodV(this,clazz,methodID,args); - } - jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID, - const jvalue *args) { - return functions->CallStaticObjectMethodA(this,clazz,methodID,args); - } - - jboolean CallStaticBooleanMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jboolean CallStaticBooleanMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticBooleanMethodV(this,clazz,methodID,args); - } - jboolean CallStaticBooleanMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticBooleanMethodA(this,clazz,methodID,args); - } - - jbyte CallStaticByteMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallStaticByteMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jbyte CallStaticByteMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticByteMethodV(this,clazz,methodID,args); - } - jbyte CallStaticByteMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticByteMethodA(this,clazz,methodID,args); - } - - jchar CallStaticCharMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallStaticCharMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jchar CallStaticCharMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticCharMethodV(this,clazz,methodID,args); - } - jchar CallStaticCharMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticCharMethodA(this,clazz,methodID,args); - } - - jshort CallStaticShortMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallStaticShortMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jshort CallStaticShortMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticShortMethodV(this,clazz,methodID,args); - } - jshort CallStaticShortMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticShortMethodA(this,clazz,methodID,args); - } - - jint CallStaticIntMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallStaticIntMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jint CallStaticIntMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticIntMethodV(this,clazz,methodID,args); - } - jint CallStaticIntMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticIntMethodA(this,clazz,methodID,args); - } - - jlong CallStaticLongMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallStaticLongMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jlong CallStaticLongMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticLongMethodV(this,clazz,methodID,args); - } - jlong CallStaticLongMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticLongMethodA(this,clazz,methodID,args); - } - - jfloat CallStaticFloatMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallStaticFloatMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jfloat CallStaticFloatMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticFloatMethodV(this,clazz,methodID,args); - } - jfloat CallStaticFloatMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticFloatMethodA(this,clazz,methodID,args); - } - - jdouble CallStaticDoubleMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jdouble CallStaticDoubleMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticDoubleMethodV(this,clazz,methodID,args); - } - jdouble CallStaticDoubleMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticDoubleMethodA(this,clazz,methodID,args); - } - - void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallStaticVoidMethodV(this,cls,methodID,args); - va_end(args); - } - void CallStaticVoidMethodV(jclass cls, jmethodID methodID, - va_list args) { - functions->CallStaticVoidMethodV(this,cls,methodID,args); - } - void CallStaticVoidMethodA(jclass cls, jmethodID methodID, - const jvalue * args) { - functions->CallStaticVoidMethodA(this,cls,methodID,args); - } - - jfieldID GetStaticFieldID(jclass clazz, const char *name, - const char *sig) { - return functions->GetStaticFieldID(this,clazz,name,sig); - } - jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticObjectField(this,clazz,fieldID); - } - jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticBooleanField(this,clazz,fieldID); - } - jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticByteField(this,clazz,fieldID); - } - jchar GetStaticCharField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticCharField(this,clazz,fieldID); - } - jshort GetStaticShortField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticShortField(this,clazz,fieldID); - } - jint GetStaticIntField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticIntField(this,clazz,fieldID); - } - jlong GetStaticLongField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticLongField(this,clazz,fieldID); - } - jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticFloatField(this,clazz,fieldID); - } - jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticDoubleField(this,clazz,fieldID); - } - - void SetStaticObjectField(jclass clazz, jfieldID fieldID, - jobject value) { - functions->SetStaticObjectField(this,clazz,fieldID,value); - } - void SetStaticBooleanField(jclass clazz, jfieldID fieldID, - jboolean value) { - functions->SetStaticBooleanField(this,clazz,fieldID,value); - } - void SetStaticByteField(jclass clazz, jfieldID fieldID, - jbyte value) { - functions->SetStaticByteField(this,clazz,fieldID,value); - } - void SetStaticCharField(jclass clazz, jfieldID fieldID, - jchar value) { - functions->SetStaticCharField(this,clazz,fieldID,value); - } - void SetStaticShortField(jclass clazz, jfieldID fieldID, - jshort value) { - functions->SetStaticShortField(this,clazz,fieldID,value); - } - void SetStaticIntField(jclass clazz, jfieldID fieldID, - jint value) { - functions->SetStaticIntField(this,clazz,fieldID,value); - } - void SetStaticLongField(jclass clazz, jfieldID fieldID, - jlong value) { - functions->SetStaticLongField(this,clazz,fieldID,value); - } - void SetStaticFloatField(jclass clazz, jfieldID fieldID, - jfloat value) { - functions->SetStaticFloatField(this,clazz,fieldID,value); - } - void SetStaticDoubleField(jclass clazz, jfieldID fieldID, - jdouble value) { - functions->SetStaticDoubleField(this,clazz,fieldID,value); - } - - jstring NewString(const jchar *unicode, jsize len) { - return functions->NewString(this,unicode,len); - } - jsize GetStringLength(jstring str) { - return functions->GetStringLength(this,str); - } - const jchar *GetStringChars(jstring str, jboolean *isCopy) { - return functions->GetStringChars(this,str,isCopy); - } - void ReleaseStringChars(jstring str, const jchar *chars) { - functions->ReleaseStringChars(this,str,chars); - } - - jstring NewStringUTF(const char *utf) { - return functions->NewStringUTF(this,utf); - } - jsize GetStringUTFLength(jstring str) { - return functions->GetStringUTFLength(this,str); - } - const char* GetStringUTFChars(jstring str, jboolean *isCopy) { - return functions->GetStringUTFChars(this,str,isCopy); - } - void ReleaseStringUTFChars(jstring str, const char* chars) { - functions->ReleaseStringUTFChars(this,str,chars); - } - - jsize GetArrayLength(jarray array) { - return functions->GetArrayLength(this,array); - } - - jobjectArray NewObjectArray(jsize len, jclass clazz, - jobject init) { - return functions->NewObjectArray(this,len,clazz,init); - } - jobject GetObjectArrayElement(jobjectArray array, jsize index) { - return functions->GetObjectArrayElement(this,array,index); - } - void SetObjectArrayElement(jobjectArray array, jsize index, - jobject val) { - functions->SetObjectArrayElement(this,array,index,val); - } - - jbooleanArray NewBooleanArray(jsize len) { - return functions->NewBooleanArray(this,len); - } - jbyteArray NewByteArray(jsize len) { - return functions->NewByteArray(this,len); - } - jcharArray NewCharArray(jsize len) { - return functions->NewCharArray(this,len); - } - jshortArray NewShortArray(jsize len) { - return functions->NewShortArray(this,len); - } - jintArray NewIntArray(jsize len) { - return functions->NewIntArray(this,len); - } - jlongArray NewLongArray(jsize len) { - return functions->NewLongArray(this,len); - } - jfloatArray NewFloatArray(jsize len) { - return functions->NewFloatArray(this,len); - } - jdoubleArray NewDoubleArray(jsize len) { - return functions->NewDoubleArray(this,len); - } - - jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) { - return functions->GetBooleanArrayElements(this,array,isCopy); - } - jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) { - return functions->GetByteArrayElements(this,array,isCopy); - } - jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) { - return functions->GetCharArrayElements(this,array,isCopy); - } - jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) { - return functions->GetShortArrayElements(this,array,isCopy); - } - jint * GetIntArrayElements(jintArray array, jboolean *isCopy) { - return functions->GetIntArrayElements(this,array,isCopy); - } - jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) { - return functions->GetLongArrayElements(this,array,isCopy); - } - jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) { - return functions->GetFloatArrayElements(this,array,isCopy); - } - jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) { - return functions->GetDoubleArrayElements(this,array,isCopy); - } - - void ReleaseBooleanArrayElements(jbooleanArray array, - jboolean *elems, - jint mode) { - functions->ReleaseBooleanArrayElements(this,array,elems,mode); - } - void ReleaseByteArrayElements(jbyteArray array, - jbyte *elems, - jint mode) { - functions->ReleaseByteArrayElements(this,array,elems,mode); - } - void ReleaseCharArrayElements(jcharArray array, - jchar *elems, - jint mode) { - functions->ReleaseCharArrayElements(this,array,elems,mode); - } - void ReleaseShortArrayElements(jshortArray array, - jshort *elems, - jint mode) { - functions->ReleaseShortArrayElements(this,array,elems,mode); - } - void ReleaseIntArrayElements(jintArray array, - jint *elems, - jint mode) { - functions->ReleaseIntArrayElements(this,array,elems,mode); - } - void ReleaseLongArrayElements(jlongArray array, - jlong *elems, - jint mode) { - functions->ReleaseLongArrayElements(this,array,elems,mode); - } - void ReleaseFloatArrayElements(jfloatArray array, - jfloat *elems, - jint mode) { - functions->ReleaseFloatArrayElements(this,array,elems,mode); - } - void ReleaseDoubleArrayElements(jdoubleArray array, - jdouble *elems, - jint mode) { - functions->ReleaseDoubleArrayElements(this,array,elems,mode); - } - - void GetBooleanArrayRegion(jbooleanArray array, - jsize start, jsize len, jboolean *buf) { - functions->GetBooleanArrayRegion(this,array,start,len,buf); - } - void GetByteArrayRegion(jbyteArray array, - jsize start, jsize len, jbyte *buf) { - functions->GetByteArrayRegion(this,array,start,len,buf); - } - void GetCharArrayRegion(jcharArray array, - jsize start, jsize len, jchar *buf) { - functions->GetCharArrayRegion(this,array,start,len,buf); - } - void GetShortArrayRegion(jshortArray array, - jsize start, jsize len, jshort *buf) { - functions->GetShortArrayRegion(this,array,start,len,buf); - } - void GetIntArrayRegion(jintArray array, - jsize start, jsize len, jint *buf) { - functions->GetIntArrayRegion(this,array,start,len,buf); - } - void GetLongArrayRegion(jlongArray array, - jsize start, jsize len, jlong *buf) { - functions->GetLongArrayRegion(this,array,start,len,buf); - } - void GetFloatArrayRegion(jfloatArray array, - jsize start, jsize len, jfloat *buf) { - functions->GetFloatArrayRegion(this,array,start,len,buf); - } - void GetDoubleArrayRegion(jdoubleArray array, - jsize start, jsize len, jdouble *buf) { - functions->GetDoubleArrayRegion(this,array,start,len,buf); - } - - void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, - const jboolean *buf) { - functions->SetBooleanArrayRegion(this,array,start,len,buf); - } - void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, - const jbyte *buf) { - functions->SetByteArrayRegion(this,array,start,len,buf); - } - void SetCharArrayRegion(jcharArray array, jsize start, jsize len, - const jchar *buf) { - functions->SetCharArrayRegion(this,array,start,len,buf); - } - void SetShortArrayRegion(jshortArray array, jsize start, jsize len, - const jshort *buf) { - functions->SetShortArrayRegion(this,array,start,len,buf); - } - void SetIntArrayRegion(jintArray array, jsize start, jsize len, - const jint *buf) { - functions->SetIntArrayRegion(this,array,start,len,buf); - } - void SetLongArrayRegion(jlongArray array, jsize start, jsize len, - const jlong *buf) { - functions->SetLongArrayRegion(this,array,start,len,buf); - } - void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, - const jfloat *buf) { - functions->SetFloatArrayRegion(this,array,start,len,buf); - } - void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, - const jdouble *buf) { - functions->SetDoubleArrayRegion(this,array,start,len,buf); - } - - jint RegisterNatives(jclass clazz, const JNINativeMethod *methods, - jint nMethods) { - return functions->RegisterNatives(this,clazz,methods,nMethods); - } - jint UnregisterNatives(jclass clazz) { - return functions->UnregisterNatives(this,clazz); - } - - jint MonitorEnter(jobject obj) { - return functions->MonitorEnter(this,obj); - } - jint MonitorExit(jobject obj) { - return functions->MonitorExit(this,obj); - } - - jint GetJavaVM(JavaVM **vm) { - return functions->GetJavaVM(this,vm); - } - - void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) { - functions->GetStringRegion(this,str,start,len,buf); - } - void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) { - functions->GetStringUTFRegion(this,str,start,len,buf); - } - - void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) { - return functions->GetPrimitiveArrayCritical(this,array,isCopy); - } - void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) { - functions->ReleasePrimitiveArrayCritical(this,array,carray,mode); - } - - const jchar * GetStringCritical(jstring string, jboolean *isCopy) { - return functions->GetStringCritical(this,string,isCopy); - } - void ReleaseStringCritical(jstring string, const jchar *cstring) { - functions->ReleaseStringCritical(this,string,cstring); - } - - jweak NewWeakGlobalRef(jobject obj) { - return functions->NewWeakGlobalRef(this,obj); - } - void DeleteWeakGlobalRef(jweak ref) { - functions->DeleteWeakGlobalRef(this,ref); - } - - jboolean ExceptionCheck() { - return functions->ExceptionCheck(this); - } - - jobject NewDirectByteBuffer(void* address, jlong capacity) { - return functions->NewDirectByteBuffer(this, address, capacity); - } - void* GetDirectBufferAddress(jobject buf) { - return functions->GetDirectBufferAddress(this, buf); - } - jlong GetDirectBufferCapacity(jobject buf) { - return functions->GetDirectBufferCapacity(this, buf); - } - jobjectRefType GetObjectRefType(jobject obj) { - return functions->GetObjectRefType(this, obj); - } - -#endif /* __cplusplus */ -}; - -typedef struct JavaVMOption { - char *optionString; - void *extraInfo; -} JavaVMOption; - -typedef struct JavaVMInitArgs { - jint version; - - jint nOptions; - JavaVMOption *options; - jboolean ignoreUnrecognized; -} JavaVMInitArgs; - -typedef struct JavaVMAttachArgs { - jint version; - - char *name; - jobject group; -} JavaVMAttachArgs; - -/* These will be VM-specific. */ - -#define JDK1_2 -#define JDK1_4 - -/* End VM-specific. */ - -struct JNIInvokeInterface_ { - void *reserved0; - void *reserved1; - void *reserved2; - - jint (JNICALL *DestroyJavaVM)(JavaVM *vm); - - jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args); - - jint (JNICALL *DetachCurrentThread)(JavaVM *vm); - - jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version); - - jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args); -}; - -struct JavaVM_ { - const struct JNIInvokeInterface_ *functions; -#ifdef __cplusplus - - jint DestroyJavaVM() { - return functions->DestroyJavaVM(this); - } - jint AttachCurrentThread(void **penv, void *args) { - return functions->AttachCurrentThread(this, penv, args); - } - jint DetachCurrentThread() { - return functions->DetachCurrentThread(this); - } - - jint GetEnv(void **penv, jint version) { - return functions->GetEnv(this, penv, version); - } - jint AttachCurrentThreadAsDaemon(void **penv, void *args) { - return functions->AttachCurrentThreadAsDaemon(this, penv, args); - } -#endif -}; - -#ifdef _JNI_IMPLEMENTATION_ -#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT -#else -#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT -#endif -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_GetDefaultJavaVMInitArgs(void *args); - -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args); - -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *); - -/* Defined by native libraries. */ -JNIEXPORT jint JNICALL -JNI_OnLoad(JavaVM *vm, void *reserved); - -JNIEXPORT void JNICALL -JNI_OnUnload(JavaVM *vm, void *reserved); - -#define JNI_VERSION_1_1 0x00010001 -#define JNI_VERSION_1_2 0x00010002 -#define JNI_VERSION_1_4 0x00010004 -#define JNI_VERSION_1_6 0x00010006 - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !_JAVASOFT_JNI_H_ */ - - - diff --git a/cpp/nativecall/include/jvmti.h b/cpp/nativecall/include/jvmti.h deleted file mode 100644 index 865f21e..0000000 --- a/cpp/nativecall/include/jvmti.h +++ /dev/null @@ -1,2504 +0,0 @@ -#ifdef USE_PRAGMA_IDENT_HDR -#pragma ident "@(#)jvmtiLib.xsl 1.38 06/08/02 23:22:31 JVM" -#endif -/* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - - /* AUTOMATICALLY GENERATED FILE - DO NOT EDIT */ - - - /* Include file for the Java(tm) Virtual Machine Tool Interface */ - -#ifndef _JAVA_JVMTI_H_ -#define _JAVA_JVMTI_H_ - -#include "jni.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - JVMTI_VERSION_1 = 0x30010000, - JVMTI_VERSION_1_0 = 0x30010000, - JVMTI_VERSION_1_1 = 0x30010100, - - JVMTI_VERSION = 0x30000000 + (1 * 0x10000) + (1 * 0x100) + 102 /* version: 1.1.102 */ -}; - -JNIEXPORT jint JNICALL -Agent_OnLoad(JavaVM *vm, char *options, void *reserved); - -JNIEXPORT jint JNICALL -Agent_OnAttach(JavaVM* vm, char* options, void* reserved); - -JNIEXPORT void JNICALL -Agent_OnUnload(JavaVM *vm); - - /* Forward declaration of the environment */ - -struct _jvmtiEnv; - -struct jvmtiInterface_1_; - -#ifdef __cplusplus -typedef _jvmtiEnv jvmtiEnv; -#else -typedef const struct jvmtiInterface_1_ *jvmtiEnv; -#endif /* __cplusplus */ - -/* Derived Base Types */ - -typedef jobject jthread; -typedef jobject jthreadGroup; -typedef jlong jlocation; -struct _jrawMonitorID; -typedef struct _jrawMonitorID *jrawMonitorID; -typedef struct JNINativeInterface_ jniNativeInterface; - - /* Constants */ - - - /* Thread State Flags */ - -enum { - JVMTI_THREAD_STATE_ALIVE = 0x0001, - JVMTI_THREAD_STATE_TERMINATED = 0x0002, - JVMTI_THREAD_STATE_RUNNABLE = 0x0004, - JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400, - JVMTI_THREAD_STATE_WAITING = 0x0080, - JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010, - JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020, - JVMTI_THREAD_STATE_SLEEPING = 0x0040, - JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100, - JVMTI_THREAD_STATE_PARKED = 0x0200, - JVMTI_THREAD_STATE_SUSPENDED = 0x100000, - JVMTI_THREAD_STATE_INTERRUPTED = 0x200000, - JVMTI_THREAD_STATE_IN_NATIVE = 0x400000, - JVMTI_THREAD_STATE_VENDOR_1 = 0x10000000, - JVMTI_THREAD_STATE_VENDOR_2 = 0x20000000, - JVMTI_THREAD_STATE_VENDOR_3 = 0x40000000 -}; - - /* java.lang.Thread.State Conversion Masks */ - -enum { - JVMTI_JAVA_LANG_THREAD_STATE_MASK = JVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT, - JVMTI_JAVA_LANG_THREAD_STATE_NEW = 0, - JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED = JVMTI_THREAD_STATE_TERMINATED, - JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE, - JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER, - JVMTI_JAVA_LANG_THREAD_STATE_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY, - JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT -}; - - /* Thread Priority Constants */ - -enum { - JVMTI_THREAD_MIN_PRIORITY = 1, - JVMTI_THREAD_NORM_PRIORITY = 5, - JVMTI_THREAD_MAX_PRIORITY = 10 -}; - - /* Heap Filter Flags */ - -enum { - JVMTI_HEAP_FILTER_TAGGED = 0x4, - JVMTI_HEAP_FILTER_UNTAGGED = 0x8, - JVMTI_HEAP_FILTER_CLASS_TAGGED = 0x10, - JVMTI_HEAP_FILTER_CLASS_UNTAGGED = 0x20 -}; - - /* Heap Visit Control Flags */ - -enum { - JVMTI_VISIT_OBJECTS = 0x100, - JVMTI_VISIT_ABORT = 0x8000 -}; - - /* Heap Reference Enumeration */ - -typedef enum { - JVMTI_HEAP_REFERENCE_CLASS = 1, - JVMTI_HEAP_REFERENCE_FIELD = 2, - JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT = 3, - JVMTI_HEAP_REFERENCE_CLASS_LOADER = 4, - JVMTI_HEAP_REFERENCE_SIGNERS = 5, - JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN = 6, - JVMTI_HEAP_REFERENCE_INTERFACE = 7, - JVMTI_HEAP_REFERENCE_STATIC_FIELD = 8, - JVMTI_HEAP_REFERENCE_CONSTANT_POOL = 9, - JVMTI_HEAP_REFERENCE_SUPERCLASS = 10, - JVMTI_HEAP_REFERENCE_JNI_GLOBAL = 21, - JVMTI_HEAP_REFERENCE_SYSTEM_CLASS = 22, - JVMTI_HEAP_REFERENCE_MONITOR = 23, - JVMTI_HEAP_REFERENCE_STACK_LOCAL = 24, - JVMTI_HEAP_REFERENCE_JNI_LOCAL = 25, - JVMTI_HEAP_REFERENCE_THREAD = 26, - JVMTI_HEAP_REFERENCE_OTHER = 27 -} jvmtiHeapReferenceKind; - - /* Primitive Type Enumeration */ - -typedef enum { - JVMTI_PRIMITIVE_TYPE_BOOLEAN = 90, - JVMTI_PRIMITIVE_TYPE_BYTE = 66, - JVMTI_PRIMITIVE_TYPE_CHAR = 67, - JVMTI_PRIMITIVE_TYPE_SHORT = 83, - JVMTI_PRIMITIVE_TYPE_INT = 73, - JVMTI_PRIMITIVE_TYPE_LONG = 74, - JVMTI_PRIMITIVE_TYPE_FLOAT = 70, - JVMTI_PRIMITIVE_TYPE_DOUBLE = 68 -} jvmtiPrimitiveType; - - /* Heap Object Filter Enumeration */ - -typedef enum { - JVMTI_HEAP_OBJECT_TAGGED = 1, - JVMTI_HEAP_OBJECT_UNTAGGED = 2, - JVMTI_HEAP_OBJECT_EITHER = 3 -} jvmtiHeapObjectFilter; - - /* Heap Root Kind Enumeration */ - -typedef enum { - JVMTI_HEAP_ROOT_JNI_GLOBAL = 1, - JVMTI_HEAP_ROOT_SYSTEM_CLASS = 2, - JVMTI_HEAP_ROOT_MONITOR = 3, - JVMTI_HEAP_ROOT_STACK_LOCAL = 4, - JVMTI_HEAP_ROOT_JNI_LOCAL = 5, - JVMTI_HEAP_ROOT_THREAD = 6, - JVMTI_HEAP_ROOT_OTHER = 7 -} jvmtiHeapRootKind; - - /* Object Reference Enumeration */ - -typedef enum { - JVMTI_REFERENCE_CLASS = 1, - JVMTI_REFERENCE_FIELD = 2, - JVMTI_REFERENCE_ARRAY_ELEMENT = 3, - JVMTI_REFERENCE_CLASS_LOADER = 4, - JVMTI_REFERENCE_SIGNERS = 5, - JVMTI_REFERENCE_PROTECTION_DOMAIN = 6, - JVMTI_REFERENCE_INTERFACE = 7, - JVMTI_REFERENCE_STATIC_FIELD = 8, - JVMTI_REFERENCE_CONSTANT_POOL = 9 -} jvmtiObjectReferenceKind; - - /* Iteration Control Enumeration */ - -typedef enum { - JVMTI_ITERATION_CONTINUE = 1, - JVMTI_ITERATION_IGNORE = 2, - JVMTI_ITERATION_ABORT = 0 -} jvmtiIterationControl; - - /* Class Status Flags */ - -enum { - JVMTI_CLASS_STATUS_VERIFIED = 1, - JVMTI_CLASS_STATUS_PREPARED = 2, - JVMTI_CLASS_STATUS_INITIALIZED = 4, - JVMTI_CLASS_STATUS_ERROR = 8, - JVMTI_CLASS_STATUS_ARRAY = 16, - JVMTI_CLASS_STATUS_PRIMITIVE = 32 -}; - - /* Event Enable/Disable */ - -typedef enum { - JVMTI_ENABLE = 1, - JVMTI_DISABLE = 0 -} jvmtiEventMode; - - /* Extension Function/Event Parameter Types */ - -typedef enum { - JVMTI_TYPE_JBYTE = 101, - JVMTI_TYPE_JCHAR = 102, - JVMTI_TYPE_JSHORT = 103, - JVMTI_TYPE_JINT = 104, - JVMTI_TYPE_JLONG = 105, - JVMTI_TYPE_JFLOAT = 106, - JVMTI_TYPE_JDOUBLE = 107, - JVMTI_TYPE_JBOOLEAN = 108, - JVMTI_TYPE_JOBJECT = 109, - JVMTI_TYPE_JTHREAD = 110, - JVMTI_TYPE_JCLASS = 111, - JVMTI_TYPE_JVALUE = 112, - JVMTI_TYPE_JFIELDID = 113, - JVMTI_TYPE_JMETHODID = 114, - JVMTI_TYPE_CCHAR = 115, - JVMTI_TYPE_CVOID = 116, - JVMTI_TYPE_JNIENV = 117 -} jvmtiParamTypes; - - /* Extension Function/Event Parameter Kinds */ - -typedef enum { - JVMTI_KIND_IN = 91, - JVMTI_KIND_IN_PTR = 92, - JVMTI_KIND_IN_BUF = 93, - JVMTI_KIND_ALLOC_BUF = 94, - JVMTI_KIND_ALLOC_ALLOC_BUF = 95, - JVMTI_KIND_OUT = 96, - JVMTI_KIND_OUT_BUF = 97 -} jvmtiParamKind; - - /* Timer Kinds */ - -typedef enum { - JVMTI_TIMER_USER_CPU = 30, - JVMTI_TIMER_TOTAL_CPU = 31, - JVMTI_TIMER_ELAPSED = 32 -} jvmtiTimerKind; - - /* Phases of execution */ - -typedef enum { - JVMTI_PHASE_ONLOAD = 1, - JVMTI_PHASE_PRIMORDIAL = 2, - JVMTI_PHASE_START = 6, - JVMTI_PHASE_LIVE = 4, - JVMTI_PHASE_DEAD = 8 -} jvmtiPhase; - - /* Version Interface Types */ - -enum { - JVMTI_VERSION_INTERFACE_JNI = 0x00000000, - JVMTI_VERSION_INTERFACE_JVMTI = 0x30000000 -}; - - /* Version Masks */ - -enum { - JVMTI_VERSION_MASK_INTERFACE_TYPE = 0x70000000, - JVMTI_VERSION_MASK_MAJOR = 0x0FFF0000, - JVMTI_VERSION_MASK_MINOR = 0x0000FF00, - JVMTI_VERSION_MASK_MICRO = 0x000000FF -}; - - /* Version Shifts */ - -enum { - JVMTI_VERSION_SHIFT_MAJOR = 16, - JVMTI_VERSION_SHIFT_MINOR = 8, - JVMTI_VERSION_SHIFT_MICRO = 0 -}; - - /* Verbose Flag Enumeration */ - -typedef enum { - JVMTI_VERBOSE_OTHER = 0, - JVMTI_VERBOSE_GC = 1, - JVMTI_VERBOSE_CLASS = 2, - JVMTI_VERBOSE_JNI = 4 -} jvmtiVerboseFlag; - - /* JLocation Format Enumeration */ - -typedef enum { - JVMTI_JLOCATION_JVMBCI = 1, - JVMTI_JLOCATION_MACHINEPC = 2, - JVMTI_JLOCATION_OTHER = 0 -} jvmtiJlocationFormat; - - /* Resource Exhaustion Flags */ - -enum { - JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR = 0x0001, - JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP = 0x0002, - JVMTI_RESOURCE_EXHAUSTED_THREADS = 0x0004 -}; - - /* Errors */ - -typedef enum { - JVMTI_ERROR_NONE = 0, - JVMTI_ERROR_INVALID_THREAD = 10, - JVMTI_ERROR_INVALID_THREAD_GROUP = 11, - JVMTI_ERROR_INVALID_PRIORITY = 12, - JVMTI_ERROR_THREAD_NOT_SUSPENDED = 13, - JVMTI_ERROR_THREAD_SUSPENDED = 14, - JVMTI_ERROR_THREAD_NOT_ALIVE = 15, - JVMTI_ERROR_INVALID_OBJECT = 20, - JVMTI_ERROR_INVALID_CLASS = 21, - JVMTI_ERROR_CLASS_NOT_PREPARED = 22, - JVMTI_ERROR_INVALID_METHODID = 23, - JVMTI_ERROR_INVALID_LOCATION = 24, - JVMTI_ERROR_INVALID_FIELDID = 25, - JVMTI_ERROR_NO_MORE_FRAMES = 31, - JVMTI_ERROR_OPAQUE_FRAME = 32, - JVMTI_ERROR_TYPE_MISMATCH = 34, - JVMTI_ERROR_INVALID_SLOT = 35, - JVMTI_ERROR_DUPLICATE = 40, - JVMTI_ERROR_NOT_FOUND = 41, - JVMTI_ERROR_INVALID_MONITOR = 50, - JVMTI_ERROR_NOT_MONITOR_OWNER = 51, - JVMTI_ERROR_INTERRUPT = 52, - JVMTI_ERROR_INVALID_CLASS_FORMAT = 60, - JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION = 61, - JVMTI_ERROR_FAILS_VERIFICATION = 62, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED = 63, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED = 64, - JVMTI_ERROR_INVALID_TYPESTATE = 65, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED = 66, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED = 67, - JVMTI_ERROR_UNSUPPORTED_VERSION = 68, - JVMTI_ERROR_NAMES_DONT_MATCH = 69, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED = 70, - JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED = 71, - JVMTI_ERROR_UNMODIFIABLE_CLASS = 79, - JVMTI_ERROR_NOT_AVAILABLE = 98, - JVMTI_ERROR_MUST_POSSESS_CAPABILITY = 99, - JVMTI_ERROR_NULL_POINTER = 100, - JVMTI_ERROR_ABSENT_INFORMATION = 101, - JVMTI_ERROR_INVALID_EVENT_TYPE = 102, - JVMTI_ERROR_ILLEGAL_ARGUMENT = 103, - JVMTI_ERROR_NATIVE_METHOD = 104, - JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED = 106, - JVMTI_ERROR_OUT_OF_MEMORY = 110, - JVMTI_ERROR_ACCESS_DENIED = 111, - JVMTI_ERROR_WRONG_PHASE = 112, - JVMTI_ERROR_INTERNAL = 113, - JVMTI_ERROR_UNATTACHED_THREAD = 115, - JVMTI_ERROR_INVALID_ENVIRONMENT = 116, - JVMTI_ERROR_MAX = 116 -} jvmtiError; - - /* Event IDs */ - -typedef enum { - JVMTI_MIN_EVENT_TYPE_VAL = 50, - JVMTI_EVENT_VM_INIT = 50, - JVMTI_EVENT_VM_DEATH = 51, - JVMTI_EVENT_THREAD_START = 52, - JVMTI_EVENT_THREAD_END = 53, - JVMTI_EVENT_CLASS_FILE_LOAD_HOOK = 54, - JVMTI_EVENT_CLASS_LOAD = 55, - JVMTI_EVENT_CLASS_PREPARE = 56, - JVMTI_EVENT_VM_START = 57, - JVMTI_EVENT_EXCEPTION = 58, - JVMTI_EVENT_EXCEPTION_CATCH = 59, - JVMTI_EVENT_SINGLE_STEP = 60, - JVMTI_EVENT_FRAME_POP = 61, - JVMTI_EVENT_BREAKPOINT = 62, - JVMTI_EVENT_FIELD_ACCESS = 63, - JVMTI_EVENT_FIELD_MODIFICATION = 64, - JVMTI_EVENT_METHOD_ENTRY = 65, - JVMTI_EVENT_METHOD_EXIT = 66, - JVMTI_EVENT_NATIVE_METHOD_BIND = 67, - JVMTI_EVENT_COMPILED_METHOD_LOAD = 68, - JVMTI_EVENT_COMPILED_METHOD_UNLOAD = 69, - JVMTI_EVENT_DYNAMIC_CODE_GENERATED = 70, - JVMTI_EVENT_DATA_DUMP_REQUEST = 71, - JVMTI_EVENT_MONITOR_WAIT = 73, - JVMTI_EVENT_MONITOR_WAITED = 74, - JVMTI_EVENT_MONITOR_CONTENDED_ENTER = 75, - JVMTI_EVENT_MONITOR_CONTENDED_ENTERED = 76, - JVMTI_EVENT_RESOURCE_EXHAUSTED = 80, - JVMTI_EVENT_GARBAGE_COLLECTION_START = 81, - JVMTI_EVENT_GARBAGE_COLLECTION_FINISH = 82, - JVMTI_EVENT_OBJECT_FREE = 83, - JVMTI_EVENT_VM_OBJECT_ALLOC = 84, - JVMTI_MAX_EVENT_TYPE_VAL = 84 -} jvmtiEvent; - - - /* Pre-Declarations */ -struct _jvmtiThreadInfo; -typedef struct _jvmtiThreadInfo jvmtiThreadInfo; -struct _jvmtiMonitorStackDepthInfo; -typedef struct _jvmtiMonitorStackDepthInfo jvmtiMonitorStackDepthInfo; -struct _jvmtiThreadGroupInfo; -typedef struct _jvmtiThreadGroupInfo jvmtiThreadGroupInfo; -struct _jvmtiFrameInfo; -typedef struct _jvmtiFrameInfo jvmtiFrameInfo; -struct _jvmtiStackInfo; -typedef struct _jvmtiStackInfo jvmtiStackInfo; -struct _jvmtiHeapReferenceInfoField; -typedef struct _jvmtiHeapReferenceInfoField jvmtiHeapReferenceInfoField; -struct _jvmtiHeapReferenceInfoArray; -typedef struct _jvmtiHeapReferenceInfoArray jvmtiHeapReferenceInfoArray; -struct _jvmtiHeapReferenceInfoConstantPool; -typedef struct _jvmtiHeapReferenceInfoConstantPool jvmtiHeapReferenceInfoConstantPool; -struct _jvmtiHeapReferenceInfoStackLocal; -typedef struct _jvmtiHeapReferenceInfoStackLocal jvmtiHeapReferenceInfoStackLocal; -struct _jvmtiHeapReferenceInfoJniLocal; -typedef struct _jvmtiHeapReferenceInfoJniLocal jvmtiHeapReferenceInfoJniLocal; -struct _jvmtiHeapReferenceInfoReserved; -typedef struct _jvmtiHeapReferenceInfoReserved jvmtiHeapReferenceInfoReserved; -union _jvmtiHeapReferenceInfo; -typedef union _jvmtiHeapReferenceInfo jvmtiHeapReferenceInfo; -struct _jvmtiHeapCallbacks; -typedef struct _jvmtiHeapCallbacks jvmtiHeapCallbacks; -struct _jvmtiClassDefinition; -typedef struct _jvmtiClassDefinition jvmtiClassDefinition; -struct _jvmtiMonitorUsage; -typedef struct _jvmtiMonitorUsage jvmtiMonitorUsage; -struct _jvmtiLineNumberEntry; -typedef struct _jvmtiLineNumberEntry jvmtiLineNumberEntry; -struct _jvmtiLocalVariableEntry; -typedef struct _jvmtiLocalVariableEntry jvmtiLocalVariableEntry; -struct _jvmtiParamInfo; -typedef struct _jvmtiParamInfo jvmtiParamInfo; -struct _jvmtiExtensionFunctionInfo; -typedef struct _jvmtiExtensionFunctionInfo jvmtiExtensionFunctionInfo; -struct _jvmtiExtensionEventInfo; -typedef struct _jvmtiExtensionEventInfo jvmtiExtensionEventInfo; -struct _jvmtiTimerInfo; -typedef struct _jvmtiTimerInfo jvmtiTimerInfo; -struct _jvmtiAddrLocationMap; -typedef struct _jvmtiAddrLocationMap jvmtiAddrLocationMap; - - /* Function Types */ - -typedef void (JNICALL *jvmtiStartFunction) - (jvmtiEnv* jvmti_env, JNIEnv* jni_env, void* arg); - -typedef jint (JNICALL *jvmtiHeapIterationCallback) - (jlong class_tag, jlong size, jlong* tag_ptr, jint length, void* user_data); - -typedef jint (JNICALL *jvmtiHeapReferenceCallback) - (jvmtiHeapReferenceKind reference_kind, const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, jlong referrer_class_tag, jlong size, jlong* tag_ptr, jlong* referrer_tag_ptr, jint length, void* user_data); - -typedef jint (JNICALL *jvmtiPrimitiveFieldCallback) - (jvmtiHeapReferenceKind kind, const jvmtiHeapReferenceInfo* info, jlong object_class_tag, jlong* object_tag_ptr, jvalue value, jvmtiPrimitiveType value_type, void* user_data); - -typedef jint (JNICALL *jvmtiArrayPrimitiveValueCallback) - (jlong class_tag, jlong size, jlong* tag_ptr, jint element_count, jvmtiPrimitiveType element_type, const void* elements, void* user_data); - -typedef jint (JNICALL *jvmtiStringPrimitiveValueCallback) - (jlong class_tag, jlong size, jlong* tag_ptr, const jchar* value, jint value_length, void* user_data); - -typedef jint (JNICALL *jvmtiReservedCallback) - (); - -typedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback) - (jlong class_tag, jlong size, jlong* tag_ptr, void* user_data); - -typedef jvmtiIterationControl (JNICALL *jvmtiHeapRootCallback) - (jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, jlong* tag_ptr, void* user_data); - -typedef jvmtiIterationControl (JNICALL *jvmtiStackReferenceCallback) - (jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong thread_tag, jint depth, jmethodID method, jint slot, void* user_data); - -typedef jvmtiIterationControl (JNICALL *jvmtiObjectReferenceCallback) - (jvmtiObjectReferenceKind reference_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong referrer_tag, jint referrer_index, void* user_data); - -typedef jvmtiError (JNICALL *jvmtiExtensionFunction) - (jvmtiEnv* jvmti_env, ...); - -typedef void (JNICALL *jvmtiExtensionEvent) - (jvmtiEnv* jvmti_env, ...); - - - /* Structure Types */ -struct _jvmtiThreadInfo { - char* name; - jint priority; - jboolean is_daemon; - jthreadGroup thread_group; - jobject context_class_loader; -}; -struct _jvmtiMonitorStackDepthInfo { - jobject monitor; - jint stack_depth; -}; -struct _jvmtiThreadGroupInfo { - jthreadGroup parent; - char* name; - jint max_priority; - jboolean is_daemon; -}; -struct _jvmtiFrameInfo { - jmethodID method; - jlocation location; -}; -struct _jvmtiStackInfo { - jthread thread; - jint state; - jvmtiFrameInfo* frame_buffer; - jint frame_count; -}; -struct _jvmtiHeapReferenceInfoField { - jint index; -}; -struct _jvmtiHeapReferenceInfoArray { - jint index; -}; -struct _jvmtiHeapReferenceInfoConstantPool { - jint index; -}; -struct _jvmtiHeapReferenceInfoStackLocal { - jlong thread_tag; - jlong thread_id; - jint depth; - jmethodID method; - jlocation location; - jint slot; -}; -struct _jvmtiHeapReferenceInfoJniLocal { - jlong thread_tag; - jlong thread_id; - jint depth; - jmethodID method; -}; -struct _jvmtiHeapReferenceInfoReserved { - jlong reserved1; - jlong reserved2; - jlong reserved3; - jlong reserved4; - jlong reserved5; - jlong reserved6; - jlong reserved7; - jlong reserved8; -}; -union _jvmtiHeapReferenceInfo { - jvmtiHeapReferenceInfoField field; - jvmtiHeapReferenceInfoArray array; - jvmtiHeapReferenceInfoConstantPool constant_pool; - jvmtiHeapReferenceInfoStackLocal stack_local; - jvmtiHeapReferenceInfoJniLocal jni_local; - jvmtiHeapReferenceInfoReserved other; -}; -struct _jvmtiHeapCallbacks { - jvmtiHeapIterationCallback heap_iteration_callback; - jvmtiHeapReferenceCallback heap_reference_callback; - jvmtiPrimitiveFieldCallback primitive_field_callback; - jvmtiArrayPrimitiveValueCallback array_primitive_value_callback; - jvmtiStringPrimitiveValueCallback string_primitive_value_callback; - jvmtiReservedCallback reserved5; - jvmtiReservedCallback reserved6; - jvmtiReservedCallback reserved7; - jvmtiReservedCallback reserved8; - jvmtiReservedCallback reserved9; - jvmtiReservedCallback reserved10; - jvmtiReservedCallback reserved11; - jvmtiReservedCallback reserved12; - jvmtiReservedCallback reserved13; - jvmtiReservedCallback reserved14; - jvmtiReservedCallback reserved15; -}; -struct _jvmtiClassDefinition { - jclass klass; - jint class_byte_count; - const unsigned char* class_bytes; -}; -struct _jvmtiMonitorUsage { - jthread owner; - jint entry_count; - jint waiter_count; - jthread* waiters; - jint notify_waiter_count; - jthread* notify_waiters; -}; -struct _jvmtiLineNumberEntry { - jlocation start_location; - jint line_number; -}; -struct _jvmtiLocalVariableEntry { - jlocation start_location; - jint length; - char* name; - char* signature; - char* generic_signature; - jint slot; -}; -struct _jvmtiParamInfo { - char* name; - jvmtiParamKind kind; - jvmtiParamTypes base_type; - jboolean null_ok; -}; -struct _jvmtiExtensionFunctionInfo { - jvmtiExtensionFunction func; - char* id; - char* short_description; - jint param_count; - jvmtiParamInfo* params; - jint error_count; - jvmtiError* errors; -}; -struct _jvmtiExtensionEventInfo { - jint extension_event_index; - char* id; - char* short_description; - jint param_count; - jvmtiParamInfo* params; -}; -struct _jvmtiTimerInfo { - jlong max_value; - jboolean may_skip_forward; - jboolean may_skip_backward; - jvmtiTimerKind kind; - jlong reserved1; - jlong reserved2; -}; -struct _jvmtiAddrLocationMap { - const void* start_address; - jlocation location; -}; - -typedef struct { - unsigned int can_tag_objects : 1; - unsigned int can_generate_field_modification_events : 1; - unsigned int can_generate_field_access_events : 1; - unsigned int can_get_bytecodes : 1; - unsigned int can_get_synthetic_attribute : 1; - unsigned int can_get_owned_monitor_info : 1; - unsigned int can_get_current_contended_monitor : 1; - unsigned int can_get_monitor_info : 1; - unsigned int can_pop_frame : 1; - unsigned int can_redefine_classes : 1; - unsigned int can_signal_thread : 1; - unsigned int can_get_source_file_name : 1; - unsigned int can_get_line_numbers : 1; - unsigned int can_get_source_debug_extension : 1; - unsigned int can_access_local_variables : 1; - unsigned int can_maintain_original_method_order : 1; - unsigned int can_generate_single_step_events : 1; - unsigned int can_generate_exception_events : 1; - unsigned int can_generate_frame_pop_events : 1; - unsigned int can_generate_breakpoint_events : 1; - unsigned int can_suspend : 1; - unsigned int can_redefine_any_class : 1; - unsigned int can_get_current_thread_cpu_time : 1; - unsigned int can_get_thread_cpu_time : 1; - unsigned int can_generate_method_entry_events : 1; - unsigned int can_generate_method_exit_events : 1; - unsigned int can_generate_all_class_hook_events : 1; - unsigned int can_generate_compiled_method_load_events : 1; - unsigned int can_generate_monitor_events : 1; - unsigned int can_generate_vm_object_alloc_events : 1; - unsigned int can_generate_native_method_bind_events : 1; - unsigned int can_generate_garbage_collection_events : 1; - unsigned int can_generate_object_free_events : 1; - unsigned int can_force_early_return : 1; - unsigned int can_get_owned_monitor_stack_depth_info : 1; - unsigned int can_get_constant_pool : 1; - unsigned int can_set_native_method_prefix : 1; - unsigned int can_retransform_classes : 1; - unsigned int can_retransform_any_class : 1; - unsigned int can_generate_resource_exhaustion_heap_events : 1; - unsigned int can_generate_resource_exhaustion_threads_events : 1; - unsigned int : 7; - unsigned int : 16; - unsigned int : 16; - unsigned int : 16; - unsigned int : 16; - unsigned int : 16; -} jvmtiCapabilities; - - - /* Event Definitions */ - -typedef void (JNICALL *jvmtiEventReserved)(void); - - -typedef void (JNICALL *jvmtiEventBreakpoint) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location); - -typedef void (JNICALL *jvmtiEventClassFileLoadHook) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jclass class_being_redefined, - jobject loader, - const char* name, - jobject protection_domain, - jint class_data_len, - const unsigned char* class_data, - jint* new_class_data_len, - unsigned char** new_class_data); - -typedef void (JNICALL *jvmtiEventClassLoad) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jclass klass); - -typedef void (JNICALL *jvmtiEventClassPrepare) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jclass klass); - -typedef void (JNICALL *jvmtiEventCompiledMethodLoad) - (jvmtiEnv *jvmti_env, - jmethodID method, - jint code_size, - const void* code_addr, - jint map_length, - const jvmtiAddrLocationMap* map, - const void* compile_info); - -typedef void (JNICALL *jvmtiEventCompiledMethodUnload) - (jvmtiEnv *jvmti_env, - jmethodID method, - const void* code_addr); - -typedef void (JNICALL *jvmtiEventDataDumpRequest) - (jvmtiEnv *jvmti_env); - -typedef void (JNICALL *jvmtiEventDynamicCodeGenerated) - (jvmtiEnv *jvmti_env, - const char* name, - const void* address, - jint length); - -typedef void (JNICALL *jvmtiEventException) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location, - jobject exception, - jmethodID catch_method, - jlocation catch_location); - -typedef void (JNICALL *jvmtiEventExceptionCatch) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location, - jobject exception); - -typedef void (JNICALL *jvmtiEventFieldAccess) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location, - jclass field_klass, - jobject object, - jfieldID field); - -typedef void (JNICALL *jvmtiEventFieldModification) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location, - jclass field_klass, - jobject object, - jfieldID field, - char signature_type, - jvalue new_value); - -typedef void (JNICALL *jvmtiEventFramePop) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jboolean was_popped_by_exception); - -typedef void (JNICALL *jvmtiEventGarbageCollectionFinish) - (jvmtiEnv *jvmti_env); - -typedef void (JNICALL *jvmtiEventGarbageCollectionStart) - (jvmtiEnv *jvmti_env); - -typedef void (JNICALL *jvmtiEventMethodEntry) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method); - -typedef void (JNICALL *jvmtiEventMethodExit) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jboolean was_popped_by_exception, - jvalue return_value); - -typedef void (JNICALL *jvmtiEventMonitorContendedEnter) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object); - -typedef void (JNICALL *jvmtiEventMonitorContendedEntered) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object); - -typedef void (JNICALL *jvmtiEventMonitorWait) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object, - jlong timeout); - -typedef void (JNICALL *jvmtiEventMonitorWaited) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object, - jboolean timed_out); - -typedef void (JNICALL *jvmtiEventNativeMethodBind) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - void* address, - void** new_address_ptr); - -typedef void (JNICALL *jvmtiEventObjectFree) - (jvmtiEnv *jvmti_env, - jlong tag); - -typedef void (JNICALL *jvmtiEventResourceExhausted) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jint flags, - const void* reserved, - const char* description); - -typedef void (JNICALL *jvmtiEventSingleStep) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jmethodID method, - jlocation location); - -typedef void (JNICALL *jvmtiEventThreadEnd) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread); - -typedef void (JNICALL *jvmtiEventThreadStart) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread); - -typedef void (JNICALL *jvmtiEventVMDeath) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env); - -typedef void (JNICALL *jvmtiEventVMInit) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread); - -typedef void (JNICALL *jvmtiEventVMObjectAlloc) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env, - jthread thread, - jobject object, - jclass object_klass, - jlong size); - -typedef void (JNICALL *jvmtiEventVMStart) - (jvmtiEnv *jvmti_env, - JNIEnv* jni_env); - - /* Event Callback Structure */ - -typedef struct { - /* 50 : VM Initialization Event */ - jvmtiEventVMInit VMInit; - /* 51 : VM Death Event */ - jvmtiEventVMDeath VMDeath; - /* 52 : Thread Start */ - jvmtiEventThreadStart ThreadStart; - /* 53 : Thread End */ - jvmtiEventThreadEnd ThreadEnd; - /* 54 : Class File Load Hook */ - jvmtiEventClassFileLoadHook ClassFileLoadHook; - /* 55 : Class Load */ - jvmtiEventClassLoad ClassLoad; - /* 56 : Class Prepare */ - jvmtiEventClassPrepare ClassPrepare; - /* 57 : VM Start Event */ - jvmtiEventVMStart VMStart; - /* 58 : Exception */ - jvmtiEventException Exception; - /* 59 : Exception Catch */ - jvmtiEventExceptionCatch ExceptionCatch; - /* 60 : Single Step */ - jvmtiEventSingleStep SingleStep; - /* 61 : Frame Pop */ - jvmtiEventFramePop FramePop; - /* 62 : Breakpoint */ - jvmtiEventBreakpoint Breakpoint; - /* 63 : Field Access */ - jvmtiEventFieldAccess FieldAccess; - /* 64 : Field Modification */ - jvmtiEventFieldModification FieldModification; - /* 65 : Method Entry */ - jvmtiEventMethodEntry MethodEntry; - /* 66 : Method Exit */ - jvmtiEventMethodExit MethodExit; - /* 67 : Native Method Bind */ - jvmtiEventNativeMethodBind NativeMethodBind; - /* 68 : Compiled Method Load */ - jvmtiEventCompiledMethodLoad CompiledMethodLoad; - /* 69 : Compiled Method Unload */ - jvmtiEventCompiledMethodUnload CompiledMethodUnload; - /* 70 : Dynamic Code Generated */ - jvmtiEventDynamicCodeGenerated DynamicCodeGenerated; - /* 71 : Data Dump Request */ - jvmtiEventDataDumpRequest DataDumpRequest; - /* 72 */ - jvmtiEventReserved reserved72; - /* 73 : Monitor Wait */ - jvmtiEventMonitorWait MonitorWait; - /* 74 : Monitor Waited */ - jvmtiEventMonitorWaited MonitorWaited; - /* 75 : Monitor Contended Enter */ - jvmtiEventMonitorContendedEnter MonitorContendedEnter; - /* 76 : Monitor Contended Entered */ - jvmtiEventMonitorContendedEntered MonitorContendedEntered; - /* 77 */ - jvmtiEventReserved reserved77; - /* 78 */ - jvmtiEventReserved reserved78; - /* 79 */ - jvmtiEventReserved reserved79; - /* 80 : Resource Exhausted */ - jvmtiEventResourceExhausted ResourceExhausted; - /* 81 : Garbage Collection Start */ - jvmtiEventGarbageCollectionStart GarbageCollectionStart; - /* 82 : Garbage Collection Finish */ - jvmtiEventGarbageCollectionFinish GarbageCollectionFinish; - /* 83 : Object Free */ - jvmtiEventObjectFree ObjectFree; - /* 84 : VM Object Allocation */ - jvmtiEventVMObjectAlloc VMObjectAlloc; -} jvmtiEventCallbacks; - - - /* Function Interface */ - -typedef struct jvmtiInterface_1_ { - - /* 1 : RESERVED */ - void *reserved1; - - /* 2 : Set Event Notification Mode */ - jvmtiError (JNICALL *SetEventNotificationMode) (jvmtiEnv* env, - jvmtiEventMode mode, - jvmtiEvent event_type, - jthread event_thread, - ...); - - /* 3 : RESERVED */ - void *reserved3; - - /* 4 : Get All Threads */ - jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env, - jint* threads_count_ptr, - jthread** threads_ptr); - - /* 5 : Suspend Thread */ - jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env, - jthread thread); - - /* 6 : Resume Thread */ - jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env, - jthread thread); - - /* 7 : Stop Thread */ - jvmtiError (JNICALL *StopThread) (jvmtiEnv* env, - jthread thread, - jobject exception); - - /* 8 : Interrupt Thread */ - jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env, - jthread thread); - - /* 9 : Get Thread Info */ - jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env, - jthread thread, - jvmtiThreadInfo* info_ptr); - - /* 10 : Get Owned Monitor Info */ - jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env, - jthread thread, - jint* owned_monitor_count_ptr, - jobject** owned_monitors_ptr); - - /* 11 : Get Current Contended Monitor */ - jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env, - jthread thread, - jobject* monitor_ptr); - - /* 12 : Run Agent Thread */ - jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env, - jthread thread, - jvmtiStartFunction proc, - const void* arg, - jint priority); - - /* 13 : Get Top Thread Groups */ - jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env, - jint* group_count_ptr, - jthreadGroup** groups_ptr); - - /* 14 : Get Thread Group Info */ - jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env, - jthreadGroup group, - jvmtiThreadGroupInfo* info_ptr); - - /* 15 : Get Thread Group Children */ - jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env, - jthreadGroup group, - jint* thread_count_ptr, - jthread** threads_ptr, - jint* group_count_ptr, - jthreadGroup** groups_ptr); - - /* 16 : Get Frame Count */ - jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env, - jthread thread, - jint* count_ptr); - - /* 17 : Get Thread State */ - jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env, - jthread thread, - jint* thread_state_ptr); - - /* 18 : Get Current Thread */ - jvmtiError (JNICALL *GetCurrentThread) (jvmtiEnv* env, - jthread* thread_ptr); - - /* 19 : Get Frame Location */ - jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env, - jthread thread, - jint depth, - jmethodID* method_ptr, - jlocation* location_ptr); - - /* 20 : Notify Frame Pop */ - jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env, - jthread thread, - jint depth); - - /* 21 : Get Local Variable - Object */ - jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jobject* value_ptr); - - /* 22 : Get Local Variable - Int */ - jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jint* value_ptr); - - /* 23 : Get Local Variable - Long */ - jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jlong* value_ptr); - - /* 24 : Get Local Variable - Float */ - jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jfloat* value_ptr); - - /* 25 : Get Local Variable - Double */ - jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jdouble* value_ptr); - - /* 26 : Set Local Variable - Object */ - jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jobject value); - - /* 27 : Set Local Variable - Int */ - jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jint value); - - /* 28 : Set Local Variable - Long */ - jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jlong value); - - /* 29 : Set Local Variable - Float */ - jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jfloat value); - - /* 30 : Set Local Variable - Double */ - jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env, - jthread thread, - jint depth, - jint slot, - jdouble value); - - /* 31 : Create Raw Monitor */ - jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env, - const char* name, - jrawMonitorID* monitor_ptr); - - /* 32 : Destroy Raw Monitor */ - jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 33 : Raw Monitor Enter */ - jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 34 : Raw Monitor Exit */ - jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 35 : Raw Monitor Wait */ - jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env, - jrawMonitorID monitor, - jlong millis); - - /* 36 : Raw Monitor Notify */ - jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 37 : Raw Monitor Notify All */ - jvmtiError (JNICALL *RawMonitorNotifyAll) (jvmtiEnv* env, - jrawMonitorID monitor); - - /* 38 : Set Breakpoint */ - jvmtiError (JNICALL *SetBreakpoint) (jvmtiEnv* env, - jmethodID method, - jlocation location); - - /* 39 : Clear Breakpoint */ - jvmtiError (JNICALL *ClearBreakpoint) (jvmtiEnv* env, - jmethodID method, - jlocation location); - - /* 40 : RESERVED */ - void *reserved40; - - /* 41 : Set Field Access Watch */ - jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env, - jclass klass, - jfieldID field); - - /* 42 : Clear Field Access Watch */ - jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env, - jclass klass, - jfieldID field); - - /* 43 : Set Field Modification Watch */ - jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env, - jclass klass, - jfieldID field); - - /* 44 : Clear Field Modification Watch */ - jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env, - jclass klass, - jfieldID field); - - /* 45 : Is Modifiable Class */ - jvmtiError (JNICALL *IsModifiableClass) (jvmtiEnv* env, - jclass klass, - jboolean* is_modifiable_class_ptr); - - /* 46 : Allocate */ - jvmtiError (JNICALL *Allocate) (jvmtiEnv* env, - jlong size, - unsigned char** mem_ptr); - - /* 47 : Deallocate */ - jvmtiError (JNICALL *Deallocate) (jvmtiEnv* env, - unsigned char* mem); - - /* 48 : Get Class Signature */ - jvmtiError (JNICALL *GetClassSignature) (jvmtiEnv* env, - jclass klass, - char** signature_ptr, - char** generic_ptr); - - /* 49 : Get Class Status */ - jvmtiError (JNICALL *GetClassStatus) (jvmtiEnv* env, - jclass klass, - jint* status_ptr); - - /* 50 : Get Source File Name */ - jvmtiError (JNICALL *GetSourceFileName) (jvmtiEnv* env, - jclass klass, - char** source_name_ptr); - - /* 51 : Get Class Modifiers */ - jvmtiError (JNICALL *GetClassModifiers) (jvmtiEnv* env, - jclass klass, - jint* modifiers_ptr); - - /* 52 : Get Class Methods */ - jvmtiError (JNICALL *GetClassMethods) (jvmtiEnv* env, - jclass klass, - jint* method_count_ptr, - jmethodID** methods_ptr); - - /* 53 : Get Class Fields */ - jvmtiError (JNICALL *GetClassFields) (jvmtiEnv* env, - jclass klass, - jint* field_count_ptr, - jfieldID** fields_ptr); - - /* 54 : Get Implemented Interfaces */ - jvmtiError (JNICALL *GetImplementedInterfaces) (jvmtiEnv* env, - jclass klass, - jint* interface_count_ptr, - jclass** interfaces_ptr); - - /* 55 : Is Interface */ - jvmtiError (JNICALL *IsInterface) (jvmtiEnv* env, - jclass klass, - jboolean* is_interface_ptr); - - /* 56 : Is Array Class */ - jvmtiError (JNICALL *IsArrayClass) (jvmtiEnv* env, - jclass klass, - jboolean* is_array_class_ptr); - - /* 57 : Get Class Loader */ - jvmtiError (JNICALL *GetClassLoader) (jvmtiEnv* env, - jclass klass, - jobject* classloader_ptr); - - /* 58 : Get Object Hash Code */ - jvmtiError (JNICALL *GetObjectHashCode) (jvmtiEnv* env, - jobject object, - jint* hash_code_ptr); - - /* 59 : Get Object Monitor Usage */ - jvmtiError (JNICALL *GetObjectMonitorUsage) (jvmtiEnv* env, - jobject object, - jvmtiMonitorUsage* info_ptr); - - /* 60 : Get Field Name (and Signature) */ - jvmtiError (JNICALL *GetFieldName) (jvmtiEnv* env, - jclass klass, - jfieldID field, - char** name_ptr, - char** signature_ptr, - char** generic_ptr); - - /* 61 : Get Field Declaring Class */ - jvmtiError (JNICALL *GetFieldDeclaringClass) (jvmtiEnv* env, - jclass klass, - jfieldID field, - jclass* declaring_class_ptr); - - /* 62 : Get Field Modifiers */ - jvmtiError (JNICALL *GetFieldModifiers) (jvmtiEnv* env, - jclass klass, - jfieldID field, - jint* modifiers_ptr); - - /* 63 : Is Field Synthetic */ - jvmtiError (JNICALL *IsFieldSynthetic) (jvmtiEnv* env, - jclass klass, - jfieldID field, - jboolean* is_synthetic_ptr); - - /* 64 : Get Method Name (and Signature) */ - jvmtiError (JNICALL *GetMethodName) (jvmtiEnv* env, - jmethodID method, - char** name_ptr, - char** signature_ptr, - char** generic_ptr); - - /* 65 : Get Method Declaring Class */ - jvmtiError (JNICALL *GetMethodDeclaringClass) (jvmtiEnv* env, - jmethodID method, - jclass* declaring_class_ptr); - - /* 66 : Get Method Modifiers */ - jvmtiError (JNICALL *GetMethodModifiers) (jvmtiEnv* env, - jmethodID method, - jint* modifiers_ptr); - - /* 67 : RESERVED */ - void *reserved67; - - /* 68 : Get Max Locals */ - jvmtiError (JNICALL *GetMaxLocals) (jvmtiEnv* env, - jmethodID method, - jint* max_ptr); - - /* 69 : Get Arguments Size */ - jvmtiError (JNICALL *GetArgumentsSize) (jvmtiEnv* env, - jmethodID method, - jint* size_ptr); - - /* 70 : Get Line Number Table */ - jvmtiError (JNICALL *GetLineNumberTable) (jvmtiEnv* env, - jmethodID method, - jint* entry_count_ptr, - jvmtiLineNumberEntry** table_ptr); - - /* 71 : Get Method Location */ - jvmtiError (JNICALL *GetMethodLocation) (jvmtiEnv* env, - jmethodID method, - jlocation* start_location_ptr, - jlocation* end_location_ptr); - - /* 72 : Get Local Variable Table */ - jvmtiError (JNICALL *GetLocalVariableTable) (jvmtiEnv* env, - jmethodID method, - jint* entry_count_ptr, - jvmtiLocalVariableEntry** table_ptr); - - /* 73 : Set Native Method Prefix */ - jvmtiError (JNICALL *SetNativeMethodPrefix) (jvmtiEnv* env, - const char* prefix); - - /* 74 : Set Native Method Prefixes */ - jvmtiError (JNICALL *SetNativeMethodPrefixes) (jvmtiEnv* env, - jint prefix_count, - char** prefixes); - - /* 75 : Get Bytecodes */ - jvmtiError (JNICALL *GetBytecodes) (jvmtiEnv* env, - jmethodID method, - jint* bytecode_count_ptr, - unsigned char** bytecodes_ptr); - - /* 76 : Is Method Native */ - jvmtiError (JNICALL *IsMethodNative) (jvmtiEnv* env, - jmethodID method, - jboolean* is_native_ptr); - - /* 77 : Is Method Synthetic */ - jvmtiError (JNICALL *IsMethodSynthetic) (jvmtiEnv* env, - jmethodID method, - jboolean* is_synthetic_ptr); - - /* 78 : Get Loaded Classes */ - jvmtiError (JNICALL *GetLoadedClasses) (jvmtiEnv* env, - jint* class_count_ptr, - jclass** classes_ptr); - - /* 79 : Get Classloader Classes */ - jvmtiError (JNICALL *GetClassLoaderClasses) (jvmtiEnv* env, - jobject initiating_loader, - jint* class_count_ptr, - jclass** classes_ptr); - - /* 80 : Pop Frame */ - jvmtiError (JNICALL *PopFrame) (jvmtiEnv* env, - jthread thread); - - /* 81 : Force Early Return - Object */ - jvmtiError (JNICALL *ForceEarlyReturnObject) (jvmtiEnv* env, - jthread thread, - jobject value); - - /* 82 : Force Early Return - Int */ - jvmtiError (JNICALL *ForceEarlyReturnInt) (jvmtiEnv* env, - jthread thread, - jint value); - - /* 83 : Force Early Return - Long */ - jvmtiError (JNICALL *ForceEarlyReturnLong) (jvmtiEnv* env, - jthread thread, - jlong value); - - /* 84 : Force Early Return - Float */ - jvmtiError (JNICALL *ForceEarlyReturnFloat) (jvmtiEnv* env, - jthread thread, - jfloat value); - - /* 85 : Force Early Return - Double */ - jvmtiError (JNICALL *ForceEarlyReturnDouble) (jvmtiEnv* env, - jthread thread, - jdouble value); - - /* 86 : Force Early Return - Void */ - jvmtiError (JNICALL *ForceEarlyReturnVoid) (jvmtiEnv* env, - jthread thread); - - /* 87 : Redefine Classes */ - jvmtiError (JNICALL *RedefineClasses) (jvmtiEnv* env, - jint class_count, - const jvmtiClassDefinition* class_definitions); - - /* 88 : Get Version Number */ - jvmtiError (JNICALL *GetVersionNumber) (jvmtiEnv* env, - jint* version_ptr); - - /* 89 : Get Capabilities */ - jvmtiError (JNICALL *GetCapabilities) (jvmtiEnv* env, - jvmtiCapabilities* capabilities_ptr); - - /* 90 : Get Source Debug Extension */ - jvmtiError (JNICALL *GetSourceDebugExtension) (jvmtiEnv* env, - jclass klass, - char** source_debug_extension_ptr); - - /* 91 : Is Method Obsolete */ - jvmtiError (JNICALL *IsMethodObsolete) (jvmtiEnv* env, - jmethodID method, - jboolean* is_obsolete_ptr); - - /* 92 : Suspend Thread List */ - jvmtiError (JNICALL *SuspendThreadList) (jvmtiEnv* env, - jint request_count, - const jthread* request_list, - jvmtiError* results); - - /* 93 : Resume Thread List */ - jvmtiError (JNICALL *ResumeThreadList) (jvmtiEnv* env, - jint request_count, - const jthread* request_list, - jvmtiError* results); - - /* 94 : RESERVED */ - void *reserved94; - - /* 95 : RESERVED */ - void *reserved95; - - /* 96 : RESERVED */ - void *reserved96; - - /* 97 : RESERVED */ - void *reserved97; - - /* 98 : RESERVED */ - void *reserved98; - - /* 99 : RESERVED */ - void *reserved99; - - /* 100 : Get All Stack Traces */ - jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env, - jint max_frame_count, - jvmtiStackInfo** stack_info_ptr, - jint* thread_count_ptr); - - /* 101 : Get Thread List Stack Traces */ - jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env, - jint thread_count, - const jthread* thread_list, - jint max_frame_count, - jvmtiStackInfo** stack_info_ptr); - - /* 102 : Get Thread Local Storage */ - jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env, - jthread thread, - void** data_ptr); - - /* 103 : Set Thread Local Storage */ - jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env, - jthread thread, - const void* data); - - /* 104 : Get Stack Trace */ - jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env, - jthread thread, - jint start_depth, - jint max_frame_count, - jvmtiFrameInfo* frame_buffer, - jint* count_ptr); - - /* 105 : RESERVED */ - void *reserved105; - - /* 106 : Get Tag */ - jvmtiError (JNICALL *GetTag) (jvmtiEnv* env, - jobject object, - jlong* tag_ptr); - - /* 107 : Set Tag */ - jvmtiError (JNICALL *SetTag) (jvmtiEnv* env, - jobject object, - jlong tag); - - /* 108 : Force Garbage Collection */ - jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env); - - /* 109 : Iterate Over Objects Reachable From Object */ - jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env, - jobject object, - jvmtiObjectReferenceCallback object_reference_callback, - const void* user_data); - - /* 110 : Iterate Over Reachable Objects */ - jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env, - jvmtiHeapRootCallback heap_root_callback, - jvmtiStackReferenceCallback stack_ref_callback, - jvmtiObjectReferenceCallback object_ref_callback, - const void* user_data); - - /* 111 : Iterate Over Heap */ - jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env, - jvmtiHeapObjectFilter object_filter, - jvmtiHeapObjectCallback heap_object_callback, - const void* user_data); - - /* 112 : Iterate Over Instances Of Class */ - jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env, - jclass klass, - jvmtiHeapObjectFilter object_filter, - jvmtiHeapObjectCallback heap_object_callback, - const void* user_data); - - /* 113 : RESERVED */ - void *reserved113; - - /* 114 : Get Objects With Tags */ - jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env, - jint tag_count, - const jlong* tags, - jint* count_ptr, - jobject** object_result_ptr, - jlong** tag_result_ptr); - - /* 115 : Follow References */ - jvmtiError (JNICALL *FollowReferences) (jvmtiEnv* env, - jint heap_filter, - jclass klass, - jobject initial_object, - const jvmtiHeapCallbacks* callbacks, - const void* user_data); - - /* 116 : Iterate Through Heap */ - jvmtiError (JNICALL *IterateThroughHeap) (jvmtiEnv* env, - jint heap_filter, - jclass klass, - const jvmtiHeapCallbacks* callbacks, - const void* user_data); - - /* 117 : RESERVED */ - void *reserved117; - - /* 118 : RESERVED */ - void *reserved118; - - /* 119 : RESERVED */ - void *reserved119; - - /* 120 : Set JNI Function Table */ - jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env, - const jniNativeInterface* function_table); - - /* 121 : Get JNI Function Table */ - jvmtiError (JNICALL *GetJNIFunctionTable) (jvmtiEnv* env, - jniNativeInterface** function_table); - - /* 122 : Set Event Callbacks */ - jvmtiError (JNICALL *SetEventCallbacks) (jvmtiEnv* env, - const jvmtiEventCallbacks* callbacks, - jint size_of_callbacks); - - /* 123 : Generate Events */ - jvmtiError (JNICALL *GenerateEvents) (jvmtiEnv* env, - jvmtiEvent event_type); - - /* 124 : Get Extension Functions */ - jvmtiError (JNICALL *GetExtensionFunctions) (jvmtiEnv* env, - jint* extension_count_ptr, - jvmtiExtensionFunctionInfo** extensions); - - /* 125 : Get Extension Events */ - jvmtiError (JNICALL *GetExtensionEvents) (jvmtiEnv* env, - jint* extension_count_ptr, - jvmtiExtensionEventInfo** extensions); - - /* 126 : Set Extension Event Callback */ - jvmtiError (JNICALL *SetExtensionEventCallback) (jvmtiEnv* env, - jint extension_event_index, - jvmtiExtensionEvent callback); - - /* 127 : Dispose Environment */ - jvmtiError (JNICALL *DisposeEnvironment) (jvmtiEnv* env); - - /* 128 : Get Error Name */ - jvmtiError (JNICALL *GetErrorName) (jvmtiEnv* env, - jvmtiError error, - char** name_ptr); - - /* 129 : Get JLocation Format */ - jvmtiError (JNICALL *GetJLocationFormat) (jvmtiEnv* env, - jvmtiJlocationFormat* format_ptr); - - /* 130 : Get System Properties */ - jvmtiError (JNICALL *GetSystemProperties) (jvmtiEnv* env, - jint* count_ptr, - char*** property_ptr); - - /* 131 : Get System Property */ - jvmtiError (JNICALL *GetSystemProperty) (jvmtiEnv* env, - const char* property, - char** value_ptr); - - /* 132 : Set System Property */ - jvmtiError (JNICALL *SetSystemProperty) (jvmtiEnv* env, - const char* property, - const char* value); - - /* 133 : Get Phase */ - jvmtiError (JNICALL *GetPhase) (jvmtiEnv* env, - jvmtiPhase* phase_ptr); - - /* 134 : Get Current Thread CPU Timer Information */ - jvmtiError (JNICALL *GetCurrentThreadCpuTimerInfo) (jvmtiEnv* env, - jvmtiTimerInfo* info_ptr); - - /* 135 : Get Current Thread CPU Time */ - jvmtiError (JNICALL *GetCurrentThreadCpuTime) (jvmtiEnv* env, - jlong* nanos_ptr); - - /* 136 : Get Thread CPU Timer Information */ - jvmtiError (JNICALL *GetThreadCpuTimerInfo) (jvmtiEnv* env, - jvmtiTimerInfo* info_ptr); - - /* 137 : Get Thread CPU Time */ - jvmtiError (JNICALL *GetThreadCpuTime) (jvmtiEnv* env, - jthread thread, - jlong* nanos_ptr); - - /* 138 : Get Timer Information */ - jvmtiError (JNICALL *GetTimerInfo) (jvmtiEnv* env, - jvmtiTimerInfo* info_ptr); - - /* 139 : Get Time */ - jvmtiError (JNICALL *GetTime) (jvmtiEnv* env, - jlong* nanos_ptr); - - /* 140 : Get Potential Capabilities */ - jvmtiError (JNICALL *GetPotentialCapabilities) (jvmtiEnv* env, - jvmtiCapabilities* capabilities_ptr); - - /* 141 : RESERVED */ - void *reserved141; - - /* 142 : Add Capabilities */ - jvmtiError (JNICALL *AddCapabilities) (jvmtiEnv* env, - const jvmtiCapabilities* capabilities_ptr); - - /* 143 : Relinquish Capabilities */ - jvmtiError (JNICALL *RelinquishCapabilities) (jvmtiEnv* env, - const jvmtiCapabilities* capabilities_ptr); - - /* 144 : Get Available Processors */ - jvmtiError (JNICALL *GetAvailableProcessors) (jvmtiEnv* env, - jint* processor_count_ptr); - - /* 145 : Get Class Version Numbers */ - jvmtiError (JNICALL *GetClassVersionNumbers) (jvmtiEnv* env, - jclass klass, - jint* minor_version_ptr, - jint* major_version_ptr); - - /* 146 : Get Constant Pool */ - jvmtiError (JNICALL *GetConstantPool) (jvmtiEnv* env, - jclass klass, - jint* constant_pool_count_ptr, - jint* constant_pool_byte_count_ptr, - unsigned char** constant_pool_bytes_ptr); - - /* 147 : Get Environment Local Storage */ - jvmtiError (JNICALL *GetEnvironmentLocalStorage) (jvmtiEnv* env, - void** data_ptr); - - /* 148 : Set Environment Local Storage */ - jvmtiError (JNICALL *SetEnvironmentLocalStorage) (jvmtiEnv* env, - const void* data); - - /* 149 : Add To Bootstrap Class Loader Search */ - jvmtiError (JNICALL *AddToBootstrapClassLoaderSearch) (jvmtiEnv* env, - const char* segment); - - /* 150 : Set Verbose Flag */ - jvmtiError (JNICALL *SetVerboseFlag) (jvmtiEnv* env, - jvmtiVerboseFlag flag, - jboolean value); - - /* 151 : Add To System Class Loader Search */ - jvmtiError (JNICALL *AddToSystemClassLoaderSearch) (jvmtiEnv* env, - const char* segment); - - /* 152 : Retransform Classes */ - jvmtiError (JNICALL *RetransformClasses) (jvmtiEnv* env, - jint class_count, - const jclass* classes); - - /* 153 : Get Owned Monitor Stack Depth Info */ - jvmtiError (JNICALL *GetOwnedMonitorStackDepthInfo) (jvmtiEnv* env, - jthread thread, - jint* monitor_info_count_ptr, - jvmtiMonitorStackDepthInfo** monitor_info_ptr); - - /* 154 : Get Object Size */ - jvmtiError (JNICALL *GetObjectSize) (jvmtiEnv* env, - jobject object, - jlong* size_ptr); - -} jvmtiInterface_1; - -struct _jvmtiEnv { - const struct jvmtiInterface_1_ *functions; -#ifdef __cplusplus - - - jvmtiError Allocate(jlong size, - unsigned char** mem_ptr) { - return functions->Allocate(this, size, mem_ptr); - } - - jvmtiError Deallocate(unsigned char* mem) { - return functions->Deallocate(this, mem); - } - - jvmtiError GetThreadState(jthread thread, - jint* thread_state_ptr) { - return functions->GetThreadState(this, thread, thread_state_ptr); - } - - jvmtiError GetCurrentThread(jthread* thread_ptr) { - return functions->GetCurrentThread(this, thread_ptr); - } - - jvmtiError GetAllThreads(jint* threads_count_ptr, - jthread** threads_ptr) { - return functions->GetAllThreads(this, threads_count_ptr, threads_ptr); - } - - jvmtiError SuspendThread(jthread thread) { - return functions->SuspendThread(this, thread); - } - - jvmtiError SuspendThreadList(jint request_count, - const jthread* request_list, - jvmtiError* results) { - return functions->SuspendThreadList(this, request_count, request_list, results); - } - - jvmtiError ResumeThread(jthread thread) { - return functions->ResumeThread(this, thread); - } - - jvmtiError ResumeThreadList(jint request_count, - const jthread* request_list, - jvmtiError* results) { - return functions->ResumeThreadList(this, request_count, request_list, results); - } - - jvmtiError StopThread(jthread thread, - jobject exception) { - return functions->StopThread(this, thread, exception); - } - - jvmtiError InterruptThread(jthread thread) { - return functions->InterruptThread(this, thread); - } - - jvmtiError GetThreadInfo(jthread thread, - jvmtiThreadInfo* info_ptr) { - return functions->GetThreadInfo(this, thread, info_ptr); - } - - jvmtiError GetOwnedMonitorInfo(jthread thread, - jint* owned_monitor_count_ptr, - jobject** owned_monitors_ptr) { - return functions->GetOwnedMonitorInfo(this, thread, owned_monitor_count_ptr, owned_monitors_ptr); - } - - jvmtiError GetOwnedMonitorStackDepthInfo(jthread thread, - jint* monitor_info_count_ptr, - jvmtiMonitorStackDepthInfo** monitor_info_ptr) { - return functions->GetOwnedMonitorStackDepthInfo(this, thread, monitor_info_count_ptr, monitor_info_ptr); - } - - jvmtiError GetCurrentContendedMonitor(jthread thread, - jobject* monitor_ptr) { - return functions->GetCurrentContendedMonitor(this, thread, monitor_ptr); - } - - jvmtiError RunAgentThread(jthread thread, - jvmtiStartFunction proc, - const void* arg, - jint priority) { - return functions->RunAgentThread(this, thread, proc, arg, priority); - } - - jvmtiError SetThreadLocalStorage(jthread thread, - const void* data) { - return functions->SetThreadLocalStorage(this, thread, data); - } - - jvmtiError GetThreadLocalStorage(jthread thread, - void** data_ptr) { - return functions->GetThreadLocalStorage(this, thread, data_ptr); - } - - jvmtiError GetTopThreadGroups(jint* group_count_ptr, - jthreadGroup** groups_ptr) { - return functions->GetTopThreadGroups(this, group_count_ptr, groups_ptr); - } - - jvmtiError GetThreadGroupInfo(jthreadGroup group, - jvmtiThreadGroupInfo* info_ptr) { - return functions->GetThreadGroupInfo(this, group, info_ptr); - } - - jvmtiError GetThreadGroupChildren(jthreadGroup group, - jint* thread_count_ptr, - jthread** threads_ptr, - jint* group_count_ptr, - jthreadGroup** groups_ptr) { - return functions->GetThreadGroupChildren(this, group, thread_count_ptr, threads_ptr, group_count_ptr, groups_ptr); - } - - jvmtiError GetStackTrace(jthread thread, - jint start_depth, - jint max_frame_count, - jvmtiFrameInfo* frame_buffer, - jint* count_ptr) { - return functions->GetStackTrace(this, thread, start_depth, max_frame_count, frame_buffer, count_ptr); - } - - jvmtiError GetAllStackTraces(jint max_frame_count, - jvmtiStackInfo** stack_info_ptr, - jint* thread_count_ptr) { - return functions->GetAllStackTraces(this, max_frame_count, stack_info_ptr, thread_count_ptr); - } - - jvmtiError GetThreadListStackTraces(jint thread_count, - const jthread* thread_list, - jint max_frame_count, - jvmtiStackInfo** stack_info_ptr) { - return functions->GetThreadListStackTraces(this, thread_count, thread_list, max_frame_count, stack_info_ptr); - } - - jvmtiError GetFrameCount(jthread thread, - jint* count_ptr) { - return functions->GetFrameCount(this, thread, count_ptr); - } - - jvmtiError PopFrame(jthread thread) { - return functions->PopFrame(this, thread); - } - - jvmtiError GetFrameLocation(jthread thread, - jint depth, - jmethodID* method_ptr, - jlocation* location_ptr) { - return functions->GetFrameLocation(this, thread, depth, method_ptr, location_ptr); - } - - jvmtiError NotifyFramePop(jthread thread, - jint depth) { - return functions->NotifyFramePop(this, thread, depth); - } - - jvmtiError ForceEarlyReturnObject(jthread thread, - jobject value) { - return functions->ForceEarlyReturnObject(this, thread, value); - } - - jvmtiError ForceEarlyReturnInt(jthread thread, - jint value) { - return functions->ForceEarlyReturnInt(this, thread, value); - } - - jvmtiError ForceEarlyReturnLong(jthread thread, - jlong value) { - return functions->ForceEarlyReturnLong(this, thread, value); - } - - jvmtiError ForceEarlyReturnFloat(jthread thread, - jfloat value) { - return functions->ForceEarlyReturnFloat(this, thread, value); - } - - jvmtiError ForceEarlyReturnDouble(jthread thread, - jdouble value) { - return functions->ForceEarlyReturnDouble(this, thread, value); - } - - jvmtiError ForceEarlyReturnVoid(jthread thread) { - return functions->ForceEarlyReturnVoid(this, thread); - } - - jvmtiError FollowReferences(jint heap_filter, - jclass klass, - jobject initial_object, - const jvmtiHeapCallbacks* callbacks, - const void* user_data) { - return functions->FollowReferences(this, heap_filter, klass, initial_object, callbacks, user_data); - } - - jvmtiError IterateThroughHeap(jint heap_filter, - jclass klass, - const jvmtiHeapCallbacks* callbacks, - const void* user_data) { - return functions->IterateThroughHeap(this, heap_filter, klass, callbacks, user_data); - } - - jvmtiError GetTag(jobject object, - jlong* tag_ptr) { - return functions->GetTag(this, object, tag_ptr); - } - - jvmtiError SetTag(jobject object, - jlong tag) { - return functions->SetTag(this, object, tag); - } - - jvmtiError GetObjectsWithTags(jint tag_count, - const jlong* tags, - jint* count_ptr, - jobject** object_result_ptr, - jlong** tag_result_ptr) { - return functions->GetObjectsWithTags(this, tag_count, tags, count_ptr, object_result_ptr, tag_result_ptr); - } - - jvmtiError ForceGarbageCollection() { - return functions->ForceGarbageCollection(this); - } - - jvmtiError IterateOverObjectsReachableFromObject(jobject object, - jvmtiObjectReferenceCallback object_reference_callback, - const void* user_data) { - return functions->IterateOverObjectsReachableFromObject(this, object, object_reference_callback, user_data); - } - - jvmtiError IterateOverReachableObjects(jvmtiHeapRootCallback heap_root_callback, - jvmtiStackReferenceCallback stack_ref_callback, - jvmtiObjectReferenceCallback object_ref_callback, - const void* user_data) { - return functions->IterateOverReachableObjects(this, heap_root_callback, stack_ref_callback, object_ref_callback, user_data); - } - - jvmtiError IterateOverHeap(jvmtiHeapObjectFilter object_filter, - jvmtiHeapObjectCallback heap_object_callback, - const void* user_data) { - return functions->IterateOverHeap(this, object_filter, heap_object_callback, user_data); - } - - jvmtiError IterateOverInstancesOfClass(jclass klass, - jvmtiHeapObjectFilter object_filter, - jvmtiHeapObjectCallback heap_object_callback, - const void* user_data) { - return functions->IterateOverInstancesOfClass(this, klass, object_filter, heap_object_callback, user_data); - } - - jvmtiError GetLocalObject(jthread thread, - jint depth, - jint slot, - jobject* value_ptr) { - return functions->GetLocalObject(this, thread, depth, slot, value_ptr); - } - - jvmtiError GetLocalInt(jthread thread, - jint depth, - jint slot, - jint* value_ptr) { - return functions->GetLocalInt(this, thread, depth, slot, value_ptr); - } - - jvmtiError GetLocalLong(jthread thread, - jint depth, - jint slot, - jlong* value_ptr) { - return functions->GetLocalLong(this, thread, depth, slot, value_ptr); - } - - jvmtiError GetLocalFloat(jthread thread, - jint depth, - jint slot, - jfloat* value_ptr) { - return functions->GetLocalFloat(this, thread, depth, slot, value_ptr); - } - - jvmtiError GetLocalDouble(jthread thread, - jint depth, - jint slot, - jdouble* value_ptr) { - return functions->GetLocalDouble(this, thread, depth, slot, value_ptr); - } - - jvmtiError SetLocalObject(jthread thread, - jint depth, - jint slot, - jobject value) { - return functions->SetLocalObject(this, thread, depth, slot, value); - } - - jvmtiError SetLocalInt(jthread thread, - jint depth, - jint slot, - jint value) { - return functions->SetLocalInt(this, thread, depth, slot, value); - } - - jvmtiError SetLocalLong(jthread thread, - jint depth, - jint slot, - jlong value) { - return functions->SetLocalLong(this, thread, depth, slot, value); - } - - jvmtiError SetLocalFloat(jthread thread, - jint depth, - jint slot, - jfloat value) { - return functions->SetLocalFloat(this, thread, depth, slot, value); - } - - jvmtiError SetLocalDouble(jthread thread, - jint depth, - jint slot, - jdouble value) { - return functions->SetLocalDouble(this, thread, depth, slot, value); - } - - jvmtiError SetBreakpoint(jmethodID method, - jlocation location) { - return functions->SetBreakpoint(this, method, location); - } - - jvmtiError ClearBreakpoint(jmethodID method, - jlocation location) { - return functions->ClearBreakpoint(this, method, location); - } - - jvmtiError SetFieldAccessWatch(jclass klass, - jfieldID field) { - return functions->SetFieldAccessWatch(this, klass, field); - } - - jvmtiError ClearFieldAccessWatch(jclass klass, - jfieldID field) { - return functions->ClearFieldAccessWatch(this, klass, field); - } - - jvmtiError SetFieldModificationWatch(jclass klass, - jfieldID field) { - return functions->SetFieldModificationWatch(this, klass, field); - } - - jvmtiError ClearFieldModificationWatch(jclass klass, - jfieldID field) { - return functions->ClearFieldModificationWatch(this, klass, field); - } - - jvmtiError GetLoadedClasses(jint* class_count_ptr, - jclass** classes_ptr) { - return functions->GetLoadedClasses(this, class_count_ptr, classes_ptr); - } - - jvmtiError GetClassLoaderClasses(jobject initiating_loader, - jint* class_count_ptr, - jclass** classes_ptr) { - return functions->GetClassLoaderClasses(this, initiating_loader, class_count_ptr, classes_ptr); - } - - jvmtiError GetClassSignature(jclass klass, - char** signature_ptr, - char** generic_ptr) { - return functions->GetClassSignature(this, klass, signature_ptr, generic_ptr); - } - - jvmtiError GetClassStatus(jclass klass, - jint* status_ptr) { - return functions->GetClassStatus(this, klass, status_ptr); - } - - jvmtiError GetSourceFileName(jclass klass, - char** source_name_ptr) { - return functions->GetSourceFileName(this, klass, source_name_ptr); - } - - jvmtiError GetClassModifiers(jclass klass, - jint* modifiers_ptr) { - return functions->GetClassModifiers(this, klass, modifiers_ptr); - } - - jvmtiError GetClassMethods(jclass klass, - jint* method_count_ptr, - jmethodID** methods_ptr) { - return functions->GetClassMethods(this, klass, method_count_ptr, methods_ptr); - } - - jvmtiError GetClassFields(jclass klass, - jint* field_count_ptr, - jfieldID** fields_ptr) { - return functions->GetClassFields(this, klass, field_count_ptr, fields_ptr); - } - - jvmtiError GetImplementedInterfaces(jclass klass, - jint* interface_count_ptr, - jclass** interfaces_ptr) { - return functions->GetImplementedInterfaces(this, klass, interface_count_ptr, interfaces_ptr); - } - - jvmtiError GetClassVersionNumbers(jclass klass, - jint* minor_version_ptr, - jint* major_version_ptr) { - return functions->GetClassVersionNumbers(this, klass, minor_version_ptr, major_version_ptr); - } - - jvmtiError GetConstantPool(jclass klass, - jint* constant_pool_count_ptr, - jint* constant_pool_byte_count_ptr, - unsigned char** constant_pool_bytes_ptr) { - return functions->GetConstantPool(this, klass, constant_pool_count_ptr, constant_pool_byte_count_ptr, constant_pool_bytes_ptr); - } - - jvmtiError IsInterface(jclass klass, - jboolean* is_interface_ptr) { - return functions->IsInterface(this, klass, is_interface_ptr); - } - - jvmtiError IsArrayClass(jclass klass, - jboolean* is_array_class_ptr) { - return functions->IsArrayClass(this, klass, is_array_class_ptr); - } - - jvmtiError IsModifiableClass(jclass klass, - jboolean* is_modifiable_class_ptr) { - return functions->IsModifiableClass(this, klass, is_modifiable_class_ptr); - } - - jvmtiError GetClassLoader(jclass klass, - jobject* classloader_ptr) { - return functions->GetClassLoader(this, klass, classloader_ptr); - } - - jvmtiError GetSourceDebugExtension(jclass klass, - char** source_debug_extension_ptr) { - return functions->GetSourceDebugExtension(this, klass, source_debug_extension_ptr); - } - - jvmtiError RetransformClasses(jint class_count, - const jclass* classes) { - return functions->RetransformClasses(this, class_count, classes); - } - - jvmtiError RedefineClasses(jint class_count, - const jvmtiClassDefinition* class_definitions) { - return functions->RedefineClasses(this, class_count, class_definitions); - } - - jvmtiError GetObjectSize(jobject object, - jlong* size_ptr) { - return functions->GetObjectSize(this, object, size_ptr); - } - - jvmtiError GetObjectHashCode(jobject object, - jint* hash_code_ptr) { - return functions->GetObjectHashCode(this, object, hash_code_ptr); - } - - jvmtiError GetObjectMonitorUsage(jobject object, - jvmtiMonitorUsage* info_ptr) { - return functions->GetObjectMonitorUsage(this, object, info_ptr); - } - - jvmtiError GetFieldName(jclass klass, - jfieldID field, - char** name_ptr, - char** signature_ptr, - char** generic_ptr) { - return functions->GetFieldName(this, klass, field, name_ptr, signature_ptr, generic_ptr); - } - - jvmtiError GetFieldDeclaringClass(jclass klass, - jfieldID field, - jclass* declaring_class_ptr) { - return functions->GetFieldDeclaringClass(this, klass, field, declaring_class_ptr); - } - - jvmtiError GetFieldModifiers(jclass klass, - jfieldID field, - jint* modifiers_ptr) { - return functions->GetFieldModifiers(this, klass, field, modifiers_ptr); - } - - jvmtiError IsFieldSynthetic(jclass klass, - jfieldID field, - jboolean* is_synthetic_ptr) { - return functions->IsFieldSynthetic(this, klass, field, is_synthetic_ptr); - } - - jvmtiError GetMethodName(jmethodID method, - char** name_ptr, - char** signature_ptr, - char** generic_ptr) { - return functions->GetMethodName(this, method, name_ptr, signature_ptr, generic_ptr); - } - - jvmtiError GetMethodDeclaringClass(jmethodID method, - jclass* declaring_class_ptr) { - return functions->GetMethodDeclaringClass(this, method, declaring_class_ptr); - } - - jvmtiError GetMethodModifiers(jmethodID method, - jint* modifiers_ptr) { - return functions->GetMethodModifiers(this, method, modifiers_ptr); - } - - jvmtiError GetMaxLocals(jmethodID method, - jint* max_ptr) { - return functions->GetMaxLocals(this, method, max_ptr); - } - - jvmtiError GetArgumentsSize(jmethodID method, - jint* size_ptr) { - return functions->GetArgumentsSize(this, method, size_ptr); - } - - jvmtiError GetLineNumberTable(jmethodID method, - jint* entry_count_ptr, - jvmtiLineNumberEntry** table_ptr) { - return functions->GetLineNumberTable(this, method, entry_count_ptr, table_ptr); - } - - jvmtiError GetMethodLocation(jmethodID method, - jlocation* start_location_ptr, - jlocation* end_location_ptr) { - return functions->GetMethodLocation(this, method, start_location_ptr, end_location_ptr); - } - - jvmtiError GetLocalVariableTable(jmethodID method, - jint* entry_count_ptr, - jvmtiLocalVariableEntry** table_ptr) { - return functions->GetLocalVariableTable(this, method, entry_count_ptr, table_ptr); - } - - jvmtiError GetBytecodes(jmethodID method, - jint* bytecode_count_ptr, - unsigned char** bytecodes_ptr) { - return functions->GetBytecodes(this, method, bytecode_count_ptr, bytecodes_ptr); - } - - jvmtiError IsMethodNative(jmethodID method, - jboolean* is_native_ptr) { - return functions->IsMethodNative(this, method, is_native_ptr); - } - - jvmtiError IsMethodSynthetic(jmethodID method, - jboolean* is_synthetic_ptr) { - return functions->IsMethodSynthetic(this, method, is_synthetic_ptr); - } - - jvmtiError IsMethodObsolete(jmethodID method, - jboolean* is_obsolete_ptr) { - return functions->IsMethodObsolete(this, method, is_obsolete_ptr); - } - - jvmtiError SetNativeMethodPrefix(const char* prefix) { - return functions->SetNativeMethodPrefix(this, prefix); - } - - jvmtiError SetNativeMethodPrefixes(jint prefix_count, - char** prefixes) { - return functions->SetNativeMethodPrefixes(this, prefix_count, prefixes); - } - - jvmtiError CreateRawMonitor(const char* name, - jrawMonitorID* monitor_ptr) { - return functions->CreateRawMonitor(this, name, monitor_ptr); - } - - jvmtiError DestroyRawMonitor(jrawMonitorID monitor) { - return functions->DestroyRawMonitor(this, monitor); - } - - jvmtiError RawMonitorEnter(jrawMonitorID monitor) { - return functions->RawMonitorEnter(this, monitor); - } - - jvmtiError RawMonitorExit(jrawMonitorID monitor) { - return functions->RawMonitorExit(this, monitor); - } - - jvmtiError RawMonitorWait(jrawMonitorID monitor, - jlong millis) { - return functions->RawMonitorWait(this, monitor, millis); - } - - jvmtiError RawMonitorNotify(jrawMonitorID monitor) { - return functions->RawMonitorNotify(this, monitor); - } - - jvmtiError RawMonitorNotifyAll(jrawMonitorID monitor) { - return functions->RawMonitorNotifyAll(this, monitor); - } - - jvmtiError SetJNIFunctionTable(const jniNativeInterface* function_table) { - return functions->SetJNIFunctionTable(this, function_table); - } - - jvmtiError GetJNIFunctionTable(jniNativeInterface** function_table) { - return functions->GetJNIFunctionTable(this, function_table); - } - - jvmtiError SetEventCallbacks(const jvmtiEventCallbacks* callbacks, - jint size_of_callbacks) { - return functions->SetEventCallbacks(this, callbacks, size_of_callbacks); - } - - jvmtiError SetEventNotificationMode(jvmtiEventMode mode, - jvmtiEvent event_type, - jthread event_thread, - ...) { - return functions->SetEventNotificationMode(this, mode, event_type, event_thread); - } - - jvmtiError GenerateEvents(jvmtiEvent event_type) { - return functions->GenerateEvents(this, event_type); - } - - jvmtiError GetExtensionFunctions(jint* extension_count_ptr, - jvmtiExtensionFunctionInfo** extensions) { - return functions->GetExtensionFunctions(this, extension_count_ptr, extensions); - } - - jvmtiError GetExtensionEvents(jint* extension_count_ptr, - jvmtiExtensionEventInfo** extensions) { - return functions->GetExtensionEvents(this, extension_count_ptr, extensions); - } - - jvmtiError SetExtensionEventCallback(jint extension_event_index, - jvmtiExtensionEvent callback) { - return functions->SetExtensionEventCallback(this, extension_event_index, callback); - } - - jvmtiError GetPotentialCapabilities(jvmtiCapabilities* capabilities_ptr) { - return functions->GetPotentialCapabilities(this, capabilities_ptr); - } - - jvmtiError AddCapabilities(const jvmtiCapabilities* capabilities_ptr) { - return functions->AddCapabilities(this, capabilities_ptr); - } - - jvmtiError RelinquishCapabilities(const jvmtiCapabilities* capabilities_ptr) { - return functions->RelinquishCapabilities(this, capabilities_ptr); - } - - jvmtiError GetCapabilities(jvmtiCapabilities* capabilities_ptr) { - return functions->GetCapabilities(this, capabilities_ptr); - } - - jvmtiError GetCurrentThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) { - return functions->GetCurrentThreadCpuTimerInfo(this, info_ptr); - } - - jvmtiError GetCurrentThreadCpuTime(jlong* nanos_ptr) { - return functions->GetCurrentThreadCpuTime(this, nanos_ptr); - } - - jvmtiError GetThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) { - return functions->GetThreadCpuTimerInfo(this, info_ptr); - } - - jvmtiError GetThreadCpuTime(jthread thread, - jlong* nanos_ptr) { - return functions->GetThreadCpuTime(this, thread, nanos_ptr); - } - - jvmtiError GetTimerInfo(jvmtiTimerInfo* info_ptr) { - return functions->GetTimerInfo(this, info_ptr); - } - - jvmtiError GetTime(jlong* nanos_ptr) { - return functions->GetTime(this, nanos_ptr); - } - - jvmtiError GetAvailableProcessors(jint* processor_count_ptr) { - return functions->GetAvailableProcessors(this, processor_count_ptr); - } - - jvmtiError AddToBootstrapClassLoaderSearch(const char* segment) { - return functions->AddToBootstrapClassLoaderSearch(this, segment); - } - - jvmtiError AddToSystemClassLoaderSearch(const char* segment) { - return functions->AddToSystemClassLoaderSearch(this, segment); - } - - jvmtiError GetSystemProperties(jint* count_ptr, - char*** property_ptr) { - return functions->GetSystemProperties(this, count_ptr, property_ptr); - } - - jvmtiError GetSystemProperty(const char* property, - char** value_ptr) { - return functions->GetSystemProperty(this, property, value_ptr); - } - - jvmtiError SetSystemProperty(const char* property, - const char* value) { - return functions->SetSystemProperty(this, property, value); - } - - jvmtiError GetPhase(jvmtiPhase* phase_ptr) { - return functions->GetPhase(this, phase_ptr); - } - - jvmtiError DisposeEnvironment() { - return functions->DisposeEnvironment(this); - } - - jvmtiError SetEnvironmentLocalStorage(const void* data) { - return functions->SetEnvironmentLocalStorage(this, data); - } - - jvmtiError GetEnvironmentLocalStorage(void** data_ptr) { - return functions->GetEnvironmentLocalStorage(this, data_ptr); - } - - jvmtiError GetVersionNumber(jint* version_ptr) { - return functions->GetVersionNumber(this, version_ptr); - } - - jvmtiError GetErrorName(jvmtiError error, - char** name_ptr) { - return functions->GetErrorName(this, error, name_ptr); - } - - jvmtiError SetVerboseFlag(jvmtiVerboseFlag flag, - jboolean value) { - return functions->SetVerboseFlag(this, flag, value); - } - - jvmtiError GetJLocationFormat(jvmtiJlocationFormat* format_ptr) { - return functions->GetJLocationFormat(this, format_ptr); - } - -#endif /* __cplusplus */ -}; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !_JAVA_JVMTI_H_ */ - diff --git a/cpp/nativecall/include/win32/jawt_md.h b/cpp/nativecall/include/win32/jawt_md.h deleted file mode 100644 index 82ba034..0000000 --- a/cpp/nativecall/include/win32/jawt_md.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -#ifndef _JAVASOFT_JAWT_MD_H_ -#define _JAVASOFT_JAWT_MD_H_ - -#include -#include "jawt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Win32-specific declarations for AWT native interface. - * See notes in jawt.h for an example of use. - */ -typedef struct jawt_Win32DrawingSurfaceInfo { - /* Native window, DDB, or DIB handle */ - union { - HWND hwnd; - HBITMAP hbitmap; - void* pbits; - }; - /* - * This HDC should always be used instead of the HDC returned from - * BeginPaint() or any calls to GetDC(). - */ - HDC hdc; - HPALETTE hpalette; -} JAWT_Win32DrawingSurfaceInfo; - -#ifdef __cplusplus -} -#endif - -#endif /* !_JAVASOFT_JAWT_MD_H_ */ diff --git a/cpp/nativecall/include/win32/jni_md.h b/cpp/nativecall/include/win32/jni_md.h deleted file mode 100644 index 9ac4718..0000000 --- a/cpp/nativecall/include/win32/jni_md.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * %W% %E% - * - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -#ifndef _JAVASOFT_JNI_MD_H_ -#define _JAVASOFT_JNI_MD_H_ - -#define JNIEXPORT __declspec(dllexport) -#define JNIIMPORT __declspec(dllimport) -#define JNICALL __stdcall - -typedef long jint; -typedef __int64 jlong; -typedef signed char jbyte; - -#endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/cpp/nativecall/msvc/copy.bat b/cpp/nativecall/msvc/copy.bat deleted file mode 100644 index bfd231a..0000000 --- a/cpp/nativecall/msvc/copy.bat +++ /dev/null @@ -1 +0,0 @@ -copy Release\nativecall.dll ..\..\..\java\native \ No newline at end of file diff --git a/cpp/nativecall/msvc/nativecall.sln b/cpp/nativecall/msvc/nativecall.sln deleted file mode 100644 index 152c04f..0000000 --- a/cpp/nativecall/msvc/nativecall.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C++ Express 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nativecall", "nativecall.vcxproj", "{64CA530A-A10E-4AF5-A940-E0034CEC10E7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {64CA530A-A10E-4AF5-A940-E0034CEC10E7}.Debug|Win32.ActiveCfg = Debug|Win32 - {64CA530A-A10E-4AF5-A940-E0034CEC10E7}.Debug|Win32.Build.0 = Debug|Win32 - {64CA530A-A10E-4AF5-A940-E0034CEC10E7}.Release|Win32.ActiveCfg = Release|Win32 - {64CA530A-A10E-4AF5-A940-E0034CEC10E7}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/cpp/nativecall/msvc/nativecall.suo b/cpp/nativecall/msvc/nativecall.suo deleted file mode 100644 index 6386fe5dfa12071f5bd1c3eab6ab78a75b69268c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9728 zcmeHMPiz!b7=H^zpdf;O5D{@j1cdIo+uashEOxuQjbedHmtxGuWV$=8!%kfE&J{0KMdRjd<3`~_$V+8d{lA4De*5g=k2Afgi|<`}tt5Nk5tA6%etdmuI3uHHK-Lz+L+!J9@fha?t9{~sQk5s z(-qULl=U7Rl7%t7T2Mt4?O7Lp@g-wv1-gon(=V} z^cjPgp9ZDRxo-do_4Jv4F!oN!J+nc-8FeA{`S}NP=AiVML#y~-PrqNvT!hxy*p;&6 zg?ugqpfA^--wR5gxldo6;m{jh0(y4fWo2WauR&A8f?SzWBf^NvQ;4jch|GC$9ODJd zvaw1w@;By@!x(eGJ2gEFIb8HcRHLsrj zacCK}f_2ClXpIHkvBkLst*~tg`9JgJoXJ-!i9Oa}QM`G(!?_z^3qq_UZ$|{Hl$HEq6j_aqwPu86ojU`s zYs14`bHC?p=kDC3`cawBby!2g6;0kJL)D*sN*wS4(c!pEM41u)ju+xW1oU@^G~ z>;Zk+25a!3^!H+}iZ9-NCqz3eVN~=NR{$LY^P2G`tuV;sfm5t*RaxRToj2MNPqrc@>LyO5d2vH1?Uk zz>#^I4qsTWh0RwC=U;;Q%=4b0`d1r&lpkdroB%J3{EUX4w`II*4m^KjK1+QLO8*JW z&G~`vG~y|#YS4Dpaf%<$uQ$*A$rpwi)*!4jW=qsjjgRi-xjxA{`1&Jz1P+b{J!;i;3k9q>Oe-`;ZIq5=ur>i+>{Dc8a=82QJt>~9!rAFi`{ zC0mdd|38GNKg{Wa%HM{$lm5p~%G|?*7qBFb)p))PM#}!Yg&O)l(&hPjQ2J5Kec%6J zz4iq4yNaJ(OIZJ>@bUrw1L}Vk_5aHdau3D;S7xQPm5!n~zh(TP+zRGDZG0EQu&Td? zp=~)(WERM3cM9uI&pU~=5Aq)j^DkBhH$$Hmsm|@1?LT8;bL$miDe@l${ZD~}m##3M zx^-YiCks;(W&7+*x;uZ`!GU@Hlu^nLOpa+`AjSuPj#d_BYlaEu1GSQj7PfqI%APUqO+r`y*=HYYHz;~64Gob zxY4`R;`P=spSj&wuGg>~B81TQMRoY#SKpvdPrACWwA1?&h>vsihj*qQg}>m5|IJD9 tR%o?rhi1IL`_qQkKYV%IJo0_d{+7Sq{F& diff --git a/cpp/nativecall/msvc/nativecall.vcxproj b/cpp/nativecall/msvc/nativecall.vcxproj deleted file mode 100644 index 8e90b48..0000000 --- a/cpp/nativecall/msvc/nativecall.vcxproj +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {64CA530A-A10E-4AF5-A940-E0034CEC10E7} - Win32Proj - nativecall - - - - DynamicLibrary - true - Unicode - - - DynamicLibrary - false - true - Unicode - - - - - - - - - - - - - true - ..\include;..\include\win32;$(IncludePath) - - - false - ..\include;..\include\win32;$(IncludePath) - - - - - - Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECALL_EXPORTS;%(PreprocessorDefinitions) - - - Windows - true - - - copy.bat - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECALL_EXPORTS;%(PreprocessorDefinitions) - - - Windows - true - true - true - - - copy.bat - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cpp/nativecall/msvc/nativecall.vcxproj.filters b/cpp/nativecall/msvc/nativecall.vcxproj.filters deleted file mode 100644 index 9cca3d1..0000000 --- a/cpp/nativecall/msvc/nativecall.vcxproj.filters +++ /dev/null @@ -1,42 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/cpp/nativecall/msvc/nativecall.vcxproj.user b/cpp/nativecall/msvc/nativecall.vcxproj.user deleted file mode 100644 index 695b5c7..0000000 --- a/cpp/nativecall/msvc/nativecall.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file