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


#include "LeafAttribute.h"
#include "Node.h"


class NodeAttribute : public Attribute {
public:
                                                                NodeAttribute(Inode* inode);
                                                                ~NodeAttribute();

                        status_t                        Init();

                        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:
                        status_t                        _FillMapEntry(xfs_extnum_t num);

                        status_t                        _FillBuffer(char* buffer, xfs_fsblock_t block);

                        xfs_fsblock_t           _LogicalToFileSystemBlock(uint32 LogicalBlock);

                        Inode*                          fInode;
                        const char*                     fName;
                        ExtentMapEntry*         fMap;
                        char*                           fLeafBuffer;
                        char*                           fNodeBuffer;
                        uint16                          fLastEntryOffset;
                        uint16                          fLastNodeOffset;
                        uint8                           fNodeFlag;
                        AttrLeafNameLocal*      fLocalEntry;
                        AttrLeafNameRemote*     fRemoteEntry;
};