1 martin 1.5 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.6 //
|
3 martin 1.5 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.6 //
|
10 martin 1.5 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.6 //
|
17 martin 1.5 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.6 //
|
20 martin 1.5 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.6 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.5 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.6 //
|
28 martin 1.5 //////////////////////////////////////////////////////////////////////////
|
29 mark.hamzy 1.1 //
30 // Author: Mark Hamzy, hamzy@us.ibm.com
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
|
34 mark.hamzy 1.3 #ifndef _JMPI_Convert_h
35 #define _JMPI_Convert_h
36
|
37 mark.hamzy 1.1 #ifndef PEGASUS_DEBUG
38
39 // Retail build
40
41 #define DEBUG_ConvertJavaToC(j,c,p) (c)p
42 #define DEBUG_ConvertCToJava(c,j,p) (j)p
43 #define DEBUG_ConvertCleanup(c,p)
44
45 #else
46
47 // Debug build
48
49 #define CONVERT_NONE 1
50 #define CONVERT_BIG_PAD 0
51 #define CONVERT_SMALL_PAD 0
52
|
53 mark.hamzy 1.3 #include <Pegasus/Common/Config.h>
54 #include <iostream>
55 #include <cstdlib>
56
57 PEGASUS_USING_STD;
58 PEGASUS_USING_PEGASUS;
59
|
60 mark.hamzy 1.1 #if CONVERT_NONE
61
62 #define DEBUG_ConvertJavaToC(j,c,p) (c)p
63 #define DEBUG_ConvertCToJava(c,j,p) (j)p
64 #define DEBUG_ConvertCleanup(c,p)
65
66 #elif CONVERT_BIG_PAD
67
68 #define DEBUG_ConvertJavaToC(j,c,p) TemplateConvertJavaToC <j,c> (p)
69 #define DEBUG_ConvertCToJava(c,j,p) TemplateConvertCToJava <c,j> (p)
70 #define DEBUG_ConvertCleanup(j,p) TemplateConvertCleanup <j> (p)
71
|
72 mark.hamzy 1.3 #define CONVERT_SIGNATURE_BEGIN PEGASUS_UINT64_LITERAL(0x0123456789ABCDEF)
73 #define CONVERT_SIGNATURE_END PEGASUS_UINT64_LITERAL(0xFEDCBA9876543210)
74 #define CONVERT_SIZE (4 * sizeof (Uint64))
75
|
76 marek 1.4 #define ConvertEndianSwap(n) \
77 ((((n) & PEGASUS_UINT64_LITERAL(0xff00000000000000)) >> 56) | \
78 (((n) & PEGASUS_UINT64_LITERAL(0x00ff000000000000)) >> 40) | \
79 (((n) & PEGASUS_UINT64_LITERAL(0x0000ff0000000000)) >> 24) | \
80 (((n) & PEGASUS_UINT64_LITERAL(0x000000ff00000000)) >> 8) | \
81 (((n) & PEGASUS_UINT64_LITERAL(0x00000000ff000000)) << 8) | \
82 (((n) & PEGASUS_UINT64_LITERAL(0x0000000000ff0000)) << 24) | \
83 (((n) & PEGASUS_UINT64_LITERAL(0x000000000000ff00)) << 40) | \
84 (((n) & PEGASUS_UINT64_LITERAL(0x00000000000000ff)) << 56) )
|
85 mark.hamzy 1.1
86 template <typename J, typename C>
87 C TemplateConvertJavaToC (J p)
88 {
|
89 mark.hamzy 1.3 Uint64 *pui64 = (Uint64 *)p;
90 Uint64 *ptrap = 0;
|
91 mark.hamzy 1.1
|
92 mark.hamzy 1.3 if (pui64[0] != CONVERT_SIGNATURE_BEGIN)
|
93 mark.hamzy 1.1 {
|
94 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<
95 PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
96 mark.hamzy 1.1 *ptrap = 0;
97 }
|
98 mark.hamzy 1.3 if (pui64[1] != ConvertEndianSwap (pui64[2]))
|
99 mark.hamzy 1.1 {
100 *ptrap = 0;
101 }
|
102 mark.hamzy 1.3 if (pui64[3] != CONVERT_SIGNATURE_END)
|
103 mark.hamzy 1.1 {
|
104 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<
105 PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
106 mark.hamzy 1.1 *ptrap = 0;
107 }
108
|
109 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<
110 PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)pui64[1]<<
111 PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
112 mark.hamzy 1.1
|
113 mark.hamzy 1.3 return (C)pui64[1];
|
114 mark.hamzy 1.1 }
115
116 template <typename C, typename J>
117 J TemplateConvertCToJava (C p)
118 {
|
119 mark.hamzy 1.3 Uint64 *pui64 = (Uint64 *)::malloc (CONVERT_SIZE);
120 Uint64 *ptrap = 0;
|
121 mark.hamzy 1.1
|
122 mark.hamzy 1.3 if (pui64)
|
123 mark.hamzy 1.1 {
|
124 mark.hamzy 1.3 pui64[0] = CONVERT_SIGNATURE_BEGIN;
125 pui64[1] = (Uint64)p;
126 pui64[2] = ConvertEndianSwap ((Uint64)p);
127 pui64[3] = CONVERT_SIGNATURE_END;
|
128 mark.hamzy 1.1 }
129 else
130 {
|
131 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertCToJava"<<
132 PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
133 mark.hamzy 1.1 *ptrap = 0;
134 }
135
|
136 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertCToJava "<<
137 PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)pui64<<
138 PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
139 mark.hamzy 1.1
|
140 mark.hamzy 1.3 return (J)pui64;
|
141 mark.hamzy 1.1 }
142
143 template <typename J>
144 void TemplateConvertCleanup (J p)
145 {
|
146 mark.hamzy 1.3 Uint64 *pui64 = (Uint64 *)p;
147 Uint64 *ptrap = 0;
|
148 mark.hamzy 1.1
|
149 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertCleanup "<<
150 PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
151 mark.hamzy 1.1
|
152 mark.hamzy 1.3 if (pui64[0] != CONVERT_SIGNATURE_BEGIN)
|
153 mark.hamzy 1.1 {
154 *ptrap = 0;
155 }
|
156 mark.hamzy 1.3 if (pui64[1] != ConvertEndianSwap (pui64[2]))
|
157 mark.hamzy 1.1 {
158 *ptrap = 0;
159 }
|
160 mark.hamzy 1.3 if (pui64[3] != CONVERT_SIGNATURE_END)
|
161 mark.hamzy 1.1 {
162 *ptrap = 0;
163 }
164
|
165 mark.hamzy 1.3 ::memset (pui64, 0, CONVERT_SIZE);
166 ::free ((void *)pui64);
|
167 mark.hamzy 1.1 }
168
169 #elif CONVERT_SMALL_PAD
170
171 #define DEBUG_ConvertJavaToC(j,c,p) TemplateConvertJavaToC <j,c> (p)
172 #define DEBUG_ConvertCToJava(c,j,p) TemplateConvertCToJava <c,j> (p)
173 #define DEBUG_ConvertCleanup(j,p) TemplateConvertCleanup <j> (p)
174
175 #define CONVERT_SIGNATURE_BEGIN 0xFE
176 #define CONVERT_SIGNATURE_END 0x12
|
177 marek 1.4 #define CONVERT_SIZE (sizeof(unsigned char)+ \
178 sizeof(Uint64)+ \
179 sizeof(unsigned char))
|
180 mark.hamzy 1.1
181 template <typename J, typename C>
182 C TemplateConvertJavaToC (J p)
183 {
184 unsigned char *puch = (unsigned char *)p;
|
185 mark.hamzy 1.3 unsigned char *ptrap = 0;
|
186 mark.hamzy 1.1
187 if (puch[0] != CONVERT_SIGNATURE_BEGIN)
188 {
|
189 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<
190 PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
191 mark.hamzy 1.1 *ptrap = 0;
192 }
|
193 mark.hamzy 1.3 if (puch[sizeof (unsigned char) + sizeof (Uint64)] != CONVERT_SIGNATURE_END)
|
194 mark.hamzy 1.1 {
|
195 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<
196 PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
197 mark.hamzy 1.1 *ptrap = 0;
198 }
199
|
200 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertJavaToC "<<
201 PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void*)(*((long *)(puch + 1)))<<
202 PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
203 mark.hamzy 1.1
|
204 mark.hamzy 1.3 return (C)(void *)(*((Uint64 *)(puch + 1)));
|
205 mark.hamzy 1.1 }
206
207 template <typename C, typename J>
208 J TemplateConvertCToJava (C p)
209 {
|
210 marek 1.4 unsigned char *puch = (unsigned char *)::malloc(CONVERT_SIZE);
|
211 mark.hamzy 1.3 unsigned char *ptrap = 0;
|
212 mark.hamzy 1.1
213 if (puch)
214 {
|
215 mark.hamzy 1.3 puch[0] = CONVERT_SIGNATURE_BEGIN;
216 *(Uint64 *)(puch + 1) = (Uint64)p;
217 puch[1 + sizeof (Uint64)] = CONVERT_SIGNATURE_END;
|
218 mark.hamzy 1.1 }
219 else
220 {
|
221 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertCToJava"<<
222 PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
223 mark.hamzy 1.1 *ptrap = 0;
224 }
225
|
226 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertCToJava "<<
227 PEGASUS_STD(hex)<<(void*)p<<" -> "<<(void *)puch<<
228 PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
229 mark.hamzy 1.1
230 return (J)puch;
231 }
232
233 template <typename J>
234 void TemplateConvertCleanup (J p)
235 {
236 unsigned char *puch = (unsigned char *)p;
|
237 mark.hamzy 1.3 unsigned char *ptrap = 0;
|
238 mark.hamzy 1.1
|
239 marek 1.4 PEGASUS_STD(cout)<<"TemplateConvertCleanup "<<
240 PEGASUS_STD(hex)<<(void*)p<<PEGASUS_STD(dec)<<PEGASUS_STD(endl);
|
241 mark.hamzy 1.1
242 if (puch[0] != CONVERT_SIGNATURE_BEGIN)
243 {
244 *ptrap = 0;
245 }
|
246 mark.hamzy 1.3 if (puch[1 + sizeof (Uint64)] != CONVERT_SIGNATURE_END)
|
247 mark.hamzy 1.1 {
248 *ptrap = 0;
249 }
250
|
251 marek 1.4 ::memset(puch, 0, CONVERT_SIZE);
252 ::free((void *)puch);
|
253 mark.hamzy 1.1 }
254
255 #else
256
|
257 marek 1.4 #error "Unsupported conversion case in \
258 src/Pegasus/ProviderManager2/JMPI/Convert.h"
|
259 mark.hamzy 1.1
260 #endif
261
262 #endif
|
263 mark.hamzy 1.3
264 #endif
|