hydrus/include/HydrusSerialisable.py

134 lines
3.5 KiB
Python

import json
import lz4
SERIALISABLE_TYPE_BASE = 0
SERIALISABLE_TYPE_BASE_NAMED = 1
SERIALISABLE_TYPE_SHORTCUTS = 2
SERIALISABLE_TYPE_SUBSCRIPTION = 3
SERIALISABLE_TYPE_PERIODIC = 4
SERIALISABLE_TYPE_GALLERY_QUERY = 5
SERIALISABLE_TYPE_IMPORT_TAG_OPTIONS = 6
SERIALISABLE_TYPE_IMPORT_FILE_OPTIONS = 7
SERIALISABLE_TYPE_SEED_QUEUE = 8
SERIALISABLE_TYPE_HDD_IMPORT = 9
SERIALISABLE_TYPE_SERVER_TO_CLIENT_CONTENT_UPDATE_PACKAGE = 10
SERIALISABLE_TYPE_SERVER_TO_CLIENT_SERVICE_UPDATE_PACKAGE = 11
SERIALISABLE_TYPE_MANAGEMENT_CONTROLLER = 12
SERIALISABLE_TYPE_GUI_SESSION = 13
SERIALISABLE_TYPE_PREDICATE = 14
SERIALISABLE_TYPE_FILE_SEARCH_CONTEXT = 15
SERIALISABLE_TYPE_EXPORT_FOLDER = 16
SERIALISABLE_TYPES_TO_OBJECT_TYPES = {}
def CreateFromNetworkString( network_string ):
obj_string = lz4.loads( network_string )
return CreateFromString( obj_string )
def CreateFromString( obj_string ):
obj_tuple = json.loads( obj_string )
return CreateFromSerialisableTuple( obj_tuple )
def CreateFromSerialisableTuple( obj_tuple ):
if len( obj_tuple ) == 3:
( serialisable_type, version, serialisable_info ) = obj_tuple
obj = SERIALISABLE_TYPES_TO_OBJECT_TYPES[ serialisable_type ]()
else:
( serialisable_type, name, version, serialisable_info ) = obj_tuple
obj = SERIALISABLE_TYPES_TO_OBJECT_TYPES[ serialisable_type ]( name )
obj.InitialiseFromSerialisableInfo( version, serialisable_info )
return obj
def DumpToNetworkString( obj ):
obj_string = DumpToString( obj )
return lz4.dumps( obj_string )
def DumpToString( obj ):
obj_tuple = GetSerialisableTuple( obj )
return json.dumps( obj_tuple )
def GetSerialisableTuple( obj ):
if isinstance( obj, SerialisableBaseNamed ):
return ( obj.SERIALISABLE_TYPE, obj.GetName(), obj.SERIALISABLE_VERSION, obj.GetSerialisableInfo() )
else:
return ( obj.SERIALISABLE_TYPE, obj.SERIALISABLE_VERSION, obj.GetSerialisableInfo() )
class SerialisableBase( object ):
SERIALISABLE_TYPE = SERIALISABLE_TYPE_BASE
SERIALISABLE_VERSION = 1
def _GetSerialisableInfo( self ):
raise NotImplementedError()
def _InitialiseFromSerialisableInfo( self, serialisable_info ):
raise NotImplementedError()
def _UpdateInfo( self, version, old_info ):
return old_info
def GetSerialisableInfo( self ):
serialisable_info = self._GetSerialisableInfo()
return serialisable_info
def GetTypeAndVersion( self ):
return ( self.SERIALISABLE_TYPE, self.SERIALISABLE_VERSION )
def InitialiseFromSerialisableInfo( self, version, serialisable_info ):
if version != self.SERIALISABLE_VERSION:
serialisable_info = self._UpdateInfo( version, serialisable_info )
self._InitialiseFromSerialisableInfo( serialisable_info )
class SerialisableBaseNamed( SerialisableBase ):
SERIALISABLE_TYPE = SERIALISABLE_TYPE_BASE_NAMED
def __init__( self, name ):
SerialisableBase.__init__( self )
self._name = name
def GetName( self ): return self._name
def SetName( self, name ): self._name = name