platform/shared/common/RhodesApp.cpp in rhodes-2.1.0 vs platform/shared/common/RhodesApp.cpp in rhodes-2.2.0.beta.1

- old
+ new

@@ -54,10 +54,11 @@ CRhodesApp::CRhodesApp(const String& strRootPath) : CRhodesAppBase(strRootPath) { m_bExit = false; m_bDeactivationMode = false; + m_activateCounter = 0; m_ptrFactory = rho_impl_createClassFactory(); m_NetRequest = m_ptrFactory->createNetRequest(); #if defined( OS_WINCE ) || defined (OS_WINDOWS) @@ -90,20 +91,17 @@ sync::CSyncThread::Create(rho_impl_createClassFactory()); LOG(INFO) + "RhoRubyInitApp..."; RhoRubyInitApp(); - //LOG(INFO) + "activate app"; - //rho_ruby_activateApp(); - getSplashScreen().hide(); - + //rho_clientregister_create("iphone_client"); +#if defined( OS_WINCE ) || defined( OS_WINDOWS ) LOG(INFO) + "navigate to first start url"; - navigateToUrl(getFirstStartUrl()); + RHODESAPP().navigateToUrl(RHODESAPP().getFirstStartUrl()); +#endif - //rho_clientregister_create("iphone_client"); - while (!m_bExit) { m_httpServer->run(); if (m_bExit) break; wait(-1); @@ -215,10 +213,20 @@ CRhoActivateApp(const String& strUrl) :m_strUrl(strUrl) {} void run(common::CRhoThread &thisThread) { while (!rho_is_local_server_started()) thisThread.wait(1); + + static bool navigated = false; + if (!navigated) + { + LOG(INFO) + "navigate to first start url"; + RHODESAPP().navigateToUrl(RHODESAPP().getFirstStartUrl()); + navigated = true; + } + // RHODESAPP().getSplashScreen().hide(); + common::CAutoPtr<common::IRhoClassFactory> factory = rho_impl_createClassFactory(); common::CAutoPtr<net::INetRequest> pNetRequest = factory->createNetRequest(); NetResponse(resp, pNetRequest->pullData( m_strUrl, null ) ); if ( !resp.isOK() ) LOG(ERROR) + "activate app failed. Code: " + resp.getRespCode() + "; Error body: " + resp.getCharData(); @@ -226,13 +234,16 @@ }; void CRhodesApp::callAppActiveCallback(boolean bActive) { LOG(INFO) + "callAppActiveCallback"; + int stop = !rho_conf_getBool("dont_stop_local_server_in_background"); if (bActive) { - this->stopWait(); + if (stop) + if (m_activateCounter++ > 0) + this->stopWait(); String strUrl = m_strHomeUrl + "/system/activateapp"; // Activation callback need to be runned in separate thread // Otherwise UI thread will be blocked. This can cause deadlock if user defined // activate callback contains code which need to hold UI thread for execute @@ -250,11 +261,12 @@ m_bDeactivationMode = true; String strUrl = m_strHomeUrl + "/system/deactivateapp"; NetResponse(resp,getNet().pullData( strUrl, null )); if ( !resp.isOK() ) LOG(ERROR) + "deactivate app failed. Code: " + resp.getRespCode() + "; Error body: " + resp.getCharData(); - m_httpServer->stop(); + if (stop) + m_httpServer->stop(); m_bDeactivationMode = false; } } void CRhodesApp::callCameraCallback(String strCallbackUrl, const String& strImagePath, @@ -310,10 +322,17 @@ strBody += "&rho_callback=1"; NetRequest( getNet().pushData( strCallbackUrl, strBody, null ) ); } +void CRhodesApp::callBluetoothCallback(String strCallbackUrl, const char* body) { + strCallbackUrl = canonicalizeRhoUrl(strCallbackUrl); + String strBody = body; + strBody += "&rho_callback=1"; + NetRequest( getNet().pushData( strCallbackUrl, strBody, null ) ); +} + void CRhodesApp::callPopupCallback(String strCallbackUrl, const String &id, const String &title) { if ( strCallbackUrl.length() == 0 ) return; @@ -336,12 +355,12 @@ if ( nUrl != String::npos ) strUrl = strQuery.substr(nUrl+4); if ( strUrl.length() == 0 ) strUrl = "/app/"; - - rho_http_redirect(arg, strUrl.c_str()); + + rho_http_redirect(arg, (rho::net::URI::urlDecode(strUrl)).c_str()); } static void callback_map(void *arg, String const &query ) { rho_map_location( const_cast<char*>(query.c_str()) ); @@ -445,33 +464,46 @@ } #endif if (noerrors) { + int listenPort = rho_conf_getInt("local_server_port"); + if (listenPort < 0) + listenPort = 0; + if (listenPort > 65535) + listenPort = 0; memset((void *) &serv_addr, 0, sizeof(serv_addr)); #if defined(OS_MACOSX) serv_addr.sin_len = sizeof(serv_addr); #endif serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); - serv_addr.sin_port = htons(8080); + serv_addr.sin_port = htons((short)listenPort); - LOG(INFO) + "Trying to bind on 8080 port..."; + LOG(INFO) + "Trying to bind of " + listenPort + " port..."; if ( bind( sockfd, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) != 0 ) { - // Fill serv_addr again but with dynamically selected port + if (listenPort != 0) + { + // Fill serv_addr again but with dynamically selected port #if defined(OS_MACOSX) - serv_addr.sin_len = sizeof(serv_addr); + serv_addr.sin_len = sizeof(serv_addr); #endif - serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); - serv_addr.sin_port = htons(0); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(0); + + LOG(INFO) + "Trying to bind on dynamic port..."; - LOG(INFO) + "Trying to bind on dynamic port..."; - - if ( bind( sockfd, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) != 0 ) + if ( bind( sockfd, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) != 0 ) + { + LOG(WARNING) + "Unable to bind"; + noerrors = 0; + } + } + else { LOG(WARNING) + "Unable to bind"; noerrors = 0; } } @@ -513,12 +545,16 @@ void CRhodesApp::initAppUrls() { CRhodesAppBase::initAppUrls(); m_currentTabIndex = 0; - + +#if defined( OS_WINCE ) || defined( OS_WINDOWS ) m_strHomeUrl = "http://localhost:"; +#else + m_strHomeUrl = "http://127.0.0.1:"; +#endif m_strHomeUrl += getFreeListeningPort(); m_strLoadingPagePath = "file://" + getRhoRootPath() + "apps/app/loading.html"; m_strLoadingPngPath = getRhoRootPath() + "apps/app/loading.png"; } @@ -613,11 +649,11 @@ return m_strRhobundleReloadUrl; } void CRhodesApp::navigateToUrl( const String& strUrl) { - rho_webview_navigate(strUrl.c_str(), 0); + rho_webview_navigate(strUrl.c_str(), -1); } void CRhodesApp::navigateBack() { //rho::String strAppUrl = getAppBackUrl(); @@ -974,10 +1010,14 @@ void rho_rhodesapp_callDateTimeCallback(const char* strCallbackUrl, long lDateTime, const char* szData, int bCancel ) { RHODESAPP().callDateTimeCallback(strCallbackUrl, lDateTime, szData, bCancel != 0); } +void rho_rhodesapp_callBluetoothCallback(const char* strCallbackUrl, const char* body) { + RHODESAPP().callBluetoothCallback(strCallbackUrl, body); +} + void rho_rhodesapp_callPopupCallback(const char *strCallbackUrl, const char *id, const char *title) { RHODESAPP().callPopupCallback(strCallbackUrl, id, title); } @@ -1108,10 +1148,17 @@ rho::common::CAutoPtr<rho::common::IRhoClassFactory> factory = rho_impl_createClassFactory(); rho::common::CAutoPtr<rho::net::INetRequest> request = factory->createNetRequest(); request->pullData(url, null); } +void rho_net_request_with_data(const char *url, const char *str_body) { + rho::common::CAutoPtr<rho::common::IRhoClassFactory> factory = rho_impl_createClassFactory(); + rho::common::CAutoPtr<rho::net::INetRequest> request = factory->createNetRequest(); + request->pushData(url, str_body, null); +} + + void rho_rhodesapp_load_url(const char *url) { RHODESAPP().loadUrl(url); } @@ -1146,6 +1193,11 @@ gettimeofday(&tv, NULL); return ((unsigned long long)tv.tv_sec)*1000000 + tv.tv_usec; } #endif +void rho_free_callbackdata(void* pData) +{ + //It is used in SyncClient. +} + } //extern "C"