Sophie

Sophie

distrib > Fedora > 13 > i386 > media > updates-src > by-pkgid > cd8ce32c919af60229fca1d7f792c60e > files > 82

openoffice.org-3.2.0-12.35.fc13.src.rpm

diff -ru extensions.orig/source/scanner/scanner.cxx extensions/source/scanner/scanner.cxx
--- extensions.orig/source/scanner/scanner.cxx	2010-07-12 20:17:35.000000000 +0100
+++ extensions/source/scanner/scanner.cxx	2010-07-13 10:17:25.000000000 +0100
@@ -43,13 +43,14 @@
 ScannerManager::ScannerManager() :
 	mpData( NULL )
 {
+	AcquireData();
 }
 
 // -----------------------------------------------------------------------------
 
 ScannerManager::~ScannerManager()
 {
-	DestroyData();
+	ReleaseData();
 }
 
 // -----------------------------------------------------------------------------
diff -ru extensions.orig/source/scanner/scanner.hxx extensions/source/scanner/scanner.hxx
--- extensions.orig/source/scanner/scanner.hxx	2010-07-12 20:17:35.000000000 +0100
+++ extensions/source/scanner/scanner.hxx	2010-07-13 09:27:57.000000000 +0100
@@ -73,7 +73,8 @@
 	vos::OMutex								maProtector;
 	void*									mpData;
 
-	void									DestroyData();
+	void									AcquireData();
+	void									ReleaseData();
 
 public:
 
@@ -105,7 +106,7 @@
 	void									Unlock() { maProtector.release(); }
 
 	void*									GetData() const { return mpData; }
-	void									SetData( void* pData ) { DestroyData(); mpData = pData; }
+	void									SetData( void* pData ) { ReleaseData(); mpData = pData; }
 };
 
 // -----------------------------------------------------------------------------
diff -ru extensions.orig/source/scanner/scanunx.cxx extensions/source/scanner/scanunx.cxx
--- extensions.orig/source/scanner/scanunx.cxx	2010-07-12 20:17:35.000000000 +0100
+++ extensions/source/scanner/scanunx.cxx	2010-07-13 10:16:41.000000000 +0100
@@ -31,6 +31,7 @@
 #include <sanedlg.hxx>
 #include <vos/thread.hxx>
 #include <tools/list.hxx>
+#include <boost/shared_ptr.hpp>
 
 #if OSL_DEBUG_LEVEL > 1
 #include <stdio.h>
@@ -113,12 +114,41 @@
 	vos::OMutex			m_aProtector;
 	ScanError			m_nError;
     bool				m_bBusy;
+
+    SaneHolder() : m_nError(ScanError_ScanErrorNone), m_bBusy(false) {}
 };
 
-DECLARE_LIST( SaneHolderList, SaneHolder* )
+namespace
+{
+    typedef std::vector< boost::shared_ptr<SaneHolder> > sanevec;
+    class allSanes
+    {
+    private:
+        int mnRefCount;
+    public:
+        sanevec m_aSanes;
+        allSanes() : mnRefCount(0) {}
+        void acquire();
+        void release();
+    };
+
+    void allSanes::acquire()
+    {
+        ++mnRefCount;
+    }
+
+    void allSanes::release()
+    {
+        // was unused, now because of i99835: "Scanning interface not SANE API
+        // compliant" destroy all SaneHolder to get Sane Dtor called
+        --mnRefCount;
+        if (!mnRefCount)
+            m_aSanes.clear();
+    }
 
-static SaneHolderList	allSanes;
-static vos::OMutex		aSaneProtector;
+    struct theSaneProtector : public rtl::Static<vos::OMutex, theSaneProtector> {}; 
+    struct theSanes : public rtl::Static<allSanes, theSanes> {}; 
+}
 
 // -----------------
 // - ScannerThread -
@@ -126,7 +156,7 @@
 
 class ScannerThread : public vos::OThread
 {
-	SaneHolder*									m_pHolder;
+	boost::shared_ptr<SaneHolder>				m_pHolder;
 	REF( com::sun::star::lang::XEventListener )	m_xListener;
 	ScannerManager*								m_pManager; // just for the disposing call
 
@@ -134,7 +164,7 @@
 	virtual void run();
 	virtual void onTerminated() { delete this; }
 public:
-	ScannerThread( SaneHolder* pHolder,
+	ScannerThread( boost::shared_ptr<SaneHolder> pHolder,
 				   const REF( com::sun::star::lang::XEventListener )& listener,
 				   ScannerManager* pManager );
 	virtual ~ScannerThread();
@@ -143,7 +173,7 @@
 // -----------------------------------------------------------------------------
 
 ScannerThread::ScannerThread(
-                             SaneHolder* pHolder,
+                             boost::shared_ptr<SaneHolder> pHolder,
                              const REF( com::sun::star::lang::XEventListener )& listener,
                              ScannerManager* pManager )
         : m_pHolder( pHolder ), m_xListener( listener ), m_pManager( pManager )
@@ -192,16 +222,16 @@
 // - ScannerManager -
 // ------------------
 
-void ScannerManager::DestroyData()
+void ScannerManager::AcquireData()
 {
-	// was unused, now because of i99835: "Scanning interface not SANE API compliant"
-	// delete all SaneHolder to get Sane Dtor called
-	int i;
-	for ( i = allSanes.Count(); i > 0; i-- )
-	{
-		SaneHolder *pSaneHolder = allSanes.GetObject(i-1);
-		if ( pSaneHolder ) delete pSaneHolder;
-	}
+    vos::OGuard aGuard( theSaneProtector::get() );
+    theSanes::get().acquire();
+}
+
+void ScannerManager::ReleaseData()
+{
+    vos::OGuard aGuard( theSaneProtector::get() );
+    theSanes::get().release();
 }
 
 // -----------------------------------------------------------------------------
@@ -224,17 +254,14 @@
 
 SEQ( ScannerContext ) ScannerManager::getAvailableScanners() throw()
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
-	if( ! allSanes.Count() )
+	if( rSanes.empty() )
 	{
-		SaneHolder* pSaneHolder = new SaneHolder;
-		pSaneHolder->m_nError = ScanError_ScanErrorNone;
-        pSaneHolder->m_bBusy = false;
+		boost::shared_ptr<SaneHolder> pSaneHolder(new SaneHolder);
 		if( Sane::IsSane() )
-			allSanes.Insert( pSaneHolder );
-		else
-			delete pSaneHolder;
+			rSanes.push_back( pSaneHolder );
 	}
 
 	if( Sane::IsSane() )
@@ -252,20 +279,21 @@
 
 BOOL ScannerManager::configureScanner( ScannerContext& scanner_context ) throw( ScannerException )
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
 #if OSL_DEBUG_LEVEL > 1
     fprintf( stderr, "ScannerManager::configureScanner\n" );
 #endif
 
-	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= allSanes.Count() )
+	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= rSanes.size() )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner does not exist" ),
 			REF( XScannerManager )( this ),
 			ScanError_InvalidContext
 			);
 
-    SaneHolder* pHolder = allSanes.GetObject( scanner_context.InternalData );
+    boost::shared_ptr<SaneHolder> pHolder = rSanes[scanner_context.InternalData];
     if( pHolder->m_bBusy )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner is busy" ),
@@ -286,19 +314,20 @@
 void ScannerManager::startScan( const ScannerContext& scanner_context,
 								const REF( com::sun::star::lang::XEventListener )& listener ) throw( ScannerException )
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
 #if OSL_DEBUG_LEVEL > 1
     fprintf( stderr, "ScannerManager::startScan\n" );
 #endif
 
-	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= allSanes.Count() )
+	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= rSanes.size() )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner does not exist" ),
 			REF( XScannerManager )( this ),
 			ScanError_InvalidContext
 			);
-	SaneHolder* pHolder = allSanes.GetObject( scanner_context.InternalData );
+	boost::shared_ptr<SaneHolder> pHolder = rSanes[scanner_context.InternalData];
     if( pHolder->m_bBusy )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner is busy" ),
@@ -315,16 +344,17 @@
 
 ScanError ScannerManager::getError( const ScannerContext& scanner_context ) throw( ScannerException )
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
-	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= allSanes.Count() )
+	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= rSanes.size() )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner does not exist" ),
 			REF( XScannerManager )( this ),
 			ScanError_InvalidContext
 			);
 
-	SaneHolder* pHolder = allSanes.GetObject( scanner_context.InternalData );
+	boost::shared_ptr<SaneHolder> pHolder = rSanes[scanner_context.InternalData];
 
 	return pHolder->m_nError;
 }
@@ -333,15 +363,16 @@
 
 REF( AWT::XBitmap ) ScannerManager::getBitmap( const ScannerContext& scanner_context ) throw( ScannerException )
 {
-	vos::OGuard aGuard( aSaneProtector );
+	vos::OGuard aGuard( theSaneProtector::get() );
+	sanevec &rSanes = theSanes::get().m_aSanes;
 
-	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= allSanes.Count() )
+	if( scanner_context.InternalData < 0 || (ULONG)scanner_context.InternalData >= rSanes.size() )
 		throw ScannerException(
 			::rtl::OUString::createFromAscii( "Scanner does not exist" ),
 			REF( XScannerManager )( this ),
 			ScanError_InvalidContext
 			);
-	SaneHolder* pHolder = allSanes.GetObject( scanner_context.InternalData );
+	boost::shared_ptr<SaneHolder> pHolder = rSanes[scanner_context.InternalData];
 
 	vos::OGuard aProtGuard( pHolder->m_aProtector );
 
diff -ru extensions.orig/source/scanner/scanwin.cxx extensions/source/scanner/scanwin.cxx
--- extensions.orig/source/scanner/scanwin.cxx	2010-07-12 20:17:35.000000000 +0100
+++ extensions/source/scanner/scanwin.cxx	2010-07-13 09:28:40.000000000 +0100
@@ -887,7 +887,11 @@
 // - ScannerManager -
 // ------------------
 
-void ScannerManager::DestroyData()
+void ScannerManager::AcquireData()
+{
+}
+
+void ScannerManager::ReleaseData()
 {
 	if( mpData )
 	{
@@ -979,7 +983,7 @@
 		}
 
 		GlobalUnlock( hDIB );
-		DestroyData();
+		ReleaseData();
 	}
 
 	return aRet;
@@ -1009,7 +1013,7 @@
 	if( rContext.InternalData != 0 || rContext.ScannerName != ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TWAIN" ) ) )
 		throw ScannerException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Scanner does not exist" ) ), xThis, ScanError_InvalidContext );
 
-	DestroyData();
+	ReleaseData();
 
 	return aTwain.SelectSource( *this );
 }
@@ -1025,7 +1029,7 @@
 	if( rContext.InternalData != 0 || rContext.ScannerName != ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TWAIN" ) ) )
 		throw ScannerException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Scanner does not exist" ) ), xThis, ScanError_InvalidContext );
 
-	DestroyData();
+	ReleaseData();
 	aTwain.PerformTransfer( *this, rxListener );
 }