You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by lo...@apache.org on 2012/05/24 00:33:48 UTC
qt commit: fixed for moveTo and copyTo,
file: 5 to go. TODO. note: For Simulator, create /home/longwei/MyDocs dir
Updated Branches:
refs/heads/master 98c6ab857 -> 5361a6139
fixed for moveTo and copyTo, file: 5 to go. TODO. note: For Simulator, create /home/longwei/MyDocs dir
Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/commit/5361a613
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/tree/5361a613
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/diff/5361a613
Branch: refs/heads/master
Commit: 5361a61394fa729d0ee2939ddff2fdb6ba470c86
Parents: 98c6ab8
Author: Longwei Su <ls...@ics.com>
Authored: Wed May 23 18:33:31 2012 -0400
Committer: Longwei Su <ls...@ics.com>
Committed: Wed May 23 18:33:31 2012 -0400
----------------------------------------------------------------------
doc/README | 1 -
src/plugins/fileapi.cpp | 162 ++++++++++++++++++++++++++++++-----------
src/plugins/fileapi.h | 10 ++-
www/js/file.js | 8 +-
4 files changed, 128 insertions(+), 53 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/blob/5361a613/doc/README
----------------------------------------------------------------------
diff --git a/doc/README b/doc/README
deleted file mode 100644
index 2e4bcab..0000000
--- a/doc/README
+++ /dev/null
@@ -1 +0,0 @@
-This is Permanent directory.
http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/blob/5361a613/src/plugins/fileapi.cpp
----------------------------------------------------------------------
diff --git a/src/plugins/fileapi.cpp b/src/plugins/fileapi.cpp
index 0fbe6d4..57f9490 100644
--- a/src/plugins/fileapi.cpp
+++ b/src/plugins/fileapi.cpp
@@ -24,6 +24,7 @@
#include <QDateTime>
#include <QUrl>
#include <QTextStream>
+#include <QApplication>
// Create static instance of ourself
FileAPI* FileAPI::m_fileAPI = new FileAPI();
@@ -52,6 +53,8 @@ FileAPI::MimeTypeMap FileAPI::createMimeTypeMap(){
*/
void FileAPI::requestFileSystem( int scId, int ecId, unsigned short p_type, unsigned long long p_size) {
QDir dir;
+ persistentDir_ = QDir::homePath() + "/MyDocs/persistent";
+ qDebug() << "this is current path" << persistentDir_;
//FIXEME,what is quota value
if (p_size >= 10000){
this->callback( ecId, "FileException.cast( FileException.QUOTA_EXCEEDED_ERR)");
@@ -63,8 +66,13 @@ void FileAPI::requestFileSystem( int scId, int ecId, unsigned short p_type, unsi
absPath = dir.absolutePath();
}
else {
- dir = QDir::current();
- absPath = dir.absolutePath() + "/doc";
+ // dir = QDir::current();
+ dir = QDir(persistentDir_);
+ absPath = persistentDir_;
+ if(!dir.exists()){
+ QDir cdup(QDir::homePath() + "/MyDocs");
+ qDebug() << cdup.mkdir("persistent");
+ }
}
if (p_type == 0){
@@ -80,6 +88,7 @@ void FileAPI::requestFileSystem( int scId, int ecId, unsigned short p_type, unsi
* LocalFileSystem.resolveLocalFileSystemURL - http://www.w3.org/TR/file-system-api/#widl-LocalFileSystem-resolveLocalFileSystemURL
*/
void FileAPI::resolveLocalFileSystemURL( int scId, int ecId, QString p_url ) {
+ qDebug() << Q_FUNC_INFO << QString(p_url);
QUrl url = QUrl::fromUserInput( p_url );
// Check if we have a valid URL
if( !url.isValid() ) {
@@ -114,6 +123,7 @@ void FileAPI::resolveLocalFileSystemURL( int scId, int ecId, QString p_url ) {
* DirectoryEntry.getFile - http://www.w3.org/TR/file-system-api/#widl-DirectoryEntry-getFile
*/
void FileAPI::getFile( int scId, int ecId, QString p_path, QVariantMap p_options ) {
+ qDebug() << Q_FUNC_INFO << QString(p_path);
//NOTE: colon is not safe in url, it is not a valid path in Win and Mac, simple disable it here.
if(p_path.contains(":")){
this->callback( ecId, "FileException.cast( FileException.ENCODING_ERR )" );
@@ -137,10 +147,10 @@ void FileAPI::getFile( int scId, int ecId, QString p_path, QVariantMap p_options
QFileInfo pathInfo( p_path );
QString fileName(pathInfo.fileName());
-// if create is false and the path represents a directory, return error
-// if file does exist, and create is true and exclusive is true, return error
-// if file does not exist and create is false, return error
-// if file does not exist and create is true, create file and return File entry
+ // if create is false and the path represents a directory, return error
+ // if file does exist, and create is true and exclusive is true, return error
+ // if file does not exist and create is false, return error
+ // if file does not exist and create is true, create file and return File entry
QFileInfo fileInfo( url.path() );
if( (!create) && fileInfo.isDir() ) {
this->callback( ecId, "FileException.cast( FileException.TYPE_MISMATCH_ERR )" );
@@ -178,6 +188,7 @@ void FileAPI::getFile( int scId, int ecId, QString p_path, QVariantMap p_options
* DirectoryEntry.getDirectory - http://www.w3.org/TR/file-system-api/#widl-DirectoryEntry-getDirectory
*/
void FileAPI::getDirectory( int scId, int ecId, QString p_path, QVariantMap p_options ) {
+ qDebug() << Q_FUNC_INFO << QString(p_path);
//NOTE: colon is not safe in url, it is not a valid path in Win and Mac, simple disable it here.
if(p_path.contains(":")){
this->callback( ecId, "FileException.cast( FileException.ENCODING_ERR )" );
@@ -346,10 +357,8 @@ void FileAPI::getParent( int scId, int ecId, QString p_path ) {
QDir dir( p_path );
//can't cdup more than app's root
- QDir root = QDir::current();
- QString absPath = root.absolutePath() + "/doc";
// Try to change into upper directory
- if( p_path != absPath){
+ if( p_path != persistentDir_){
if( !dir.cdUp() ) {
this->callback( ecId, "FileException.cast( FileException.NOT_FOUND_ERR )" );
return;
@@ -366,10 +375,8 @@ void FileAPI::getParent( int scId, int ecId, QString p_path ) {
*/
void FileAPI::remove( int scId, int ecId, QString p_path ) {
QFileInfo fileInfo(p_path);
- QDir root = QDir::current();
- QString absPath = root.absolutePath() + "/doc";
// Check if entry exists at all
- if( !fileInfo.exists() || (p_path == absPath)) {
+ if( !fileInfo.exists() || (p_path == persistentDir_)) {
this->callback( ecId, "FileException.cast( FileException.NO_MODIFICATION_ALLOWED_ERR )" );
return;
}
@@ -495,7 +502,7 @@ void FileAPI::readAsDataURL( int scId, int ecId, QString p_path ) {
QString contentType( mimeMap_[fileInfo.completeSuffix()] );
// Escape string & send back
-// this->callback( scId, "'" + byteArray.toBase64() + "'" );
+ // this->callback( scId, "'" + byteArray.toBase64() + "'" );
this->callback( scId, "'data:" + contentType + ";base64," + byteArray.toBase64() + "'" );
return;
}
@@ -504,9 +511,7 @@ void FileAPI::readAsDataURL( int scId, int ecId, QString p_path ) {
* Helper function for recursively removing a directory
*/
bool FileAPI::rmDir( QDir p_dir ) {
- QDir dir = QDir::current();
- QString absPath = dir.absolutePath() + "/doc";
- if ( p_dir == absPath){//can't remove root dir
+ if ( p_dir == persistentDir_){//can't remove root dir
return false;
}
bool result = true;
@@ -532,52 +537,121 @@ bool FileAPI::rmDir( QDir p_dir ) {
return result;
}
-void FileAPI::copyFile(int scId, int ecId,const QString& sourceFile, const QString& destinationParentDir, const QString& newName)
+bool FileAPI::copyFile(int scId, int ecId,const QString& sourceFile, const QString& destinationParentDir, const QString& newName)
{
- qDebug()<< Q_FUNC_INFO;
- QString destinationFile;
- if (newName.isEmpty()){
- QFileInfo fileInfo(sourceFile);
- destinationFile = destinationParentDir + "/" + fileInfo.fileName();
- destinationFile = destinationParentDir + "/" + newName;
- } else {
+ qDebug()<< Q_FUNC_INFO << sourceFile << ", "<< destinationParentDir << "," << newName;
+ if(!QDir(destinationParentDir).exists()){
+ this->callback( ecId, "FileException.cast( FileException.NOT_FOUND_ERR )" );
+ return false;
+ }
+ QFileInfo fileInfo(sourceFile);
+ QString fileName = ((newName.isEmpty()) ? fileInfo.fileName() : newName);
+ qDebug() << "fileName"<< fileName;
+ QString destinationFile(destinationParentDir + "/" + fileName);
+ //NOTE: colon is not safe in url, it is not a valid path in Win and Mac, simple disable it here.
+ if(!QUrl::fromUserInput(destinationFile).isValid() || destinationFile.contains(":")){
+ this->callback( ecId, "FileException.cast( FileException.ENCODING_ERR )" );
+ return false;
}
+
if(QFile::copy(sourceFile, destinationFile)){
qDebug()<< Q_FUNC_INFO << "success";
- };
- this->callback( scId, "" );
+ this->callback( scId, "FileEntry.cast( '" + fileName + "', '" + destinationFile + "' )" );
+ return true;
+ } else {
+ this->callback( ecId, "FileException.cast( FileException.INVALID_MODIFICATION_ERR )" );
+ return false;
+ }
}
void FileAPI::moveFile(int scId, int ecId,const QString& sourceFile, const QString& destinationParentDir, const QString& newName){
- qDebug()<< Q_FUNC_INFO;
- copyFile(scId,ecId,sourceFile, destinationParentDir, newName);
- remove(scId,ecId, sourceFile);
- this->callback( scId, "" );
+
+ QString fileName = ((newName.isEmpty()) ? QFileInfo(sourceFile).fileName() : newName);
+ //if existing a file have the newName, remove it and rename sourceFile
+ QString destinationFile(destinationParentDir + "/" + fileName);
+ if(QFileInfo(destinationFile).exists() && (sourceFile != destinationFile)){
+ if(!QFile::remove(destinationFile)){
+ qDebug() << "fail to remove existing file..." << Q_FUNC_INFO
+ << sourceFile << ", "<< destinationParentDir << "," << newName;
+ this->callback( ecId, "FileException.cast( FileException.INVALID_MODIFICATION_ERR )" );
+ return;
+ }
+ QFile::rename(sourceFile,destinationFile);
+ this->callback( scId, "FileEntry.cast( '" + fileName + "', '" + destinationFile + "' )" );
+ return;
+ }
+ //try copy source file to dest file and remove it if success.
+ if(copyFile(scId,ecId,sourceFile, destinationParentDir, newName)){
+ remove(scId,ecId, sourceFile);
+ this->callback( scId, "" );
+ return;
+ } else {
+ qDebug() << "unable to copy the file, ecID is callbacked by copyFile";
+ return;
+ }
+
}
-void FileAPI::copyDir(int scId, int ecId,const QString& sourceFolder, const QString& destinationParentDir, const QString& newName)
+bool FileAPI::copyDir(int scId, int ecId,const QString& sourceFolder, const QString& destinationParentDir, const QString& newName)
{
- qDebug()<< Q_FUNC_INFO;
+ qDebug()<< Q_FUNC_INFO << sourceFolder << ", " << destinationParentDir << ", " << newName;
QDir sourceDir(sourceFolder);
- QString destFolder(destinationParentDir + "/" + newName);
- if(newName.isEmpty()){
- destFolder = (destinationParentDir + "/" + sourceDir.dirName());
- }
+ QString dirName = ((newName.isEmpty()) ? sourceDir.dirName() : newName);
+ QString destFolder(destinationParentDir + "/" + dirName);
+ // if(newName.isEmpty()){
+ // destFolder = (destinationParentDir + "/" + sourceDir.dirName());
+ // }
qDebug() << "destFolder: "<<destFolder;
+ //can't copy a dir on a file
+ if(QFileInfo(destFolder).isFile()){
+ this->callback( ecId, "FileException.cast( FileException.INVALID_MODIFICATION_ERR )" );
+ return false;
+ }
QDir destDir(destFolder);
- if(!destDir.exists())
- {
+ //can't copy on or in itself
+ if( (sourceFolder == destFolder) || (sourceFolder == destinationParentDir)){
+ this->callback( ecId, "FileException.cast( FileException.INVALID_MODIFICATION_ERR )" );
+ return false;
+ }
+ //create the dir
+ if(!destDir.exists()){
qDebug() << "mkdir" << destDir.mkdir(destFolder);;
+ } else{
+ this->callback( ecId, "FileException.cast( FileException.INVALID_MODIFICATION_ERR )" );
+ return false;
+ }
+
+ //recursively copying begin
+ if(copyFolder(sourceFolder, destFolder)){
+ this->callback( scId, "DirectoryEntry.cast( '" + dirName + "', '" + destFolder + "' )" );
+ return true;
+ }else{
+ this->callback( ecId, "FileException.cast( FileException.INVALID_MODIFICATION_ERR )" );
+ return false;
}
- copyFolder(sourceFolder, destFolder);
- this->callback( scId, "" );
}
void FileAPI::moveDir(int scId, int ecId,const QString& sourceDir, const QString& destinationParentDir, const QString& newName){
- qDebug()<< Q_FUNC_INFO;
- copyDir(scId, ecId, sourceDir, destinationParentDir,newName);
- removeRecursively(scId, ecId,sourceDir );
- this->callback( scId, "" );
+
+ QString dirName = ((newName.isEmpty()) ? QDir(sourceDir).dirName() : newName);
+ QString destFolder(destinationParentDir + "/" + dirName);
+ QDir destDir(destFolder);
+ if(destDir.exists() && (destFolder != sourceDir)){
+ qDebug() << "***empty folder***";
+ if(QDir(destinationParentDir).rmdir(dirName)){
+ qDebug() << "rmed";
+ }
+ }
+
+ if(copyDir(scId, ecId, sourceDir, destinationParentDir,newName)){
+ removeRecursively(scId, ecId,sourceDir );
+ this->callback( scId, "" );
+ } else {
+ qDebug()<< "unable to copy dirs" <<Q_FUNC_INFO <<
+ ", "<<sourceDir << ", "<< destinationParentDir << ", "<<newName;
+ return;
+ }
+
}
//helper function to copy foler to new destination
http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/blob/5361a613/src/plugins/fileapi.h
----------------------------------------------------------------------
diff --git a/src/plugins/fileapi.h b/src/plugins/fileapi.h
index 3dc5c83..918d10d 100644
--- a/src/plugins/fileapi.h
+++ b/src/plugins/fileapi.h
@@ -18,6 +18,7 @@
#define FILEAPI_H
#include "../cplugin.h"
+#include "../cordova.h"
#include <QDir>
#include <QVariantMap>
@@ -46,18 +47,19 @@ public slots:
void readEntries( int scId, int ecId, QString p_path );
void readAsDataURL( int scId, int ecId, QString p_path );
void readAsText( int scId, int ecId, QString p_path );
- void copyFile(int scId, int ecId,const QString& sourceFile, const QString& destinationParentDir, const QString& newName);
+ bool copyFile(int scId, int ecId,const QString& sourceFile, const QString& destinationParentDir, const QString& newName);
void moveFile(int scId, int ecId,const QString& sourceFile, const QString& destinationParentDir, const QString& newName);
- void copyDir(int scId, int ecId,const QString& sourceFolder, const QString& destFolder, const QString& newName);
+ bool copyDir(int scId, int ecId,const QString& sourceFolder, const QString& destFolder, const QString& newName);
void moveDir(int scId, int ecId,const QString& sourceFolder, const QString& destFolder, const QString& newName);
protected:
- static bool rmDir( QDir p_dir );
- static bool copyFolder(const QString& sourceFolder, const QString& destFolder);
+ bool rmDir( QDir p_dir );
+ bool copyFolder(const QString& sourceFolder, const QString& destFolder);
private:
static FileAPI* m_fileAPI;
typedef QMap<QString, QString> MimeTypeMap;
+ QString persistentDir_;
static MimeTypeMap createMimeTypeMap();
static MimeTypeMap mimeMap_;
};
http://git-wip-us.apache.org/repos/asf/incubator-cordova-qt/blob/5361a613/www/js/file.js
----------------------------------------------------------------------
diff --git a/www/js/file.js b/www/js/file.js
index c2d508b..7367729 100644
--- a/www/js/file.js
+++ b/www/js/file.js
@@ -448,11 +448,11 @@ FileEntry.prototype.file = function( successCallback, errorCallback ) {
Cordova.exec(successCallback, errorCallback, "com.cordova.File", "file", [this.fullPath]);
}
FileEntry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
- Cordova.exec(successCallback, errorCallback, "com.cordova.File", "copyFile", [this.fullPath, parent, newName]);
+ Cordova.exec(successCallback, errorCallback, "com.cordova.File", "copyFile", [this.fullPath, parent.fullPath, newName]);
};
FileEntry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
- Cordova.exec(successCallback, errorCallback, "com.cordova.File", "moveFile", [this.fullPath, parent, newName]);
+ Cordova.exec(successCallback, errorCallback, "com.cordova.File", "moveFile", [this.fullPath, parent.fullPath, newName]);
};
/**
@@ -520,11 +520,11 @@ DirectoryEntry.prototype.removeRecursively = function( successCallback, errorCal
}
DirectoryEntry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
- Cordova.exec(successCallback, errorCallback, "com.cordova.File", "copyDir", [this.fullPath, parent, newName]);
+ Cordova.exec(successCallback, errorCallback, "com.cordova.File", "copyDir", [this.fullPath, parent.fullPath, newName]);
};
DirectoryEntry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
- Cordova.exec(successCallback, errorCallback, "com.cordova.File", "moveDir", [this.fullPath, parent, newName]);
+ Cordova.exec(successCallback, errorCallback, "com.cordova.File", "moveDir", [this.fullPath, parent.fullPath, newName]);
};