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 <new>
11
12#include <package/Context.h>
13#include <package/TempfileManager.h>
14
15#include <Directory.h>
16#include <FindDirectory.h>
17#include <OS.h>
18#include <Path.h>
19
20
21namespace BPackageKit {
22
23
24using BPrivate::TempfileManager;
25
26
27BDecisionProvider::~BDecisionProvider()
28{
29}
30
31
32BContext::BContext(BDecisionProvider& decisionProvider,
33	BJobStateListener& jobStateListener)
34	:
35	fDecisionProvider(decisionProvider),
36	fJobStateListener(jobStateListener),
37	fTempfileManager(NULL)
38{
39	fInitStatus = _Initialize();
40}
41
42
43BContext::~BContext()
44{
45	delete fTempfileManager;
46}
47
48
49status_t
50BContext::InitCheck() const
51{
52	return fInitStatus;
53}
54
55
56status_t
57BContext::GetNewTempfile(const BString& baseName, BEntry* entry) const
58{
59	if (entry == NULL)
60		return B_BAD_VALUE;
61	if (fTempfileManager == NULL)
62		return B_NO_INIT;
63	*entry = fTempfileManager->Create(baseName);
64	return entry->InitCheck();
65}
66
67
68BJobStateListener&
69BContext::JobStateListener() const
70{
71	return fJobStateListener;
72}
73
74
75BDecisionProvider&
76BContext::DecisionProvider() const
77{
78	return fDecisionProvider;
79}
80
81
82status_t
83BContext::_Initialize()
84{
85	fTempfileManager = new (std::nothrow) TempfileManager();
86	if (fTempfileManager == NULL)
87		return B_NO_MEMORY;
88
89	BPath tempPath;
90	status_t result = find_directory(B_COMMON_TEMP_DIRECTORY, &tempPath, true);
91	if (result != B_OK)
92		return result;
93	BDirectory tempDirectory(tempPath.Path());
94	if ((result = tempDirectory.InitCheck()) != B_OK)
95		return result;
96
97	BString contextName = BString("pkgkit-context-") << find_thread(NULL);
98	BDirectory baseDirectory;
99	result = tempDirectory.CreateDirectory(contextName.String(),
100		&baseDirectory);
101	if (result != B_OK)
102		return result;
103
104	fTempfileManager->SetBaseDirectory(baseDirectory);
105
106	return B_OK;
107}
108
109
110}	// namespace BPackageKit
111