16d739b60SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 36d739b60SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 46d739b60SAndrew Rist * or more contributor license agreements. See the NOTICE file 56d739b60SAndrew Rist * distributed with this work for additional information 66d739b60SAndrew Rist * regarding copyright ownership. The ASF licenses this file 76d739b60SAndrew Rist * to you under the Apache License, Version 2.0 (the 86d739b60SAndrew Rist * "License"); you may not use this file except in compliance 96d739b60SAndrew Rist * with the License. You may obtain a copy of the License at 106d739b60SAndrew Rist * 116d739b60SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 126d739b60SAndrew Rist * 136d739b60SAndrew Rist * Unless required by applicable law or agreed to in writing, 146d739b60SAndrew Rist * software distributed under the License is distributed on an 156d739b60SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 166d739b60SAndrew Rist * KIND, either express or implied. See the License for the 176d739b60SAndrew Rist * specific language governing permissions and limitations 186d739b60SAndrew Rist * under the License. 196d739b60SAndrew Rist * 206d739b60SAndrew Rist *************************************************************/ 216d739b60SAndrew Rist 226d739b60SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_framework.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 28cdf0e10cSrcweir // my own includes 29cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 30cdf0e10cSrcweir 31cdf0e10cSrcweir #ifndef __FRAMEWORK_SERVICES_LOGINDIALOG_HXX_ 32cdf0e10cSrcweir #include <services/logindialog.hxx> 33cdf0e10cSrcweir #endif 34cdf0e10cSrcweir #include <classes/servicemanager.hxx> 35cdf0e10cSrcweir #include <macros/generic.hxx> 36cdf0e10cSrcweir #include <macros/debug.hxx> 37cdf0e10cSrcweir #include <services.h> 38cdf0e10cSrcweir 39cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 40cdf0e10cSrcweir // interface includes 41cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 42cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 43cdf0e10cSrcweir #include <com/sun/star/awt/XDialog.hpp> 44cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 45cdf0e10cSrcweir 46cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 47cdf0e10cSrcweir // other includes 48cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 49cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 50cdf0e10cSrcweir #include <com/sun/star/uno/Reference.hxx> 51cdf0e10cSrcweir #include <vos/process.hxx> 52cdf0e10cSrcweir #include <rtl/ustring.hxx> 53cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 54cdf0e10cSrcweir #include <vcl/event.hxx> 55cdf0e10cSrcweir #include <vcl/svapp.hxx> 56cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 57cdf0e10cSrcweir #include <vcl/msgbox.hxx> 58cdf0e10cSrcweir 59cdf0e10cSrcweir #include <stdio.h> 60cdf0e10cSrcweir 61cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 62cdf0e10cSrcweir // const 63cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 64cdf0e10cSrcweir 65cdf0e10cSrcweir #define TEMPFILE_ENCODING RTL_TEXTENCODING_UTF8 // encoding of written temp. ascii file 66*07a3d7f1SPedro Giffuni #define LOGIN_RDB DECLARE_ASCII("login.rdb") // name of our own registry file - necessary to create own servicemanager 67*07a3d7f1SPedro Giffuni #define SEPERATOR "\n" // used to separate parts in temp. file 68cdf0e10cSrcweir 69cdf0e10cSrcweir #define MINARGUMENTCOUNT 1 // count of min. required arguments 70cdf0e10cSrcweir #define ARGUMENTFOUND 0 // OUString::compareTo returns 0 if searched string match given one 71cdf0e10cSrcweir #define ARGUMENTLENGTH 3 // length of fixed part of any argument to detect it easier! 72cdf0e10cSrcweir 73cdf0e10cSrcweir #define ARGUMENT_TEMPFILE DECLARE_ASCII("-f=") // we support "-f=c:\temp\test.txt" to write dialog data in temp. file 74cdf0e10cSrcweir #define ARGUMENT_DIALOGPARENT DECLARE_ASCII("-p=") // we support "-p=36748322" as window handle of parent for vcl dialog 75cdf0e10cSrcweir 76cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 77cdf0e10cSrcweir // namespace 78cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 79cdf0e10cSrcweir 80cdf0e10cSrcweir using namespace ::rtl ; 81cdf0e10cSrcweir using namespace ::vos ; 82cdf0e10cSrcweir using namespace ::comphelper ; 83cdf0e10cSrcweir using namespace ::framework ; 84cdf0e10cSrcweir using namespace ::com::sun::star::uno ; 85cdf0e10cSrcweir using namespace ::com::sun::star::lang ; 86cdf0e10cSrcweir using namespace ::com::sun::star::awt ; 87cdf0e10cSrcweir using namespace ::com::sun::star::beans ; 88cdf0e10cSrcweir 89cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 90cdf0e10cSrcweir // defines 91cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 92cdf0e10cSrcweir 93cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 94cdf0e10cSrcweir // declarations 95cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 96cdf0e10cSrcweir 97cdf0e10cSrcweir /*-************************************************************************************************************//** 98cdf0e10cSrcweir @short implement command application to show login dialog and save his information in temp. file! 99cdf0e10cSrcweir @descr We need this temp. file to share informations between our dialog and different processes, which 100cdf0e10cSrcweir can't use vcl directly. Caller of this executable give us the file name as an argument - we save 101cdf0e10cSrcweir all informations in it - caller can read it and MUST delete temp. file. 102*07a3d7f1SPedro Giffuni This is necessary for example; to hide the password! 103cdf0e10cSrcweir 104cdf0e10cSrcweir @implements - 105cdf0e10cSrcweir 106cdf0e10cSrcweir @base Application 107cdf0e10cSrcweir *//*-*************************************************************************************************************/ 108cdf0e10cSrcweir class LoginApplication : public Application 109cdf0e10cSrcweir { 110cdf0e10cSrcweir //************************************************************************************************************* 111cdf0e10cSrcweir // public methods 112cdf0e10cSrcweir //************************************************************************************************************* 113cdf0e10cSrcweir public: 114cdf0e10cSrcweir void Main(); 115cdf0e10cSrcweir 116cdf0e10cSrcweir //************************************************************************************************************* 117cdf0e10cSrcweir // private methods 118cdf0e10cSrcweir //************************************************************************************************************* 119cdf0e10cSrcweir private: 120cdf0e10cSrcweir void impl_parseCommandline(); // search supported arguments on command line 121cdf0e10cSrcweir 122cdf0e10cSrcweir //************************************************************************************************************* 123cdf0e10cSrcweir // private variables 124cdf0e10cSrcweir //************************************************************************************************************* 125cdf0e10cSrcweir private: 126cdf0e10cSrcweir OString m_sTempFile ; // name of temp. file in system notation 127cdf0e10cSrcweir sal_Int32 m_nParentHandle ; // a parent window handle for used vcl dialog 128cdf0e10cSrcweir 129cdf0e10cSrcweir }; // class LoginApplication 130cdf0e10cSrcweir 131cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 132cdf0e10cSrcweir // global variables 133cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 134cdf0e10cSrcweir 135cdf0e10cSrcweir LoginApplication gLoginApplication; 136cdf0e10cSrcweir 137cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 138cdf0e10cSrcweir // main 139cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 140cdf0e10cSrcweir 141cdf0e10cSrcweir void LoginApplication::Main() 142cdf0e10cSrcweir { 143cdf0e10cSrcweir // Init global uno servicemanager. 144cdf0e10cSrcweir ServiceManager aManager; 145cdf0e10cSrcweir Reference< XMultiServiceFactory > xServiceManager = aManager.getSharedUNOServiceManager( DECLARE_ASCII("login.rdb") ); 146cdf0e10cSrcweir LOG_ASSERT( !(xServiceManager.is()==sal_False), "LoginApplication::Main()\nCould not create uno service manager!\n" ) 147cdf0e10cSrcweir 148cdf0e10cSrcweir // Parse command line and set found arguments on application member. 149cdf0e10cSrcweir impl_parseCommandline(); 150cdf0e10cSrcweir LOG_ASSERT( !(m_sTempFile.getLength()<1), "LoginApplication::Main()\nWrong or missing argument for temp. file detected!\n" ) 151cdf0e10cSrcweir 152*07a3d7f1SPedro Giffuni // Try to get necessary dialog service. 153cdf0e10cSrcweir // By the way - cast it to interface XPropertySet too - we need it later. 154cdf0e10cSrcweir // (define SERVICENAME... comes from defines.hxx!) 155cdf0e10cSrcweir Reference< XDialog > xLoginDialog( xServiceManager->createInstance( SERVICENAME_LOGINDIALOG ), UNO_QUERY ); 156cdf0e10cSrcweir Reference< XPropertySet > xPropertySet( xLoginDialog , UNO_QUERY ); 157cdf0e10cSrcweir 158cdf0e10cSrcweir // Work with valid ressources only! 159cdf0e10cSrcweir // Otherwise do nothing ... 160cdf0e10cSrcweir if ( 161cdf0e10cSrcweir ( xLoginDialog.is() == sal_True ) && 162cdf0e10cSrcweir ( xPropertySet.is() == sal_True ) && 163cdf0e10cSrcweir ( m_sTempFile.getLength() > 0 ) 164cdf0e10cSrcweir ) 165cdf0e10cSrcweir { 166cdf0e10cSrcweir // Exist a parent window? YES => set right property. 167cdf0e10cSrcweir if( m_nParentHandle != 0 ) 168cdf0e10cSrcweir { 169cdf0e10cSrcweir Any aParentWindow; 170cdf0e10cSrcweir aParentWindow <<= m_nParentHandle; 171cdf0e10cSrcweir xPropertySet->setPropertyValue( PROPERTYNAME_PARENTWINDOW, aParentWindow ); 172cdf0e10cSrcweir } 173cdf0e10cSrcweir 174cdf0e10cSrcweir Any aConnectionType; 175cdf0e10cSrcweir aConnectionType <<= PROPERTYNAME_HTTPS; 176cdf0e10cSrcweir xPropertySet->setPropertyValue( PROPERTYNAME_CONNECTIONTYPE, aConnectionType ); 177cdf0e10cSrcweir 178cdf0e10cSrcweir // Show login dialog and get decision of user. 179cdf0e10cSrcweir sal_Bool bDecision = (sal_Bool)(xLoginDialog->execute()); 180cdf0e10cSrcweir 181cdf0e10cSrcweir OUString sUserName ; 182cdf0e10cSrcweir OUString sPassword ; 183cdf0e10cSrcweir OUString sServer ; 184cdf0e10cSrcweir OUString sConnectionType ; 185cdf0e10cSrcweir sal_Int32 nPort=0 ; // We need this default if follow "if"-statement "failed"! 186cdf0e10cSrcweir 187cdf0e10cSrcweir // If user say "OK" ... get values from dialog. 188cdf0e10cSrcweir // If user say "NO" ... leave it. Then we save empty informations later ... 189cdf0e10cSrcweir if( bDecision == sal_True ) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir // defines PROPERTYNAME... comes from logindialog.hxx! 192cdf0e10cSrcweir xPropertySet->getPropertyValue( PROPERTYNAME_USERNAME ) >>= sUserName ; 193cdf0e10cSrcweir xPropertySet->getPropertyValue( PROPERTYNAME_PASSWORD ) >>= sPassword ; 194cdf0e10cSrcweir xPropertySet->getPropertyValue( PROPERTYNAME_SERVER ) >>= sServer ; 195cdf0e10cSrcweir xPropertySet->getPropertyValue( PROPERTYNAME_CONNECTIONTYPE ) >>= sConnectionType ; 196cdf0e10cSrcweir if( sConnectionType.getLength() > 0 ) 197cdf0e10cSrcweir { 198cdf0e10cSrcweir xPropertySet->getPropertyValue( sConnectionType ) >>= nPort; 199cdf0e10cSrcweir } 200cdf0e10cSrcweir } 201cdf0e10cSrcweir 202cdf0e10cSrcweir // Build string for output. 203*07a3d7f1SPedro Giffuni // At this point it doesn't matter if information exist or not! 204cdf0e10cSrcweir // Format of output: "<decision> [0|1] SEPERATOR 205cdf0e10cSrcweir // <username> [string] SEPERATOR 206cdf0e10cSrcweir // <password> [string] SEPERATOR 207cdf0e10cSrcweir // <servername> [string] SEPERATOR 208cdf0e10cSrcweir // <port> [int] SEPERATOR" 209cdf0e10cSrcweir OUStringBuffer sBuffer( 1000 ); 210cdf0e10cSrcweir 211cdf0e10cSrcweir if( bDecision == sal_True ) 212cdf0e10cSrcweir { 213cdf0e10cSrcweir sBuffer.appendAscii( "1" ); 214cdf0e10cSrcweir } 215cdf0e10cSrcweir else 216cdf0e10cSrcweir { 217cdf0e10cSrcweir sBuffer.appendAscii( "0" ); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir sBuffer.appendAscii ( SEPERATOR ); 220cdf0e10cSrcweir sBuffer.append ( sUserName ); 221cdf0e10cSrcweir sBuffer.appendAscii ( SEPERATOR ); 222cdf0e10cSrcweir sBuffer.append ( sPassword ); 223cdf0e10cSrcweir sBuffer.appendAscii ( SEPERATOR ); 224cdf0e10cSrcweir sBuffer.append ( sServer ); 225cdf0e10cSrcweir sBuffer.appendAscii ( SEPERATOR ); 226cdf0e10cSrcweir sBuffer.append ( sConnectionType ); 227cdf0e10cSrcweir sBuffer.appendAscii ( SEPERATOR ); 228cdf0e10cSrcweir sBuffer.append ( nPort ); 229cdf0e10cSrcweir sBuffer.appendAscii ( SEPERATOR ); 230cdf0e10cSrcweir 231cdf0e10cSrcweir // Write informations in temp. file. 232*07a3d7f1SPedro Giffuni // If given file name isn't valid ... caller will have a problem!!! 233*07a3d7f1SPedro Giffuni // If fil already exist (That's out of specification!!!) we overwrite it every time. 234cdf0e10cSrcweir FILE* pFile = fopen( m_sTempFile.getStr(), "w" ); 235cdf0e10cSrcweir LOG_ASSERT( !(pFile==NULL), "LoginApplication::Main()\nCould not open file!\n" ); 236cdf0e10cSrcweir if( pFile != NULL ) 237cdf0e10cSrcweir { 238cdf0e10cSrcweir OString sEncodedOut = U2B_ENC( sBuffer.makeStringAndClear(), TEMPFILE_ENCODING ); 239cdf0e10cSrcweir fprintf( pFile, sEncodedOut.getStr() ); 240cdf0e10cSrcweir fclose ( pFile ); 241cdf0e10cSrcweir } 242cdf0e10cSrcweir } 243cdf0e10cSrcweir } 244cdf0e10cSrcweir 245cdf0e10cSrcweir //***************************************************************************************************************** 246cdf0e10cSrcweir // private method 247cdf0e10cSrcweir //***************************************************************************************************************** 248cdf0e10cSrcweir void LoginApplication::impl_parseCommandline() 249cdf0e10cSrcweir { 250cdf0e10cSrcweir // Use vos::OStartupInfo for access to command line. 251cdf0e10cSrcweir // Step over all arguments, search for supported ones and try to get his values. 252cdf0e10cSrcweir // Set it on our member. Caller of this method must control setted values. 253cdf0e10cSrcweir OStartupInfo aInfo; 254cdf0e10cSrcweir 255cdf0e10cSrcweir sal_uInt32 nCount = aInfo.getCommandArgCount() ; 256cdf0e10cSrcweir sal_uInt32 nArgument = 0 ; 257cdf0e10cSrcweir OUString sArgument ; 258cdf0e10cSrcweir OUString sValue ; 259cdf0e10cSrcweir 260*07a3d7f1SPedro Giffuni // Warn programmer if argument count isn't ok! 261cdf0e10cSrcweir LOG_ASSERT( !(nCount!=MINARGUMENTCOUNT), "LoginApplication::impl_parseCommandline()\nWrong argument count detected!\n" ) 262cdf0e10cSrcweir 263cdf0e10cSrcweir // Reset all possible argument variables to defaults if someone is missing. 264cdf0e10cSrcweir m_sTempFile = OString(); 265cdf0e10cSrcweir m_nParentHandle = 0 ; 266cdf0e10cSrcweir 267cdf0e10cSrcweir // Step over all arguments ... 268cdf0e10cSrcweir for( nArgument=0; nArgument<nCount; ++nArgument ) 269cdf0e10cSrcweir { 270cdf0e10cSrcweir // .. but work with valid ones only! 271cdf0e10cSrcweir // Don't check values here. Caller of this method must decide between wrong and allowed values! 272cdf0e10cSrcweir aInfo.getCommandArg( nArgument, sArgument ); 273cdf0e10cSrcweir 274cdf0e10cSrcweir //_____________________________________________________________________________________________________ 275cdf0e10cSrcweir // Look for "-f=<temp. file name>" 276cdf0e10cSrcweir if( sArgument.compareTo( ARGUMENT_TEMPFILE, ARGUMENTLENGTH ) == ARGUMENTFOUND ) 277cdf0e10cSrcweir { 278cdf0e10cSrcweir sValue = sArgument.copy( ARGUMENTLENGTH ); 279cdf0e10cSrcweir m_sTempFile = U2B(sValue); 280cdf0e10cSrcweir } 281cdf0e10cSrcweir else 282cdf0e10cSrcweir //_____________________________________________________________________________________________________ 283cdf0e10cSrcweir // Look for "-p=<parent window handle>" 284cdf0e10cSrcweir if( sArgument.compareTo( ARGUMENT_DIALOGPARENT, ARGUMENTLENGTH ) == ARGUMENTFOUND ) 285cdf0e10cSrcweir { 286cdf0e10cSrcweir sValue = sArgument.copy( ARGUMENTLENGTH ); 287cdf0e10cSrcweir m_nParentHandle = sValue.toInt32(); 288cdf0e10cSrcweir } 289cdf0e10cSrcweir } 290cdf0e10cSrcweir 291cdf0e10cSrcweir // Parent window handle is an optional argument ... but should be used mostly! 292cdf0e10cSrcweir // Warn programmer. 293cdf0e10cSrcweir LOG_ASSERT( !(m_nParentHandle==0), "Login.exe\nYou should give me a parent window handle!\n" ) 294cdf0e10cSrcweir } 295