root/headers/os/package/hpkg/PackageInfoAttributeValue.h
/*
 * Copyright 2009-2011, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _PACKAGE__HPKG__PACKAGE_INFO_ATTRIBUTE_VALUE_H_
#define _PACKAGE__HPKG__PACKAGE_INFO_ATTRIBUTE_VALUE_H_


#include <SupportDefs.h>

#include <string.h>

#include <package/PackageArchitecture.h>
#include <package/PackageInfoAttributes.h>
#include <package/PackageResolvableOperator.h>
#include <package/WritableFileUpdateType.h>


namespace BPackageKit {

namespace BHPKG {


struct BPackageVersionData {
        const char*                     major;
        const char*                     minor;
        const char*                     micro;
        const char*                     preRelease;
        uint32                          revision;
};


struct BPackageResolvableData {
        const char*                     name;
        bool                            haveVersion;
        bool                            haveCompatibleVersion;
        BPackageVersionData     version;
        BPackageVersionData     compatibleVersion;
};


struct BPackageResolvableExpressionData {
        const char*                     name;
        bool                            haveOpAndVersion;
        BPackageResolvableOperator      op;
        BPackageVersionData     version;
};


struct BGlobalWritableFileInfoData {
        const char*                             path;
        BWritableFileUpdateType updateType;
        bool                                    isDirectory;
};


struct BUserSettingsFileInfoData {
        const char*     path;
        const char*     templatePath;
        bool            isDirectory;
};


struct BUserData {
        const char*                     name;
        const char*                     realName;
        const char*                     home;
        const char*                     shell;
        const char* const*      groups;
        size_t                          groupCount;
};


struct BPackageInfoAttributeValue {
                        union {
                                uint64                  unsignedInt;
                                const char*             string;
                                BPackageVersionData version;
                                BPackageResolvableData resolvable;
                                BPackageResolvableExpressionData resolvableExpression;
                                BGlobalWritableFileInfoData globalWritableFileInfo;
                                BUserSettingsFileInfoData userSettingsFileInfo;
                                BUserData               user;
                        };
                        BPackageInfoAttributeID attributeID;

public:
                                                                BPackageInfoAttributeValue();

                        void                            SetTo(BPackageInfoAttributeID id,
                                                                        uint8 value);
                        void                            SetTo(BPackageInfoAttributeID id,
                                                                        const char* value);

                        void                            Clear();
};


inline
BPackageInfoAttributeValue::BPackageInfoAttributeValue()
{
        Clear();
}


inline void
BPackageInfoAttributeValue::SetTo(BPackageInfoAttributeID id, uint8 value)
{
        attributeID = id;
        unsignedInt = value;
}


inline void
BPackageInfoAttributeValue::SetTo(BPackageInfoAttributeID id,
        const char* value)
{
        attributeID = id;
        string = value;
}


inline void
BPackageInfoAttributeValue::Clear()
{
        unsignedInt = 0;
        string = NULL;
        memset(&version, 0, sizeof(version));
        memset(&resolvable, 0, sizeof(resolvable));
        memset(&resolvableExpression, 0, sizeof(resolvableExpression));
        memset(&globalWritableFileInfo, 0, sizeof(globalWritableFileInfo));
        memset(&userSettingsFileInfo, 0, sizeof(userSettingsFileInfo));
        memset(&user, 0, sizeof(user));
        attributeID = B_PACKAGE_INFO_ENUM_COUNT;
}


}       // namespace BHPKG

}       // namespace BPackageKit


#endif  // _PACKAGE__HPKG__PACKAGE_ATTRIBUTE_VALUE_H_