blob: 32ee8a3c1307d5f1ece03fda1edb2df14c3fd289 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef FPICKER_WIN32_VISTA_ASYNCREQUESTS_HXX
#define FPICKER_WIN32_VISTA_ASYNCREQUESTS_HXX
//-----------------------------------------------------------------------------
// includes
//-----------------------------------------------------------------------------
#include <cppuhelper/basemutex.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <osl/conditn.hxx>
#include <osl/thread.hxx>
#include <osl/time.h>
#include <queue>
#include <boost/shared_ptr.hpp>
//-----------------------------------------------------------------------------
// namespace
//-----------------------------------------------------------------------------
#ifdef css
#error "Clash on using CSS as namespace define."
#else
#define css ::com::sun::star
#endif
namespace fpicker{
namespace win32{
namespace vista{
//-----------------------------------------------------------------------------
/** @todo document me
*/
class Request
{
//-------------------------------------------------------------------------
public:
static const ::sal_Int32 WAIT_INFINITE = 0;
//-------------------------------------------------------------------------
// interface
//-------------------------------------------------------------------------
public:
//---------------------------------------------------------------------
explicit Request()
: m_aJoiner ( )
, m_nRequest (-1)
, m_lArguments( )
{
m_aJoiner.reset();
}
//---------------------------------------------------------------------
virtual ~Request() {};
//---------------------------------------------------------------------
void setRequest(::sal_Int32 nRequest)
{
m_nRequest = nRequest;
}
//---------------------------------------------------------------------
::sal_Int32 getRequest()
{
return m_nRequest;
}
//---------------------------------------------------------------------
void clearArguments()
{
m_lArguments.clear();
}
//---------------------------------------------------------------------
template< class TArgumentType >
void setArgument(const ::rtl::OUString& sName ,
const TArgumentType& aValue)
{
m_lArguments[sName] <<= aValue;
}
//---------------------------------------------------------------------
template< class TArgumentType >
TArgumentType getArgumentOrDefault(const ::rtl::OUString& sName ,
const TArgumentType& aDefault)
{
return m_lArguments.getUnpackedValueOrDefault(sName, aDefault);
}
//---------------------------------------------------------------------
void wait(::sal_Int32 nMilliSeconds = WAIT_INFINITE);
void waitProcessMessages();
//---------------------------------------------------------------------
void notify();
//-------------------------------------------------------------------------
// member
//-------------------------------------------------------------------------
private:
::osl::Condition m_aJoiner;
::sal_Int32 m_nRequest;
::comphelper::SequenceAsHashMap m_lArguments;
};
typedef ::boost::shared_ptr< Request > RequestRef;
typedef ::std::queue< RequestRef > RequestQueue;
//-----------------------------------------------------------------------------
class RequestHandler
{
public:
virtual void before() = 0;
virtual void doRequest(const RequestRef& rRequest) = 0;
virtual void after() = 0;
};
typedef ::boost::shared_ptr< RequestHandler > RequestHandlerRef;
//-----------------------------------------------------------------------------
/** @todo docuemnt me
*/
class AsyncRequests : private ::cppu::BaseMutex
, public ::osl::Thread
{
public:
static const ::sal_Int16 PROCESS_MESSAGES = 2;
static const ::sal_Int16 BLOCKED = 1;
static const ::sal_Int16 NON_BLOCKED = 0;
//---------------------------------------------------------------------
/** creates the new asynchronous request executor.
*/
explicit AsyncRequests(const RequestHandlerRef& rHandler);
void setHandler(const RequestHandlerRef& rHandler)
{
m_rHandler = rHandler;
}
//---------------------------------------------------------------------
/** does nothing special / excepting to make sure our class wont be inline .-)
*/
virtual ~AsyncRequests();
//---------------------------------------------------------------------
/** @todo document me
*/
void triggerRequestProcessMessages (const RequestRef& rRequest);
//---------------------------------------------------------------------
/** @todo document me
*/
void triggerRequestBlocked(const RequestRef& rRequest);
//---------------------------------------------------------------------
/** @todo document me
*/
void triggerRequestNonBlocked(const RequestRef& rRequest);
//---------------------------------------------------------------------
/** @todo document me
*/
void triggerRequestDirectly(const RequestRef& rRequest);
//---------------------------------------------------------------------
/** @todo document me
*/
void triggerRequestThreadAware(const RequestRef& rRequest,
::sal_Int16 nWait );
private:
//---------------------------------------------------------------------
/** our STA .-)
* Will run between start() & finish(). Internaly it runs a loop ...
* waiting for requests. Every request will be executed synchronously
* in blocked mode.
*/
virtual void SAL_CALL run();
private:
::sal_Bool m_bFinish;
RequestHandlerRef m_rHandler;
RequestQueue m_lRequests;
};
} // namespace vista
} // namespace win32
} // namespace fpicker
#undef css
#endif // FPICKER_WIN32_VISTA_ASYNCREQUESTS_HXX