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


#include <new>

#include <package/Context.h>

#include <Directory.h>
#include <FindDirectory.h>
#include <OS.h>
#include <Path.h>

#include "TempfileManager.h"


namespace BPackageKit {


using BPrivate::TempfileManager;


BDecisionProvider::~BDecisionProvider()
{
}


bool
BDecisionProvider::YesNoDecisionNeeded(const BString& description,
        const BString& question, const BString& yes, const BString& no,
        const BString& defaultChoice)
{
        return defaultChoice == yes;
}


BContext::BContext(BDecisionProvider& decisionProvider,
        BSupportKit::BJobStateListener& jobStateListener)
        :
        fDecisionProvider(decisionProvider),
        fJobStateListener(jobStateListener),
        fTempfileManager(NULL)
{
        fInitStatus = _Initialize();
}


BContext::~BContext()
{
        delete fTempfileManager;
}


status_t
BContext::InitCheck() const
{
        return fInitStatus;
}


status_t
BContext::GetNewTempfile(const BString& baseName, BEntry* entry) const
{
        if (entry == NULL)
                return B_BAD_VALUE;
        if (fTempfileManager == NULL)
                return B_NO_INIT;
        *entry = fTempfileManager->Create(baseName);
        return entry->InitCheck();
}


BSupportKit::BJobStateListener&
BContext::JobStateListener() const
{
        return fJobStateListener;
}


BDecisionProvider&
BContext::DecisionProvider() const
{
        return fDecisionProvider;
}


status_t
BContext::_Initialize()
{
        fTempfileManager = new (std::nothrow) TempfileManager();
        if (fTempfileManager == NULL)
                return B_NO_MEMORY;

        BPath tempPath;
        status_t result = find_directory(B_SYSTEM_TEMP_DIRECTORY, &tempPath, true);
        if (result != B_OK)
                return result;
        BDirectory tempDirectory(tempPath.Path());
        if ((result = tempDirectory.InitCheck()) != B_OK)
                return result;

        BString contextName = BString("pkgkit-context-") << find_thread(NULL)
                << "-" << system_time();
        BDirectory baseDirectory;
        result = tempDirectory.CreateDirectory(contextName.String(),
                &baseDirectory);
        if (result != B_OK)
                return result;

        fTempfileManager->SetBaseDirectory(baseDirectory);

        return B_OK;
}


}       // namespace BPackageKit