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"