hackedteam/rcs-console-library

View on GitHub
src/it/ht/rcs/console/accounting/controller/SessionManager.as

Summary

Maintainability
Test Coverage
package it.ht.rcs.console.accounting.controller
{
  import air.net.URLMonitor;
  
  import flash.events.StatusEvent;
  import flash.filesystem.File;
  import flash.filesystem.FileMode;
  import flash.filesystem.FileStream;
  import flash.net.URLRequest;
  
  import it.ht.rcs.console.*;
  import it.ht.rcs.console.accounting.model.Session;
  import it.ht.rcs.console.accounting.model.User;
  import it.ht.rcs.console.controller.ItemManager;
  import it.ht.rcs.console.events.SessionEvent;
  
  import mx.collections.ISort;
  import mx.collections.ListCollectionView;
  import mx.collections.Sort;
  import mx.collections.SortField;
  import mx.core.FlexGlobals;
  import mx.managers.CursorManager;
  import mx.rpc.events.FaultEvent;
  import mx.rpc.events.ResultEvent;
  
  public class SessionManager extends ItemManager
  {
    
    private var monitor:URLMonitor;
    [Bindable]
    public var hasConnection:Boolean;
    
    public function SessionManager()
    {
      super(Session);
     
      loadPreviousLoginDetails();
    }
    
    private static var _instance:SessionManager = new SessionManager();
    public static function get instance():SessionManager { return _instance; }
    
    [Bindable]
    public var lastUsername:String;
    
    [Bindable]
    public var lastServer:String;
    
//    [Bindable]
//    public var lastPassword:String;
    
    private var _onLoginResult:Function;
    private var _onLoginFault:Function;
    
    /* SESSIONS LIST MANAGEMENT */
    
    override public function refresh():void
    {
      super.refresh();
      DB.instance.session.all(onResult);
    }
    
    public function onResult(e:ResultEvent):void
    {
      clear();
      for each (var item:* in e.result.source)
        addItem(item);
      dispatchDataLoadedEvent();
    }
    
    public function disconnectUser(user:User):void
    {
      DB.instance.session.destroy(user.session.cookie, function(e:ResultEvent):void
      {
        removeItem(user.session);
        user.session = null;
      });
    }
    
    override public function getView(sortCriteria:ISort=null, filterFunction:Function=null):ListCollectionView
    {
      /* sorting by time */
      var sort:Sort = new Sort();
      sort.fields = [new SortField('time', true, false, true)];
      return super.getView(sort);
    }
    
    /* CURRENT SESSION MANAGEMENT */
    
    public function login(user:String, pass:String, server:String, version:String, notifier:IFaultNotifier, i18n:II18N, onResult:Function, onFault:Function):void
    {
      trace('SessionManager.login');
      
      this.lastUsername = user;
      this.lastServer = server;
      
      //this.lastPassword = pass;
      
      /* this is for DEMO purpose only, no database will be contacted, all the data are fake */
      var demoMode:Boolean = (user.indexOf('demo') != -1 && pass == '' && server == 'demo');
    
      if(demoMode)
      {
        trace(">>>>>>>>>>>>>>>>>>>>>>>>>>>>is demo")
        checkInternetConnection()
      }
      DB.instance.connect(server, notifier, i18n, demoMode);
      
      /* remember the function for the async handlers */
      _onLoginResult = onResult;
      _onLoginFault = onFault;
      

      DB.instance.session.login({ user: user, pass: pass, version:version }, onLoginResult, onLoginFault);
    }
    
    private function onLoginResult(e:ResultEvent):void
    {
      /* save the current session */
      var session:Session = e.result as Session;
      session.server = lastServer;
      
      /* save the info for the next login */
      savePreviousLoginDetails();
      
      /* invoke the callback */
      _onLoginResult(session);
    }
    
    private function onLoginFault(e:FaultEvent):void
    {
      /* HTTP 403 is 'not authorized' */
     
      if (e.statusCode == 403) {
        if(e.fault.content=="EXPIRED_ACCOUNT")
        {
          _onLoginFault('Password expired!');
          return;
        }
        _onLoginFault('Incorrect Username or Password...');
        return;
      } 
      
      _onLoginFault('Cannot connect to server');
    }
    
    public function logout(exitApplicationAfterLogout:Boolean=false):void
    {
      trace('SessionManager.logout');
      
      var beforeLogoutEvent:SessionEvent = new SessionEvent(SessionEvent.BEFORE_LOGOUT);
      FlexGlobals.topLevelApplication.dispatchEvent(beforeLogoutEvent);
      
      if (beforeLogoutEvent.isDefaultPrevented()) {
        var abortEvent:SessionEvent = new SessionEvent(SessionEvent.ABORT_LOGOUT);
        abortEvent.exitApplicationAfterLogout = exitApplicationAfterLogout;
        FlexGlobals.topLevelApplication.dispatchEvent(abortEvent);
      } else {
        forceLogout(exitApplicationAfterLogout);
      }
      
      CursorManager.removeBusyCursor();
    }
    
    public function forceLogout(exitApplicationAfterLogout:Boolean=false):void
    {
      trace('SessionManager.forceLogout');
      
      var event:SessionEvent = new SessionEvent(SessionEvent.LOGOUT);
      FlexGlobals.topLevelApplication.dispatchEvent(event);
      
      /* if we exit application before the first login, BD.instance.session is null */
      if (DB.instance.session != null)
        DB.instance.session.logout();
      
      if (exitApplicationAfterLogout)
        FlexGlobals.topLevelApplication.exit();
    }
    
    /* Methods to read and write last login details */
    
    private function loadPreviousLoginDetails():void
    {
      try {
        var s:FileStream = new FileStream();
        var f:File = File.applicationStorageDirectory.resolvePath('login.info');
        s.open(f, FileMode.READ);
        var lastLogon:Object = s.readObject();
        this.lastUsername = lastLogon.username;
        this.lastServer = lastLogon.server; 
        
        //this.lastPassword = lastLogon.password;
          
        s.close();
      } catch(e:*) {
        /* in case the file does not exist */
      }
    }
    
    private function savePreviousLoginDetails():void
    {
      try {
        var s:FileStream = new FileStream();
        var f:File = File.applicationStorageDirectory.resolvePath('login.info');
        s.open(f, FileMode.WRITE);
        var lastLogon:Object = new Object();
        lastLogon.username = this.lastUsername;
        lastLogon.server = this.lastServer;
        
        //lastLogon.password = this.lastPassword;
        
        s.writeObject(lastLogon);
        s.close();
      } catch(e:*) {
      }
    }
    
    private function checkInternetConnection():void
    {
      
      var req:URLRequest=new URLRequest("http://www.google.com");
      req.method="HEAD";
      if(!monitor)
        monitor=new URLMonitor(req);
      monitor.pollInterval=5000;
      monitor.addEventListener(StatusEvent.STATUS, onConnection);
      monitor.start();
    }
    
    private function onConnection(e:StatusEvent=null):void
    {
      if (e.code == "Service.available")
      {
        hasConnection=true;
        trace("connection ok")
      }
      else
      {
        hasConnection=false;
        trace("connection ko")
      }
    }
    
   
  }
  
}