bool Init(uint32_t argc, const char* argn[], const char* argv[]) { printf("******* init! %i, %p, %p\n", argc, argn, argv); fflush(stdout); if (opengl_context_ == NULL) { opengl_context_.reset(new OpenGLContext(this)); }; opengl_context_->InvalidateContext(this); opengl_context_->ResizeContext(pp::Size(0, 0)); int current = opengl_context_->MakeContextCurrent(this); printf("current is %i\n", current); os_nacl = new OSNacl; pkg_url = ""; for (uint32_t i=0; i<argc; i++) { if (strcmp(argn[i], "package") == 0) { pkg_url = argv[i]; }; }; sd = memnew(StateData); if (pkg_url == "") { nacl_main(argc, argn, argv); } else { printf("starting package %ls\n", pkg_url.c_str()); init_argc = MIN(argc, MAX_ARGS-1); for (uint32_t i=0; i<argc; i++) { int nlen = strlen(argn[i]); init_argn[i] = (char*)memalloc(nlen+1); strcpy(init_argn[i], argn[i]); init_argn[i+1] = NULL; int len = strlen(argv[i]); init_argv[i] = (char*)memalloc(len+1); strcpy(init_argv[i], argv[i]); init_argv[i+1] = NULL; }; package_pending = memnew(GetURLHandler(this, pkg_url)); package_pending->Start(); }; return true; };
void GodotInstance::HandleMessage(const pp::Var& var_message) { switch (state) { case STATE_METHOD: { ERR_FAIL_COND(!var_message.is_string()); sd->method = var_message.AsString().c_str(); state = STATE_PARAM_COUNT; } break; case STATE_PARAM_COUNT: { ERR_FAIL_COND(!var_message.is_number()); sd->arg_count = var_message.AsInt(); state = sd->arg_count>0?STATE_PARAMS:STATE_CALL; } break; case STATE_PARAMS: { Variant p = to_variant(var_message); sd->args.push_back(p); if (sd->args.size() >= sd->arg_count) state = STATE_CALL; } break; default: break; }; if (state == STATE_CALL) { // call state = STATE_METHOD; if (sd->method == "package_finished") { GetURLHandler::Status status = package_pending->get_status(); printf("status is %i, %i, %i\n", status, GetURLHandler::STATUS_ERROR, GetURLHandler::STATUS_COMPLETED); if (status == GetURLHandler::STATUS_ERROR) { printf("Error fetching package!\n"); }; if (status == GetURLHandler::STATUS_COMPLETED) { OSNacl* os = (OSNacl*)OS::get_singleton(); os->add_package(pkg_url, package_pending->get_data()); }; memdelete(package_pending); package_pending = NULL; package_loaded = true; opengl_context_->MakeContextCurrent(this); nacl_main(init_argc, (const char**)init_argn, (const char**)init_argv); for (uint32_t i=0; i<init_argc; i++) { memfree(init_argn[i]); memfree(init_argv[i]); }; }; if (sd->method == "get_package_status") { if (package_loaded) { // post "loaded" PostMessage("loaded"); } else if (package_pending == NULL) { // post "none" PostMessage("none"); } else { // post package_pending->get_bytes_read(); PostMessage(package_pending->get_bytes_read()); }; }; }; }
int cli_main(int argc, char* argv[]) { umount("/"); mount("", "/", "memfs", 0, NULL); // Setup common environment variables, but don't override those // set already by ppapi_simple. setenv("HOME", "/home/user", 0); setenv("PATH", "/bin", 0); setenv("USER", "user", 0); setenv("LOGNAME", "user", 0); const char* home = getenv("HOME"); mkdir("/home", 0777); mkdir(home, 0777); mkdir("/tmp", 0777); mkdir("/bin", 0777); mkdir("/etc", 0777); mkdir("/mnt", 0777); mkdir("/mnt/http", 0777); mkdir("/mnt/html5", 0777); const char* data_url = getenv("NACL_DATA_URL"); if (!data_url) data_url = "./"; if (mount(data_url, "/mnt/http", "httpfs", 0, "") != 0) { perror("mounting http filesystem at /mnt/http failed"); } if (mount("/", "/mnt/html5", "html5fs", 0, "type=PERSISTENT") != 0) { perror("Mounting HTML5 filesystem in /mnt/html5 failed."); } else { mkdir("/mnt/html5/home", 0777); struct stat st; if (stat("/mnt/html5/home", &st) < 0 || !S_ISDIR(st.st_mode)) { perror("Unable to create home directory in persistent storage."); } else { if (mount("/home", home, "html5fs", 0, "type=PERSISTENT") != 0) { fprintf(stderr, "Mounting HTML5 filesystem in %s failed.\n", home); } } } if (mount("/", "/tmp", "html5fs", 0, "type=TEMPORARY") != 0) { perror("Mounting HTML5 filesystem in /tmp failed."); } /* naclprocess.js sends the current working directory using this * environment variable. */ if (getenv("PWD")) chdir(getenv("PWD")); // Tell the NaCl architecture to /etc/bashrc of mingn. #if defined(__x86_64__) static const char kNaClArch[] = "x86_64"; #elif defined(__i686__) static const char kNaClArch[] = "i686"; #elif defined(__arm__) static const char kNaClArch[] = "arm"; #elif defined(__pnacl__) static const char kNaClArch[] = "pnacl"; #else # error "Unknown architecture" #endif // Set NACL_ARCH with a guess if not set (0 == set if not already). setenv("NACL_ARCH", kNaClArch, 0); // Set NACL_BOOT_ARCH if not inherited from a parent (0 == set if not already // set). This will let us prefer PNaCl if we started with PNaCl (for tests // mainly). setenv("NACL_BOOT_ARCH", kNaClArch, 0); setlocale(LC_CTYPE, ""); nacl_spawn_pid = getenv_as_int("NACL_PID"); nacl_spawn_ppid = getenv_as_int("NACL_PPID"); return nacl_main(argc, argv); }