Merge pull request #2475 from NativeScript/ios-known-folders

Add iOS-specific known folders to fs.knownFolders
This commit is contained in:
Rossen Hristov
2016-07-20 11:37:09 +03:00
committed by GitHub
7 changed files with 210 additions and 15 deletions

View File

@ -8,7 +8,8 @@
"noImplicitAny": false,
"noImplicitUseStrict": true,
"experimentalDecorators": true,
"diagnostics": true
"diagnostics": true,
"sourceMap": true
},
"exclude": [
"node_modules",

View File

@ -218,6 +218,40 @@ export var testGetKnownFolders = function () {
// << file-system-known-folders
};
function _testIOSSpecificKnownFolder(knownFolderName: string){
let knownFolder: fs.Folder;
let createdFile: fs.File;
let testFunc = function testFunc(){
knownFolder = fs.knownFolders.ios[knownFolderName]();
createdFile = knownFolder.getFile("createdFile");
createdFile.writeTextSync("some text");
};
if (platform.isIOS){
testFunc();
TKUnit.assertNotNull(knownFolder, `Could not retrieve the ${knownFolderName} known folder.`);
TKUnit.assertTrue(knownFolder.isKnown, `The ${knownFolderName} folder should have its "isKnown" property set to true.`);
TKUnit.assertNotNull(createdFile, `Could not create a new file in the ${knownFolderName} known folder.`);
TKUnit.assertTrue(fs.File.exists(createdFile.path), `Could not create a new file in the ${knownFolderName} known folder.`);
TKUnit.assertEqual(createdFile.readTextSync(), "some text", `The contents of the new file created in the ${knownFolderName} known folder are not as expected.`);
}
else {
TKUnit.assertThrows(testFunc,
`Trying to retrieve the ${knownFolderName} known folder on a platform different from iOS should throw!`,
`The "${knownFolderName}" known folder is available on iOS only!`);
}
}
export var testIOSSpecificKnownFolders = function () {
_testIOSSpecificKnownFolder("library");
_testIOSSpecificKnownFolder("developer");
_testIOSSpecificKnownFolder("desktop");
_testIOSSpecificKnownFolder("downloads");
_testIOSSpecificKnownFolder("movies");
_testIOSSpecificKnownFolder("music");
_testIOSSpecificKnownFolder("pictures");
_testIOSSpecificKnownFolder("sharedPublic");
}
export var testGetEntities = function () {
// >> file-system-folders-content
var documents = fs.knownFolders.documents();

View File

@ -8,7 +8,8 @@
"noImplicitAny": false,
"noImplicitUseStrict": true,
"experimentalDecorators": true,
"diagnostics": true
"diagnostics": true,
"sourceMap": true
},
"exclude": [
"node_modules",

View File

@ -3,22 +3,14 @@ import * as utilsModule from "utils/utils";
// TODO: Implement all the APIs receiving callback using async blocks
// TODO: Check whether we need try/catch blocks for the iOS implementation
export class FileSystemAccess {
//private keyFileType = "NSFileType";
//private keyReadonly = "NSFileImmutable";
//private NSUTF8StringEncoding = 4;
private keyModificationTime = "NSFileModificationDate";
private documentDir = 9;
private cachesDir = 13;
private userDomain = 1;
public getLastModified(path: string): Date {
var fileManager = NSFileManager.defaultManager();
var attributes = fileManager.attributesOfItemAtPathError(path);
if (attributes) {
return attributes.objectForKey(this.keyModificationTime);
return attributes.objectForKey("NSFileModificationDate");
} else {
return new Date();
}
@ -226,11 +218,11 @@ export class FileSystemAccess {
}
public getDocumentsFolderPath(): string {
return this.getKnownPath(this.documentDir);
return this.getKnownPath(NSSearchPathDirectory.NSDocumentDirectory);
}
public getTempFolderPath(): string {
return this.getKnownPath(this.cachesDir);
return this.getKnownPath(NSSearchPathDirectory.NSCachesDirectory);
}
public getCurrentAppPath(): string {
@ -307,7 +299,7 @@ export class FileSystemAccess {
private getKnownPath(folderType: number): string {
var fileManager = NSFileManager.defaultManager();
var paths = fileManager.URLsForDirectoryInDomains(folderType, this.userDomain);
var paths = fileManager.URLsForDirectoryInDomains(folderType, NSSearchPathDirectory.NSApplicationDirectory);
var url = paths.objectAtIndex(0);
return url.path;

View File

@ -208,6 +208,51 @@ declare module "file-system" {
* iOS - this folder is read-only and contains the app and all its resources.
*/
export function currentApp(): Folder;
/**
* Contains iOS-specific known folders.
*/
module ios {
/**
* Gets the NSLibraryDirectory.
*/
export function library(): Folder;
/**
* Gets the NSDeveloperDirectory.
*/
export function developer(): Folder;
/**
* Gets the NSDesktopDirectory.
*/
export function desktop(): Folder;
/**
* Gets the NSDownloadsDirectory.
*/
export function downloads(): Folder;
/**
* Gets the NSMoviesDirectory.
*/
export function movies(): Folder;
/**
* Gets the NSMusicDirectory.
*/
export function music(): Folder;
/**
* Gets the NSPicturesDirectory.
*/
export function pictures(): Folder;
/**
* Gets the NSSharedPublicDirectory.
*/
export function sharedPublic(): Folder;
}
}
/**

View File

@ -1,4 +1,5 @@
import file_access_module = require("file-system/file-system-access");
import * as platformModule from "platform";
// The FileSystemAccess implementation, used through all the APIs.
var fileAccess;
@ -10,6 +11,13 @@ var getFileAccess = function (): file_access_module.FileSystemAccess {
return fileAccess;
};
let platform: typeof platformModule;
function ensurePlatform() {
if (!platform) {
platform = require("platform");
}
}
// we are defining these as private variables within the IO scope and will use them to access the corresponding properties for each FSEntity instance.
// this allows us to encapsulate (hide) the explicit property setters and force the users go through the exposed APIs to receive FSEntity instances.
var nameProperty = "_name";
@ -491,6 +499,119 @@ export module knownFolders {
return _app;
};
export module ios {
function _checkPlatform(knownFolderName: string){
ensurePlatform();
if (!platform.isIOS){
throw new Error(`The "${knownFolderName}" known folder is available on iOS only!`);
}
}
let _library: Folder;
export var library = function(): Folder {
_checkPlatform("library");
if (!_library) {
var path = (<any>getFileAccess()).getKnownPath(NSSearchPathDirectory.NSLibraryDirectory);
_library = Folder.fromPath(path);
_library[pathProperty] = path;
_library[isKnownProperty] = true;
}
return _library;
};
let _developer: Folder;
export var developer = function(): Folder {
_checkPlatform("developer");
if (!_developer) {
var path = (<any>getFileAccess()).getKnownPath(NSSearchPathDirectory.NSDeveloperDirectory);
_developer = Folder.fromPath(path);
_developer[pathProperty] = path;
_developer[isKnownProperty] = true;
}
return _developer;
};
let _desktop: Folder;
export var desktop = function(): Folder {
_checkPlatform("desktop");
if (!_desktop) {
var path = (<any>getFileAccess()).getKnownPath(NSSearchPathDirectory.NSDesktopDirectory);
_desktop = Folder.fromPath(path);
_desktop[pathProperty] = path;
_desktop[isKnownProperty] = true;
}
return _desktop;
};
let _downloads: Folder;
export var downloads = function(): Folder {
_checkPlatform("downloads");
if (!_downloads) {
var path = (<any>getFileAccess()).getKnownPath(NSSearchPathDirectory.NSDownloadsDirectory);
_downloads = Folder.fromPath(path);
_downloads[pathProperty] = path;
_downloads[isKnownProperty] = true;
}
return _downloads;
};
let _movies: Folder;
export var movies = function(): Folder {
_checkPlatform("movies");
if (!_movies) {
var path = (<any>getFileAccess()).getKnownPath(NSSearchPathDirectory.NSMoviesDirectory);
_movies = Folder.fromPath(path);
_movies[pathProperty] = path;
_movies[isKnownProperty] = true;
}
return _movies;
};
let _music: Folder;
export var music = function(): Folder {
_checkPlatform("music");
if (!_music) {
var path = (<any>getFileAccess()).getKnownPath(NSSearchPathDirectory.NSMusicDirectory);
_music = Folder.fromPath(path);
_music[pathProperty] = path;
_music[isKnownProperty] = true;
}
return _music;
};
let _pictures: Folder;
export var pictures = function(): Folder {
_checkPlatform("pictures");
if (!_pictures) {
var path = (<any>getFileAccess()).getKnownPath(NSSearchPathDirectory.NSPicturesDirectory);
_pictures = Folder.fromPath(path);
_pictures[pathProperty] = path;
_pictures[isKnownProperty] = true;
}
return _pictures;
};
let _sharedPublic: Folder;
export var sharedPublic = function(): Folder {
_checkPlatform("sharedPublic");
if (!_sharedPublic) {
var path = (<any>getFileAccess()).getKnownPath(NSSearchPathDirectory.NSSharedPublicDirectory);
_sharedPublic = Folder.fromPath(path);
_sharedPublic[pathProperty] = path;
_sharedPublic[isKnownProperty] = true;
}
return _sharedPublic;
};
}
}
export module path {

View File

@ -8,7 +8,8 @@
"noImplicitAny": false,
"noImplicitUseStrict": true,
"experimentalDecorators": true,
"diagnostics": true
"diagnostics": true,
"sourceMap": true
},
"exclude": [
"node_modules",