void RenderProcessHandler::OnWebKitInitialized() {
    QFile extensionFile(":/cef/extension.js");
    const auto ok = extensionFile.open(QFile::ReadOnly | QFile::Text);
    if (ok) {
        const auto extensionCode = QString(extensionFile.readAll()).toStdString();
        CefRegisterExtension("cef/bridge", extensionCode, NULL);
    }
}
Example #2
0
void writeAndroidStubs(string& outputDir, Interface& ext, string& androidPackageName) {
	_mkdir(outputDir.c_str());

	// The interface stub
	string extensionFileName = outputDir + "Extension.java";
	ofstream extensionFile(extensionFileName.c_str());

	extensionFile << "package " << androidPackageName << ";\n\n";

	extensionFile << "import com.mosync.api.*;\n";
	extensionFile << "import " << androidPackageName << ".types.*;\n\n";

	extensionFile << "public class Extension extends MoSyncExtension {\n\n";

	for (size_t i = 0; i < ext.constSets.size(); i++) {
		ConstSet cs = ext.constSets[i];
		string name = cs.name;
		for (size_t j = 0; j < cs.constants.size(); j++) {
			Constant c = cs.constants[j];
			extensionFile << "\tpublic final static " << toAndroidType(ext, androidPackageName, c.type, false, true, false) << " " << name << c.name << " = " << c.value << ";\n";
		}
		extensionFile << "\n";
	}

	extensionFile << "\t/*public void onLoad(MoSyncContext context) {\n\t}*/\n\n";
	extensionFile << "\t/*public void onUnload(MoSyncContext context) {\n\t}*/\n\n";

	for (size_t i = 0; i < ext.functions.size(); i++) {
		Function f = ext.functions[i];
		string returnType = toAndroidType(ext, androidPackageName, f.returnType, false, false, false);
		extensionFile << "\tpublic " << returnType << " " << f.name << "(";
		for (size_t j = 0; j < f.args.size(); j++) {
			if (j > 0) {
				extensionFile << ", ";
			}
			Argument arg = f.args[j];
			extensionFile << toAndroidType(ext, androidPackageName, arg.type, false, arg.in, false);
			extensionFile << " ";
			extensionFile << arg.name;
		}
		extensionFile << ") {\n\t\t/* TODO: Replace this with an implementation */\n";
		if (isReturnType(ext, f.returnType)) {
			extensionFile << "\t\treturn " << getAndroidDefaultValue(returnType) << ";\n";
		}
		extensionFile << "\t}\n\n";
	}

	extensionFile << "}\n";

	extensionFile.close();

	// The structs
	string typesDir = outputDir + "types/";
	if (!ext.structs.empty()) {
		_mkdir(typesDir.c_str());
	}

	for (size_t i = 0; i < ext.structs.size(); i++) {
		Struct s = ext.structs[i];
		string structFileName = typesDir + s.name + ".java";
		ofstream structFile(structFileName.c_str());

		// Package
		structFile << "package " << androidPackageName << ".types;\n\n";

		// Import(s)
		structFile << "import com.mosync.api.*;\n\n";

		// Class declaration and fields
		structFile << "public class " << s.name << " extends Struct {\n\n";

		for (size_t j = 0; j < s.members.size(); j++) {
			Member m = s.members[j];
			string type = m.pod[0].type;
			string androidType = toAndroidType(ext, androidPackageName, type, false, false, false);
			structFile << "\tpublic " << androidType << " " << m.pod[0].name << ";\n";
			int pointerDepth = 0;
			string pointerType = extractPointerType(type, pointerDepth);
			structFile << "\tprivate final static Marshaller __" << m.pod[0].name << " = _m(\"" << ext.name << "\", \"" << pointerType << "\", " << pointerDepth << ");\n\n";
		}

		// Unmarshalling
		size_t size = 0;
		structFile << "\n\tpublic Struct unmarshal(byte[] data, int offset) {\n";
		structFile << "\t\t" << s.name << " s = new " << s.name << "();\n";
		for (size_t j = 0; j < s.members.size(); j++) {
			Member m = s.members[j];
			string ctype = m.pod[0].type;
			string name = m.pod[0].name;
			string cast = toAndroidType(ext, androidPackageName, ctype, true, false, false);
			int padding = getPadding(ext, ctype);
			structFile << "\t\ts." << name << " = (" << cast << ")__" << name << ".unmarshal(data, offset + " << (size + padding) << ");\n";
			size += cTypeAlignedSize(ext, ctype);
		}
		structFile << "\t\treturn s;\n";
		structFile << "\t}\n\n";

		// Marshalling
		size = 0; // <-- Reset size to 0.
		structFile << "\tpublic void marshal(Object struct, byte[] data, int offset) {\n";
		structFile << "\t\t" << s.name << " s = (" << s.name << ") struct;\n";
		for (size_t j = 0; j < s.members.size(); j++) {
			Member m = s.members[j];
			string ctype = m.pod[0].type;
			string name = m.pod[0].name;
			string cast = toAndroidType(ext, androidPackageName, ctype, true, false, false);
			int padding = getPadding(ext, ctype);
			structFile << "\t\t__" << name << ".marshal(s." << name << ", data, offset + " << (size + padding) << ");\n";
			size += cTypeAlignedSize(ext, ctype);
		}
		structFile << "\t}\n\n";

		structFile << "\tpublic int size() { return " << size << "; }\n\n";

		structFile << "}\n";

		structFile.close();
	}
}