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); } }
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(); } }