SuperStrict ?Threaded Import brl.threads ? Import brl.linkedlist Module xaymar.resource ModuleInfo "License: Public Domain" ModuleInfo "Original Author: Michael Dirks " 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