EWOL: File access {#ewol_tutorial_file_access} ================= @tableofcontents Objectifs: {#ewol_tutorial_file_access_objectifs} ========== - Understand why we wrap interface on file system - read and write files Limitation {#ewol_tutorial_file_access_limit} ========== Application generation is really simple, but package management can create some problems... For example : - Android does not permit access on the file system, but we need data that is named assets, these data in contained in a zip file. - Linux set his own application data in a special path : /usr/shared/applName/ - MacOs create a bundle (*.app) that is a folder with all application data. - ... For all these reasons we need to wrap standard application interface. (you can acces directly but it could be tricky and depend on the target) Generic Properties {#ewol_tutorial_file_access_property} ================== By default we dertermine some basics for files. Then we need to determine file in the tree with: - **"DATA:XXX"** Application internal data * Linux: /usr/share/applName/ * Android: /xxx/yyy/applName.apk/asssets/ * IOs: applName.app/share * MacOs: applName.app/Resources - **"USERDATA:XXX"** User save data (like game save) * Linux: ~/.local/share/applName/ * Android: /xxx/yyy/data/applName/ - **"HOME:XXX"** User home folder * Linux: ~/ * Android: /sdcard/ * IOs: --- => no Home * MacOs: ~/ - **"/XXX"** Direct acces on a file in the fileSystem - ... When you will call a file, you need to just call it with the starting name. For example if I want to access at an application data I will call the file : "DATA:myImage.png" Integrate a file in a package {#ewol_tutorial_file_access_package} ============================= In your ```lutin_xxx.py``` file add: ```{.py} # to copy a single file: myModule.copy_file("relative/path/file.svg","destination/folder/fileNewName.svg") # to copy an entire patern path myModule.copy_path("relative/path/start*.png","destination/folder/") ``` And now you can acces on these file with : "DATA:destination/folder/fileNewName.svg" Read a file {#ewol_tutorial_file_access_read} =========== ```{.cpp} #include ... etk::FSNode file("DATA:destination/folder/file.svg"); if (file.exist() == false) { APPL_ERROR("Can not read the file (Does not exist)"); return; } APPL_INFO("open :" << file << " with size=" << file.fileSize()); if (file.fileOpenRead() == false) { APPL_ERROR("Can not open in read mode the file: " << file); return; } // get a char APPL_INFO("read in: " << file << " the first char='" << file.fileGet() << "'"); // Get a line std::string output; file.fileGets(output); APPL_INFO("and the end of the line ='" << output << "'"); // close the file (note : if you did not do it, it will be close automaticly with an error) file.fileClose(); ``` Write a file {#ewol_tutorial_file_access_write} ============ ```{.cpp} #include ... etk::FSNode file("USERDATA:exmple.txt"); APPL_INFO("open :" << file); if (file.fileOpenWrite() == false) { APPL_ERROR("Can not open in write mode the file: " << file); return; } // put a char file.filePut('A'); // write a line file.filePuts(" other string to put in the file ... \n"); // close the file (note : if you did not do it, it will be close automaticly with an error) file.fileClose(); ``` 'Theme' management: {#ewol_tutorial_file_access_theme} =================== The theme management is a subset of a file selected by a main key. For example the basic theme of an API can be manage with only 2 commands (set the theme, and request upate of GUI) At the start of the program, you might specify the default path theme: ```{.cpp} etk::theme::setNameDefault("GUI_COLOR", "theme/black"); etk::theme::setNameDefault("GUI_SHAPE", "theme/rounded"); ``` And when you want to change the theme, just call: ```{.cpp} // change the theme : etk::theme::setName("GUI_COLOR", "theme/white"); // force reload of all the resources : ewol::getContext().getResourcesManager().reLoadResources(); ewol::getContext().forceRedrawAll(); ``` **Note:** ``` This is not done automaticly, because reloading the resources can have a real cost of time. ``` You can acces on your theme with accessing the filename: "THEME:GUI_COLOR:your/sub/path/file.xx" An important think is that the theme file is searching in many path in the order: - USERDATA:GUI_COLOR:your/sub/path/file.xx - DATA:GUI_COLOR:your/sub/path/file.xx - USERDATA:GUI_COLOR(default):your/sub/path/file.xx - DATA:GUI_COLOR(default):your/sub/path/file.xx Like this a user can overload the application theme...