Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <vlCore/MemoryDirectory.hpp>
00033
00034 using namespace vl;
00035
00036
00037 bool MemoryDirectory::setPath(const String& name)
00038 {
00039 String root = name;
00040 root.trim();
00041 root.normalizeSlashes();
00042 if (root.empty())
00043 {
00044 Log::error("MemoryDirectory::setPath() given an empty path.\n");
00045 return false;
00046 }
00047 if (!root.endsWith('/'))
00048 {
00049
00050 root += '/';
00051 }
00052
00053 std::map< String, ref<MemoryFile> > file_map;
00054 for( std::map< String, ref<MemoryFile> >::iterator it = mFiles.begin(); it != mFiles.end(); ++it )
00055 {
00056 String p = it->first;
00057 if ( !p.startsWith(path()) )
00058 {
00059 Log::warning( Say("MemoryDirectory::setPath() : invalid path file '%s'.\n") << p );
00060 continue;
00061 }
00062 p = p.right(-path().length());
00063 it->second->setPath(root + p);
00064 file_map[it->second->path()] = it->second;
00065 }
00066 mFiles = file_map;
00067 mPath = root;
00068 return true;
00069 }
00070
00071 bool MemoryDirectory::addFile(MemoryFile* file)
00072 {
00073 if (path().empty())
00074 {
00075 Log::error( "VirtualDirectory::path() must not be empty!\n" );
00076 return false;
00077 }
00078
00079 if ( !file->path().startsWith(path()) )
00080 {
00081 Log::error( Say("File '%s' does not belong to MemoryDirectory '%s'\n") << file->path() << path() );
00082 return false;
00083 }
00084
00085 String p = file->path();
00086 p.normalizeSlashes();
00087 file->setPath( p );
00088
00089 mFiles[file->path()] = file;
00090 return true;
00091 }
00092
00093 bool MemoryDirectory::removeFile(MemoryFile* file)
00094 {
00095 return removeFile( file->path() );
00096 }
00097
00098 bool MemoryDirectory::removeFile(const String& name)
00099 {
00100 bool ok = mFiles.find( name ) != mFiles.end();
00101 mFiles.erase( name );
00102 return ok;
00103 }
00104
00105 ref<MemoryFile> MemoryDirectory::memoryFile(const String& name) const
00106 {
00107 String p = translatePath(name);
00108 std::map< String, ref<MemoryFile> >::const_iterator it = mFiles.find(p);
00109 if (it == mFiles.end())
00110 return NULL;
00111 else
00112 {
00113 ref<MemoryFile> mem_file = new MemoryFile;
00114 mem_file->operator=(*it->second);
00115 return mem_file.get();
00116 }
00117 }
00118
00119 void MemoryDirectory::listFilesRecursive( std::vector<String>& file_list ) const
00120 {
00121 file_list.clear();
00122 if (path().empty())
00123 {
00124 Log::error( "VirtualDirectory::path() must not be empty!\n" );
00125 return;
00126 }
00127 for( std::map< String, ref<MemoryFile> >::const_iterator it = mFiles.begin(); it != mFiles.end(); ++it)
00128 {
00129 if (!it->first.startsWith(path()))
00130 vl::Log::warning( Say("MemoryFile '%s' does not belong to MemoryDirectory '%s'.\n") << it->first << path() );
00131 file_list.push_back( it->first );
00132 }
00133 }
00134
00135 void MemoryDirectory::listSubDirs(std::vector<String>& dirs, bool append) const
00136 {
00137 if (!append)
00138 dirs.clear();
00139 if (path().empty())
00140 {
00141 Log::error( "VirtualDirectory::path() must not be empty!\n" );
00142 return;
00143 }
00144 std::set<String> sub_dirs;
00145 for( std::map< String, ref<MemoryFile> >::const_iterator it = mFiles.begin(); it != mFiles.end(); ++it )
00146 {
00147 VL_CHECK(it->first.startsWith(path()))
00148 String p = it->first.extractPath();
00149 if (path().length())
00150 p = p.right(-path().length());
00151 while(p.startsWith('/'))
00152 p = p.right(-1);
00153 String drive_letter;
00154 if (p.length()>3 && p[1] == ':' && p[2] == '/')
00155 {
00156 drive_letter = p.left(3);
00157 p = p.right(-3);
00158 }
00159 if (p.empty())
00160 continue;
00161 std::vector<String> tokens;
00162 p.split('/',tokens,true);
00163 if (tokens.size())
00164 sub_dirs.insert(path() + tokens[0]);
00165 }
00166 for(std::set<String>::const_iterator it = sub_dirs.begin(); it != sub_dirs.end(); ++it)
00167 dirs.push_back(*it);
00168 }
00169
00170 ref<MemoryDirectory> MemoryDirectory::memorySubDir(const String& subdir_name) const
00171 {
00172 String p = translatePath(subdir_name);
00173 if (path().empty())
00174 {
00175 Log::error( "VirtualDirectory::path() must not be empty!\n" );
00176 return NULL;
00177 }
00178 ref<MemoryDirectory> dir = new MemoryDirectory(p);
00179 for( std::map< String, ref<MemoryFile> >::const_iterator it = mFiles.begin(); it != mFiles.end(); ++it )
00180 {
00181 if (it->first.startsWith(p+'/'))
00182 {
00183 ref<MemoryFile> mfile = static_cast<MemoryFile*>(it->second->clone().get());
00184 VL_CHECK(mfile)
00185 dir->mFiles[mfile->path()] = mfile;
00186 }
00187 }
00188
00189 if (dir->mFiles.empty())
00190 return NULL;
00191 else
00192 return dir;
00193 }
00194
00195 void MemoryDirectory::listFiles(std::vector<String>& file_list, bool append) const
00196 {
00197 if (!append)
00198 file_list.clear();
00199 if (path().empty())
00200 {
00201 Log::error( "VirtualDirectory::path() must not be empty!\n" );
00202 return;
00203 }
00204 for( std::map< String, ref<MemoryFile> >::const_iterator it = mFiles.begin(); it != mFiles.end(); ++it )
00205 {
00206 if (it->first.extractPath().left(-1) == path())
00207 file_list.push_back( it->first );
00208 }
00209 }
00210
00211 void MemoryDirectory::clone(VirtualDirectory* directory, const String& match)
00212 {
00213 setPath(directory->path());
00214 eraseAllFiles();
00215 std::vector<String> file_list;
00216 directory->listFilesRecursive(file_list, match);
00217 for(unsigned i=0; i<file_list.size(); ++i)
00218 {
00219 ref<VirtualFile> file = directory->file( file_list[i] );
00220 if (file)
00221 {
00222 ref<MemoryFile> mem_file = new MemoryFile;
00223 mem_file->copy(file.get());
00224 mem_file->setPath( file->path() );
00225 addFile(mem_file.get());
00226 }
00227 }
00228 }
00229