From b89a7ee8b956c96a1dcee995ea840feddc5d4b27 Mon Sep 17 00:00:00 2001 From: Pierre Frisch Date: Thu, 22 Dec 2011 07:25:50 -0800 Subject: First commit of Ninja to ninja-internal Signed-off-by: Valerio Virgillito --- js/io/system/filesystem.js | 723 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 723 insertions(+) create mode 100644 js/io/system/filesystem.js (limited to 'js/io/system/filesystem.js') diff --git a/js/io/system/filesystem.js b/js/io/system/filesystem.js new file mode 100644 index 00000000..54c16a05 --- /dev/null +++ b/js/io/system/filesystem.js @@ -0,0 +1,723 @@ +/* +This file contains proprietary software owned by Motorola Mobility, Inc.
+No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
+(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. +
*/ + +var FileIo = require("js/io/system/fileio").FileIo, + ProjectIo = require("js/io/system/projectio").ProjectIo, + ShellApi = require("js/io/system/shellapi").ShellApi, + ComponentsPanelBase = require("js/panels/Components/ComponentsPanelBase.reel").ComponentsPanelBase; +//////////////////////////////////////////////////////////////////////// +//Exporting as File System +exports.FileSystem = (require("montage/core/core").Montage).create(Object.prototype, { + //////////////////////////////////////////////////////////////////// + // + init: { + enumerable: false, + value: function () { + //Called by NinjaMain + + + + //Calling Shell API to initialize + ShellApi.init(); + } + }, + + shellApiHandler :{ + enumerable:true, + writable:false, + value:ShellApi + }, + + + //////////////////////////////////////////////////////////////////// + // + cloud: { + enumerable: false, + value: false + }, + //////////////////////////////////////////////////////////////////// + // + cloud: { + enumerable: false, + get: function() { + return this._cloud; + }, + set: function(value) { + this._cloud = value + } + }, + + + + + + + //////////////////////////////////////////////////////////////////// + // + _documentType: { + enumerable: false, + value: function () { + //return DocumentManagerModule.DocumentManager.activeDocument.documentType; // this._documentType() + } + }, + + + + //////////////////////////////////////////////////////////////////// + // + newFile: { + enumerable: false, + value: function (template) { + //Checking for cloud (to be added later) + if (this.cloud) { + //TODO: Add cloud integration + console.log("[CLOUD] New File"); + //documentManagerModule.DocumentManager.openDocument({"type": "html"}); + } else { + // + var file = {uri: ShellApi.openShellDialog({type: 'file', action: 'new'})}, type; + var check = ShellApi.fileExists(file); + + + + + + + + + + + + + + + //TODO: implement createFile to avoid duplicate funtionality + if (check.success) { + switch (check.status) { + case 204: + //TODO: Add logic for already existing file + window.alert('Error Code 204: File already exists.'); + break; + case 404: + //File does not exists, ready to be created + + + //TODO: The type (template) should be sent into this routine via the UI of file I/O (not by file extension as now) + if (template) { + type = template; + } else { + type = file.uri.split('.'); + type = type[type.length-1]; + } + // + + + //TODO: Improve logic + //Checking for file to exist in files template folder + var templateCheck = ShellApi.fileExists({uri: window.NativeShellApp.GetKnownFolder('appsource')+'\\document-templates\\files\\template.'+type}), content; + // + if (templateCheck.success) { + switch (check.status) { + case 204: + //Template exists, so opening and getting contents to be used when creating file + content = ShellApi.openFile({uri: 'template.'+type}); + if (content.content) { + file.content = content.content; + } else { + file.content = ""; + } + break; + case 404: + //No template + file.content = ""; + break; + case 500: + //Error + break; + default: + //Error + break; + } + } else { + + } + + + /* +switch (type.toLowerCase()) { + case 'html': + break; + case 'css': + break; + case 'js': + break; + case 'xml': + break; + case 'json': + break; + default: + break; + } +*/ + + + + + + + + var create = ShellApi.createFile(file); + if (create.success) { + switch (create.status) { + case 201: + //File was created, opening created file + this.openFile(file); + break; + case 400: + //TODO: Add error handling + //window.alert('Error Code 400: File already exists.'); + break; + case 500: + //TODO: Add error handling + //window.alert('Error Code 500: An error occurred while creating a new file.'); + break; + default: + //TODO: Add error handling + //window.alert('Unknown Error: An error occurred while creating a new file.'); + break; + } + } else { + //window.alert('Unknown Error: An error occurred while creating a new file.'); + } + + + + + + + + + + + + + break; + case 500: + //TODO: Add error handling + //window.alert('Error Code 500: An error occurred while creating a new file.'); + break; + default: + //TODO: Add error handling + //window.alert('Unknown Error: An error occurred while creating a new file.'); + break; + } + } else { + //TODO: Add error handling + //window.alert('Unknown Error: An error occurred while creating a new file.'); + } + } + + } + }, + + + + + + //////////////////////////////////////////////////////////////////// + // + newProject: { + enumerable: false, + value: function () { + //Checking for cloud (to be added later) + if (this.cloud) { + //TODO: Add cloud integration + console.log("[CLOUD] : New Project"); + //documentManagerModule.DocumentManager.openDocument({"type": "html"}); + } else { + // + var directory = {uri: ShellApi.openShellDialog({type: 'directory', action: 'new'})}; + var check = ShellApi.directoryExists(directory); + // + if (check.success) { + switch (check.status) { + case 204: + this.createProject(directory); + break; + case 404: + //Directory does not exists, ready to be created + var create = ShellApi.createDirectory(directory); + if (create.success) { + switch (create.status) { + case 201: + this.createProject(directory); + break; + case 400: + window.alert('Error Code 400: Directory already exists.'); + break; + case 500: + window.alert('Error Code 500: An error occurred while creating a new directory.'); + break; + default: + window.alert('Unknown Error: An error occurred while creating a new directory.'); + break; + } + } else { + window.alert('Unknown Error: An error occurred while creating a new directory.'); + } + break; + case 500: + //TODO: Add error handling + window.alert('Error Code 500: An error occurred while creating a new directory.'); + break; + default: + //TODO: Add error handling + window.alert('Unknown Error: An error occurred while creating a new directory.'); + break; + } + } else { + //TODO: Add error handling + window.alert('Unknown Error: An error occurred while creating a new directory.'); + } + } + } + }, + + + + //////////////////////////////////////////////////////////////////// + // + createFile: { + enumerable: false, + value: function (file) { + //Checking for file to exist + var check = ShellApi.fileExists(file), createdFile = null; + // + if (check.success) { + switch (check.status) { + case 204: + //TODO: Add logic for already existing file + break; + case 404: + //File does not exists, ready to be created + var create = ShellApi.createFile(file); + if (create.success) { + switch (create.status) { + case 201: + //File was created + createdFile = file; + break; + case 400: + //File already exists + createdFile = file; + break; + case 500: + //Error while creating + break; + default: + //TODO: Add error handling + break; + } + } else { + //Error creating file via API + } + break; + case 500: + //TODO: Add error handling + break; + default: + //TODO: Add error handling + break; + } + } else { + //TODO: Add error handling + } + // + return createdFile; + } + }, + + + + //////////////////////////////////////////////////////////////////// + // + openFile: { + enumerable: false, + value: function (file) { + var uri, i; + //Checking for file to defined (otherwise prompts for URI) + if (file && file.uri) { + uri = file.uri; + } else { + //Checking to prompt user depending on mode + if (this.cloud) { + //TODO: Add cloud integration + } else { + //Getting file URI from native prompt + uri = ShellApi.openShellDialog({type: 'file', action: 'open'}); + } + } + //Checking for a valid URI + if (uri && uri.length>0) { + //Checking for URI to be single or array of URIs + if (uri.constructor.toString().indexOf('Array') == -1) { + //Opening single URI + shellOpenFile(uri); + } else { + //Opening via loop of URIs + for (i=0; uri[i]; i++) { + shellOpenFile (uri[i]); + } + } + } else { + //No file was selected to be opened, nothing happens + } + //Opening file via shell + function shellOpenFile (f) { + //Getting string from file + var doc = ShellApi.openFile({uri: f}), type = f.split('.'); + //Splitting to get file extension + type = type[type.length-1]; + //TODO: Fix this HACK to generate string + var dir = f.split('\\'), dir_str = '', server; + for (var i=0; i < dir.length-1; i++) { + dir_str += dir[i] + '\\'; + } + //Starting an instance of the shell server on directory + server = ShellApi.startServer(dir_str); + //Opening file in app + FileIo.open(doc, type, f, server); + } + } + }, + + //////////////////////////////////////////////////////////////////// + //Creating unified method to check for success + //FOR: Move, Copy, Rename + directoryMCRCheck: { + enumerable: false, + value: function (r, code) { + //TODO: Add error handling for unsuccessful attempts + var outcome; + // + if (r.success) { + // + outcome = {}; + // + switch (r.status) { + case 204: + //Success + break; + case 400: + //Already exists + break; + case 404: + //Source does not exists + break; + case 500: + //Unknonwn + break; + default: + break; + } + } else { + //TODO: Add error handling + } + // + return outcome; + } + }, + + + //////////////////////////////////////////////////////////////////// + // + createProject: { + enumerable: false, + value: function (directory) { + var mjs_dir = {uri: directory.uri}; + mjs_dir.uri += '\\m-js'; + var mjs_check = ShellApi.directoryExists(mjs_dir); + // + if (mjs_check.success) { + switch (mjs_check.status) { + case 204: + //TODO: Add logic to check for the correct version of m-js + break; + case 404: + //m-js does not exists, ready to be created + + + + + + + //Creating m-js folder and copying contents + var mjs_folder = ShellApi.createDirectory(mjs_dir); + if (mjs_folder.success) { + switch (mjs_folder.status) { + case 201: + //TODO: Add error handling for error on copy sub directories + + + var temp_dir = window.NativeShellApp.GetKnownFolder('appsource')+'\\user-document-templates\\montage-application\\systemio\\new\\project\\montage'; + var mjs_deps = ShellApi.createDirectory({uri: mjs_dir.uri+'\\deps'}); + + //Folder created, now copying contents + var copy_lib = ShellApi.copyDirectory({sourceUri: window.NativeShellApp.GetKnownFolder('frameworksource')+'\\lib', destUri: mjs_dir.uri+'\\lib'}), + copy_deps = ShellApi.copyDirectory({sourceUri: window.NativeShellApp.GetKnownFolder('frameworksource')+'\\deps\\require', destUri: mjs_dir.uri+'\\deps\\require'}), + copy_components = ShellApi.copyDirectory({sourceUri: window.NativeShellApp.GetKnownFolder('appsource')+'\\montage-components', destUri: directory.uri+'\\montage-components'}); + + //Checking for lib operation's result + if (copy_lib.success) { + //Successful copy of directory + } else { + //Error, checking to see reason for error and this method should handling error state + var check_lib = this.directoryMCRCheck(copy_lib, true); + } + + //Checking for deps operation's result + if (copy_deps.success) { + //Successful copy of directory + } else { + //Error, checking to see reason for error and this method should handling error state + var check_deps = this.directoryMCRCheck(copy_deps, true); + } + + //Checking for components operation's result + if (copy_components.success) { + //Successful copy of directory + } else { + //Error, checking to see reason for error and this method should handling error state + var check_components = this.directoryMCRCheck(copy_components, true); + } + + var prj_tmplt = window.NativeShellApp.GetKnownFolder('appsource')+'\\document-templates\\projects\\montage'; + //TODO: Add error handling for file copying, clean up this HACK + var copy_packagemjs = ShellApi.copyFile({sourceUri: window.NativeShellApp.GetKnownFolder('frameworksource')+'\\package.json', destUri: mjs_dir.uri+'\\package.json'}), + copy_styles = ShellApi.copyFile({sourceUri: prj_tmplt+'\\styles.css', destUri: directory.uri+'\\styles.css'}), + copy_appdelegate = ShellApi.copyFile({sourceUri: prj_tmplt+'\\appdelegate.js', destUri: directory.uri+'\\appdelegate.js'}), + copy_package = ShellApi.copyFile({sourceUri: prj_tmplt+'\\package.json', destUri: directory.uri+'\\package.json'}), + copy_index = ShellApi.copyFile({sourceUri: prj_tmplt+'\\index.html', destUri: directory.uri+'\\index.html'}); + + // + this.openProject(directory); + + + + + break; + case 400: + //TODO: Add logic to handle already existing copy of m-js + break; + case 500: + //TODO: Add error handling + break; + default: + //TODO: Add error handling + break; + } + } else { + //TODO: Add error handling + } + + + + + + + + + break; + case 500: + //TODO: Add error handling + break; + default: + //TODO: Add error handling + break; + } + } else { + //TODO: Add error handling + } + } + }, + + + + //////////////////////////////////////////////////////////////////// + // + openProject: { + enumerable: false, + value: function (directory) { + //TODO: Add functionality, this is a HACK + + + + + + var uri, i; + //Checking for directory to defined (otherwise prompts for URI) + if (directory && directory.uri) { + uri = directory.uri; + } else { + //Checking to prompt user depending on mode + if (this.cloud) { + //TODO: Add cloud integration + } else { + //Getting file URI from native prompt + uri = ShellApi.openShellDialog({type: 'directory', action: 'open'}); + } + } + //Checking for a valid URI + if (uri && uri.length>0) { + + this.openFile({uri: uri+'\\index.html'}); + + + } else { + //No file was selected to be opened, nothing happens + } + + + + + + } + }, + + + + + + //////////////////////////////////////////////////////////////////// + // + saveFile: { + enumerable: false, + value: function (f) { + //console.log(f); + //TODO: Add functionality + //console.log('FileSystem: saveFile'); + //HACK + + //////////////////////////////////////////////////////////////////// + // DEBUG CODE TO TEST WebGL I/O + //var glData = DocumentManagerModule.DocumentManager.activeDocument.glData; + //DocumentManagerModule.DocumentManager.activeDocument.glData = glData; + //////////////////////////////////////////////////////////////////// + + if (f) { + var s = ShellApi.updateFile(f); + } else { + //HACK + this.saveProject(); + } + + } + }, + + + + + //////////////////////////////////////////////////////////////////// + // + saveFileAs: { + enumerable: false, + value: function () { + //TODO: Add functionality + //console.log('FileSystem: saveFileAs'); + //HACK + this.saveProject(); + } + }, + + + + + + //////////////////////////////////////////////////////////////////// + // + saveProject: { + enumerable: false, + value: function () { + //FileIo.save('project'); + //console.log(DocumentManagerModule.DocumentManager.activeDocument._userComponentSet); + //DocumentManagerModule.DocumentManager.activeDocument.server.root + + //////////////////////////////////////////////////////////////////// + // DEBUG CODE TO TEST WebGL I/O + //var glData = DocumentManagerModule.DocumentManager.activeDocument.glData; + //DocumentManagerModule.DocumentManager.activeDocument.glData = glData; + //////////////////////////////////////////////////////////////////// + +// var root = DocumentManagerModule.DocumentManager.activeDocument.server.root; +// +// // +// var project = ProjectIo.save('montageapp', +// DocumentManagerModule.DocumentManager.activeDocument.iframe.id, +// DocumentManagerModule.DocumentManager.activeDocument._userComponentSet); +// +// +// +// // +// var cssSave = this.saveFile({uri: root+'styles.css', contents: project.css}); +// var htmlSave = this.saveFile({uri: root+'index.html', contents: project.html}); + + } + }, + + + + + //////////////////////////////////////////////////////////////////// + // + saveAll: { + enumerable: false, + value: function () { + //TODO: Add functionality + //console.log('FileSystem: saveAll'); + //HACK + this.saveProject(); + } + }, + + + + + + //////////////////////////////////////////////////////////////////// + // + closeFile: { + enumerable: false, + value: function () { + //TODO: Add functionality + console.log('FileSystem: closeFile'); + } + }, + + + + + + //////////////////////////////////////////////////////////////////// + // + closeProject: { + enumerable: false, + value: function () { + //TODO: Add functionality + console.log('FileSystem: closeProject'); + } + } + + + + + + + + //////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////// +}); +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// \ No newline at end of file -- cgit v1.2.3