rhodes 2.0.0.beta7 → 2.0.0.beta8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +20 -1
- data/bin/rhodes-setup +6 -2
- data/lib/extensions/digest/ext/Rakefile +2 -2
- data/lib/framework/rho/render.rb +2 -0
- data/lib/framework/rho/rho.rb +159 -95
- data/lib/framework/rho/rhoapplication.rb +24 -5
- data/lib/framework/rhodes.rb +1 -1
- data/lib/framework/rhom/rhom_model.rb +32 -23
- data/lib/framework/rhom/rhom_object_factory.rb +2 -2
- data/lib/rhodes.rb +1 -1
- data/platform/android/Rhodes/jni/src/callbacks.cpp +8 -1
- data/platform/android/Rhodes/jni/src/mapview.cpp +4 -1
- data/platform/android/Rhodes/jni/src/sslimpl.cpp +5 -1
- data/platform/android/Rhodes/jni/src/webview.cpp +3 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/NativeBar.java +3 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/NativeLibraries.java +2 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/NavBar.java +1 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +1 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocation.java +3 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocationImpl.java +0 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/MainView.java +4 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +24 -6
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +7 -2
- data/platform/android/build/android.rake +11 -38
- data/platform/android/build/androidcommon.rb +50 -2
- data/platform/android/build/librhocommon_build.files +1 -0
- data/platform/android/build/libsqlite_build.files +1 -0
- data/platform/bb/rhodes/platform/5.0/com/rho/BrowserAdapter5.java +2 -1
- data/platform/bb/rhodes/src/com/rho/BrowserAdapter.java +1 -5
- data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +3 -6
- data/platform/bb/rhodes/src/com/rho/rubyext/System.java +4 -2
- data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +12 -35
- data/platform/bb/rhodes/src/rhomobile/Utilities.java +2 -1
- data/platform/iphone/Classes/DateTimePickerDelegate.m +4 -4
- data/platform/iphone/Classes/NativeBar.m +12 -6
- data/platform/iphone/Classes/NavBar.m +1 -1
- data/platform/iphone/Classes/RhoMainView.h +4 -1
- data/platform/iphone/Classes/Rhodes.h +6 -2
- data/platform/iphone/Classes/Rhodes.m +23 -3
- data/platform/iphone/Classes/SimpleMainView.h +3 -7
- data/platform/iphone/Classes/SimpleMainView.m +108 -54
- data/platform/iphone/Classes/TabbedMainView.h +3 -2
- data/platform/iphone/Classes/TabbedMainView.m +21 -10
- data/platform/iphone/RhoLib/RhoLib.xcodeproj/project.pbxproj +8 -0
- data/platform/shared/common/IRhoClassFactory.h +1 -0
- data/platform/shared/common/RhodesApp.cpp +7 -2
- data/platform/shared/common/ThreadQueue.cpp +110 -0
- data/platform/shared/common/ThreadQueue.h +75 -0
- data/platform/shared/logging/RhoLogCat.h +4 -0
- data/platform/shared/net/AsyncHttp.cpp +134 -135
- data/platform/shared/net/AsyncHttp.h +74 -33
- data/platform/shared/net/HttpServer.cpp +7 -1
- data/platform/shared/ruby/thread.c +4 -0
- data/platform/shared/ruby/thread_win32.c +9 -8
- data/platform/shared/rubyJVM/src/com/rho/RhodesApp.java +26 -5
- data/platform/shared/rubyJVM/src/com/rho/net/INetworkAccess.java +0 -2
- data/platform/shared/rubyJVM/src/com/rho/net/NetRequest.java +4 -13
- data/platform/shared/rubyJVM/src/com/rho/net/URI.java +2 -2
- data/platform/shared/rubyJVM/src/com/rho/sync/SyncEngine.java +3 -3
- data/platform/shared/rubyJVM/src/com/xruby/runtime/builtin/ObjectFactory.java +12 -2
- data/platform/shared/rubyJVM/src/com/xruby/runtime/builtin/RubyString.java +6 -3
- data/platform/shared/rubyJVM/src/javolution/util/FastTable.java +12 -2
- data/platform/shared/sync/SyncEngine.cpp +15 -3
- data/platform/shared/sync/SyncEngine.h +1 -1
- data/platform/shared/sync/SyncThread.cpp +18 -101
- data/platform/shared/sync/SyncThread.h +30 -22
- data/platform/wm/RhoLib/RhoLib.vcproj +8 -0
- data/platform/wm/rhodes/Rhodes.cpp +143 -1
- data/platform/wm/rhodes/memory_helper.cpp +273 -0
- data/platform/wm/rhodes/rho/common/RhoThreadImpl.cpp +1 -0
- data/platform/wm/rhodes/rho/net/NetRequestImpl.cpp +46 -3
- data/platform/wm/rhodes/rho/rubyext/WebView.cpp +29 -1
- data/res/build-tools/db/syncdb.schema +1 -0
- data/res/generators/rhogen.rb +1 -1
- data/rhodes.gemspec +2 -2
- metadata +23 -6
- data/Manifest.txt +0 -5289
- data/rhobuild.yml +0 -37
|
@@ -48,6 +48,8 @@
|
|
|
48
48
|
5C98174C0FBC4FCE002597A5 /* AutoPointer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C9817490FBC4FCE002597A5 /* AutoPointer.h */; };
|
|
49
49
|
5C98174D0FBC4FCE002597A5 /* InputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C98174A0FBC4FCE002597A5 /* InputStream.h */; };
|
|
50
50
|
5C98174E0FBC4FCE002597A5 /* irhoclassfactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C98174B0FBC4FCE002597A5 /* irhoclassfactory.h */; };
|
|
51
|
+
5CA2DE9011B01EF000B868D5 /* ThreadQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CA2DE8E11B01EF000B868D5 /* ThreadQueue.cpp */; };
|
|
52
|
+
5CA2DE9111B01EF000B868D5 /* ThreadQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CA2DE8F11B01EF000B868D5 /* ThreadQueue.h */; };
|
|
51
53
|
5CBD462A1087399700107D0D /* URI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CBD46271087399700107D0D /* URI.cpp */; };
|
|
52
54
|
5CBD462B1087399700107D0D /* URI.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CBD46281087399700107D0D /* URI.h */; };
|
|
53
55
|
5CCD7EBC116CE2D5005E6CA3 /* AppMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD7EBA116CE2D5005E6CA3 /* AppMenu.cpp */; };
|
|
@@ -111,6 +113,8 @@
|
|
|
111
113
|
5C9817490FBC4FCE002597A5 /* AutoPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AutoPointer.h; path = ../../shared/common/AutoPointer.h; sourceTree = SOURCE_ROOT; };
|
|
112
114
|
5C98174A0FBC4FCE002597A5 /* InputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InputStream.h; path = ../../shared/common/InputStream.h; sourceTree = SOURCE_ROOT; };
|
|
113
115
|
5C98174B0FBC4FCE002597A5 /* irhoclassfactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = irhoclassfactory.h; path = ../../shared/common/irhoclassfactory.h; sourceTree = SOURCE_ROOT; };
|
|
116
|
+
5CA2DE8E11B01EF000B868D5 /* ThreadQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadQueue.cpp; path = ../../shared/common/ThreadQueue.cpp; sourceTree = SOURCE_ROOT; };
|
|
117
|
+
5CA2DE8F11B01EF000B868D5 /* ThreadQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadQueue.h; path = ../../shared/common/ThreadQueue.h; sourceTree = SOURCE_ROOT; };
|
|
114
118
|
5CBD46271087399700107D0D /* URI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = URI.cpp; path = ../../shared/net/URI.cpp; sourceTree = SOURCE_ROOT; };
|
|
115
119
|
5CBD46281087399700107D0D /* URI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = URI.h; path = ../../shared/net/URI.h; sourceTree = SOURCE_ROOT; };
|
|
116
120
|
5CCD7EBA116CE2D5005E6CA3 /* AppMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AppMenu.cpp; path = ../../shared/common/AppMenu.cpp; sourceTree = SOURCE_ROOT; };
|
|
@@ -196,6 +200,8 @@
|
|
|
196
200
|
5C7162600F8B7DEE0096B6AA /* common */ = {
|
|
197
201
|
isa = PBXGroup;
|
|
198
202
|
children = (
|
|
203
|
+
5CA2DE8E11B01EF000B868D5 /* ThreadQueue.cpp */,
|
|
204
|
+
5CA2DE8F11B01EF000B868D5 /* ThreadQueue.h */,
|
|
199
205
|
5CCD7EBA116CE2D5005E6CA3 /* AppMenu.cpp */,
|
|
200
206
|
5CCD7EBB116CE2D5005E6CA3 /* AppMenu.h */,
|
|
201
207
|
BDD11ECB113664E700349BE3 /* rhoparams.c */,
|
|
@@ -328,6 +334,7 @@
|
|
|
328
334
|
5C59BF4E115B4BC300E96ADE /* unzip.h in Headers */,
|
|
329
335
|
5C2F10BC116146930054AC80 /* RhoRuby.h in Headers */,
|
|
330
336
|
5CCD7EBD116CE2D5005E6CA3 /* AppMenu.h in Headers */,
|
|
337
|
+
5CA2DE9111B01EF000B868D5 /* ThreadQueue.h in Headers */,
|
|
331
338
|
);
|
|
332
339
|
runOnlyForDeploymentPostprocessing = 0;
|
|
333
340
|
};
|
|
@@ -396,6 +403,7 @@
|
|
|
396
403
|
5C59BF4D115B4BC300E96ADE /* unzip.cpp in Sources */,
|
|
397
404
|
5C2F10BB116146930054AC80 /* RhoRuby.cpp in Sources */,
|
|
398
405
|
5CCD7EBC116CE2D5005E6CA3 /* AppMenu.cpp in Sources */,
|
|
406
|
+
5CA2DE9011B01EF000B868D5 /* ThreadQueue.cpp in Sources */,
|
|
399
407
|
);
|
|
400
408
|
runOnlyForDeploymentPostprocessing = 0;
|
|
401
409
|
};
|
|
@@ -92,6 +92,7 @@ void CRhodesApp::run()
|
|
|
92
92
|
|
|
93
93
|
LOG(INFO) + "Starting sync engine...";
|
|
94
94
|
rho_sync_create();
|
|
95
|
+
|
|
95
96
|
LOG(INFO) + "RhoRubyInitApp...";
|
|
96
97
|
RhoRubyInitApp();
|
|
97
98
|
|
|
@@ -130,7 +131,7 @@ void CRhodesApp::stopApp()
|
|
|
130
131
|
stop(2000);
|
|
131
132
|
}
|
|
132
133
|
|
|
133
|
-
|
|
134
|
+
net::CAsyncHttp::Destroy();
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
class CRhoCallbackCall : public common::CRhoThread
|
|
@@ -577,7 +578,11 @@ unsigned long CRhodesApp::getCallbackObject(int nIndex)
|
|
|
577
578
|
if ( !pCallbackObject )
|
|
578
579
|
return rho_ruby_get_NIL();
|
|
579
580
|
|
|
580
|
-
|
|
581
|
+
unsigned long valRes = pCallbackObject->getObjectValue();
|
|
582
|
+
|
|
583
|
+
delete pCallbackObject;
|
|
584
|
+
|
|
585
|
+
return valRes;
|
|
581
586
|
}
|
|
582
587
|
|
|
583
588
|
void CRhodesApp::setPushNotification(String strUrl, String strParams )
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#include "ThreadQueue.h"
|
|
2
|
+
|
|
3
|
+
namespace rho {
|
|
4
|
+
namespace common {
|
|
5
|
+
|
|
6
|
+
CThreadQueue::CThreadQueue(common::IRhoClassFactory* factory) : CRhoThread(factory)
|
|
7
|
+
{
|
|
8
|
+
m_nPollInterval = QUEUE_POLL_INTERVAL_SECONDS;
|
|
9
|
+
m_bNoThreaded = false;
|
|
10
|
+
|
|
11
|
+
m_ptrFactory = factory;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
CThreadQueue::~CThreadQueue(void)
|
|
15
|
+
{
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
void CThreadQueue::addQueueCommand(CQueueCommand* pCmd)
|
|
19
|
+
{
|
|
20
|
+
LOG(INFO) + "addCommand: " + pCmd->toString();
|
|
21
|
+
{
|
|
22
|
+
synchronized(m_mxStackCommands);
|
|
23
|
+
|
|
24
|
+
boolean bExist = false;
|
|
25
|
+
if ( isSkipDuplicateCmd() )
|
|
26
|
+
{
|
|
27
|
+
for ( int i = 0; i < (int)m_stackCommands.size(); i++ )
|
|
28
|
+
{
|
|
29
|
+
if ( m_stackCommands.get(i)->equals(*pCmd) )
|
|
30
|
+
{
|
|
31
|
+
bExist = true;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if ( !bExist )
|
|
38
|
+
m_stackCommands.add(pCmd);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if ( isNoThreadedMode() )
|
|
42
|
+
processCommands();
|
|
43
|
+
else
|
|
44
|
+
stopWait();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
void CThreadQueue::run()
|
|
48
|
+
{
|
|
49
|
+
LOG(INFO) + "Starting main routine...";
|
|
50
|
+
|
|
51
|
+
int nLastPollInterval = getLastPollInterval();
|
|
52
|
+
while( !isStopped() )
|
|
53
|
+
{
|
|
54
|
+
unsigned int nWait = m_nPollInterval > 0 ? m_nPollInterval : QUEUE_POLL_INTERVAL_INFINITE;
|
|
55
|
+
|
|
56
|
+
if ( m_nPollInterval > 0 && nLastPollInterval > 0 )
|
|
57
|
+
{
|
|
58
|
+
int nWait2 = m_nPollInterval - nLastPollInterval;
|
|
59
|
+
if ( nWait2 <= 0 )
|
|
60
|
+
nWait = QUEUE_STARTUP_INTERVAL_SECONDS;
|
|
61
|
+
else
|
|
62
|
+
nWait = nWait2;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if ( nWait >= 0 && !isStopped() && isNoCommands() )
|
|
66
|
+
{
|
|
67
|
+
LOG(INFO) + "ThreadQueue blocked for " + nWait + " seconds...";
|
|
68
|
+
wait(nWait);
|
|
69
|
+
}
|
|
70
|
+
nLastPollInterval = 0;
|
|
71
|
+
|
|
72
|
+
if ( !isStopped() )
|
|
73
|
+
processCommands();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
boolean CThreadQueue::isNoCommands()
|
|
78
|
+
{
|
|
79
|
+
boolean bEmpty = false;
|
|
80
|
+
synchronized(m_mxStackCommands)
|
|
81
|
+
{
|
|
82
|
+
bEmpty = m_stackCommands.isEmpty();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return bEmpty;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
void CThreadQueue::processCommands()//throws Exception
|
|
89
|
+
{
|
|
90
|
+
while(!isStopped() && !isNoCommands())
|
|
91
|
+
{
|
|
92
|
+
common::CAutoPtr<CQueueCommand> pCmd = null;
|
|
93
|
+
{
|
|
94
|
+
synchronized(m_mxStackCommands);
|
|
95
|
+
pCmd = (CQueueCommand*)m_stackCommands.removeFirst();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
processCommand(pCmd);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void CThreadQueue::setPollInterval(int nInterval)
|
|
103
|
+
{
|
|
104
|
+
m_nPollInterval = nInterval;
|
|
105
|
+
stopWait();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#ifdef __cplusplus
|
|
4
|
+
|
|
5
|
+
#include "logging/RhoLog.h"
|
|
6
|
+
#include "common/RhoThread.h"
|
|
7
|
+
#include "common/RhoMutexLock.h"
|
|
8
|
+
#include "common/IRhoClassFactory.h"
|
|
9
|
+
|
|
10
|
+
namespace rho {
|
|
11
|
+
namespace common {
|
|
12
|
+
|
|
13
|
+
class CThreadQueue : public common::CRhoThread
|
|
14
|
+
{
|
|
15
|
+
protected:
|
|
16
|
+
static const unsigned int QUEUE_POLL_INTERVAL_SECONDS = 300;
|
|
17
|
+
static const unsigned int QUEUE_POLL_INTERVAL_INFINITE = (unsigned int)(-1);
|
|
18
|
+
static const unsigned int QUEUE_STARTUP_INTERVAL_SECONDS = 10;
|
|
19
|
+
|
|
20
|
+
public:
|
|
21
|
+
DEFINE_BASELOGCLASS
|
|
22
|
+
|
|
23
|
+
struct CQueueCommand
|
|
24
|
+
{
|
|
25
|
+
virtual ~CQueueCommand(){};
|
|
26
|
+
virtual boolean equals(const CQueueCommand& cmd) = 0;
|
|
27
|
+
virtual String toString() = 0;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
private:
|
|
31
|
+
|
|
32
|
+
common::CAutoPtr<common::IRhoClassFactory> m_ptrFactory;
|
|
33
|
+
int m_nPollInterval;
|
|
34
|
+
common::CMutex m_mxStackCommands;
|
|
35
|
+
LinkedListPtr<CQueueCommand*> m_stackCommands;
|
|
36
|
+
|
|
37
|
+
boolean m_bNoThreaded;
|
|
38
|
+
public:
|
|
39
|
+
CThreadQueue(common::IRhoClassFactory* factory);
|
|
40
|
+
|
|
41
|
+
~CThreadQueue(void);
|
|
42
|
+
|
|
43
|
+
virtual void addQueueCommand(CQueueCommand* pCmd);
|
|
44
|
+
virtual void run();
|
|
45
|
+
|
|
46
|
+
void setPollInterval(int nInterval);
|
|
47
|
+
int getPollInterval()const{ return m_nPollInterval;}
|
|
48
|
+
|
|
49
|
+
boolean isNoThreadedMode(){ return m_bNoThreaded; }
|
|
50
|
+
void setNonThreadedMode(bool b){m_bNoThreaded = b;}
|
|
51
|
+
|
|
52
|
+
common::IRhoClassFactory* getFactory(){ return m_ptrFactory; }
|
|
53
|
+
protected:
|
|
54
|
+
virtual int getLastPollInterval(){ return 0;}
|
|
55
|
+
virtual void processCommand(CQueueCommand* pCmd) = 0;
|
|
56
|
+
virtual boolean isSkipDuplicateCmd() { return false; }
|
|
57
|
+
|
|
58
|
+
virtual void processCommands();
|
|
59
|
+
|
|
60
|
+
boolean isNoCommands();
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
#endif //__cplusplus
|
|
66
|
+
|
|
67
|
+
#ifdef __cplusplus
|
|
68
|
+
extern "C" {
|
|
69
|
+
#endif //__cplusplus
|
|
70
|
+
|
|
71
|
+
#ifdef __cplusplus
|
|
72
|
+
};
|
|
73
|
+
#endif //__cplusplus
|
|
74
|
+
|
|
75
|
+
|
|
@@ -25,4 +25,8 @@ extern rho::LogCategory __rhoCurrentCategory;
|
|
|
25
25
|
#define IMPLEMENT_LOGCLASS(classname, name) \
|
|
26
26
|
rho::LogCategory classname::__rhoCurrentCategory = name
|
|
27
27
|
|
|
28
|
+
#define DEFINE_BASELOGCLASS rho::LogCategory __rhoCurrentCategory;\
|
|
29
|
+
rho::LogCategory getLogCategory(){return __rhoCurrentCategory;}\
|
|
30
|
+
void setLogCategory(const rho::LogCategory& cat){__rhoCurrentCategory = cat;}
|
|
31
|
+
|
|
28
32
|
#endif //_RHOLOGCAT_H_
|
|
@@ -11,79 +11,52 @@ namespace net
|
|
|
11
11
|
{
|
|
12
12
|
|
|
13
13
|
IMPLEMENT_LOGCLASS(CAsyncHttp, "AsyncHttp");
|
|
14
|
-
|
|
15
|
-
VectorPtr<CAsyncHttp*> CAsyncHttp::m_arInstances;
|
|
14
|
+
CAsyncHttp* CAsyncHttp::m_pInstance = 0;
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
/*static*/ CAsyncHttp* CAsyncHttp::Create()
|
|
18
17
|
{
|
|
19
|
-
(
|
|
18
|
+
if ( m_pInstance )
|
|
19
|
+
return m_pInstance;
|
|
20
|
+
|
|
21
|
+
m_pInstance = new CAsyncHttp( rho::common::createClassFactory());
|
|
22
|
+
return m_pInstance;
|
|
20
23
|
}
|
|
21
24
|
|
|
22
|
-
CAsyncHttp::
|
|
23
|
-
const char* url, unsigned long headers, const char* body,
|
|
24
|
-
const char* file_path,
|
|
25
|
-
const char* callback, const char* callback_params, boolean ssl_verify_peer) : CRhoThread(factory)
|
|
25
|
+
/*static*/void CAsyncHttp::Destroy()
|
|
26
26
|
{
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
m_strUrl = url != null ? url : "";
|
|
30
|
-
m_strBody = body != null ? body : "";
|
|
31
|
-
m_strFilePath = file_path != null ? file_path : "";
|
|
32
|
-
m_strCallback = callback != null ? callback : "";
|
|
33
|
-
m_strCallbackParams = callback_params != null ? callback_params : "";
|
|
34
|
-
m_eCmd = eCmd;
|
|
35
|
-
m_sslVerifyPeer = ssl_verify_peer;
|
|
36
|
-
|
|
37
|
-
rho_ruby_enum_strhash(headers, &header_iter, &m_mapHeaders);
|
|
38
|
-
|
|
39
|
-
addNewObject(this);
|
|
27
|
+
if ( m_pInstance )
|
|
28
|
+
delete m_pInstance;
|
|
40
29
|
|
|
41
|
-
|
|
42
|
-
run();
|
|
43
|
-
else
|
|
44
|
-
start(epLow);
|
|
30
|
+
m_pInstance = 0;
|
|
45
31
|
}
|
|
46
32
|
|
|
47
|
-
|
|
33
|
+
CAsyncHttp::CAsyncHttp(common::IRhoClassFactory* factory) : CThreadQueue(factory)
|
|
48
34
|
{
|
|
49
|
-
|
|
50
|
-
synchronized(m_mxRequest)
|
|
35
|
+
CThreadQueue::setLogCategory(getLogCategory());
|
|
51
36
|
|
|
52
|
-
|
|
53
|
-
m_pNetRequest->cancel();
|
|
54
|
-
}
|
|
37
|
+
setPollInterval(QUEUE_POLL_INTERVAL_INFINITE);
|
|
55
38
|
|
|
56
|
-
|
|
57
|
-
stop(-1);
|
|
39
|
+
m_pCurCmd = null;
|
|
58
40
|
}
|
|
59
41
|
|
|
60
|
-
|
|
42
|
+
CAsyncHttp::~CAsyncHttp(void)
|
|
61
43
|
{
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
{
|
|
66
|
-
int nToDelete = -1;
|
|
67
|
-
for (int i = 0; i < (int)m_arInstances.size(); i++ )
|
|
68
|
-
{
|
|
69
|
-
if ( m_arInstances.elementAt(i)->m_bFinished )
|
|
70
|
-
{
|
|
71
|
-
nToDelete = i;
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (nToDelete==-1)
|
|
77
|
-
break;
|
|
78
|
-
|
|
79
|
-
m_arInstances.removeElementAt(nToDelete);
|
|
80
|
-
}
|
|
44
|
+
cancelRequest("*", true);
|
|
45
|
+
LOG(INFO) + "Thread shutdown";
|
|
46
|
+
}
|
|
81
47
|
|
|
82
|
-
|
|
48
|
+
void CAsyncHttp::addQueueCommand(CQueueCommand* pCmd)
|
|
49
|
+
{
|
|
50
|
+
if ( ((CHttpCommand*)pCmd)->m_strCallback.length()==0)
|
|
51
|
+
processCommand(pCmd);
|
|
52
|
+
else
|
|
53
|
+
{
|
|
54
|
+
CThreadQueue::addQueueCommand(pCmd);
|
|
55
|
+
start(epLow);
|
|
83
56
|
}
|
|
84
57
|
}
|
|
85
58
|
|
|
86
|
-
|
|
59
|
+
void CAsyncHttp::cancelRequest(const char* szCallback, boolean bWait)
|
|
87
60
|
{
|
|
88
61
|
if (!szCallback || !*szCallback )
|
|
89
62
|
{
|
|
@@ -91,44 +64,68 @@ void CAsyncHttp::cancel(boolean bWait)
|
|
|
91
64
|
return;
|
|
92
65
|
}
|
|
93
66
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
{
|
|
102
|
-
for (int i = 0; i < (int)m_arInstances.size(); i++ )
|
|
103
|
-
{
|
|
104
|
-
if ( m_arInstances.elementAt(i)->m_strCallback.compare(szCallback) == 0 )
|
|
105
|
-
m_arInstances.elementAt(i)->cancel(bWait);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
67
|
+
if ( m_pCurCmd != null )
|
|
68
|
+
m_pCurCmd->cancel();
|
|
69
|
+
|
|
70
|
+
if ( bWait )
|
|
71
|
+
stop(-1);
|
|
72
|
+
|
|
73
|
+
//TODO: find command by callback and cancel it if current, remove if it is still in queue
|
|
109
74
|
}
|
|
110
75
|
|
|
111
|
-
void CAsyncHttp::
|
|
76
|
+
void CAsyncHttp::processCommand(CQueueCommand* pCmd)
|
|
112
77
|
{
|
|
113
|
-
|
|
78
|
+
m_pCurCmd = (CHttpCommand*)pCmd;
|
|
79
|
+
m_pCurCmd->execute();
|
|
80
|
+
m_pCurCmd = null;
|
|
81
|
+
}
|
|
114
82
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
83
|
+
extern "C" void header_iter(const char* szName, const char* szValue, void* pHash)
|
|
84
|
+
{
|
|
85
|
+
((Hashtable<String,String>*)pHash)->put(szName, szValue);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
CAsyncHttp::CHttpCommand::CHttpCommand(
|
|
89
|
+
EHttpCommands eCmd,
|
|
90
|
+
const char* url, unsigned long headers, const char* body,
|
|
91
|
+
const char* file_path,
|
|
92
|
+
const char* callback, const char* callback_params, boolean ssl_verify_peer)
|
|
93
|
+
{
|
|
94
|
+
m_strUrl = url != null ? url : "";
|
|
95
|
+
m_strBody = body != null ? body : "";
|
|
96
|
+
m_strFilePath = file_path != null ? file_path : "";
|
|
97
|
+
m_strCallback = callback != null ? callback : "";
|
|
98
|
+
m_strCallbackParams = callback_params != null ? callback_params : "";
|
|
99
|
+
m_eCmd = eCmd;
|
|
100
|
+
m_sslVerifyPeer = ssl_verify_peer;
|
|
101
|
+
|
|
102
|
+
rho_ruby_enum_strhash(headers, &header_iter, &m_mapHeaders);
|
|
120
103
|
|
|
104
|
+
m_pNetRequest = CAsyncHttp::getInstance()->getFactory()->createNetRequest();
|
|
105
|
+
m_pNetRequest->sslVerifyPeer(m_sslVerifyPeer);
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
void CAsyncHttp::CHttpCommand::cancel()
|
|
110
|
+
{
|
|
111
|
+
if (m_pNetRequest!=null && !m_pNetRequest->isCancelled() )
|
|
112
|
+
m_pNetRequest->cancel();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
void CAsyncHttp::CHttpCommand::execute()
|
|
116
|
+
{
|
|
117
|
+
INetResponse* resp = null;
|
|
121
118
|
switch( m_eCmd )
|
|
122
119
|
{
|
|
123
120
|
case hcGet:
|
|
124
|
-
|
|
121
|
+
resp = m_pNetRequest->doRequest("GET", m_strUrl, m_strBody, null, &m_mapHeaders);
|
|
125
122
|
break;
|
|
126
123
|
case hcPost:
|
|
127
|
-
|
|
124
|
+
resp = m_pNetRequest->doRequest("POST", m_strUrl, m_strBody, null, &m_mapHeaders);
|
|
128
125
|
break;
|
|
129
126
|
|
|
130
127
|
case hcDownload:
|
|
131
|
-
|
|
128
|
+
resp = m_pNetRequest->pullFile(m_strUrl, m_strFilePath, null, &m_mapHeaders);
|
|
132
129
|
break;
|
|
133
130
|
|
|
134
131
|
case hcUpload:
|
|
@@ -148,23 +145,24 @@ void CAsyncHttp::run()
|
|
|
148
145
|
arMultipartItems.addElement(pItem);
|
|
149
146
|
}
|
|
150
147
|
|
|
151
|
-
|
|
148
|
+
resp = m_pNetRequest->pushMultipartData( m_strUrl, arMultipartItems, null, &m_mapHeaders );
|
|
152
149
|
break;
|
|
153
150
|
}
|
|
154
151
|
}
|
|
155
152
|
|
|
156
153
|
if ( !m_pNetRequest->isCancelled())
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
callNotify(*m_pNetResponse,0);
|
|
160
|
-
}
|
|
154
|
+
callNotify(resp,0);
|
|
155
|
+
}
|
|
161
156
|
|
|
162
|
-
|
|
157
|
+
unsigned long CAsyncHttp::CHttpCommand::getRetValue()
|
|
158
|
+
{
|
|
159
|
+
if ( m_strCallback.length() == 0 )
|
|
160
|
+
return rho_ruby_create_string(m_strResBody.c_str());
|
|
163
161
|
|
|
164
|
-
|
|
162
|
+
return rho_ruby_get_NIL();
|
|
165
163
|
}
|
|
166
164
|
|
|
167
|
-
String CAsyncHttp::makeHeadersString()
|
|
165
|
+
String CAsyncHttp::CHttpCommand::makeHeadersString()
|
|
168
166
|
{
|
|
169
167
|
String strRes = "";
|
|
170
168
|
|
|
@@ -182,39 +180,10 @@ String CAsyncHttp::makeHeadersString()
|
|
|
182
180
|
return strRes;
|
|
183
181
|
}
|
|
184
182
|
|
|
185
|
-
|
|
186
|
-
unsigned long CAsyncHttp::getObjectValue()
|
|
187
|
-
{
|
|
188
|
-
rho::net::INetResponse& resp = *m_pNetResponse;
|
|
189
|
-
if (resp.isOK())
|
|
190
|
-
{
|
|
191
|
-
String strContType = m_mapHeaders.get("content-type");
|
|
192
|
-
if ( strContType.find("application/json") != String::npos )
|
|
193
|
-
{
|
|
194
|
-
char* szError = 0;
|
|
195
|
-
unsigned long valBody = rjson_tokener_parse(resp.getCharData(), &szError);
|
|
196
|
-
if ( valBody != 0 )
|
|
197
|
-
return valBody;
|
|
198
|
-
|
|
199
|
-
LOG(ERROR) + "Incorrect json body.Error:" + (szError ? szError : "");
|
|
200
|
-
if ( szError )
|
|
201
|
-
free(szError);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
return rho_ruby_create_string(resp.getCharData());
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
unsigned long CAsyncHttp::getRetValue()
|
|
183
|
+
void CAsyncHttp::CHttpCommand::callNotify(rho::net::INetResponse* pResp, int nError )
|
|
209
184
|
{
|
|
210
|
-
|
|
211
|
-
return rho_ruby_create_string(m_strResBody.c_str());
|
|
185
|
+
rho::net::INetResponse& resp = *pResp;
|
|
212
186
|
|
|
213
|
-
return rho_ruby_get_NIL();
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
void CAsyncHttp::callNotify(rho::net::INetResponse& resp, int nError )
|
|
217
|
-
{
|
|
218
187
|
m_strResBody = "rho_callback=1";
|
|
219
188
|
m_strResBody += "&status=";
|
|
220
189
|
if ( nError > 0 )
|
|
@@ -240,7 +209,8 @@ void CAsyncHttp::callNotify(rho::net::INetResponse& resp, int nError )
|
|
|
240
209
|
if (strHeaders.length() > 0 )
|
|
241
210
|
m_strResBody += "&" + strHeaders;
|
|
242
211
|
|
|
243
|
-
m_strResBody += "&" + RHODESAPP().addCallbackObject(
|
|
212
|
+
m_strResBody += "&" + RHODESAPP().addCallbackObject(
|
|
213
|
+
new CAsyncHttpResponse(pResp, m_mapHeaders.get("content-type")), "body");
|
|
244
214
|
}
|
|
245
215
|
|
|
246
216
|
if ( m_strCallbackParams.length() > 0 )
|
|
@@ -248,12 +218,33 @@ void CAsyncHttp::callNotify(rho::net::INetResponse& resp, int nError )
|
|
|
248
218
|
|
|
249
219
|
if ( m_strCallback.length() > 0 )
|
|
250
220
|
{
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
221
|
+
String strFullUrl = m_pNetRequest->resolveUrl(m_strCallback);
|
|
222
|
+
m_pNetRequest->pushData( strFullUrl, m_strResBody, null );
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
CAsyncHttp::CAsyncHttpResponse::~CAsyncHttpResponse(){}
|
|
227
|
+
|
|
228
|
+
extern "C" VALUE rjson_tokener_parse(const char *str, char** pszError );
|
|
229
|
+
unsigned long CAsyncHttp::CAsyncHttpResponse::getObjectValue()
|
|
230
|
+
{
|
|
231
|
+
rho::net::INetResponse& resp = *m_pNetResponse;
|
|
232
|
+
if (resp.isOK())
|
|
233
|
+
{
|
|
234
|
+
if ( m_strContentType.find("application/json") != String::npos )
|
|
235
|
+
{
|
|
236
|
+
char* szError = 0;
|
|
237
|
+
unsigned long valBody = rjson_tokener_parse(resp.getCharData(), &szError);
|
|
238
|
+
if ( valBody != 0 )
|
|
239
|
+
return valBody;
|
|
240
|
+
|
|
241
|
+
LOG(ERROR) + "Incorrect json body.Error:" + (szError ? szError : "");
|
|
242
|
+
if ( szError )
|
|
243
|
+
free(szError);
|
|
244
|
+
}
|
|
256
245
|
}
|
|
246
|
+
|
|
247
|
+
return rho_ruby_create_string(resp.getCharData());
|
|
257
248
|
}
|
|
258
249
|
|
|
259
250
|
} // namespace net
|
|
@@ -265,36 +256,44 @@ using namespace rho::net;
|
|
|
265
256
|
|
|
266
257
|
unsigned long rho_asynchttp_get(const char* url, unsigned long headers, const char* callback, const char* callback_params, int ssl_verify_peer)
|
|
267
258
|
{
|
|
268
|
-
CAsyncHttp
|
|
259
|
+
CAsyncHttp::Create();
|
|
260
|
+
|
|
261
|
+
CAsyncHttp::CHttpCommand* pHttp = new CAsyncHttp::CHttpCommand(CAsyncHttp::hcGet, url, headers, null, null, callback, callback_params, ssl_verify_peer!=0 );
|
|
262
|
+
CAsyncHttp::getInstance()->addQueueCommand(pHttp);
|
|
269
263
|
return pHttp->getRetValue();
|
|
270
264
|
}
|
|
271
265
|
|
|
272
266
|
unsigned long rho_asynchttp_post(const char* url, unsigned long headers, const char* body, const char* callback, const char* callback_params, int ssl_verify_peer)
|
|
273
267
|
{
|
|
274
|
-
CAsyncHttp
|
|
268
|
+
CAsyncHttp::Create();
|
|
269
|
+
|
|
270
|
+
CAsyncHttp::CHttpCommand* pHttp = new CAsyncHttp::CHttpCommand(CAsyncHttp::hcPost, url, headers, body!=null?body:"", null, callback, callback_params, ssl_verify_peer!=0 );
|
|
271
|
+
CAsyncHttp::getInstance()->addQueueCommand(pHttp);
|
|
275
272
|
return pHttp->getRetValue();
|
|
276
273
|
}
|
|
277
274
|
|
|
278
275
|
unsigned long rho_asynchttp_downloadfile(const char* url, unsigned long headers, const char* file_path, const char* callback, const char* callback_params, int ssl_verify_peer)
|
|
279
276
|
{
|
|
280
|
-
CAsyncHttp
|
|
277
|
+
CAsyncHttp::Create();
|
|
278
|
+
|
|
279
|
+
CAsyncHttp::CHttpCommand* pHttp = new CAsyncHttp::CHttpCommand(CAsyncHttp::hcDownload, url, headers, "", file_path, callback, callback_params, ssl_verify_peer!=0 );
|
|
280
|
+
CAsyncHttp::getInstance()->addQueueCommand(pHttp);
|
|
281
281
|
return pHttp->getRetValue();
|
|
282
282
|
}
|
|
283
283
|
|
|
284
284
|
unsigned long rho_asynchttp_uploadfile(const char* url, unsigned long headers, const char* body, const char* file_path, const char* callback, const char* callback_params, int ssl_verify_peer)
|
|
285
285
|
{
|
|
286
|
-
CAsyncHttp
|
|
286
|
+
CAsyncHttp::Create();
|
|
287
|
+
|
|
288
|
+
CAsyncHttp::CHttpCommand* pHttp = new CAsyncHttp::CHttpCommand(CAsyncHttp::hcUpload, url, headers, body, file_path, callback, callback_params, ssl_verify_peer!=0 );
|
|
289
|
+
CAsyncHttp::getInstance()->addQueueCommand(pHttp);
|
|
287
290
|
return pHttp->getRetValue();
|
|
288
291
|
}
|
|
289
292
|
|
|
290
293
|
void rho_asynchttp_cancel(const char* cancel_callback)
|
|
291
294
|
{
|
|
292
|
-
CAsyncHttp::
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
void rho_asynchttp_destroy()
|
|
296
|
-
{
|
|
297
|
-
CAsyncHttp::cancelRequest("*", true);
|
|
295
|
+
if ( CAsyncHttp::getInstance() )
|
|
296
|
+
CAsyncHttp::getInstance()->cancelRequest(cancel_callback, false);
|
|
298
297
|
}
|
|
299
298
|
|
|
300
299
|
}
|