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