remote/CefUtils.cpp (125 lines of code) (raw):
#include "CefUtils.h"
#include <algorithm>
#include <boost/filesystem.hpp>
#include <fstream>
#include "ServerApplication.h"
#if defined(OS_MAC)
#include "include/wrapper/cef_library_loader.h"
#include <dirent.h>
#include <errno.h>
#endif
#include "log/Log.h"
#include "handlers/app/RemoteAppHandler.h"
#include "include/cef_version_info.h"
#include "../native/jcef_version.h"
namespace CefUtils {
#if defined(OS_MAC)
std::string g_pathFrameworkDir = "";
std::string g_pathFramework = "";
bool isDirExist(const char* pathname) {
DIR* dir = opendir(pathname);
if (dir) {
closedir(dir);
return true;
}
if (ENOENT != errno)
Log::error("opendir() failed, err=%d", errno);
return false;
}
bool findFramework() {
if (!g_pathFramework.empty())
return true;
// 1. check env var
char * val = getenv("ALT_CEF_FRAMEWORK_DIR");
if (val != NULL && isDirExist(val)) {
std::string path = string_format("%s/%s", val, "Chromium Embedded Framework");
if (utils::isFileExist(path.c_str())) {
g_pathFrameworkDir = val;
g_pathFramework = path;
Log::debug("Will be used alt CEF framework path '%s'", g_pathFramework.c_str());
return true;
}
Log::warn("Alt CEF framework path '%s' doesn't contain subfolder 'Chromium Embedded Framework'", g_pathFramework.c_str());
}
// 2. check JBR-case location
boost::filesystem::path path = boost::filesystem::current_path()
.append("..")
.append("..")
.append("..")
.append("Chromium Embedded Framework.framework")
.append("Chromium Embedded Framework")
.lexically_normal();
if (utils::isFileExist(path.c_str())) {
g_pathFrameworkDir = boost::filesystem::current_path()
.append("..")
.append("..")
.append("..")
.append("Chromium Embedded Framework.framework")
.lexically_normal().string();
g_pathFramework = path.string();
Log::trace("Will be used CEF framework from JBR, path '%s'", g_pathFramework.c_str());
return true;
}
// 3. check server-bundle location
path = boost::filesystem::current_path()
.append("..")
.append("Frameworks")
.append("Chromium Embedded Framework.framework")
.append("Chromium Embedded Framework")
.lexically_normal();
if (utils::isFileExist(path.c_str())) {
g_pathFrameworkDir = boost::filesystem::current_path()
.append("..")
.append("Frameworks")
.append("Chromium Embedded Framework.framework")
.lexically_normal().string();
g_pathFramework = path.string();
Log::trace("Will be used CEF framework from bundle, path '%s'", g_pathFramework.c_str());
return true;
}
Log::error("Can't find CEF framework.");
return false;
}
std::string getFrameworkDir() {
findFramework();
return g_pathFrameworkDir;
}
bool loadCefFramework() {
if (!findFramework())
return false;
if (!cef_load_library(g_pathFramework.c_str())) {
Log::debug("Failed to load the CEF framework by path %s", g_pathFramework.c_str());
return false;
}
return true;
}
#endif
void runCefLoop() {
CefRunMessageLoop();
Log::debug("Cef going shutdown.");
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // sleep to prevent shutdown_checker::AssertNotShutdown() inside life_span_handler_on_before_close
CefShutdown();
Log::debug("Shutdown finished.");
}
bool initializeCef() {
CefMainArgs main_args;
RemoteAppHandler* app = ServerApplication::instance().getCefAppHandler();
const bool isInitialized = CefInitialize(main_args, app->getCefSettings(), app, nullptr);
if (isInitialized)
Log::info("CEF is initialized, version: %s", getVersionWithSha().c_str());
else
Log::error("CEF initialization failed.");
return isInitialized;
}
std::string getVersionWithSha() {
return string_format("%d.%d.%d.%d_%s",
cef_version_info(0), // CEF_VERSION_MAJOR
cef_version_info(1), // CEF_VERSION_MINOR
cef_version_info(2), // CEF_VERSION_PATCH
cef_version_info(3), // CEF_COMMIT_NUMBER
JCEF_COMMIT_HASH);
}
} // CefUtils
std::string toString(cef_rect_t& rect) {
return string_format("[%d,%d,%d,%d]", rect.x, rect.y, rect.width, rect.height);
}
std::string toString(cef_point_t& pt) {
return string_format("[%d,%d]", pt.x, pt.y);
}