/// <summary>
        /// Subscribes to the event handler
        /// Removes from the list
        /// </summary>
        /// <param object="sender"></param>
        /// <param MessageEventArgs="args"></param>
        public void Subscribe(object sender, MessageEventArgs args)
        {
            string msg = args.message.Substring(1);

            if (args.receiver == "Settings")
            {
                ListPaths.Remove(msg);
            }
        }
        /// <summary>
        /// Desactivate an active profile. If cannot complete the operation, does nothing and return an error code.
        /// </summary>
        /// <returns></returns>
        public int desactivateActiveProfile(string profileName, out string outMsg)
        {
            log.Debug("## manager.desactivateActiveProfile() ##########################################");
            log.Debug("# desactivateActiveProfile() profileName:" + profileName);
            int    ret            = Errors.SUCCESS;
            string id             = "";
            string name           = "";
            string color          = "";
            string errMsg         = "";
            bool   retVal         = false;
            bool   opWasCancelled = false;

            // check state
            this.updateManagerState();
            if ((this.applicationState != SPMState.ACTIVE_AND_DESACTIVATED_PROFILES) &&
                (this.applicationState != SPMState.ACTIVE_ONLY))
            {
                outMsg = "Invalid state for desactivateActiveProfile operation! State:" + this.applicationState;
                log.Error(" ** " + outMsg);
                log.Error(" ** Errors.ERR_INVALID_STATE_FOR_REQUESTED_OPERATION_2");
                return(Errors.ERR_INVALID_STATE_FOR_REQUESTED_OPERATION_2);
            }

            // check if integrity file information matches
            profileName.Trim();
            if (!this.integrityFile.activeIntegrityFileExists())
            {
                outMsg = "INTEGRITY FILE FOR PROFILE " + profileName + " DOES NOT EXIST. CANNOT COMPLETE ACTION.";
                log.Error(" ** " + outMsg);
                log.Error(" **  Errors.ERR_FILE_NOT_EXIST");
                return(Errors.ERR_FILE_NOT_EXIST);
            }
            List <string> intItem = this.integrityFile.activeIntegrityFileItems();

            if (intItem.Count < Consts.INTEGRITY_FILE_ITEMS)
            {
                outMsg = "INTEGRITY FILE FOR PROFILE " + profileName + " IS NOT ON THE RIGHT FORMAT.";
                log.Error(" ** " + outMsg);
                log.Error(" ** Errors.ERR_ACTIVE_PROFILE_CORRUPTED_1");
                return(Errors.ERR_ACTIVE_PROFILE_CORRUPTED_1);
            }
            if (intItem[0].Trim() != profileName)
            {
                outMsg = "Active profile corrupted. Error parsing integrity file.";
                log.Warn(" ** " + outMsg);
                retVal = this.integrityFile.deleteActiveIntegrityFile(out errMsg);
                if (!retVal)
                {
                    log.Error(" ** ERROR @ this.integrityFile.deleteActiveIntegrityFile(). Could not delete integrity file. Message: " + errMsg);
                }
                this.updateManagerState();
                log.Error(" ** Errors.ERR_ACTIVE_PROFILE_CORRUPTED_2");
                return(Errors.ERR_ACTIVE_PROFILE_CORRUPTED_2);
            }
            log.Debug(" -- integrity file OK! " + id + ", " + name + ", " + color);

            // create backup dir if does not exit
            ret = this.createBackupProfilesFolder(profileName, out errMsg);
            if (ret != Errors.SUCCESS)
            {
                outMsg = "Could not create backup profile Folder: " + errMsg;
                log.Error(" ** " + outMsg);
                return(ret);
            }
            log.Debug(" -- createBackupProfilesFolder OK!");
            // check instalation before moving
            string errPath  = "";
            string errLabel = "";

            ret = this.paths.checkInstallationPaths(out errPath, out errLabel);
            if (ret != Errors.SUCCESS)
            {
                outMsg = "Installation Path " + errLabel + ": <" + errPath + ">";
                return(ret);
            }
            ListPaths listPathsDst = this.paths.getAllPaths_BkpProf(profileName);
            ListPaths listPathsSrc = this.paths.getAllPaths_AppGame();
            // check consinstency
            string errLabel1 = "";
            string errLabel2 = "";

            if (!listPathsSrc.checkLabels(listPathsDst, out errLabel1, out errLabel2))
            {
                outMsg = "sourceType: " + errLabel1 + ", destination:" + errLabel2;
                log.Error(" ** Source and destination folder are mislabeled!!");
                log.Error(" ** errLabel1:" + errLabel1);
                log.Error(" ** errLabel2:" + errLabel2);
                log.Error(" ** outErrMsg:" + outMsg);
                log.Error(" ** Source Paths:" + CSharp.listToCsv(listPathsSrc.listPaths));
                log.Error(" ** Destination Paths:" + CSharp.listToCsv(listPathsDst.listPaths));
                log.Error(" ** Errors.ERR_SOURCE_DESTINATION_DONT_MATCH_DESACTIVATEACTIVE");
                return(Errors.ERR_SOURCE_DESTINATION_DONT_MATCH_DESACTIVATEACTIVE);
            }
            string[] destinationDirs = listPathsDst.vecPaths;
            string[] sourceDirs      = listPathsSrc.vecPaths;
            string   errSrcDir       = "";
            string   errDstDir       = "";
            bool     sucess          = CSharp.stackMv(sourceDirs, destinationDirs, true, LogMethod.LOGGER,
                                                      out errMsg, out errSrcDir, out errDstDir, out opWasCancelled);

            if (!sucess)
            {
                if (opWasCancelled)
                {
                    outMsg = "Operation cancelled by the User";
                    log.Warn(" ** outMsg: " + outMsg);
                    log.Warn(" ** errMsg: " + errMsg);
                    log.Warn(" ** errSrcDir:" + errSrcDir);
                    log.Warn(" ** errDstDir: " + errDstDir);
                    log.Warn(" ** Errors.INFO_OPERATION_CANCELLED_BY_USER");
                    return(Errors.INFO_OPERATION_CANCELLED_BY_USER);
                }
                outMsg = errMsg + " errSrcDir:<" + errSrcDir + ">" + ", errDstDir:<" + errDstDir + ">";
                log.Error(" ** outMsg: " + outMsg);
                log.Error(" ** errMsg: " + errMsg);
                log.Error(" ** errSrcDir:" + errSrcDir);
                log.Error(" ** errDstDir: " + errDstDir);
                log.Error(" ** Errors.ERR_MOVING_DIRECTORIES_2");
                return(Errors.ERR_MOVING_DIRECTORIES_2);
            }
            this.reloadState();
            outMsg = "";
            return(Errors.SUCCESS);
        }
        /// <summary>
        /// If there is no profile installed, set a desactivated profile as active. Otherwise does nothing
        /// and returns an error code.
        /// </summary>
        /// <param name="profileName">Alpanumeric string</param>
        /// <returns></returns>
        public int activateDesactivatedProfile(string profileName, out string outErrMsg)
        {
            bool opWasCancelled = false;

            log.Debug("## manager.activateDesactivatedProfile() #######################################");
            log.Debug("# activateDesactivatedProfile() profileName:" + profileName);
            log.Debug("STEP 1: Check Settings...");
            this.updateManagerState();
            if (this.applicationState != SPMState.DESACTIVATED_ONLY)
            {
                outErrMsg = "Invalid state for requested operation. This operation may only be completed if the aplication state is SPMState.DESACTIVATED_ONLY.";
                log.Warn(" -- " + outErrMsg);
                log.Error(" ** Errors.ERR_INVALID_STATE_FOR_REQUESTED_OPERATION_5");
                return(Errors.ERR_INVALID_STATE_FOR_REQUESTED_OPERATION_5);
            }
            profileName = profileName.Trim();
            if (profileName == null || profileName.Equals(""))
            {
                outErrMsg = "profile name is empty";
                log.Warn(" -- " + outErrMsg);
                log.Warn(" -- Errors.ERR_INVALID_PROFILE_NAME_1");
                return(Errors.ERR_INVALID_PROFILE_NAME_1);
            }

            log.Debug("STEP 2: search profile to activate...");
            SPProfile profToActivate = null;

            foreach (var item in this.listDesactivated)
            {
                if (item.name.Trim() == profileName.Trim())
                {
                    profToActivate = item;
                    break;
                }
            }
            if (profToActivate == null)
            {
                outErrMsg = "Specified profile could not be found, ERR_INVALID_PROFILE_NAME";
                log.Warn(" -- " + outErrMsg);
                log.Error(" ** Errors.ERR_INVALID_PROFILE_NAME_2");
                return(Errors.ERR_INVALID_PROFILE_NAME_2);
            }

            log.Debug("STEP 3: moving folders from backup to root dir...");
            // check backup before moving
            string errPathOut = "";
            string errLabel   = "";
            int    ret        = this.paths.checkBackupInstallationPaths(profileName, out errPathOut, out errLabel);

            if (ret != Errors.SUCCESS)
            {
                outErrMsg = "Backup Path (" + profileName + ") " + errLabel + ": <" + errPathOut + ">";
                return(ret);
            }
            // load all paths
            ListPaths listPathsDst = this.paths.getAllPaths_App();
            ListPaths listPathsSrc = this.paths.getAllPaths_BkpProfGame(profileName);
            string    errLabel1    = "";
            string    errLabel2    = "";

            if (!listPathsSrc.checkLabels(listPathsDst, out errLabel1, out errLabel2))
            {
                outErrMsg = "sourceType: " + errLabel1 + ", destination:" + errLabel2;
                log.Error(" ** Source and destination folder are mislabeled!!");
                log.Error(" ** errLabel1:" + errLabel1);
                log.Error(" ** errLabel2:" + errLabel2);
                log.Error(" ** outErrMsg:" + outErrMsg);
                log.Error(" ** Source Paths:" + CSharp.listToCsv(listPathsSrc.listPaths));
                log.Error(" ** Destination Paths:" + CSharp.listToCsv(listPathsDst.listPaths));
                log.Error(" ** Errors.ERR_SOURCE_DESTINATION_DONT_MATCH_ACTIVATEDESACTIVATED");
                return(Errors.ERR_SOURCE_DESTINATION_DONT_MATCH_ACTIVATEDESACTIVATED);
            }
            string[] destinationDirs = listPathsDst.vecPaths;
            string[] sourceDirs      = listPathsSrc.vecPaths;
            string   errMsg          = "";
            string   errSrcDir       = "";
            string   errDstDir       = "";
            string   errPath         = "";
            bool     sucess          = CSharp.stackMv(sourceDirs, destinationDirs, true, LogMethod.LOGGER,
                                                      out errMsg, out errSrcDir, out errDstDir, out opWasCancelled);

            if (!sucess)
            {
                if (opWasCancelled)
                {
                    outErrMsg = "Operation cancelled by the User";
                    log.Warn(" ** outMsg: " + outErrMsg);
                    log.Warn(" ** errMsg: " + errMsg);
                    log.Warn(" ** errSrcDir:" + errSrcDir);
                    log.Warn(" ** errDstDir: " + errDstDir);
                    log.Warn(" ** Errors.ERR_MOVING_DIRECTORIES_2");
                    return(Errors.INFO_OPERATION_CANCELLED_BY_USER);
                }
                outErrMsg = "Error moving directories: SrcDir<" + errSrcDir + ">, DstDir<" + errDstDir + ">. Error Message:" + errMsg;
                log.Error(" ** " + outErrMsg);
                log.Error(" ** errMsg: " + errMsg);
                log.Error(" ** errSrcDir:" + errSrcDir);
                log.Error(" ** errDstDir: " + errDstDir);
                log.Error(" ** Errors.ERR_MOVING_DIRECTORIES_1");
                return(Errors.ERR_MOVING_DIRECTORIES_1);
            }

            log.Debug("STEP 4: create integrity file...");
            errMsg  = "";
            errPath = "";
            if (!this.integrityFile.updateActiveIntegrityFile(profToActivate, out errMsg, out errPath))
            {
                outErrMsg = "Could not create intregrity file. Message:" + errMsg + ". Error Path:" + errPath;
                log.Error(" ** outErrMsg:" + outErrMsg);
                log.Error(" ** ERROR errMsg:" + errMsg + ", errPath:" + errPath);
                log.Error(" ** Errors.ERR_CANNOT_CREATE_INTEGRITY_FILE_2");
                return(Errors.ERR_CANNOT_CREATE_INTEGRITY_FILE_2);
            }

            log.Debug("STEP 5: update manager state...");
            profToActivate.isReady = true;
            this.reloadState();

            outErrMsg = "";
            return(Errors.SUCCESS);
        }