rhodes 2.0.2 → 2.0.3

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 (65) hide show
  1. data/CHANGELOG +10 -0
  2. data/lib/framework/rho/rhoerror.rb +4 -0
  3. data/lib/framework/rhodes.rb +2 -2
  4. data/lib/framework/rhom/rhom.rb +21 -1
  5. data/lib/framework/version.rb +2 -2
  6. data/lib/rhodes.rb +2 -2
  7. data/platform/android/Rhodes/AndroidManifest.xml +2 -2
  8. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +21 -6
  9. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesInstance.java +1 -1
  10. data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +10 -0
  11. data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +1 -1
  12. data/platform/bb/rhodes/src/com/rho/rubyext/GeoLocation.java +2 -2
  13. data/platform/bb/rhodes/src/rhomobile/PushListeningThread.java +4 -2
  14. data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +52 -11
  15. data/platform/iphone/Classes/NativeBar.m +37 -18
  16. data/platform/iphone/Classes/Rhodes.h +2 -0
  17. data/platform/iphone/Classes/Rhodes.m +27 -8
  18. data/platform/iphone/Classes/SimpleMainView.h +7 -5
  19. data/platform/iphone/Classes/SimpleMainView.m +155 -36
  20. data/platform/iphone/Classes/TabbedMainView.h +2 -4
  21. data/platform/iphone/Classes/TabbedMainView.m +12 -10
  22. data/platform/iphone/Classes/WebView.m +1 -0
  23. data/platform/iphone/Info.plist +7 -1
  24. data/platform/iphone/icon114.png +0 -0
  25. data/platform/iphone/icon57.png +0 -0
  26. data/platform/iphone/icon72.png +0 -0
  27. data/platform/iphone/rbuild/iphone.rake +102 -16
  28. data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +12 -0
  29. data/platform/shared/common/IRhoThreadImpl.h +1 -1
  30. data/platform/shared/common/PosixThreadImpl.cpp +17 -22
  31. data/platform/shared/common/PosixThreadImpl.h +1 -1
  32. data/platform/shared/common/RhoThread.cpp +7 -3
  33. data/platform/shared/common/RhoThread.h +21 -7
  34. data/platform/shared/common/RhodesApp.cpp +13 -9
  35. data/platform/shared/common/RhodesApp.h +1 -1
  36. data/platform/shared/common/ThreadQueue.cpp +6 -4
  37. data/platform/shared/rubyJVM/src/com/rho/IRhoRubyHelper.java +2 -0
  38. data/platform/shared/rubyJVM/src/com/rho/RhoThread.java +18 -8
  39. data/platform/shared/rubyJVM/src/com/rho/RhodesApp.java +70 -2
  40. data/platform/shared/rubyJVM/src/com/rho/ThreadQueue.java +143 -0
  41. data/platform/shared/rubyJVM/src/com/rho/sync/ClientRegister.java +15 -5
  42. data/platform/shared/rubyJVM/src/com/rho/sync/SyncEngine.java +42 -36
  43. data/platform/shared/rubyJVM/src/com/rho/sync/SyncNotify.java +63 -20
  44. data/platform/shared/rubyJVM/src/com/rho/sync/SyncSource.java +4 -4
  45. data/platform/shared/rubyJVM/src/com/rho/sync/SyncThread.java +12 -2
  46. data/platform/shared/rubyJVM/src/com/xruby/runtime/lang/RhoSupport.java +9 -3
  47. data/platform/shared/sync/ClientRegister.cpp +11 -3
  48. data/platform/shared/sync/ClientRegister.h +1 -0
  49. data/platform/shared/sync/SyncEngine.cpp +38 -35
  50. data/platform/shared/sync/SyncEngine.h +2 -1
  51. data/platform/shared/sync/SyncNotify.cpp +53 -20
  52. data/platform/shared/sync/SyncNotify.h +9 -2
  53. data/platform/shared/sync/SyncSource.cpp +3 -3
  54. data/platform/shared/sync/SyncSource.h +1 -1
  55. data/platform/shared/sync/SyncThread.cpp +9 -2
  56. data/platform/wm/rhodes/Alert.cpp +35 -21
  57. data/platform/wm/rhodes/Alert.h +11 -2
  58. data/platform/wm/rhodes/rho/common/RhoThreadImpl.cpp +11 -12
  59. data/platform/wm/rhodes/rho/common/RhoThreadImpl.h +2 -0
  60. data/res/generators/templates/application/build.yml +1 -1
  61. data/rhodes.gemspec +2 -2
  62. data/spec/framework_spec/rhoconfig.txt +1 -0
  63. data/spec/phone_spec/rhoconfig.txt +2 -0
  64. metadata +8 -5
  65. data/Manifest.txt +0 -5333
@@ -41,7 +41,7 @@ private:
41
41
  int m_currentTabIndex;
42
42
  String m_currentUrls[5];
43
43
 
44
- String m_strAppBackUrl;
44
+ String m_strAppBackUrl, m_strAppBackUrlOrig;
45
45
  Vector<ICallbackObject*> m_arCallbackObjects;
46
46
  rubyext::CGeoLocation m_oGeoLocation;
47
47
  CSplashScreen m_oSplashScreen;
@@ -49,7 +49,7 @@ void CThreadQueue::run()
49
49
  LOG(INFO) + "Starting main routine...";
50
50
 
51
51
  int nLastPollInterval = getLastPollInterval();
52
- while( !isStopped() )
52
+ while( !isStopping() )
53
53
  {
54
54
  unsigned int nWait = m_nPollInterval > 0 ? m_nPollInterval : QUEUE_POLL_INTERVAL_INFINITE;
55
55
 
@@ -62,16 +62,18 @@ void CThreadQueue::run()
62
62
  nWait = nWait2;
63
63
  }
64
64
 
65
- if ( nWait >= 0 && !isStopped() && isNoCommands() )
65
+ if ( nWait >= 0 && !isStopping() && isNoCommands() )
66
66
  {
67
67
  LOG(INFO) + "ThreadQueue blocked for " + nWait + " seconds...";
68
68
  wait(nWait);
69
69
  }
70
70
  nLastPollInterval = 0;
71
71
 
72
- if ( !isStopped() )
72
+ if ( !isStopping() )
73
73
  processCommands();
74
74
  }
75
+
76
+ LOG(INFO) + "Thread shutdown";
75
77
  }
76
78
 
77
79
  boolean CThreadQueue::isNoCommands()
@@ -87,7 +89,7 @@ boolean CThreadQueue::isNoCommands()
87
89
 
88
90
  void CThreadQueue::processCommands()//throws Exception
89
91
  {
90
- while(!isStopped() && !isNoCommands())
92
+ while(!isStopping() && !isNoCommands())
91
93
  {
92
94
  common::CAutoPtr<CQueueCommand> pCmd = null;
93
95
  {
@@ -29,4 +29,6 @@ public interface IRhoRubyHelper {
29
29
  public void wakeUpGeoLocation();
30
30
 
31
31
  public NetResponse postUrl(String url, String body);
32
+ public void navigateUrl(String url);
33
+ public void navigateBack();
32
34
  }
@@ -6,16 +6,24 @@ public class RhoThread extends Thread
6
6
  new RhoLogger("RhoThread");
7
7
 
8
8
  public final static int epNormal = 0, epHigh = 1, epLow = 2;
9
+ static final int TS_NONE = 0;
10
+ static final int TS_WAIT = 1;
11
+ static final int TS_STOPPING = 2;
12
+ //static final int TS_RUNNING = 4;
13
+
14
+ int m_nState;
15
+
9
16
  private Object m_syncObj = new Object();
10
- boolean m_isInWaitState;
11
- protected boolean m_bStop = false;
12
17
 
13
18
  public RhoThread(RhoClassFactory factory)
14
19
  {
15
- m_isInWaitState = false;
20
+ m_nState = TS_NONE;
16
21
  }
17
22
 
18
23
  public Object getSyncObject(){ return m_syncObj; }
24
+ public boolean isStopping(){return (m_nState&TS_STOPPING) != 0;}
25
+ public boolean isWaiting(){return (m_nState&TS_WAIT) != 0;}
26
+ //public boolean isRunning(){return (m_nState&TS_RUNNING) != 0;}
19
27
 
20
28
  public void start(int ePriority)
21
29
  {
@@ -35,7 +43,7 @@ public class RhoThread extends Thread
35
43
 
36
44
  public void stop(int nTimeoutToKill)
37
45
  {
38
- m_bStop = true;
46
+ m_nState |= TS_STOPPING;
39
47
  stopWait();
40
48
 
41
49
  try{
@@ -51,21 +59,23 @@ public class RhoThread extends Thread
51
59
 
52
60
  }catch(Exception e){
53
61
  LOG.ERROR("stop failed", e);
62
+ }finally
63
+ {
64
+ m_nState &= ~TS_STOPPING;
54
65
  }
55
-
56
66
  }
57
67
 
58
68
  public void wait(int nTimeout)
59
69
  {
60
70
  synchronized (m_syncObj) {
61
71
  try{
62
- m_isInWaitState = true;
72
+ m_nState |= TS_WAIT;
63
73
  m_syncObj.wait(nTimeout*1000);
64
74
  }catch(Exception e)
65
75
  {
66
76
  LOG.ERROR("wait failed", e);
67
77
  }finally{
68
- m_isInWaitState = false;
78
+ m_nState &= ~TS_WAIT;
69
79
  }
70
80
  }
71
81
 
@@ -74,7 +84,7 @@ public class RhoThread extends Thread
74
84
  public void stopWait()
75
85
  {
76
86
  synchronized (m_syncObj) {
77
- if ( m_isInWaitState )
87
+ if ( isWaiting() )
78
88
  m_syncObj.notifyAll();
79
89
  }
80
90
  }
@@ -13,7 +13,8 @@ public class RhodesApp
13
13
  static RhodesApp m_pInstance;
14
14
 
15
15
  private String m_strRhoRootPath, m_strBlobsDirPath, m_strDBDirPath;
16
- private String m_strHomeUrl;
16
+ private String m_strStartUrl, m_strHomeUrl;
17
+ private String m_strAppBackUrl = "", m_strAppBackUrlOrig = "";
17
18
 
18
19
  Vector/*<unsigned long>*/ m_arCallbackObjects = new Vector();
19
20
  private SplashScreen m_oSplashScreen = new SplashScreen();
@@ -27,6 +28,8 @@ public class RhodesApp
27
28
  int m_currentTabIndex = 0;
28
29
  String[] m_currentUrls = new String[5];
29
30
 
31
+ String getAppBackUrl(){return m_strAppBackUrl;}
32
+
30
33
  public static RhodesApp Create(String strRootPath)
31
34
  {
32
35
  if ( m_pInstance != null )
@@ -236,5 +239,70 @@ public class RhodesApp
236
239
  {
237
240
  LOG.ERROR("Save current location failed.", exc);
238
241
  }
239
- }
242
+ }
243
+
244
+ String getStartUrl()
245
+ {
246
+ m_strStartUrl = canonicalizeRhoUrl( RHOCONF().getString("start_path") );
247
+ return m_strStartUrl;
248
+ }
249
+
250
+ void navigateToUrl(String url)throws Exception
251
+ {
252
+ IRhoRubyHelper helper = RhoClassFactory.createRhoRubyHelper();
253
+ helper.navigateUrl(url);
254
+ }
255
+
256
+ public void loadUrl(String url)throws Exception
257
+ {
258
+ boolean callback = false;
259
+ if (url.startsWith("callback:") )
260
+ {
261
+ callback = true;
262
+ url = url.substring(9);
263
+ }
264
+ url = canonicalizeRhoUrl(url);
265
+ if (callback)
266
+ {
267
+ getNet().pushData( url, "rho_callback=1", null );
268
+ }
269
+ else
270
+ navigateToUrl(url);
271
+ }
272
+
273
+ public void setAppBackUrl(String url)
274
+ {
275
+ if ( url != null && url.length() > 0 )
276
+ {
277
+ m_strAppBackUrlOrig = url;
278
+ m_strAppBackUrl = canonicalizeRhoUrl(url);
279
+ }
280
+ else
281
+ {
282
+ m_strAppBackUrlOrig = "";
283
+ m_strAppBackUrl = "";
284
+ }
285
+ }
286
+
287
+ public boolean isCloseBack()
288
+ {
289
+ return m_strAppBackUrlOrig.equalsIgnoreCase("close");
290
+ }
291
+
292
+ public void navigateBack()
293
+ {
294
+ try{
295
+ if ( m_strAppBackUrlOrig.length() > 0 )
296
+ loadUrl(m_strAppBackUrlOrig);
297
+ else if ( !getCurrentUrl(0).equalsIgnoreCase(getStartUrl()) )
298
+ {
299
+ IRhoRubyHelper helper = RhoClassFactory.createRhoRubyHelper();
300
+ helper.navigateBack();
301
+ }
302
+ }catch(Exception exc)
303
+ {
304
+ LOG.ERROR("Navigate back failed.", exc);
305
+ }
306
+ }
307
+
240
308
  }
@@ -0,0 +1,143 @@
1
+ package com.rho;
2
+
3
+ import j2me.util.LinkedList;
4
+
5
+ public abstract class ThreadQueue extends RhoThread
6
+ {
7
+ private static final RhoLogger LOG = RhoLogger.RHO_STRIP_LOG ? new RhoEmptyLogger() :
8
+ new RhoLogger("ThreadQueue");
9
+
10
+ public static void setLogCategory(String category)
11
+ {
12
+ LOG.setLogCategory(category);
13
+ }
14
+
15
+ public static final int QUEUE_POLL_INTERVAL_SECONDS = 300;
16
+ public static final int QUEUE_POLL_INTERVAL_INFINITE = Integer.MAX_VALUE/1000;
17
+ public static final int QUEUE_STARTUP_INTERVAL_SECONDS = 10;
18
+
19
+ public interface IQueueCommand
20
+ {
21
+ public abstract boolean equals(IQueueCommand cmd);
22
+ public abstract String toString();
23
+ };
24
+
25
+ RhoClassFactory m_ptrFactory;
26
+ int m_nPollInterval;
27
+ Mutex m_mxStackCommands = new Mutex();
28
+ LinkedList m_stackCommands = new LinkedList();
29
+
30
+ boolean m_bNoThreaded;
31
+
32
+ int getPollInterval(){ return m_nPollInterval;}
33
+
34
+ boolean isNoThreadedMode(){ return m_bNoThreaded; }
35
+ void setNonThreadedMode(boolean b){m_bNoThreaded = b;}
36
+
37
+ public RhoClassFactory getFactory(){ return m_ptrFactory; }
38
+
39
+ int getLastPollInterval(){ return 0;}
40
+ public abstract void processCommand(IQueueCommand pCmd);
41
+ boolean isSkipDuplicateCmd() { return false; }
42
+
43
+ public ThreadQueue(RhoClassFactory factory)
44
+ {
45
+ super(factory);
46
+
47
+ m_nPollInterval = QUEUE_POLL_INTERVAL_SECONDS;
48
+ m_bNoThreaded = false;
49
+
50
+ m_ptrFactory = factory;
51
+ }
52
+
53
+ public void addQueueCommand(IQueueCommand pCmd)
54
+ {
55
+ LOG.INFO("addCommand: " + pCmd.toString() );
56
+ synchronized(m_mxStackCommands)
57
+ {
58
+ boolean bExist = false;
59
+ if ( isSkipDuplicateCmd() )
60
+ {
61
+ for ( int i = 0; i < (int)m_stackCommands.size(); i++ )
62
+ {
63
+ if ( m_stackCommands.get(i).equals(pCmd) )
64
+ {
65
+ bExist = true;
66
+ break;
67
+ }
68
+ }
69
+ }
70
+
71
+ if ( !bExist )
72
+ m_stackCommands.add(pCmd);
73
+ }
74
+
75
+ if ( isNoThreadedMode() )
76
+ processCommands();
77
+ else
78
+ stopWait();
79
+ }
80
+
81
+ public void run()
82
+ {
83
+ LOG.INFO("Starting main routine...");
84
+
85
+ int nLastPollInterval = getLastPollInterval();
86
+ while( !isStopping() )
87
+ {
88
+ int nWait = m_nPollInterval > 0 ? m_nPollInterval : QUEUE_POLL_INTERVAL_INFINITE;
89
+
90
+ if ( m_nPollInterval > 0 && nLastPollInterval > 0 )
91
+ {
92
+ int nWait2 = m_nPollInterval - nLastPollInterval;
93
+ if ( nWait2 <= 0 )
94
+ nWait = QUEUE_STARTUP_INTERVAL_SECONDS;
95
+ else
96
+ nWait = nWait2;
97
+ }
98
+
99
+ if ( nWait >= 0 && !isStopping() && isNoCommands() )
100
+ {
101
+ LOG.INFO("ThreadQueue blocked for " + nWait + " seconds...");
102
+ wait(nWait);
103
+ }
104
+ nLastPollInterval = 0;
105
+
106
+ if ( !isStopping() )
107
+ processCommands();
108
+ }
109
+
110
+ LOG.INFO("Thread shutdown");
111
+ }
112
+
113
+ boolean isNoCommands()
114
+ {
115
+ boolean bEmpty = false;
116
+ synchronized(m_mxStackCommands)
117
+ {
118
+ bEmpty = m_stackCommands.isEmpty();
119
+ }
120
+
121
+ return bEmpty;
122
+ }
123
+
124
+ void processCommands()//throws Exception
125
+ {
126
+ while(!isStopping() && !isNoCommands())
127
+ {
128
+ IQueueCommand pCmd = null;
129
+ synchronized(m_mxStackCommands)
130
+ {
131
+ pCmd = (IQueueCommand)m_stackCommands.removeFirst();
132
+ }
133
+
134
+ processCommand(pCmd);
135
+ }
136
+ }
137
+
138
+ public void setPollInterval(int nInterval)
139
+ {
140
+ m_nPollInterval = nInterval;
141
+ stopWait();
142
+ }
143
+ }
@@ -55,23 +55,34 @@ public class ClientRegister extends RhoThread
55
55
  m_NetRequest = RhoClassFactory.createNetRequest();
56
56
  m_nPollInterval = POLL_INTERVAL_SECONDS;
57
57
 
58
- if ( RhoConf.getInstance().getString("syncserver").length() > 0 )
59
- start(epLow);
58
+ startUp();
60
59
  }
61
60
 
62
61
  public static ClientRegister getInstance(){ return m_pInstance; }
63
62
 
63
+ public void startUp()
64
+ {
65
+ if ( RhoConf.getInstance().getString("syncserver").length() > 0 )
66
+ {
67
+ start(epLow);
68
+ stopWait();
69
+ }
70
+ }
71
+
64
72
  public void run()
65
73
  {
66
74
  LOG.INFO("ClientRegister start");
67
- while(!m_bStop)
75
+ while(!isStopping())
68
76
  {
69
77
  try
70
78
  {
71
79
  if ( SyncThread.getInstance() != null )
72
80
  {
73
81
  if ( doRegister(SyncThread.getSyncEngine()) )
74
- break;
82
+ {
83
+ m_nPollInterval = POLL_INTERVAL_INFINITE;
84
+ //break;
85
+ }
75
86
  }
76
87
 
77
88
  }catch(Exception exc)
@@ -83,7 +94,6 @@ public class ClientRegister extends RhoThread
83
94
  wait(m_nPollInterval);
84
95
  }
85
96
  LOG.INFO( "ClientRegister thread shutdown" );
86
-
87
97
  }
88
98
 
89
99
  public String getRegisterBody(String strClientID)throws Exception
@@ -79,6 +79,7 @@ public class SyncEngine implements NetRequest.IRhoSession
79
79
  int m_nSyncPageSize = 2000;
80
80
  boolean m_bNoThreaded = false;
81
81
  int m_nErrCode = RhoRuby.ERR_NONE;
82
+ String m_strError = "";
82
83
 
83
84
  void setState(int eState){ m_syncState = eState; }
84
85
  int getState(){ return m_syncState; }
@@ -123,11 +124,12 @@ public class SyncEngine implements NetRequest.IRhoSession
123
124
  m_NetRequest = RhoClassFactory.createNetRequest();
124
125
  }
125
126
 
126
- void prepareSync(int eState)throws Exception
127
+ void prepareSync(int eState, SourceID oSrcID)throws Exception
127
128
  {
128
129
  setState(eState);
129
130
  m_bStopByUser = false;
130
131
  m_nErrCode = RhoRuby.ERR_NONE;
132
+ m_strError = "";
131
133
 
132
134
  loadAllSources();
133
135
 
@@ -145,15 +147,20 @@ public class SyncEngine implements NetRequest.IRhoSession
145
147
  }else
146
148
  m_nErrCode = RhoRuby.ERR_CLIENTISNOTLOGGEDIN;
147
149
 
148
- if ( m_sources.size() > 0 )
149
- {
150
- SyncSource src = (SyncSource)m_sources.elementAt(getStartSource());
151
- src.m_nErrCode = m_nErrCode;
152
-
153
- getNotify().fireSyncNotification(src, true, src.m_nErrCode, "");
150
+ SyncSource src = null;
151
+ if ( oSrcID != null )
152
+ src = findSource(oSrcID);
153
+
154
+ if ( src != null )
155
+ {
156
+ src.m_nErrCode = m_nErrCode;
157
+ src.m_strError = m_strError;
158
+ getNotify().fireSyncNotification(src, true, src.m_nErrCode, "");
154
159
  }else
155
- getNotify().fireSyncNotification(null, true, m_nErrCode, "");
156
-
160
+ {
161
+ getNotify().fireAllSyncNotifications(true, m_nErrCode, m_strError, m_sources, getStartSource());
162
+ }
163
+
157
164
  stopSync();
158
165
  }
159
166
 
@@ -161,7 +168,7 @@ public class SyncEngine implements NetRequest.IRhoSession
161
168
  {
162
169
  try
163
170
  {
164
- prepareSync(esSyncAllSources);
171
+ prepareSync(esSyncAllSources, null);
165
172
 
166
173
  if ( isContinueSync() )
167
174
  {
@@ -198,7 +205,7 @@ public class SyncEngine implements NetRequest.IRhoSession
198
205
  {
199
206
  try
200
207
  {
201
- prepareSync(esSearch);
208
+ prepareSync(esSearch, null);
202
209
  if ( !isContinueSync() )
203
210
  {
204
211
  if ( getState() != esExit )
@@ -219,7 +226,6 @@ public class SyncEngine implements NetRequest.IRhoSession
219
226
  }
220
227
  }
221
228
 
222
- int nErrCode = 0;
223
229
  while( isContinueSync() )
224
230
  {
225
231
  int nSearchCount = 0;
@@ -247,7 +253,8 @@ public class SyncEngine implements NetRequest.IRhoSession
247
253
  if ( !resp.isOK() )
248
254
  {
249
255
  stopSync();
250
- nErrCode = RhoRuby.getErrorFromResponse(resp);
256
+ m_nErrCode = RhoRuby.getErrorFromResponse(resp);
257
+ m_strError = resp.getCharData();
251
258
  continue;
252
259
  }
253
260
 
@@ -271,7 +278,8 @@ public class SyncEngine implements NetRequest.IRhoSession
271
278
  LOG.ERROR( "Sync server send search data with incompatible version. Client version: " + getProtocol().getVersion() +
272
279
  "; Server response version: " + nVersion );
273
280
  stopSync();
274
- nErrCode = RhoRuby.ERR_UNEXPECTEDSERVERRESPONSE;
281
+ m_nErrCode = RhoRuby.ERR_UNEXPECTEDSERVERRESPONSE;
282
+ m_strError = resp.getCharData();
275
283
  continue;
276
284
  }
277
285
 
@@ -279,7 +287,8 @@ public class SyncEngine implements NetRequest.IRhoSession
279
287
  {
280
288
  LOG.ERROR( "Sync server send search data without source name." );
281
289
  stopSync();
282
- nErrCode = RhoRuby.ERR_UNEXPECTEDSERVERRESPONSE;
290
+ m_nErrCode = RhoRuby.ERR_UNEXPECTEDSERVERRESPONSE;
291
+ m_strError = resp.getCharData();
283
292
  continue;
284
293
  }
285
294
 
@@ -289,12 +298,12 @@ public class SyncEngine implements NetRequest.IRhoSession
289
298
  {
290
299
  LOG.ERROR("Sync server send search data for unknown source name:" + strSrcName);
291
300
  stopSync();
292
- nErrCode = RhoRuby.ERR_UNEXPECTEDSERVERRESPONSE;
301
+ m_nErrCode = RhoRuby.ERR_UNEXPECTEDSERVERRESPONSE;
302
+ m_strError = resp.getCharData();
293
303
  continue;
294
304
  }
295
305
 
296
306
  oSrcArr.reset(0);
297
- pSrc.m_bIsSearch = true;
298
307
  pSrc.setProgressStep(nProgressStep);
299
308
  pSrc.processServerResponse_ver3(oSrcArr);
300
309
 
@@ -305,20 +314,7 @@ public class SyncEngine implements NetRequest.IRhoSession
305
314
  break;
306
315
  }
307
316
 
308
- if ( isContinueSync() )
309
- {
310
- SyncSource src = (SyncSource)m_sources.elementAt(getStartSource());
311
- src.m_bIsSearch = true;
312
-
313
- getNotify().fireSyncNotification(src, true, RhoRuby.ERR_NONE, RhoRuby.getMessageText("sync_completed"));
314
- }
315
- else if ( nErrCode != 0 )
316
- {
317
- SyncSource src = (SyncSource)m_sources.elementAt(getStartSource());
318
- src.m_nErrCode = nErrCode;
319
- src.m_bIsSearch = true;
320
- getNotify().fireSyncNotification(src, true, src.m_nErrCode, "");
321
- }
317
+ getNotify().fireAllSyncNotifications(true, m_nErrCode, m_strError, m_sources, getStartSource());
322
318
 
323
319
  //update db info
324
320
  TimeInterval endTime = TimeInterval.getCurrentTime();
@@ -358,7 +354,7 @@ public class SyncEngine implements NetRequest.IRhoSession
358
354
 
359
355
  try
360
356
  {
361
- prepareSync(esSyncSource);
357
+ prepareSync(esSyncSource, oSrcID);
362
358
 
363
359
  if ( isContinueSync() )
364
360
  {
@@ -473,6 +469,10 @@ public class SyncEngine implements NetRequest.IRhoSession
473
469
  getUserDB().executeSQL("UPDATE client_info SET client_id=?", clientID);
474
470
  else
475
471
  getUserDB().executeSQL("INSERT INTO client_info (client_id) values (?)", clientID);
472
+
473
+ if ( ClientRegister.getInstance() != null )
474
+ ClientRegister.getInstance().startUp();
475
+
476
476
  }else if ( bResetClient )
477
477
  {
478
478
  if ( !resetClientIDByNet(clientID) )
@@ -512,7 +512,10 @@ public class SyncEngine implements NetRequest.IRhoSession
512
512
  */
513
513
 
514
514
  if ( !resp.isOK() )
515
+ {
515
516
  m_nErrCode = RhoRuby.getErrorFromResponse(resp);
517
+ m_strError = resp.getCharData();
518
+ }
516
519
  /*else
517
520
  {
518
521
  processServerSources(resp.getCharData());
@@ -545,7 +548,10 @@ public class SyncEngine implements NetRequest.IRhoSession
545
548
  {
546
549
  m_nErrCode = RhoRuby.getErrorFromResponse(resp);
547
550
  if ( m_nErrCode == RhoRuby.ERR_NONE )
551
+ {
548
552
  m_nErrCode = RhoRuby.ERR_UNEXPECTEDSERVERRESPONSE;
553
+ m_strError = resp.getCharData();
554
+ }
549
555
  }
550
556
 
551
557
  return "";
@@ -778,11 +784,11 @@ public class SyncEngine implements NetRequest.IRhoSession
778
784
  else
779
785
  getUserDB().executeSQL("INSERT INTO client_info (session) values (?)", strSession);
780
786
 
781
- if ( ClientRegister.getInstance() != null )
782
- ClientRegister.getInstance().stopWait();
783
-
784
787
  getNotify().callLoginCallback(callback, RhoRuby.ERR_NONE, "" );
785
788
 
789
+ if ( ClientRegister.getInstance() != null )
790
+ ClientRegister.getInstance().startUp();
791
+
786
792
  }catch(Exception exc)
787
793
  {
788
794
  LOG.ERROR("Login failed.", exc);
@@ -817,7 +823,7 @@ public class SyncEngine implements NetRequest.IRhoSession
817
823
  getUserDB().executeSQL( "UPDATE client_info SET session = NULL");
818
824
  m_strSession = "";
819
825
 
820
- loadAllSources();
826
+ //loadAllSources();
821
827
  }
822
828
 
823
829
  public void setSyncServer(String url)throws Exception