00001 #include <qdir.h>
00002
00003 #include <map>
00004 #include <vector>
00005
00006 #include "dbaccess.h"
00007
00008 #include "dirscan.h"
00009
00010 DirectoryHandler::~DirectoryHandler()
00011 {
00012 }
00013
00014 namespace
00015 {
00016 class ext_lookup
00017 {
00018 private:
00019 typedef std::map<QString, bool> ext_map;
00020 ext_map m_extensions;
00021 bool m_list_unknown;
00022
00023 public:
00024 ext_lookup(const FileAssociations::ext_ignore_list &ext_disposition,
00025 bool list_unknown) : m_list_unknown(list_unknown)
00026 {
00027 for (FileAssociations::ext_ignore_list::const_iterator p =
00028 ext_disposition.begin(); p != ext_disposition.end(); ++p)
00029 {
00030 m_extensions.insert(ext_map::value_type(p->first.lower(),
00031 p->second));
00032 }
00033 }
00034
00035 bool extension_ignored(const QString &extension) const
00036 {
00037 ext_map::const_iterator p = m_extensions.find(extension.lower());
00038 if (p != m_extensions.end())
00039 return p->second;
00040 return !m_list_unknown;
00041 }
00042 };
00043
00044 void scan_dir(const QString &start_path, DirectoryHandler *handler,
00045 const ext_lookup &ext_settings)
00046 {
00047 QDir d(start_path);
00048
00049 if (!d.exists())
00050 return;
00051
00052 const QFileInfoList *list = d.entryInfoList();
00053 if (!list)
00054 return;
00055
00056 QFileInfoListIterator it(*list);
00057 QFileInfo *fi;
00058
00059 QDir dir_tester;
00060
00061 while ((fi = it.current()) != 0)
00062 {
00063 ++it;
00064
00065 if (fi->fileName() == "." ||
00066 fi->fileName() == ".." ||
00067 fi->fileName() == "Thumbs.db")
00068 {
00069 continue;
00070 }
00071
00072 if (!fi->isDir() &&
00073 ext_settings.extension_ignored(fi->extension(false))) continue;
00074
00075 bool add_as_file = true;
00076
00077 if (fi->isDir())
00078 {
00079 add_as_file = false;
00080
00081 dir_tester.setPath(fi->absFilePath() + "/VIDEO_TS");
00082 if (dir_tester.exists())
00083 {
00084 add_as_file = true;
00085 }
00086 else
00087 {
00088 DirectoryHandler *dh = handler->newDir(fi->fileName(),
00089 fi->absFilePath());
00090 scan_dir(fi->absFilePath(), dh, ext_settings);
00091 }
00092 }
00093
00094 if (add_as_file)
00095 {
00096 handler->handleFile(fi->fileName(), fi->absFilePath(),
00097 fi->extension(false));
00098 }
00099 }
00100 }
00101 }
00102
00103 void ScanVideoDirectory(const QString &start_path, DirectoryHandler *handler,
00104 const FileAssociations::ext_ignore_list &ext_disposition,
00105 bool list_unknown_extensions)
00106 {
00107 ext_lookup extlookup(ext_disposition, list_unknown_extensions);
00108 scan_dir(start_path, handler, extlookup);
00109 }