/// <summary>
        /// Constructor
        /// </summary>
        /// <param name="isUiSupported">Does this authentication manager support a UI?</param>
        /// <param name="applicationToken">An application token to be used as the file name to store data as (no extension needed). Each
        /// consuming application should use a unique name in order to ensure that the user credentials are not
        /// overwritten by other applications. An exception will be thrown elsewhere if this is not a valid file name.</param>
        /// <param name="encryptionKey">The encryption key, or salt, to be used for any encryption routines. This salt
        /// should be different for each user, and not the same for everyone consuming the same application. Only used
        /// for UI support.</param>
        /// <param name="encryptionRoutines">The encryption routines to use for encryption/decryption of data. Only used for UI support.</param>
        /// <param name="webServiceVersion">The version of the WSAPI API to use.</param>
        protected ApiAuthManager(bool isUiSupported, string applicationToken, string encryptionKey,
                                 IEncryptionRoutines encryptionRoutines, string webServiceVersion = RallyRestApi.DEFAULT_WSAPI_VERSION)
        {
            if (isUiSupported)
            {
                if (String.IsNullOrWhiteSpace(applicationToken))
                {
                    throw new ArgumentNullException("applicationToken",
                                                    "You must provide an application token.");
                }

                if (encryptionKey == null)
                {
                    throw new ArgumentNullException("encryptionKey",
                                                    "You must provide an encryption key that will be used to keep user data safe.");
                }

                if (encryptionRoutines == null)
                {
                    throw new ArgumentNullException("encryptionRoutines",
                                                    "You must provide encryption routines that will be used to keep user data safe.");
                }

                ApplicationToken   = applicationToken;
                EncryptionKey      = encryptionKey;
                EncryptionRoutines = encryptionRoutines;

                LoginDetails = new LoginDetails(this);
                LoginDetails.LoadFromDisk();
            }

            IsUiSupported = isUiSupported;
            Api           = new RallyRestApi(this, webServiceVersion: webServiceVersion);
        }
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="applicationToken">An application token to be used as the file name to store data as. Each 
		/// consuming application should use a unique name in order to ensure that the user credentials are not 
		/// overwritten by other applications.</param>
		/// <param name="encryptionKey">The encryption key, or salt, to be used for any encryption routines. This salt 
		/// should be different for each user, and not the same for everyone consuming the same application. Only used 
		/// for UI support.</param>
		/// <param name="encryptionRoutines">The encryption routines to use for encryption/decryption of data. Only used for UI support.</param>
		/// <param name="webServiceVersion">The version of the WSAPI API to use.</param>
		/// <example>
		/// <code language="C#">
		/// // You must define your own private application token. This ensures that your login details are not overwritten by someone else.
		/// string applicationToken = "RallyRestAPISample";
		/// // You must set a user specific salt for encryption.
		/// string encryptionKey = "UserSpecificSaltForEncryption";
		/// // You must define your own encryption routines.
		/// IEncryptionRoutines encryptionUtilities = new EncryptionUtilities();
		/// 
		/// // Instantiate authorization manager
		/// wpfAuthMgr = new RestApiAuthMgrWpf(applicationToken, encryptionKey, encryptionUtilities);
		/// </code>
		/// </example>
		public RestApiAuthMgrWpf(string applicationToken, string encryptionKey,
			IEncryptionRoutines encryptionRoutines, string webServiceVersion = RallyRestApi.DEFAULT_WSAPI_VERSION)
			: base(true, applicationToken, encryptionKey, encryptionRoutines, webServiceVersion)
		{
			// NOTE: The example for this constructor is also used for the RallyRestApi
			// constructor. Make sure you update both if you change it.
		}
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="applicationToken">An application token to be used as the file name to store data as. Each
 /// consuming application should use a unique name in order to ensure that the user credentials are not
 /// overwritten by other applications.</param>
 /// <param name="encryptionKey">The encryption key, or salt, to be used for any encryption routines. This salt
 /// should be different for each user, and not the same for everyone consuming the same application. Only used
 /// for UI support.</param>
 /// <param name="encryptionRoutines">The encryption routines to use for encryption/decryption of data. Only used for UI support.</param>
 /// <param name="webServiceVersion">The version of the WSAPI API to use.</param>
 /// <example>
 /// <code language="C#">
 /// // You must define your own private application token. This ensures that your login details are not overwritten by someone else.
 /// string applicationToken = "RallyRestAPISample";
 /// // You must set a user specific salt for encryption.
 /// string encryptionKey = "UserSpecificSaltForEncryption";
 /// // You must define your own encryption routines.
 /// IEncryptionRoutines encryptionUtilities = new EncryptionUtilities();
 ///
 /// // Instantiate authorization manager
 /// wpfAuthMgr = new RestApiAuthMgrWpf(applicationToken, encryptionKey, encryptionUtilities);
 /// </code>
 /// </example>
 public RestApiAuthMgrWpf(string applicationToken, string encryptionKey,
                          IEncryptionRoutines encryptionRoutines, string webServiceVersion = RallyRestApi.DEFAULT_WSAPI_VERSION)
     : base(true, applicationToken, encryptionKey, encryptionRoutines, webServiceVersion)
 {
     // NOTE: The example for this constructor is also used for the RallyRestApi
     // constructor. Make sure you update both if you change it.
 }
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="applicationToken">An application token to be used as the file name to store data as. Each 
		/// consuming application should use a unique name in order to ensure that the user credentials are not 
		/// overwritten by other applications.</param>
		/// <param name="encryptionKey">The encryption key, or salt, to be used for any encryption routines. This salt 
		/// should be different for each user, and not the same for everyone consuming the same application. Only used 
		/// for UI support.</param>
		/// <param name="encryptionRoutines">The encryption routines to use for encryption/decryption of data. Only used for UI support.</param>
		/// <param name="webServiceVersion">The version of the WSAPI API to use.</param>
		/// <param name="traceInfo">Controls diagnostic trace information being logged</param>
		public RestApiAuthMgrWinforms(string applicationToken, string encryptionKey,
			IEncryptionRoutines encryptionRoutines, string webServiceVersion = RallyRestApi.DEFAULT_WSAPI_VERSION, TraceFieldEnum traceInfo = RallyRestApi.DEFAULT_TRACE_FIELDS)
			: base(true, applicationToken, encryptionKey, encryptionRoutines, webServiceVersion, traceInfo)
		{
		}
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="applicationToken">An application token to be used as the file name to store data as. Each 
		/// consuming application should use a unique name in order to ensure that the user credentials are not 
		/// overwritten by other applications.</param>
		/// <param name="encryptionKey">The encryption key, or salt, to be used for any encryption routines. This salt 
		/// should be different for each user, and not the same for everyone consuming the same application. Only used 
		/// for UI support.</param>
		/// <param name="encryptionRoutines">The encryption routines to use for encryption/decryption of data. Only used for UI support.</param>
		/// <param name="webServiceVersion">The version of the WSAPI API to use.</param>
		public RestApiAuthMgrWinforms(string applicationToken, string encryptionKey,
			IEncryptionRoutines encryptionRoutines, string webServiceVersion = RallyRestApi.DEFAULT_WSAPI_VERSION)
			: base(true, applicationToken, encryptionKey, encryptionRoutines, webServiceVersion)
		{
		}
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="isUiSupported">Does this authentication manager support a UI?</param>
		/// <param name="applicationToken">An application token to be used as the file name to store data as (no extension needed). Each 
		/// consuming application should use a unique name in order to ensure that the user credentials are not 
		/// overwritten by other applications. An exception will be thrown elsewhere if this is not a valid file name.</param>
		/// <param name="encryptionKey">The encryption key, or salt, to be used for any encryption routines. This salt 
		/// should be different for each user, and not the same for everyone consuming the same application. Only used 
		/// for UI support.</param>
		/// <param name="encryptionRoutines">The encryption routines to use for encryption/decryption of data. Only used for UI support.</param>
		/// <param name="webServiceVersion">The version of the WSAPI API to use.</param>
		protected ApiAuthManager(bool isUiSupported, string applicationToken, string encryptionKey,
			IEncryptionRoutines encryptionRoutines, string webServiceVersion = RallyRestApi.DEFAULT_WSAPI_VERSION)
		{
			if (isUiSupported)
			{
				if (String.IsNullOrWhiteSpace(applicationToken))
				{
					throw new ArgumentNullException("applicationToken",
						"You must provide an application token.");
				}

				if (encryptionKey == null)
				{
					throw new ArgumentNullException("encryptionKey",
						"You must provide an encryption key that will be used to keep user data safe.");
				}

				if (encryptionRoutines == null)
				{
					throw new ArgumentNullException("encryptionRoutines",
						"You must provide encryption routines that will be used to keep user data safe.");
				}

				ApplicationToken = applicationToken;
				EncryptionKey = encryptionKey;
				EncryptionRoutines = encryptionRoutines;

				LoginDetails = new LoginDetails(this);
				LoginDetails.LoadFromDisk();
			}

			IsUiSupported = isUiSupported;
			Api = new RallyRestApi(this, webServiceVersion: webServiceVersion);
		}
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="applicationToken">An application token to be used as the file name to store data as. Each
 /// consuming application should use a unique name in order to ensure that the user credentials are not
 /// overwritten by other applications.</param>
 /// <param name="encryptionKey">The encryption key, or salt, to be used for any encryption routines. This salt
 /// should be different for each user, and not the same for everyone consuming the same application. Only used
 /// for UI support.</param>
 /// <param name="encryptionRoutines">The encryption routines to use for encryption/decryption of data. Only used for UI support.</param>
 /// <param name="webServiceVersion">The version of the WSAPI API to use.</param>
 public RestApiAuthMgrWinforms(string applicationToken, string encryptionKey,
                               IEncryptionRoutines encryptionRoutines, string webServiceVersion = RallyRestApi.DEFAULT_WSAPI_VERSION)
     : base(true, applicationToken, encryptionKey, encryptionRoutines, webServiceVersion)
 {
 }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="applicationToken">An application token to be used as the file name to store data as. Each
 /// consuming application should use a unique name in order to ensure that the user credentials are not
 /// overwritten by other applications.</param>
 /// <param name="encryptionKey">The encryption key, or salt, to be used for any encryption routines. This salt
 /// should be different for each user, and not the same for everyone consuming the same application. Only used
 /// for UI support.</param>
 /// <param name="encryptionRoutines">The encryption routines to use for encryption/decryption of data. Only used for UI support.</param>
 /// <param name="webServiceVersion">The version of the WSAPI API to use.</param>
 /// <param name="traceInfo">Controls diagnostic trace information being logged</param>
 public RestApiAuthMgrWinforms(string applicationToken, string encryptionKey,
                               IEncryptionRoutines encryptionRoutines, string webServiceVersion = RallyRestApi.DEFAULT_WSAPI_VERSION, TraceFieldEnum traceInfo = RallyRestApi.DEFAULT_TRACE_FIELDS)
     : base(true, applicationToken, encryptionKey, encryptionRoutines, webServiceVersion, traceInfo)
 {
 }