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 #include <sal/main.h> 25 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 26 #include <com/sun/star/awt/ImageScaleMode.hpp> 27 28 #include <vcl/event.hxx> 29 #include <vcl/svapp.hxx> 30 #include <vcl/wrkwin.hxx> 31 #include <vcl/button.hxx> 32 #include <vcl/lstbox.hxx> 33 #include <vcl/imgctrl.hxx> 34 #include <vcl/bitmapex.hxx> 35 #include <tools/extendapplicationenvironment.hxx> 36 #include <tools/stream.hxx> 37 38 #include <rtl/strbuf.hxx> 39 #include <rtl/ustrbuf.hxx> 40 41 #include <math.h> 42 43 #include <comphelper/processfactory.hxx> 44 #include <cppuhelper/servicefactory.hxx> 45 #include <cppuhelper/bootstrap.hxx> 46 #include "ucbhelper/contentbroker.hxx" 47 #include "ucbhelper/configurationkeys.hxx" 48 49 #include <errno.h> 50 #include <unistd.h> 51 #include <stdio.h> 52 #include <sys/types.h> 53 #include <sys/socket.h> 54 #include <netinet/in.h> 55 56 57 using namespace rtl; 58 using namespace cppu; 59 using namespace comphelper; 60 using namespace ::com::sun::star::uno; 61 using namespace ::com::sun::star::lang; 62 // ----------------------------------------------------------------------- 63 64 // Forward declaration 65 void Main(); 66 67 // ----------------------------------------------------------------------- 68 69 SAL_IMPLEMENT_MAIN() 70 { 71 tools::extendApplicationEnvironment(); 72 73 //------------------------------------------------- 74 // create the global service-manager 75 //------------------------------------------------- 76 Reference< XMultiServiceFactory > xFactory; 77 try 78 { 79 Reference< XComponentContext > xCtx = defaultBootstrap_InitialComponentContext(); 80 xFactory = Reference< XMultiServiceFactory >( xCtx->getServiceManager(), UNO_QUERY ); 81 if( xFactory.is() ) 82 setProcessServiceFactory( xFactory ); 83 } 84 catch( com::sun::star::uno::Exception& rExc) 85 { 86 } 87 88 if( ! xFactory.is() ) 89 { 90 fprintf( stderr, "Could not bootstrap UNO, installation must be in disorder. Exiting.\n" ); 91 exit( 1 ); 92 } 93 94 /* 95 * Create UCB. 96 */ 97 Sequence< Any > aArgs( 2 ); 98 aArgs[ 0 ] <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL ); 99 aArgs[ 1 ] <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE ); 100 #if OSL_DEBUG_LEVEL > 1 101 sal_Bool bSuccess = 102 #endif 103 ::ucbhelper::ContentBroker::initialize( xFactory, aArgs ); 104 105 #if OSL_DEBUG_LEVEL > 1 106 if ( !bSuccess ) 107 { 108 fprintf( stderr, "Error creating UCB, installation must be in disorder. Exiting.\n" ); 109 exit( 1 ); 110 } 111 #endif 112 113 InitVCL( xFactory ); 114 ::Main(); 115 DeInitVCL(); 116 117 return 0; 118 } 119 120 // ----------------------------------------------------------------------- 121 122 class MyWin : public WorkWindow 123 { 124 PushButton m_aListButton; 125 ListBox m_aSvpBitmaps; 126 ImageControl m_aImage; 127 PushButton m_aQuitButton; 128 public: 129 MyWin( Window* pParent, WinBits nWinStyle ); 130 131 void MouseMove( const MouseEvent& rMEvt ); 132 void MouseButtonDown( const MouseEvent& rMEvt ); 133 void MouseButtonUp( const MouseEvent& rMEvt ); 134 void KeyInput( const KeyEvent& rKEvt ); 135 void KeyUp( const KeyEvent& rKEvt ); 136 void Paint( const Rectangle& rRect ); 137 void Resize(); 138 139 sal_Bool Close(); 140 141 void parseList( const rtl::OString& rList ); 142 rtl::OString processCommand( const rtl::OString& rCommand ); 143 144 DECL_LINK( ListHdl, Button* ); 145 DECL_LINK( SelectHdl, ListBox* ); 146 DECL_LINK( QuitHdl, Button* ); 147 }; 148 149 // ----------------------------------------------------------------------- 150 151 void Main() 152 { 153 MyWin aMainWin( NULL, WB_STDWORK ); 154 aMainWin.SetText( XubString( RTL_CONSTASCII_USTRINGPARAM( "SvpClient" ) ) ); 155 aMainWin.Show(); 156 157 Application::Execute(); 158 } 159 160 // ----------------------------------------------------------------------- 161 162 MyWin::MyWin( Window* pParent, WinBits nWinStyle ) : 163 WorkWindow( pParent, nWinStyle ), 164 m_aListButton( this, 0 ), 165 m_aSvpBitmaps( this, WB_BORDER ), 166 m_aImage( this, WB_BORDER ), 167 m_aQuitButton( this, 0 ) 168 { 169 m_aListButton.SetPosSizePixel( Point( 10, 10 ), Size( 120, 25 ) ); 170 m_aListButton.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "List Elements" ) ) ); 171 m_aListButton.SetClickHdl( LINK( this, MyWin, ListHdl ) ); 172 m_aListButton.Show(); 173 174 m_aSvpBitmaps.SetPosSizePixel( Point( 10, 40 ), Size( 150, 150 ) ); 175 m_aSvpBitmaps.SetSelectHdl( LINK( this, MyWin, SelectHdl ) ); 176 m_aSvpBitmaps.Show(); 177 178 m_aImage.SetPosSizePixel( Point( 170, 10 ), Size( 400, 400 ) ); 179 m_aImage.SetScaleMode( com::sun::star::awt::ImageScaleMode::None ); 180 m_aImage.Show(); 181 182 m_aQuitButton.SetPosSizePixel( Point( 10, 300 ), Size( 120,25 ) ); 183 m_aQuitButton.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "Quit SVP server" ) ) ); 184 m_aQuitButton.SetClickHdl( LINK( this, MyWin, QuitHdl ) ); 185 m_aQuitButton.Show(); 186 } 187 188 sal_Bool MyWin::Close() 189 { 190 sal_Bool bRet = WorkWindow::Close(); 191 if( bRet ) 192 Application::Quit(); 193 return bRet; 194 } 195 196 void MyWin::parseList( const rtl::OString& rList ) 197 { 198 sal_Int32 nTokenPos = 0; 199 rtl::OUString aElementType; 200 m_aSvpBitmaps.Clear(); 201 while( nTokenPos >= 0 ) 202 { 203 rtl::OString aLine = rList.getToken( 0, '\n', nTokenPos ); 204 if( ! aLine.getLength() || *aLine.getStr() == '#' ) 205 continue; 206 207 if( aLine.compareTo( "ElementType: ", 13 ) == 0 ) 208 aElementType = rtl::OStringToOUString( aLine.copy( 13 ), RTL_TEXTENCODING_ASCII_US ); 209 else 210 { 211 rtl::OUStringBuffer aNewElement( 64 ); 212 aNewElement.append( aElementType ); 213 aNewElement.appendAscii( ": " ); 214 aNewElement.append( rtl::OStringToOUString( aLine, RTL_TEXTENCODING_ASCII_US ) ); 215 m_aSvpBitmaps.InsertEntry( aNewElement.makeStringAndClear() ); 216 } 217 } 218 } 219 220 rtl::OString MyWin::processCommand( const rtl::OString& rCommand ) 221 { 222 static const char* pEnv = getenv("SVP_LISTENER_PORT"); 223 rtl::OStringBuffer aAnswer; 224 int nPort = (pEnv && *pEnv) ? atoi(pEnv) : 8000; 225 int nSocket = socket( PF_INET, SOCK_STREAM, 0 ); 226 if( nSocket >= 0) 227 { 228 struct sockaddr_in addr; 229 memset(&addr, 0, sizeof(struct sockaddr_in)); 230 addr.sin_family = AF_INET; 231 addr.sin_port = htons(nPort); 232 addr.sin_addr.s_addr = INADDR_ANY; 233 if( connect( nSocket, (const sockaddr*)&addr, sizeof(addr) ) ) 234 { 235 perror( "SvpElementContainer: connect() failed" ); 236 close(nSocket); 237 } 238 else 239 { 240 write( nSocket, rCommand.getStr(), rCommand.getLength() ); 241 write( nSocket, "\n", 1 ); 242 char buf[256]; 243 ssize_t nBytes = 0; 244 do 245 { 246 nBytes = read( nSocket, buf, sizeof(buf) ); 247 aAnswer.append( buf, nBytes ); 248 } while( nBytes == sizeof( buf ) ); 249 } 250 } 251 else 252 perror( "SvpElementContainer: socket() failed\n" ); 253 return aAnswer.makeStringAndClear(); 254 } 255 256 IMPL_LINK( MyWin, ListHdl, Button*, ) 257 { 258 parseList( processCommand( "list" ) ); 259 return 0; 260 } 261 262 IMPL_LINK( MyWin, QuitHdl, Button*, ) 263 { 264 processCommand( "quit" ); 265 return 0; 266 } 267 268 IMPL_LINK( MyWin, SelectHdl, ListBox*, ) 269 { 270 String aEntry = m_aSvpBitmaps.GetSelectEntry(); 271 sal_uInt16 nPos = aEntry.SearchAscii( ": " ); 272 if( nPos != STRING_NOTFOUND ) 273 { 274 OStringBuffer aCommand( 64 ); 275 aCommand.append( "get " ); 276 aCommand.append( rtl::OUStringToOString( aEntry.Copy( nPos+2 ), RTL_TEXTENCODING_ASCII_US ) ); 277 OString aAnswer( processCommand( aCommand.makeStringAndClear() ) ); 278 SvMemoryStream aStream( aAnswer.getLength() ); 279 aStream.Write( aAnswer.getStr(), aAnswer.getLength() ); 280 aStream.Seek( STREAM_SEEK_TO_BEGIN ); 281 Bitmap aBitmap; 282 aStream >> aBitmap; 283 fprintf( stderr, "got bitmap of size %ldx%ld\n", 284 sal::static_int_cast< long >(aBitmap.GetSizePixel().Width()), 285 sal::static_int_cast< long >(aBitmap.GetSizePixel().Height())); 286 Size aFixedSize( aBitmap.GetSizePixel() ); 287 aFixedSize.Width() += 10; 288 aFixedSize.Height() += 10; 289 m_aImage.SetSizePixel( aFixedSize ); 290 m_aImage.SetImage( Image( BitmapEx( aBitmap ) ) ); 291 } 292 return 0; 293 } 294 295 // ----------------------------------------------------------------------- 296 297 void MyWin::MouseMove( const MouseEvent& rMEvt ) 298 { 299 WorkWindow::MouseMove( rMEvt ); 300 } 301 302 // ----------------------------------------------------------------------- 303 304 void MyWin::MouseButtonDown( const MouseEvent& rMEvt ) 305 { 306 WorkWindow::MouseButtonDown( rMEvt ); 307 } 308 309 // ----------------------------------------------------------------------- 310 311 void MyWin::MouseButtonUp( const MouseEvent& rMEvt ) 312 { 313 WorkWindow::MouseButtonUp( rMEvt ); 314 } 315 316 // ----------------------------------------------------------------------- 317 318 void MyWin::KeyInput( const KeyEvent& rKEvt ) 319 { 320 WorkWindow::KeyInput( rKEvt ); 321 } 322 323 // ----------------------------------------------------------------------- 324 325 void MyWin::KeyUp( const KeyEvent& rKEvt ) 326 { 327 WorkWindow::KeyUp( rKEvt ); 328 } 329 330 // ----------------------------------------------------------------------- 331 332 void MyWin::Paint( const Rectangle& rRect ) 333 { 334 WorkWindow::Paint( rRect ); 335 } 336 337 // ----------------------------------------------------------------------- 338 339 void MyWin::Resize() 340 { 341 WorkWindow::Resize(); 342 } 343