Bada Web-based приложение: Взаимодействия C++ и Javascript

    Привет, хабрадруг!

    Коротко о главном: как известно, из С++ кода достаточно вызвать метод EvaluateJavascriptN для передачи данных или вызова события. А вот из Яваскрипта вызвать С++ метод пока что не возможно. Для этого нам придется воспользоваться очень уж железным ломом. Но если вам удобнее разрабатывать приложение на html/css/Javascript, но при этом вам нужен доступ к нативному коду и локальным файлам, то вам определенно под кат. Там мы рассмотрим этот ломик подробнее и заготовим себе Project Template для быстрого старта.

    Вначале попрошу извинения, за мои пробелы в знании русского языка, но я приложу максимум усилий, что бы текст был без ошибок.

    Чуть-чуть лирики


    На прошлой неделе получили заказ на разработку множества небольших приложений под Bada. Сам я работаю в вэб областях, но шеф вспомнив мои старые знания в С++ и мой опыт в .NET попросил помочь коллегам, мол вспомнишь/разберешься, а помогать надо — иначе не успеем. И так я получил два первых задания:
    • приложение с десяткой кнопок и проигрывание звуков
    • приложение с некоторыми статьями для чтения

    Начало пути


    Засучив рукава быстренько скачал Bada SDK. И создавая новой проект меня заинтересовал template «Web-Based Application». В нем создался вэб контрол в который загружался локальный html файл, а поиск в интернете подсказал, что бада располагает -webkit движком и эти факты меня уж очень сильно обрадовали. Но радость моя была поспешной: аудио не проигрывается и получать котент локального файла через ajax нельзя в силу безопасности. Вот здесь то и пришло в голову, что надо как то связать Яваскрипт и С++, таким образом, в первом случае по нажатию кнопки мы пошлем в нативный код соответствующий путь к файлу и оттуда проиграем звук. Ну а во втором, мы пошлем снова же путь к файлу и получим его контент, аля XmlHttpRequest.

    А вот и лом


    Просмотрев поближе вэб контрол, оказывается, в распоряжении у нас только ILoadingListener. Мельком в коде упоминается более обнадеживающий IWebUiListener. Но у разработчиков пока не дошли руки его привести в исполнение, поэтому вернемся к ILoadingListener. К счастью, он работает так как надо, то-есть если добавим в body iframe или вызовем window.frames.myFrame.location.reload() мы получим в коде события о загрузке. Должен заметить, что атрибут src у iframe мы можем даже не указывать. Ну а теперь здесь все очень просто, меняем hash, делаем iframe reload и получаем в OnLoadingRequested url страницы и соответственно реагируем. Правда, увидев, что вэб контрол имеет метод GetTitle, я остановился на том, что меняю заголовок страницы и получаю его в OnLoadingStarted. Таким образом у нас нет проблем с урл кодировкой.

    Украшаем ломик — получаем framework


    Возникло желание создать готовую базу с которой можна начинать писать подобного рода приложения. Вот основные примеры/задачи кода::

    JavaScript:


    bada.sendData({key:'Value',secondKey:'secondValue'});

    эта функция передаст в С++ «key=Value&secondKey=secondValue» и там это пропарсится в WebCppProxy::Data::StringDictionary.
    Еще примеры не требующие объяснений:
    bada.getFile('/Res/help.html',function(responseText){ $('#helpDialog').html(responseText)});<br>bada.playAudio('/Res/sound.mp3');


    Для лучшего тестирования была создана консоль, которая будет доступна если прописать атрибут debug='true' в теге body

    C++


    Здесь вожатым выступает класс WebCppProxy::WebProxyForm — это тот же вэб контрол, но в котором осуществляется взаимосвязь с Яваскриптом. Вожатый получает из текущего приложения класс унаследованный от WebCppProxy::ICommandListener и в ходе выполнения вызывает определенные методы.
    virtual void OnCommand(Osp::Base::String command) = 0;<br>virtual void OnCommand(WebCppProxy::Data::StringDictionary* dictionary) = 0;<br>virtual void OnReady() = 0; // ondomready<br>


    Чтение файла и проигрывание mp3 происходит за кулисами. Имеются наброски кода для работы с базой данных, но после отсутствия audio я был приятно удивлен, что в Bada реализован localStorage.

    Вот, собственно очень кратко описал цель и реализацию, а заготовленный проект можно скачать/посмотреть здесь: Assembla

    Код предоставлен только для ознакомления, и не из-за копирайта, а из-за соображения безопасности/стабильности/продуктивности, ведь все еще очень сыро.

    Надеюсь помог кому-то в написании приложений для Bada. Хотя используя html5/css/javascript можна их легко портировать под другие платформы и наоборот.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 8

      0
      Выполнял reload — ILoadingListener сработал, а вот ajax как я не бился :(
        0
        Хм, что вы подразумеваете под ajax, вернее для чего он вам нужен? В данной версии можно получать только локальные файлы. К сторонним ресурсам будет как обычно отказано в доступе. Надо добавить в С++ еще возможность работать с вэб(к примеру, доступ к вэб сервису) и возврат в Яваскрипт, так мы обойдем cross-domain, и это будет на много легче чем использовать вэб уловки, на подобии iframe proxy или jsonp.
        0
        >> В данной версии можно получать только локальные файлы
        Это значит, что выполнить запрос к стороннему серверу не удастся?

        У меня на странице гугло-карта, на ней несколько маркеров, обозначающих перманентные GPS-приемники, которые сохраняют свои данные в удаленное хранилище. Хочу по клику на маркер получать последние данные с приемника.
          0
          Да, пока-что не получится, у меня еще руки не дошли. Но я думаю вам не составит труда самому дописать. Osp::Net::Http Namespace — здесь нужные классы HttpRequest, HttpResponse HttpTransaction. Если вам не горит, то на следующей недели будет на очереде подобного рода приложение, потом смогу подилиться наработками. Ну а если вы допишите подобный «плагин» то буду рад, обновить и статью и репозиторий.
          0
          Незнаю что там у кого не воспроизводится, но у меня в браузере, на сайте promodj спокойно музыка играет. Bada 1.2, s8500
            0
            Незнаю что там как реализовано, но (html5) Audio Object в браузере отсутствует. Может у ниx flаsh? Да и в целом, это ведь все не только для аудио. Так можно, к примеру, gps tracking на Яваскрипте сделать, да и в целом к любым ресурсным данным доступаться. Раз создал прототип доступа и используй в другиx приложенияx.
              0
              Ну я написанием программ не занимаюсь, не знаю где может быть использовано) Как я понял у них это реализовано открытие m3u…
                0
                Проигрывать на бада можно через object.

            Only users with full accounts can post comments. Log in, please.