/*
* helpers.cpp - Native methods.
*
* (C) Copyright 1996 Microsoft Corporation
*/
/* Headers
**********/
#include "project.hpp"
#pragma hdrstop
#include "com_ms_debug_RemoteBooleanObjectHelper.h"
#include "com_ms_debug_RemoteDoubleObjectHelper.h"
#include "com_ms_debug_RemoteFloatObjectHelper.h"
#include "com_ms_debug_EnumRemoteBooleanValueHelper.h"
#include "com_ms_debug_EnumRemoteDoubleValueHelper.h"
#include "com_ms_debug_EnumRemoteFloatValueHelper.h"
#include "com_ms_debug_ConstantPoolHelper.h"
#include "com_ms_debug_LockBytesHelper.h"
/***************************** Exported Functions ****************************/
/*
* Native method "helpers" are needed to marshal the following debugger interface methods:
*
* IJavaEnumRemoteBooleanValue::GetNext()
* IRemoteBooleanObject::GetValue()
* IRemoteBooleanObject::SetValue()
*
* IJavaEnumRemoteFloatValue::GetNext()
* IRemoteFloatObject::GetValue()
* IRemoteFloatObject::SetValue()
*
* IJavaEnumRemoteDoubleValue::GetNext()
* IRemoteDoubleObject::GetValue()
* IRemoteDoubleObject::SetValue()
*
* IRemoteMethodField::GetBytes()
*
* IRemoteClassField::GetConstantPoolItem()
*/
/* boolean */ long __cdecl com_ms_debug_EnumRemoteBooleanValueHelper_GetNext(Hcom_ms_debug_EnumRemoteBooleanValueHelper *thisptr)
{
JAVA_BOOLEAN value;
IJavaEnumRemoteBooleanValue *pierbv;
pierbv = (IJavaEnumRemoteBooleanValue *)convert_Java_Object_to_IUnknown((HObject *)(thisptr->m_ierbv), &IID_IJavaEnumRemoteBooleanValue);
if (pierbv)
{
HRESULT hr;
hr = pierbv->GetNext(&value);
switch (hr)
{
case S_OK:// Retrieved next value.
break;
case S_FALSE:// No more values.
SignalError(NULL, "com/ms/com/ComSuccessException", "");
break;
default:// Error.
SignalError(NULL, "com/ms/com/ComFailException", "IJavaEnumRemoteBooleanValue::GetNext");
break;
}
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
return(value);
}
/* boolean */ long __cdecl com_ms_debug_RemoteBooleanObjectHelper_GetValue(Hcom_ms_debug_RemoteBooleanObjectHelper *thisptr)
{
JAVA_BOOLEAN value;
IRemoteBooleanObject *pirbo;
pirbo = (IRemoteBooleanObject *)convert_Java_Object_to_IUnknown((HObject *)thisptr->m_irbo, &IID_IRemoteBooleanObject);
if (pirbo)
{
if (pirbo->GetValue(&value) != S_OK)
SignalError(NULL, "com/ms/com/ComFailException", "IRemoteBooleanObject::GetValue");
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
return(value);
}
void __cdecl com_ms_debug_RemoteBooleanObjectHelper_SetValue(Hcom_ms_debug_RemoteBooleanObjectHelper *thisptr, /* boolean */ long newvalue)
{
IRemoteBooleanObject *pirbo;
pirbo = (IRemoteBooleanObject *)convert_Java_Object_to_IUnknown((HObject *)thisptr->m_irbo, &IID_IRemoteBooleanObject);
if (pirbo)
{
if (pirbo->SetValue((JAVA_BOOLEAN)newvalue) != S_OK)
SignalError(NULL, "com/ms/com/ComFailException", "IRemoteBooleanObject::SetValue");
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
}
JAVA_FLOAT __cdecl com_ms_debug_EnumRemoteFloatValueHelper_GetNext(Hcom_ms_debug_EnumRemoteFloatValueHelper *thisptr)
{
JAVA_FLOAT value;
IJavaEnumRemoteFloatValue *pierfv;
pierfv = (IJavaEnumRemoteFloatValue *)convert_Java_Object_to_IUnknown((HObject *)thisptr->m_ierfv, &IID_IJavaEnumRemoteFloatValue);
if (pierfv)
{
HRESULT hr;
hr = pierfv->GetNext(&value);
switch (hr)
{
case S_OK:// Retrieved next value.
break;
case S_FALSE:// No more values.
SignalError(NULL, "com/ms/com/ComSuccessException", "");
break;
default:// Error.
SignalError(NULL, "com/ms/com/ComFailException", "IJavaEnumRemoteFloatValue::GetNext");
break;
}
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
return(value);
}
JAVA_FLOAT __cdecl com_ms_debug_RemoteFloatObjectHelper_GetValue(Hcom_ms_debug_RemoteFloatObjectHelper *thisptr)
{
JAVA_FLOAT value;
IRemoteFloatObject *pirfo;
pirfo = (IRemoteFloatObject *)convert_Java_Object_to_IUnknown((HObject *)thisptr->m_irfo, &IID_IRemoteFloatObject);
if (pirfo)
{
if (pirfo->GetValue(&value) != S_OK)
SignalError(NULL, "com/ms/com/ComFailException", "IRemoteFloatObject::GetValue");
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
return(value);
}
void __cdecl com_ms_debug_RemoteFloatObjectHelper_SetValue(Hcom_ms_debug_RemoteFloatObjectHelper *thisptr, float newvalue)
{
IRemoteFloatObject *pirfo;
pirfo = (IRemoteFloatObject *)convert_Java_Object_to_IUnknown((HObject *)thisptr->m_irfo, &IID_IRemoteFloatObject);
if (pirfo)
{
if (pirfo->SetValue((JAVA_FLOAT*)&newvalue) != S_OK)
SignalError(NULL, "com/ms/com/ComFailException", "IRemoteFloatObject::SetValue");
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
}
JAVA_DOUBLE __cdecl com_ms_debug_EnumRemoteDoubleValueHelper_GetNext(Hcom_ms_debug_EnumRemoteDoubleValueHelper *thisptr)
{
JAVA_DOUBLE value;
IJavaEnumRemoteDoubleValue *pierdv;
pierdv = (IJavaEnumRemoteDoubleValue *)convert_Java_Object_to_IUnknown((HObject *)thisptr->m_ierdv, &IID_IJavaEnumRemoteDoubleValue);
if (pierdv)
{
HRESULT hr;
hr = pierdv->GetNext(&value);
switch (hr)
{
case S_OK:// Retrieved next value.
break;
case S_FALSE:// No more values.
SignalError(NULL, "com/ms/com/ComSuccessException", "");
break;
default:// Error.
SignalError(NULL, "com/ms/com/ComFailException", "IJavaEnumRemoteDoubleValue::GetNext");
break;
}
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
return(value);
}
JAVA_DOUBLE __cdecl com_ms_debug_RemoteDoubleObjectHelper_GetValue(Hcom_ms_debug_RemoteDoubleObjectHelper *thisptr)
{
JAVA_DOUBLE value;
IRemoteDoubleObject *pirdo;
pirdo = (IRemoteDoubleObject *)convert_Java_Object_to_IUnknown((HObject *)thisptr->m_irdo, &IID_IRemoteDoubleObject);
if (pirdo)
{
if (pirdo->GetValue(&value) != S_OK)
SignalError(NULL, "com/ms/com/ComFailException", "IRemoteDoubleObject::GetValue");
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
return(value);
}
void __cdecl com_ms_debug_RemoteDoubleObjectHelper_SetValue(Hcom_ms_debug_RemoteDoubleObjectHelper *thisptr, double newvalue)
{
IRemoteDoubleObject *pirdo;
pirdo = (IRemoteDoubleObject *)convert_Java_Object_to_IUnknown((HObject *)thisptr->m_irdo, &IID_IRemoteDoubleObject);
if (pirdo)
{
if (pirdo->SetValue((JAVA_DOUBLE *)&newvalue) != S_OK)
SignalError(NULL, "com/ms/com/ComFailException", "IRemoteDoubleObject::SetValue");
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
}
ClassArrayOfByte * __cdecl com_ms_debug_LockBytesHelper_GetBytes(Hcom_ms_debug_LockBytesHelper *, Hcom_ms_debug_ILockBytes *pjilb)
{
ClassArrayOfByte *pjabyte = NULL;
ILockBytes *pilb;
pilb = (ILockBytes *)convert_Java_Object_to_IUnknown((Hjava_lang_Object *)pjilb, &IID_ILockBytes);
if (pilb)
{
HRESULT hr;
STATSTG statstg;
// How many bytes can be read?
hr = pilb->Stat(&statstg, STATFLAG_NONAME);
if (hr == S_OK)
{
pjabyte = (ClassArrayOfByte *)ArrayAlloc(T_BYTE, statstg.cbSize.LowPart);
if (pjabyte)
{
ULARGE_INTEGER ulnOffset;
ULONG ulcbRead;
ulnOffset.QuadPart = 0;
hr = pilb->ReadAt(ulnOffset, pjabyte->body, statstg.cbSize.LowPart, &ulcbRead);
if (hr != S_OK)
{
SignalError(0, "com.ms.com.ComFailException", "ILockBytes::ReadAt");
pjabyte = NULL;
}
}
else
SignalError(0, JAVAPKG "OutOfMemoryError", 0);
}
else
SignalError(0, "com.ms.com.ComFailException", "ILockBytes::Stat");
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
return(pjabyte);
}
ClassArrayOfByte * __cdecl com_ms_debug_ConstantPoolHelper_GetConstantPoolItem(Hcom_ms_debug_ConstantPoolHelper *thisptr, int niItem)
{
ClassArrayOfByte *pjabyte = NULL;
if (thisptr->m_ircf)
{
IRemoteClassField *pircf;
pircf = (IRemoteClassField *)convert_Java_Object_to_IUnknown((Hjava_lang_Object *)(thisptr->m_ircf), &IID_IRemoteClassField);
if (pircf)
{
HRESULT hr;
PBYTE pbyteItem;
ULONG ulcbLen;
hr = pircf->GetConstantPoolItem(niItem, &pbyteItem, &ulcbLen);
if (hr == S_OK)
{
pjabyte = (ClassArrayOfByte *)ArrayAlloc(T_BYTE, ulcbLen);
if (pjabyte)
CopyMemory(pjabyte->body, pbyteItem, ulcbLen);
else
SignalError(0, JAVAPKG "OutOfMemoryError", 0);
CoTaskMemFree(pbyteItem);
pbyteItem = NULL;
}
else
SignalError(0, "com.ms.com.ComFailException", "IRemoteClassField::GetConstantPoolItem");
}
else
SignalError(0, JAVAPKG "ClassCastException", 0);
}
else
SignalError(0, JAVAPKG "IllegalArgumentException", 0);
return(pjabyte);
}