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.
- data/CHANGELOG +6 -0
- data/Manifest.txt +5819 -0
- data/README.md +2 -2
- data/Rakefile +9 -5
- data/doc/build.txt +7 -13
- data/doc/configuration.txt +4 -0
- data/doc/connect-to-web-services.txt +0 -1
- data/doc/device-caps.txt +2 -2
- data/doc/extensions.txt +2 -0
- data/doc/linea.txt +699 -0
- data/doc/rhom.txt +2 -1
- data/doc/synchronization.txt +39 -2
- data/doc/ui.txt +1 -0
- data/installer/README.html +1 -1
- data/lib/build/jake.rb +3 -0
- data/lib/framework/res/esri.wm.png +0 -0
- data/lib/framework/rho/render.rb +2 -0
- data/lib/framework/rho/rho.rb +17 -10
- data/lib/framework/rho/rhoapplication.rb +13 -3
- data/lib/framework/rho/rhoevent_bb.rb +3 -1
- data/lib/framework/rho/rhoevent_c.rb +4 -1
- data/lib/framework/rhodes.rb +1 -1
- data/lib/framework/rhom/rhom.rb +10 -0
- data/lib/framework/rhom/rhom_object_factory.rb +45 -0
- data/lib/framework/rhom/rhom_source.rb +1 -1
- data/lib/framework/version.rb +1 -1
- data/lib/rhodes.rb +1 -1
- data/platform/android/Rhodes/AndroidManifest.xml +2 -2
- data/platform/android/Rhodes/jni/include/rhodes/RhoClassFactory.h +1 -1
- data/platform/android/Rhodes/jni/src/RhoClassFactory.cpp +1 -1
- data/platform/android/Rhodes/jni/src/callbacks.cpp +9 -11
- data/platform/android/Rhodes/jni/src/event.cpp +17 -9
- data/platform/android/Rhodes/jni/src/mapview.cpp +34 -4
- data/platform/android/Rhodes/jni/src/rhodes.cpp +1 -1
- data/platform/android/Rhodes/res/drawable/esri.png +0 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java +1 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/BaseActivity.java +3 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesActivity.java +8 -5
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +80 -9
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/EventStore.java +29 -8
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +4 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +50 -10
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/MapView.java +3 -0
- data/platform/android/build/android.rake +45 -23
- data/platform/android/build/librhocommon_build.files +1 -0
- data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBStorage.java +6 -1
- data/platform/bb/Hsqldb/src/org/hsqldb/CachedDataRow.java +1 -1
- data/platform/bb/Hsqldb/src/org/hsqldb/CachedRow.java +3 -2
- data/platform/bb/Hsqldb/src/org/hsqldb/Row.java +1 -1
- data/platform/bb/Hsqldb/src/org/hsqldb/persist/CachedObject.java +1 -1
- data/platform/bb/Hsqldb/src/org/hsqldb/persist/DataFileCache.java +66 -16
- data/platform/bb/Hsqldb/src/org/hsqldb/persist/HsqlDatabaseProperties.java +1 -1
- data/platform/bb/RubyVM/src/com/rho/RhoCrypto.java +116 -0
- data/platform/bb/RubyVM/src/com/rho/ThreadQueue.java +39 -2
- data/platform/bb/RubyVM/src/com/rho/Tokenizer.java +11 -6
- data/platform/bb/RubyVM/src/com/rho/db/DBAdapter.java +157 -150
- data/platform/bb/RubyVM/src/com/rho/db/IDBStorage.java +1 -1
- data/platform/bb/RubyVM/src/com/rho/file/RhoFile.java +15 -0
- data/platform/bb/RubyVM/src/com/rho/net/AsyncHttp.java +35 -23
- data/platform/bb/RubyVM/src/com/rho/net/NetRequest.java +6 -9
- data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +54 -16
- data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +18 -9
- data/platform/bb/RubyVM/src/com/rho/sync/SyncSource.java +37 -59
- data/platform/bb/RubyVM/src/com/rho/sync/SyncThread.java +3 -0
- data/platform/bb/build/RubyVM_build.files +1 -0
- data/platform/bb/build/bb.rake +4 -5
- data/platform/bb/rhodes/platform/5.0/com/rho/RhodesApplicationPlatform.java +4 -1
- data/platform/bb/rhodes/platform/5.0/com/rho/db/SqliteStorage.java +8 -3
- data/platform/bb/rhodes/resources/esri.png +0 -0
- data/platform/bb/rhodes/src/com/rho/RhodesApplicationPlatform.java +2 -0
- data/platform/bb/rhodes/src/com/rho/db/SqliteStorage.java +8 -3
- data/platform/bb/rhodes/src/com/rho/rubyext/RhoCalendar.java +4 -1
- data/platform/bb/rhodes/src/com/rho/rubyext/System.java +2 -0
- data/platform/bb/rhodes/src/rhomobile/mapview/ESRIMapField.java +9 -0
- data/platform/iphone/Classes/Event/Event.m +12 -2
- data/platform/iphone/Classes/NativeBar.h +12 -11
- data/platform/iphone/Classes/NativeBar.m +13 -3
- data/platform/iphone/Classes/Rhodes.m +48 -10
- data/platform/iphone/Classes/SimpleMainView.h +1 -0
- data/platform/iphone/Classes/SimpleMainView.m +7 -1
- data/platform/iphone/Classes/SplitView/LeftViewController.m +3 -0
- data/platform/iphone/Classes/SplitView/RightViewController.m +11 -6
- data/platform/iphone/Classes/SplitView/SplittedMainView.m +8 -0
- data/platform/iphone/Classes/TabbedMainView.m +39 -3
- data/platform/iphone/Info.plist +1 -1
- data/platform/iphone/RhoLib/RhoLib.xcodeproj/project.pbxproj +4 -0
- data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +3 -3
- data/platform/shared/SyncClient/SyncClient.cpp +23 -23
- data/platform/shared/common/IRhoClassFactory.h +6 -4
- data/platform/shared/common/RhoAppAdapter.h +1 -1
- data/platform/shared/common/RhoFile.cpp +10 -0
- data/platform/shared/common/RhoFile.h +1 -0
- data/platform/shared/common/RhoMutexLock.h +1 -1
- data/platform/shared/common/RhoStd.h +5 -0
- data/platform/shared/common/RhoThread.cpp +2 -2
- data/platform/shared/common/RhoThread.h +1 -2
- data/platform/shared/common/RhodesApp.cpp +33 -55
- data/platform/shared/common/RhodesApp.h +0 -5
- data/platform/shared/common/RhodesAppBase.cpp +1 -1
- data/platform/shared/common/SplashScreen.cpp +1 -2
- data/platform/shared/common/ThreadQueue.cpp +31 -4
- data/platform/shared/common/ThreadQueue.h +10 -3
- data/platform/shared/common/Tokenizer.cpp +12 -8
- data/platform/shared/common/iphone/RhoClassFactory.cpp +5 -8
- data/platform/shared/common/iphone/RhoClassfactory.h +1 -1
- data/platform/shared/common/map/ESRIMapEngine.cpp +17 -7
- data/platform/shared/common/map/ESRIMapEngine.h +11 -1
- data/platform/shared/common/map/GoogleMapEngine.cpp +3 -3
- data/platform/shared/common/map/GoogleMapEngine.h +2 -2
- data/platform/shared/common/map/MapEngine.cpp +37 -0
- data/platform/shared/common/map/MapEngine.h +5 -0
- data/platform/shared/db/DBAdapter.cpp +113 -81
- data/platform/shared/db/DBAdapter.h +21 -5
- data/platform/shared/db/DBAttrManager.cpp +2 -2
- data/platform/shared/db/DBResult.h +28 -0
- data/platform/shared/net/AsyncHttp.cpp +48 -48
- data/platform/shared/net/AsyncHttp.h +15 -12
- data/platform/shared/net/CURLNetRequest.cpp +27 -105
- data/platform/shared/net/CURLNetRequest.h +8 -15
- data/platform/shared/net/INetRequest.cpp +122 -0
- data/platform/shared/net/INetRequest.h +96 -23
- data/platform/shared/net/ssl.cpp +1 -1
- data/platform/shared/ruby/ext/calendar/calendar.i +2 -2
- data/platform/shared/ruby/ext/calendar/calendar_wrap.c +30 -3
- data/platform/shared/rubyext/GeoLocation.cpp +4 -5
- data/platform/shared/rubyext/GeoLocation.h +4 -4
- data/platform/shared/rubyext/RhoAppAdapter.cpp +1 -1
- data/platform/shared/rubyext/System.cpp +3 -0
- data/platform/shared/sync/ClientRegister.cpp +6 -9
- data/platform/shared/sync/ClientRegister.h +8 -6
- data/platform/shared/sync/SyncEngine.cpp +54 -30
- data/platform/shared/sync/SyncEngine.h +9 -11
- data/platform/shared/sync/SyncNotify.cpp +19 -14
- data/platform/shared/sync/SyncNotify.h +5 -12
- data/platform/shared/sync/SyncSource.cpp +53 -76
- data/platform/shared/sync/SyncSource.h +5 -4
- data/platform/shared/sync/SyncThread.cpp +5 -7
- data/platform/shared/sync/SyncThread.h +2 -2
- data/platform/wm/RhoLib/RhoLib.vcproj +43 -39
- data/platform/wm/build/wm.rake +19 -17
- data/platform/wm/rhodes/AppManager.cpp +4 -4
- data/platform/wm/rhodes/MainWindow.cpp +0 -1
- data/platform/wm/rhodes/MapView/MapViewManager.cpp +4 -0
- data/platform/wm/rhodes/Vibrate.cpp +2 -2
- data/platform/wm/rhodes/Vibrate.h +1 -1
- data/platform/wm/rhodes/rho/common/RhoClassFactory.cpp +7 -5
- data/platform/wm/rhodes/rho/common/RhoClassFactory.h +3 -3
- data/platform/wm/rhodes/rho/net/NetRequestImpl.cpp +24 -10
- data/platform/wm/rhodes/rho/net/NetRequestImpl.h +49 -25
- data/platform/wm/rhodes/rho/rubyext/calendar.cpp +16 -2
- data/platform/wm/rhodes/rhodes.vcproj +77 -85
- data/platform/wm/tools/detool/detool.cpp +16 -6
- data/rakefile.rb +9 -5
- data/res/build-tools/detool.exe +0 -0
- data/rhodes.gemspec +2 -2
- data/spec/phone_spec/app/spec/blobsync_spec.rb +1 -0
- data/spec/phone_spec/app/spec/events_spec.rb +13 -2
- data/spec/phone_spec/app/spec/mapview_spec.rb +2 -2
- data/spec/phone_spec/app/spec/nativebar_spec.rb +3 -3
- data/spec/phone_spec/app/spec/navbar_spec.rb +3 -3
- data/spec/phone_spec/app/spec/rho_spec.rb +1 -1
- data/spec/phone_spec/app/spec/rhom_object_spec.rb +1 -1
- data/spec/phone_spec/app/spec/syncengine_spec.rb +219 -0
- data/spec/phone_spec/build.yml +1 -0
- metadata +15 -8
- data/platform/wm/rhodes/rho/net/NetRequest.cpp +0 -89
- 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
|
-
|
564
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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(
|
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
|
-
|
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
|
-
|
24
|
+
String strToken = m_str.substring(start,m_position);
|
25
|
+
eatDelimeters();
|
26
|
+
return strToken;
|
25
27
|
}
|
26
28
|
|
27
|
-
public void eatDelimeters()
|
28
|
-
|
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
|
45
|
+
//eatDelimeters();
|
46
|
+
return (m_position <= m_length);
|
42
47
|
}
|
43
48
|
|
44
49
|
|