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


#include <Flattenable.h>
#include <Message.h>
#include <StorageDefs.h>


// Forward declarations
class BDirectory;
class BEntry;
struct entry_ref;


class BPath : public BFlattenable {
public:
                                                        BPath();
                                                        BPath(const BPath& path);
                                                        BPath(const entry_ref* ref);
                                                        BPath(const BEntry* entry);
                                                        BPath(const char* dir, const char* leaf = NULL,
                                                                bool normalize = false);
                                                        BPath(const BDirectory* dir,
                                                                const char* leaf = NULL,
                                                                bool normalize = false);

        virtual                                 ~BPath();

                        status_t                InitCheck() const;

                        status_t                SetTo(const entry_ref* ref);
                        status_t                SetTo(const BEntry* entry);
                        status_t                SetTo(const char* path, const char* leaf = NULL,
                                                                bool normalize = false);
                        status_t                SetTo(const BDirectory* dir,
                                                                const char* leaf = NULL,
                                                                bool normalize = false);
                        void                    Unset();

                        status_t                Append(const char* path, bool normalize = false);

                        const char*             Path() const;
                        const char*             Leaf() const;
                        status_t                GetParent(BPath* path) const;
                        bool                    IsAbsolute() const;

                        bool                    operator==(const BPath& item) const;
                        bool                    operator==(const char* path) const;
                        bool                    operator!=(const BPath& item) const;
                        bool                    operator!=(const char* path) const;
                        BPath&                  operator=(const BPath& item);
                        BPath&                  operator=(const char* path);

        // BFlattenable protocol
        virtual bool                    IsFixedSize() const;
        virtual type_code               TypeCode() const;
        virtual ssize_t                 FlattenedSize() const;
        virtual status_t                Flatten(void* buffer, ssize_t size) const;
        virtual bool                    AllowsTypeCode(type_code code) const;
        virtual status_t                Unflatten(type_code code, const void* buffer,
                                                                ssize_t size);

private:
        virtual void                    _WarPath1();
        virtual void                    _WarPath2();
        virtual void                    _WarPath3();

                        status_t                _SetPath(const char* path);
        static  bool                    _MustNormalize(const char* path, status_t* _error);

                        uint32                  _reserved[4];

                        char*                   fName;
                                                                // Pointer to the path string of the object.
                        status_t                fCStatus;
                                                                // The initialization status of the object.
};

#endif  // _PATH_H