root/headers/os/storage/Entry.h
/*
 * Copyright 2002-2012, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _ENTRY_H
#define _ENTRY_H


#include <sys/types.h>
#include <sys/stat.h>
#include <SupportDefs.h>

#include <Statable.h>


class BDirectory;
class BPath;


struct entry_ref {
                                                                entry_ref();
                                                                entry_ref(dev_t dev, ino_t dir,
                                                                        const char* name);
                                                                entry_ref(const entry_ref& ref);
                                                                ~entry_ref();

                        status_t                        set_name(const char* name);

                        bool                            operator==(const entry_ref& ref) const;
                        bool                            operator!=(const entry_ref& ref) const;
                        entry_ref&                      operator=(const entry_ref& ref);

                        dev_t                           device;
                        ino_t                           directory;
                        char*                           name;
};


class BEntry : public BStatable {
public:
                                                                BEntry();
                                                                BEntry(const BDirectory* dir, const char* path,
                                                                        bool traverse = false);
                                                                BEntry(const entry_ref* ref,
                                                                        bool traverse = false);
                                                                BEntry(const char* path, bool traverse = false);
                                                                BEntry(const BEntry& entry);
        virtual                                         ~BEntry();

                        status_t                        InitCheck() const;
                        bool                            Exists() const;

                        const char*                     Name() const;

        virtual status_t                        GetStat(struct stat* stat) const;

                        status_t                        SetTo(const BDirectory* dir, const char* path,
                                                                   bool traverse = false);
                        status_t                        SetTo(const entry_ref* ref,
                                                                        bool traverse = false);
                        status_t                        SetTo(const char* path, bool traverse = false);
                        void                            Unset();

                        status_t                        GetRef(entry_ref* ref) const;
                        status_t                        GetPath(BPath* path) const;
                        status_t                        GetParent(BEntry* entry) const;
                        status_t                        GetParent(BDirectory* dir) const;
                        status_t                        GetName(char* buffer) const;

                        status_t                        Rename(const char* path, bool clobber = false);
                        status_t                        MoveTo(BDirectory* dir, const char* path = NULL,
                                                                        bool clobber = false);
                        status_t                        Remove();

                        bool                            operator==(const BEntry& item) const;
                        bool                            operator!=(const BEntry& item) const;

                        BEntry&                         operator=(const BEntry& item);

private:
                        friend class BDirectory;
                        friend class BFile;
                        friend class BNode;
                        friend class BSymLink;

        virtual void                            _PennyEntry1();
        virtual void                            _PennyEntry2();
        virtual void                            _PennyEntry3();
        virtual void                            _PennyEntry4();
        virtual void                            _PennyEntry5();
        virtual void                            _PennyEntry6();

        // BEntry implementation of BStatable::set_stat()
        virtual status_t                        set_stat(struct stat& stat, uint32 what);
                        status_t                        _SetTo(int dir, const char* path,
                                                                        bool traverse);
                        status_t                        _SetName(const char* name);

                        status_t                        _Rename(BEntry& target, bool clobber);

                        void                            _Dump(const char* name = NULL);

                        status_t                        _GetStat(struct stat* stat) const;
        virtual status_t                        _GetStat(struct stat_beos* stat) const;

private:
                        int                                     fDirFd;
                        char*                           fName;
                        status_t                        fCStatus;

                        uint32                          _reserved[4];
};


status_t get_ref_for_path(const char* path, entry_ref* ref);
bool operator<(const entry_ref& a, const entry_ref& b);


#endif  // _ENTRY_H