root/src/add-ons/kernel/file_systems/xfs/ShortAttribute.h
/*
 * Copyright 2022, Raghav Sharma, raghavself28@gmail.com
 * Distributed under the terms of the MIT License.
 */
#ifndef SHORT_ATTRIBUTE_H
#define SHORT_ATTRIBUTE_H


#include "Attribute.h"
#include "Inode.h"


class ShortAttribute : public Attribute {
public:
                        struct AShortFormEntry {
                        public:
                                uint8                           namelen;
                                uint8                           valuelen;
                                uint8                           flags;
                                uint8                           nameval[];
                        };

                        struct AShortFormHeader {
                                uint16                          totsize;
                                uint8                           count;
                                uint8                           padding;
                        };
                                                                ShortAttribute(Inode* inode);
                                                                ~ShortAttribute();

                        status_t                        Stat(attr_cookie* cookie, struct stat& stat);

                        status_t                        Read(attr_cookie* cookie, off_t pos,
                                                                        uint8* buffer, size_t* length);

                        status_t                        Open(const char* name, int openMode, attr_cookie** _cookie);

                        status_t                        GetNext(char* name, size_t* nameLength);

                        status_t                        Lookup(const char* name, size_t* nameLength);
private:
                        void                            SwapEndian();
private:
                        uint32                          _DataLength(AShortFormEntry* entry);

                        AShortFormEntry*        _FirstEntry();

                        Inode*                          fInode;
                        const char*                     fName;
                        AShortFormHeader*       fHeader;
                        AShortFormEntry*        fEntry;
                        uint16                          fLastEntryOffset;
};