00001 #ifndef VIDEOMETADATALISTMANAGER_H_
00002 #define VIDEOMETADATALISTMANAGER_H_
00003
00004 #include <list>
00005
00006 #include "quicksp.h"
00007 #include "videometadata.h"
00008 #include "mythmetaexp.h"
00009
00010 class META_PUBLIC VideoMetadataListManager
00011 {
00012 public:
00013 typedef simple_ref_ptr<VideoMetadata> VideoMetadataPtr;
00014 typedef std::list<VideoMetadataPtr> metadata_list;
00015
00016 public:
00017 static VideoMetadataPtr loadOneFromDatabase(uint id);
00018 static void loadAllFromDatabase(metadata_list &items,
00019 const QString &sql = "");
00020
00021 public:
00022 VideoMetadataListManager();
00023 ~VideoMetadataListManager();
00024
00025 void setList(metadata_list &list);
00026 const metadata_list &getList() const;
00027
00028 VideoMetadataPtr byFilename(const QString &file_name) const;
00029 VideoMetadataPtr byID(unsigned int db_id) const;
00030
00031 bool purgeByFilename(const QString &file_name);
00032 bool purgeByID(unsigned int db_id);
00033
00034 private:
00035 class VideoMetadataListManagerImp *m_imp;
00036 };
00037
00038 class META_PUBLIC meta_node
00039 {
00040 public:
00041 meta_node(meta_node *parent, bool is_path_root = false) :
00042 m_parent(parent), m_path_root(is_path_root) {}
00043 virtual ~meta_node() {}
00044
00045 virtual const QString &getName() const = 0;
00046 virtual const QString &getPath() const;
00047 const QString &getFQPath();
00048 void setParent(meta_node *parent);
00049 void setPathRoot(bool is_root = true);
00050
00051 protected:
00052 meta_node *m_parent;
00053
00054 private:
00055 QString m_fq_path;
00056 bool m_path_root;
00057 static const QString m_empty_path;
00058 };
00059
00060 class META_PUBLIC meta_data_node : public meta_node
00061 {
00062 public:
00063 meta_data_node(VideoMetadata *data, meta_node *parent = NULL) :
00064 meta_node(parent), m_data(data) {}
00065 const QString &getName() const;
00066 const VideoMetadata *getData() const;
00067 VideoMetadata *getData();
00068
00069 private:
00070 VideoMetadata *m_data;
00071 static const QString m_meta_bug;
00072 };
00073
00074 class meta_dir_node;
00075
00076 typedef simple_ref_ptr<meta_dir_node> smart_dir_node;
00077 typedef simple_ref_ptr<meta_data_node> smart_meta_node;
00078
00079 typedef std::list<smart_dir_node> meta_dir_list;
00080 typedef std::list<smart_meta_node> meta_data_list;
00081
00082 class META_PUBLIC meta_dir_node : public meta_node
00083 {
00084 public:
00085 typedef meta_dir_list::iterator dir_iterator;
00086 typedef meta_dir_list::const_iterator const_dir_iterator;
00087
00088 typedef meta_data_list::iterator entry_iterator;
00089 typedef meta_data_list::const_iterator const_entry_iterator;
00090
00091 public:
00092 meta_dir_node(const QString &path, const QString &name = "",
00093 meta_dir_node *parent = NULL, bool is_path_root = false,
00094 const QString &host = "", const QString &prefix = "",
00095 const QVariant &data = QVariant());
00096 meta_dir_node() : meta_node(NULL) { }
00097
00098 void setName(const QString &name);
00099 const QString &getName() const;
00100 void SetHost(const QString &host);
00101 const QString &GetHost() const;
00102 void SetPrefix(const QString &prefix);
00103 const QString &GetPrefix() const;
00104 const QString &getPath() const;
00105 void setPath(const QString &path);
00106 void SetData(const QVariant &data);
00107 const QVariant &GetData() const;
00108 bool DataIsValid(void) const;
00109 smart_dir_node addSubDir(const QString &subdir,
00110 const QString &name = "",
00111 const QString &host = "",
00112 const QString &prefix = "",
00113 const QVariant &data = QVariant());
00114 void addSubDir(const smart_dir_node &subdir);
00115 smart_dir_node getSubDir(const QString &subdir,
00116 const QString &name = "",
00117 bool create = true,
00118 const QString &host = "",
00119 const QString &prefix = "",
00120 const QVariant &data = QVariant());
00121 void addEntry(const smart_meta_node &entry);
00122 void clear();
00123 bool empty() const;
00124 int subdir_count() const;
00125 template <typename DirSort, typename EntrySort>
00126 void sort(DirSort dir_sort, EntrySort entry_sort)
00127 {
00128 m_subdirs.sort(dir_sort);
00129 m_entries.sort(entry_sort);
00130
00131 for (meta_dir_list::iterator p = m_subdirs.begin();
00132 p != m_subdirs.end(); ++p)
00133 {
00134 (*p)->sort(dir_sort, entry_sort);
00135 }
00136 }
00137 dir_iterator dirs_begin();
00138 dir_iterator dirs_end();
00139 const_dir_iterator dirs_begin() const;
00140 const_dir_iterator dirs_end() const;
00141 entry_iterator entries_begin();
00142 entry_iterator entries_end();
00143 const_entry_iterator entries_begin() const;
00144 const_entry_iterator entries_end() const;
00145 bool has_entries() const;
00146
00147 private:
00148 QString m_path;
00149 QString m_name;
00150 QString m_host;
00151 QString m_prefix;
00152 meta_dir_list m_subdirs;
00153 meta_data_list m_entries;
00154
00155 QVariant m_data;
00156 };
00157 #endif // VIDEOMETADATALISTMANAGER_H_