1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef FPICKER_WIN32_VISTA_ASYNCREQUESTS_HXX 25*b1cdbd2cSJim Jagielski #define FPICKER_WIN32_VISTA_ASYNCREQUESTS_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 28*b1cdbd2cSJim Jagielski // includes 29*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #include <cppuhelper/basemutex.hxx> 32*b1cdbd2cSJim Jagielski #include <comphelper/sequenceashashmap.hxx> 33*b1cdbd2cSJim Jagielski #include <osl/conditn.hxx> 34*b1cdbd2cSJim Jagielski #include <osl/thread.hxx> 35*b1cdbd2cSJim Jagielski #include <osl/time.h> 36*b1cdbd2cSJim Jagielski #include <queue> 37*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp> 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 40*b1cdbd2cSJim Jagielski // namespace 41*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski #ifdef css 44*b1cdbd2cSJim Jagielski #error "Clash on using CSS as namespace define." 45*b1cdbd2cSJim Jagielski #else 46*b1cdbd2cSJim Jagielski #define css ::com::sun::star 47*b1cdbd2cSJim Jagielski #endif 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski namespace fpicker{ 50*b1cdbd2cSJim Jagielski namespace win32{ 51*b1cdbd2cSJim Jagielski namespace vista{ 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 54*b1cdbd2cSJim Jagielski /** @todo document me 55*b1cdbd2cSJim Jagielski */ 56*b1cdbd2cSJim Jagielski class Request 57*b1cdbd2cSJim Jagielski { 58*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 59*b1cdbd2cSJim Jagielski public: 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski static const ::sal_Int32 WAIT_INFINITE = 0; 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 64*b1cdbd2cSJim Jagielski // interface 65*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski public: 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- Request()70*b1cdbd2cSJim Jagielski explicit Request() 71*b1cdbd2cSJim Jagielski : m_aJoiner ( ) 72*b1cdbd2cSJim Jagielski , m_nRequest (-1) 73*b1cdbd2cSJim Jagielski , m_lArguments( ) 74*b1cdbd2cSJim Jagielski { 75*b1cdbd2cSJim Jagielski m_aJoiner.reset(); 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- ~Request()79*b1cdbd2cSJim Jagielski virtual ~Request() {}; 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- setRequest(::sal_Int32 nRequest)82*b1cdbd2cSJim Jagielski void setRequest(::sal_Int32 nRequest) 83*b1cdbd2cSJim Jagielski { 84*b1cdbd2cSJim Jagielski m_nRequest = nRequest; 85*b1cdbd2cSJim Jagielski } 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getRequest()88*b1cdbd2cSJim Jagielski ::sal_Int32 getRequest() 89*b1cdbd2cSJim Jagielski { 90*b1cdbd2cSJim Jagielski return m_nRequest; 91*b1cdbd2cSJim Jagielski } 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- clearArguments()94*b1cdbd2cSJim Jagielski void clearArguments() 95*b1cdbd2cSJim Jagielski { 96*b1cdbd2cSJim Jagielski m_lArguments.clear(); 97*b1cdbd2cSJim Jagielski } 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 100*b1cdbd2cSJim Jagielski template< class TArgumentType > setArgument(const::rtl::OUString & sName,const TArgumentType & aValue)101*b1cdbd2cSJim Jagielski void setArgument(const ::rtl::OUString& sName , 102*b1cdbd2cSJim Jagielski const TArgumentType& aValue) 103*b1cdbd2cSJim Jagielski { 104*b1cdbd2cSJim Jagielski m_lArguments[sName] <<= aValue; 105*b1cdbd2cSJim Jagielski } 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 108*b1cdbd2cSJim Jagielski template< class TArgumentType > getArgumentOrDefault(const::rtl::OUString & sName,const TArgumentType & aDefault)109*b1cdbd2cSJim Jagielski TArgumentType getArgumentOrDefault(const ::rtl::OUString& sName , 110*b1cdbd2cSJim Jagielski const TArgumentType& aDefault) 111*b1cdbd2cSJim Jagielski { 112*b1cdbd2cSJim Jagielski return m_lArguments.getUnpackedValueOrDefault(sName, aDefault); 113*b1cdbd2cSJim Jagielski } 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 116*b1cdbd2cSJim Jagielski void wait(::sal_Int32 nMilliSeconds = WAIT_INFINITE); 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski void waitProcessMessages(); 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 121*b1cdbd2cSJim Jagielski void notify(); 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 124*b1cdbd2cSJim Jagielski // member 125*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski private: 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski ::osl::Condition m_aJoiner; 130*b1cdbd2cSJim Jagielski ::sal_Int32 m_nRequest; 131*b1cdbd2cSJim Jagielski ::comphelper::SequenceAsHashMap m_lArguments; 132*b1cdbd2cSJim Jagielski }; 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< Request > RequestRef; 135*b1cdbd2cSJim Jagielski typedef ::std::queue< RequestRef > RequestQueue; 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 138*b1cdbd2cSJim Jagielski class RequestHandler 139*b1cdbd2cSJim Jagielski { 140*b1cdbd2cSJim Jagielski public: 141*b1cdbd2cSJim Jagielski virtual void before() = 0; 142*b1cdbd2cSJim Jagielski virtual void doRequest(const RequestRef& rRequest) = 0; 143*b1cdbd2cSJim Jagielski virtual void after() = 0; 144*b1cdbd2cSJim Jagielski }; 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< RequestHandler > RequestHandlerRef; 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 149*b1cdbd2cSJim Jagielski /** @todo docuemnt me 150*b1cdbd2cSJim Jagielski */ 151*b1cdbd2cSJim Jagielski class AsyncRequests : private ::cppu::BaseMutex 152*b1cdbd2cSJim Jagielski , public ::osl::Thread 153*b1cdbd2cSJim Jagielski { 154*b1cdbd2cSJim Jagielski public: 155*b1cdbd2cSJim Jagielski static const ::sal_Int16 PROCESS_MESSAGES = 2; 156*b1cdbd2cSJim Jagielski static const ::sal_Int16 BLOCKED = 1; 157*b1cdbd2cSJim Jagielski static const ::sal_Int16 NON_BLOCKED = 0; 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 160*b1cdbd2cSJim Jagielski /** creates the new asynchronous request executor. 161*b1cdbd2cSJim Jagielski */ 162*b1cdbd2cSJim Jagielski explicit AsyncRequests(const RequestHandlerRef& rHandler); 163*b1cdbd2cSJim Jagielski setHandler(const RequestHandlerRef & rHandler)164*b1cdbd2cSJim Jagielski void setHandler(const RequestHandlerRef& rHandler) 165*b1cdbd2cSJim Jagielski { 166*b1cdbd2cSJim Jagielski m_rHandler = rHandler; 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 170*b1cdbd2cSJim Jagielski /** does nothing special / excepting to make sure our class wont be inline .-) 171*b1cdbd2cSJim Jagielski */ 172*b1cdbd2cSJim Jagielski virtual ~AsyncRequests(); 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 175*b1cdbd2cSJim Jagielski /** @todo document me 176*b1cdbd2cSJim Jagielski */ 177*b1cdbd2cSJim Jagielski void triggerRequestProcessMessages (const RequestRef& rRequest); 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 180*b1cdbd2cSJim Jagielski /** @todo document me 181*b1cdbd2cSJim Jagielski */ 182*b1cdbd2cSJim Jagielski void triggerRequestBlocked(const RequestRef& rRequest); 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 185*b1cdbd2cSJim Jagielski /** @todo document me 186*b1cdbd2cSJim Jagielski */ 187*b1cdbd2cSJim Jagielski void triggerRequestNonBlocked(const RequestRef& rRequest); 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 190*b1cdbd2cSJim Jagielski /** @todo document me 191*b1cdbd2cSJim Jagielski */ 192*b1cdbd2cSJim Jagielski void triggerRequestDirectly(const RequestRef& rRequest); 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 195*b1cdbd2cSJim Jagielski /** @todo document me 196*b1cdbd2cSJim Jagielski */ 197*b1cdbd2cSJim Jagielski void triggerRequestThreadAware(const RequestRef& rRequest, 198*b1cdbd2cSJim Jagielski ::sal_Int16 nWait ); 199*b1cdbd2cSJim Jagielski 200*b1cdbd2cSJim Jagielski private: 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 203*b1cdbd2cSJim Jagielski /** our STA .-) 204*b1cdbd2cSJim Jagielski * Will run between start() & finish(). Internaly it runs a loop ... 205*b1cdbd2cSJim Jagielski * waiting for requests. Every request will be executed synchronously 206*b1cdbd2cSJim Jagielski * in blocked mode. 207*b1cdbd2cSJim Jagielski */ 208*b1cdbd2cSJim Jagielski virtual void SAL_CALL run(); 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski private: 211*b1cdbd2cSJim Jagielski 212*b1cdbd2cSJim Jagielski ::sal_Bool m_bFinish; 213*b1cdbd2cSJim Jagielski RequestHandlerRef m_rHandler; 214*b1cdbd2cSJim Jagielski RequestQueue m_lRequests; 215*b1cdbd2cSJim Jagielski }; 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski } // namespace vista 218*b1cdbd2cSJim Jagielski } // namespace win32 219*b1cdbd2cSJim Jagielski } // namespace fpicker 220*b1cdbd2cSJim Jagielski 221*b1cdbd2cSJim Jagielski #undef css 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski #endif // FPICKER_WIN32_VISTA_ASYNCREQUESTS_HXX 224