diff options
author | Rüdiger Timm <rt@openoffice.org> | 2008-03-12 06:34:12 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2008-03-12 06:34:12 +0000 |
commit | 2d13b1fd20f9c19db66bafb251f07a8e33805541 (patch) | |
tree | ce2152cb5e5330d8a99e213db058d302bd2f3fb7 /fpicker/source | |
parent | afba7aa448dff7bd6b42b2896756d251781ddeea (diff) |
INTEGRATION: CWS hro34 (1.1.4); FILE ADDED
2008/03/07 10:38:15 hro 1.1.4.2: #i78851# #i72556# Implemented Vista style File Dialog
2007/08/30 14:08:09 hro 1.1.4.1: file asyncrequests.cxx was added on branch cws_dev300_hro34 on 2008-03-07 10:38:15 +0000
Diffstat (limited to 'fpicker/source')
-rw-r--r-- | fpicker/source/win32/filepicker/asyncrequests.cxx | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/fpicker/source/win32/filepicker/asyncrequests.cxx b/fpicker/source/win32/filepicker/asyncrequests.cxx new file mode 100644 index 000000000000..dd906e97a332 --- /dev/null +++ b/fpicker/source/win32/filepicker/asyncrequests.cxx @@ -0,0 +1,238 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: asyncrequests.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: rt $ $Date: 2008-03-12 07:34:12 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 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 + * + ************************************************************************/ + +#include "asyncrequests.hxx" + +//----------------------------------------------------------------------------- +// namespace +//----------------------------------------------------------------------------- + +namespace fpicker{ +namespace win32{ +namespace vista{ + +namespace css = ::com::sun::star; + +//----------------------------------------------------------------------------- +void lcl_sleep(::osl::Condition& aCondition , + ::sal_Int32 nMilliSeconds) +{ + if (nMilliSeconds < 1) + aCondition.wait(0); + else + { + TimeValue aTime; + aTime.Seconds = (nMilliSeconds / 1000); + aTime.Nanosec = (nMilliSeconds % 1000); + aCondition.wait(&aTime); + } +} + +//----------------------------------------------------------------------------- +void Request::wait(::sal_Int32 nMilliSeconds) +{ + lcl_sleep(m_aJoiner, nMilliSeconds); +} + +//----------------------------------------------------------------------------- +void Request::notify() +{ + m_aJoiner.set(); +} + +//----------------------------------------------------------------------------- +AsyncRequests::AsyncRequests(const RequestHandlerRef& rHandler) + : ::cppu::BaseMutex( ) + , ::osl::Thread ( ) + , m_bFinish (sal_False) + , m_rHandler (rHandler ) + , m_lRequests ( ) +{ +} + +//----------------------------------------------------------------------------- +AsyncRequests::~AsyncRequests() +{ + // SYNCHRONIZED -> + ::osl::ResettableMutexGuard aLock(m_aMutex); + m_bFinish = sal_True; + aLock.clear(); + // <- SYNCHRONIZED + + join(); +} + +//----------------------------------------------------------------------------- +void AsyncRequests::triggerRequestBlocked(const RequestRef& rRequest) +{ + // SYNCHRONIZED -> + ::osl::ResettableMutexGuard aLock(m_aMutex); + m_lRequests.push(rRequest); + aLock.clear(); + // <- SYNCHRONIZED + + if ( ! isRunning()) + create(); + + rRequest->wait(Request::WAIT_INFINITE); +} + +//----------------------------------------------------------------------------- +void AsyncRequests::triggerRequestNonBlocked(const RequestRef& rRequest) +{ + // SYNCHRONIZED -> + ::osl::ResettableMutexGuard aLock(m_aMutex); + m_lRequests.push(rRequest); + aLock.clear(); + // <- SYNCHRONIZED + + if ( ! isRunning()) + create(); +} + +//----------------------------------------------------------------------------- +void AsyncRequests::triggerRequestDirectly(const RequestRef& rRequest) +{ + // SYNCHRONIZED -> + ::osl::ResettableMutexGuard aLock(m_aMutex); + RequestHandlerRef rHandler = m_rHandler; + aLock.clear(); + // <- SYNCHRONIZED + + if (rHandler != NULL) + rHandler->doRequest(rRequest); +} + +//----------------------------------------------------------------------------- +void AsyncRequests::triggerRequestThreadAware(const RequestRef& rRequest, + ::sal_Bool bWait ) +{ + oslThreadIdentifier nOurThreadId = getIdentifier(); + oslThreadIdentifier nCallerThreadId = ::osl::Thread::getCurrentIdentifier(); + + if (nOurThreadId == nCallerThreadId) + triggerRequestDirectly(rRequest); + else + if (bWait) + triggerRequestBlocked(rRequest); + else + triggerRequestNonBlocked(rRequest); +} + +//----------------------------------------------------------------------------- +class SmallAsyncThread : private ::cppu::BaseMutex + , public ::osl::Thread +{ + public: + + SmallAsyncThread(const RequestHandlerRef& rHandler, + const RequestRef& rRequest) + : m_rHandler(rHandler) + , m_rRequest(rRequest) + {}; + + virtual ~SmallAsyncThread() {}; + + private: + + virtual void SAL_CALL run() + { + m_rHandler->doRequest(m_rRequest); + m_rRequest->notify(); + } + + private: + + RequestHandlerRef m_rHandler; + RequestRef m_rRequest; +}; + +//----------------------------------------------------------------------------- +void SAL_CALL AsyncRequests::run() +{ + static const ::sal_Int32 TIME_TO_WAIT_FOR_NEW_REQUESTS = 250; + + // SYNCHRONIZED -> + ::osl::ResettableMutexGuard aLock(m_aMutex); + RequestHandlerRef rHandler = m_rHandler; + ::sal_Bool bFinished = m_bFinish; + aLock.clear(); + // <- SYNCHRONIZED + + if (rHandler != NULL) + rHandler->before(); + + ::osl::Condition aWait; + + while ( ! bFinished) + { + // SYNCHRONIZED -> + aLock.reset(); + + RequestRef rRequest; + if ( ! m_lRequests.empty()) + { + rRequest = m_lRequests.front(); + m_lRequests.pop(); + } + bFinished = m_bFinish; + + aLock.clear(); + // <- SYNCHRONIZED + + if (rRequest == NULL) + { + lcl_sleep(aWait, TIME_TO_WAIT_FOR_NEW_REQUESTS); + continue; + } + + if (rHandler != NULL) + { + rHandler->doRequest(rRequest); + rRequest->notify(); + /* + SmallAsyncThread* pThread = new SmallAsyncThread(rHandler, rRequest); + pThread->create(); + */ + } + } + + if (rHandler != NULL) + rHandler->after(); +} + +} // namespace vista +} // namespace win32 +} // namespace fpicker |