1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_io.hxx"
26 #include <stdio.h>
27 #include <osl/time.h>
28
29 #include <osl/diagnose.h>
30 #include <osl/thread.hxx>
31
32 #include <cppuhelper/servicefactory.hxx>
33
34 #include <com/sun/star/lang/XComponent.hpp>
35
36 #include <com/sun/star/registry/XImplementationRegistration.hpp>
37
38 #include <com/sun/star/connection/XConnector.hpp>
39 #include <com/sun/star/connection/XAcceptor.hpp>
40
41 using namespace ::osl;
42 using namespace ::rtl;
43 using namespace ::cppu;
44 using namespace ::com::sun::star::uno;
45 using namespace ::com::sun::star::io;
46 using namespace ::com::sun::star::lang;
47 using namespace ::com::sun::star::registry;
48 using namespace ::com::sun::star::connection;
49
50
51 class MyThread :
52 public Thread
53 {
54 public:
MyThread(const Reference<XAcceptor> & r,const OUString & sConnectionDescription)55 MyThread( const Reference< XAcceptor > &r , const OUString & sConnectionDescription) :
56 m_rAcceptor( r ),
57 m_sConnectionDescription( sConnectionDescription )
58 {}
59 virtual void SAL_CALL run();
60
61 Reference < XAcceptor > m_rAcceptor;
62 private:
63 Reference < XConnection > m_rConnection;
64 OUString m_sConnectionDescription;
65 };
66
doWrite(const Reference<XConnection> & r)67 void doWrite( const Reference < XConnection > &r )
68 {
69 Sequence < sal_Int8 > seq(10);
70 for( sal_Int32 i = 0 ; i < 10 ; i ++ )
71 {
72 seq.getArray()[i] = i;
73 }
74
75 r->write( seq );
76 }
77
doRead(const Reference<XConnection> & r)78 void doRead( const Reference < XConnection > &r )
79 {
80 Sequence < sal_Int8 > seq(10);
81
82 OSL_ASSERT( 10 == r->read( seq , 10 ) );
83
84 for( sal_Int32 i = 0 ; i < 10 ; i ++ )
85 {
86 OSL_ASSERT( seq.getConstArray()[i] == i );
87 }
88 }
89
90
run()91 void MyThread::run()
92 {
93 try
94 {
95 m_rConnection = m_rAcceptor->accept( m_sConnectionDescription );
96 }
97 catch ( Exception &e)
98 {
99 OString tmp= OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US );
100 printf( "Exception was thrown by acceptor thread: %s\n", tmp.getStr() );
101 }
102
103 if( m_rConnection.is() )
104 {
105 Sequence < sal_Int8 > seq(12);
106 try
107 {
108 doWrite( m_rConnection );
109 doRead( m_rConnection );
110 }
111 catch (... )
112 {
113 printf( "unknown exception was thrown\n" );
114 throw;
115 }
116 }
117
118 }
119
120
121
122
123
testConnection(const OUString & sConnectionDescription,const Reference<XAcceptor> & rAcceptor,const Reference<XConnector> & rConnector)124 void testConnection( const OUString &sConnectionDescription ,
125 const Reference < XAcceptor > &rAcceptor,
126 const Reference < XConnector > &rConnector )
127 {
128 {
129 MyThread thread( rAcceptor , sConnectionDescription );
130 thread.create();
131
132 sal_Bool bGotit = sal_False;
133 Reference < XConnection > r;
134
135 while( ! bGotit )
136 {
137 try
138 {
139 // Why is this wait necessary ????
140 TimeValue value = {1,0};
141 osl_waitThread( &value );
142 r = rConnector->connect( sConnectionDescription );
143 OSL_ASSERT( r.is() );
144 doWrite( r );
145 doRead( r );
146 bGotit = sal_True;
147 }
148 catch( ... )
149 {
150 printf( "Couldn't connect, retrying ...\n" );
151
152 }
153 }
154
155 r->close();
156
157 try
158 {
159 Sequence < sal_Int8 > seq(10);
160 r->write( seq );
161 OSL_ENSURE( 0 , "expected exception not thrown" );
162 }
163 catch ( IOException & )
164 {
165 // everything is ok
166 }
167 catch ( ... )
168 {
169 OSL_ENSURE( 0 , "wrong exception was thrown" );
170 }
171
172 thread.join();
173 }
174 }
175
176
177 #if (defined UNX) || (defined OS2)
main(int argc,char * argv[])178 int main( int argc, char * argv[] )
179 #else
180 int __cdecl main( int argc, char * argv[] )
181 #endif
182 {
183 Reference< XMultiServiceFactory > xMgr(
184 createRegistryServiceFactory( OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")) ) );
185
186 Reference< XImplementationRegistration > xImplReg(
187 xMgr->createInstance( OUString::createFromAscii("com.sun.star.registry.ImplementationRegistration") ), UNO_QUERY );
188 OSL_ENSURE( xImplReg.is(), "### no impl reg!" );
189
190 OUString aLibName =
191 OUString::createFromAscii( "connector.uno" SAL_DLLEXTENSION );
192 xImplReg->registerImplementation(
193 OUString::createFromAscii("com.sun.star.loader.SharedLibrary"), aLibName, Reference< XSimpleRegistry >() );
194
195 aLibName = OUString::createFromAscii( "acceptor.uno" SAL_DLLEXTENSION );
196 xImplReg->registerImplementation(
197 OUString::createFromAscii("com.sun.star.loader.SharedLibrary"), aLibName, Reference< XSimpleRegistry >() );
198
199 Reference < XAcceptor > rAcceptor(
200 xMgr->createInstance(
201 OUString::createFromAscii("com.sun.star.connection.Acceptor" ) ) , UNO_QUERY );
202
203 Reference < XAcceptor > rAcceptorPipe(
204 xMgr->createInstance(
205 OUString::createFromAscii("com.sun.star.connection.Acceptor" ) ) , UNO_QUERY );
206
207 Reference < XConnector > rConnector(
208 xMgr->createInstance( OUString::createFromAscii("com.sun.star.connection.Connector") ) , UNO_QUERY );
209
210
211 printf( "Testing sockets" );
212 fflush( stdout );
213 testConnection( OUString::createFromAscii("socket,host=localhost,port=2001"), rAcceptor , rConnector );
214 printf( " Done\n" );
215
216 printf( "Testing pipe" );
217 fflush( stdout );
218 testConnection( OUString::createFromAscii("pipe,name=bla") , rAcceptorPipe , rConnector );
219 printf( " Done\n" );
220
221 // check, if errornous strings make any problem
222 rAcceptor = Reference< XAcceptor > (
223 xMgr->createInstance( OUString::createFromAscii( "com.sun.star.connection.Acceptor" ) ),
224 UNO_QUERY );
225
226 try
227 {
228 rAcceptor->accept( OUString() );
229 OSL_ENSURE( 0 , "empty connection string" );
230 }
231 catch( IllegalArgumentException & )
232 {
233 // everything is fine
234 }
235 catch( ... )
236 {
237 OSL_ENSURE( 0, "unexpected akexception with empty connection string" );
238 }
239
240 try
241 {
242 rConnector->connect( OUString() );
243 OSL_ENSURE( 0 , "empty connection string" );
244 }
245 catch( ConnectionSetupException & )
246 {
247 // everything is fine
248 }
249 catch( ... )
250 {
251 OSL_ENSURE( 0, "unexpected exception with empty connection string" );
252 }
253
254
255 MyThread thread( rAcceptor , OUString::createFromAscii("socket,host=localhost,port=2001") );
256 thread.create();
257
258 TimeValue value = {0,1};
259 osl_waitThread( &value );
260 try
261 {
262 rAcceptor->accept( OUString::createFromAscii("socket,host=localhost,port=2001") );
263 OSL_ENSURE( 0 , "already existing exception expected" );
264 }
265 catch( AlreadyAcceptingException & e)
266 {
267 // everything is fine
268 }
269 catch( ... )
270 {
271 OSL_ENSURE( 0, "unknown exception, already existing existing expected" );
272 }
273
274 rAcceptor->stopAccepting();
275 thread.join();
276
277 Reference < XComponent > rComp( xMgr , UNO_QUERY );
278 if( rComp.is() )
279 {
280 rComp->dispose();
281 }
282 }
283