[DEV] change the idea of file obstraction now it is folder/file/link see has FSNode

This commit is contained in:
Edouard DUPIN 2012-10-31 22:18:45 +01:00
parent 431e5e8886
commit b039a0fb29
4 changed files with 325 additions and 252 deletions

View File

@ -25,7 +25,7 @@
#include <etk/Types.h> #include <etk/Types.h>
#include <etk/DebugInternal.h> #include <etk/DebugInternal.h>
#include <etk/os/File.h> #include <etk/os/FSNode.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <etk/tool.h> #include <etk/tool.h>
@ -37,7 +37,7 @@
// zip file of the apk file for Android ==> set to zip file apk access // zip file of the apk file for Android ==> set to zip file apk access
static etk::UString s_fileAPK = ""; static etk::UString s_fileAPK = "";
staticetk::UString baseApplName = "ewolNoName"; static etk::UString baseApplName = "ewolNoName";
#if defined(__TARGET_OS__Android) #if defined(__TARGET_OS__Android)
static etk::UString baseFolderHome = "/sdcard/"; // home folder static etk::UString baseFolderHome = "/sdcard/"; // home folder
static etk::UString baseFolderData = "assets/"; // program Data static etk::UString baseFolderData = "assets/"; // program Data
@ -222,7 +222,7 @@ bool etk::File::LoadDataZip(void)
etk::FSNode::FSNode(void) : etk::FSNode::FSNode(void) :
m_userFileName(""); m_userFileName(""),
m_type(etk::FSN_TYPE_UNKNOW), m_type(etk::FSN_TYPE_UNKNOW),
m_rights(0), m_rights(0),
m_PointerFile(NULL) m_PointerFile(NULL)
@ -238,7 +238,7 @@ etk::FSNode::FSNode(void) :
etk::FSNode::FSNode(etk::UString nodeName) : etk::FSNode::FSNode(etk::UString nodeName) :
m_userFileName(""); m_userFileName(""),
m_type(etk::FSN_TYPE_UNKNOW), m_type(etk::FSN_TYPE_UNKNOW),
m_rights(0), m_rights(0),
m_PointerFile(NULL) m_PointerFile(NULL)
@ -249,7 +249,7 @@ etk::FSNode::FSNode(etk::UString nodeName) :
m_zipReadingOffset(-1) m_zipReadingOffset(-1)
#endif #endif
{ {
privateSetName(nodeName); PrivateSetName(nodeName);
} }
@ -265,11 +265,11 @@ etk::FSNode::~FSNode(void)
} }
} }
#define TK_DBG_MODE TK_VERBOSE //#define TK_DBG_MODE TK_VERBOSE
//#define TK_DBG_MODE TK_DEBUG #define TK_DBG_MODE TK_DEBUG
void etk::FSNode::privateSetName(etk::UString newName) void etk::FSNode::PrivateSetName(etk::UString& newName)
{ {
if( NULL != m_PointerFile if( NULL != m_PointerFile
#ifdef __TARGET_OS__Android #ifdef __TARGET_OS__Android
@ -293,6 +293,7 @@ void etk::FSNode::privateSetName(etk::UString newName)
m_type = etk::FSN_TYPE_UNKNOW; m_type = etk::FSN_TYPE_UNKNOW;
TK_DBG_MODE("1 :Set Name : " << newName ); TK_DBG_MODE("1 :Set Name : " << newName );
// generate destination name in case of the input error
etk::UString destFilename; etk::UString destFilename;
if (newName.Size() == 0) { if (newName.Size() == 0) {
// if no name ==> go to the root Folder // if no name ==> go to the root Folder
@ -300,146 +301,156 @@ void etk::FSNode::privateSetName(etk::UString newName)
} else { } else {
destFilename = newName; destFilename = newName;
} }
// ici ...
#ifdef __TARGET_OS__Windows #ifdef __TARGET_OS__Windows
TK_DBG_MODE("2 : Get file Name : " << destFilename << "start with 'c:/'=" << destFilename.StartWith("c:/")); bool isRoofFolder = false;
if (true == destFilename.StartWith("c:/")) { for (char iii='a' ; iii<='z' iii++) {
char tmpVal[10];
char tmpValMaj[10];
sprintf(tmpVal, "%c:/", iii);
sprintf(tmpValMaj, "%c:/", iii+'A'-'a');
if( true == destFilename.StartWith(tmpVal)
|| true == destFilename.StartWith(tmpValMaj)) {
isRoofFolder = true;
break;
}
}
TK_DBG_MODE("2 : Get file Name : " << destFilename << "start with 'X:/'=" << isRoofFolder);
if(true == isRoofFolder) {
destFilename.Remove(0, 3);
#else #else
TK_DBG_MODE("2 : Get file Name : " << destFilename << "start with '/'=" << destFilename.StartWith('/')); TK_DBG_MODE("2 : Get file Name : " << destFilename << "start with '/'=" << destFilename.StartWith('/'));
if (true == destFilename.StartWith('/')) { if(true == destFilename.StartWith('/')){
destFilename.Remove(0, 1);
#endif #endif
m_type = etk::FILE_TYPE_DIRECT; m_type = etk::FSN_TYPE_DIRECT;
if (type != etk::FILE_TYPE_DIRECT) { } else if( true == destFilename.StartWith("ROOT:")
TK_WARNING("Incompatible type with a file=\"" << newFilename << "\" ==> force it in direct mode ..."); || true == destFilename.StartWith("root:") ) {
} destFilename.Remove(0, 5);
m_type = etk::FSN_TYPE_DIRECT;
} else if( true == destFilename.StartWith("DIRECT:")
|| true == destFilename.StartWith("direct:") ) {
destFilename.Remove(0, 7);
m_type = etk::FSN_TYPE_DIRECT;
} else if( true == destFilename.StartWith("DATA:")
|| true == destFilename.StartWith("data:") ) {
destFilename.Remove(0, 5);
m_type = etk::FSN_TYPE_DATA;
} else if( true == destFilename.StartWith("USERDATA:")
|| true == destFilename.StartWith("userdata:") ) {
destFilename.Remove(0, 9);
m_type = etk::FSN_TYPE_USER_DATA;
} else if( true == destFilename.StartWith("CACHE:")
|| true == destFilename.StartWith("cache:") ) {
destFilename.Remove(0, 6);
m_type = etk::FSN_TYPE_CACHE;
} else if( true == destFilename.StartWith("THEME:")
|| true == destFilename.StartWith("theme:") ) {
destFilename.Remove(0, 6);
m_type = etk::FSN_TYPE_THEME;
} else if(true == destFilename.StartWith("~")) {
destFilename.Remove(0, 1);
m_type = etk::FSN_TYPE_HOME;
} else if( true == destFilename.StartWith("HOME:")
|| true == destFilename.StartWith("home:") ) {
destFilename.Remove(0, 5);
m_type = etk::FSN_TYPE_HOME;
} else if (true == destFilename.StartWith(baseFolderHome) ) {
destFilename.Remove(0, baseFolderHome.Size());
m_type = etk::FSN_TYPE_HOME;
} else { } else {
if (type == etk::FILE_TYPE_DIRECT) { // nothing to remove
//TK_WARNING("Incompatible type with a file=\"" << newFilename << "\" ==> force it in FILE_TYPE_DATA mode ..."); //Other type is Relative :
//m_type = etk::FILE_TYPE_DATA; m_type = etk::FSN_TYPE_RELATIF;
m_type = etk::FILE_TYPE_DIRECT;
// add current path :
// Get the command came from the running of the program :
char cCurrentPath[FILENAME_MAX];
if (!getcwd(cCurrentPath, FILENAME_MAX)) {
return;
}
cCurrentPath[FILENAME_MAX - 1] = '\0';
etk::UString tmpFilename = destFilename;
destFilename = cCurrentPath;
destFilename += "/";
destFilename += tmpFilename;
} else {
m_type = type;
}
} }
bool needUnpack = false; m_userFileName = destFilename;
#if ETK_DEBUG_LEVEL > 3 TK_DBG_MODE("3 : parse done : [" << m_type << "->\"" << m_userFileName << "\"");
char *mode = NULL;
// Now we reduce the path with all un-needed
m_userFileName = etk::tool::SimplifyPath(m_userFileName);
TK_DBG_MODE("4 : Path simplification : [" << m_type << "->\"" << m_userFileName << "\"");
#ifdef __TARGET_OS__Android
// Get on android the property of the file ID ... in zip ... ==> maybe done this later ...
if (m_type == etk::FSN_TYPE_DATA) {
etk::UString tmpFilename = baseFolderData + m_userFileName;
for (int iii=0; iii<s_APKnbFiles; iii++) {
const char* name = zip_get_name(s_APKArchive, iii, 0);
if (name == NULL) {
TK_ERROR("Can not get pointer on file in the APK file id " << iii);
continue;
}
if (tmpFilename == name) {
m_idZipFile = iii;
break;
}
}
if (-1 == m_idZipFile) {
TK_ERROR("File Does not existed ... in APK : \"" << tmpFilename << "\"");
} else {
TK_DBG_MODE("File existed ... in APK : \"" << tmpFilename << "\" ==> id=" << m_idZipFile);
}
}
#endif #endif
// TODO : Get rights
// TODO : Check if it is a file or a folder ...
}
etk::UString etk::FSNode::GetFileSystemName(void) const
{
etk::UString output;
switch (m_type) switch (m_type)
{ {
case etk::FILE_TYPE_DATA:
{
#if DEBUG_LEVEL > 3
mode = "FILE_TYPE_DATA";
#endif
#ifdef __TARGET_OS__Android
etk::UString tmpFilename = baseFolderData + destFilename;
for (int iii=0; iii<s_APKnbFiles; iii++) {
const char* name = zip_get_name(s_APKArchive, iii, 0);
if (name == NULL) {
return;
}
if (tmpFilename == name) {
m_idZipFile = iii;
break;
}
}
if (-1 == m_idZipFile) {
TK_ERROR("File Does not existed ... in APK : \"" << tmpFilename << "\"");
} else {
TK_DBG_MODE("File existed ... in APK : \"" << tmpFilename << "\" ==> id=" << m_idZipFile);
}
#else
//etk::UString tmpFilename = destFilename;
//destFilename = baseFolderData;
//destFilename += tmpFilename;
#endif
}
break;
case etk::FILE_TYPE_USER_DATA:
{
#if DEBUG_LEVEL > 3
mode = "FILE_TYPE_USER_DATA";
#endif
etk::UString tmpFilename = destFilename;
destFilename = baseFolderDataUser;
destFilename += tmpFilename;
}
needUnpack = true;
break;
case etk::FILE_TYPE_CACHE:
{
#if DEBUG_LEVEL > 3
mode = "FILE_TYPE_CACHE";
#endif
etk::UString tmpFilename = destFilename;
destFilename = baseFolderCache;
destFilename += tmpFilename;
}
needUnpack = true;
break;
default: default:
// nothing to do ... case etk::FSN_TYPE_UNKNOW:
#if DEBUG_LEVEL > 3 output = baseFolderHome;
mode = "FILE_TYPE_DIRECT"; break;
#endif case etk::FSN_TYPE_DIRECT:
needUnpack = true; output = "/";
break;
case etk::FSN_TYPE_RELATIF:
{
// Get the command came from the running of the program :
char cCurrentPath[FILENAME_MAX];
if (!getcwd(cCurrentPath, FILENAME_MAX)) {
TK_WARNING("Can not get the curent path");
output = "/";
}
cCurrentPath[FILENAME_MAX - 1] = '\0';
output = cCurrentPath;
output += "/";
}
break;
case etk::FSN_TYPE_HOME:
output = baseFolderHome;
break;
case etk::FSN_TYPE_DATA:
output = baseFolderData;
break;
case etk::FSN_TYPE_USER_DATA:
output = baseFolderDataUser;
break;
case etk::FSN_TYPE_CACHE:
output = baseFolderCache;
break;
case etk::FSN_TYPE_THEME:
output = baseFolderData + "/theme/";
break; break;
} }
TK_DBG_MODE("3 : Get file Name : " << destFilename ); output += m_userFileName;
if (true == needUnpack) { return output;
int32_t lastPos = destFilename.FindBack('/');
if (-1 != lastPos) {
m_shortFilename = destFilename.Extract(lastPos+1);
m_folder = destFilename.Extract(0, lastPos);
} else {
// Basic ERROR ...
TK_DBG_MODE("file : \"" << destFilename << "\" ==> No data???");
m_shortFilename = destFilename;
m_folder = "";
}
// Get the real Path of the current File
m_folder = etk::tool::SimplifyPath(m_folder);
} else {
int32_t lastPos = destFilename.FindBack('/');
if (-1 != lastPos) {
m_shortFilename = destFilename.Extract(lastPos+1);
m_folder = destFilename.Extract(0, lastPos);
} else {
// Basic ERROR ...
TK_DBG_MODE("file : \"" << destFilename << "\" ==> No data???");
m_shortFilename = destFilename;
}
}
TK_DBG_MODE("Set FileName :\"" << m_folder << "\" / \"" << m_shortFilename << "\"");
TK_VERBOSE(" ==> mode=" << mode);
} }
etk::UString etk::FSNode::GetFileSystemName(void)
{
return "";
}
/* /*
All Right of the file All Right of the file
*/ */
bool etk::FSNode::Exist(void) bool etk::FSNode::Exist(void)
{ {
#ifdef __TARGET_OS__Android #ifdef __TARGET_OS__Android
if (etk::FILE_TYPE_DATA == m_type) { if (etk::FSN_TYPE_DATA == m_type) {
if (m_idZipFile >= -1 && m_idZipFile < s_APKnbFiles) { if (m_idZipFile >= -1 && m_idZipFile < s_APKnbFiles) {
return true; return true;
} }
@ -447,23 +458,8 @@ bool etk::FSNode::Exist(void)
} }
#endif #endif
FILE *myFile=NULL; FILE *myFile=NULL;
etk::UString myCompleateName; etk::UString myCompleateName=GetFileSystemName();
switch (m_type)
{
case etk::FILE_TYPE_DATA:
myCompleateName = baseFolderData;
break;
case etk::FILE_TYPE_USER_DATA:
myCompleateName = baseFolderDataUser;
break;
case etk::FILE_TYPE_CACHE:
myCompleateName = baseFolderCache;
break;
default:
myCompleateName = "";
break;
}
myCompleateName += GetCompleateName();
myFile=fopen(myCompleateName.c_str(),"rb"); myFile=fopen(myCompleateName.c_str(),"rb");
if(NULL == myFile) { if(NULL == myFile) {
TK_DEBUG("try to open : " << myCompleateName.c_str()); TK_DEBUG("try to open : " << myCompleateName.c_str());
@ -472,89 +468,110 @@ bool etk::FSNode::Exist(void)
fclose(myFile); fclose(myFile);
return true; return true;
} }
bool etk::FSNode::IsFile(void) bool etk::FSNode::IsFile(void)
{ {
return ((m_rights&etk::RIGHT_FILE)!=0)?true:false; return ((m_rights&etk::RIGHT_FILE)!=0)?true:false;
} }
bool etk::FSNode::IsFolder(void) bool etk::FSNode::IsFolder(void)
{ {
return ((m_rights&etk::RIGHT_FOLDER)!=0)?true:false; return ((m_rights&etk::RIGHT_FOLDER)!=0)?true:false;
} }
bool etk::FSNode::IsLink(void) bool etk::FSNode::IsLink(void)
{ {
return ((m_rights&etk::RIGHT_LINK)!=0)?true:false; return ((m_rights&etk::RIGHT_LINK)!=0)?true:false;
} }
// User // User
bool etk::FSNode::IsUserReadable(void) bool etk::FSNode::IsUserReadable(void)
{ {
return ((m_rights&etk::RIGHT_USER_READ)!=0)?true:false; return ((m_rights&etk::RIGHT_USER_READ)!=0)?true:false;
} }
bool etk::FSNode::IsUserWritable(void) bool etk::FSNode::IsUserWritable(void)
{ {
return ((m_rights&etk::RIGHT_USER_WRITE)!=0)?true:false; return ((m_rights&etk::RIGHT_USER_WRITE)!=0)?true:false;
} }
bool etk::FSNode::IsUserRunable(void) bool etk::FSNode::IsUserRunable(void)
{ {
return ((m_rights&etk::RIGHT_USER_EXECUTE)!=0)?true:false; return ((m_rights&etk::RIGHT_USER_EXECUTE)!=0)?true:false;
} }
void etk::FSNode::SetUserReadable(bool newStatus) void etk::FSNode::SetUserReadable(bool newStatus)
{ {
} }
void etk::FSNode::SetUserWritable(bool newStatus) void etk::FSNode::SetUserWritable(bool newStatus)
{ {
} }
void etk::FSNode::SetUserRunable(bool newStatus) void etk::FSNode::SetUserRunable(bool newStatus)
{ {
} }
// group // group
bool etk::FSNode::IsGroupReadable(void) bool etk::FSNode::IsGroupReadable(void)
{ {
return ((m_rights&etk::RIGHT_GROUP_READ)!=0)?true:false; return ((m_rights&etk::RIGHT_GROUP_READ)!=0)?true:false;
} }
bool etk::FSNode::IsGroupWritable(void) bool etk::FSNode::IsGroupWritable(void)
{ {
return ((m_rights&etk::RIGHT_GROUP_WRITE)!=0)?true:false; return ((m_rights&etk::RIGHT_GROUP_WRITE)!=0)?true:false;
} }
bool etk::FSNode::IsGroupRunable(void) bool etk::FSNode::IsGroupRunable(void)
{ {
return ((m_rights&etk::RIGHT_GROUP_EXECUTE)!=0)?true:false; return ((m_rights&etk::RIGHT_GROUP_EXECUTE)!=0)?true:false;
} }
void etk::FSNode::SetGroupReadable(bool newStatus) void etk::FSNode::SetGroupReadable(bool newStatus)
{ {
} }
void etk::FSNode::SetGroupWritable(bool newStatus) void etk::FSNode::SetGroupWritable(bool newStatus)
{ {
} }
void etk::FSNode::SetGroupRunable(bool newStatus) void etk::FSNode::SetGroupRunable(bool newStatus)
{ {
} }
// other // other
bool etk::FSNode::IsOtherReadable(void) bool etk::FSNode::IsOtherReadable(void)
{ {
return ((m_rights&etk::RIGHT_OTHER_READ)!=0)?true:false; return ((m_rights&etk::RIGHT_OTHER_READ)!=0)?true:false;
} }
bool etk::FSNode::IsOtherWritable(void) bool etk::FSNode::IsOtherWritable(void)
{ {
return ((m_rights&etk::RIGHT_OTHER_WRITE)!=0)?true:false; return ((m_rights&etk::RIGHT_OTHER_WRITE)!=0)?true:false;
} }
bool etk::FSNode::IsOtherRunable(void) bool etk::FSNode::IsOtherRunable(void)
{ {
return ((m_rights&etk::RIGHT_OTHER_EXECUTE)!=0)?true:false; return ((m_rights&etk::RIGHT_OTHER_EXECUTE)!=0)?true:false;
} }
void etk::FSNode::SetOtherReadable(bool newStatus) void etk::FSNode::SetOtherReadable(bool newStatus)
{ {
} }
void etk::FSNode::SetOtherWritable(bool newStatus) void etk::FSNode::SetOtherWritable(bool newStatus)
{ {
} }
void etk::FSNode::SetOtherRunable(bool newStatus) void etk::FSNode::SetOtherRunable(bool newStatus)
{ {
@ -566,20 +583,70 @@ void etk::FSNode::SetOtherRunable(bool newStatus)
*/ */
void etk::FSNode::SetName(etk::UString newName) void etk::FSNode::SetName(etk::UString newName)
{ {
privateSetName(newName); PrivateSetName(newName);
} }
etk::UString etk::FSNode::GetNameFolder(void) const etk::UString etk::FSNode::GetNameFolder(void) const
{ {
etk::UString myCompleateName=GetFileSystemName();
int32_t lastPos = myCompleateName.FindBack('/');
if (-1 != lastPos) {
return myCompleateName.Extract(0, lastPos);
}
return ""; return "";
} }
etk::UString etk::FSNode::GetName(void) const etk::UString etk::FSNode::GetName(void) const
{ {
return ""; etk::UString output;
switch (m_type)
{
default:
case etk::FSN_TYPE_UNKNOW:
output = "HOME:";
break;
case etk::FSN_TYPE_DIRECT:
output = "/";
break;
case etk::FSN_TYPE_RELATIF:
output = "";
break;
case etk::FSN_TYPE_HOME:
output = "~";
break;
case etk::FSN_TYPE_DATA:
output = "DATA:";
break;
case etk::FSN_TYPE_USER_DATA:
output = "USERDATA";
break;
case etk::FSN_TYPE_CACHE:
output = "CACHE";
break;
case etk::FSN_TYPE_THEME:
output = "THEME:";
break;
}
output += m_userFileName;
return output;
} }
etk::UString etk::FSNode::GetNameFile(void) const etk::UString etk::FSNode::GetNameFile(void) const
{ {
etk::UString myCompleateName=GetFileSystemName();
int32_t lastPos = myCompleateName.FindBack('/');
if (-1 != lastPos) {
return myCompleateName.Extract(lastPos+1);
}
return ""; return "";
} }
bool etk::FSNode::Touch(void) bool etk::FSNode::Touch(void)
{ {
return false; return false;
@ -602,30 +669,34 @@ uint64_t etk::FSNode::TimeModified(void)
*/ */
const etk::FSNode& etk::FSNode::operator= (const etk::FSNode &obj ) const etk::FSNode& etk::FSNode::operator= (const etk::FSNode &obj )
{ {
if( this != &etkF ) // avoid copy to itself if( this != &obj ) // avoid copy to itself
{ {
m_folder = etkF.m_folder; m_userFileName = obj.m_userFileName;
m_shortFilename = etkF.m_shortFilename; m_type = obj.m_type;
m_lineNumberOpen = etkF.m_lineNumberOpen; m_rights = obj.m_rights;
m_type = etkF.m_type; if( NULL != m_PointerFile
if (NULL != m_PointerFile) { #ifdef __TARGET_OS__Android
TK_ERROR("Missing close the file : \"" << GetCompleateName() << "\""); || NULL != m_zipData
fClose(); #endif
) {
TK_ERROR("Missing close the file : " << *this);
FileClose();
m_PointerFile = NULL;
} }
#ifdef __TARGET_OS__Android #ifdef __TARGET_OS__Android
m_idZipFile = etkF.m_idZipFile; m_idZipFile = etkF.m_idZipFile;
m_zipData = NULL; m_zipData = NULL;
m_zipDataSize = 0; m_zipDataSize = 0;
m_zipReadingOffset = 0; m_zipReadingOffset = 0;
//m_zipPointerFile = NULL;
#endif #endif
} }
return *this; return *this;
} }
bool etk::FSNode::operator== (const etk::FSNode &obj ) const bool etk::FSNode::operator== (const etk::FSNode &obj ) const
{ {
if( this != &etkF ) { if( this != &obj ) {
if (etkF.GetCompleateName() == GetCompleateName() ) { if( obj.m_userFileName == m_userFileName
&& obj.m_type == m_type ) {
return true; return true;
} else { } else {
return false; return false;
@ -634,14 +705,50 @@ bool etk::FSNode::operator== (const etk::FSNode &obj ) const
} }
return true; return true;
} }
bool etk::FSNode::operator!= (const etk::FSNode &obj ) const bool etk::FSNode::operator!= (const etk::FSNode &obj ) const
{ {
return !(*this == etkF); return !(*this == obj);
} }
friend etk::CCout& etk::FSNode::operator <<( etk::CCout &os,const etk::FSNode &obj) etk::CCout& etk::operator <<(etk::CCout &os, const etk::FSNode &obj)
{ {
os << obj.m_userFileName; os << "[" << obj.m_type << "]->\"" << obj.m_userFileName << "\"";
return os;
}
etk::CCout& etk::operator <<(etk::CCout &os, const etk::FSNType_te &obj)
{
switch (obj)
{
case etk::FSN_TYPE_UNKNOW:
os << "FSN_TYPE_UNKNOW";
break;
case etk::FSN_TYPE_DIRECT:
os << "FSN_TYPE_DIRECT";
break;
case etk::FSN_TYPE_RELATIF:
os << "FSN_TYPE_RELATIF";
break;
case etk::FSN_TYPE_HOME:
os << "FSN_TYPE_HOME";
break;
case etk::FSN_TYPE_DATA:
os << "FSN_TYPE_DATA";
break;
case etk::FSN_TYPE_USER_DATA:
os << "FSN_TYPE_USER_DATA";
break;
case etk::FSN_TYPE_CACHE:
os << "FSN_TYPE_CACHE";
break;
case etk::FSN_TYPE_THEME:
os << "FSN_TYPE_THEME";
break;
default:
os << "FSN_TYPE_????";
break;
}
return os; return os;
} }
@ -650,16 +757,16 @@ friend etk::CCout& etk::FSNode::operator <<( etk::CCout &os,const etk::FSNode &o
*/ */
int32_t etk::FSNode::FolderCount(void) int32_t etk::FSNode::FolderCount(void)
{ {
return 0;
} }
etk::Vector<ewol::FSNode> etk::FSNode::FolderGetSubList(void) etk::Vector<etk::FSNode> etk::FSNode::FolderGetSubList(void)
{ {
etk::Vector<ewol::FSNode> tmpp; etk::Vector<etk::FSNode> tmpp;
return tmpp; return tmpp;
} }
ewol::FSNode etk::FSNode::FolderGetParent(void) etk::FSNode etk::FSNode::FolderGetParent(void)
{ {
ewol::FSNode tmpp; etk::FSNode tmpp;
return tmpp; return tmpp;
} }
@ -668,10 +775,10 @@ ewol::FSNode etk::FSNode::FolderGetParent(void)
*/ */
bool etk::FSNode::FileHasExtention(void) bool etk::FSNode::FileHasExtention(void)
{ {
int32_t lastPos = m_shortFilename.FindBack('.'); int32_t lastPos = m_userFileName.FindBack('.');
if( -1 != lastPos // not find the . if( -1 != lastPos // not find the .
&& 0 != lastPos // Find a . at the fist position .jdlskjdfklj ==> hiden file && 0 != lastPos // Find a . at the fist position .jdlskjdfklj ==> hiden file
&& m_shortFilename.Size() != lastPos ) // Remove file ended with . && m_userFileName.Size() != lastPos ) // Remove file ended with .
{ {
return true; return true;
} else { } else {
@ -682,13 +789,13 @@ bool etk::FSNode::FileHasExtention(void)
etk::UString etk::FSNode::FileGetExtention(void) etk::UString etk::FSNode::FileGetExtention(void)
{ {
etk::UString tmpExt = ""; etk::UString tmpExt = "";
int32_t lastPos = m_shortFilename.FindBack('.'); int32_t lastPos = m_userFileName.FindBack('.');
if( -1 != lastPos // not find the . if( -1 != lastPos // not find the .
&& 0 != lastPos // Find a . at the fist position .jdlskjdfklj ==> hiden file && 0 != lastPos // Find a . at the fist position .jdlskjdfklj ==> hiden file
&& m_shortFilename.Size() != lastPos ) // Remove file ended with . && m_userFileName.Size() != lastPos ) // Remove file ended with .
{ {
// Get the FileName // Get the FileName
tmpExt = m_shortFilename.Extract(lastPos+1); tmpExt = m_userFileName.Extract(lastPos+1);
} }
return tmpExt; return tmpExt;
} }
@ -703,26 +810,10 @@ int32_t etk::FSNode::FileSize(void)
} }
#endif #endif
FILE *myFile=NULL; FILE *myFile=NULL;
etk::UString myCompleateName; etk::UString myCompleateName = GetFileSystemName();
switch (m_type)
{
case etk::FILE_TYPE_DATA:
myCompleateName = baseFolderData;
break;
case etk::FILE_TYPE_USER_DATA:
myCompleateName = baseFolderDataUser;
break;
case etk::FILE_TYPE_CACHE:
myCompleateName = baseFolderCache;
break;
default:
myCompleateName = "";
break;
}
myCompleateName += GetCompleateName();
myFile=fopen(myCompleateName.c_str(),"rb"); myFile=fopen(myCompleateName.c_str(),"rb");
if(NULL == myFile) { if(NULL == myFile) {
//EWOL_ERROR("Can not find the file name=\"" << m_folder << "\" / \"" << m_shortFilename << "\""); //EWOL_ERROR("Can not find the file " << *this);
return -1; return -1;
} }
int32_t size = 0; int32_t size = 0;
@ -740,29 +831,13 @@ bool etk::FSNode::FileOpenRead(void)
} }
#endif #endif
if (NULL != m_PointerFile) { if (NULL != m_PointerFile) {
TK_CRITICAL("File Already open : \"" << GetCompleateName() << "\""); TK_CRITICAL("File Already open : " << *this);
return true; return true;
} }
etk::UString myCompleateName; etk::UString myCompleateName = GetFileSystemName();
switch (m_type)
{
case etk::FILE_TYPE_DATA:
myCompleateName = baseFolderData;
break;
case etk::FILE_TYPE_USER_DATA:
myCompleateName = baseFolderDataUser;
break;
case etk::FILE_TYPE_CACHE:
myCompleateName = baseFolderCache;
break;
default:
myCompleateName = "";
break;
}
myCompleateName += GetCompleateName();
m_PointerFile=fopen(myCompleateName.c_str(),"rb"); m_PointerFile=fopen(myCompleateName.c_str(),"rb");
if(NULL == m_PointerFile) { if(NULL == m_PointerFile) {
TK_ERROR("Can not find the file name=\"" << GetCompleateName() << "\""); TK_ERROR("Can not find the file " << *this );
return false; return false;
} }
return true; return true;
@ -775,29 +850,13 @@ bool etk::FSNode::FileOpenWrite(void)
} }
#endif #endif
if (NULL != m_PointerFile) { if (NULL != m_PointerFile) {
TK_CRITICAL("File Already open : \"" << GetCompleateName() << "\""); TK_CRITICAL("File Already open : " << *this);
return true; return true;
} }
etk::UString myCompleateName; etk::UString myCompleateName = GetFileSystemName();
switch (m_type)
{
case etk::FILE_TYPE_DATA:
myCompleateName = baseFolderData;
break;
case etk::FILE_TYPE_USER_DATA:
myCompleateName = baseFolderDataUser;
break;
case etk::FILE_TYPE_CACHE:
myCompleateName = baseFolderCache;
break;
default:
myCompleateName = "";
break;
}
myCompleateName += GetCompleateName();
m_PointerFile=fopen(myCompleateName.c_str(),"wb"); m_PointerFile=fopen(myCompleateName.c_str(),"wb");
if(NULL == m_PointerFile) { if(NULL == m_PointerFile) {
TK_ERROR("Can not find the file name=\"" << GetCompleateName() << "\""); TK_ERROR("Can not find the file " << *this);
return false; return false;
} }
return true; return true;
@ -807,7 +866,7 @@ bool etk::FSNode::FileClose(void)
#ifdef __TARGET_OS__Android #ifdef __TARGET_OS__Android
if (etk::FILE_TYPE_DATA == m_type) { if (etk::FILE_TYPE_DATA == m_type) {
if (NULL == m_zipData) { if (NULL == m_zipData) {
TK_CRITICAL("File Already closed : \"" << GetCompleateName() << "\""); TK_CRITICAL("File Already closed : " << *this);
return false; return false;
} }
delete[] m_zipData; delete[] m_zipData;
@ -818,7 +877,7 @@ bool etk::FSNode::FileClose(void)
} }
#endif #endif
if (NULL == m_PointerFile) { if (NULL == m_PointerFile) {
TK_CRITICAL("File Already closed : \"" << GetCompleateName() << "\""); TK_CRITICAL("File Already closed : " << *this);
return false; return false;
} }
fclose(m_PointerFile); fclose(m_PointerFile);
@ -898,7 +957,7 @@ int32_t etk::FSNode::FileWrite(void * data, int32_t blockSize, int32_t nbBlock)
{ {
#ifdef __TARGET_OS__Android #ifdef __TARGET_OS__Android
if (etk::FILE_TYPE_DATA == m_type) { if (etk::FILE_TYPE_DATA == m_type) {
TK_CRITICAL("Can not write on data inside APK : \"" << GetCompleateName() << "\""); TK_CRITICAL("Can not write on data inside APK : " << *this);
return 0; return 0;
} }
#endif #endif

View File

@ -34,19 +34,20 @@
namespace etk namespace etk
{ {
// Right Flags : // Right Flags :
typedef enum { enum {
RIGHT_OTHER_EXECUTE = 1 << 0; RIGHT_OTHER_EXECUTE = 1 << 0,
RIGHT_OTHER_WRITE = 1 << 1; RIGHT_OTHER_WRITE = 1 << 1,
RIGHT_OTHER_READ = 1 << 2; RIGHT_OTHER_READ = 1 << 2,
RIGHT_GROUP_EXECUTE = 1 << 3; RIGHT_GROUP_EXECUTE = 1 << 3,
RIGHT_GROUP_WRITE = 1 << 4; RIGHT_GROUP_WRITE = 1 << 4,
RIGHT_GROUP_READ = 1 << 5; RIGHT_GROUP_READ = 1 << 5,
RIGHT_USER_EXECUTE = 1 << 6; RIGHT_USER_EXECUTE = 1 << 6,
RIGHT_USER_WRITE = 1 << 7; RIGHT_USER_WRITE = 1 << 7,
RIGHT_USER_READ = 1 << 8; RIGHT_USER_READ = 1 << 8,
RIGHT_FILE = 1 << 9; RIGHT_FILE = 1 << 9,
RIGHT_FOLDER = 1 << 10; RIGHT_FOLDER = 1 << 10,
RIGHT_LINK = 1 << 12; RIGHT_LINK = 1 << 12,
RIGHT_PARSE_DONE = 1 << 31 //!< a simple flag to know if the right has been checked
}; };
typedef enum { typedef enum {
@ -55,6 +56,12 @@ namespace etk
FSN_TYPE_DIRECT, FSN_TYPE_DIRECT,
FSN_TYPE_RELATIF, FSN_TYPE_RELATIF,
// depend on case
// - PC : ~/
// - Android : /sdcard/
// - Apple : ????
FSN_TYPE_HOME,
// depend of the case // depend of the case
// - PC : /usr/shared/programName/ // - PC : /usr/shared/programName/
// - Android : Internal at the executable file (pointer on static area) // - Android : Internal at the executable file (pointer on static area)
@ -62,7 +69,7 @@ namespace etk
FSN_TYPE_DATA, FSN_TYPE_DATA,
// depend on case // depend on case
// - PC : ~/.programName/ // - PC : ~/.local/programName/
// - Android : /data/data/programName/files/ // - Android : /data/data/programName/files/
// - Apple : ???? // - Apple : ????
FSN_TYPE_USER_DATA, FSN_TYPE_USER_DATA,
@ -84,12 +91,14 @@ namespace etk
FSN_TYPE_THEME, FSN_TYPE_THEME,
} FSNType_te; } FSNType_te;
etk::CCout& operator <<(etk::CCout &os, const etk::FSNType_te &obj);
/* /*
note : The filename can be note : The filename can be
Direct mode : Direct mode :
DIRECT:/sdfsdfsdf/ DIRECT:/sdfsdfsdf/
/XX ==> for Linux / Mac / Android /XX ==> for Linux / Mac / Android
c:/xxx ==> for Windows [a-zA-Z]:/xxx ==> for Windows
Data mode : Data mode :
DATA:folder/File.ccc DATA:folder/File.ccc
@ -106,7 +115,7 @@ namespace etk
Get the root folder : Get the root folder :
ROOT: ROOT:
/ /
C: ==> create more risk ... [a-zA-Z]: ==> create more risk ...
Get the Home folder : Get the Home folder :
HOME: HOME:
@ -122,8 +131,8 @@ namespace etk
// specific when file Access : // specific when file Access :
FILE * m_PointerFile; FILE * m_PointerFile;
private: private:
etk::UString GetFileSystemName(void); etk::UString GetFileSystemName(void) const;
void privateSetName(etk::UString& newName); void PrivateSetName(etk::UString& newName);
private: private:
#ifdef __TARGET_OS__Android #ifdef __TARGET_OS__Android
bool LoadDataZip(void); bool LoadDataZip(void);
@ -191,9 +200,9 @@ namespace etk
/* /*
Folder specific : Folder specific :
*/ */
int32_t FolderCount(void); int32_t FolderCount(void);
etk::Vector<ewol::FSNode> FolderGetSubList(void); etk::Vector<etk::FSNode> FolderGetSubList(void);
ewol::FSNode FolderGetParent(void); // ordered by name ... etk::FSNode FolderGetParent(void); // ordered by name ...
/* /*
File Specific : File Specific :
@ -211,13 +220,13 @@ namespace etk
}; };
etk::CCout& operator <<(etk::CCout &os, const etk::FSNode &obj); etk::CCout& operator <<(etk::CCout &os, const etk::FSNode &obj);
/*
void SetBaseFolderData(const char * folder); void SetBaseFolderData(const char * folder);
void SetBaseFolderDataUser(const char * folder); void SetBaseFolderDataUser(const char * folder);
void SetBaseFolderCache(const char * folder); void SetBaseFolderCache(const char * folder);
void InitDefaultFolder(const char * applName); void InitDefaultFolder(const char * applName);
etk::UString GetUserHomeFolder(void); etk::UString GetUserHomeFolder(void);
*/
} }

View File

@ -18,6 +18,7 @@ FILE_LIST+= \
FILE_LIST+= \ FILE_LIST+= \
etk/os/File.cpp \ etk/os/File.cpp \
etk/os/FSNode.cpp \
etk/os/Memory.cpp \ etk/os/Memory.cpp \

View File

@ -101,6 +101,10 @@ LOCAL_COPY_FILES := ../../share/textured3D.prog:textured3D.prog \
../../share/textured.prog:textured.prog \ ../../share/textured.prog:textured.prog \
../../share/textured.frag:textured.frag \ ../../share/textured.frag:textured.frag \
../../share/textured.vert:textured.vert \ ../../share/textured.vert:textured.vert \
LOCAL_PLOPPPPPPP := \
\ \
../../share/widgetEntry.prog:widgetEntry.prog \ ../../share/widgetEntry.prog:widgetEntry.prog \
../../share/widgetEntry.frag:widgetEntry.frag \ ../../share/widgetEntry.frag:widgetEntry.frag \