⛏️ index : haiku.git

/*
 * Copyright 2011-2015, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Oliver Tappe <zooey@hirschkaefer.de>
 */


#include <package/AddRepositoryRequest.h>

#include <Directory.h>
#include <JobQueue.h>
#include <Path.h>

#include <package/ActivateRepositoryConfigJob.h>
#include <package/PackageRoster.h>

#include "FetchFileJob.h"


namespace BPackageKit {


using namespace BPrivate;


AddRepositoryRequest::AddRepositoryRequest(const BContext& context,
	const BString& repositoryBaseURL, bool asUserRepository)
	:
	inherited(context),
	fRepositoryBaseURL(repositoryBaseURL),
	fAsUserRepository(asUserRepository),
	fActivateJob(NULL)
{
}


AddRepositoryRequest::~AddRepositoryRequest()
{
}


status_t
AddRepositoryRequest::CreateInitialJobs()
{
	status_t result = InitCheck();
	if (result != B_OK)
		return B_NO_INIT;

	BEntry tempEntry;
	result = fContext.GetNewTempfile("repoinfo-", &tempEntry);
	if (result != B_OK)
		return result;
	BString repoInfoURL = BString(fRepositoryBaseURL) << "/" << "repo.info";
	FetchFileJob* fetchJob = new (std::nothrow) FetchFileJob(fContext,
		BString("Fetching repository info from ") << fRepositoryBaseURL,
		repoInfoURL, tempEntry);
	if (fetchJob == NULL)
		return B_NO_MEMORY;
	if ((result = QueueJob(fetchJob)) != B_OK) {
		delete fetchJob;
		return result;
	}

	BPackageRoster roster;
	BPath targetRepoConfigPath;
	result = fAsUserRepository
		? roster.GetUserRepositoryConfigPath(&targetRepoConfigPath, true)
		: roster.GetCommonRepositoryConfigPath(&targetRepoConfigPath, true);
	if (result != B_OK)
		return result;
	BDirectory targetDirectory(targetRepoConfigPath.Path());
	ActivateRepositoryConfigJob* activateJob
		= new (std::nothrow) ActivateRepositoryConfigJob(fContext,
			BString("Activating repository config from ") << fRepositoryBaseURL,
			tempEntry, fRepositoryBaseURL, targetDirectory);
	if (activateJob == NULL)
		return B_NO_MEMORY;
	result = activateJob->AddDependency(fetchJob);
	if (result != B_OK)
		return result;
	if ((result = QueueJob(activateJob)) != B_OK) {
		delete activateJob;
		return result;
	}
	fActivateJob = activateJob;

	return B_OK;
}


void
AddRepositoryRequest::JobSucceeded(BSupportKit::BJob* job)
{
	if (job == fActivateJob)
		fRepositoryName = fActivateJob->RepositoryName();
}


const BString&
AddRepositoryRequest::RepositoryName() const
{
	return fRepositoryName;
}


}	// namespace BPackageKit