hydrus/include/HydrusSerialisable.py

254 lines
7.8 KiB
Python
Raw Normal View History

2015-04-22 22:57:25 +00:00
import json
import lz4
SERIALISABLE_TYPE_BASE = 0
SERIALISABLE_TYPE_BASE_NAMED = 1
SERIALISABLE_TYPE_SHORTCUTS = 2
2015-05-13 20:22:39 +00:00
SERIALISABLE_TYPE_SUBSCRIPTION = 3
SERIALISABLE_TYPE_PERIODIC = 4
2015-10-07 21:56:22 +00:00
SERIALISABLE_TYPE_GALLERY_IDENTIFIER = 5
2015-05-13 20:22:39 +00:00
SERIALISABLE_TYPE_IMPORT_TAG_OPTIONS = 6
SERIALISABLE_TYPE_IMPORT_FILE_OPTIONS = 7
2015-07-22 19:40:39 +00:00
SERIALISABLE_TYPE_SEED_CACHE = 8
2015-05-20 21:31:40 +00:00
SERIALISABLE_TYPE_HDD_IMPORT = 9
2015-06-03 21:05:13 +00:00
SERIALISABLE_TYPE_SERVER_TO_CLIENT_CONTENT_UPDATE_PACKAGE = 10
SERIALISABLE_TYPE_SERVER_TO_CLIENT_SERVICE_UPDATE_PACKAGE = 11
2015-06-17 20:01:41 +00:00
SERIALISABLE_TYPE_MANAGEMENT_CONTROLLER = 12
2015-06-24 22:10:14 +00:00
SERIALISABLE_TYPE_GUI_SESSION = 13
SERIALISABLE_TYPE_PREDICATE = 14
SERIALISABLE_TYPE_FILE_SEARCH_CONTEXT = 15
SERIALISABLE_TYPE_EXPORT_FOLDER = 16
2015-08-05 18:42:35 +00:00
SERIALISABLE_TYPE_THREAD_WATCHER_IMPORT = 17
2015-08-19 21:48:21 +00:00
SERIALISABLE_TYPE_PAGE_OF_IMAGES_IMPORT = 18
2015-09-09 22:04:39 +00:00
SERIALISABLE_TYPE_IMPORT_FOLDER = 19
2015-10-07 21:56:22 +00:00
SERIALISABLE_TYPE_GALLERY_IMPORT = 20
SERIALISABLE_TYPE_DICTIONARY = 21
SERIALISABLE_TYPE_CLIENT_OPTIONS = 22
2015-10-14 21:02:25 +00:00
SERIALISABLE_TYPE_CONTENT = 23
SERIALISABLE_TYPE_SERVER_TO_CLIENT_PETITION = 24
SERIALISABLE_TYPE_ACCOUNT_IDENTIFIER = 25
SERIALISABLE_TYPE_LIST = 26
2016-07-20 19:57:10 +00:00
SERIALISABLE_TYPE_HTML_PARSE_FORMULA = 27
2016-09-07 20:01:05 +00:00
SERIALISABLE_TYPE_URLS_IMPORT = 28
2015-04-22 22:57:25 +00:00
SERIALISABLE_TYPES_TO_OBJECT_TYPES = {}
2015-06-03 21:05:13 +00:00
def CreateFromNetworkString( network_string ):
2015-05-13 20:22:39 +00:00
2015-06-03 21:05:13 +00:00
obj_string = lz4.loads( network_string )
return CreateFromString( obj_string )
def CreateFromString( obj_string ):
obj_tuple = json.loads( obj_string )
2015-06-24 22:10:14 +00:00
return CreateFromSerialisableTuple( obj_tuple )
2015-06-03 21:05:13 +00:00
2015-06-24 22:10:14 +00:00
def CreateFromSerialisableTuple( obj_tuple ):
2015-06-03 21:05:13 +00:00
if len( obj_tuple ) == 3:
2015-06-24 22:10:14 +00:00
( serialisable_type, version, serialisable_info ) = obj_tuple
2015-06-03 21:05:13 +00:00
obj = SERIALISABLE_TYPES_TO_OBJECT_TYPES[ serialisable_type ]()
else:
2015-06-24 22:10:14 +00:00
( serialisable_type, name, version, serialisable_info ) = obj_tuple
2015-06-03 21:05:13 +00:00
obj = SERIALISABLE_TYPES_TO_OBJECT_TYPES[ serialisable_type ]( name )
2015-05-13 20:22:39 +00:00
2015-06-24 22:10:14 +00:00
obj.InitialiseFromSerialisableInfo( version, serialisable_info )
2015-05-13 20:22:39 +00:00
return obj
2015-06-03 21:05:13 +00:00
2015-04-22 22:57:25 +00:00
class SerialisableBase( object ):
SERIALISABLE_TYPE = SERIALISABLE_TYPE_BASE
2015-06-03 21:05:13 +00:00
SERIALISABLE_VERSION = 1
2015-04-22 22:57:25 +00:00
def _GetSerialisableInfo( self ):
raise NotImplementedError()
def _InitialiseFromSerialisableInfo( self, serialisable_info ):
raise NotImplementedError()
2015-07-22 19:40:39 +00:00
def _UpdateSerialisableInfo( self, version, old_serialisable_info ):
2015-04-22 22:57:25 +00:00
2015-07-22 19:40:39 +00:00
return old_serialisable_info
2015-04-22 22:57:25 +00:00
2016-07-20 19:57:10 +00:00
2015-10-14 21:02:25 +00:00
def DumpToNetworkString( self ):
obj_string = self.DumpToString()
return lz4.dumps( obj_string )
2015-04-22 22:57:25 +00:00
2015-10-14 21:02:25 +00:00
def DumpToString( self ):
2015-04-22 22:57:25 +00:00
2015-10-14 21:02:25 +00:00
obj_tuple = self.GetSerialisableTuple()
2015-04-22 22:57:25 +00:00
2015-10-14 21:02:25 +00:00
return json.dumps( obj_tuple )
2015-04-22 22:57:25 +00:00
2015-10-14 21:02:25 +00:00
def GetSerialisableTuple( self ):
2015-04-22 22:57:25 +00:00
2015-10-14 21:02:25 +00:00
return ( self.SERIALISABLE_TYPE, self.SERIALISABLE_VERSION, self._GetSerialisableInfo() )
2015-05-13 20:22:39 +00:00
2015-06-24 22:10:14 +00:00
def InitialiseFromSerialisableInfo( self, version, serialisable_info ):
2015-04-22 22:57:25 +00:00
2015-07-22 19:40:39 +00:00
while version < self.SERIALISABLE_VERSION:
2015-04-22 22:57:25 +00:00
2015-07-22 19:40:39 +00:00
( version, serialisable_info ) = self._UpdateSerialisableInfo( version, serialisable_info )
2015-04-22 22:57:25 +00:00
self._InitialiseFromSerialisableInfo( serialisable_info )
class SerialisableBaseNamed( SerialisableBase ):
SERIALISABLE_TYPE = SERIALISABLE_TYPE_BASE_NAMED
def __init__( self, name ):
SerialisableBase.__init__( self )
self._name = name
2015-10-14 21:02:25 +00:00
def GetSerialisableTuple( self ):
return ( self.SERIALISABLE_TYPE, self._name, self.SERIALISABLE_VERSION, self._GetSerialisableInfo() )
2016-07-20 19:57:10 +00:00
2015-04-22 22:57:25 +00:00
def GetName( self ): return self._name
def SetName( self, name ): self._name = name
2015-10-07 21:56:22 +00:00
class SerialisableDictionary( SerialisableBase, dict ):
SERIALISABLE_TYPE = SERIALISABLE_TYPE_DICTIONARY
SERIALISABLE_VERSION = 1
def __init__( self, *args, **kwargs ):
dict.__init__( self, *args, **kwargs )
SerialisableBase.__init__( self )
def _GetSerialisableInfo( self ):
simple_key_simple_value_pairs = []
simple_key_serialisable_value_pairs = []
serialisable_key_simple_value_pairs = []
serialisable_key_serialisable_value_pairs = []
for ( key, value ) in self.items():
if isinstance( key, SerialisableBase ):
2015-10-14 21:02:25 +00:00
serialisable_key = key.GetSerialisableTuple()
2015-10-07 21:56:22 +00:00
if isinstance( value, SerialisableBase ):
2015-10-14 21:02:25 +00:00
serialisable_value = value.GetSerialisableTuple()
2015-10-07 21:56:22 +00:00
serialisable_key_serialisable_value_pairs.append( ( serialisable_key, serialisable_value ) )
else:
serialisable_value = value
serialisable_key_simple_value_pairs.append( ( serialisable_key, serialisable_value ) )
else:
serialisable_key = key
if isinstance( value, SerialisableBase ):
2015-10-14 21:02:25 +00:00
serialisable_value = value.GetSerialisableTuple()
2015-10-07 21:56:22 +00:00
simple_key_serialisable_value_pairs.append( ( serialisable_key, serialisable_value ) )
else:
serialisable_value = value
simple_key_simple_value_pairs.append( ( serialisable_key, serialisable_value ) )
return ( simple_key_simple_value_pairs, simple_key_serialisable_value_pairs, serialisable_key_simple_value_pairs, serialisable_key_serialisable_value_pairs )
def _InitialiseFromSerialisableInfo( self, serialisable_info ):
( simple_key_simple_value_pairs, simple_key_serialisable_value_pairs, serialisable_key_simple_value_pairs, serialisable_key_serialisable_value_pairs ) = serialisable_info
for ( key, value ) in simple_key_simple_value_pairs:
self[ key ] = value
for ( key, serialisable_value ) in simple_key_serialisable_value_pairs:
value = CreateFromSerialisableTuple( serialisable_value )
self[ key ] = value
for ( serialisable_key, value ) in serialisable_key_simple_value_pairs:
key = CreateFromSerialisableTuple( serialisable_key )
self[ key ] = value
for ( serialisable_key, serialisable_value ) in serialisable_key_serialisable_value_pairs:
key = CreateFromSerialisableTuple( serialisable_key )
value = CreateFromSerialisableTuple( serialisable_value )
self[ key ] = value
2015-10-14 21:02:25 +00:00
SERIALISABLE_TYPES_TO_OBJECT_TYPES[ SERIALISABLE_TYPE_DICTIONARY ] = SerialisableDictionary
class SerialisableList( SerialisableBase, list ):
SERIALISABLE_TYPE = SERIALISABLE_TYPE_LIST
SERIALISABLE_VERSION = 1
def __init__( self, *args, **kwargs ):
list.__init__( self, *args, **kwargs )
SerialisableBase.__init__( self )
def _GetSerialisableInfo( self ):
return [ obj.GetSerialisableTuple() for obj in self ]
def _InitialiseFromSerialisableInfo( self, serialisable_info ):
for obj_tuple in serialisable_info:
self.append( CreateFromSerialisableTuple( obj_tuple ) )
SERIALISABLE_TYPES_TO_OBJECT_TYPES[ SERIALISABLE_TYPE_LIST ] = SerialisableList