[Из песочницы] Разработка приложения для старого КПК (Cybiko Xtreme) в 2019 году
Введение
Привет Хабр! Я хотел бы поделиться своим опытом написания приложения для очень старого карманного компьютера, который серьезно опередил свое время, а именно Cybiko Xtreme 2001 года выпуска. Тем, кому интересно как жилось мобильному разработчику в начале 2000-х, добро пожаловать под кат.
О Cybiko Xtreme
Итак, данный девайс попал ко мне в далеком 2002 году и вызвал полный восторг. Оценить по достоинству коммуникационные возможности я не мог, поскольку в моем городе людей с такими КПК я больше не встречал, однако в целом возможность поиграть во множество игр без необходимости сидеть за компьютером, была просто фантастикой. Во многом же создатели устройства делали упор именно на сетевые возможности КПК. В качестве соединения устройств между собой разработчики выбрали радио меш сеть. Напрямую устройства соединялись между собой на расстоянии до 100 метров, однако можно было соединяться друг с другом через другое устройство, и в теории, при плотном покрытии сети, расстояние было неограниченно. В устройстве была возможность заполнить свой профиль (кажется даже прикрепить фотографию, хотя на дисплее в градациях серого толку от нее было бы немного), общаться с другими пользователями со схожими интересами, искать новые знакомства и т.д. Напоминает все это социальную сеть, хотя тогда такого термина, насколько я знаю, еще не существовало. Если бы устройств было достаточно много, думаю проект бы взлетел, однако, к сожалению, у создателей что-то пошло не так.
Найдя этот КПК в своих старых вещах, мне захотелось поностальгировать. Играть в старые игры было не очень интересно (все-таки по сравнению с новыми они смотрятся не особо), а вот попробовать разработать приложение и почувствовать как жилось первым мобильным разработчикам, было куда интереснее.
Идея приложения
Поскольку я, по роду своей деятельности, связан с информационной безопасностью и эта тема мне крайне интересна, приложение я решил создавать в той же области. Наиболее простым (и хоть чем-то полезным?) мне показалось приложение «менеджер паролей». Данное приложение позволяет посмотреть как разработку графического пользовательского интерфейса, так и работу с файловой системой (хранение зашифрованного контейнера с паролями).
В качестве криптографии для защиты контейнера я решил использовать так называемое XOR-шифрование. В роли ключа выступает мастер-пароль. Криптостойкость данного шифрования сильно зависит от длины ключа, и использовать его в серьезных системах не рекомендуется, однако у данного шифрования есть один серьезный плюс — оно очень легко реализуется. Поскольку приложение создавалось исключительно в целях развлечения, такое шифрование подходит идеально.
Эмулятор
Подключение Cybiko Xtreme к современному компьютеру довольно сложный процесс, поэтому работу по тестовым запускам приложения я решил вести на эмуляторе (к счастью он есть).
Внешний вид представлен на рисунке ниже
Есть некоторые особенности по закачке приложений в эмулятор. По инструкции найденной здесь приложение можно отправить, используя кнопку «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);
}
Результат работы при запуске в эмуляторе представлен ниже:
С полным текстом исходников при желании
можно ознакомиться на github по ссылке.
Запуск на реальном устройстве
Как я уже говорил, запуск на реальном устройстве затруднен, поскольку софт для синхронизации Cybiko с компьютером не поддерживает современные операционные системы. По инструкции, найденной здесь, мне удалось синхронизировать Cybiko с Windows 2000, запущенным в Virtual Box. Из нюансов могу отметить то, что программа видела Cybiko только в случае, когда он подключался по USB и автоматически пробрасывался в виртуальную машину. Вероятно поэтому автор инструкции и пишет, что его нужно добавить как постоянное устройство для данной машины в настройках USB Virtual Box.
Результат синхронизации на картинке ниже:
Результат работы моего приложения представлен на следующем видео:
Заключение
С Cybiko Xtreme у меня связано множество прекрасных воспоминаний, и еще раз прикоснуться к этому замечательному устройству было для меня чертовски приятно. Хочется сказать его создателям огромное спасибо за проделанную работу. Также хочется поблагодарить создателей эмулятора, форумов и сайтов по Cybiko, а также мою жену за помощь в съемках видео и редактировании этой статьи.
Всем спасибо за внимание!