ipc.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. 'use strict';
  2. const fs = require('fs');
  3. const path = require('path');
  4. const url = require('url');
  5. const electron = require('electron');
  6. const pkgfile = require('../package');
  7. const core = require('./core');
  8. const config = require('./config');
  9. const menu = require('./menu');
  10. const tray = require('./tray');
  11. const localfs = require('./localfs');
  12. const bittorrent = require('./bittorrent');
  13. const shell = electron.shell;
  14. const ipcMain = electron.ipcMain;
  15. const supportedFileExtensions = {
  16. '.torrent': 'torrent',
  17. '.meta4': 'metalink',
  18. '.metalink': 'metalink'
  19. };
  20. let isContainsSupportedFileArg = function (arg) {
  21. if (!arg) {
  22. return false;
  23. }
  24. let fileExtension = path.extname(arg);
  25. if (!supportedFileExtensions[fileExtension]) {
  26. return false;
  27. }
  28. return fs.existsSync(arg);
  29. };
  30. let getIndexUrl = function () {
  31. return url.format({
  32. protocol: 'file',
  33. slashes: true,
  34. pathname: path.join(__dirname, '..', pkgfile.entry)
  35. });
  36. };
  37. let loadIndexUrl = function () {
  38. core.mainWindow.loadURL(getIndexUrl());
  39. };
  40. let loadNewTaskUrl = function () {
  41. core.mainWindow.loadURL(getIndexUrl() + '#!/new');
  42. };
  43. let notifyRenderProcessWindowMaximized = function (maximized) {
  44. core.mainWindow.webContents.send('on-main-window-maximized', maximized);
  45. };
  46. let notifyRenderProcessWindowUnmaximized = function (maximized) {
  47. core.mainWindow.webContents.send('on-main-window-unmaximized', maximized);
  48. };
  49. let notifyRenderProcessShowErrorMessage = function (message) {
  50. core.mainWindow.webContents.send('on-main-show-error', message);
  51. };
  52. let notifyRenderProcessNavigateToPath = function (routeUrl) {
  53. core.mainWindow.webContents.send('on-main-navigate-to', routeUrl);
  54. };
  55. let notifyRenderProcessNavigateToNewTask = function () {
  56. notifyRenderProcessNavigateToPath('/new');
  57. };
  58. let notifyRenderProcessNavigateToAriaNgSettings = function () {
  59. notifyRenderProcessNavigateToPath('/settings/ariang');
  60. };
  61. let notifyRenderProcessNewTaskFromFile = function (filePath, async) {
  62. let fileExtension = path.extname(filePath);
  63. if (!supportedFileExtensions[fileExtension]) {
  64. notifyRenderProcessShowErrorMessage('The selected file type is invalid!');
  65. return;
  66. }
  67. let result = null;
  68. try {
  69. let fileContent = fs.readFileSync(filePath);
  70. result = {
  71. type: supportedFileExtensions[fileExtension],
  72. fileName: path.basename(filePath),
  73. base64Content: Buffer.from(fileContent).toString('base64'),
  74. async: !!async
  75. };
  76. } catch (e) {
  77. result = {
  78. exception: e
  79. }
  80. }
  81. core.mainWindow.webContents.send('on-main-new-task-from-file', result);
  82. };
  83. let notifyRenderProcessNewTaskFromText = function (text, async) {
  84. let result = {
  85. text: text,
  86. async: !!async
  87. };
  88. core.mainWindow.webContents.send('on-main-new-task-from-text', result);
  89. };
  90. let notifyRenderProcessNewNewTaskFromFileAfterViewLoaded = function (filePath) {
  91. if (!filePath) {
  92. return;
  93. }
  94. ipcMain.once('on-render-view-content-loaded', (event, arg) => {
  95. notifyRenderProcessNewTaskFromFile(filePath, true);
  96. });
  97. };
  98. let notifyRenderProcessNewNewTaskFromTextAfterViewLoaded = function (text) {
  99. if (!text) {
  100. return;
  101. }
  102. ipcMain.once('on-render-view-content-loaded', (event, arg) => {
  103. notifyRenderProcessNewTaskFromText(text, true);
  104. });
  105. };
  106. let onRenderProcessNewDropFile = function (callback) {
  107. ipcMain.on('on-render-new-drop-file', callback);
  108. };
  109. let onRenderProcessNewDropText = function (callback) {
  110. ipcMain.on('on-render-new-drop-text', callback);
  111. };
  112. ipcMain.on('render-sync-get-runtime-environment', (event) => {
  113. if (!process || !process.versions) {
  114. return null;
  115. }
  116. var versions = process.versions;
  117. event.returnValue = [
  118. {
  119. name: 'Electron',
  120. value: versions.electron
  121. },
  122. {
  123. name: 'Node.js',
  124. value: versions.node
  125. },
  126. {
  127. name: 'Chrome',
  128. value: versions.chrome
  129. },
  130. {
  131. name: 'V8',
  132. value: versions.v8
  133. }
  134. ];
  135. });
  136. ipcMain.on('render-sync-get-global-setting', (event, key) => {
  137. event.returnValue = global.settings[key];
  138. });
  139. ipcMain.handle('render-get-native-window-maximized', (event) => {
  140. return core.mainWindow.isMaximized();
  141. });
  142. ipcMain.on('render-minimize-native-window', (event) => {
  143. core.mainWindow.minimize();
  144. });
  145. ipcMain.on('render-maximize-or-restore-native-window', (event) => {
  146. if (!core.mainWindow.isMaximized()) {
  147. core.mainWindow.maximize();
  148. } else {
  149. core.mainWindow.unmaximize();
  150. }
  151. });
  152. ipcMain.on('render-reload-native-window', (event) => {
  153. core.mainWindow.reload();
  154. });
  155. ipcMain.on('render-exit-native-app', (event) => {
  156. core.mainWindow.close();
  157. });
  158. ipcMain.on('render-update-app-menu-label', (event, labels) => {
  159. menu.setApplicationMenu({
  160. labels: labels
  161. });
  162. });
  163. ipcMain.on('render-update-tray-menu-label', (event, labels) => {
  164. tray.setContextMenu({
  165. labels: labels
  166. });
  167. });
  168. ipcMain.on('render-update-tray-tip', (event, tooltip) => {
  169. tray.setToolTip(tooltip);
  170. });
  171. ipcMain.on('render-sync-get-native-config', (event) => {
  172. event.returnValue = {
  173. defaultPosition: config.defaultPosition,
  174. minimizedToTray: config.minimizedToTray
  175. };
  176. });
  177. ipcMain.on('render-set-native-config-default-position', (event, value) => {
  178. config.defaultPosition = value;
  179. config.save('defaultPosition');
  180. });
  181. ipcMain.on('render-set-native-config-minimized-to-tray', (event, value) => {
  182. config.minimizedToTray = !!value;
  183. config.save('minimizedToTray');
  184. });
  185. ipcMain.on('render-open-external-url', (event, url) => {
  186. shell.openExternal(url);
  187. });
  188. ipcMain.on('render-sync-get-package-file-content', (event, path) => {
  189. event.returnValue = localfs.readPackageFile(path);
  190. });
  191. ipcMain.handle('render-get-localfs-exists', (event, fullpath) => {
  192. return localfs.isExists(fullpath);
  193. });
  194. ipcMain.on('render-open-local-directory', (event, dir, filename) => {
  195. let fullpath = localfs.getFullPath(dir, filename);
  196. if (localfs.isExists(fullpath)) {
  197. shell.showItemInFolder(fullpath);
  198. } else {
  199. shell.openItem(dir);
  200. }
  201. });
  202. ipcMain.on('render-sync-parse-bittorrent-info', (event, data) => {
  203. event.returnValue = bittorrent.parseBittorrentInfo(data);
  204. });
  205. module.exports = {
  206. isContainsSupportedFileArg: isContainsSupportedFileArg,
  207. loadIndexUrl: loadIndexUrl,
  208. loadNewTaskUrl: loadNewTaskUrl,
  209. notifyRenderProcessWindowMaximized: notifyRenderProcessWindowMaximized,
  210. notifyRenderProcessWindowUnmaximized: notifyRenderProcessWindowUnmaximized,
  211. notifyRenderProcessShowErrorMessage: notifyRenderProcessShowErrorMessage,
  212. notifyRenderProcessNavigateToNewTask: notifyRenderProcessNavigateToNewTask,
  213. notifyRenderProcessNavigateToAriaNgSettings: notifyRenderProcessNavigateToAriaNgSettings,
  214. notifyRenderProcessNewTaskFromFile: notifyRenderProcessNewTaskFromFile,
  215. notifyRenderProcessNewTaskFromText: notifyRenderProcessNewTaskFromText,
  216. notifyRenderProcessNewNewTaskFromFileAfterViewLoaded: notifyRenderProcessNewNewTaskFromFileAfterViewLoaded,
  217. notifyRenderProcessNewNewTaskFromTextAfterViewLoaded: notifyRenderProcessNewNewTaskFromTextAfterViewLoaded,
  218. onRenderProcessNewDropFile: onRenderProcessNewDropFile,
  219. onRenderProcessNewDropText: onRenderProcessNewDropText
  220. };