8f3114e377
Signed-off-by: Michael Fabian Dirks <michael.dirks@project-kube.de>
299 lines
6.3 KiB
Plaintext
299 lines
6.3 KiB
Plaintext
SuperStrict
|
|
|
|
?Threaded
|
|
Import brl.threads
|
|
?
|
|
Import brl.linkedlist
|
|
|
|
Module xaymar.resource
|
|
ModuleInfo "License: Public Domain"
|
|
ModuleInfo "Original Author: Michael Dirks <support@levelnull.de>"
|
|
ModuleInfo "Purpose: Load your Files the better way! (Threading supported)"
|
|
|
|
Const TRM_SAVED:Int = -2
|
|
Const TRM_SAVING:Int = -1
|
|
Const TRM_NONE:Int = +0
|
|
Const TRM_LOADING:Int = +1
|
|
Const TRM_LOADED:Int = +2
|
|
Const TRM_ERROR:Int = $FF
|
|
Const TRM_ALL:Int = $FE
|
|
|
|
Const TRM_LS_ERROR:Int = 0
|
|
Const TRM_LS_SUCCESS:Int = 1
|
|
Const TRM_LS_NORESOURCE:Int = 2
|
|
|
|
Type TRLException
|
|
Method ToString:String()
|
|
Return "An Error appeared during Loading/Saving the Object."
|
|
End Method
|
|
End Type
|
|
Type TResourceManager
|
|
'Members
|
|
Field _ResList:TList = New TList
|
|
Field _ResourceLoaderFunc(Res:TResource)
|
|
Field _ResourceSaverFunc(Res:TResource)
|
|
|
|
'Members: Stats
|
|
Field _SavingRes:Int, _SavedRes:Int
|
|
Field _TotalRes:Int, _ErrorRes:Int
|
|
Field _LoadingRes:Int, _LoadedRes:Int
|
|
|
|
'Threaded Members
|
|
?Threaded Field _ResMutex:TMutex = CreateMutex()
|
|
?
|
|
|
|
'Methods
|
|
Method New();SetLoaderFunc(TResourceLoaderFunc);SetSaverFunc(TResourceSaverFunc);End Method
|
|
Method Remove()
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
_ResList.Clear()
|
|
_ResList = Null
|
|
?Threaded _ResMutex.Unlock()
|
|
_ResMutex.Close()
|
|
_ResMutex = Null
|
|
?
|
|
End Method
|
|
|
|
Method SetLoaderFunc(LoaderFunc:Byte Ptr)
|
|
_ResourceLoaderFunc = LoaderFunc
|
|
End Method
|
|
Method SetSaverFunc(SaverFunc:Byte Ptr)
|
|
_ResourceSaverFunc = SaverFunc
|
|
End Method
|
|
|
|
Method Update()
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
_TotalRes = _ResList.Count()
|
|
_LoadingRes = 0;_SavingRes = 0
|
|
_LoadedRes = 0;_SavedRes = 0
|
|
_ErrorRes = 0;
|
|
|
|
For Local _Res:TResource = EachIn _ResList
|
|
Select _Res._State
|
|
Case TRM_LOADING
|
|
_LoadingRes :+ 1
|
|
Case TRM_LOADED
|
|
_LoadedRes :+ 1
|
|
Case TRM_SAVING
|
|
_SavingRes :+ 1
|
|
Case TRM_SAVED
|
|
_SavedRes :+ 1
|
|
Case TRM_NONE
|
|
Default
|
|
_ErrorRes :+ 1
|
|
End Select
|
|
Next
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
End Method
|
|
Method GetCount:Int(Which:Int)
|
|
Select Which
|
|
Case TRM_NONE
|
|
Return _TotalRes-_LoadedRes-_LoadingRes-_SavedRes-_SavingRes-_ErrorRes
|
|
Case TRM_LOADING
|
|
Return _LoadingRes
|
|
Case TRM_LOADED
|
|
Return _LoadedRes
|
|
Case TRM_SAVING
|
|
Return _SavingRes
|
|
Case TRM_SAVED
|
|
Return _SavedRes
|
|
Case TRM_ERROR
|
|
Return _ErrorRes
|
|
Case TRM_ALL
|
|
Return _TotalRes
|
|
Default
|
|
Return 0
|
|
End Select
|
|
EndMethod
|
|
|
|
Method AddResource(Res:TResource)
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
_ResList.AddLast(Res)
|
|
Res._State = TRM_NONE
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
End Method
|
|
Method RemoveResourceName(Name:String)
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
For Local _Res:TResource = EachIn _ResList
|
|
If _Res.Name = Name Then
|
|
_ResList.Remove(_Res)
|
|
_Res = Null
|
|
End If
|
|
Next
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
End Method
|
|
Method RemoveResource(Res:TResource)
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
_ResList.Remove(Res)
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
End Method
|
|
Method ClearResource(Which:Int=TRM_ALL)
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
_ResList.Clear()
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
End Method
|
|
|
|
Method GetResourceName:TResource(Name:String, Which:Int=TRM_ALl)
|
|
Local _rRes:TResource
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
For Local _Res:TResource = EachIn _ResList
|
|
If _Res.Name = Name And (_Res._State = Which Or Which = TRM_ALL)
|
|
_rRes = _Res
|
|
Exit
|
|
EndIf
|
|
Next
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
Return _rRes
|
|
End Method
|
|
Method GetResourcesName:TResource[](Name:String, Which:Int=TRM_ALL)
|
|
Local _rList:TList = New TList
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
For Local _Res:TResource = EachIn _ResList
|
|
If _Res.Name = Name And (_Res._State = Which Or Which = TRM_ALL)
|
|
_rList.AddLast(_Res)
|
|
EndIf
|
|
Next
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
Return TResource[](_rList.ToArray())
|
|
End Method
|
|
Method GetResource:TResource(Which:Int=TRM_ALl)
|
|
Local _rRes:TResource
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
For Local _Res:TResource = EachIn _ResList
|
|
If (_Res._State = Which Or Which = TRM_ALL)
|
|
_rRes = _Res
|
|
Exit
|
|
EndIf
|
|
Next
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
Return _rRes
|
|
End Method
|
|
Method GetResources:TResource[](Which:Int=TRM_ALL)
|
|
Local _rList:TList = New TList
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
For Local _Res:TResource = EachIn _ResList
|
|
If (_Res._State = Which Or Which = TRM_ALL)
|
|
_rList.AddLast(_Res)
|
|
EndIf
|
|
Next
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
Return TResource[](_rList.ToArray())
|
|
End Method
|
|
|
|
Method LoadResource:Int(Which:Int=TRM_NONE)
|
|
Local _Res:TResource = GetResource(Which), _rVal:Int
|
|
If _Res = Null
|
|
Return TRM_LS_NORESOURCE
|
|
Else
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
_Res._State = TRM_LOADING
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
|
|
_ResourceLoaderFunc(_Res)
|
|
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
If _Res.Exception = Null And _Res.Resource <> Null
|
|
_Res._State = TRM_LOADED
|
|
_rVal = TRM_LS_SUCCESS
|
|
Else
|
|
If _Res.Exception = Null
|
|
_Res.Exception = New TRLException
|
|
End If
|
|
_Res._State = TRM_ERROR
|
|
_rVal = TRM_LS_ERROR
|
|
End If
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
Return _rVal
|
|
End If
|
|
End Method
|
|
Method SaveResource:Int(Which:Int=TRM_NONE)
|
|
Local _Res:TResource = GetResource(Which), _rVal:Int
|
|
If _Res = Null
|
|
Return TRM_LS_NORESOURCE
|
|
Else
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
_Res._State = TRM_SAVING
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
|
|
_ResourceSaverFunc(_Res)
|
|
|
|
?Threaded _ResMutex.Lock()
|
|
?
|
|
If _Res.Exception = Null
|
|
_Res._State = TRM_SAVED
|
|
_rVal = TRM_LS_SUCCESS
|
|
Else
|
|
_Res._State = TRM_ERROR
|
|
_rVal = TRM_LS_ERROR
|
|
End If
|
|
?Threaded _ResMutex.Unlock()
|
|
?
|
|
Return _rVal
|
|
End If
|
|
End Method
|
|
End Type
|
|
Type TResource
|
|
Field _State:Int
|
|
|
|
Field Name:String, File:String
|
|
Field Resource:Object, Exception:Object
|
|
|
|
Method New();EndMethod
|
|
Method Set(Name:String, File:String)
|
|
Self.Name = Name
|
|
Self.File = File
|
|
Self.Resource = Null
|
|
Self.Exception = Null
|
|
End Method
|
|
Method Remove()
|
|
Self.Resource = Null
|
|
Self.Exception = Null
|
|
Self.File = Null
|
|
Self.Name = Null
|
|
End Method
|
|
|
|
Method _Load();End Method
|
|
Method _Save();End Method
|
|
End Type
|
|
|
|
Function TResourceLoaderFunc(Res:TResource)
|
|
Try
|
|
Res._Load()
|
|
Catch E:Object
|
|
Res.Exception = E
|
|
Res.Resource = Null
|
|
EndTry
|
|
End Function
|
|
Function TResourceSaverFunc(Res:TResource)
|
|
Try
|
|
Res._Save()
|
|
Catch E:Object
|
|
Res.Exception = E
|
|
Res.Resource = Null
|
|
EndTry
|
|
End Function |