Разработка web-приложений Tizen

Input/Output

Показывать лекцию целиком

Input/Output API содержит следующие компоненты:

  • Filesystem (этот API обеспечивает доступ к файловой системе устройства.)
  • Archive (этот API предоставляет интерфейсы и методы для создания архивного файла, а также различные другие виды манипуляций (например, разархивирование файлов, добавление файла к архиву)
  • Message Port (этот API предоставляет функциональные возможности для общения с другими приложениями)
  • Archive API

    Определение типов

    FileReference

    Ссылка на архивный файл может быть, как объект file, так и виртуальный каталог.

    ArchiveCompressionLevel

    Степень компрессии определяется в перечислении ArchiveCompressionLevel.

    enum ArchiveCompressionLevel {quot;STOREquot;, quot;FASTquot;, quot;NORMALquot;, quot;BESTquot;};
    
  • STORE – Компрессия отсутствует. Файл хранится в неизменном виде.
  • FAST – Используется наиболее быстрый метод компрессии. Экономия места от сжатия небольшая
  • NORMAL – Заданный по умолчанию уровень компрессии
  • BEST – Наилучший, но медленный уровень компрессии.
  • Интерфейсы

    ArchiveManagerObject

    Интерфейс ArchiveManagerObject определяет тип экземпляра объекта Tizen.

    Объект tizen.archive дает доступ к Archive API.

    ArchiveManager

    Интерфейс ArchiveManager предоставляет методы для работы с архивными файлами.

    Методы

    Open

    Открывает архивный файл. После этой операции, можно добавить или получить файлы в и из архива.

    Существует несколько режимов работы этого метода.

    Режимы работы метода Open
    Режим Описание
    r Этот режим используется для получения информации о содержимом архивного файла
    w Этот режим используется для того, чтобы создать архивный файл и добавлять файлы в архивный файл
    rw Этот режим используется для архивации/разархивации
    a Этот режим используется для добавления новых файлов в архивный файл

    Для работы с Archive API используются привилегии filesystem.read filesystem.write.

    (рис 19.1)

    К сожалению, не все функции по работе с файловой системой доступны в эмуляторе Tizen. Продемонстрируем это на следующем примере. Создадим проект Archive. Добавим папку downloads и запишем туда зиповский архив my_archive.zip.

    (рис 19.2)

    Просмотрим содержание папки downloads (физический каталог)

    lt;script type=quot;text/javascriptquot;gt;
    
        var documentsDir;
        function onsuccess(files) {
          for (var i = 0; i lt; files.length; i++) {
            console.log(quot;File Name is quot; + files[i].name); // displays file name
          }
        }
    
        function onerror(error) {
          console.log(quot;The error quot; + error.message + quot; occurred when listing the files in the selected folderquot;);
        }
    
        tizen.filesystem.resolve(
          apos;downloadsapos;,
          function(dir) {
            documentsDir = dir;
            dir.listFiles(onsuccess, onerror);
          }, function(e) {
            console.log(quot;Errorquot; + e.message);
          }, quot;rwquot;
        ); 
       
        lt;/scriptgt;
    
    
    (рис 19.3)

    Программа не отображает файл my_archive.zip.

    Все-таки попытаемся открыть файл my_archive.zip.

        lt;script type=quot;text/javascriptquot;gt;
    
        function successCallback(archive) {
            console.log(quot;Success, can now read from archive quot; + archive);
        }
    
        function errorCallback(error) {
            console.log(error);
        }
    
        tizen.archive.open(quot;downloads/my_archive.zipquot;, quot;rquot;, successCallback, errorCallback);
    
        lt;/scriptgt;
    
    
    (рис 19.4)

    Программа говорит, что архив не найден.

    Пойдем по другому пути. Создадим файл poem.txt в каталоге downloads:

    lt;script type=quot;text/javascriptquot;gt;
    
      //Creating the file
    
        var documentsDir;
        function onsuccess(files) {
          for (var i = 0; i lt; files.length; i++) {
            console.log(quot;File Name is quot; + files[i].name); // displays file name
          }
    
          var testFile = documentsDir.createFile(quot;poem.txtquot;);
    
          if (testFile != null) {
            testFile.openStream(
              quot;wquot;,
              function(fs) {
                fs.write(quot;To be, or not to be: that is the questionquot;);
                fs.close();
              }, function(e) {
                console.log(quot;Error quot; + e.message);
              }, quot;UTF-8quot;
            );
          }
        }
    
        function onerror(error) {
          console.log(quot;The error quot; + error.message + quot; occurred when listing the files in the selected folderquot;);
        }
    
        tizen.filesystem.resolve(
          apos;downloadsapos;,
          function(dir) {
            documentsDir = dir;
            dir.listFiles(onsuccess, onerror);
          }, function(e) {
            console.log(quot;Errorquot; + e.message);
          }, quot;rwquot;
        );
        lt;/scriptgt;
    
    
    (рис 19.5)

    Заархивируем его:

    lt;script type=quot;text/javascriptquot;gt;
    
    //Adding to archive
    
        function errorCallback(error) {
            console.log(error);
        }
    
        function successCallback() {
            console.log(quot;donequot;);
        }
    
        function progressCallback(opId, val, name) {
            console.log(quot;opId: quot; + opId + quot; with progress val: quot; + val);
        }
    
        function createSuccess(archive) {
            archive.add(quot;downloads/poem.txtquot;, successCallback, errorCallback, progressCallback);
        }
    
        tizen.archive.open(quot;downloads/poem.zipquot;, quot;wquot;, createSuccess);
        lt;/scriptgt;
    
    
    (рис 19.6)

    А теперь снова попробуем открыть архивный файл:

    lt;script type=quot;text/javascriptquot;gt;
    
        function successCallback(archive) {
            console.log(quot;Success, can now read from archive quot; + archive);
        }
    
        function errorCallback(error) {
            console.log(error);
        }
    
        tizen.archive.open(quot;downloads/poem.zipquot;, quot;rquot;, successCallback, errorCallback);
        lt;/scriptgt;
    
    
    (рис 19.7)

    Как видим, теперь все нормально. Проблема в том, что в Project Explorer мы не видим файлы poem.txt и poem.zip, хотя и можем с ними работать, в то время как наша программа не видит файл some_archive.zip, который мы прекрасно видим в Project Explorer.

    (рис 19.8)

    FileSystem API

    Filesystem API предоставляет доступ к файловой системе устройства. Такую файловую систему можно представить, как абстрактную коллекцию разрозненных файловых систем, расположенных в нескольких виртуальных корневых каталогах.

    Каждый виртуальный корневой каталог имеет строковое имя. Каждый файл или каталог внутри виртуальной файловой системы адресуется с использованием полностью определенного пути: lt;root namegt;/lt;pathgt; где lt;rootnamegt; - это название виртуального корневого каталога, а lt;pathgt; - это путь к файлу или каталогу относительно этого корневого каталога.

    Поддерживаются следующие корневые каталоги

  • images – расположение изображений
  • videos – расположение видео
  • music – расположение звуков
  • documents – расположение документов
  • downloads – расположение загруженных объектов
  • ringtones – расположение рингтонов (только для чтения)
  • camera – расположение фотографий и видео, снятых устройством
  • wgt-package – расположение виджетов (только для чтения)
  • wgt-private – расположение для частных виджетов (только для чтения)
  • wgt-private-tmp – расположение для энергонезависомого хранения виджетов
  • Также поддерживается файловый путь URI. Для доступа к другим путям из виртуального коревого каталога, например, apos;/tmp/apos;, можно использовать путь apos;file:///tmpapos; в качестве параметра месторасположения.

    Для получения доступа к конкретному месторасположению, отличного от упомянутого выше, дескриптор файла должен быть получен с помощью вызова filesystem.resolve().

    Дескриптор файла представляет, как файл, так и каталог:

  • Для файла атрибуту isFile присваивается значение true.
  • Для каталога атрибуту isDirectory присваивается значение true.
  • Файл можно открыть с помощью операций read и write, используя обработчик событий FileStream. Список файлов и подкаталогов можно получить из каталога, существует метод разрешения файлов или подкаталогов, более удобный, чем обработка списка каталогов.

    В именах файлов поддерживаются следующие символы:

  • Буквы (a-z, A-Z)
  • Числа (0-9)
  • Пробелы
  • Нижнее подчеркивание (quot;_quot;)
  • Дефис (quot;-quot;)
  • Период (quot;.quot;)
  • В зависимости от используемой платформы могут также поддерживаться и дополнительные символы

    Режимы работы с файлами (FileMode)

    Описываются в специальном перечислении при открытии файлов

    enum FileMode { quot;rquot;, quot;rwquot;, quot;wquot;, quot;aquot; };
    •	
  • r – доступ только для чтения (read-only)
  • rw – доступ как для чтения, так и для записи (read and write)
  • w – доступ для записи (write)
  • a – доступ для добавления (append)
  • Тип файлового хранилища (FileSystemStorageType)

    Описывается в специальном перечислении

    enum FileSystemStorageType { quot;INTERNALquot;, quot;EXTERNALquot; };
    
  • INTERNAL – Внутренне хранилище, которое не может быть удалено, например флеш-память
  • EXTERNAL – Внешнее хранилище, например, USB-диск или карта памяти
  • Состояние файловой системы (FileSystemStorageState)

    Описывается в специальном перечислении

    enum FileSystemStorageState {quot;MOUNTEDquot;, quot;REMOVEDquot;, quot;UNMOUNTABLEquot;};
    
  • MOUNTED – Устройство смонтировано и доступно для просмотра
  • REMOVED – Устройство удалено (применимо только для внешних хранилищ)
  • UNMOUNTABLE – Устройство не может быть смонтировано в следствие ошибки
  • Интерфейсы

    Интерфейс FileSystemManagerObject

    Интерфес FileSystemManagerObject определяет какой экземпляр создаст объект Tizen. Существует объект tizen.filesystem , который позволяет осуществлять доступ к функциональности Filesystem API.

    Разберем несколько типичных операций, выполняемых с файловой системой.

    1. Создание файла

    В файле config.xml добавьте три строчки как показано ниже

    lt;?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?gt;
    lt;widget xmlns:tizen=quot;http://tizen.org/ns/widgetsquot; xmlns=quot;http://www.w3.org/ns/widgetsquot; id=quot;http://yourdomain/fs6quot; version=quot;1.0.0quot; viewmodes=quot;maximizedquot;gt;
        lt;tizen:application id=quot;0D6KibKof7.fs6quot; package=quot;0D6KibKof7quot; required_version=quot;2.3quot;/gt;
        lt;content src=quot;index.htmlquot;/gt;
        lt;feature name=quot;http://tizen.org/feature/screen.size.allquot;/gt;
        lt;icon src=quot;icon.pngquot;/gt;
        lt;namegt;fs6lt;/namegt;
        lt;tizen:privilege name=quot;http://tizen.org/privilege/filesystem.readquot;/gt;
        lt;tizen:privilege name=quot;http://tizen.org/privilege/filesystem.writequot;/gt;
        lt;tizen:privilege name=quot;http://tizen.org/api/filesystemquot;/gt;    
        lt;tizen:profile name=quot;mobilequot;/gt;
    lt;/widgetgt;
    

    Файл index.html

    lt;!DOCTYPE htmlgt;
    lt;htmlgt;
    lt;headgt;
        lt;meta charset=quot;utf-8quot;/gt;
        lt;meta name=quot;viewportquot; content=quot;width=device-width, initial-scale=1.0, maximum-scale=1.0quot;gt;
        lt;meta name=quot;descriptionquot; content=quot;A single-page template generated by Tizen Web IDEquot;/gt;
    
        lt;titlegt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Pagelt;/titlegt;
    
        lt;link rel=quot;stylesheetquot; href=quot;./css/jquery.mobile-1.3.2.cssquot;/gt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery-1.9.1.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery.mobile-1.3.2.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/main.jsquot;gt;lt;/scriptgt;
        lt;link rel=quot;stylesheetquot; href=quot;./css/style.cssquot; /gt;
        lt;script type=quot;text/javascriptquot;gt;
    
    
    //Creating a file
     var documentsDir;
     function onsuccess(files) {
       for (var i = 0; i lt; files.length; i++) {
         console.log(quot;File Name is quot; + files[i].name); // displays file name
       }
    
       var testFile = documentsDir.createFile(quot;phrase.txtquot;);
       if (testFile != null) {
         testFile.openStream(
             quot;wquot;,
             function(fs) {
               fs.write(quot;When a father gives to his son, both laugh; when a son gives to his father, both cry. (William Shakespeare)quot;);
               fs.close();
             }, function(e) {
               console.log(quot;Error quot; + e.message);
             }, quot;UTF-8quot;
         );
       }
     }
    
     function onerror(error) {
       console.log(quot;The error quot; + error.message + quot; occurred when listing the files in the selected folderquot;);
     }
    
     tizen.filesystem.resolve(
         apos;documentsapos;,
         function(dir) {
           documentsDir = dir; dir.listFiles(onsuccess,onerror);
         }, function(e) {
           console.log(quot;Errorquot; + e.message);
         }, quot;rwquot;
     ); 
    
    
        lt;/scriptgt;
    lt;/headgt;
    
    lt;bodygt;
        
    lt;/bodygt;
    lt;/htmlgt;
    

    2. Просмотр содержимого каталога

    Файл index.html

    lt;!DOCTYPE htmlgt;
    lt;htmlgt;
    lt;headgt;
        lt;meta charset=quot;utf-8quot;/gt;
        lt;meta name=quot;viewportquot; content=quot;width=device-width, initial-scale=1.0, maximum-scale=1.0quot;gt;
        lt;meta name=quot;descriptionquot; content=quot;A single-page template generated by Tizen Web IDEquot;/gt;
    
        lt;titlegt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Pagelt;/titlegt;
    
        lt;link rel=quot;stylesheetquot; href=quot;./css/jquery.mobile-1.3.2.cssquot;/gt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery-1.9.1.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery.mobile-1.3.2.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/main.jsquot;gt;lt;/scriptgt;
        lt;link rel=quot;stylesheetquot; href=quot;./css/style.cssquot; /gt;
        lt;script type=quot;text/javascriptquot;gt;
        //Просмотр списка файлов в каталоге
        /* Success event handler */
    var documentsDir;
     function onsuccess(files) {
       for (var i = 0; i lt; files.length; i++) {
         console.log(quot;File Name is quot; + files[i].name); // displays file name
       }
     }
    
     tizen.filesystem.resolve(
       apos;documentsapos;,
       function(dir) {
         documentsDir = dir;
         dir.listFiles(onsuccess, onerror);
       }, function(e) {
         console.log(quot;Errorquot; + e.message);
       }, quot;rwquot;
     ); 
    
        lt;/scriptgt;
    lt;/headgt;
    
    lt;bodygt;
        
    lt;/bodygt;
    lt;/htmlgt;
    
    (рис 19.9)

    3. Чтение содержимого файла

    lt;!DOCTYPE htmlgt;
    lt;htmlgt;
    lt;headgt;
        lt;meta charset=quot;utf-8quot;/gt;
        lt;meta name=quot;viewportquot; content=quot;width=device-width, initial-scale=1.0, maximum-scale=1.0quot;gt;
        lt;meta name=quot;descriptionquot; content=quot;A single-page template generated by Tizen Web IDEquot;/gt;
    
        lt;titlegt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Pagelt;/titlegt;
    
        lt;link rel=quot;stylesheetquot; href=quot;./css/jquery.mobile-1.3.2.cssquot;/gt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery-1.9.1.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery.mobile-1.3.2.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/main.jsquot;gt;lt;/scriptgt;
        lt;link rel=quot;stylesheetquot; href=quot;./css/style.cssquot; /gt;
        lt;script type=quot;text/javascriptquot;gt;
    //Read as text
    function onsuccess(files) {
       for (var i = 0; i lt; files.length; i++) {
         console.log(quot;File Name is quot; + files[i].name); // displays file name
         if (files[i].isDirectory == false)
           files[i].readAsText(
               function(str) {
                 console.log(quot;The file content quot; + str);
               }, function(e) {
                 console.log(quot;Error quot; + e.message);
               }, quot;UTF-8quot;
           );
       }
     }
    
     function onerror(error) {
       console.log(quot;The error quot; + error.message + quot; occurred when listing the files in the selected folderquot;);
     }
    
     var documentsDir;
     tizen.filesystem.resolve(
         apos;documentsapos;,
         function(dir) {
           documentsDir = dir;
           dir.listFiles(onsuccess,onerror);
         }, function(e) {
           console.log(quot;Errorquot; + e.message);
         }, quot;rwquot;
     ); 
    
    
        lt;/scriptgt;
    lt;/headgt;
    
    lt;bodygt;
        
    lt;/bodygt;
    lt;/htmlgt;
    
    (рис 19.10)

    4. Удаление содержимого каталога

    lt;!DOCTYPE htmlgt;
    lt;htmlgt;
    lt;headgt;
        lt;meta charset=quot;utf-8quot;/gt;
        lt;meta name=quot;viewportquot; content=quot;width=device-width, initial-scale=1.0, maximum-scale=1.0quot;gt;
        lt;meta name=quot;descriptionquot; content=quot;A single-page template generated by Tizen Web IDEquot;/gt;
    
        lt;titlegt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Pagelt;/titlegt;
    
        lt;link rel=quot;stylesheetquot; href=quot;./css/jquery.mobile-1.3.2.cssquot;/gt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery-1.9.1.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/jquery.mobile-1.3.2.jsquot;gt;lt;/scriptgt;
        lt;script type=quot;text/javascriptquot; src=quot;./js/main.jsquot;gt;lt;/scriptgt;
        lt;link rel=quot;stylesheetquot; href=quot;./css/style.cssquot; /gt;
        lt;script type=quot;text/javascriptquot;gt;
    
    //Deleting files in the directory
    
    function onsuccess(files) {
    	   for (var i = 0; i lt; files.length; i++) {
    	     if (!files[i].isDirectory) {
    	       documentsDir.deleteFile(
    	           files[i].fullPath,
    	           function() {
    	             console.log(quot;File Deletedquot;);
    	           }, function(e) {
    	             console.log(quot;Errorquot; + e.message);
    	           });
    	     }
    	   }
    	 }
    
    	 function onerror(error) {
    	   console.log(quot;The error quot; + error.message + quot; occurred when listing the files in the selected folderquot;);
    	 }
    
    	 var documentsDir;
    	 tizen.filesystem.resolve(
    	   apos;documentsapos;,
    	   function(dir) {
    	     documentsDir = dir;
    	     dir.listFiles(onsuccess,onerror);
    	   }, function(e) {
    	     console.log(quot;Errorquot; + e.message);
    	   }, quot;rwquot;
    	 ); 
    
        lt;/scriptgt;
    lt;/headgt;
    
    lt;bodygt;
        
    lt;/bodygt;
    lt;/htmlgt;
    
    (рис 19.11)

    MessagePort API

    MessagePort API предоставляет функциональность для связи с другими приложениями.

    Веб-приложения Tizen могут могут общаться с другими веб- или нативными приложениями. Тип данных для коммуникации представляет собой строковую пару quot;ключ-значениеquot;. Сообщения можно пересылать через месседж-порты двух типов:

  • интерфейс LocalMessagePort используется для регистрации месседж-порта и подготовке к приему сообщений от других приложений. Для приема сообщений от других приложений необходимо зарегистрировать функцию вызова для локального месседж-порта.
  • интерфейс RemoteMessagePort используется для отправки сообщений другим приложениям. Информация локального месседж-порта может быть послана другому приложению для двустороннего обмена данными.
  • Можно получать экземпляры интерфейсов LocalMessagePort и RemoteMessagePort с помощью методов therequestLocalMessagePort() и requestRemoteMessagePort() объекта tizen.messageport.

    Месседж-порт поддерживает следующие методы для отправки и приемы сообщений:

  • метод sendMessage() интерфейса RemoteMessagePort для отправки сообщений другим приложениям. Для приема ответных сообщений от другого приложения в приложении можно определить локальный месседж-порт при отправке сообщения. Можно получать ответное сообщение с помощью вызова метода, зарегистрированного методом addMessagePortListener() интерфейса LocalMessagePort.
  • приложение, которое хочет получать сообщения от другого приложения, может быть имплементировано как веб-ли нативное приложение Tizen.
  • (рис 19.12) Коммуникация месседж-порта

    Вы можете общаться только с доверенным приложениям, которые подписываются таким же сертификатом, что и ваше приложение, с помощью экземпляров интерфейсов LocalMessagePort и RemoteMessagePort, которые извлекаются с помощью методов TrustedLocalMessagePort() и TrustedRemoteMessagePort () объекта tizen.messageport.

    (рис 19.13)

    Литература

  • https://developer.tizen.org/dev-guide/2.3.0/org.tizen.web.apireference/html/device_api/mobile/tizen/archive.html
  • https://developer.tizen.org/dev-guide/2.3.0/org.tizen.guides/html/web/tizen/input_output/message_port_w.htm
  • https://www.tizen.org/ko/tv/web_device_api/filesystem?langredirect=1
  • Задание

    Самостоятельно освоить: создание каталогов, копирование и перенос файлов

    Вернуться к учебному плану