static bool set_capabilities(JNIEnv *env) { RAWTRACE("Capabilities setup"); char const *caps[] = { #define RHO_DEFINE_CAP(x) #x, #include "rhocaps.inc" #undef RHO_DEFINE_CAP }; std::map<std::string, bool> actual_caps; #define RHO_DEFINE_CAP(x) actual_caps[#x] = RHO_CAP_ ## x ## _ENABLED; #include "rhocaps.inc" #undef RHO_DEFINE_CAP jclass cls = getJNIClass(RHODES_JAVA_CLASS_CAPABILITIES); if (!cls) return false; for (size_t i = 0, lim = sizeof(caps)/sizeof(caps[0]); i < lim; ++i) { std::string field_name = std::string(caps[i]) + "_ENABLED"; RAWTRACE2("%s->%d", field_name.c_str(), static_cast<int>(actual_caps[caps[i]])); jfieldID fid = getJNIClassStaticField(env, cls, field_name.c_str(), "Z"); if (!fid) return false; env->SetStaticBooleanField(cls, fid, actual_caps[caps[i]]); } return true; }
//-------------------------------------------------------------------------------------------------- RHO_GLOBAL void *rho_nativethread_start() { JNIEnv *env; jvm()->AttachCurrentThread(&env, NULL); RAWTRACE2("Starting new thread - env: 0x%.8x, functions: 0x%.8x ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", env, env->functions); store_thr_jnienv(env); return NULL; }
void MapProvider::registerMapEngine(String const &id, IMapEngine *engine) { RAWTRACE2("Register map engine: id=%s, engine=%p", id.c_str(), engine); IMapEngine *old = m_engines.get(id); if (old) delete old; m_engines.put(id, engine); }
jclass rho_find_class(JNIEnv *env, const char *c) { RAWTRACE2("%s - %s", __FUNCTION__, c); jstring className = env->NewStringUTF(c); jclass cls = (jclass)env->CallObjectMethod(g_classLoader, g_loadClass, className); if(env->ExceptionCheck() == JNI_TRUE) { env->ExceptionClear(); cls = 0; } else { env->DeleteLocalRef(className); } return cls; }
const PbPageParam* rho_phonebook_getpageparams(rho_param* param, PbPageParam* page) { bool offset = false; bool per_page = false; if(param == 0 || page == 0) { RAWTRACE2("Param(0x%.8X) or page(0x%.8X) is NULL, skipping", param, page); return 0; } if (param->type == RHO_PARAM_HASH) { for (int i = 0, lim = param->v.hash->size; i < lim; ++i) { const char* key = param->v.hash->name[i]; rho_param* value = param->v.hash->value[i]; if (strcasecmp(key, "offset") == 0) { RAWTRACE("'offset' parameter found"); if (value->type == RHO_PARAM_STRING) { RAWTRACE1("'offset' parameter is string: %s", value->v.string); sscanf(value->v.string, "%d", &page->offset); offset = true; } } else if (strcasecmp(key, "per_page") == 0) { RAWTRACE("'per_page' parameter found"); if (value->type == RHO_PARAM_STRING) { RAWTRACE1("'per_page' parameter is string: %s", value->v.string); sscanf(value->v.string, "%d", &page->per_page); per_page = true; } } if(offset && per_page) break; } } else { RAWTRACE("rho_param is not a hash!"); } if(!offset) page->offset = 0; if(!per_page) page->per_page = -1; return page; }
//-------------------------------------------------------------------------------------------------- rho::String rho_cur_path() { char buf[PATH_MAX]; if (::getcwd(buf, sizeof(buf)) == NULL) return ""; static const char* before_m_prefix = "/data/data/"; static const char* m_prefix = "/data/user/0/"; //For Android M compatibility: ::getcwd will return path starting with /data/data while root starts with /data/user/0. //This breaks file API so substitute for compatibility //TODO: deprecate rho_cur_path and use only rho_root path after stability testing. //check if root set from java code starts from m_prefix bool root_is_android_m = ( ::strncmp( rho_root_path().c_str(), m_prefix, ::strlen(m_prefix) ) == 0 ); //check if current dir starts from legacy prefix bool cwd_is_legacy = ( ::strncmp( buf, before_m_prefix, ::strlen(before_m_prefix ) ) == 0 ); if ( root_is_android_m && cwd_is_legacy ) { //make buf copy to avoid overlapping char buf2[PATH_MAX]; ::strcpy(buf2,buf); ::snprintf(buf, sizeof(buf), "%s%s", m_prefix, &buf2[::strlen(before_m_prefix)] ); RAWTRACE2( "Android M compat: altering rho_cur_path from %s to %s", buf2, buf ); } return buf; }
RHO_GLOBAL jstring JNICALL Java_com_rhomobile_rhodes_RhodesService_currentLocation(JNIEnv * env, jclass, jint jTab) { std::string strLocation = RHODESAPP().getCurrentUrl(static_cast<int>(jTab)); RAWTRACE2("Controller currentLocation (tab: %d): %s", static_cast<int>(jTab), strLocation.c_str()); return rho_cast<jstring>(env, strLocation); }