1 package storagetesting;
2 
3 import com.sun.star.uno.XInterface;
4 import com.sun.star.lang.XMultiServiceFactory;
5 import com.sun.star.lang.XSingleServiceFactory;
6 
7 import com.sun.star.bridge.XUnoUrlResolver;
8 import com.sun.star.uno.UnoRuntime;
9 import com.sun.star.uno.XInterface;
10 
11 import com.sun.star.embed.*;
12 
13 import storagetesting.TestHelper;
14 import storagetesting.StorageTest;
15 
16 public class Test08 implements StorageTest {
17 
18 	XMultiServiceFactory m_xMSF;
19 	XSingleServiceFactory m_xStorageFactory;
20 	TestHelper m_aTestHelper;
21 
22 	public Test08( XMultiServiceFactory xMSF, XSingleServiceFactory xStorageFactory )
23 	{
24 		m_xMSF = xMSF;
25 		m_xStorageFactory = xStorageFactory;
26 		m_aTestHelper = new TestHelper( "Test08: " );
27 	}
28 
29     public boolean test()
30 	{
31 		try
32 		{
33 
34 			// create temporary storage based on arbitrary medium
35 			// after such a storage is closed it is lost
36 			Object oTempStorage = m_xStorageFactory.createInstance();
37 			XStorage xTempStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oTempStorage );
38 			if ( xTempStorage == null )
39 			{
40 				m_aTestHelper.Error( "Can't create temporary storage representation!" );
41 				return false;
42 			}
43 
44 			// set the global password for the root storage
45 			XEncryptionProtectedSource xTempStorageEncryption =
46 				(XEncryptionProtectedSource) UnoRuntime.queryInterface( XEncryptionProtectedSource.class, xTempStorage );
47 
48 			if ( xTempStorageEncryption == null )
49 			{
50 				m_aTestHelper.Message( "Optional interface XEncryptionProtectedSource is not implemented, feature can not be tested!" );
51 				return true;
52 			}
53 
54 			byte pPass1[] = { 1, 2, 3 };
55 			byte pPass2[] = { 3, 2, 1 };
56 
57 			try {
58 				xTempStorageEncryption.setEncryptionKey( pPass1 );
59 			}
60 			catch( Exception e )
61 			{
62 				m_aTestHelper.Error( "Can't set a common encryption key for the storage, exception:" + e );
63 				return false;
64 			}
65 
66 			// open a new substorage
67 			XStorage xTempSubStorage = m_aTestHelper.openSubStorage( xTempStorage,
68 																		"SubStorage1",
69 																		ElementModes.ELEMENT_WRITE );
70 			if ( xTempSubStorage == null )
71 			{
72 				m_aTestHelper.Error( "Can't create substorage!" );
73 				return false;
74 			}
75 
76 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
77 			// the stream will be encrypted with common password
78 			byte pBytes1[] = { 1, 1, 1, 1, 1 };
79 			if ( !m_aTestHelper.WBToSubstrOfEncr( xTempSubStorage, "SubStream1", "MediaType1", true, pBytes1, true ) )
80 				return false;
81 
82 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
83 			// the stream will not be encrypted
84 			byte pBytes2[] = { 2, 2, 2, 2, 2 };
85 			if ( !m_aTestHelper.WBToSubstrOfEncr( xTempSubStorage, "SubStream2", "MediaType2", false, pBytes2, false ) )
86 				return false;
87 
88 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
89 			// the stream will be compressed with own password
90 			byte pBytes3[] = { 3, 3, 3, 3, 3 };
91 
92 			// open a new substream, set "MediaType" and "Compressed" properties to it and write some bytes
93 			// the stream will not be encrypted
94 			if ( !m_aTestHelper.WriteBytesToEncrSubstream( xTempSubStorage, "SubStream3", "MediaType3", false, pBytes3, pPass2 ) )
95 				return false;
96 
97 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
98 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempStorage,
99 															"MediaType4",
100 															true,
101 															ElementModes.ELEMENT_READWRITE ) )
102 				return false;
103 
104 			// set "MediaType" property for storages and check that "IsRoot" and "OpenMode" properties are set correctly
105 			if ( !m_aTestHelper.setStorageTypeAndCheckProps( xTempSubStorage,
106 															"MediaType5",
107 															false,
108 															ElementModes.ELEMENT_WRITE ) )
109 				return false;
110 
111 			// create temporary file
112 			String sTempFileURL = m_aTestHelper.CreateTempFile( m_xMSF );
113 			if ( sTempFileURL == null || sTempFileURL == "" )
114 			{
115 				m_aTestHelper.Error( "No valid temporary file was created!" );
116 				return false;
117 			}
118 
119 			// create temporary storage based on a previously created temporary file
120 			Object pArgs[] = new Object[2];
121 			pArgs[0] = (Object) sTempFileURL;
122 			pArgs[1] = new Integer( ElementModes.ELEMENT_WRITE );
123 
124 			Object oTempFileStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
125 			XStorage xTempFileStorage = (XStorage)UnoRuntime.queryInterface( XStorage.class, oTempFileStorage );
126 			if ( xTempFileStorage == null )
127 			{
128 				m_aTestHelper.Error( "Can't create storage based on temporary file!" );
129 				return false;
130 			}
131 
132 			// copy xTempStorage to xTempFileStorage
133 			// xTempFileStorage will be automatically commited
134 			if ( !m_aTestHelper.copyStorage( xTempStorage, xTempFileStorage ) )
135 				return false;
136 
137 			// dispose used storages to free resources
138 			if ( !m_aTestHelper.disposeStorage( xTempStorage ) || !m_aTestHelper.disposeStorage( xTempFileStorage ) )
139 				return false;
140 
141 			// ================================================
142 			// now check all the written and copied information
143 			// ================================================
144 
145 			// the temporary file must not be locked any more after storage disposing
146 			pArgs[1] = new Integer( ElementModes.ELEMENT_READ );
147 			Object oResultStorage = m_xStorageFactory.createInstanceWithArguments( pArgs );
148 			XStorage xResultStorage = (XStorage) UnoRuntime.queryInterface( XStorage.class, oResultStorage );
149 			if ( xResultStorage == null )
150 			{
151 				m_aTestHelper.Error( "Can't reopen storage based on temporary file!" );
152 				return false;
153 			}
154 
155 			if ( !m_aTestHelper.checkStorageProperties( xResultStorage, "MediaType4", true, ElementModes.ELEMENT_READ ) )
156 				return false;
157 
158 			// open existing substorage
159 			XStorage xResultSubStorage = m_aTestHelper.openSubStorage( xResultStorage,
160 																		"SubStorage1",
161 																		ElementModes.ELEMENT_READ );
162 			if ( xResultSubStorage == null )
163 			{
164 				m_aTestHelper.Error( "Can't open existing substorage!" );
165 				return false;
166 			}
167 
168 			if ( !m_aTestHelper.checkStorageProperties( xResultSubStorage, "MediaType5", false, ElementModes.ELEMENT_READ ) )
169 				return false;
170 
171 			// set the global password for the root storage
172 			XEncryptionProtectedSource xResultStorageEncryption =
173 				(XEncryptionProtectedSource) UnoRuntime.queryInterface( XEncryptionProtectedSource.class, xResultStorage );
174 
175 			if ( xResultStorageEncryption == null )
176 			{
177 				m_aTestHelper.Error( "XEncryptionProtectedSource was successfully used already, so it must be supported!" );
178 				return false;
179 			}
180 
181 			try {
182 				xResultStorageEncryption.setEncryptionKey( pPass2 );
183 			}
184 			catch( Exception e )
185 			{
186 				m_aTestHelper.Error( "Can't set a common encryption key for the storage, exception:" + e );
187 				return false;
188 			}
189 
190 			if ( !m_aTestHelper.checkEncrStream( xResultSubStorage, "SubStream1", "MediaType1", pBytes1, pPass1 ) )
191 				return false;
192 
193 			if ( !m_aTestHelper.checkStream( xResultSubStorage, "SubStream2", "MediaType2", pBytes2 ) )
194 				return false;
195 
196 			// the common root storage password should allow to open this stream
197 			if ( !m_aTestHelper.checkStream( xResultSubStorage, "SubStream3", "MediaType3", pBytes3 ) )
198 				return false;
199 
200 			// dispose used storages to free resources
201 			if ( !m_aTestHelper.disposeStorage( xResultStorage ) )
202 				return false;
203 
204 			return true;
205 		}
206 		catch( Exception e )
207 		{
208 			m_aTestHelper.Error( "Exception: " + e );
209 			return false;
210 		}
211     }
212 }
213 
214