00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MPD_DIRECTORY_H
00021 #define MPD_DIRECTORY_H
00022
00023 #include "dirvec.h"
00024 #include "songvec.h"
00025
00026 #include <stdbool.h>
00027 #include <sys/types.h>
00028
00029 #define DIRECTORY_DIR "directory: "
00030
00031 #define DEVICE_INARCHIVE (unsigned)(-1)
00032 #define DEVICE_CONTAINER (unsigned)(-2)
00033
00034 struct directory {
00035 struct dirvec children;
00036 struct songvec songs;
00037 struct directory *parent;
00038 time_t mtime;
00039 ino_t inode;
00040 dev_t device;
00041 unsigned stat;
00042 char path[sizeof(long)];
00043 };
00044
00045 static inline bool
00046 isRootDirectory(const char *name)
00047 {
00048 return name[0] == 0 || (name[0] == '/' && name[1] == 0);
00049 }
00050
00051 struct directory *
00052 directory_new(const char *dirname, struct directory *parent);
00053
00054 void
00055 directory_free(struct directory *directory);
00056
00057 static inline bool
00058 directory_is_empty(const struct directory *directory)
00059 {
00060 return directory->children.nr == 0 && directory->songs.nr == 0;
00061 }
00062
00063 static inline const char *
00064 directory_get_path(const struct directory *directory)
00065 {
00066 return directory->path;
00067 }
00068
00072 static inline bool
00073 directory_is_root(const struct directory *directory)
00074 {
00075 return directory->parent == NULL;
00076 }
00077
00081 const char *
00082 directory_get_name(const struct directory *directory);
00083
00084 static inline struct directory *
00085 directory_get_child(const struct directory *directory, const char *name)
00086 {
00087 return dirvec_find(&directory->children, name);
00088 }
00089
00090 static inline struct directory *
00091 directory_new_child(struct directory *directory, const char *name)
00092 {
00093 struct directory *subdir = directory_new(name, directory);
00094 dirvec_add(&directory->children, subdir);
00095 return subdir;
00096 }
00097
00098 void
00099 directory_prune_empty(struct directory *directory);
00100
00108 struct directory *
00109 directory_lookup_directory(struct directory *directory, const char *uri);
00110
00118 struct song *
00119 directory_lookup_song(struct directory *directory, const char *uri);
00120
00121 void
00122 directory_sort(struct directory *directory);
00123
00124 int
00125 directory_walk(struct directory *directory,
00126 int (*forEachSong)(struct song *, void *),
00127 int (*forEachDir)(struct directory *, void *),
00128 void *data);
00129
00130 #endif