root/src/kits/debugger/settings/TeamSignalSettings.cpp
/*
 * Copyright 2015, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */
#include "TeamSignalSettings.h"


static const char* skDefaultSignalFieldName = "signal:default_disposition";
static const char* skSignalNumberFieldName = "signal:number";
static const char* skSignalDispositionFieldName = "signal:disposition";
static const char* skSignalSettingName = "signal:setting";


TeamSignalSettings::TeamSignalSettings()
        :
        fValues()
{
}


TeamSignalSettings::~TeamSignalSettings()
{
}


TeamSignalSettings&
TeamSignalSettings::operator=(const TeamSignalSettings& other)
{
        fValues = other.fValues;

        return *this;
}


const char*
TeamSignalSettings::ID() const
{
        return "Signals";
}


status_t
TeamSignalSettings::SetTo(const BMessage& archive)
{
        try {
                fValues = archive;
        } catch (...) {
                return B_NO_MEMORY;
        }

        return B_OK;
}


status_t
TeamSignalSettings::WriteTo(BMessage& archive) const
{
        try {
                archive = fValues;
        } catch (...) {
                return B_NO_MEMORY;
        }

        return B_OK;
}


void
TeamSignalSettings::Unset()
{
        fValues.MakeEmpty();
}


void
TeamSignalSettings::SetDefaultSignalDisposition(int32 disposition)
{
        fValues.SetInt32(skDefaultSignalFieldName, disposition);
}


int32
TeamSignalSettings::DefaultSignalDisposition() const
{
        return fValues.GetInt32(skDefaultSignalFieldName,
                SIGNAL_DISPOSITION_IGNORE);
}


int32
TeamSignalSettings::CountCustomSignalDispositions() const
{
        type_code type;
        int32 count = 0;

        if (fValues.GetInfo(skSignalSettingName, &type, &count) == B_OK)
                return count;

        return 0;
}


status_t
TeamSignalSettings::AddCustomSignalDisposition(int32 signal, int32 disposition)
{
        BMessage setting;
        if (setting.AddInt32(skSignalNumberFieldName, signal) != B_OK
                || setting.AddInt32(skSignalDispositionFieldName, disposition) != B_OK
                || fValues.AddMessage(skSignalSettingName, &setting) != B_OK) {
                return B_NO_MEMORY;
        }

        return B_OK;
}


status_t
TeamSignalSettings::RemoveCustomSignalDispositionAt(int32 index)
{
        return fValues.RemoveData(skSignalSettingName, index);
}


status_t
TeamSignalSettings::GetCustomSignalDispositionAt(int32 index, int32& signal,
        int32& disposition) const
{
        BMessage setting;
        status_t error = fValues.FindMessage(skSignalSettingName, index, &setting);
        if (error != B_OK)
                return error;

        error = setting.FindInt32(skSignalNumberFieldName, &signal);
        if (error != B_OK)
                return error;

        return setting.FindInt32(skSignalDispositionFieldName, &disposition);
}


TeamSignalSettings*
TeamSignalSettings::Clone() const
{
        TeamSignalSettings* settings = new(std::nothrow)
                TeamSignalSettings();

        if (settings == NULL)
                return NULL;

        if (settings->SetTo(fValues) != B_OK) {
                delete settings;
                return NULL;
        }

        return settings;
}