1010import StringIO
1111import struct
1212
13+ try :
14+ import logging
15+ except ImportError :
16+ def log_debug (message , ident = 0 ):
17+ pass
18+ def log_error (message , ident = 0 ):
19+ pass
20+ else :
21+ _log = logging .getLogger (__name__ )
22+ def log_debug (message , ident = 0 ):
23+ _log .debug (" " * (ident * 2 ) + str (message ))
24+ def log_error (message , ident = 0 ):
25+ _log .error (" " * (ident * 2 ) + str (message ))
26+
1327__version__ = "$Revision: 20 $"
1428
1529def load (file_object ):
@@ -147,10 +161,10 @@ def readObject(self):
147161 position_bak = self .object_stream .tell ()
148162 the_rest = self .object_stream .read ()
149163 if len (the_rest ):
150- print "Warning!!!!: Stream still has %s bytes left." % len (the_rest )
151- print self ._create_hexdump (the_rest )
164+ log_error ( "Warning!!!!: Stream still has %s bytes left. Enable debug mode of logging to see the hexdump. " % len (the_rest ) )
165+ log_debug ( self ._create_hexdump (the_rest ) )
152166 else :
153- print "Ok!!!!"
167+ log_debug ( "Java Object unmarshalled succesfully!" )
154168 self .object_stream .seek (position_bak )
155169
156170 return res
@@ -165,7 +179,7 @@ def _readStreamHeader(self):
165179
166180 def _read_and_exec_opcode (self , ident = 0 , expect = None ):
167181 (opid , ) = self ._readStruct (">B" )
168- self . _log_ident ("OpCode: 0x%X" % opid , ident )
182+ log_debug ("OpCode: 0x%X" % opid , ident )
169183 if expect and opid not in expect :
170184 raise IOError ("Unexpected opcode 0x%X" % opid )
171185 return self .opmap .get (opid , self .do_unknown )(ident = ident )
@@ -197,19 +211,19 @@ def do_classdesc(self, parent=None, ident=0):
197211 # objectDesc:
198212 # obj_typecode fieldName className1
199213 clazz = JavaClass ()
200- self . _log_ident ("[classdesc]" , ident )
214+ log_debug ("[classdesc]" , ident )
201215 ba = self ._readString ()
202216 clazz .name = ba
203- self . _log_ident ("Class name: %s" % ba , ident )
217+ log_debug ("Class name: %s" % ba , ident )
204218 (serialVersionUID , newHandle , classDescFlags ) = self ._readStruct (">LLB" )
205219 clazz .serialVersionUID = serialVersionUID
206220 clazz .flags = classDescFlags
207221
208222 self ._add_reference (clazz )
209223
210- self . _log_ident ("Serial: 0x%X newHandle: 0x%X. classDescFlags: 0x%X" % (serialVersionUID , newHandle , classDescFlags ), ident )
224+ log_debug ("Serial: 0x%X newHandle: 0x%X. classDescFlags: 0x%X" % (serialVersionUID , newHandle , classDescFlags ), ident )
211225 (length , ) = self ._readStruct (">H" )
212- self . _log_ident ("Fields num: 0x%X" % length , ident )
226+ log_debug ("Fields num: 0x%X" % length , ident )
213227
214228 clazz .fields_names = []
215229 clazz .fields_types = []
@@ -228,7 +242,7 @@ def do_classdesc(self, parent=None, ident=0):
228242 elif field_type == self .TYPE_OBJECT :
229243 field_type = self ._read_and_exec_opcode (ident = ident + 1 , expect = [self .TC_STRING , self .TC_REFERENCE ])
230244
231- self . _log_ident ("FieldName: 0x%X" % type + " " + str (field_name ) + " " + str (field_type ), ident )
245+ log_debug ("FieldName: 0x%X" % type + " " + str (field_name ) + " " + str (field_type ), ident )
232246 assert field_name is not None
233247 assert field_type is not None
234248
@@ -241,35 +255,35 @@ def do_classdesc(self, parent=None, ident=0):
241255 (opid , ) = self ._readStruct (">B" )
242256 if opid != self .TC_ENDBLOCKDATA :
243257 raise NotImplementedError ("classAnnotation isn't implemented yet" )
244- self . _log_ident ("OpCode: 0x%X" % opid , ident )
258+ log_debug ("OpCode: 0x%X" % opid , ident )
245259 # superClassDesc
246260 superclassdesc = self ._read_and_exec_opcode (ident = ident + 1 , expect = [self .TC_CLASSDESC , self .TC_NULL , self .TC_REFERENCE ])
247- self . _log_ident (str (superclassdesc ), ident )
261+ log_debug (str (superclassdesc ), ident )
248262 clazz .superclass = superclassdesc
249263
250264 return clazz
251265
252266 def do_blockdata (self , parent = None , ident = 0 ):
253267 # TC_BLOCKDATA (unsigned byte)<size> (byte)[size]
254- self . _log_ident ("[blockdata]" , ident )
268+ log_debug ("[blockdata]" , ident )
255269 (length , ) = self ._readStruct (">B" )
256270 ba = self .object_stream .read (length )
257271 return ba
258272
259273 def do_class (self , parent = None , ident = 0 ):
260274 # TC_CLASS classDesc newHandle
261- self . _log_ident ("[class]" , ident )
275+ log_debug ("[class]" , ident )
262276
263277 # TODO: what to do with "(ClassDesc)prevObject". (see 3rd line for classDesc:)
264278 classdesc = self ._read_and_exec_opcode (ident = ident + 1 , expect = [self .TC_CLASSDESC , self .TC_PROXYCLASSDESC , self .TC_NULL , self .TC_REFERENCE ])
265- self . _log_ident ("Classdesc: %s" % classdesc , ident )
279+ log_debug ("Classdesc: %s" % classdesc , ident )
266280 self ._add_reference (classdesc )
267281 return classdesc
268282
269283 def do_object (self , parent = None , ident = 0 ):
270284 # TC_OBJECT classDesc newHandle classdata[] // data for each class
271285 java_object = JavaObject ()
272- self . _log_ident ("[object]" , ident )
286+ log_debug ("[object]" , ident )
273287
274288 # TODO: what to do with "(ClassDesc)prevObject". (see 3rd line for classDesc:)
275289 classdesc = self ._read_and_exec_opcode (ident = ident + 1 , expect = [self .TC_CLASSDESC , self .TC_PROXYCLASSDESC , self .TC_NULL , self .TC_REFERENCE ])
@@ -291,7 +305,7 @@ def do_object(self, parent=None, ident=0):
291305 megalist = []
292306 megatypes = []
293307 while tempclass :
294- self . _log_ident (">>> " + str (tempclass .fields_names ) + " " + str (tempclass ), ident )
308+ log_debug (">>> " + str (tempclass .fields_names ) + " " + str (tempclass ), ident )
295309 fieldscopy = tempclass .fields_names [:]
296310 fieldscopy .extend (megalist )
297311 megalist = fieldscopy
@@ -302,9 +316,9 @@ def do_object(self, parent=None, ident=0):
302316
303317 tempclass = tempclass .superclass
304318
305- self . _log_ident ("Values count: %s" % str (len (megalist )), ident )
306- self . _log_ident ("Prepared list of values: %s" % str (megalist ), ident )
307- self . _log_ident ("Prepared list of types: %s" % str (megatypes ), ident )
319+ log_debug ("Values count: %s" % str (len (megalist )), ident )
320+ log_debug ("Prepared list of values: %s" % str (megalist ), ident )
321+ log_debug ("Prepared list of types: %s" % str (megatypes ), ident )
308322
309323 for field_name , field_type in zip (megalist , megatypes ):
310324 res = self ._read_value (field_type , ident , name = field_name )
@@ -315,29 +329,29 @@ def do_object(self, parent=None, ident=0):
315329 (opid , ) = self ._readStruct (">B" )
316330 if opid != self .TC_ENDBLOCKDATA : # 0x78:
317331 self .object_stream .seek (- 1 , mode = 1 )
318- print self ._create_hexdump (self .object_stream .read ())
332+ # print self._create_hexdump(self.object_stream.read())
319333 raise NotImplementedError ("objectAnnotation isn't fully implemented yet" ) # TODO:
320334
321335
322336 return java_object
323337
324338 def do_string (self , parent = None , ident = 0 ):
325- self . _log_ident ("[string]" , ident )
339+ log_debug ("[string]" , ident )
326340 ba = self ._readString ()
327341 self ._add_reference (str (ba ))
328342 return str (ba )
329343
330344 def do_array (self , parent = None , ident = 0 ):
331345 # TC_ARRAY classDesc newHandle (int)<size> values[size]
332- self . _log_ident ("[array]" , ident )
346+ log_debug ("[array]" , ident )
333347 classdesc = self ._read_and_exec_opcode (ident = ident + 1 , expect = [self .TC_CLASSDESC , self .TC_PROXYCLASSDESC , self .TC_NULL , self .TC_REFERENCE ])
334348
335349 array = []
336350
337351 self ._add_reference (array )
338352
339353 (size , ) = self ._readStruct (">i" )
340- self . _log_ident ("size: " + str (size ), ident )
354+ log_debug ("size: " + str (size ), ident )
341355
342356 type_char = classdesc .name [0 ]
343357 assert type_char == self .TYPE_ARRAY
@@ -346,19 +360,19 @@ def do_array(self, parent=None, ident=0):
346360 if type_char == self .TYPE_OBJECT or type_char == self .TYPE_ARRAY :
347361 for i in range (size ):
348362 res = self ._read_and_exec_opcode (ident = ident + 1 )
349- self . _log_ident ("Object value: %s" % str (res ), ident )
363+ log_debug ("Object value: %s" % str (res ), ident )
350364 array .append (res )
351365 else :
352366 for i in range (size ):
353367 res = self ._read_value (type_char , ident )
354- self . _log_ident ("Native value: %s" % str (res ), ident )
368+ log_debug ("Native value: %s" % str (res ), ident )
355369 array .append (res )
356370
357371 return array
358372
359373 def do_reference (self , parent = None , ident = 0 ):
360374 (handle , ) = self ._readStruct (">L" )
361- self . _log_ident ("## Reference handle: 0x%x" % (handle ), ident )
375+ log_debug ("## Reference handle: 0x%x" % (handle ), ident )
362376 return self .references [handle - self .BASE_REFERENCE_IDX ]
363377
364378 def do_null (self , parent = None , ident = 0 ):
@@ -367,9 +381,6 @@ def do_null(self, parent=None, ident=0):
367381 def do_unknown (self , parent = None , ident = 0 ):
368382 raise RuntimeError ("Unknown OpCode" )
369383
370- def _log_ident (self , message , ident ):
371- print " " * (ident * 2 ) + str (message )
372-
373384 def _create_hexdump (self , src , length = 16 ):
374385 FILTER = '' .join ([(len (repr (chr (x )))== 3 ) and chr (x ) or '.' for x in range (256 )])
375386 result = []
@@ -403,7 +414,7 @@ def _read_value(self, field_type, ident, name = ""):
403414 res = self ._read_and_exec_opcode (ident = ident + 1 )
404415 else :
405416 raise RuntimeError ("Unknown typecode: %s" % field_type )
406- self . _log_ident ("* %s %s: " % (field_type , name ) + str (res ), ident )
417+ log_debug ("* %s %s: " % (field_type , name ) + str (res ), ident )
407418 return res
408419
409420 def _convert_char_to_type (self , type_char ):
@@ -420,15 +431,15 @@ def _add_reference(self, obj):
420431 self .references .append (obj )
421432
422433 def _oops_dump_state (self ):
423- print "==Oops state dump" + "=" * (30 - 17 )
424- print "References:" , self .references
425- print "Stream seeking back at -16 byte (2nd line is an actual position!):"
434+ log_error ( "==Oops state dump" + "=" * (30 - 17 ) )
435+ log_error ( "References: %s" % str ( self .references ))
436+ log_error ( "Stream seeking back at -16 byte (2nd line is an actual position!):" )
426437 self .object_stream .seek (- 16 , mode = 1 )
427438 the_rest = self .object_stream .read ()
428439 if len (the_rest ):
429- print "Warning!!!!: Stream still has %s bytes left." % len (the_rest )
430- print self ._create_hexdump (the_rest )
431- print "=" * 30
440+ log_error ( "Warning!!!!: Stream still has %s bytes left." % len (the_rest ) )
441+ log_error ( self ._create_hexdump (the_rest ) )
442+ log_error ( "=" * 30 )
432443
433444
434445class JavaObjectMarshaller (JavaObjectConstants ):
@@ -447,14 +458,13 @@ def _writeStreamHeader(self):
447458 self ._writeStruct (">HH" , 4 , (self .STREAM_MAGIC , self .STREAM_VERSION ))
448459
449460 def writeObject (self , obj ):
450- print type (obj )
451- print obj
461+ log_debug ("Writing object of type " + str (type (obj )))
452462 if type (obj ) is JavaObject :
453- print "This is java object!"
454463 self .write_object (obj )
455464 elif type (obj ) is str :
456- print "This is string."
457465 self .write_blockdata (obj )
466+ else :
467+ raise RuntimeError ("Object serialization of type %s is not supported." % str (type (obj )))
458468
459469 def _writeStruct (self , unpack , length , args ):
460470 ba = struct .pack (unpack , * args )
@@ -469,7 +479,6 @@ def write_blockdata(self, obj, parent=None):
469479 # TC_BLOCKDATA (unsigned byte)<size> (byte)[size]
470480 self ._writeStruct (">B" , 1 , (self .TC_BLOCKDATA , ))
471481 if type (obj ) is str :
472- print "This is string."
473482 self ._writeStruct (">B" , 1 , (len (obj ), ))
474483 self .object_stream .write (obj )
475484
0 commit comments