summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Oppermann <lo@openoffice.org>2002-09-30 14:24:07 +0000
committerLars Oppermann <lo@openoffice.org>2002-09-30 14:24:07 +0000
commit1009868edaf23033040f8089cc50d4055b26ac5b (patch)
tree3b801115039f10e9705667812e177de96aa5c301
parent396785a4a0850ace957abe4b81734d4e13c5b6d6 (diff)
#101202# lockfile for user dir
-rw-r--r--desktop/source/app/lockfile.cxx202
-rw-r--r--desktop/source/app/lockfile.hxx114
2 files changed, 316 insertions, 0 deletions
diff --git a/desktop/source/app/lockfile.cxx b/desktop/source/app/lockfile.cxx
new file mode 100644
index 000000000000..2cf460fbfded
--- /dev/null
+++ b/desktop/source/app/lockfile.cxx
@@ -0,0 +1,202 @@
+/*************************************************************************
+ *
+ * $RCSfile: lockfile.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: lo $ $Date: 2002-09-30 15:24:07 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): lars.oppermann@sun.com
+ *
+ *
+ ************************************************************************/
+#include <stdlib.h>
+#include <time.h>
+#include <sal/types.h>
+#include <osl/file.hxx>
+#include <osl/socket.hxx>
+#include <osl/security.hxx>
+#include <unotools/bootstrap.hxx>
+#include <vcl/msgbox.hxx>
+#include <tools/string.hxx>
+#include <tools/config.hxx>
+
+#include "desktopresid.hxx"
+#include "lockfile.hxx"
+#include "desktop.hrc"
+
+using namespace ::osl;
+using namespace ::rtl;
+using namespace ::utl;
+
+
+namespace desktop {
+
+ // initialize static members...
+ // lock suffix
+ const OUString Lockfile::m_aSuffix = OUString::createFromAscii( "/.lock" );
+ // values for datafile
+ const ByteString Lockfile::m_aGroup( "Lockdata" );
+ const ByteString Lockfile::m_aUserkey( "User" );
+ const ByteString Lockfile::m_aHostkey( "Host" );
+ const ByteString Lockfile::m_aStampkey( "Stamp" );
+ const ByteString Lockfile::m_aTimekey( "Time" );
+
+ Lockfile::Lockfile(void)
+ :m_bRemove(sal_False)
+ {
+ // build the file-url to use for the lock
+ OUString aUserPath;
+ Bootstrap::locateUserInstallation( aUserPath );
+ m_aLockname = aUserPath + m_aSuffix;
+
+ // generate ID
+ const int nIdBytes = 16;
+ char tmpId[nIdBytes*2+1];
+ time_t t;
+ srand( (unsigned)(t = time( NULL )) );
+ int tmpByte = 0;
+ for (int i = 0; i<nIdBytes; i++) {
+ tmpByte = rand( ) % 0xFF;
+ sprintf( tmpId+i*2, "%02X", tmpByte );
+ }
+ tmpId[nIdBytes*2]=0x00;
+ m_aId = OUString::createFromAscii( tmpId );
+
+ // generate date string
+ char *tmpTime = ctime( &t );
+ tmpTime[24] = 0x00; // buffer is always 26 chars, remove \n
+ m_aDate = OUString::createFromAscii( tmpTime );
+
+ }
+
+ sal_Bool Lockfile::check( void )
+ {
+ File aFile(m_aLockname);
+ if (aFile.open( OpenFlag_Create ) == File::E_EXIST) {
+ // lock exists, ask user what to do
+ if (execWarning( ) == RET_YES) {
+ // remove file and create new
+ File::remove( m_aLockname );
+ aFile.open( OpenFlag_Create );
+ aFile.close( );
+ syncToFile( );
+ m_bRemove = sal_True;
+ return sal_True;
+ } else {
+ //leave alone and return false
+ m_bRemove = sal_False;
+ return sal_False;
+ }
+ } else {
+ // new lock created
+ aFile.close( );
+ syncToFile( );
+ m_bRemove = sal_True;
+ return sal_True;
+ }
+ }
+
+ void Lockfile::syncToFile( void ) const
+ {
+ String aLockname = m_aLockname;
+ Config aConfig(aLockname);
+ aConfig.SetGroup(m_aGroup);
+
+ // get information
+ oslSocketResult sRes;
+ ByteString aHost = OUStringToOString(
+ SocketAddr::getLocalHostname( &sRes ), RTL_TEXTENCODING_ASCII_US );
+ OUString aUserName;
+ Security aSecurity;
+ aSecurity.getUserName( aUserName );
+ ByteString aUser = OUStringToOString( aUserName, RTL_TEXTENCODING_ASCII_US );
+ ByteString aTime = OUStringToOString( m_aDate, RTL_TEXTENCODING_ASCII_US );
+ ByteString aStamp = OUStringToOString( m_aId, RTL_TEXTENCODING_ASCII_US );
+
+ // write information
+ aConfig.WriteKey( m_aUserkey, aUser );
+ aConfig.WriteKey( m_aHostkey, aHost );
+ aConfig.WriteKey( m_aStampkey, aStamp );
+ aConfig.WriteKey( m_aTimekey, aTime );
+ aConfig.Flush( );
+ }
+
+ short Lockfile::execWarning(void) const
+ {
+ // read information from lock
+ String aLockname = m_aLockname;
+ Config aConfig(aLockname);
+ aConfig.SetGroup(m_aGroup);
+ ByteString aHost = aConfig.ReadKey( m_aHostkey );
+ ByteString aUser = aConfig.ReadKey( m_aUserkey );
+ ByteString aStamp = aConfig.ReadKey( m_aStampkey );
+ ByteString aTime = aConfig.ReadKey( m_aTimekey );
+
+ // display warning and return response
+ QueryBox aBox( NULL, DesktopResId( QBX_USERDATALOCKED ) );
+ // insert values...
+ String aMsgText = aBox.GetMessText( );
+ aMsgText.SearchAndReplaceAscii( "$u", String( aUser, RTL_TEXTENCODING_ASCII_US) );
+ aMsgText.SearchAndReplaceAscii( "$h", String( aHost, RTL_TEXTENCODING_ASCII_US) );
+ aMsgText.SearchAndReplaceAscii( "$t", String( aTime, RTL_TEXTENCODING_ASCII_US) );
+ aBox.SetMessText(aMsgText);
+ // do it
+ return aBox.Execute( );
+ }
+
+ Lockfile::~Lockfile( void )
+ {
+ // unlock userdata by removing file
+ if ( m_bRemove )
+ File::remove( m_aLockname );
+ }
+}
diff --git a/desktop/source/app/lockfile.hxx b/desktop/source/app/lockfile.hxx
new file mode 100644
index 000000000000..acb5e8dff712
--- /dev/null
+++ b/desktop/source/app/lockfile.hxx
@@ -0,0 +1,114 @@
+/*************************************************************************
+ *
+ * $RCSfile: lockfile.hxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: lo $ $Date: 2002-09-30 15:24:02 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): lars.oppermann@sun.com
+ *
+ *
+ ************************************************************************/
+
+/* Information:
+ * This class implements a mechanism to lock a users installation directory,
+ * which is necessesary because instances of staroffice could be running on
+ * different hosts while using the same directory thus causing data
+ * inconsistency.
+ * When an existing lock is detected, the user will be asked whether he wants
+ * to continue anyway, thus removing the lock and replacing it with a new one
+ *
+ * ideas:
+ * - store information about user and host and time in the lockfile and display
+ * these when asking whether to remove the lockfile.
+ * - periodically check the lockfile and warn the user when it gets replaced
+ *
+ */
+
+using namespace ::rtl;
+namespace desktop {
+ class Lockfile
+ {
+ public:
+
+ // contructs a new lockfile onject
+ Lockfile(void);
+
+ // checks/creates the lockfile, asks user when lockfile is
+ // found and returns false when we may not continue
+ sal_Bool check(void);
+
+ // removes the lockfile
+ ~Lockfile(void);
+
+ private:
+ // data in lockfile
+ static const ByteString m_aGroup;
+ static const ByteString m_aUserkey;
+ static const ByteString m_aHostkey;
+ static const ByteString m_aStampkey;
+ static const ByteString m_aTimekey;
+ // lockfilename
+ static const OUString m_aSuffix;
+ // full qualified name (file://-url) of the lockfile
+ OUString m_aLockname;
+ // flag whether the d'tor should delete the lock
+ sal_Bool m_bRemove;
+ // ID
+ OUString m_aId;
+ OUString m_aDate;
+ // access to data in file
+ void syncToFile(void) const;
+ short execWarning(void) const;
+
+ };
+} \ No newline at end of file