root/src/add-ons/kernel/file_systems/ext2/Attribute.h
/*
 * Copyright 2010, Jérôme Duval, korli@users.berlios.de.
 * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de.
 * This file may be used under the terms of the MIT License.
 */
#ifndef ATTRIBUTE_H
#define ATTRIBUTE_H


#include "CachedBlock.h"
#include "Inode.h"


struct attr_cookie {
        char    name[B_ATTR_NAME_LENGTH];
        uint32  type;
        int             open_mode;
        bool    create;
};


class Attribute {
public:
                                                        Attribute(Inode* inode);
                                                        Attribute(Inode* inode, attr_cookie* cookie);
                                                        ~Attribute();

                        status_t                InitCheck();
                        status_t                CheckAccess(const char* name, int openMode);

                        status_t                Find(const char* name);
                        status_t                Find(int32 index);
                        status_t                GetName(char* name, size_t* _nameLength);
                        void                    Put();

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

                        status_t                Stat(struct stat& stat);

                        status_t                Read(attr_cookie* cookie, off_t pos, uint8* buffer,
                                                                size_t* _length);
                        status_t                Write(Transaction& transaction, attr_cookie* cookie,
                                                                off_t pos, const uint8* buffer, 
                                                                size_t* _length, bool* _created);

private:
                        status_t                _Truncate();
                        status_t                _Find(const char* name, int32 index);
                        status_t                _FindAttributeBody(const uint8* start, const uint8* end,
                                                                const char* name, int32 index, int32 *count,
                                                                ext2_xattr_entry** entry);
                        status_t                _FindAttributeBlock(const uint8* start, const uint8* end,
                                                                const char* name, int32 index, int32 *count,
                                                                ext2_xattr_entry** entry);
                        status_t                _FindAttribute(const uint8* start, const uint8* end,
                                                                const char* name, int32 index, int32 *count,
                                                                ext2_xattr_entry** entry);
                        status_t                _PrefixedName(ext2_xattr_entry* entry, char* _name,
                                                                size_t* _nameLength);

                        ::Volume*               fVolume;
                        CachedBlock             fBlock;
                        Inode*                  fInode;
                        ext2_xattr_entry* fBodyEntry;
                        ext2_xattr_entry* fBlockEntry;
                        const char*             fName;
};

#endif  // ATTRIBUTE_H