/// <summary>
        /// Updates the application's configuration in HealthVault.
        /// </summary>
        /// 
        /// <param name="connection">
        /// The connection to use to make the update.
        /// </param>
        /// 
        /// <param name="applicationInfo">
        /// The <see cref="ApplicationInfo"/> to update.
        /// </param>
        /// 
        /// <remarks>
        /// This method makes a remote call to the HealthVault service.
        /// The calling application in the <paramref name="connection"/> must be the same as
        /// the application specified by this ApplicationInfo instance or its master application.
        /// Note, this update will replace all configuration elements for the application. It is 
        /// advised that <see cref="ApplicationProvisioning.Provisioner.GetApplication"/> is 
        /// called to retrieve the existing application configuration before changing values and 
        /// calling Update.
        /// </remarks>
        /// 
        /// <exception cref="ArgumentNullException">
        /// If <paramref name="connection"/> is <b>null</b>.
        /// </exception>
        /// 
        /// <exception cref="HealthServiceException">
        /// The HealthVault service returns an error.
        /// </exception>
        /// 
        public virtual void UpdateChildApplication(
            ApplicationConnection connection,
            ApplicationInfo applicationInfo)
        {
            Validator.ThrowIfArgumentNull(connection, "connection", "ProvisionerNullConnection");
            Validator.ThrowInvalidIf(applicationInfo.Id == Guid.Empty, "ProvisionerEmptyAppId");

            HealthServiceRequest request =
                new HealthServiceRequest(connection, "UpdateApplication", 2);

            request.Parameters = applicationInfo.GetRequestParameters(applicationInfo.Id);
            request.Execute();
        }
        /// <summary>
        /// Adds a HealthVault application instance for a "child" application of the calling
        /// application.
        /// </summary>
        /// 
        /// <param name="connection">
        /// The connection to use to add the application.
        /// </param>
        /// 
        /// <param name="applicationConfigurationInformation">
        /// Configuration information about the application being provisioned.
        /// </param>
        /// 
        /// <returns>
        /// The new application identifier for the new application provided by HealthVault.
        /// </returns>
        ///
        /// <exception cref="ArgumentNullException">
        /// If <paramref name="connection"/> or <paramref name="applicationConfigurationInformation"/>
        /// is <b>null</b>.
        /// </exception>
        /// 
        /// <exception cref="ArgumentException">
        /// If <see cref="ApplicationInfo.Name"/>, <see cref="ApplicationInfo.PublicKeys"/>,
        /// <see cref="ApplicationInfo.OfflineBaseAuthorizations"/>, <see cref="ApplicationInfo.Description"/>,
        /// <see cref="ApplicationInfo.AuthorizationReason"/>, or <see cref="ApplicationInfo.LargeLogo"/> 
        /// is not specified.
        /// </exception>
        /// 
        /// <exception cref="HealthServiceException">
        /// If there is an error when the HealthVault service is called.
        /// </exception>
        /// 
        public virtual Guid AddChildApplication(
            OfflineWebApplicationConnection connection,
            ApplicationInfo applicationConfigurationInformation)
        {
            Validator.ThrowIfArgumentNull(connection, "connection", "ProvisionerNullConnection");
            Validator.ThrowIfArgumentNull(
                applicationConfigurationInformation,
                "applicationConfigurationInformation",
                "ProvisionerNullApplicationInfo");

            Validator.ThrowIfStringNullOrEmpty(applicationConfigurationInformation.Name, "applicationConfigurationInformation");

            Validator.ThrowArgumentExceptionIf(
                applicationConfigurationInformation.PublicKeys.Count < 1,
                    "applicationConfigurationInformation",
                    "AddApplicationPublicKeysMandatory");

            Validator.ThrowArgumentExceptionIf(
                applicationConfigurationInformation.OfflineBaseAuthorizations.Count < 1,
                "applicationConfigurationInformation",
                "AddApplicationOfflineBaseAuthorizationsMandatory");

            Validator.ThrowIfStringNullOrEmpty(
                applicationConfigurationInformation.Description,
                "applicationConfigurationInformation.Description");

            Validator.ThrowIfStringNullOrEmpty(
                applicationConfigurationInformation.AuthorizationReason,
                "applicationConfigurationInformation.AuthorizationReason");

            Validator.ThrowIfArgumentNull(
                applicationConfigurationInformation.LargeLogo,
                "applicationConfigurationInformation.LargeLogo",
                "AddApplicationLargeLogoMandatory");

            HealthServiceRequest request =
                new HealthServiceRequest(connection, "AddApplication", 2);

            request.Parameters = applicationConfigurationInformation.GetRequestParameters(Guid.Empty);

            request.Execute();

            XPathExpression infoPath =
                SDKHelper.GetInfoXPathExpressionForMethod(
                    request.Response.InfoNavigator,
                    "AddApplication");

            XPathNavigator infoNav = request.Response.InfoNavigator.SelectSingleNode(infoPath);
            return new Guid(infoNav.SelectSingleNode("id").Value);
        }