[Из песочницы] Разработка приложения для старого КПК (Cybiko Xtreme) в 2019 году

phmhcbpdse1fki5efokzyl_fhq4.jpeg

Введение


Привет Хабр! Я хотел бы поделиться своим опытом написания приложения для очень старого карманного компьютера, который серьезно опередил свое время, а именно Cybiko Xtreme 2001 года выпуска. Тем, кому интересно как жилось мобильному разработчику в начале 2000-х, добро пожаловать под кат.

О Cybiko Xtreme


Итак, данный девайс попал ко мне в далеком 2002 году и вызвал полный восторг. Оценить по достоинству коммуникационные возможности я не мог, поскольку в моем городе людей с такими КПК я больше не встречал, однако в целом возможность поиграть во множество игр без необходимости сидеть за компьютером, была просто фантастикой. Во многом же создатели устройства делали упор именно на сетевые возможности КПК. В качестве соединения устройств между собой разработчики выбрали радио меш сеть. Напрямую устройства соединялись между собой на расстоянии до 100 метров, однако можно было соединяться друг с другом через другое устройство, и в теории, при плотном покрытии сети, расстояние было неограниченно. В устройстве была возможность заполнить свой профиль (кажется даже прикрепить фотографию, хотя на дисплее в градациях серого толку от нее было бы немного), общаться с другими пользователями со схожими интересами, искать новые знакомства и т.д. Напоминает все это социальную сеть, хотя тогда такого термина, насколько я знаю, еще не существовало. Если бы устройств было достаточно много, думаю проект бы взлетел, однако, к сожалению, у создателей что-то пошло не так.

Найдя этот КПК в своих старых вещах, мне захотелось поностальгировать. Играть в старые игры было не очень интересно (все-таки по сравнению с новыми они смотрятся не особо), а вот попробовать разработать приложение и почувствовать как жилось первым мобильным разработчикам, было куда интереснее.

Идея приложения


Поскольку я, по роду своей деятельности, связан с информационной безопасностью и эта тема мне крайне интересна, приложение я решил создавать в той же области. Наиболее простым (и хоть чем-то полезным?) мне показалось приложение «менеджер паролей». Данное приложение позволяет посмотреть как разработку графического пользовательского интерфейса, так и работу с файловой системой (хранение зашифрованного контейнера с паролями).

В качестве криптографии для защиты контейнера я решил использовать так называемое XOR-шифрование. В роли ключа выступает мастер-пароль. Криптостойкость данного шифрования сильно зависит от длины ключа, и использовать его в серьезных системах не рекомендуется, однако у данного шифрования есть один серьезный плюс — оно очень легко реализуется. Поскольку приложение создавалось исключительно в целях развлечения, такое шифрование подходит идеально.

Эмулятор


Подключение Cybiko Xtreme к современному компьютеру довольно сложный процесс, поэтому работу по тестовым запускам приложения я решил вести на эмуляторе (к счастью он есть).
Внешний вид представлен на рисунке ниже

la7bomtis49fpnrhc_pu8wedd7c.png

Есть некоторые особенности по закачке приложений в эмулятор. По инструкции найденной здесь приложение можно отправить, используя кнопку «Send» в окне «Console», однако, как я ни пытался, сделать это у меня не получилось. На форуме Planet Cybiko (к сожалению, на данный момент форум закрыт) есть ссылка на инструмент, позволяющий делать собственные Cybiko ram-диски. Поэтому достаточно создать ram-диск со скомпилированным приложением и перезапустить эмулятор с ним.

SDK


Найти SDK на просторах интернета оказалось не очень сложно. Распаковав и проанализировав структуру каталогов, я в первую очередь обратил внимание на директорию doc, в которой оказался вполне годный help, объясняющий, как в принципе компилировать приложение, и какую структуру должен иметь проект.

В директории demos я нашел множество примеров приложений. Особенно интересными были приложения из директории tutorial, которые шаг за шагом объясняли принципы разработки для Cybiko Xtreme. Все просто, доступно и понятно.

Написание кода


Структура минимального по своему содержимому проекта представлена ниже:

Структура проекта
project
res
    root.inf
src
    source1.c
    …
make.bat


Файл root.inf содержит мета-данные приложения, а именно информацию о его типе (приложение, игра или библиотека), версии, минимальной версии операционной системы (прямо как в Android), уникальном имени и т.д.

Файл make.bat содержит в себе команды для сборки приложения при помощи sdk. Фактически вся сборка осуществляется командой вызова Cybiko C Compiller:

"C:\Program Files (x86)\Cybiko\Cybiko_SDK\bin\vcc" -R0 src/*.c res/*.help res/*.inf -o passwords_master.app


Важное замечание: при сборке на Windows 7 для vcc.exe нужно поставить режим совместимости с Windows XP (Service Pack 2), в противном случае возникают проблемы с запуском компилятора.

В директории src лежат исходные коды программы. Результатом компиляции является файл *.app.

Для описания разработки всего приложения одной статьи точно не хватит, поэтому опишу лишь самое начало. Если у кого-то возникнут вопросы спрашивайте в комментариях или в личке.

Все начинается с инициализации контекста приложения в функции main, вызовом:

Инициализация
long init_module(struct module_t * main_module);


После инициализации в структуре main_module содержатся указатели на графический контекст и текущий процесс приложения.

Далее необходимо создать главную форму. Делается это следующим образом:

Создание главной формы
struct cFrameForm * ptr_main_form = malloc(sizeof(struct cFrameForm));
cFrameForm_ctor(ptr_main_form, "Passwords Master", main_module.m_process);


Проверим есть ли на файловой системе контейнер паролей:

Проверка наличия контейнера
int check_database() {
    struct FileInput * ptr_file_input = (struct FileInput *) malloc(sizeof(struct FileInput));

    FileInput_ctor_Ex(ptr_file_input, DATABASE_FILE);
    if (FileInput_is_good(ptr_file_input)) {
        FileInput_dtor(ptr_file_input, FREE_MEMORY);

        return 0;
    }

    FileInput_dtor(ptr_file_input, FREE_MEMORY);

    return -1;
}


Покажем диалоговое окно ввода мастер-пароля. Если контейнер уже существует, то пробуем расшифровать с введенным мастер-паролем. Если контейнера не было, то используем введенный мастер-пароль для создания нового контейнера.

Ввод мастер-пароля
void get_master_password(struct cFrameForm * ptr_form, char * master_password) {
    // Show dialog enter master password
    struct cDialog * ptr_pass_dialog;
    ptr_pass_dialog = (struct cDialog *) malloc(sizeof(struct cDialog));
    cDialog_ctor(ptr_pass_dialog, 0, "Enter master password", mbEdit | mbOk | mbCancel | mbs1, 15, ptr_form->CurrApplication);

    cDialog_SetEditText(ptr_pass_dialog, "");

    do {
        // If pressed cancel - close application
        if (cDialog_ShowModal(ptr_pass_dialog) == mbOk)
        cDialog_GetEditText(ptr_pass_dialog, master_password);
        else {
            ptr_form->ModalResult = mrQuit;
            break;
        }
    }
    while (strlen(master_password) == 0);

    // Releases the dialog
    cDialog_dtor(ptr_pass_dialog, FREE_MEMORY);
}


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

Обработка сообщений
while (ptr_form->ModalResult != mrQuit) {
    struct Message * ptr_message = cWinApp_get_message(ptr_form->CurrApplication, 0, 1, MSG_USER);

    switch(ptr_message->msgid) {
        case MSG_SHUTUP:            // Processes the system exit signal.
        case MSG_QUIT:
            ptr_form->ModalResult = mrQuit;
        break;

        case MSG_KEYDOWN: // Processes keyboard input
            ptr_key_param = Message_get_key_param(ptr_message);
            switch(ptr_key_param->scancode) {
                case KEY_ESC:
                    ...
                break;

                case KEY_ENTER:
                    ...
                break;

                case KEY_DEL:
                    ...
                break;

                default:
                    cFrameForm_proc(ptr_form, ptr_message);
            }
        break;

        default:
            cWinApp_defproc(module.m_process, ptr_message);
    }

    Message_delete(ptr_message);
}


Результат работы при запуске в эмуляторе представлен ниже:

xr3a7lyulrairexxldzii6tv4fg.png

С полным текстом исходников при желании
можно ознакомиться на github по ссылке.

Запуск на реальном устройстве


Как я уже говорил, запуск на реальном устройстве затруднен, поскольку софт для синхронизации Cybiko с компьютером не поддерживает современные операционные системы. По инструкции, найденной здесь, мне удалось синхронизировать Cybiko с Windows 2000, запущенным в Virtual Box. Из нюансов могу отметить то, что программа видела Cybiko только в случае, когда он подключался по USB и автоматически пробрасывался в виртуальную машину. Вероятно поэтому автор инструкции и пишет, что его нужно добавить как постоянное устройство для данной машины в настройках USB Virtual Box.

Результат синхронизации на картинке ниже:

iphx9dqdc5ahl82dnjxyo7jb-ta.png

Результат работы моего приложения представлен на следующем видео:


Заключение


С Cybiko Xtreme у меня связано множество прекрасных воспоминаний, и еще раз прикоснуться к этому замечательному устройству было для меня чертовски приятно. Хочется сказать его создателям огромное спасибо за проделанную работу. Также хочется поблагодарить создателей эмулятора, форумов и сайтов по Cybiko, а также мою жену за помощь в съемках видео и редактировании этой статьи.

Всем спасибо за внимание!

© Habrahabr.ru