1 #include <QtScript/QScriptEngine>
2 
3 #include "Directory.h"
4 #include "FileInformation.h"
5 
6 namespace ADM_qtScript
7 {
8 	static const QDir::Filter qtFilter[] =
9 	{
10 		QDir::Dirs, QDir::Files, QDir::Drives, QDir::NoSymLinks, QDir::Readable, QDir::Writable,
11 		QDir::Executable, QDir::Modified, QDir::Hidden, QDir::System, QDir::AllDirs, QDir::CaseSensitive,
12 		QDir::NoDotAndDotDot, QDir::NoFilter
13 	};
14 
15 	static const Directory::Filter myFilter[] =
16 	{
17 		Directory::Directories, Directory::Files, Directory::Drives, Directory::NoSymLinks,
18 		Directory::Readable, Directory::Writable, Directory::Executable, Directory::Modified,
19 		Directory::Hidden, Directory::System, Directory::AllDirectories, Directory::CaseSensitive,
20 		Directory::NoDotAndDotDot, Directory::NoFilter
21 	};
22 
23 	static const QDir::SortFlag qtSort[] =
24 	{
25 		QDir::Name, QDir::Time, QDir::Size, QDir::Unsorted, QDir::DirsFirst, QDir::Reversed,
26 		QDir::IgnoreCase, QDir::DirsLast, QDir::LocaleAware, QDir::Type, QDir::NoSort
27 	};
28 
29 	static const Directory::Sort mySort[] =
30 	{
31 		Directory::Name, Directory::Time, Directory::Size, Directory::Unsorted, Directory::DirectoriesFirst,
32 		Directory::Reversed, Directory::IgnoreCase, Directory::DirectoriesLast, Directory::LocaleAware,
33 		Directory::Type, Directory::NoSort
34 	};
35 
Directory(QString path)36 	Directory::Directory(QString path)
37 	{
38 		_dir = QDir(path);
39 	}
40 
Directory(QString path,QString nameFilter,Sort sort,Filter filter)41 	Directory::Directory(
42 		QString path, QString nameFilter, Sort sort, Filter filter)
43 	{
44 		_dir = QDir(path, nameFilter, this->getQtSortFlags(sort), this->getQtFilters(filter));
45 	}
46 
constructor(QScriptContext * context,QScriptEngine * engine)47 	QScriptValue Directory::constructor(QScriptContext *context, QScriptEngine *engine)
48 	{
49 		if (context->isCalledAsConstructor())
50 		{
51 			if (context->argumentCount() == 0)
52 			{
53 				return engine->newQObject(new Directory(), QScriptEngine::ScriptOwnership);
54 			}
55 			else if (context->argumentCount() == 1)
56 			{
57 				return engine->newQObject(
58 						   new Directory(context->argument(0).toString()), QScriptEngine::ScriptOwnership);
59 			}
60 			else if (context->argumentCount() == 2)
61 			{
62 				return engine->newQObject(
63 						   new Directory(
64 							   context->argument(0).toString(), context->argument(1).toString()),
65 						   QScriptEngine::ScriptOwnership);
66 			}
67 			else if (context->argumentCount() == 3 && context->argument(2).isNumber())
68 			{
69 				return engine->newQObject(
70 						   new Directory(
71 							   context->argument(0).toString(), context->argument(1).toString(),
72 							   (Directory::Sort)context->argument(2).toNumber()),
73 						   QScriptEngine::ScriptOwnership);
74 			}
75 			else if (context->argumentCount() == 4 && context->argument(2).isNumber() &&
76 					 context->argument(3).isNumber())
77 			{
78 				return engine->newQObject(
79 						   new Directory(
80 							   context->argument(0).toString(), context->argument(1).toString(),
81 							   (Directory::Sort)context->argument(2).toNumber(),
82 							   (Directory::Filter)context->argument(3).toNumber()),
83 						   QScriptEngine::ScriptOwnership);
84 			}
85 			else
86 			{
87 				return context->throwError("Invalid arguments passed to constructor");
88 			}
89 		}
90 
91 		return engine->undefinedValue();
92 	}
93 
getMyFilters(QDir::Filters qtFilters)94 	Directory::Filters Directory::getMyFilters(QDir::Filters qtFilters)
95 	{
96 		Directory::Filters myFilters;
97 
98 		for (unsigned int i = 0; i < (sizeof(qtFilter) / sizeof(QDir::Filter)); i++)
99 		{
100 			if (qtFilters.testFlag(qtFilter[i]))
101 			{
102 				myFilters |= myFilter[i];
103 			}
104 		}
105 
106 		return myFilters;
107 	}
108 
getMySortFlags(QDir::SortFlags qtSortFlags)109 	Directory::SortFlags Directory::getMySortFlags(QDir::SortFlags qtSortFlags)
110 	{
111 		Directory::SortFlags mySortFlags;
112 
113 		for (unsigned int i = 0; i < (sizeof(qtSort) / sizeof(QDir::SortFlag)); i++)
114 		{
115 			if (qtSortFlags.testFlag(qtSort[i]))
116 			{
117 				mySortFlags |= mySort[i];
118 			}
119 		}
120 
121 		return mySortFlags;
122 	}
123 
getQtFilters(Directory::Filters myFilters)124 	QDir::Filters Directory::getQtFilters(Directory::Filters myFilters)
125 	{
126 		QDir::Filters qtFilters;
127 
128 		for (unsigned int i = 0; i < (sizeof(myFilter) / sizeof(Directory::Filter)); i++)
129 		{
130 			if (myFilters.testFlag(myFilter[i]))
131 			{
132 				qtFilters |= qtFilter[i];
133 			}
134 		}
135 
136 		return qtFilters;
137 	}
138 
getQtSortFlags(Directory::SortFlags mySortFlags)139 	QDir::SortFlags Directory::getQtSortFlags(Directory::SortFlags mySortFlags)
140 	{
141 		QDir::SortFlags qtSortFlags;
142 
143 		for (unsigned int i = 0; i < (sizeof(mySort) / sizeof(Directory::Sort)); i++)
144 		{
145 			if (mySortFlags.testFlag(mySort[i]))
146 			{
147 				qtSortFlags |= qtSort[i];
148 			}
149 		}
150 
151 		return qtSortFlags;
152 	}
153 
getPath()154 	QString Directory::getPath()
155 	{
156 		return _dir.path();
157 	}
158 
setPath(const QString & path)159 	void Directory::setPath(const QString &path)
160 	{
161 		_dir.setPath(path);
162 	}
163 
getAbsolutePath()164 	QString Directory::getAbsolutePath()
165 	{
166 		return _dir.absolutePath();
167 	}
168 
getCanonicalPath()169 	QString Directory::getCanonicalPath()
170 	{
171 		return _dir.canonicalPath();
172 	}
173 
getDirectoryName()174 	QString Directory::getDirectoryName()
175 	{
176 		return _dir.dirName();
177 	}
178 
filePath(QString fileName)179 	QString Directory::filePath(QString fileName)
180 	{
181 		return _dir.filePath(fileName);
182 	}
183 
absoluteFilePath(QString fileName)184 	QString Directory::absoluteFilePath(QString fileName)
185 	{
186 		return _dir.absoluteFilePath(fileName);
187 	}
188 
relativeFilePath(QString fileName)189 	QString Directory::relativeFilePath(QString fileName)
190 	{
191 		return _dir.relativeFilePath(fileName);
192 	}
193 
toNativeSeparators(QString pathName)194 	QString Directory::toNativeSeparators(QString pathName)
195 	{
196 		return QDir::toNativeSeparators(pathName);
197 	}
198 
fromNativeSeparators(QString pathName)199 	QString Directory::fromNativeSeparators(QString pathName)
200 	{
201 		return QDir::fromNativeSeparators(pathName);
202 	}
203 
changeDirectory(QString dirName)204 	bool Directory::changeDirectory(QString dirName)
205 	{
206 		return _dir.cd(dirName);
207 	}
208 
changeDirectoryUp()209 	bool Directory::changeDirectoryUp()
210 	{
211 		return _dir.cdUp();
212 	}
213 
getNameFilters()214 	QScriptValue Directory::getNameFilters()
215 	{
216 		QStringList filters = _dir.nameFilters();
217 		QScriptValue array = this->engine()->newArray(filters.length());
218 
219 		for (int filterIndex = 0; filterIndex < filters.length(); filterIndex++)
220 		{
221 			array.setProperty(filterIndex, filters[filterIndex]);
222 		}
223 
224 		return array;
225 	}
226 
setNameFilters(QScriptValue nameFilters)227 	void Directory::setNameFilters(QScriptValue nameFilters)
228 	{
229 		if (nameFilters.isArray())
230 		{
231 			QStringList list;
232 
233 			qScriptValueToSequence(nameFilters, list);
234 			_dir.setNameFilters(list);
235 		}
236 	}
237 
getFilter()238 	Directory::Filter Directory::getFilter()
239 	{
240 		return (Filter)(int)this->getMyFilters(_dir.filter());
241 	}
242 
setFilter(Filter filter)243 	void Directory::setFilter(Filter filter)
244 	{
245 		_dir.setFilter(this->getQtFilters(filter));
246 	}
247 
getSorting()248 	Directory::Sort Directory::getSorting()
249 	{
250 		return (Sort)(int)this->getMySortFlags(_dir.sorting());
251 	}
252 
setSorting(Sort sort)253 	void Directory::setSorting(Sort sort)
254 	{
255 		_dir.setSorting(this->getQtSortFlags(sort));
256 	}
257 
getCount()258 	uint Directory::getCount()
259 	{
260 		return _dir.count();
261 	}
262 
entryList(Filter filters,Sort sort)263 	QScriptValue Directory::entryList(Filter filters, Sort sort)
264 	{
265 		QStringList list = _dir.entryList(this->getQtFilters(filters), this->getQtSortFlags(sort));
266 		QScriptValue array = this->engine()->newArray(list.length());
267 
268 		for (int listIndex = 0; listIndex < list.length(); listIndex++)
269 		{
270 			array.setProperty(listIndex, list[listIndex]);
271 		}
272 
273 		return array;
274 	}
275 
entryList(QScriptValue nameFilters,Filter filters,Sort sort)276 	QScriptValue Directory::entryList(QScriptValue nameFilters, Filter filters, Sort sort)
277 	{
278 		QStringList filterList;
279 
280 		if (nameFilters.isArray())
281 		{
282 			qScriptValueToSequence(nameFilters, filterList);
283 		}
284 		else
285 		{
286 			return this->context()->throwError("nameFilters is an invalid type");
287 		}
288 
289 		QStringList list = _dir.entryList(
290 							   filterList, this->getQtFilters(filters), this->getQtSortFlags(sort));
291 		QScriptValue array = this->engine()->newArray(list.length());
292 
293 		for (int listIndex = 0; listIndex < list.length(); listIndex++)
294 		{
295 			array.setProperty(listIndex, list[listIndex]);
296 		}
297 
298 		return array;
299 	}
300 
entryInfoList(Filter filters,Sort sort)301 	QScriptValue Directory::entryInfoList(Filter filters, Sort sort)
302 	{
303 		QFileInfoList list = _dir.entryInfoList(this->getQtFilters(filters), this->getQtSortFlags(sort));
304 		QScriptValue array = this->engine()->newArray(list.length());
305 
306 		for (int listIndex = 0; listIndex < list.length(); listIndex++)
307 		{
308 			array.setProperty(listIndex, this->engine()->newQObject(
309 				new FileInformation(list[listIndex]), QScriptEngine::ScriptOwnership));
310 		}
311 
312 		return array;
313 	}
314 
entryInfoList(QScriptValue nameFilters,Filter filters,Sort sort)315 	QScriptValue Directory::entryInfoList(QScriptValue nameFilters, Filter filters, Sort sort)
316 	{
317 		QStringList filterList;
318 
319 		if (nameFilters.isArray())
320 		{
321 			qScriptValueToSequence(nameFilters, filterList);
322 		}
323 		else
324 		{
325 			return this->context()->throwError("nameFilters is an invalid type");
326 		}
327 
328 		QFileInfoList list = _dir.entryInfoList(filterList, this->getQtFilters(filters), this->getQtSortFlags(sort));
329 		QScriptValue array = this->engine()->newArray(list.length());
330 
331 		for (int listIndex = 0; listIndex < list.length(); listIndex++)
332 		{
333 			array.setProperty(listIndex, this->engine()->newQObject(
334 				new FileInformation(list[listIndex]), QScriptEngine::ScriptOwnership));
335 		}
336 
337 		return array;
338 	}
339 
makeDirectory(QString dirName)340 	bool Directory::makeDirectory(QString dirName)
341 	{
342 		return _dir.mkdir(dirName);
343 	}
344 
removeDirectory(QString dirName)345 	bool Directory::removeDirectory(QString dirName)
346 	{
347 		return _dir.rmdir(dirName);
348 	}
349 
makePath(QString dirPath)350 	bool Directory::makePath(QString dirPath)
351 	{
352 		return _dir.mkpath(dirPath);
353 	}
354 
removePath(QString dirPath)355 	bool Directory::removePath(QString dirPath)
356 	{
357 		return _dir.rmpath(dirPath);
358 	}
359 
isReadable()360 	bool Directory::isReadable()
361 	{
362 		return _dir.isReadable();
363 	}
364 
exists()365 	bool Directory::exists()
366 	{
367 		return _dir.exists();
368 	}
369 
isRoot()370 	bool Directory::isRoot()
371 	{
372 		return _dir.isRoot();
373 	}
374 
isRelative()375 	bool Directory::isRelative()
376 	{
377 		return _dir.isRelative();
378 	}
379 
isAbsolute()380 	bool Directory::isAbsolute()
381 	{
382 		return _dir.isAbsolute();
383 	}
384 
makeAbsolute()385 	bool Directory::makeAbsolute()
386 	{
387 		return _dir.makeAbsolute();
388 	}
389 
remove(QString fileName)390 	bool Directory::remove(QString fileName)
391 	{
392 		return _dir.remove(fileName);
393 	}
394 
rename(QString oldName,QString newName)395 	bool Directory::rename(QString oldName, QString newName)
396 	{
397 		return _dir.rename(oldName, newName);
398 	}
399 
exists(QString name)400 	bool Directory::exists(QString name)
401 	{
402 		return _dir.exists(name);
403 	}
404 
getSeparator()405 	QString Directory::getSeparator()
406 	{
407 		return _dir.separator();
408 	}
409 
getCurrentPath()410 	QString Directory::getCurrentPath()
411 	{
412 		return QDir::currentPath();
413 	}
414 
setCurrentPath(QString path)415 	bool Directory::setCurrentPath(QString path)
416 	{
417 		return QDir::setCurrent(path);
418 	}
419 
getHomePath()420 	QString Directory::getHomePath()
421 	{
422 		return QDir::homePath();
423 	}
424 
getRootPath()425 	QString Directory::getRootPath()
426 	{
427 		return QDir::rootPath();
428 	}
429 
getTempPath()430 	QString Directory::getTempPath()
431 	{
432 		return QDir::tempPath();
433 	}
434 
getDrives()435 	QScriptValue Directory::getDrives()
436 	{
437 		QFileInfoList list = _dir.drives();
438 		QScriptValue array = this->engine()->newArray(list.length());
439 
440 		for (int listIndex = 0; listIndex < list.length(); listIndex++)
441 		{
442 			array.setProperty(listIndex, this->engine()->newQObject(
443 				new FileInformation(list[listIndex]), QScriptEngine::ScriptOwnership));
444 		}
445 
446 		return array;
447 	}
448 
match(QScriptValue filters,QString fileName)449 	bool Directory::match(QScriptValue filters, QString fileName)
450 	{
451 		QStringList filterList;
452 
453 		if (filters.isArray())
454 		{
455 			qScriptValueToSequence(filters, filterList);
456 		}
457 		else
458 		{
459 			this->context()->throwError("filters is an invalid type");
460 			return false;
461 		}
462 
463 		return QDir::match(filterList, fileName);
464 	}
465 
match(QString filter,QString fileName)466 	bool Directory::match(QString filter, QString fileName)
467 	{
468 		return QDir::match(filter, fileName);
469 	}
470 
cleanPath(QString path)471 	QString Directory::cleanPath(QString path)
472 	{
473 		return _dir.cleanPath(path);
474 	}
475 
refresh()476 	void Directory::refresh()
477 	{
478 		_dir.refresh();
479 	}
480 }
481