/// <summary>Loads SLK configuration information from WSS and LearningStore, in a form that's
        /// suitable for copying to Configure.aspx form fields. </summary>
        ///
        /// <param name="spSiteGuid">The GUID of the SPSite to retrieve configuration information
        ///     from.</param>
        ///
        /// <returns>An AdministrationConfiguration.</returns>
        ///
        /// <remarks>
        /// This method is static so it can used outside the context of IIS.  Only SharePoint
        /// administrators can perform this function.
        /// </remarks>
        ///
        /// <exception cref="SafeToDisplayException">
        /// An error occurred that can be displayed to a browser user.
        /// </exception>
        ///
        public static AdministrationConfiguration LoadConfiguration(Guid spSiteGuid)
        {
            AdministrationConfiguration configuration = new AdministrationConfiguration(spSiteGuid);

            // only SharePoint administrators can perform this action
            CheckPermissions();

            // set <mapping> to the mapping between <spSiteGuid> and the LearningStore connection
            // information for that SPSite
            SlkSPSiteMapping mapping = SlkSPSiteMapping.GetMapping(spSiteGuid);

            // set "out" parameters based on <mappingExists> and <mapping>
            if (mapping != null)
            {
                // the mapping exists -- set "out" parameters based on <mapping>
                configuration.DatabaseServer       = mapping.DatabaseServer;
                configuration.DatabaseName         = mapping.DatabaseName;
                configuration.InstructorPermission = mapping.InstructorPermission;
                configuration.LearnerPermission    = mapping.LearnerPermission;

                // The below given condition will be true only during the migration of SLK from
                // 'SLK without Observer role' to 'SLK with Observer role' implementation
                if (mapping.ObserverPermission == null)
                {
                    mapping.ObserverPermission = LoadCulture(spSiteGuid).Resources.DefaultSlkObserverPermissionName;
                }
                configuration.ObserverPermission = mapping.ObserverPermission;
            }
            else
            {
                SlkCulture        siteCulture    = LoadCulture(spSiteGuid);
                AppResourcesLocal adminResources = SlkCulture.GetResources();

                configuration.IsNewConfiguration = true;
                mapping = SlkSPSiteMapping.CreateMapping(spSiteGuid);
                // the mapping doesn't exist -- set "out" parameters to default values
                SPWebService adminWebService = SlkAdministration.GetAdminWebService();
                configuration.DatabaseServer       = adminWebService.DefaultDatabaseInstance.Server.Address;
                configuration.DatabaseName         = adminResources.DefaultSlkDatabaseName;
                mapping.DatabaseServer             = configuration.DatabaseServer;
                mapping.DatabaseName               = configuration.DatabaseName;
                configuration.InstructorPermission = siteCulture.Resources.DefaultSlkInstructorPermissionName;
                configuration.LearnerPermission    = siteCulture.Resources.DefaultSlkLearnerPermissionName;
                configuration.ObserverPermission   = siteCulture.Resources.DefaultSlkObserverPermissionName;
            }

            // set "out" parameters that need to be computed
            bool createDatabaseResult = false;

            SlkUtilities.ImpersonateAppPool(delegate()
            {
                createDatabaseResult = !DatabaseExists(mapping.DatabaseServerConnectionString, mapping.DatabaseName);
            });
            configuration.CreateDatabase = createDatabaseResult;

            return(configuration);
        }
        int GetSiteConfiguration(Guid guid, out string output)
        {
            AdministrationConfiguration configuration = SlkAdministration.LoadConfiguration(guid);

            if (configuration.IsNewConfiguration)
            {
                output = FormatString(culture.Resources.StsInvalidGuid, guid);
                return((int)ErrorCodes.GeneralError);
            }
            else
            {
                output = FormatString(culture.Resources.StsGetSiteConfiguration,
                                      configuration.DatabaseServer,
                                      configuration.DatabaseName,
                                      configuration.InstructorPermission,
                                      configuration.LearnerPermission);
                return(0);
            }
        }
        int Configure(out string output)
        {
            // parse parameters
            bool   forApplication       = BooleanValue("application");
            string url                  = Value("url");
            string databaseServer       = Value("databaseServer");
            string databaseName         = Value("databaseName");
            bool   createDatabase       = BooleanValue("createDatabase");
            string instructorPermission = Value("instructorPermission");
            string learnerPermission    = Value("learnerPermission");
            string observerPermission   = Value("observerPermission");
            bool   createPermissions    = BooleanValue("createPermissions");
            string settingsFileName     = Value("settingsFileName");

            if (string.IsNullOrEmpty(settingsFileName))
            {
                settingsFileName = Value("uploadSlkSettings");
            }

            bool defaultSlkSettings = BooleanValue("defaultSlkSettings");

            if (string.IsNullOrEmpty(url))
            {
                output = FormatString(culture.Resources.StsMissingParameter, "url");
                return((int)ErrorCodes.SyntaxError);
            }

            //   -- can't specify both -uploadslksettings and -defaultslksettings
            if (settingsFileName != null && defaultSlkSettings)
            {
                output = FormatString(culture.Resources.StsSettingsError, "settingsFileName", "defaultSlkSettings");
                return((int)ErrorCodes.SyntaxError);
            }

            Guid   id;
            string userName;

            // perform the operation
            if (forApplication)
            {
                SPWebApplication application = SPWebApplication.Lookup(new Uri(url));
                id       = application.Id;
                userName = application.ApplicationPool.Username;
            }
            else
            {
                using (SPSite site = new SPSite(url))
                {
                    id       = site.ID;
                    url      = site.Url;
                    userName = site.WebApplication.ApplicationPool.Username;
                }
            }

            AdministrationConfiguration configuration = SlkAdministration.LoadConfiguration(id);

            databaseServer       = ValueIfMissing(databaseServer, configuration.DatabaseServer);
            databaseName         = ValueIfMissing(databaseName, configuration.DatabaseName);
            instructorPermission = ValueIfMissing(instructorPermission, configuration.InstructorPermission);
            learnerPermission    = ValueIfMissing(learnerPermission, configuration.LearnerPermission);
            observerPermission   = ValueIfMissing(observerPermission, configuration.ObserverPermission);

            // load SlkSchema.sql if the parameters specify creating the database;
            // SlkSchema.sql is in the same directory as this .exe file
            string schemaFileContents = null;

            if (createDatabase)
            {
                schemaFileContents = culture.Resources.SlkSchemaSql;
            }

            // load the default SLK Settings file into <defaultSettingsFileContents>
            string defaultSettingsFileContents = culture.Resources.SlkSettingsFile;

            // load the SLK Settings file to upload into <settingsFileContents> if specified by the parameters.
            string settingsFileContents = null;

            if (settingsFileName != null)
            {
                settingsFileContents = System.IO.File.ReadAllText(settingsFileName);
            }
            else if (defaultSlkSettings)
            {
                settingsFileContents = defaultSettingsFileContents;
            }

            // Save the configuration
            SlkAdministration.SaveConfiguration(id, databaseServer, databaseName,
                                                schemaFileContents, instructorPermission, learnerPermission, observerPermission, createPermissions,
                                                settingsFileContents, defaultSettingsFileContents, userName);

            if (forApplication)
            {
                output = FormatString(culture.Resources.StsConfiguringSlkForApplication, url, id);
            }
            else
            {
                output = FormatString(culture.Resources.StsConfiguringSlkForSite, url, id);
            }

            return(0);
        }