static VALUE createHashFromContact(jobject contactObj) { if (logging_enable) RAWLOG_INFO("createHashFromContact() START"); JNIEnv *env = jnienv(); jclass contactCls = getJNIClass(RHODES_JAVA_CLASS_CONTACT); if (!contactCls) return Qnil; jclass fieldCls = getJNIClass(RHODES_JAVA_CLASS_CONTACT_FIELD); if (!fieldCls) return Qnil; jmethodID contactGetFieldMID = getJNIClassMethod(env, contactCls, "getField", "(I)Ljava/lang/String;"); if (!contactGetFieldMID) return Qnil; CHoldRubyValue contactHash(rho_ruby_createHash()); // contact.moveToBegin(); int i; for (i = 0; i < PB_FIELDS_COUNT; i++) { jstring value = (jstring)env->CallObjectMethod(contactObj, contactGetFieldMID, i); if (value != NULL) { addStrToHash(contactHash, field_names[i], rho_cast<std::string>(value).c_str()); } env->DeleteLocalRef(value); } if (logging_enable) RAWLOG_INFO("createHashFromContact() FINISH"); return contactHash; }
RHO_GLOBAL void JNICALL Java_com_rhomobile_rhodes_nativeview_RhoNativeViewManager_navigateByHandle (JNIEnv *env, jclass, jlong handle, jstring url) { if (logging_enable) RAWLOG_INFO("navigateByHandle() START"); NativeView* p = (NativeView*)handle; if (p != NULL) { if (logging_enable) RAWLOG_INFO("navigateByHandle() handle not NULL"); p->navigate(rho_cast<std::string>(url).c_str()); } if (logging_enable) RAWLOG_INFO("navigateByHandle() FINISH"); }
RHO_GLOBAL VALUE getPhonebookRecord(void* pb, char* id) { if (logging_enable) RAWLOG_INFO("getPhonebookRecord() START"); jobject recordObj = (jobject)openPhonebookRecord(pb, id); if (!recordObj) { if (logging_enable) RAWLOG_INFO("getPhonebookRecord() FINISH return NIL"); return Qnil; } VALUE retval = createHashFromContact(recordObj); jnienv()->DeleteGlobalRef(recordObj); if (logging_enable) RAWLOG_INFO("getPhonebookRecord() FINISH"); return retval; }
void CHttpServer::stop() { // WARNING!!! It is not enough to just close listener on Android // to stop server. By unknown reason accept does not unblock if // it was closed in another thread. However, on iPhone it works // right. To work around this, we create dummy socket and connect // to the listener. This surely unblock accept on listener and, // therefore, stop server thread (because m_active set to false). m_active = false; RAWLOG_INFO("Stopping server..."); SOCKET conn = socket(AF_INET, SOCK_STREAM, 0); sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons((uint16_t)m_port); sa.sin_addr.s_addr = inet_addr("127.0.0.1"); int err = connect(conn, (struct sockaddr *)&sa, sizeof(sa)); if (err == SOCKET_ERROR) RAWLOG_ERROR1("Stopping server: can not connect to listener: %d", RHO_NET_ERROR_CODE); else RAWTRACE("Stopping server: command sent"); closesocket(conn); /* RAWTRACE("Close listening socket"); close_listener(); RAWTRACE("Listening socket closed"); */ }
int _ExecuteApp(HttpContextRef context, RouteRef route) { if (route->_application && !strcmp(route->_application,"AppManager")) { RAWLOG_INFO("Executing AppManager"); return ExecuteAppManager(context,route); } else if (route->_application && !strcmp(route->_application,"system")) { if (context->_request->_method == METHOD_GET) { if (route->_model && !strcmp(route->_model,"geolocation")) { return HTTPSendReply(context,GeoGetLocation()); } else if (route->_model && !strcmp(route->_model,"syncdb")) { rho_sync_doSyncAllSources(); return HTTPSendReply(context,"OK"); } else if (route->_model && !strcmp(route->_model,"redirect_to")) { if (context->_request->_query && !strncmp("url=",context->_request->_query,4)) { char* location = context->_request->_query+4; int len = strlen(location); HTTPUrlDecode(location, len, location, len+1); return HTTPRedirect(context, location); } else { return HTTPRedirect(context, "/app/"); } } } } else if (route->_application && !strcmp(route->_application,"shared")) { return 0; } else { RAWLOG_INFO1( "Executing %s",route->_application); return _CallApplication(context, route); } return 0; }
RHO_GLOBAL void* openPhonebookRecord(void* pb, char* id) { if (logging_enable) RAWLOG_INFO("openPhonebookRecord() START"); JNIEnv *env = jnienv(); jobject obj = (jobject)pb; jclass cls = getJNIClass(RHODES_JAVA_CLASS_PHONEBOOK); if (!cls) return NULL; jmethodID mid = getJNIClassMethod(env, cls, "getRecord", "(Ljava/lang/String;)Lcom/rhomobile/rhodes/phonebook/Contact;"); if (!mid) return NULL; jhstring objId = rho_cast<jhstring>(id); jhobject recordObj = jhobject(env->CallObjectMethod(obj, mid, objId.get())); if (!recordObj) return NULL; jhobject retval = jhobject(env->NewGlobalRef(recordObj.get())); if (logging_enable) RAWLOG_INFO("openPhonebookRecord() FINISH"); if (!retval) return NULL; return retval.release(); }
static void Init_RhoBlobs() { VALUE path = rb_str_new2(rho_rhodesapp_getblobsdirpath()); RAWLOG_INFO1("Init_RhoBlobs: %s", RSTRING_PTR(path) ); if ( rb_funcall(rb_cDir, rb_intern("exist?"), 1, path)==Qfalse ) rb_funcall(rb_cDir, rb_intern("mkdir"), 1, path); RAWLOG_INFO("Init_RhoBlobs: done"); }
static VALUE getRecord(void *pb, const char *name) { if (logging_enable) RAWLOG_INFO("getRecord() START"); jobject obj = (jobject)pb; JNIEnv *env = jnienv(); if (!env) { if (logging_enable) RAWLOG_INFO("getRecord() FINISH return NIL0"); return Qnil; } jclass cls = getJNIClass(RHODES_JAVA_CLASS_PHONEBOOK); if (!cls) { if (logging_enable) RAWLOG_INFO("getRecord() FINISH return NIL1"); return Qnil; } jmethodID mid = getJNIClassMethod(env, cls, name, "()Lcom/rhomobile/rhodes/phonebook/Contact;"); if (!mid) { if (logging_enable) RAWLOG_INFO("getRecord() FINISH return NIL2"); return Qnil; } jobject recordObj = env->CallObjectMethod(obj, mid); if (!recordObj) { if (logging_enable) RAWLOG_INFO("getRecord() FINISH return NIL"); return Qnil; } if (logging_enable) RAWLOG_INFO("getRecord() FINISH"); return createHashFromContact(recordObj); }
RHO_GLOBAL void alert_show_status(const char* szTitle, const char* szMessage, const char* szHide) { JNIEnv *env = jnienv(); jclass cls = getJNIClass(RHODES_JAVA_CLASS_ALERT); if (!cls) return; jmethodID mid = getJNIClassStaticMethod(env, cls, "showStatusPopup", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); if (!mid) return; RAWLOG_INFO("alert_show_status"); env->CallStaticVoidMethod(cls, mid, rho_cast<jhstring>(szTitle).get(), rho_cast<jhstring>(szMessage).get(), rho_cast<jhstring>(szHide).get()); }
int ServeIndex(HttpContextRef context, char* index_name) { RAWLOG_INFO("Calling ruby framework to serve index"); VALUE val = callServeIndex(index_name); char* res = getStringFromValue(val); if (res) { RAWTRACE("RESPONSE:"); RAWTRACE_DATA((UInt8*)res, strlen(res)); RAWTRACE("RESPONSE -- eof --"); RAWTRACE("Add response to the send buffer"); CFDataAppendBytes(context->_sendBytes, (UInt8*)res, (CFIndex)strlen(res)); releaseValue(val); return 1; } return 0; }
static int _CallApplication(HttpContextRef context, RouteRef route) { RAWLOG_INFO("Calling ruby framework"); VALUE val = callFramework(_CreateRequestHash(context,route)); char* res = getStringFromValue(val); if (res) { RAWTRACE("RESPONSE:"); RAWTRACE_DATA((UInt8*)res, strlen(res)); RAWTRACE( "RESPONSE -- eof --"); RAWTRACE("Add response to the send buffer"); CFDataAppendBytes(context->_sendBytes, (UInt8*)res, (CFIndex)strlen(res)); releaseValue(val); return 1; } return 0; }
RHO_GLOBAL VALUE getallPhonebookRecords(void* pb) { if (logging_enable) RAWLOG_INFO("getallPhonebookRecords() START"); jobject phonebookObj = (jobject)pb; JNIEnv *env = jnienv(); jclass phonebookCls = getJNIClass(RHODES_JAVA_CLASS_PHONEBOOK); if (!phonebookCls) return Qnil; jclass contactCls = getJNIClass(RHODES_JAVA_CLASS_CONTACT); if (!contactCls) return Qnil; jmethodID phonebookPrepareFullListMID = getJNIClassMethod(env, phonebookCls, "prepareFullList", "()V"); if (!phonebookPrepareFullListMID) return Qnil; jmethodID phonebookMoveToBeginMID = getJNIClassMethod(env, phonebookCls, "moveToBegin", "()V"); if (!phonebookMoveToBeginMID) return Qnil; jmethodID hasNextMID = getJNIClassMethod(env, phonebookCls, "hasNext", "()Z"); if (!hasNextMID) return Qnil; jmethodID nextMID = getJNIClassMethod(env, phonebookCls, "next", "()Ljava/lang/Object;"); if (!nextMID) return Qnil; jmethodID contactIdMID = getJNIClassMethod(env, contactCls, "id", "()Ljava/lang/String;"); if (!contactIdMID) return Qnil; jmethodID contactGetFieldMID = getJNIClassMethod(env, contactCls, "getField", "(I)Ljava/lang/String;"); if (!contactGetFieldMID) return Qnil; env->CallVoidMethod(phonebookObj, phonebookPrepareFullListMID); // pb.moveToBegin(); env->CallVoidMethod(phonebookObj, phonebookMoveToBeginMID); VALUE valGc = rho_ruby_disable_gc(); CHoldRubyValue hash(rho_ruby_createHash()); // while(pb.hasNext()) while(env->CallBooleanMethod(phonebookObj, hasNextMID)) { // Contact contact = (Contact)pb.next(); jobject contactObj = env->CallObjectMethod(phonebookObj, nextMID); if (!contactObj) return Qnil; // String id = contact.id(); jstring idObj = (jstring)env->CallObjectMethod(contactObj, contactIdMID); if (!idObj) return Qnil; //addHashToHash(hash, rho_cast<std::string>(idObj).c_str(), createHashFromContact(contactObj)); CHoldRubyValue contactHash(rho_ruby_createHash()); // contact.moveToBegin(); int i; for (i = 0; i < PB_FIELDS_COUNT; i++) { jstring value = (jstring)env->CallObjectMethod(contactObj, contactGetFieldMID, i); if (value != NULL) { addStrToHash(contactHash, field_names[i], rho_cast<std::string>(value).c_str()); env->DeleteLocalRef(value); } } addHashToHash(hash, rho_cast<std::string>(idObj).c_str(), contactHash); env->DeleteLocalRef(idObj); env->DeleteLocalRef(contactObj); } rho_ruby_enable_gc(valGc); if (logging_enable) RAWLOG_INFO("getallPhonebookRecords() FINISH"); return hash; }