ariaNgNativeElectronService.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. (function () {
  2. 'use strict';
  3. angular.module('ariaNg').factory('ariaNgNativeElectronService', ['$q', 'ariaNgLogService', 'ariaNgLocalizationService', function ($q, ariaNgLogService, ariaNgLocalizationService) {
  4. var electron = angular.isFunction(window.nodeRequire) ? nodeRequire('electron') : {};
  5. var ipcRenderer = electron.ipcRenderer || {};
  6. var onMainProcessEvent = function (channel, callback) {
  7. ipcRenderer.on && ipcRenderer.on(channel, callback);
  8. };
  9. var removeMainProcessEvent = function (channel, callback) {
  10. ipcRenderer.removeListener && ipcRenderer.removeListener(channel, callback);
  11. };
  12. var invokeMainProcessMethod = function (channel, ...args) {
  13. ipcRenderer.send && ipcRenderer.send(channel, ...args);
  14. };
  15. var invokeMainProcessMethodSync = function (channel, ...args) {
  16. if (!ipcRenderer.sendSync) {
  17. return null;
  18. }
  19. return ipcRenderer.sendSync(channel, ...args);
  20. };
  21. var invokeMainProcessMethodAsync = function (channel, ...args) {
  22. if (!ipcRenderer.invoke) {
  23. return null;
  24. }
  25. return ipcRenderer.invoke(channel, ...args);
  26. };
  27. onMainProcessEvent('on-main-log-debug', function (event, msg, obj) {
  28. ariaNgLogService.debug(msg, obj);
  29. });
  30. onMainProcessEvent('on-main-log-info', function (event, msg, obj) {
  31. ariaNgLogService.info(msg, obj);
  32. });
  33. onMainProcessEvent('on-main-log-warn', function (event, msg, obj) {
  34. ariaNgLogService.warn(msg, obj);
  35. });
  36. onMainProcessEvent('on-main-log-error', function (event, msg, obj) {
  37. ariaNgLogService.error(msg, obj);
  38. });
  39. invokeMainProcessMethod('on-render-electron-service-inited');
  40. return {
  41. getRuntimeEnvironment: function () {
  42. return invokeMainProcessMethodSync('render-sync-get-runtime-environment');
  43. },
  44. getVersion: function() {
  45. return invokeMainProcessMethodSync('render-sync-get-global-setting', 'version');
  46. },
  47. getAriaNgVersion: function() {
  48. return invokeMainProcessMethodSync('render-sync-get-global-setting', 'ariaNgVersion');
  49. },
  50. isDevMode: function () {
  51. return invokeMainProcessMethodSync('render-sync-get-global-setting', 'isDevMode');
  52. },
  53. useCustomAppTitle: function () {
  54. return invokeMainProcessMethodSync('render-sync-get-global-setting', 'useCustomAppTitle');
  55. },
  56. getWindowMaximizedAsync: function (callback) {
  57. return invokeMainProcessMethodAsync('render-get-native-window-maximized')
  58. .then(function onReceive(maximized) {
  59. if (callback) {
  60. callback(maximized);
  61. }
  62. });
  63. },
  64. minimizeWindow: function () {
  65. invokeMainProcessMethod('render-minimize-native-window');
  66. },
  67. maximizeOrRestoreWindow: function () {
  68. invokeMainProcessMethod('render-maximize-or-restore-native-window');
  69. },
  70. reload: function () {
  71. invokeMainProcessMethod('render-reload-native-window');
  72. },
  73. exitApp: function () {
  74. invokeMainProcessMethod('render-exit-native-app');
  75. },
  76. showTextboxContextMenu: function (context) {
  77. invokeMainProcessMethod('render-show-textbox-context-menu', context);
  78. },
  79. setApplicationMenu: function () {
  80. invokeMainProcessMethod('render-update-app-menu-label', {
  81. AboutAriaNgNative: ariaNgLocalizationService.getLocalizedText('menu.AboutAriaNgNative'),
  82. Services: ariaNgLocalizationService.getLocalizedText('menu.Services'),
  83. HideAriaNgNative: ariaNgLocalizationService.getLocalizedText('menu.HideAriaNgNative'),
  84. HideOthers: ariaNgLocalizationService.getLocalizedText('menu.HideOthers'),
  85. ShowAll: ariaNgLocalizationService.getLocalizedText('menu.ShowAll'),
  86. QuitAriaNgNative: ariaNgLocalizationService.getLocalizedText('menu.QuitAriaNgNative'),
  87. Edit: ariaNgLocalizationService.getLocalizedText('menu.Edit'),
  88. Undo: ariaNgLocalizationService.getLocalizedText('menu.Undo'),
  89. Redo: ariaNgLocalizationService.getLocalizedText('menu.Redo'),
  90. Cut: ariaNgLocalizationService.getLocalizedText('menu.Cut'),
  91. Copy: ariaNgLocalizationService.getLocalizedText('menu.Copy'),
  92. Paste: ariaNgLocalizationService.getLocalizedText('menu.Paste'),
  93. Delete: ariaNgLocalizationService.getLocalizedText('menu.Delete'),
  94. SelectAll: ariaNgLocalizationService.getLocalizedText('menu.SelectAll'),
  95. Window: ariaNgLocalizationService.getLocalizedText('menu.Window'),
  96. Minimize: ariaNgLocalizationService.getLocalizedText('menu.Minimize'),
  97. Zoom: ariaNgLocalizationService.getLocalizedText('menu.Zoom'),
  98. BringAllToFront: ariaNgLocalizationService.getLocalizedText('menu.BringAllToFront')
  99. });
  100. },
  101. setTrayMenu: function () {
  102. invokeMainProcessMethod('render-update-tray-menu-label', {
  103. ShowAriaNgNative: ariaNgLocalizationService.getLocalizedText('tray.ShowAriaNgNative'),
  104. Exit: ariaNgLocalizationService.getLocalizedText('tray.Exit')
  105. });
  106. },
  107. setTrayToolTip: function (value) {
  108. invokeMainProcessMethod('render-update-tray-tip', value);
  109. },
  110. setMainWindowLanguage: function () {
  111. this.setApplicationMenu();
  112. this.setTrayMenu();
  113. },
  114. getNativeConfig: function () {
  115. var config = invokeMainProcessMethodSync('render-sync-get-native-config');
  116. var cfg = {};
  117. for (var key in config) {
  118. if (!config.hasOwnProperty(key)) {
  119. continue;
  120. }
  121. cfg[key] = angular.copy(config[key]);
  122. }
  123. return cfg;
  124. },
  125. setDefaultPosition: function (value) {
  126. invokeMainProcessMethod('render-set-native-config-default-position', value);
  127. },
  128. setMinimizedToTray: function (value) {
  129. invokeMainProcessMethod('render-set-native-config-minimized-to-tray', value);
  130. },
  131. setExecCommandOnStartup: function (value) {
  132. invokeMainProcessMethod('render-set-native-config-exec-command-on-startup', value);
  133. },
  134. setExecCommandArgumentsOnStartup: function (value) {
  135. invokeMainProcessMethod('render-set-native-config-exec-command-arguments-on-startup', value);
  136. },
  137. setExecDetachedCommandOnStartup: function (value) {
  138. invokeMainProcessMethod('render-set-native-config-exec-detached-command-on-startup', value);
  139. },
  140. getLastCheckUpdatesTimeAsync: function (callback) {
  141. return invokeMainProcessMethodAsync('render-get-native-config-last-check-updates-time')
  142. .then(function onReceive(lastCheckUpdatesTime) {
  143. if (callback) {
  144. callback(lastCheckUpdatesTime);
  145. }
  146. });
  147. },
  148. setLastCheckUpdatesTime: function (value) {
  149. invokeMainProcessMethod('render-set-native-config-last-check-updates-time', value);
  150. },
  151. getStartupCommandOutputAsync: function () {
  152. return invokeMainProcessMethodAsync('render-get-startup-command-process-output');
  153. },
  154. requestHttp: function (requestContext) {
  155. var deferred = $q.defer();
  156. invokeMainProcessMethodAsync('render-request-http', requestContext)
  157. .then(function onReceive(result) {
  158. if (result && result.success) {
  159. deferred.resolve(result.response);
  160. } else {
  161. deferred.reject(result.response);
  162. }
  163. }).catch(function onError() {
  164. deferred.reject({});
  165. });
  166. return deferred.promise;
  167. },
  168. createWebSocketClient: function (rpcUrl, options) {
  169. var WebSocketClient = function (rpcUrl, options) {
  170. var openCallback = null;
  171. var closeCallback = null;
  172. var messageCallback = null;
  173. Object.defineProperty(WebSocketClient.prototype, 'readyState', {
  174. get: function get() {
  175. return invokeMainProcessMethodSync('render-get-websocket-readystate');
  176. },
  177. set: function set() {
  178. throw new Error('The \"readyState\" property is readonly.');
  179. }
  180. });
  181. this.send = function (request) {
  182. invokeMainProcessMethod('render-send-websocket-message', {
  183. url: rpcUrl,
  184. data: request
  185. });
  186. };
  187. this.reconnect = function () {
  188. invokeMainProcessMethod('render-reconnect-websocket', rpcUrl, options);
  189. };
  190. this.onOpen = function (callback) {
  191. openCallback = callback;
  192. };
  193. this.onClose = function (callback) {
  194. closeCallback = callback;
  195. };
  196. this.onMessage = function (callback) {
  197. messageCallback = callback;
  198. };
  199. onMainProcessEvent('on-main-websocket-open', function (event, e) {
  200. if (e.url !== rpcUrl) {
  201. ariaNgLogService.debug('[ariaNgNativeElectronService.websocket.onOpen] event dropped, because rpc url not equals, excepted url: ' + rpcUrl + ", actual url: " + e.url);
  202. return;
  203. }
  204. if (angular.isFunction(openCallback)) {
  205. openCallback(e);
  206. }
  207. });
  208. onMainProcessEvent('on-main-websocket-close', function (event, e) {
  209. if (e.url !== rpcUrl) {
  210. ariaNgLogService.debug('[ariaNgNativeElectronService.websocket.onClose] event dropped, because rpc url not equals, excepted url: ' + rpcUrl + ", actual url: " + e.url);
  211. return;
  212. }
  213. if (angular.isFunction(closeCallback)) {
  214. closeCallback(e);
  215. }
  216. });
  217. onMainProcessEvent('on-main-websocket-message', function (event, message) {
  218. if (message.url !== rpcUrl) {
  219. ariaNgLogService.debug('[ariaNgNativeElectronService.websocket.onMessage] event dropped, because rpc url not equals, excepted url: ' + rpcUrl + ", actual url: " + message.url, message.data);
  220. return;
  221. }
  222. if (angular.isFunction(messageCallback)) {
  223. messageCallback(message);
  224. }
  225. });
  226. invokeMainProcessMethod('render-connect-websocket', rpcUrl, options);
  227. };
  228. return new WebSocketClient(rpcUrl, options);
  229. },
  230. openProjectLink: function () {
  231. invokeMainProcessMethod('render-open-external-url', 'https://github.com/mayswind/AriaNg-Native');
  232. },
  233. openProjectReleaseLink: function () {
  234. invokeMainProcessMethod('render-open-external-url', 'https://github.com/mayswind/AriaNg-Native/releases');
  235. },
  236. readPackageFile: function (path) {
  237. return invokeMainProcessMethodSync('render-sync-get-package-file-content', path);
  238. },
  239. getLocalFSExistsAsync: function (fullpath, callback) {
  240. return invokeMainProcessMethodAsync('render-get-localfs-exists', fullpath)
  241. .then(function onReceive(exists) {
  242. if (callback) {
  243. callback(exists);
  244. }
  245. });
  246. },
  247. openFileInDirectory: function (dir, filename) {
  248. invokeMainProcessMethod('render-open-local-directory', dir, filename);
  249. },
  250. showOpenFileDialogAsync: function (filters, callback) {
  251. return invokeMainProcessMethodAsync('render-show-open-file-dialog', filters)
  252. .then(function onReceive(result) {
  253. if (callback) {
  254. callback({
  255. canceled: result.canceled,
  256. filePaths: result.filePaths
  257. });
  258. }
  259. });
  260. },
  261. parseBittorrentInfo: function (data) {
  262. var info = angular.copy(invokeMainProcessMethodSync('render-sync-parse-bittorrent-info', data));
  263. info.type = 'bittorrent';
  264. ariaNgLogService.debug('[ariaNgNativeElectronService.parseBittorrentInfo] bittorrent info', info);
  265. return info;
  266. },
  267. notifyMainProcessViewLoaded: function (locationPath) {
  268. invokeMainProcessMethod('on-render-view-content-loaded', locationPath);
  269. },
  270. notifyMainProcessorNewDropFile: function (message) {
  271. invokeMainProcessMethod('on-render-new-drop-file', message);
  272. },
  273. notifyMainProcessorNewDropText: function (message) {
  274. invokeMainProcessMethod('on-render-new-drop-text', message);
  275. },
  276. onMainWindowMaximize: function (callback) {
  277. onMainProcessEvent('on-main-window-maximized', callback);
  278. },
  279. onMainWindowUnmaximize: function (callback) {
  280. onMainProcessEvent('on-main-window-unmaximized', callback);
  281. },
  282. onMainProcessShowError: function (callback) {
  283. onMainProcessEvent('on-main-show-error', callback);
  284. },
  285. onMainProcessNavigateTo: function (callback) {
  286. onMainProcessEvent('on-main-navigate-to', callback);
  287. },
  288. onMainProcessNewTaskFromFile: function (callback) {
  289. onMainProcessEvent('on-main-new-task-from-file', callback);
  290. },
  291. onMainProcessNewTaskFromText: function (callback) {
  292. onMainProcessEvent('on-main-new-task-from-text', callback);
  293. },
  294. removeMainProcessNewTaskFromFileCallback: function (callback) {
  295. removeMainProcessEvent('on-main-new-task-from-file', callback);
  296. },
  297. removeMainProcessNewTaskFromTextCallback: function (callback) {
  298. removeMainProcessEvent('on-main-new-task-from-text', callback);
  299. }
  300. };
  301. }]);
  302. }());