/js/misc/fileUtils.js

https://gitlab.com/tchaik/gnome-shell · JavaScript · 100 lines · 82 code · 15 blank · 3 comment · 24 complexity · 034009263fb16b286116108eef60d321 MD5 · raw file

  1. // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
  2. const Gio = imports.gi.Gio;
  3. const GLib = imports.gi.GLib;
  4. const Lang = imports.lang;
  5. const Config = imports.misc.config;
  6. const Params = imports.misc.params;
  7. function collectFromDatadirs(subdir, includeUserDir, processFile) {
  8. let dataDirs = GLib.get_system_data_dirs();
  9. if (includeUserDir)
  10. dataDirs.unshift(GLib.get_user_data_dir());
  11. for (let i = 0; i < dataDirs.length; i++) {
  12. let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', subdir]);
  13. let dir = Gio.File.new_for_path(path);
  14. let fileEnum;
  15. try {
  16. fileEnum = dir.enumerate_children('standard::name,standard::type',
  17. Gio.FileQueryInfoFlags.NONE, null);
  18. } catch (e) {
  19. fileEnum = null;
  20. }
  21. if (fileEnum != null) {
  22. let info;
  23. while ((info = fileEnum.next_file(null)))
  24. processFile(fileEnum.get_child(info), info);
  25. }
  26. }
  27. }
  28. function deleteGFile(file) {
  29. // Work around 'delete' being a keyword in JS.
  30. return file['delete'](null);
  31. }
  32. function recursivelyDeleteDir(dir, deleteParent) {
  33. let children = dir.enumerate_children('standard::name,standard::type',
  34. Gio.FileQueryInfoFlags.NONE, null);
  35. let info, child;
  36. while ((info = children.next_file(null)) != null) {
  37. let type = info.get_file_type();
  38. let child = dir.get_child(info.get_name());
  39. if (type == Gio.FileType.REGULAR)
  40. deleteGFile(child);
  41. else if (type == Gio.FileType.DIRECTORY)
  42. recursivelyDeleteDir(child, true);
  43. }
  44. if (deleteParent)
  45. deleteGFile(dir);
  46. }
  47. function recursivelyMoveDir(srcDir, destDir) {
  48. let children = srcDir.enumerate_children('standard::name,standard::type',
  49. Gio.FileQueryInfoFlags.NONE, null);
  50. if (!destDir.query_exists(null))
  51. destDir.make_directory_with_parents(null);
  52. let info, child;
  53. while ((info = children.next_file(null)) != null) {
  54. let type = info.get_file_type();
  55. let srcChild = srcDir.get_child(info.get_name());
  56. let destChild = destDir.get_child(info.get_name());
  57. if (type == Gio.FileType.REGULAR)
  58. srcChild.move(destChild, Gio.FileCopyFlags.NONE, null, null);
  59. else if (type == Gio.FileType.DIRECTORY)
  60. recursivelyMoveDir(srcChild, destChild);
  61. }
  62. }
  63. let _ifaceResource = null;
  64. function loadInterfaceXML(iface) {
  65. if (!_ifaceResource) {
  66. // don't use global.datadir so the method is usable from tests/tools
  67. let dir = GLib.getenv ('GNOME_SHELL_DATADIR') || Config.PKGDATADIR;
  68. let path = dir + '/gnome-shell-dbus-interfaces.gresource';
  69. _ifaceResource = Gio.Resource.load(path);
  70. _ifaceResource._register();
  71. }
  72. let xml = null;
  73. let uri = 'resource:///org/gnome/shell/dbus-interfaces/' + iface + '.xml';
  74. let f = Gio.File.new_for_uri(uri);
  75. try {
  76. let [ok, bytes] = f.load_contents(null);
  77. if (bytes instanceof Uint8Array)
  78. xml = imports.byteArray.toString(bytes)
  79. else
  80. xml = bytes.toString();
  81. } catch (e) {
  82. log('Failed to load D-Bus interface ' + iface);
  83. }
  84. return xml;
  85. }