rhodes 2.3.0 → 2.3.1.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/CHANGELOG +6 -0
  2. data/Manifest.txt +5819 -0
  3. data/README.md +2 -2
  4. data/Rakefile +9 -5
  5. data/doc/build.txt +7 -13
  6. data/doc/configuration.txt +4 -0
  7. data/doc/connect-to-web-services.txt +0 -1
  8. data/doc/device-caps.txt +2 -2
  9. data/doc/extensions.txt +2 -0
  10. data/doc/linea.txt +699 -0
  11. data/doc/rhom.txt +2 -1
  12. data/doc/synchronization.txt +39 -2
  13. data/doc/ui.txt +1 -0
  14. data/installer/README.html +1 -1
  15. data/lib/build/jake.rb +3 -0
  16. data/lib/framework/res/esri.wm.png +0 -0
  17. data/lib/framework/rho/render.rb +2 -0
  18. data/lib/framework/rho/rho.rb +17 -10
  19. data/lib/framework/rho/rhoapplication.rb +13 -3
  20. data/lib/framework/rho/rhoevent_bb.rb +3 -1
  21. data/lib/framework/rho/rhoevent_c.rb +4 -1
  22. data/lib/framework/rhodes.rb +1 -1
  23. data/lib/framework/rhom/rhom.rb +10 -0
  24. data/lib/framework/rhom/rhom_object_factory.rb +45 -0
  25. data/lib/framework/rhom/rhom_source.rb +1 -1
  26. data/lib/framework/version.rb +1 -1
  27. data/lib/rhodes.rb +1 -1
  28. data/platform/android/Rhodes/AndroidManifest.xml +2 -2
  29. data/platform/android/Rhodes/jni/include/rhodes/RhoClassFactory.h +1 -1
  30. data/platform/android/Rhodes/jni/src/RhoClassFactory.cpp +1 -1
  31. data/platform/android/Rhodes/jni/src/callbacks.cpp +9 -11
  32. data/platform/android/Rhodes/jni/src/event.cpp +17 -9
  33. data/platform/android/Rhodes/jni/src/mapview.cpp +34 -4
  34. data/platform/android/Rhodes/jni/src/rhodes.cpp +1 -1
  35. data/platform/android/Rhodes/res/drawable/esri.png +0 -0
  36. data/platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java +1 -0
  37. data/platform/android/Rhodes/src/com/rhomobile/rhodes/BaseActivity.java +3 -0
  38. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesActivity.java +8 -5
  39. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +80 -9
  40. data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/EventStore.java +29 -8
  41. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +4 -1
  42. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +50 -10
  43. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/MapView.java +3 -0
  44. data/platform/android/build/android.rake +45 -23
  45. data/platform/android/build/librhocommon_build.files +1 -0
  46. data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBStorage.java +6 -1
  47. data/platform/bb/Hsqldb/src/org/hsqldb/CachedDataRow.java +1 -1
  48. data/platform/bb/Hsqldb/src/org/hsqldb/CachedRow.java +3 -2
  49. data/platform/bb/Hsqldb/src/org/hsqldb/Row.java +1 -1
  50. data/platform/bb/Hsqldb/src/org/hsqldb/persist/CachedObject.java +1 -1
  51. data/platform/bb/Hsqldb/src/org/hsqldb/persist/DataFileCache.java +66 -16
  52. data/platform/bb/Hsqldb/src/org/hsqldb/persist/HsqlDatabaseProperties.java +1 -1
  53. data/platform/bb/RubyVM/src/com/rho/RhoCrypto.java +116 -0
  54. data/platform/bb/RubyVM/src/com/rho/ThreadQueue.java +39 -2
  55. data/platform/bb/RubyVM/src/com/rho/Tokenizer.java +11 -6
  56. data/platform/bb/RubyVM/src/com/rho/db/DBAdapter.java +157 -150
  57. data/platform/bb/RubyVM/src/com/rho/db/IDBStorage.java +1 -1
  58. data/platform/bb/RubyVM/src/com/rho/file/RhoFile.java +15 -0
  59. data/platform/bb/RubyVM/src/com/rho/net/AsyncHttp.java +35 -23
  60. data/platform/bb/RubyVM/src/com/rho/net/NetRequest.java +6 -9
  61. data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +54 -16
  62. data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +18 -9
  63. data/platform/bb/RubyVM/src/com/rho/sync/SyncSource.java +37 -59
  64. data/platform/bb/RubyVM/src/com/rho/sync/SyncThread.java +3 -0
  65. data/platform/bb/build/RubyVM_build.files +1 -0
  66. data/platform/bb/build/bb.rake +4 -5
  67. data/platform/bb/rhodes/platform/5.0/com/rho/RhodesApplicationPlatform.java +4 -1
  68. data/platform/bb/rhodes/platform/5.0/com/rho/db/SqliteStorage.java +8 -3
  69. data/platform/bb/rhodes/resources/esri.png +0 -0
  70. data/platform/bb/rhodes/src/com/rho/RhodesApplicationPlatform.java +2 -0
  71. data/platform/bb/rhodes/src/com/rho/db/SqliteStorage.java +8 -3
  72. data/platform/bb/rhodes/src/com/rho/rubyext/RhoCalendar.java +4 -1
  73. data/platform/bb/rhodes/src/com/rho/rubyext/System.java +2 -0
  74. data/platform/bb/rhodes/src/rhomobile/mapview/ESRIMapField.java +9 -0
  75. data/platform/iphone/Classes/Event/Event.m +12 -2
  76. data/platform/iphone/Classes/NativeBar.h +12 -11
  77. data/platform/iphone/Classes/NativeBar.m +13 -3
  78. data/platform/iphone/Classes/Rhodes.m +48 -10
  79. data/platform/iphone/Classes/SimpleMainView.h +1 -0
  80. data/platform/iphone/Classes/SimpleMainView.m +7 -1
  81. data/platform/iphone/Classes/SplitView/LeftViewController.m +3 -0
  82. data/platform/iphone/Classes/SplitView/RightViewController.m +11 -6
  83. data/platform/iphone/Classes/SplitView/SplittedMainView.m +8 -0
  84. data/platform/iphone/Classes/TabbedMainView.m +39 -3
  85. data/platform/iphone/Info.plist +1 -1
  86. data/platform/iphone/RhoLib/RhoLib.xcodeproj/project.pbxproj +4 -0
  87. data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +3 -3
  88. data/platform/shared/SyncClient/SyncClient.cpp +23 -23
  89. data/platform/shared/common/IRhoClassFactory.h +6 -4
  90. data/platform/shared/common/RhoAppAdapter.h +1 -1
  91. data/platform/shared/common/RhoFile.cpp +10 -0
  92. data/platform/shared/common/RhoFile.h +1 -0
  93. data/platform/shared/common/RhoMutexLock.h +1 -1
  94. data/platform/shared/common/RhoStd.h +5 -0
  95. data/platform/shared/common/RhoThread.cpp +2 -2
  96. data/platform/shared/common/RhoThread.h +1 -2
  97. data/platform/shared/common/RhodesApp.cpp +33 -55
  98. data/platform/shared/common/RhodesApp.h +0 -5
  99. data/platform/shared/common/RhodesAppBase.cpp +1 -1
  100. data/platform/shared/common/SplashScreen.cpp +1 -2
  101. data/platform/shared/common/ThreadQueue.cpp +31 -4
  102. data/platform/shared/common/ThreadQueue.h +10 -3
  103. data/platform/shared/common/Tokenizer.cpp +12 -8
  104. data/platform/shared/common/iphone/RhoClassFactory.cpp +5 -8
  105. data/platform/shared/common/iphone/RhoClassfactory.h +1 -1
  106. data/platform/shared/common/map/ESRIMapEngine.cpp +17 -7
  107. data/platform/shared/common/map/ESRIMapEngine.h +11 -1
  108. data/platform/shared/common/map/GoogleMapEngine.cpp +3 -3
  109. data/platform/shared/common/map/GoogleMapEngine.h +2 -2
  110. data/platform/shared/common/map/MapEngine.cpp +37 -0
  111. data/platform/shared/common/map/MapEngine.h +5 -0
  112. data/platform/shared/db/DBAdapter.cpp +113 -81
  113. data/platform/shared/db/DBAdapter.h +21 -5
  114. data/platform/shared/db/DBAttrManager.cpp +2 -2
  115. data/platform/shared/db/DBResult.h +28 -0
  116. data/platform/shared/net/AsyncHttp.cpp +48 -48
  117. data/platform/shared/net/AsyncHttp.h +15 -12
  118. data/platform/shared/net/CURLNetRequest.cpp +27 -105
  119. data/platform/shared/net/CURLNetRequest.h +8 -15
  120. data/platform/shared/net/INetRequest.cpp +122 -0
  121. data/platform/shared/net/INetRequest.h +96 -23
  122. data/platform/shared/net/ssl.cpp +1 -1
  123. data/platform/shared/ruby/ext/calendar/calendar.i +2 -2
  124. data/platform/shared/ruby/ext/calendar/calendar_wrap.c +30 -3
  125. data/platform/shared/rubyext/GeoLocation.cpp +4 -5
  126. data/platform/shared/rubyext/GeoLocation.h +4 -4
  127. data/platform/shared/rubyext/RhoAppAdapter.cpp +1 -1
  128. data/platform/shared/rubyext/System.cpp +3 -0
  129. data/platform/shared/sync/ClientRegister.cpp +6 -9
  130. data/platform/shared/sync/ClientRegister.h +8 -6
  131. data/platform/shared/sync/SyncEngine.cpp +54 -30
  132. data/platform/shared/sync/SyncEngine.h +9 -11
  133. data/platform/shared/sync/SyncNotify.cpp +19 -14
  134. data/platform/shared/sync/SyncNotify.h +5 -12
  135. data/platform/shared/sync/SyncSource.cpp +53 -76
  136. data/platform/shared/sync/SyncSource.h +5 -4
  137. data/platform/shared/sync/SyncThread.cpp +5 -7
  138. data/platform/shared/sync/SyncThread.h +2 -2
  139. data/platform/wm/RhoLib/RhoLib.vcproj +43 -39
  140. data/platform/wm/build/wm.rake +19 -17
  141. data/platform/wm/rhodes/AppManager.cpp +4 -4
  142. data/platform/wm/rhodes/MainWindow.cpp +0 -1
  143. data/platform/wm/rhodes/MapView/MapViewManager.cpp +4 -0
  144. data/platform/wm/rhodes/Vibrate.cpp +2 -2
  145. data/platform/wm/rhodes/Vibrate.h +1 -1
  146. data/platform/wm/rhodes/rho/common/RhoClassFactory.cpp +7 -5
  147. data/platform/wm/rhodes/rho/common/RhoClassFactory.h +3 -3
  148. data/platform/wm/rhodes/rho/net/NetRequestImpl.cpp +24 -10
  149. data/platform/wm/rhodes/rho/net/NetRequestImpl.h +49 -25
  150. data/platform/wm/rhodes/rho/rubyext/calendar.cpp +16 -2
  151. data/platform/wm/rhodes/rhodes.vcproj +77 -85
  152. data/platform/wm/tools/detool/detool.cpp +16 -6
  153. data/rakefile.rb +9 -5
  154. data/res/build-tools/detool.exe +0 -0
  155. data/rhodes.gemspec +2 -2
  156. data/spec/phone_spec/app/spec/blobsync_spec.rb +1 -0
  157. data/spec/phone_spec/app/spec/events_spec.rb +13 -2
  158. data/spec/phone_spec/app/spec/mapview_spec.rb +2 -2
  159. data/spec/phone_spec/app/spec/nativebar_spec.rb +3 -3
  160. data/spec/phone_spec/app/spec/navbar_spec.rb +3 -3
  161. data/spec/phone_spec/app/spec/rho_spec.rb +1 -1
  162. data/spec/phone_spec/app/spec/rhom_object_spec.rb +1 -1
  163. data/spec/phone_spec/app/spec/syncengine_spec.rb +219 -0
  164. data/spec/phone_spec/build.yml +1 -0
  165. metadata +15 -8
  166. data/platform/wm/rhodes/rho/net/NetRequest.cpp +0 -89
  167. data/platform/wm/rhodes/rho/net/NetRequest.h +0 -45
@@ -48,6 +48,7 @@ import org.hsqldb.rowio.RowInputInterface;
48
48
  import org.hsqldb.rowio.RowOutputBinary;
49
49
  import org.hsqldb.rowio.RowOutputInterface;
50
50
  import org.hsqldb.store.BitMap;
51
+ import com.rho.RhoCrypto;
51
52
 
52
53
  /**
53
54
  * Acts as a manager for CACHED table persistence.<p>
@@ -107,6 +108,10 @@ public class DataFileCache {
107
108
  public long maxDataFileSize;
108
109
 
109
110
  //
111
+
112
+ protected boolean m_bEncrypted = false;
113
+ RhoCrypto m_RhoCrypto;
114
+
110
115
  protected Storage dataFile;
111
116
  protected long fileFreePosition;
112
117
  protected int maxCacheSize; // number of Rows
@@ -161,6 +166,16 @@ public class DataFileCache {
161
166
  : (long) Integer.MAX_VALUE * 4;
162
167
  maxFreeBlocks = 1 << cacheFreeCountScale;
163
168
  dataFile = null;
169
+
170
+ String strEncryptionInfo = database.getURLProperties().getProperty(
171
+ HsqlDatabaseProperties.hsqldb_encrypted, "");
172
+
173
+ if ( strEncryptionInfo != null && strEncryptionInfo.length() > 0 )
174
+ {
175
+ m_bEncrypted = true;
176
+ cachedRowPadding = 16;
177
+ m_RhoCrypto = new RhoCrypto(strEncryptionInfo,128);
178
+ }
164
179
  }
165
180
 
166
181
  public void sync()throws IOException
@@ -378,6 +393,9 @@ public class DataFileCache {
378
393
  fa.removeElement(fileName);
379
394
  fa.removeElement(backupFileName);
380
395
  }
396
+
397
+ if ( m_RhoCrypto != null )
398
+ m_RhoCrypto.close();
381
399
  } catch (Exception e) {
382
400
  appLog.logContext(e, null);
383
401
 
@@ -560,8 +578,12 @@ public class DataFileCache {
560
578
 
561
579
  int size = object.getRealSize(rowOut);
562
580
 
563
- size = ((size + cachedRowPadding - 1) / cachedRowPadding)
564
- * cachedRowPadding;
581
+ if ( m_bEncrypted )
582
+ size = (((size-4) + cachedRowPadding - 1) / cachedRowPadding)
583
+ * cachedRowPadding + 4;
584
+ else
585
+ size = ((size + cachedRowPadding - 1) / cachedRowPadding)
586
+ * cachedRowPadding;
565
587
 
566
588
  object.setStorageSize(size);
567
589
 
@@ -658,16 +680,32 @@ public class DataFileCache {
658
680
  return dataFile.readInt();
659
681
  }
660
682
 
661
- protected synchronized RowInputBinary readObject(int pos)
662
- throws IOException {
663
-
683
+ private byte[] m_decryptBuffer;
684
+ protected synchronized RowInputBinary readObject(int pos) throws IOException
685
+ {
664
686
  dataFile.seek((long) pos * cacheFileScale);
665
-
666
687
  int size = dataFile.readInt();
667
688
 
668
689
  rowIn.resetRow(pos, size);
669
- dataFile.read(rowIn.getBuffer(), 4, size - 4);
670
-
690
+
691
+ if ( m_bEncrypted )
692
+ {
693
+ if ( m_decryptBuffer == null || m_decryptBuffer.length < size-4 )
694
+ m_decryptBuffer = new byte[size-4];
695
+
696
+ dataFile.read(m_decryptBuffer, 0, size-4);
697
+
698
+ try
699
+ {
700
+ m_RhoCrypto.decrypt(m_decryptBuffer, 0, size-4, rowIn.getBuffer(), 4 );
701
+ }catch(Exception exc)
702
+ {
703
+ database.logger.appLog.logContext(exc, "decrypt failed");
704
+ throw new IOException("decrypt page failed.");
705
+ }
706
+ }else
707
+ dataFile.read(rowIn.getBuffer(), 4, size - 4);
708
+
671
709
  return rowIn;
672
710
  }
673
711
 
@@ -675,9 +713,8 @@ public class DataFileCache {
675
713
  return cache.release(i);
676
714
  }
677
715
 
678
- protected synchronized void saveRows(CachedObject[] rows, int offset,
679
- int count) throws IOException {
680
-
716
+ protected synchronized void saveRows(CachedObject[] rows, int offset, int count) throws IOException
717
+ {
681
718
  if (count == 0) {
682
719
  return;
683
720
  }
@@ -707,14 +744,27 @@ public class DataFileCache {
707
744
  * Writes out the specified Row. Will write only the Nodes or both Nodes
708
745
  * and table row data depending on what is not already persisted to disk.
709
746
  */
710
- public synchronized void saveRow(CachedObject row) throws IOException {
711
-
747
+ public synchronized void saveRow(CachedObject row) throws IOException
748
+ {
712
749
  setFileModified();
713
750
  rowOut.reset();
714
- row.write(rowOut);
751
+ row.write(rowOut, m_bEncrypted);
752
+ int nOutSize = rowOut.getOutputStream().size();
753
+ byte[] outBuf = rowOut.getOutputStream().getBuffer();
754
+
755
+ if ( m_bEncrypted )
756
+ {
757
+ try{
758
+ m_RhoCrypto.encrypt(outBuf, 4, nOutSize-4, outBuf, 4 );
759
+ }catch(Exception exc)
760
+ {
761
+ database.logger.appLog.logContext(exc, "encrypt failed");
762
+ throw new IOException("encrypt page failed.");
763
+ }
764
+ }
765
+
715
766
  dataFile.seek((long) row.getPos() * cacheFileScale);
716
- dataFile.write(rowOut.getOutputStream().getBuffer(), 0,
717
- rowOut.getOutputStream().size());
767
+ dataFile.write(outBuf, 0, nOutSize);
718
768
  }
719
769
 
720
770
  /**
@@ -207,7 +207,7 @@ public class HsqlDatabaseProperties extends HsqlProperties {
207
207
  private static final String hsqldb_original_version =
208
208
  "hsqldb.original_version";
209
209
  public static final String hsqldb_script_format = "hsqldb.script_format";
210
-
210
+ public static final String hsqldb_encrypted = "hsqldb.encrypted";
211
211
  //
212
212
  private static final String sql_compare_in_locale =
213
213
  "sql.compare_in_locale";
@@ -0,0 +1,116 @@
1
+ package com.rho;
2
+
3
+ import net.rim.device.api.crypto.*;
4
+ import net.rim.device.api.io.NoCopyByteArrayOutputStream;
5
+ import java.io.ByteArrayInputStream;
6
+ import net.rim.device.api.system.PersistentObject;
7
+ import net.rim.device.api.system.PersistentStore;
8
+ import net.rim.device.api.util.StringUtilities;
9
+ import java.io.IOException;
10
+
11
+ public class RhoCrypto
12
+ {
13
+ AESKey m_key;
14
+ NoCopyByteArrayOutputStream m_outEncrypt;
15
+ BlockEncryptor m_cryptoStream;
16
+ AESDecryptorEngine m_decryptEngine;
17
+ String m_strStorageKey;
18
+ int m_nAlgLen;
19
+
20
+ public RhoCrypto(String strStorageKey, int nAlgLen )
21
+ {
22
+ m_strStorageKey = strStorageKey;
23
+ m_nAlgLen = nAlgLen;
24
+ }
25
+
26
+ public void close()
27
+ {
28
+ try
29
+ {
30
+ if ( m_cryptoStream != null )
31
+ m_cryptoStream.close();
32
+
33
+ if ( m_outEncrypt != null )
34
+ m_outEncrypt.close();
35
+ }catch(IOException exc)
36
+ {
37
+
38
+ }
39
+ }
40
+
41
+ public static boolean isKeyExist(String strStorageKey)
42
+ {
43
+ long lKey = makeKeyHash(strStorageKey);
44
+ PersistentObject persInfo = PersistentStore.getPersistentObject(lKey);
45
+ byte[] keyData = (byte[])persInfo.getContents();
46
+ return keyData != null;
47
+ }
48
+
49
+ private static long makeKeyHash(String strStorageKey)
50
+ {
51
+ String strInfoKey = strStorageKey + "rho_encrypt_key_706cf99e52031270f635657f0272b8b516a5ee721";
52
+ long lHash = StringUtilities.stringHashToLong(strInfoKey);
53
+
54
+ //System.out.println("makeKeyHash: " + strInfoKey + ":" + lHash);
55
+ return lHash;
56
+ }
57
+
58
+ private void init()throws Exception
59
+ {
60
+ if ( m_key != null )
61
+ return;
62
+
63
+ long lKey = makeKeyHash(m_strStorageKey);
64
+
65
+ PersistentObject persInfo = PersistentStore.getPersistentObject(lKey);
66
+ byte[] keyData = (byte[])persInfo.getContents();
67
+ if ( keyData == null )
68
+ {
69
+ m_key = new AESKey(m_nAlgLen);
70
+ keyData = m_key.getData();
71
+ persInfo.setContents(keyData);
72
+ persInfo.commit();
73
+ }else
74
+ {
75
+ m_key = new AESKey(keyData, 0, m_nAlgLen);
76
+ }
77
+
78
+ m_outEncrypt = new NoCopyByteArrayOutputStream();
79
+ m_cryptoStream = new BlockEncryptor( new AESEncryptorEngine( m_key ), m_outEncrypt );
80
+
81
+ m_decryptEngine = new AESDecryptorEngine( m_key );
82
+ }
83
+
84
+ public void encrypt(byte[] plainText, int offset, int dataLength, byte[] cipherText, int outOffset )throws Exception
85
+ {
86
+ init();
87
+
88
+ m_outEncrypt.reset();
89
+ m_cryptoStream.write( plainText, offset, dataLength );
90
+ m_cryptoStream.flush();
91
+
92
+ int finalLength = m_outEncrypt.size();
93
+ System.arraycopy( m_outEncrypt.getByteArray(), 0, cipherText, outOffset, finalLength );
94
+ }
95
+
96
+ public void decrypt(byte[] cipherText, int offset, int dataLength, byte[] plainText, int outOffset)throws Exception
97
+ {
98
+ init();
99
+ // Create the input stream based on the ciphertext
100
+ ByteArrayInputStream in = new ByteArrayInputStream( cipherText, offset, dataLength );
101
+
102
+ BlockDecryptor cryptoStream = null;
103
+ try
104
+ {
105
+ cryptoStream = new BlockDecryptor( m_decryptEngine, in );
106
+ cryptoStream.read( plainText, outOffset, dataLength );
107
+ }finally
108
+ {
109
+ if ( cryptoStream != null )
110
+ cryptoStream.close();
111
+
112
+ if ( in != null )
113
+ in.close();
114
+ }
115
+ }
116
+ }
@@ -20,13 +20,16 @@ public abstract class ThreadQueue extends RhoThread
20
20
  {
21
21
  public abstract boolean equals(IQueueCommand cmd);
22
22
  public abstract String toString();
23
+
24
+ public abstract void cancel();
23
25
  };
24
26
 
25
27
  private RhoClassFactory m_ptrFactory;
26
28
  private int m_nPollInterval;
27
29
  private Object m_mxStackCommands;// = new Mutex();
28
30
  private LinkedList m_stackCommands = new LinkedList();
29
-
31
+ private IQueueCommand m_pCurCmd;
32
+
30
33
  boolean m_bNoThreaded;
31
34
 
32
35
  public abstract void processCommand(IQueueCommand pCmd);
@@ -42,6 +45,10 @@ public abstract class ThreadQueue extends RhoThread
42
45
  public int getLastPollInterval(){ return 0;}
43
46
  public boolean isSkipDuplicateCmd() { return false; }
44
47
 
48
+ protected Object getCommandLock(){ return m_mxStackCommands; }
49
+ protected IQueueCommand getCurCommand(){ return m_pCurCmd; }
50
+ protected LinkedList/*Ptr<IQueueCommand*>&*/ getCommands(){ return m_stackCommands; }
51
+
45
52
  public ThreadQueue(RhoClassFactory factory)
46
53
  {
47
54
  super(factory);
@@ -89,6 +96,36 @@ public abstract class ThreadQueue extends RhoThread
89
96
  stopWait();
90
97
  }
91
98
 
99
+ public void stop(int nTimeoutToKill)
100
+ {
101
+ cancelCurrentCommand();
102
+ super.stop(nTimeoutToKill);
103
+ }
104
+
105
+ void cancelCurrentCommand()
106
+ {
107
+ synchronized(m_mxStackCommands)
108
+ {
109
+ if ( m_pCurCmd != null )
110
+ m_pCurCmd.cancel();
111
+ }
112
+ }
113
+
114
+ protected void processCommandBase(IQueueCommand pCmd)
115
+ {
116
+ synchronized(m_mxStackCommands)
117
+ {
118
+ m_pCurCmd = pCmd;
119
+ }
120
+
121
+ processCommand(pCmd);
122
+
123
+ synchronized(m_mxStackCommands)
124
+ {
125
+ m_pCurCmd = null;
126
+ }
127
+ }
128
+
92
129
  public void run()
93
130
  {
94
131
  LOG.INFO("Starting main routine...");
@@ -155,7 +192,7 @@ public abstract class ThreadQueue extends RhoThread
155
192
  pCmd = (IQueueCommand)m_stackCommands.removeFirst();
156
193
  }
157
194
 
158
- processCommand(pCmd);
195
+ processCommandBase(pCmd);
159
196
  }
160
197
  }
161
198
 
@@ -15,17 +15,22 @@ public class Tokenizer {
15
15
  }
16
16
 
17
17
  public String nextToken() {
18
- eatDelimeters();
18
+ //eatDelimeters();
19
19
  int start = m_position;
20
20
  while (m_position<m_length && m_delims.indexOf(m_str.charAt(m_position))==-1) {
21
21
  m_position++;
22
22
  }
23
23
 
24
- return m_str.substring(start,m_position);
24
+ String strToken = m_str.substring(start,m_position);
25
+ eatDelimeters();
26
+ return strToken;
25
27
  }
26
28
 
27
- public void eatDelimeters() {
28
- while (m_position<m_length) {
29
+ public void eatDelimeters()
30
+ {
31
+ if ( m_position == m_length )
32
+ m_position++;
33
+ else if (m_position<m_length) {
29
34
  char c = m_str.charAt(m_position);
30
35
  if (m_delims.indexOf(c)>=0) {
31
36
  m_position++;
@@ -37,8 +42,8 @@ public class Tokenizer {
37
42
  }
38
43
 
39
44
  public boolean hasMoreTokens() {
40
- eatDelimeters();
41
- return (m_position < m_length);
45
+ //eatDelimeters();
46
+ return (m_position <= m_length);
42
47
  }
43
48
 
44
49