version 1.2, 2006/01/30 16:18:10
|
version 1.3, 2006/12/03 14:39:39
|
|
|
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
#ifndef _JMPI_Convert_h |
|
#define _JMPI_Convert_h |
|
|
#ifndef PEGASUS_DEBUG | #ifndef PEGASUS_DEBUG |
| |
// Retail build | // Retail build |
|
|
#define CONVERT_BIG_PAD 0 | #define CONVERT_BIG_PAD 0 |
#define CONVERT_SMALL_PAD 0 | #define CONVERT_SMALL_PAD 0 |
| |
|
#include <Pegasus/Common/Config.h> |
|
#include <iostream> |
|
#include <cstdlib> |
|
|
|
PEGASUS_USING_STD; |
|
PEGASUS_USING_PEGASUS; |
|
|
#if CONVERT_NONE | #if CONVERT_NONE |
| |
#define DEBUG_ConvertJavaToC(j,c,p) (c)p | #define DEBUG_ConvertJavaToC(j,c,p) (c)p |
|
|
#define DEBUG_ConvertCToJava(c,j,p) TemplateConvertCToJava <c,j> (p) | #define DEBUG_ConvertCToJava(c,j,p) TemplateConvertCToJava <c,j> (p) |
#define DEBUG_ConvertCleanup(j,p) TemplateConvertCleanup <j> (p) | #define DEBUG_ConvertCleanup(j,p) TemplateConvertCleanup <j> (p) |
| |
#define CONVERT_SIGNATURE_BEGIN 0x12345678 |
#define CONVERT_SIGNATURE_BEGIN PEGASUS_UINT64_LITERAL(0x0123456789ABCDEF) |
#define CONVERT_SIGNATURE_END 0xFEDCBA98 |
#define CONVERT_SIGNATURE_END PEGASUS_UINT64_LITERAL(0xFEDCBA9876543210) |
#define CONVERT_SIZE (4 * sizeof (void *)) |
#define CONVERT_SIZE (4 * sizeof (Uint64)) |
|
|
#define ConvertEndianSwap(n) ((((n) & 0xff000000) >> 24) | \ |
#define ConvertEndianSwap(n) ((((n) & PEGASUS_UINT64_LITERAL(0xff00000000000000)) >> 56) | \ |
(((n) & 0x00ff0000) >> 8) | \ |
(((n) & PEGASUS_UINT64_LITERAL(0x00ff000000000000)) >> 40) | \ |
(((n) & 0x0000ff00) << 8) | \ |
(((n) & PEGASUS_UINT64_LITERAL(0x0000ff0000000000)) >> 24) | \ |
(((n) & 0x000000ff) << 24) ) |
(((n) & PEGASUS_UINT64_LITERAL(0x000000ff00000000)) >> 8) | \ |
|
(((n) & PEGASUS_UINT64_LITERAL(0x00000000ff000000)) << 8) | \ |
|
(((n) & PEGASUS_UINT64_LITERAL(0x0000000000ff0000)) << 24) | \ |
|
(((n) & PEGASUS_UINT64_LITERAL(0x000000000000ff00)) << 40) | \ |
|
(((n) & PEGASUS_UINT64_LITERAL(0x00000000000000ff)) << 56) ) |
| |
template <typename J, typename C> | template <typename J, typename C> |
C TemplateConvertJavaToC (J p) | C TemplateConvertJavaToC (J p) |
{ | { |
unsigned int *pi = (unsigned int *)p; |
Uint64 *pui64 = (Uint64 *)p; |
unsigned int *ptrap = 0; |
Uint64 *ptrap = 0; |
| |
if (pi[0] != CONVERT_SIGNATURE_BEGIN) |
if (pui64[0] != CONVERT_SIGNATURE_BEGIN) |
{ | { |
PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); | PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
*ptrap = 0; | *ptrap = 0; |
} | } |
if (pi[1] != ConvertEndianSwap ((unsigned int)pi[2])) |
if (pui64[1] != ConvertEndianSwap (pui64[2])) |
{ | { |
*ptrap = 0; | *ptrap = 0; |
} | } |
if (pi[3] != CONVERT_SIGNATURE_END) |
if (pui64[3] != CONVERT_SIGNATURE_END) |
{ | { |
PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); | PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
*ptrap = 0; | *ptrap = 0; |
} | } |
| |
PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)pi[1]<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)pui64[1]<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
| |
return (C)pi[1]; |
return (C)pui64[1]; |
} | } |
| |
template <typename C, typename J> | template <typename C, typename J> |
J TemplateConvertCToJava (C p) | J TemplateConvertCToJava (C p) |
{ | { |
unsigned int *pi = (unsigned int *)std::malloc (CONVERT_SIZE); |
Uint64 *pui64 = (Uint64 *)::malloc (CONVERT_SIZE); |
unsigned int *ptrap = 0; |
Uint64 *ptrap = 0; |
| |
if (pi) |
if (pui64) |
{ | { |
pi[0] = CONVERT_SIGNATURE_BEGIN; |
pui64[0] = CONVERT_SIGNATURE_BEGIN; |
pi[1] = (unsigned int)p; |
pui64[1] = (Uint64)p; |
pi[2] = ConvertEndianSwap ((unsigned int)p); |
pui64[2] = ConvertEndianSwap ((Uint64)p); |
pi[3] = CONVERT_SIGNATURE_END; |
pui64[3] = CONVERT_SIGNATURE_END; |
} | } |
else | else |
{ | { |
|
|
*ptrap = 0; | *ptrap = 0; |
} | } |
| |
PEGASUS_STD(cout)<<"TemplateConvertCToJava "<<PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)pi<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
PEGASUS_STD(cout)<<"TemplateConvertCToJava "<<PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)pui64<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
| |
return (J)pi; |
return (J)pui64; |
} | } |
| |
template <typename J> | template <typename J> |
void TemplateConvertCleanup (J p) | void TemplateConvertCleanup (J p) |
{ | { |
unsigned int *pi = (unsigned int *)p; |
Uint64 *pui64 = (Uint64 *)p; |
unsigned int *ptrap = 0; |
Uint64 *ptrap = 0; |
| |
PEGASUS_STD(cout)<<"TemplateConvertCleanup "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); | PEGASUS_STD(cout)<<"TemplateConvertCleanup "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
| |
if (pi[0] != CONVERT_SIGNATURE_BEGIN) |
if (pui64[0] != CONVERT_SIGNATURE_BEGIN) |
{ | { |
*ptrap = 0; | *ptrap = 0; |
} | } |
if (pi[1] != ConvertEndianSwap ((unsigned int)pi[2])) |
if (pui64[1] != ConvertEndianSwap (pui64[2])) |
{ | { |
*ptrap = 0; | *ptrap = 0; |
} | } |
if (pi[3] != CONVERT_SIGNATURE_END) |
if (pui64[3] != CONVERT_SIGNATURE_END) |
{ | { |
*ptrap = 0; | *ptrap = 0; |
} | } |
| |
std::memset (pi, 0, CONVERT_SIZE); |
::memset (pui64, 0, CONVERT_SIZE); |
std::free ((void *)pi); |
::free ((void *)pui64); |
} | } |
| |
#elif CONVERT_SMALL_PAD | #elif CONVERT_SMALL_PAD |
|
|
| |
#define CONVERT_SIGNATURE_BEGIN 0xFE | #define CONVERT_SIGNATURE_BEGIN 0xFE |
#define CONVERT_SIGNATURE_END 0x12 | #define CONVERT_SIGNATURE_END 0x12 |
#define CONVERT_SIZE (sizeof (unsigned char) + sizeof (void *) + sizeof (unsigned char)) |
#define CONVERT_SIZE (sizeof (unsigned char) + sizeof (Uint64) + sizeof (unsigned char)) |
| |
template <typename J, typename C> | template <typename J, typename C> |
C TemplateConvertJavaToC (J p) | C TemplateConvertJavaToC (J p) |
{ | { |
unsigned char *puch = (unsigned char *)p; | unsigned char *puch = (unsigned char *)p; |
int *ptrap = 0; |
unsigned char *ptrap = 0; |
| |
if (puch[0] != CONVERT_SIGNATURE_BEGIN) | if (puch[0] != CONVERT_SIGNATURE_BEGIN) |
{ | { |
PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); | PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
*ptrap = 0; | *ptrap = 0; |
} | } |
if (puch[1 + sizeof (int)] != CONVERT_SIGNATURE_END) |
if (puch[sizeof (unsigned char) + sizeof (Uint64)] != CONVERT_SIGNATURE_END) |
{ | { |
PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); | PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
*ptrap = 0; | *ptrap = 0; |
} | } |
| |
PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)(*((int *)(puch + 1)))<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)(*((long *)(puch + 1)))<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
| |
return (C)(void *)(*((int *)(puch + 1))); |
return (C)(void *)(*((Uint64 *)(puch + 1))); |
} | } |
| |
template <typename C, typename J> | template <typename C, typename J> |
J TemplateConvertCToJava (C p) | J TemplateConvertCToJava (C p) |
{ | { |
unsigned char *puch = (unsigned char *)std::malloc (CONVERT_SIZE); |
unsigned char *puch = (unsigned char *)::malloc (CONVERT_SIZE); |
int *ptrap = 0; |
unsigned char *ptrap = 0; |
| |
if (puch) | if (puch) |
{ | { |
puch[0] = CONVERT_SIGNATURE_BEGIN; | puch[0] = CONVERT_SIGNATURE_BEGIN; |
*(int *)(puch + 1) = (int)p; |
*(Uint64 *)(puch + 1) = (Uint64)p; |
puch[1 + sizeof (int)] = CONVERT_SIGNATURE_END; |
puch[1 + sizeof (Uint64)] = CONVERT_SIGNATURE_END; |
} | } |
else | else |
{ | { |
|
|
void TemplateConvertCleanup (J p) | void TemplateConvertCleanup (J p) |
{ | { |
unsigned char *puch = (unsigned char *)p; | unsigned char *puch = (unsigned char *)p; |
int *ptrap = 0; |
unsigned char *ptrap = 0; |
| |
PEGASUS_STD(cout)<<"TemplateConvertCleanup "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); | PEGASUS_STD(cout)<<"TemplateConvertCleanup "<<PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl); |
| |
|
|
{ | { |
*ptrap = 0; | *ptrap = 0; |
} | } |
if (puch[1 + sizeof (int)] != CONVERT_SIGNATURE_END) |
if (puch[1 + sizeof (Uint64)] != CONVERT_SIGNATURE_END) |
{ | { |
*ptrap = 0; | *ptrap = 0; |
} | } |
| |
std::memset (puch, 0, CONVERT_SIZE); |
::memset (puch, 0, CONVERT_SIZE); |
std::free ((void *)puch); |
::free ((void *)puch); |
} | } |
| |
#else | #else |
|
|
#endif | #endif |
| |
#endif | #endif |
|
|
|
#endif |