/* 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'); } } //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// }); //////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////