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/RepositoryConfig.h>
11
12#include <stdlib.h>
13
14#include <new>
15
16#include <Directory.h>
17#include <driver_settings.h>
18#include <File.h>
19#include <FindDirectory.h>
20#include <Path.h>
21
22
23namespace BPackageKit {
24
25
26BRepositoryConfig::BRepositoryConfig()
27	:
28	fInitStatus(B_NO_INIT),
29	fPriority(kUnsetPriority),
30	fIsUserSpecific(false)
31{
32}
33
34
35BRepositoryConfig::BRepositoryConfig(const BEntry& entry)
36{
37	SetTo(entry);
38}
39
40
41BRepositoryConfig::BRepositoryConfig(const BString& name,
42	const BString& baseURL, uint8 priority)
43	:
44	fInitStatus(B_OK),
45	fName(name),
46	fBaseURL(baseURL),
47	fPriority(priority),
48	fIsUserSpecific(false)
49{
50}
51
52
53BRepositoryConfig::~BRepositoryConfig()
54{
55}
56
57
58status_t
59BRepositoryConfig::Store(const BEntry& entry) const
60{
61	BFile file(&entry, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
62	status_t result = file.InitCheck();
63	if (result != B_OK)
64		return result;
65
66	BString configString;
67	configString
68		<< "url=" << fBaseURL << "\n"
69		<< "priority=" << fPriority << "\n";
70
71	int32 size = configString.Length();
72	if ((result = file.Write(configString.String(), size)) < size)
73		return (result >= 0) ? B_ERROR : result;
74
75	return B_OK;
76}
77
78
79status_t
80BRepositoryConfig::InitCheck() const
81{
82	return fInitStatus;
83}
84
85
86status_t
87BRepositoryConfig::SetTo(const BEntry& entry)
88{
89	fEntry = entry;
90	fInitStatus = B_NO_INIT;
91
92	BFile file(&entry, B_READ_ONLY);
93	status_t result = file.InitCheck();
94	if (result != B_OK)
95		return result;
96
97	off_t size;
98	if ((result = file.GetSize(&size)) != B_OK)
99		return result;
100
101	BString configString;
102	char* buffer = configString.LockBuffer(size);
103	if (buffer == NULL)
104		return B_NO_MEMORY;
105
106	if ((result = file.Read(buffer, size)) < size) {
107		configString.UnlockBuffer(0);
108		return (result >= 0) ? B_IO_ERROR : result;
109	}
110
111	buffer[size] = '\0';
112	configString.UnlockBuffer(size);
113
114	void* settingsHandle = parse_driver_settings_string(configString.String());
115	if (settingsHandle == NULL)
116		return B_BAD_DATA;
117
118	const char* url = get_driver_parameter(settingsHandle, "url", NULL, NULL);
119	const char* priorityString
120		= get_driver_parameter(settingsHandle, "priority", NULL, NULL);
121
122	unload_driver_settings(settingsHandle);
123
124	if (url == NULL || *url == '\0')
125		return B_BAD_DATA;
126
127	char name[B_FILE_NAME_LENGTH];
128	if ((result = entry.GetName(name)) != B_OK)
129		return result;
130
131	fName = name;
132	fBaseURL = url;
133	fPriority = priorityString == NULL
134		? kUnsetPriority : atoi(priorityString);
135
136	BPath userSettingsPath;
137	if (find_directory(B_USER_SETTINGS_DIRECTORY, &userSettingsPath) == B_OK) {
138		BDirectory userSettingsDir(userSettingsPath.Path());
139		fIsUserSpecific = userSettingsDir.Contains(&entry);
140	} else
141		fIsUserSpecific = false;
142
143	fInitStatus = B_OK;
144
145	return B_OK;
146}
147
148
149const BString&
150BRepositoryConfig::Name() const
151{
152	return fName;
153}
154
155
156const BString&
157BRepositoryConfig::BaseURL() const
158{
159	return fBaseURL;
160}
161
162
163uint8
164BRepositoryConfig::Priority() const
165{
166	return fPriority;
167}
168
169
170bool
171BRepositoryConfig::IsUserSpecific() const
172{
173	return fIsUserSpecific;
174}
175
176
177const BEntry&
178BRepositoryConfig::Entry() const
179{
180	return fEntry;
181}
182
183
184void
185BRepositoryConfig::SetName(const BString& name)
186{
187	fName = name;
188}
189
190
191void
192BRepositoryConfig::SetBaseURL(const BString& baseURL)
193{
194	fBaseURL = baseURL;
195}
196
197
198void
199BRepositoryConfig::SetPriority(uint8 priority)
200{
201	fPriority = priority;
202}
203
204
205void
206BRepositoryConfig::SetIsUserSpecific(bool isUserSpecific)
207{
208	fIsUserSpecific = isUserSpecific;
209}
210
211
212}	// namespace BPackageKit
213