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/shellapi.js | 806 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 806 insertions(+) create mode 100644 js/io/system/shellapi.js (limited to 'js/io/system/shellapi.js') diff --git a/js/io/system/shellapi.js b/js/io/system/shellapi.js new file mode 100644 index 00000000..9976dbed --- /dev/null +++ b/js/io/system/shellapi.js @@ -0,0 +1,806 @@ +/* +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. +
*/ + +/* ///////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +NOTES: All logic should be handled in the FileSystem and I/O classes + +Dialog methods on NativeShellApp +ShowFileOpenDialog(initialDir) - shows a file open dialog +initialDir is optional and if specified will cause the dialog to initially display that directory as the open location +ShowFileSaveAsDialog(initialURI) - shows a file Save As dialog +initialURI is optional and if specified will cause the dialog to initially display the directory as the default location +and the filename as the current filename. +ShowSelectDirectoryDialog(initialDir, dialogTitle) - displays a directory select/chooser dialog +intitalDir is optional and specifies the directory that should be selected/shown when the dialog opens +dialogTitle is optional and specifies the title that should appear in the dialog caption +//////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// */ +//Exporting as Project I/O +exports.ShellApi = (require("montage/core/core").Montage).create(require("montage/ui/component").Component, { + //////////////////////////////////////////////////////////////////// + // + init: { + enumerable: false, + value: function() { + try { + var xhr = new XMLHttpRequest(), file, directory; + // + xhr.open("GET", 'cloud/config.xml', false); + xhr.send(); + // + if (xhr.readyState === 4) { + file = xhr.responseXML.getElementsByTagName('file')[0].firstChild.nodeValue; + directory = xhr.responseXML.getElementsByTagName('directory')[0].firstChild.nodeValue; + if (file.length) + this._fileServiceURL = file; + if (directory.length) + this._directoryServiceURL = directory; + // + //console.log(file, directory); + } + } + catch(error) { + console.log(error); + } + } + }, + //////////////////////////////////////////////////////////////////// + // + openShellDialog: { + enumerable: false, + value: function(dialog) { + //Initializing return variable + var input = null; + //Checking for the type of prompt set via object + switch (dialog.type) { + case 'file': + //Checking for action the prompt will ask the user + if (dialog.action.toLowerCase() == 'open') { + //File open dialog + input = window.NativeShellApp.ShowFileOpenDialog(); + } else if (dialog.action.toLowerCase() == 'new') { + //File new dialog + input = window.NativeShellApp.ShowFileSaveAsDialog(); + } + break; + case 'directory': + //Checking for action the prompt will ask the user + if (dialog.action.toLowerCase() == 'open') { + //Directory open dialog + input = window.NativeShellApp.ShowSelectDirectoryDialog(); + } else if (dialog.action.toLowerCase() == 'new') { + //Directory new dialog + input = window.NativeShellApp.ShowSelectDirectoryDialog(); + } + break; + break; + default: + break; + } + return input; + } + }, + //////////////////////////////////////////////////////////////////// + // + startServer: { + enumerable: false, + value: function (dir) { + var server = window.NativeShellApp.StartWebServer(dir); + return server; + } + }, + //////////////////////////////////////////////////////////////////// + // private property containing the file service URL to use for all file IO calls + _fileServiceURL: { + enumerable: false, + value: "http://localhost:16380/file" //default value.. updated with base uri in config.xml + }, + //////////////////////////////////////////////////////////////////// + // private property containing the directory service URL to use for all file IO calls + _directoryServiceURL: { + enumerable: false, + value: "http://localhost:16380/directory" //default value.. updated with base uri in config.xml + }, + //////////////////////////////////////////////////////////////////// + // private helper to parse URIs and append them to the service URL + _prepareServiceURL: { + enumerable: false, + value: function(serviceURL, path) { + var urlOut = path.replace(/\\/g,"/"); + urlOut = urlOut.replace(/:/g,""); + urlOut = encodeURI(urlOut); + //add leading / if not already there + if((urlOut.length > 0) && (urlOut.charAt(0) !== "/")){ + urlOut = "/" + urlOut; + } + return serviceURL + urlOut; + } + }, + //////////////////////////////////////////////////////////////////// + // Checks for the existence of a file + // Parameters: + // the file parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/foo/bar.html" + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the file exists + // 404 - the file does not exist + // 500 - unknown server error occurred + fileExists: { + enumerable: false, + value: function(file) { + // + var retValue = { success:null, status:null }; + // + if(file && file.uri && file.uri.length) { + try { + var serviceURL = this._prepareServiceURL(this._fileServiceURL, file.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("GET", serviceURL, false); + xhr.setRequestHeader("check-existence-only", "true"); + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Creates a new file at the specified path + // Parameters: + // the file parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/foo/bar.html" + // it can optionally contain the following properties + // contentType: string with the content type i.e. "text/plain". "text/plain" is assumed if this property is not specified + // contents: string containing the file contents. These contents will be saved to the new file. + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 201 - the file was created and contents were saved if they were passed + // 400 - the file already exists and could not be created + // 500 - unknown server error occurred + createFile: { + enumerable: false, + value: function(file) { + var retValue = { success:null, status:null }; + if(file && file.uri && file.uri.length) { + try { + var serviceURL = this._prepareServiceURL(this._fileServiceURL, file.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("POST", serviceURL, false); + if(file.contentType && file.contentType.length) + xhr.setRequestHeader("Content-Type", file.contentType); + else + xhr.setRequestHeader("Content-Type", "text/plain"); + + if(file.contents && file.contents.length) + xhr.send(file.contents); + else + xhr.send(); + + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Save contents into an existing file at the specified path + // Parameters: + // the file parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/foo/bar.html" + // it can optionally contain the following properties + // contentType: string with the content type i.e. "text/plain". "text/plain" is assumed if this property is not specified + // contents: string containing the file contents. These contents will be saved to the new file. + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the file was saved + // 404 - the file specified does not exist + // 500 - unknown server error occurred + updateFile: { + enumerable: false, + value: function(file) { + var retValue = { success:null, status:null }; + if(file && file.uri && file.uri.length && file.contents && file.contents.length) { + try { + var serviceURL = this._prepareServiceURL(this._fileServiceURL, file.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("PUT", serviceURL, false); + if(file.contentType && file.contentType.length) + xhr.setRequestHeader("Content-Type", file.contentType); + else + xhr.setRequestHeader("Content-Type", "text/plain"); + + xhr.send(file.contents); + + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Copies a file from one location to another + // Parameters: + // the file parameter must contain the following properties + // sourceUri: string value containing the full file path/URI to copy from i.e. "c:/foo/bar.html" + // destUri: string containing the full path/URI to copy to + // it can optionally contain the following properties + // overwriteDestination: bool indicating whether it is okay to overwrite the file specified at destUri if it already exists + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the file was copied + // 404 - the file specified in sourceUri does not exist + // 500 - unknown server error occurred + copyFile: { + enumerable: false, + value: function(file) { + var retValue = { success:null, status:null }; + if(file && file.sourceUri && file.sourceUri.length && file.destUri && file.destUri.length) { + try { + var serviceURL = this._prepareServiceURL(this._fileServiceURL, file.destUri), + xhr = new XMLHttpRequest(); + // + xhr.open("PUT", serviceURL, false); + xhr.setRequestHeader("sourceURI", file.sourceUri); + // + if(file.overwriteDestination && file.overwriteDestination === true) { + xhr.setRequestHeader("overwrite-destination", "true"); + } + // + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Moves a file from one location to another + // Parameters: + // the file parameter must contain the following properties + // sourceUri: string value containing the full file path/URI to copy from i.e. "c:/foo/bar.html" + // destUri: string containing the full path/URI to copy to + // it can optionally contain the following properties + // overwriteDestination: bool indicating whether it is okay to overwrite the file specified at destUri if it already exists + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the file was moved + // 404 - the file specified in sourceUri does not exist + // 500 - unknown server error occurred + moveFile: { + enumerable: false, + value: function(file) { + var retValue = { success:null, status:null }; + if(file && file.sourceUri && file.sourceUri.length && file.destUri && file.destUri.length) { + try { + var serviceURL = this._prepareServiceURL(this._fileServiceURL, file.destUri), + xhr = new XMLHttpRequest(); + // + xhr.open("PUT", serviceURL, false); + xhr.setRequestHeader("sourceURI", file.sourceUri); + xhr.setRequestHeader("delete-source", "true"); + // + if(file.overwriteDestination && file.overwriteDestination === true) { + xhr.setRequestHeader("overwrite-destination", "true"); + } + // + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Deletes an existing file + // Parameters: + // the file parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/foo/bar.html" + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the file was deleted + // 404 - the file does not exist + // 500 - unknown server error occurred + deleteFile: { + enumerable: false, + value: function(file) { + var retValue = { success:null, status:null }; + if(file && file.uri && file.uri.length) { + try { + var serviceURL = this._prepareServiceURL(this._fileServiceURL, file.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("DELETE", serviceURL, false); + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Reads an existing file + // Parameters: + // the file parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/foo/bar.html" + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // content: string containing the file contents + // status: int indicating the request HTTP status code + // 200 - the file was read and its contents were returned + // 404 - the file does not exist + // 500 - unknown server error occurred + openFile: { + enumerable: false, + value: function(file) { + // + var retValue = { success:null, content:null, status:null }; + // + if(file && file.uri && file.uri.length) { + try { + var serviceURL = this._prepareServiceURL(this._fileServiceURL, file.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("GET", serviceURL, false); + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + if(xhr.status == 200) { + retValue.content = xhr.responseText; + } + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Create a new directory/folder + // Parameters: + // the dir parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/dir/subdir" + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 201 - the directory was created + // 400 - the directory was unable to be created + // 500 - unknown server error occurred + createDirectory: { + enumerable: false, + value: function(dir) { + var retValue = { success:null, status:null }; + if(dir && dir.uri && dir.uri.length) { + try { + var serviceURL = this._prepareServiceURL(this._directoryServiceURL, dir.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("POST", serviceURL, false); + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Delete a directory/folder + // Parameters: + // the dir parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/dir/subdir" + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the directory was deleted + // 404 - the directory does not exist + // 500 - unknown server error occurred + deleteDirectory: { + enumerable: false, + value: function(dir) { + var retValue = { success:null, status:null }; + if(dir && dir.uri && dir.uri.length) { + try { + var serviceURL = this._prepareServiceURL(this._directoryServiceURL, dir.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("DELETE", serviceURL, false); + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // List the contents of a directory/folder + // Parameters: + // the dir parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/dir/subdir" + // recursive: boolean true to list contents of all subdirectories as well. if this is not specified "false" is the default. + // returnType: string "all", "files", "directories". Specifies the types to return. if this is not specified, the default is "all" + // fileFilters: string containing the file extensions to include in the return listing. This list is semi-colon separated. i.e. "xml;html" + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // content: string containing the JSON structure of the file contents + // status: int indicating the request HTTP status code + // 200 - the directory was read and the content JSON string was returned in dir.content + // 404 - the directory does not exist + // 500 - unknown server error occurred + getDirectoryContents: { + enumerable: false, + value: function(dir) { + var retValue = { success:null, content:null, status:null }; + if(!!dir && (typeof dir.uri !== "undefined") && (dir.uri !== null) ) { + try { + var serviceURL = this._prepareServiceURL(this._directoryServiceURL, dir.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("GET", serviceURL, false); + // + if(dir.recursive) { + xhr.setRequestHeader("recursive", dir.recursive.toString()); + } + + // + if (dir.fileFilters) { + xhr.setRequestHeader("file-filters", dir.fileFilters.toString()); + } + // + + // + if(dir.returnType) { + xhr.setRequestHeader("return-type", dir.returnType.toString()); + } + // + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + if(xhr.status == 200) { + retValue.content = xhr.responseText; + } + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Check if a directory/folder exists + // Parameters: + // the dir parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/dir/subdir" + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the directory exists + // 404 - the directory does not exist + // 500 - unknown server error occurred + directoryExists: { + enumerable: false, + value: function(dir) { + var retValue = { success:null, content:null, status:null }; + if(dir && dir.uri && dir.uri.length) { + try { + var serviceURL = this._prepareServiceURL(this._directoryServiceURL, dir.uri), + xhr = new XMLHttpRequest(); + // + xhr.open("GET", serviceURL, false); + xhr.setRequestHeader("check-existence-only", "true"); + // + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // copies an existing directory/folder to a new location + // Parameters: + // the dir parameter must contain the following properties + // sourceUri: string value containing the full file path/URI to copy from i.e. "c:/foo/bar" + // destUri: string containing the full path/URI to copy to + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the operation succeeded + // 400 - the operation could not be performed because the destUri existed + // 404 - the source directory does not exist + // 500 - unknown server error occurred + copyDirectory: { + enumerable: false, + value: function(dir) { + return this._copyMoveDirHelper(dir.sourceUri, dir.destUri, "copy"); + } + }, + //////////////////////////////////////////////////////////////////// + // Moves an existing directory/folder to a new location + // Parameters: + // the dir parameter must contain the following properties + // sourceUri: string value containing the full file path/URI to copy from i.e. "c:/foo/bar" + // destUri: string containing the full path/URI to move to + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the operation succeeded + // 400 - the operation could not be performed because the destUri existed + // 404 - the source directory does not exist + // 500 - unknown server error occurred + moveDirectory: { + enumerable: false, + value: function(dir) { + return this._copyMoveDirHelper(dir.sourceUri, dir.destUri, "move"); + } + }, + //////////////////////////////////////////////////////////////////// + // Moves an existing directory/folder to a new location + // Parameters: + // the dir parameter must contain the following properties + // sourceUri: string value containing the full file path/URI to copy from i.e. "c:/foo/bar" + // newDirectoryName: string containing the new name of the directory i.e. "bar2" + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 204 - the operation succeeded + // 400 - the operation could not be performed because the destUri existed + // 404 - the source directory does not exist + // 500 - unknown server error occurred + renameDirectory: { + enumerable: false, + value: function(dir) { + return this._copyMoveDirHelper(dir.sourceUri, dir.sourceUri + "/" + dir.newDirectoryName, "move"); + } + }, + //////////////////////////////////////////////////////////////////// + //Helper that is used by copyDirectory, moveDirectory, renameDirectory + _copyMoveDirHelper: { + enumerable: false, + value: function(sourceDir, destDir, operation) { + var retValue = {}; + if(sourceDir && sourceDir.length && destDir && destDir.length && operation && operation.length) { + try { + var serviceURL = this._prepareServiceURL(this._directoryServiceURL, destDir), + xhr = new XMLHttpRequest(); + // + xhr.open("PUT", serviceURL, false); + xhr.setRequestHeader("sourceURI", sourceDir); + xhr.setRequestHeader("operation", operation); + // + xhr.send(); + // + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + // + return retValue; + } + }, + //////////////////////////////////////////////////////////////////// + // Checks if the file has been modified since it was last queried + // Parameters: + // the file parameter must contain the following properties + // uri: string value containing the full file path/URI i.e. "c:/foo/bar.html" + // recursive: boolean true to check the modified date of all subdirectories as well. if this is not specified "false" is the default. + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 200 - the file has been modified + // 304 - the file has not been modified + // 404 - the file does not exist + // 500 - unknown server error occurred + + isFileModified:{ + enumerable:true, + writable:false, + value:function(file, lastQueriedTimestamp){ + var retValue = { success:null, status:null }; + if(file && file.uri) { + try { + var serviceURL = this._prepareServiceURL(this._fileServiceURL, file.uri), + xhr = new XMLHttpRequest(); + xhr.open("GET", serviceURL, false); + xhr.setRequestHeader("if-modified-since", lastQueriedTimestamp); + xhr.send(); + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + return retValue; + } + }, + + //////////////////////////////////////////////////////////////////// + // Checks if the directory content has been modified since it was last queried + // Parameters: + // the file parameter must contain the following properties + // uri: string value containing the full directory path/URI i.e. "c:/foo/bar.html" + // recursive: boolean true to check the modified date of all subdirectories as well. if this is not specified "false" is the default. + // + // Return values: + // returns an object with two properties + // success: boolean indicating if the call succeeded or failed + // status: int indicating the request HTTP status code + // 200 - the file has been modified + // 304 - the file has not been modified + // 404 - the file does not exist + // 500 - unknown server error occurred + + isDirectoryModified:{ + enumerable:true, + writable:false, + value:function(file, lastQueriedTimestamp){ + var retValue = { success:null, status:null }; + if(file && file.uri) { + try { + var serviceURL = this._prepareServiceURL(this._directoryServiceURL, file.uri), + xhr = new XMLHttpRequest(); + xhr.open("GET", serviceURL, false); + xhr.setRequestHeader("if-modified-since", lastQueriedTimestamp); + xhr.send(); + if (xhr.readyState === 4) { + retValue.status = xhr.status; + retValue.success = true; + } + } + catch(error) { + xhr = null; + retValue.success = false; + } + } + return retValue; + } + } + + + +}); +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// \ No newline at end of file -- cgit v1.2.3