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.
Files changed (78) hide show
  1. data/CHANGELOG +20 -1
  2. data/bin/rhodes-setup +6 -2
  3. data/lib/extensions/digest/ext/Rakefile +2 -2
  4. data/lib/framework/rho/render.rb +2 -0
  5. data/lib/framework/rho/rho.rb +159 -95
  6. data/lib/framework/rho/rhoapplication.rb +24 -5
  7. data/lib/framework/rhodes.rb +1 -1
  8. data/lib/framework/rhom/rhom_model.rb +32 -23
  9. data/lib/framework/rhom/rhom_object_factory.rb +2 -2
  10. data/lib/rhodes.rb +1 -1
  11. data/platform/android/Rhodes/jni/src/callbacks.cpp +8 -1
  12. data/platform/android/Rhodes/jni/src/mapview.cpp +4 -1
  13. data/platform/android/Rhodes/jni/src/sslimpl.cpp +5 -1
  14. data/platform/android/Rhodes/jni/src/webview.cpp +3 -1
  15. data/platform/android/Rhodes/src/com/rhomobile/rhodes/NativeBar.java +3 -2
  16. data/platform/android/Rhodes/src/com/rhomobile/rhodes/NativeLibraries.java +2 -2
  17. data/platform/android/Rhodes/src/com/rhomobile/rhodes/NavBar.java +1 -2
  18. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +1 -1
  19. data/platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocation.java +3 -1
  20. data/platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocationImpl.java +0 -1
  21. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/MainView.java +4 -1
  22. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +24 -6
  23. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +7 -2
  24. data/platform/android/build/android.rake +11 -38
  25. data/platform/android/build/androidcommon.rb +50 -2
  26. data/platform/android/build/librhocommon_build.files +1 -0
  27. data/platform/android/build/libsqlite_build.files +1 -0
  28. data/platform/bb/rhodes/platform/5.0/com/rho/BrowserAdapter5.java +2 -1
  29. data/platform/bb/rhodes/src/com/rho/BrowserAdapter.java +1 -5
  30. data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +3 -6
  31. data/platform/bb/rhodes/src/com/rho/rubyext/System.java +4 -2
  32. data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +12 -35
  33. data/platform/bb/rhodes/src/rhomobile/Utilities.java +2 -1
  34. data/platform/iphone/Classes/DateTimePickerDelegate.m +4 -4
  35. data/platform/iphone/Classes/NativeBar.m +12 -6
  36. data/platform/iphone/Classes/NavBar.m +1 -1
  37. data/platform/iphone/Classes/RhoMainView.h +4 -1
  38. data/platform/iphone/Classes/Rhodes.h +6 -2
  39. data/platform/iphone/Classes/Rhodes.m +23 -3
  40. data/platform/iphone/Classes/SimpleMainView.h +3 -7
  41. data/platform/iphone/Classes/SimpleMainView.m +108 -54
  42. data/platform/iphone/Classes/TabbedMainView.h +3 -2
  43. data/platform/iphone/Classes/TabbedMainView.m +21 -10
  44. data/platform/iphone/RhoLib/RhoLib.xcodeproj/project.pbxproj +8 -0
  45. data/platform/shared/common/IRhoClassFactory.h +1 -0
  46. data/platform/shared/common/RhodesApp.cpp +7 -2
  47. data/platform/shared/common/ThreadQueue.cpp +110 -0
  48. data/platform/shared/common/ThreadQueue.h +75 -0
  49. data/platform/shared/logging/RhoLogCat.h +4 -0
  50. data/platform/shared/net/AsyncHttp.cpp +134 -135
  51. data/platform/shared/net/AsyncHttp.h +74 -33
  52. data/platform/shared/net/HttpServer.cpp +7 -1
  53. data/platform/shared/ruby/thread.c +4 -0
  54. data/platform/shared/ruby/thread_win32.c +9 -8
  55. data/platform/shared/rubyJVM/src/com/rho/RhodesApp.java +26 -5
  56. data/platform/shared/rubyJVM/src/com/rho/net/INetworkAccess.java +0 -2
  57. data/platform/shared/rubyJVM/src/com/rho/net/NetRequest.java +4 -13
  58. data/platform/shared/rubyJVM/src/com/rho/net/URI.java +2 -2
  59. data/platform/shared/rubyJVM/src/com/rho/sync/SyncEngine.java +3 -3
  60. data/platform/shared/rubyJVM/src/com/xruby/runtime/builtin/ObjectFactory.java +12 -2
  61. data/platform/shared/rubyJVM/src/com/xruby/runtime/builtin/RubyString.java +6 -3
  62. data/platform/shared/rubyJVM/src/javolution/util/FastTable.java +12 -2
  63. data/platform/shared/sync/SyncEngine.cpp +15 -3
  64. data/platform/shared/sync/SyncEngine.h +1 -1
  65. data/platform/shared/sync/SyncThread.cpp +18 -101
  66. data/platform/shared/sync/SyncThread.h +30 -22
  67. data/platform/wm/RhoLib/RhoLib.vcproj +8 -0
  68. data/platform/wm/rhodes/Rhodes.cpp +143 -1
  69. data/platform/wm/rhodes/memory_helper.cpp +273 -0
  70. data/platform/wm/rhodes/rho/common/RhoThreadImpl.cpp +1 -0
  71. data/platform/wm/rhodes/rho/net/NetRequestImpl.cpp +46 -3
  72. data/platform/wm/rhodes/rho/rubyext/WebView.cpp +29 -1
  73. data/res/build-tools/db/syncdb.schema +1 -0
  74. data/res/generators/rhogen.rb +1 -1
  75. data/rhodes.gemspec +2 -2
  76. metadata +23 -6
  77. data/Manifest.txt +0 -5289
  78. data/rhobuild.yml +0 -37
@@ -361,10 +361,10 @@ void CSyncEngine::processServerSources(String strSources)
361
361
  {
362
362
  if ( strSources.length() > 0 )
363
363
  {
364
- NetResponse(resp,getNet().pushData( getNet().resolveUrl("/system/loadserversources"), strSources, null ));
364
+ /*NetResponse(resp,getNet().pushData( getNet().resolveUrl("/system/loadserversources"), strSources, null ));
365
365
  loadAllSources();
366
366
 
367
- rho_db_init_attr_manager();
367
+ rho_db_init_attr_manager(); */
368
368
  }
369
369
  }
370
370
 
@@ -377,6 +377,7 @@ boolean CSyncEngine::resetClientIDByNet(const String& strClientID)//throws Excep
377
377
 
378
378
  NetResponse( resp, getNet().pullData(getProtocol().getClientResetUrl(strClientID), this) );
379
379
 
380
+
380
381
  /* processServerSources("{\"server_sources\":[{\"name\":\"Product\",\"partition\":\"application\",\"source_id\":\"2\",\"sync_priority\":\"0\","
381
382
  "\"schema_version\":\"7.0\",\"schema\":{"
382
383
  "\"columns\":[\'brand\',\'created_at\',\'name\',\'price\',\'quantity\',\'sku\',\'updated_at\']"*/
@@ -428,7 +429,7 @@ String CSyncEngine::requestClientIDByNet()
428
429
 
429
430
  CJSONEntry oJsonEntry(szData);
430
431
 
431
- if (oJsonEntry.hasName("server_sources") )
432
+ if (oJsonEntry.hasName("sources") )
432
433
  processServerSources(szData);
433
434
 
434
435
  CJSONEntry oJsonObject = oJsonEntry.getEntry("client");
@@ -623,6 +624,17 @@ void CSyncEngine::syncAllSources()
623
624
 
624
625
  void CSyncEngine::login(String name, String password, String callback)
625
626
  {
627
+ /*
628
+ processServerSources(
629
+ "{\"sources\":[{ \"name\":\"ProductEx\", "
630
+ "\"sync_type\":\"incremental\", \"partition\":\"application\", \"source_id\":\"7\","
631
+ " \"sync_priority\":\"0\", \"model_type\":\"fixed_schema\", "
632
+ " \"schema\":{\"property\":{\"brand\":\"string\", \"price\":\"string\", \"quantity\":\"string\", \"name\":\"string\", "
633
+ " \"image_url\":\"blob\", \"image_url_ex\":{\"blob\":\"1\", \"server_overwrite\":\"1\"}}, "
634
+ " \"index\":[{\"by_brand_price1\":[\"brand\", \"price\"]}, {\"by_quantity1\":[\"quantity\"]}], \"unique_index\":[{\"by_name1\":[\"name\"]}]}, "
635
+ " \"belongs_to\":{\"brand\":\"Customer\"}, "
636
+ " \"schema_version\":\"1.0\"}]}");
637
+ */
626
638
  PROF_START("Login");
627
639
  //try {
628
640
 
@@ -69,7 +69,7 @@ public:
69
69
  ESyncState getState()const{ return m_syncState; }
70
70
  boolean isContinueSync()const{ return m_syncState != esExit && m_syncState != esStop; }
71
71
  boolean isSyncing()const{ return m_syncState == esSyncAllSources || m_syncState == esSyncSource; }
72
- void stopSync(){ if (isContinueSync()){ setState(esStop); m_NetRequest->cancel();} }
72
+ void stopSync(){ if (isContinueSync()){ setState(esStop); if(m_NetRequest) m_NetRequest->cancel();} }
73
73
  void stopSyncByUser(){ m_bStopByUser = true; stopSync(); }
74
74
  void exitSync(){ setState(esExit); m_NetRequest->cancel(); }
75
75
  boolean isStoppedByUser(){ return m_bStopByUser; }
@@ -31,13 +31,12 @@ CSyncThread* CSyncThread::m_pInstance = 0;
31
31
  m_pInstance = 0;
32
32
  }
33
33
 
34
- CSyncThread::CSyncThread(common::IRhoClassFactory* factory) : CRhoThread(factory)
34
+ CSyncThread::CSyncThread(common::IRhoClassFactory* factory) : CThreadQueue(factory)
35
35
  {
36
- m_nPollInterval = SYNC_POLL_INTERVAL_SECONDS;
37
- if( RHOCONF().isExist("sync_poll_interval") )
38
- m_nPollInterval = RHOCONF().getInt("sync_poll_interval");
36
+ CThreadQueue::setLogCategory(getLogCategory());
39
37
 
40
- m_ptrFactory = factory;
38
+ if( RHOCONF().isExist("sync_poll_interval") )
39
+ setPollInterval(RHOCONF().getInt("sync_poll_interval"));
41
40
 
42
41
  m_oSyncEngine.setFactory(factory);
43
42
 
@@ -55,36 +54,7 @@ CSyncThread::~CSyncThread(void)
55
54
  LOG(INFO) + "Sync engine thread shutdown";
56
55
  }
57
56
 
58
- void CSyncThread::addSyncCommand(CSyncCommand* pSyncCmd)
59
- {
60
- if ( RHOCONF().getString("syncserver").length() == 0 )
61
- return;
62
-
63
- LOG(INFO) + "addSyncCommand: " + (*pSyncCmd).m_nCmdCode;
64
- {
65
- synchronized(m_mxStackCommands);
66
-
67
- boolean bExist = false;
68
- for ( int i = 0; i < (int)m_stackCommands.size(); i++ )
69
- {
70
- if ( m_stackCommands.get(i)->equals(*pSyncCmd) )
71
- {
72
- bExist = true;
73
- break;
74
- }
75
- }
76
-
77
- if ( !bExist )
78
- m_stackCommands.add(pSyncCmd);
79
- }
80
-
81
- if ( getSyncEngine().isNoThreadedMode() )
82
- processCommands();
83
- else
84
- stopWait();
85
- }
86
-
87
- int CSyncThread::getLastSyncInterval()
57
+ int CSyncThread::getLastPollInterval()
88
58
  {
89
59
  uint64 nowTime = CLocalTime().toULong();
90
60
 
@@ -100,63 +70,12 @@ int CSyncThread::getLastSyncInterval()
100
70
  return latestTimeUpdated > 0 ? (int)(nowTime-latestTimeUpdated) : 0;
101
71
  }
102
72
 
103
- void CSyncThread::run()
104
- {
105
- LOG(INFO) + "Starting sync engine main routine...";
106
-
107
- int nLastSyncInterval = getLastSyncInterval();
108
- while( m_oSyncEngine.getState() != CSyncEngine::esExit )
109
- {
110
- unsigned int nWait = m_nPollInterval > 0 ? m_nPollInterval : SYNC_POLL_INTERVAL_INFINITE;
111
-
112
- if ( m_nPollInterval > 0 && nLastSyncInterval > 0 )
113
- {
114
- int nWait2 = m_nPollInterval - nLastSyncInterval;
115
- if ( nWait2 <= 0 )
116
- nWait = SYNC_STARTUP_INTERVAL_SECONDS;
117
- else
118
- nWait = nWait2;
119
- }
120
-
121
- if ( nWait >= 0 && m_oSyncEngine.getState() != CSyncEngine::esExit &&
122
- isNoCommands() )
123
- {
124
- LOG(INFO) + "Sync engine blocked for " + nWait + " seconds...";
125
- wait(nWait);
126
- }
127
- nLastSyncInterval = 0;
128
-
129
- if ( m_oSyncEngine.getState() != CSyncEngine::esExit )
130
- processCommands();
131
- }
132
- }
133
-
134
- boolean CSyncThread::isNoCommands()
135
- {
136
- boolean bEmpty = false;
137
- synchronized(m_mxStackCommands)
138
- {
139
- bEmpty = m_stackCommands.isEmpty();
140
- }
141
-
142
- return bEmpty;
143
- }
144
-
145
73
  void CSyncThread::processCommands()//throws Exception
146
74
  {
147
75
  if ( isNoCommands() )
148
- addSyncCommand(new CSyncCommand(scNone,false));
76
+ addQueueCommand(new CSyncCommand(scNone,false));
149
77
 
150
- while(!isNoCommands())
151
- {
152
- common::CAutoPtr<CSyncCommand> pSyncCmd = null;
153
- {
154
- synchronized(m_mxStackCommands);
155
- pSyncCmd = (CSyncCommand*)m_stackCommands.removeFirst();
156
- }
157
-
158
- processCommand(*pSyncCmd);
159
- }
78
+ CThreadQueue::processCommands();
160
79
  }
161
80
 
162
81
  void CSyncThread::checkShowStatus(CSyncCommand& oSyncCmd)
@@ -167,12 +86,13 @@ void CSyncThread::checkShowStatus(CSyncCommand& oSyncCmd)
167
86
  //m_statusListener.createStatusPopup(RhoRuby.getMessageText("syncronizing_data"));
168
87
  }
169
88
 
170
- void CSyncThread::processCommand(CSyncCommand& oSyncCmd)
89
+ void CSyncThread::processCommand(CQueueCommand* pCmd)
171
90
  {
91
+ CSyncCommand& oSyncCmd = *((CSyncCommand*)pCmd);
172
92
  switch(oSyncCmd.m_nCmdCode)
173
93
  {
174
94
  case scNone:
175
- if ( m_nPollInterval )
95
+ if ( getPollInterval() )
176
96
  {
177
97
  checkShowStatus(oSyncCmd);
178
98
  m_oSyncEngine.doSyncAllSources();
@@ -182,8 +102,6 @@ void CSyncThread::processCommand(CSyncCommand& oSyncCmd)
182
102
  checkShowStatus(oSyncCmd);
183
103
  m_oSyncEngine.doSyncAllSources();
184
104
  break;
185
- case scChangePollInterval:
186
- break;
187
105
  case scSyncOne:
188
106
  {
189
107
  checkShowStatus(oSyncCmd);
@@ -211,11 +129,10 @@ void CSyncThread::processCommand(CSyncCommand& oSyncCmd)
211
129
 
212
130
  void CSyncThread::setPollInterval(int nInterval)
213
131
  {
214
- m_nPollInterval = nInterval;
215
- if ( m_nPollInterval == 0 )
132
+ if ( nInterval == 0 )
216
133
  m_oSyncEngine.stopSync();
217
134
 
218
- addSyncCommand( new CSyncCommand(scChangePollInterval,false) );
135
+ CThreadQueue::setPollInterval(nInterval);
219
136
  }
220
137
 
221
138
  };
@@ -232,14 +149,14 @@ void rho_sync_destroy()
232
149
 
233
150
  void rho_sync_doSyncAllSources(int show_status_popup)
234
151
  {
235
- CSyncThread::getInstance()->addSyncCommand(new CSyncThread::CSyncCommand(CSyncThread::scSyncAll,show_status_popup!=0));
152
+ CSyncThread::getInstance()->addQueueCommand(new CSyncThread::CSyncCommand(CSyncThread::scSyncAll,show_status_popup!=0));
236
153
  //rho_sync_doSyncSourceByUrl("http://dev.rhosync.rhohub.com/apps/SugarCRM/sources/SugarAccounts");
237
154
  }
238
155
 
239
156
  void rho_sync_doSyncSource(unsigned long nSrcID,int show_status_popup)
240
157
  {
241
158
  CRhoRubyStringOrInt oSrcID = rho_ruby_getstringorint(nSrcID);
242
- CSyncThread::getInstance()->addSyncCommand(new CSyncThread::CSyncCommand(CSyncThread::scSyncOne, oSrcID.m_szStr, (int)oSrcID.m_nInt, show_status_popup!=0 ) );
159
+ CSyncThread::getInstance()->addQueueCommand(new CSyncThread::CSyncCommand(CSyncThread::scSyncOne, oSrcID.m_szStr, (int)oSrcID.m_nInt, show_status_popup!=0 ) );
243
160
  }
244
161
 
245
162
  void rho_sync_stop()
@@ -271,7 +188,7 @@ void rho_sync_doSearch(unsigned long ar_sources, const char *from, const char *p
271
188
  rho::Vector<rho::String> arSources;
272
189
  rho_ruby_enum_strary(ar_sources, source_iter, &arSources);
273
190
 
274
- CSyncThread::getInstance()->addSyncCommand(new CSyncThread::CSyncSearchCommand(from,params,arSources,sync_changes,nProgressStep) );
191
+ CSyncThread::getInstance()->addQueueCommand(new CSyncThread::CSyncSearchCommand(from,params,arSources,sync_changes,nProgressStep) );
275
192
  }
276
193
 
277
194
  void rho_sync_doSyncSourceByUrl(const char* szSrcUrl)
@@ -289,7 +206,7 @@ void rho_sync_doSyncSourceByUrl(const char* szSrcUrl)
289
206
  strName = szLastSlash ? szLastSlash + 1 : szSrcUrl;
290
207
 
291
208
  //TODO: save query params
292
- CSyncThread::getInstance()->addSyncCommand(new CSyncThread::CSyncCommand(CSyncThread::scSyncOne, strName, (int)0, false ) );
209
+ CSyncThread::getInstance()->addQueueCommand(new CSyncThread::CSyncCommand(CSyncThread::scSyncOne, strName, (int)0, false ) );
293
210
  }
294
211
 
295
212
  void rho_sync_set_pollinterval(int nInterval)
@@ -306,13 +223,13 @@ void rho_sync_set_syncserver(char* syncserver)
306
223
  if ( syncserver && *syncserver )
307
224
  CSyncThread::getInstance()->start(CSyncThread::epLow);
308
225
  else
309
- CSyncThread::getInstance()->stop(SYNC_WAIT_BEFOREKILL_SECONDS);
226
+ CSyncThread::getInstance()->stop(CSyncThread::SYNC_WAIT_BEFOREKILL_SECONDS);
310
227
  }
311
228
 
312
229
  void rho_sync_login(const char *name, const char *password, const char* callback)
313
230
  {
314
231
  rho_sync_stop();
315
- CSyncThread::getInstance()->addSyncCommand(new CSyncThread::CSyncLoginCommand(name, password, callback) );
232
+ CSyncThread::getInstance()->addQueueCommand(new CSyncThread::CSyncLoginCommand(name, password, callback) );
316
233
  }
317
234
 
318
235
  int rho_sync_logged_in()
@@ -5,26 +5,24 @@
5
5
  #include "logging/RhoLog.h"
6
6
  #include "db/DBAdapter.h"
7
7
  #include "sync/SyncEngine.h"
8
- #include "common/RhoThread.h"
8
+ #include "common/ThreadQueue.h"
9
9
 
10
10
  namespace rho {
11
11
  namespace sync {
12
12
 
13
- #define SYNC_POLL_INTERVAL_SECONDS 300
14
- #define SYNC_POLL_INTERVAL_INFINITE (unsigned int)(-1)
15
- #define SYNC_WAIT_BEFOREKILL_SECONDS 3
16
- #define SYNC_STARTUP_INTERVAL_SECONDS 10
17
-
18
- class CSyncThread : public common::CRhoThread
13
+ class CSyncThread : public common::CThreadQueue
19
14
  {
20
15
  public:
21
- enum ESyncCommands{ scNone = 0, scSyncAll, scSyncOne, scChangePollInterval, scExit, scLogin, scSearchOne};
16
+ enum ESyncCommands{ scNone = 0, scSyncAll, scSyncOne, scLogin, scSearchOne};
22
17
 
23
18
  private:
24
19
 
25
20
  DEFINE_LOGCLASS;
21
+
26
22
  public:
27
- class CSyncCommand
23
+ static const unsigned int SYNC_WAIT_BEFOREKILL_SECONDS = 3;
24
+
25
+ class CSyncCommand : public CQueueCommand
28
26
  {
29
27
  public:
30
28
  int m_nCmdCode;
@@ -59,12 +57,29 @@ public:
59
57
  m_bShowStatus = bShowStatus;
60
58
  }
61
59
 
62
- boolean equals(const CSyncCommand& oSyncCmd)
60
+ boolean equals(const CQueueCommand& cmd)
63
61
  {
62
+ const CSyncCommand& oSyncCmd = (const CSyncCommand&)cmd;
64
63
  return m_nCmdCode == oSyncCmd.m_nCmdCode && m_nCmdParam == oSyncCmd.m_nCmdParam &&
65
64
  m_strCmdParam == oSyncCmd.m_strCmdParam;
66
65
  }
67
66
 
67
+ String toString()
68
+ {
69
+ switch(m_nCmdCode)
70
+ {
71
+ case scSyncAll:
72
+ return "SyncAll";
73
+ case scSyncOne:
74
+ return "SyncOne";
75
+ case scLogin:
76
+ return "Login";
77
+ case scSearchOne:
78
+ return "Search";
79
+ }
80
+ return "Unknown";
81
+ }
82
+
68
83
  };
69
84
 
70
85
  class CSyncLoginCommand : public CSyncCommand
@@ -96,10 +111,6 @@ private:
96
111
  static CSyncThread* m_pInstance;
97
112
 
98
113
  CSyncEngine m_oSyncEngine;
99
- common::CAutoPtr<common::IRhoClassFactory> m_ptrFactory;
100
- int m_nPollInterval;
101
- common::CMutex m_mxStackCommands;
102
- LinkedListPtr<CSyncCommand*> m_stackCommands;
103
114
  public:
104
115
  ~CSyncThread(void);
105
116
 
@@ -108,18 +119,15 @@ public:
108
119
  static CSyncThread* getInstance(){ return m_pInstance; }
109
120
  static CSyncEngine& getSyncEngine(){ return m_pInstance->m_oSyncEngine; }
110
121
 
111
- void addSyncCommand(CSyncCommand* pSyncCmd);
112
-
113
- virtual void run();
114
-
115
122
  void setPollInterval(int nInterval);
116
123
  private:
117
124
  CSyncThread(common::IRhoClassFactory* factory);
118
- int getLastSyncInterval();
119
125
 
120
- void processCommands();
121
- void processCommand(CSyncCommand& oSyncCmd);
122
- boolean isNoCommands();
126
+ virtual int getLastPollInterval();
127
+ virtual void processCommand(CQueueCommand* pCmd);
128
+ virtual boolean isSkipDuplicateCmd() { return true; }
129
+
130
+ virtual void processCommands();
123
131
 
124
132
  void checkShowStatus(CSyncCommand& oSyncCmd);
125
133
  };
@@ -873,6 +873,14 @@
873
873
  RelativePath="..\..\shared\common\StringConverter.h"
874
874
  >
875
875
  </File>
876
+ <File
877
+ RelativePath="..\..\shared\common\ThreadQueue.cpp"
878
+ >
879
+ </File>
880
+ <File
881
+ RelativePath="..\..\shared\common\ThreadQueue.h"
882
+ >
883
+ </File>
876
884
  <File
877
885
  RelativePath="..\..\shared\common\Tokenizer.cpp"
878
886
  >
@@ -41,6 +41,10 @@ HREGNOTIFY g_hNotify = NULL;
41
41
 
42
42
  #endif
43
43
 
44
+ #ifdef OS_WINDOWS
45
+ String httpProxy;
46
+ #endif
47
+
44
48
  class CRhodesModule : public CAtlExeModuleT< CRhodesModule >
45
49
  {
46
50
  public :
@@ -49,13 +53,24 @@ public :
49
53
  TCHAR szTokens[] = _T("-/");
50
54
  LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
51
55
  getRhoRootPath();
56
+
52
57
  while (lpszToken != NULL)
53
58
  {
54
59
  if (WordCmpI(lpszToken, _T("Restarting"))==0) {
55
60
  m_nRestarting = 10;
56
61
  }
62
+
57
63
  #if defined(OS_WINDOWS)
58
- else if (wcsncmp(lpszToken, _T("approot"),7)==0) {
64
+ if (wcsncmp(lpszToken, _T("http_proxy"),10)==0) {
65
+ char *token = wce_wctomb(lpszToken);
66
+ char *proxy =parseToken(token,strlen(token));
67
+
68
+ httpProxy = proxy;
69
+
70
+ free(proxy);
71
+ free(token);
72
+
73
+ } else if (wcsncmp(lpszToken, _T("approot"),7)==0) {
59
74
  char* token = wce_wctomb(lpszToken);
60
75
  //parseToken will allocate extra byte at the end of the returned token value
61
76
  char* path = parseToken( token, strlen(token) );
@@ -114,6 +129,12 @@ public :
114
129
  rho_logconf_Init(m_strRootPath.c_str());
115
130
  LOG(INFO) + "Rhodes started";
116
131
 
132
+ #ifdef OS_WINDOWS
133
+ if (httpProxy.length() > 0)
134
+ parseHttpProxyURI(httpProxy);
135
+ #endif
136
+
137
+
117
138
  ::SetThreadPriority(GetCurrentThread(),10);
118
139
 
119
140
  //Check for bundle directory is exists.
@@ -239,6 +260,127 @@ public :
239
260
  return m_strRootPath;
240
261
  }
241
262
 
263
+ void parseHttpProxyURI(const rho::String &http_proxy)
264
+ {
265
+ // http://<login>:<passwod>@<host>:<port>
266
+ const char *default_port = "8080";
267
+
268
+ int index = http_proxy.find("http://", 0, 7);
269
+ if (index == string::npos) {
270
+ LOG(ERROR) + "http proxy url should starts with \"http://\"";
271
+ return;
272
+ }
273
+ index = 7;
274
+
275
+ enum {
276
+ ST_START,
277
+ ST_LOGIN,
278
+ ST_PASSWORD,
279
+ ST_HOST,
280
+ ST_PORT,
281
+ ST_FINISH
282
+ };
283
+
284
+ String token, login, password, host, port;
285
+ char c, state = ST_START, prev_state = state;
286
+ int length = http_proxy.length();
287
+
288
+ for (int i = index; i < length; i++) {
289
+ c = http_proxy[i];
290
+
291
+ switch (state) {
292
+ case ST_START:
293
+ if (c == '@') {
294
+ prev_state = state; state = ST_HOST;
295
+ } else if (c == ':') {
296
+ prev_state = state; state = ST_PASSWORD;
297
+ } else {
298
+ token +=c;
299
+ state = ST_HOST;
300
+ }
301
+ break;
302
+ case ST_HOST:
303
+ if (c == ':') {
304
+ host = token; token.clear();
305
+ prev_state = state; state = ST_PORT;
306
+ } else if (c == '@') {
307
+ host = token; token.clear();
308
+ prev_state = state; state = ST_LOGIN;
309
+ } else {
310
+ token += c;
311
+ if (i == (length - 1)) {
312
+ host = token; token.clear();
313
+ }
314
+ }
315
+ break;
316
+ case ST_PORT:
317
+ if (c == '@') {
318
+ port = token; token.clear();
319
+ prev_state = state; state = ST_LOGIN;
320
+ } else {
321
+ token += c;
322
+ if (i == (length - 1)) {
323
+ port = token; token.clear();
324
+ }
325
+ }
326
+ break;
327
+ case ST_LOGIN:
328
+ if (prev_state == ST_PORT || prev_state == ST_HOST) {
329
+ login = host; host.clear();
330
+ password = port; port.clear();
331
+ prev_state = state; state = ST_HOST;
332
+ token += c;
333
+ } else {
334
+ token += c;
335
+ if (i == (length - 1)) {
336
+ login = token; token.clear();
337
+ }
338
+ }
339
+ break;
340
+ case ST_PASSWORD:
341
+ if (c == '@') {
342
+ password = token; token.clear();
343
+ prev_state = state; state = ST_HOST;
344
+ } else {
345
+ token += c;
346
+ if (i == (length - 1)) {
347
+ password = token; token.clear();
348
+ }
349
+ }
350
+ break;
351
+ default:
352
+ ;
353
+ }
354
+ }
355
+
356
+ LOG(INFO) + "Setting up HTTP proxy:";
357
+ LOG(INFO) + "URI: " + http_proxy;
358
+ LOG(INFO) + "HTTP proxy login = " + login;
359
+ LOG(INFO) + "HTTP proxy password = " + password;
360
+ LOG(INFO) + "HTTP proxy host = " + host;
361
+ LOG(INFO) + "HTTP proxy port = " + port;
362
+
363
+ if (host.length()) {
364
+ RHOCONF().setString ("http_proxy_host", host);
365
+
366
+ if (port.length()){
367
+ RHOCONF().setString ("http_proxy_port", port);
368
+ } else {
369
+ LOG(WARNING) + "there is no proxy port defined";
370
+ }
371
+
372
+ if (login.length())
373
+ RHOCONF().setString ("http_proxy_login", login);
374
+
375
+ if (password.length())
376
+ RHOCONF().setString ("http_proxy_password", password);
377
+
378
+ } else {
379
+ LOG(ERROR) + "empty host name in HTTP-proxy URL";
380
+ }
381
+
382
+ }
383
+
242
384
  private:
243
385
  CMainWindow m_appWindow;
244
386
  rho::String m_strRootPath;