Example #1
0
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;
}
Example #2
0
//--------------------------------------------------------------------------------------------------
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;
}
Example #3
0
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);
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
//--------------------------------------------------------------------------------------------------
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;
}
Example #7
0
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);
}