/// <summary> /// This is called when the user is adding (or updating) a package source /// If this PROVIDER doesn't support user-defined package sources, remove this method. /// </summary> /// <param name="name"> /// The name of the package source. If this parameter is null or empty the PROVIDER should use the /// location as the name (if the PROVIDER actually stores names of package sources) /// </param> /// <param name="location"> /// The location (ie, directory, URL, etc) of the package source. If this is null or empty, the /// PROVIDER should use the name as the location (if valid) /// </param> /// <param name="trusted"> /// A boolean indicating that the user trusts this package source. Packages returned from this source /// should be marked as 'trusted' /// </param> /// <param name="request"> /// An object passed in from the CORE that contains functions that can be used to interact with the /// CORE and HOST /// </param> public void AddPackageSource(string name, string location, bool trusted, ChocolateyRequest request) { // Nice-to-have put a debug message in that tells what's going on. request.Debug("Calling '{0}::AddPackageSource' '{1}','{2}','{3}'", PackageProviderName, name, location, trusted); // if they didn't pass in a name, use the location as a name. (if you support that kind of thing) name = string.IsNullOrEmpty(name) ? location : name; // let's make sure that they've given us everything we need. if (string.IsNullOrEmpty(name)) { request.Error(ErrorCategory.InvalidArgument, Constants.Parameters.Name, Constants.Messages.MissingRequiredParameter, Constants.Parameters.Name); // we're done here. return; } if (string.IsNullOrEmpty(location)) { request.Error(ErrorCategory.InvalidArgument, Constants.Parameters.Location, Constants.Messages.MissingRequiredParameter, Constants.Parameters.Location); // we're done here. return; } // if this is supposed to be an update, there will be a dynamic parameter set for IsUpdatePackageSource var isUpdate = request.GetOptionValue(Constants.Parameters.IsUpdate).IsTrue(); // if your source supports credentials you get get them too: // string username =request.Username; // SecureString password = request.Password; // feel free to send back an error here if your provider requires credentials for package sources. // check first that we're not clobbering an existing source, unless this is an update var src = request.FindRegisteredSource(name); if (src != null && !isUpdate) { // tell the user that there's one here already request.Error(ErrorCategory.InvalidArgument, name ?? location, Constants.Messages.PackageSourceExists, name ?? location); // we're done here. return; } // conversely, if it didn't find one, and it is an update, that's bad too: if (src == null && isUpdate) { // you can't find that package source? Tell that to the user request.Error(ErrorCategory.ObjectNotFound, name ?? location, Constants.Messages.UnableToResolveSource, name ?? location); // we're done here. return; } // ok, we know that we're ok to save this source // next we check if the location is valid (if we support that kind of thing) var validated = false; if (!request.SkipValidate) { // the user has not opted to skip validating the package source location, so check that it's valid (talk to the url, or check if it's a valid directory, etc) // todo: insert code to check if the source is valid validated = request.ValidateSourceLocation(location); if (!validated) { request.Error(ErrorCategory.InvalidData, name ?? location, Constants.Messages.SourceLocationNotValid, location); // we're done here. return; } // we passed validation! } // it's good to check just before you actaully write something to see if the user has cancelled the operation if (request.IsCanceled) { return; } // looking good -- store the package source // todo: create the package source (and store it whereever you store it) request.Verbose("Storing package source {0}", name); // actually yielded by the implementation. request.AddPackageSource(name, location, trusted, validated); // and, before you go, Yield the package source back to the caller. if (!request.YieldPackageSource(name, location, trusted, true /*since we just registered it*/, validated)) { // always check the return value of a yield, since if it returns false, you don't keep returning data // this can happen if they have cancelled the operation. } // all done! }