hackedteam/rcs-console-library

View on GitHub
src/it/ht/rcs/console/task/controller/DownloadManager.as

Summary

Maintainability
Test Coverage
package it.ht.rcs.console.task.controller
{
  import it.ht.rcs.console.DB;
  import it.ht.rcs.console.controller.ItemManager;
  import it.ht.rcs.console.events.SessionEvent;
  import it.ht.rcs.console.notifications.NotificationPopup;
  import it.ht.rcs.console.task.model.Task;
  
  import mx.collections.ArrayCollection;
  import mx.resources.ResourceManager;
  import mx.rpc.events.FaultEvent;
  import mx.rpc.events.ResultEvent;
  
  public class DownloadManager extends ItemManager
  {

    public function DownloadManager() { super(DownloadTask); }
    
    private static var _instance:DownloadManager = new DownloadManager();
    public static function get instance():DownloadManager { return _instance; }
    
    [Bindable]
    public var active:Boolean = false;

    [Bindable]
    public var running:Boolean = false;
    
    override public function refresh():void
    {
      super.refresh();
      DB.instance.task.all(onResult);
    }
    
    private function onResult(e:ResultEvent):void
    {
      var items:ArrayCollection = e.result as ArrayCollection;
      clear();
      
      active = items.length > 0;
      
      if (items.length > 0)
        items.source.forEach(itemToDownloadTask);
    }
    
    private function itemToDownloadTask(task:Object, index:int, arr:Array):void
    {
      trace(_classname + ' (itemToDownloadTask) e.result = ' + task);
      var downloadTask:DownloadTask = new DownloadTask(task, DB.instance);
      addTask(downloadTask);
      downloadTask.start_update();
    }
    
    override protected function onBeforeLogout(e:SessionEvent):void
    {
      trace(_classname + ' (instance) -- Before Log Out');
      for (var i:int = 0; i < _items.length; i++) {
        var t:DownloadTask = _items.getItemAt(i) as DownloadTask;
        if (t.running()) {
          e.preventDefault();
          return;
        }
      }
    }
    
    override protected function onLogout(e:SessionEvent):void
    {
      trace(_classname + ' (instance) -- Log Out');
      clearFinished();
      for (var i:int = 0; i < _items.length; i++) {
        var t:DownloadTask = _items.getItemAt(i) as DownloadTask;
        t.cleanup();
        _items.removeItem(t);
      }
      active = false;
      running = false;
      super.onLogout(e);
    }
    
    public function checkRunning():void
    {
      for (var i:int = 0; i < _items.length; i++) {
        var t:DownloadTask = _items.getItemAt(i) as DownloadTask;
        if (t.running()) {
          running = true;
          return;
        }
      }
      running = false;
    }
    
    public function clearFinished():void
    {
      for (var i:int = _items.length-1; i >= 0; i--)
      {
        if (_items.source[i].isFinished())
          removeTask(_items.getItemAt(i) as DownloadTask);
      }
    }
    
    public function createTask(type:String, fileName:String, params:Object, onSuccess:Function=null, onFailure:Function=null):void
    {
      DB.instance.task.create({type: type, file_name: fileName, params: params}, 
        function (e:ResultEvent):void { 
          // success
          onTaskCreateResult(e); 
          if (onSuccess != null) 
            onSuccess(e); 
        }, 
        function (e:FaultEvent):void { 
          // failure
          onTaskCreateError(e);
          if (onFailure != null)
            onFailure(e);
        }
      );
    }
    
    public function onTaskCreateResult(e:ResultEvent):void
    {
      itemToDownloadTask(new Task(e.result), 0, null);
    }
    
    public function onTaskCreateError(e:FaultEvent):void
    {
      trace(e.statusCode);
      NotificationPopup.showNotification(ResourceManager.getInstance().getString('localized_main', 'TASK_CREATE_ERROR', [e.message.body.toString().replace('"', '').replace('"', '')]));
    }
    
    override protected function onItemRemove(t:*):void
    {
      t.cleanup();
      t.destroy();
    }
    
    public function addTask(t:DownloadTask):void
    {
      addItem(t);
      active = _items.length > 0;
      checkRunning();
    }
    
    public function removeTask(t:DownloadTask):void
    {
      removeItem(t);
      active = _items.length > 0;
    }
  }
}