Пример #1
0
	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;
	};
Пример #2
0
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());
			};
		};
	};
}