1/*
2 * Copyright 2011, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Oliver Tappe <zooey@hirschkaefer.de>
7 */
8
9
10#include <package/AddRepositoryRequest.h>
11
12#include <Directory.h>
13#include <Path.h>
14
15#include <package/ActivateRepositoryConfigJob.h>
16#include <package/FetchFileJob.h>
17#include <package/JobQueue.h>
18#include <package/PackageRoster.h>
19
20
21namespace BPackageKit {
22
23
24using namespace BPrivate;
25
26
27AddRepositoryRequest::AddRepositoryRequest(const BContext& context,
28	const BString& repositoryBaseURL, bool asUserRepository)
29	:
30	inherited(context),
31	fRepositoryBaseURL(repositoryBaseURL),
32	fAsUserRepository(asUserRepository),
33	fActivateJob(NULL)
34{
35}
36
37
38AddRepositoryRequest::~AddRepositoryRequest()
39{
40}
41
42
43status_t
44AddRepositoryRequest::CreateInitialJobs()
45{
46	status_t result = InitCheck();
47	if (result != B_OK)
48		return B_NO_INIT;
49
50	BEntry tempEntry;
51	result = fContext.GetNewTempfile("repoinfo-", &tempEntry);
52	if (result != B_OK)
53		return result;
54	BString repoInfoURL = BString(fRepositoryBaseURL) << "/" << "repo.info";
55	FetchFileJob* fetchJob = new (std::nothrow) FetchFileJob(fContext,
56		BString("Fetching repository info from ") << fRepositoryBaseURL,
57		repoInfoURL, tempEntry);
58	if (fetchJob == NULL)
59		return B_NO_MEMORY;
60	if ((result = QueueJob(fetchJob)) != B_OK) {
61		delete fetchJob;
62		return result;
63	}
64
65	BPackageRoster roster;
66	BPath targetRepoConfigPath;
67	result = fAsUserRepository
68		? roster.GetUserRepositoryConfigPath(&targetRepoConfigPath, true)
69		: roster.GetCommonRepositoryConfigPath(&targetRepoConfigPath, true);
70	if (result != B_OK)
71		return result;
72	BDirectory targetDirectory(targetRepoConfigPath.Path());
73	ActivateRepositoryConfigJob* activateJob
74		= new (std::nothrow) ActivateRepositoryConfigJob(fContext,
75			BString("Activating repository config from ") << fRepositoryBaseURL,
76			tempEntry, fRepositoryBaseURL, targetDirectory);
77	if (activateJob == NULL)
78		return B_NO_MEMORY;
79	activateJob->AddDependency(fetchJob);
80	if ((result = QueueJob(activateJob)) != B_OK) {
81		delete activateJob;
82		return result;
83	}
84	fActivateJob = activateJob;
85
86	return B_OK;
87}
88
89
90void
91AddRepositoryRequest::JobSucceeded(BJob* job)
92{
93	if (job == fActivateJob)
94		fRepositoryName = fActivateJob->RepositoryName();
95}
96
97
98const BString&
99AddRepositoryRequest::RepositoryName() const
100{
101	return fRepositoryName;
102}
103
104
105}	// namespace BPackageKit
106