На самом деле используется не dosbox, а мой форк js-dos. В версии 7 я переделал dosbox, теперь он выводит кадры не на экран, а ввиде массива RGBA. Тоже самое со звуком, — массив сэмплов.
Нужно просто на кнопку «Сохранить» сделать вызов ci.persist(). Когда он завершится у тебя будет Uint8Array, ты его отправляй на сервер это обычный ZIP, на сервере же ты его распакуешь и определишь измененные файлы.
У меня похожая схема реализована на DOS.Zone. Если ты зарегистрированный пользователь, тогда по кнопке «Сохранить» твои изменения падают на сервер (можешь проверить устраивает ли тебя такое решение).
Полная схема работы такая:
1. Есть эталонный чистый ZIP (файл jsdos)
2. Пользователь первый раз запускает FoxPro — создается копия файла в личной папке пользователя и отправляется ссылка на него
3. Пользователь жмет кнопку «Сохранить» — вызывается ci.persist() и новый файл отправляется на сервер. На сервере он просто перезаписывает прошлую версию
4. Пользователь заходит ещё раз и получает последнею сохраненную версию
Да это не много не очевидно, надо пользователю объяснить что каждый раз нужно нажимать на кнопку «Сохранить», зато просто и работает как часы.
Если ты хочешь сохранить возможность для клиента работать через браузер, то вариант только один. На клиенте нужно написать ФС которая работает через веб-сокеты и полностью синхронизирует свое состояние при каждой операции с сервером. Т.е. фактическ ФС будет на сервере, а клиент будет посылать операции чтения и записи. Это можно сделать, но не думаю что это будет просто, если ты не знаком с emscripten. На всякий случай вот доки. Я бы подумал надо каким-то более простым решением, вроде синхронизации по кнопке или типа-того.
Сохранение отдельных файлов будет сделано в будущем. Увидеть сетевые диски или диски компьютера не получится в принципе, по тому что браузер не позволяет этого делать. Для того что бы это сделать, нужно либо использовать не браузер а electoron какой-нибудь, либо писать сервер которые пробрасывает доступ к ФС компа в браузер.
На самом деле поддержка сохранения и загрузки реализована (документация). В процессе работы эмулятора все изменения сохраняются в виртуальной файловой системе. Используя функцию сохранения вы получаете обновленный бандл со всеми вашими изменениями, вы можете сохранить его на сервере и загрузить вместо оригинального при следующем запуске. Именно так работает сохранение/загрузка на DOS.Zone. В теории можно загружать отдельные файлы из виртуальной ФС, но API пока таких функций не предоставляет.
Всем кодом владею я. Т.е. «сторонние библиотеки» это тоже часть продукта. Скажем проект игры включает десятки исходных файлов, в то время как фреймворки — тысячи. И у меня пригорает от того что я постоянно вижу это сообщение. Я например, не понимаю почему файлы за директорией CMakeLists.txt считаются вне проекта, они явно указаны в CMakeLists.txt и должны принадлежать проекту как и файлы внутри директории с CMakeLists.txt. Мне кажется это какое-то политическое решение.
Список ошибок — структурированный отчёт о результатах компиляции, как в VS или Esclipse или QtCreator, кажется он везде есть. А вот в CLion нет, или я слепой :) Сейчас я наблюдаю только лог компиляции, который я должен разбирать сам. А каждая ошибка в логе компилятора излишне многословная. Кроме того, ошибки компилятора не помечаются на скроллбаре файла %)
CLion 2017.2.2
Build #CL-172.3968.17, built on August 22, 2017
JRE: 1.8.0_152-release-915-b11 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.10.0-35-generic
Продукт интересный, но сам бы ни купил (использую рабочую лицензию). В основном пользуюсь QtCreator'ом, и вот почему:
* Поддержка ninja
* Интеграция с valgrind, мелочь а приятно
* В больших проектах часто сторонние библиотеки (общий код нескольких проектов) подключены из директорий за пределами корня проекта. При их правке CLion назойливо кричит что редактируется файл за пределами проекта. Меня раздражает.
* В продолжение последнего пукта, все эти фалы вываливаются в корень дерева проекта, из за этого что бы понять структуру, приходится пользоваться проводником :(
* Нет общего списка ошибок, как вообще так?
Кроме того, дебаггер в моих проектах даже std::string развернуть не может, причем интересно иногда QtCreator умеет разворачивать, иногда CLion.
Жду фиксов указанных проблем, тогда можно будет полностью перейти на CLion :)
Есть проблемы с infinite loop и с чтением stdin т.к. эти операции блокриующие, то мы никогда не получаем управление обратно в браузер. Эти проблемы были решены в последних версиях em-dosbox. Попробуйте напрямую запустить (https://github.com/dreamlayers/em-dosbox), у меня нет времени обновить js-dos до последней версии em-dosbox.
Действительно браузер не позволит отправлять данные куда попало. Но если запустить прокси на сервере, а браузеру который будет запущен в эмуляторе прописать этот прокси, тогда все взлетит. Давайте попробуем? Mosaic поддерживает прокси?
В emscripten есть поддержка сокетов и они работают не плохо, например, в TTD работает игра по сети без особых глюков. Не очень понял что за песочница? Если вы про dosbox, то наверное его можно настроить соответствующим образом.
ci.persist()
. Когда он завершится у тебя будет Uint8Array, ты его отправляй на сервер это обычный ZIP, на сервере же ты его распакуешь и определишь измененные файлы.У меня похожая схема реализована на DOS.Zone. Если ты зарегистрированный пользователь, тогда по кнопке «Сохранить» твои изменения падают на сервер (можешь проверить устраивает ли тебя такое решение).
Полная схема работы такая:
1. Есть эталонный чистый ZIP (файл jsdos)
2. Пользователь первый раз запускает FoxPro — создается копия файла в личной папке пользователя и отправляется ссылка на него
3. Пользователь жмет кнопку «Сохранить» — вызывается
ci.persist()
и новый файл отправляется на сервер. На сервере он просто перезаписывает прошлую версию4. Пользователь заходит ещё раз и получает последнею сохраненную версию
Да это не много не очевидно, надо пользователю объяснить что каждый раз нужно нажимать на кнопку «Сохранить», зато просто и работает как часы.
Прекрасно работает даже в браузере.
* ~/ui-framework/**/**.cpp
* ~/physics-framework/**/*.cpp
* ~/game-1/CMakeLists.txt
* ~/game-2/CMakeLists.txt
* ~/game-3/CMakeLists.txt
Всем кодом владею я. Т.е. «сторонние библиотеки» это тоже часть продукта. Скажем проект игры включает десятки исходных файлов, в то время как фреймворки — тысячи. И у меня пригорает от того что я постоянно вижу это сообщение. Я например, не понимаю почему файлы за директорией CMakeLists.txt считаются вне проекта, они явно указаны в CMakeLists.txt и должны принадлежать проекту как и файлы внутри директории с CMakeLists.txt. Мне кажется это какое-то политическое решение.
Список ошибок — структурированный отчёт о результатах компиляции, как в VS или Esclipse или QtCreator, кажется он везде есть. А вот в CLion нет, или я слепой :) Сейчас я наблюдаю только лог компиляции, который я должен разбирать сам. А каждая ошибка в логе компилятора излишне многословная. Кроме того, ошибки компилятора не помечаются на скроллбаре файла %)
Build #CL-172.3968.17, built on August 22, 2017
JRE: 1.8.0_152-release-915-b11 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.10.0-35-generic
* Поддержка ninja
* Интеграция с valgrind, мелочь а приятно
* В больших проектах часто сторонние библиотеки (общий код нескольких проектов) подключены из директорий за пределами корня проекта. При их правке CLion назойливо кричит что редактируется файл за пределами проекта. Меня раздражает.
* В продолжение последнего пукта, все эти фалы вываливаются в корень дерева проекта, из за этого что бы понять структуру, приходится пользоваться проводником :(
* Нет общего списка ошибок, как вообще так?
Кроме того, дебаггер в моих проектах даже std::string развернуть не может, причем интересно иногда QtCreator умеет разворачивать, иногда CLion.
Жду фиксов указанных проблем, тогда можно будет полностью перейти на CLion :)
Если же написано что-то другое, то отправте логи личным сообщением.