public ManageService()
 {
     PVServiceManager = new MackayFisher.Utilities.ServiceManager(PVServiceName);
     PVPublisherManager = new MackayFisher.Utilities.ServiceManager(PVPublisherServiceName);
 }
        public bool SetupEnvironment(out String log)
        {
            bool retVal = true;
            string stage = "Start";
            String result = "";

            PVBCService = new ServiceManager("PVService");
            PublisherService = new ServiceManager("PVPublisherService");

            PVBCService.ServiceAccountName = Settings.ServiceAccountName.Trim();

            Settings.ServiceDetailsChanged |= (!PVBCService.ServiceAccountInSync);

            try
            {
                String defaultDirectoryName = Settings.DefaultDirectory;
                DirectoryInfo defaultDirectoryInfo;

                stage = "Locate or Create Default Directory";
                try
                {
                    result = LocateOrCreateDirectory(defaultDirectoryName, out defaultDirectoryInfo);
                }
                catch (SecurityException e)
                {
                    log = "Security Exception locating or creating directory: " + defaultDirectoryName + " - message: " + e.Message;
                    return false;
                }
                catch (Exception e)
                {
                    log = "Exception locating or creating directory: " + defaultDirectoryName + " - message: " + e.Message;
                    return false;
                }

                stage = "Locate or Create Archive Directory";
                String archiveName = Path.Combine(defaultDirectoryName, "Archive");
                try
                {
                    DirectoryInfo archiveDirectoryInfo;
                    result += (NewLine + LocateOrCreateDirectory(archiveName, out archiveDirectoryInfo));

                }
                catch (SecurityException e)
                {
                    log = "Security Exception locating or creating directory: " + archiveName + " - message: " + e.Message;
                    return false;
                }
                catch (Exception e)
                {
                    log = "Exception locating or creating directory: " + archiveName + " - message: " + e.Message;
                    return false;
                }

                stage = "Set Access to Default Directory";
                String accessResult = SetDirectoryAccess(defaultDirectoryName);

                if (accessResult == "")
                    result += NewLine + "Assigned full control to " + PVBCService.ServiceAccountName + " on: " + defaultDirectoryName;
                else
                {
                    result += NewLine + accessResult;
                    retVal = false;
                }

                stage = "Set Access to Archive Directory";
                accessResult = SetDirectoryAccess(archiveName);

                if (accessResult == "")
                    result += NewLine + "Assigned full control to " + PVBCService.ServiceAccountName + " on: " + archiveName;
                else
                {
                    retVal = false;
                    result += NewLine + accessResult;
                }

                /*
                stage = "Locate Empty Database Directory";
                String patternDirName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Empty Databases");
                DirectoryInfo patternDir;
                try
                {
                    patternDir = new DirectoryInfo(patternDirName);
                    if (!patternDir.Exists)
                    {
                        log = result + NewLine + "Cannot locate directory '" + patternDirName + "'";
                        return false;
                    }

                }
                catch (SecurityException e)
                {
                    log = result + NewLine + "Security Exception locating directory: " + patternDirName + " - message: " + e.Message;
                    return false;
                }
                catch (Exception e)
                {
                    log = result + NewLine + "Exception locating directory: " + patternDirName + " - message: " + e.Message;
                    return false;
                }
                */

                // No action on non-standard settings - only create empty database for Jet or SQLite installs where DB does not exist
                if (Settings.StandardDBType != "Custom")
                    if (Settings.DatabaseType == "Jet" || Settings.DatabaseType == "SQLite")
                    {
                        /*
                        String destName = Path.Combine(defaultDirectoryName, Settings.Database);

                        stage = "Create Empty Database";
                        String srcName = Path.Combine(patternDirName, Settings.Database);

                        try
                        {
                            File.Copy(srcName, destName, false);
                            result += NewLine + "Created empty database: " + destName;
                        }
                        catch (IOException) // file already exists
                        {
                            result += NewLine + "Database not changed - already exists: " + destName;
                        }

                        stage = "Set Access to Database";
                        accessResult = SetFileAccess(destName);

                        if (accessResult == "")
                            result += NewLine + "Assigned full control to " + PVBCService.ServiceAccountName + " on: " + destName;
                        else
                        {
                            log = result + NewLine + accessResult;
                            return false;
                        }

                        if (Settings.StandardDBType == "Jet (2003)")
                            result += NewLine + "Ensure PV Bean Counter 32bit and Microsoft Access 2003 are installed";
                        else if (Settings.StandardDBType == "Jet (2007)")
                            result += NewLine + "Ensure Microsoft Access 2007 or later is installed";
                        */
                    }
                    else
                        result += NewLine + "Your selected database type requires manual configuration: " + Settings.StandardDBType;
                else
                    result += NewLine + "You have a 'Custom' database configuration - Manual setup required";

                stage = "Set Access to settings.xml";
                String settingsName = Path.Combine(defaultDirectoryName, "settings.xml");
                if (File.Exists(settingsName))
                {
                    accessResult = SetFileAccess(settingsName);
                    if (accessResult == "")
                        result += NewLine + "Assigned full control to " + PVBCService.ServiceAccountName + " on: " + settingsName;
                    else
                    {
                        result += NewLine + "Cannot set permissions on: " + settingsName;
                        retVal = false;
                    }
                }

                stage = "Check Meter Warnings";
                /*
                foreach (MeterManagerSettings meter in Settings.MeterManagerList)
                {
                    if (meter.Enabled && meter.ManagerTypeInternal == MeterManagerSettings.MeterManagerType.CurrentCost)
                    {
                        if (((CCMeterManagerSettings)meter).PortName == "")
                        {
                            result += NewLine + "You cannot monitor Current Cost Meters without selecting a Meter Port";

                            retVal = false;
                        }
                        else if (!SerialPortSettings.SerialPortsList.Contains(((CCMeterManagerSettings)meter).PortName))
                        {
                            result += NewLine + "Meter Port not found - Connect meter hardware";
                            retVal = false;
                        }
                    }
                    else if (meter.Enabled && meter.ManagerTypeInternal == MeterManagerSettings.MeterManagerType.Owl)
                    {
                        string dbName = ((OwlMeterManagerSettings)meter).OwlDatabase;
                        if (dbName == "")
                        {
                            result += NewLine + "You cannot monitor Owl Meters without locating the Owl database";

                            retVal = false;
                        }
                        else if (File.Exists(dbName))
                        {
                            accessResult = SetFileAccess(dbName);
                            if (accessResult == "")
                                result += NewLine + "Assigned full control to " + PVBCService.ServiceAccountName + " on: " + dbName;
                            else
                            {
                                result += NewLine + "Cannot set permissions on: " + dbName;
                                retVal = false;
                            }
                        }
                        else
                        {
                            result += NewLine + "Specified Owl database does not exist - check file location";

                            retVal = false;
                        }
                    }
                }
                */

                stage = "Check Inverter Warnings";

                bool useSunnyExplorer = false;
                DeviceManagerSettings deviceManagerSettings = null;

                foreach (DeviceManagerSettings dmSettings in Settings.DeviceManagerList)
                {
                    if (dmSettings.ManagerType == DeviceManagerType.SMA_SunnyExplorer
                        && dmSettings.Enabled)
                    {
                        deviceManagerSettings = dmSettings;
                        useSunnyExplorer = true;
                    }
                }

                if (useSunnyExplorer)
                {
                    if (CheckSunnyExplorer(deviceManagerSettings, out accessResult))
                    {
                        if (accessResult != "")
                            result += NewLine + accessResult;
                    }
                    else
                    {
                        retVal = false;
                        result += NewLine + accessResult;
                    }

                    retVal &= CheckSunnyExplorerConfig(out accessResult);
                    result += NewLine + accessResult;

                    String plantFileName = deviceManagerSettings.SunnyExplorerPlantName + "-20110131.csv";
                    try
                    {
                        String fileName = Path.Combine(defaultDirectoryName, plantFileName);
                    }
                    catch (ArgumentException)
                    {
                        retVal = false;
                        result += NewLine + "Cannot form a legal filename based on the supplied Sunny Explorer Plant Name: '" + plantFileName + "'";
                    }
                }

                stage = "Check pvoutput Warnings";
                if (Settings.EnablePVOutput)
                {
                    bool siteIdMissing = false;
                    bool apiKeyMissing = false;

                    foreach (PvOutputSiteSettings setting in Settings.PvOutputSystemList)
                    {
                        if (setting.Enable)
                        {
                            siteIdMissing |= (setting.SystemId == "-1");
                            apiKeyMissing |= (setting.APIKey == "");
                        }
                    }

                    if (siteIdMissing)
                    {
                        retVal = false;
                        result += NewLine + "pvoutput.org System ID is required for pvoutput upload";
                    }

                    if (apiKeyMissing)
                    {
                        retVal = false;
                        result += NewLine + "pvoutput.org API Key is required for pvoutput upload";
                    }

                    result += NewLine + "Check that 'Status Interval' on the 'pvoutput.org Settings' tab matches 'Status Interval' at pvoutput.org";
                }

                stage = "Test Database";
                TestDatabase testDatabase = new TestDatabase(Settings, SystemServices);
                String dbStage = "";
                Exception dbException = null;
                String dbTestResult = testDatabase.RunDatabaseTest(ref dbStage, ref dbException);
                if (dbTestResult == "Success")
                    result += NewLine + "Database read test OK";
                else
                {
                    retVal = false;
                    result += NewLine + dbTestResult;
                }

                bool res;
                if (Settings.ServiceDetailsChanged)
                {
                    stage = "Setup Service";

                    if (!Settings.ServiceAccountRequiresPassword || Settings.ServiceAccountPassword.Trim() != "")
                    {
                        if (PVBCService.ServiceAccountType == ServiceAccount.User)
                        {
                            bool retry = false;
                            try
                            {
                                LsaWrapper.LsaWrapperCaller.AddPrivileges(PVBCService.ServiceAccountSecurityName, "SeServiceLogonRight");
                            }
                            catch
                            {
                                retry = true;
                            }
                            if (retry)
                                LsaWrapper.LsaWrapperCaller.AddPrivileges(PVBCService.ServiceAccountSecurityName, "SeServiceLogonRight");
                        }

                        res = PVBCService.SyncServiceCredentials( Settings.ServiceAccountPassword.Trim());
                        if (!res)
                        {
                            result += NewLine + "Cannot set PVService credentials - check that the user name and password are correct";
                            retVal = false;
                        }
                        else
                        {
                            result += NewLine + "PVService credentials set to " + PVBCService.ServiceAccountName;
                            //Settings.KnownServiceAccountName = Settings.ServiceAccountName;
                            Settings.ServiceDetailsChanged = false;
                        }
                    }
                    else
                    {
                        result += NewLine + "Cannot set PVService credentials - password not provided";
                        retVal = false;
                    }
                }

                res = PVBCService.SyncServiceStartup(Settings.AutoStartPVBCService);
                if (!res)
                {
                    result += NewLine + "Cannot set PVService startup type";
                    retVal = false;
                }

                res = PublisherService.SyncServiceStartup(Settings.AutoStartPVBCService);
                if (!res)
                {
                    result += NewLine + "Cannot set PVPublisherService startup type";
                    retVal = false;
                }

                if (retVal)
                    result += NewLine + NewLine + "Configuration Passed Checks";
                else
                    result += NewLine + NewLine + "Configuration Failed Checks - Review messages above";

                stage = "Output Log Result";

                log = result;
            }
            catch (Exception e)
            {
                log = "Unexpected Exception: " + e.Message + " - Stage: " + stage + " - Log: " + result;
                retVal = false;
            }
            return retVal;
        }