blob: ffe80dc257ddbfe1aa38f2130201490cd93cb683 [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 _SVP_SALINST_HXX
#define _SVP_SALINST_HXX
#include <vos/mutex.hxx>
#include <vos/thread.hxx>
#include <salinst.hxx>
#include <salwtype.hxx>
#include <saltimer.hxx>
#include <list>
#include <time.h> // timeval
#define VIRTUAL_DESKTOP_WIDTH 1024
#define VIRTUAL_DESKTOP_HEIGHT 768
#define VIRTUAL_DESKTOP_DEPTH 24
// -------------------------------------------------------------------------
// SalYieldMutex
// -------------------------------------------------------------------------
class SvpSalYieldMutex : public vos::OMutex
{
protected:
sal_uLong mnCount;
vos::OThread::TThreadIdentifier mnThreadId;
public:
SvpSalYieldMutex();
virtual void acquire();
virtual void release();
virtual sal_Bool tryToAcquire();
sal_uLong GetAcquireCount() const { return mnCount; }
vos::OThread::TThreadIdentifier GetThreadId() const { return mnThreadId; }
};
// ---------------
// - SalTimer -
// ---------------
class SvpSalInstance;
class SvpSalTimer : public SalTimer
{
SvpSalInstance* m_pInstance;
public:
SvpSalTimer( SvpSalInstance* pInstance ) : m_pInstance( pInstance ) {}
virtual ~SvpSalTimer();
// overload all pure virtual methods
virtual void Start( sal_uLong nMS );
virtual void Stop();
};
// ---------------
// - SalInstance -
// ---------------
class SvpSalFrame;
class SvpSalInstance : public SalInstance
{
timeval m_aTimeout;
sal_uLong m_nTimeoutMS;
int m_pTimeoutFDS[2];
SvpSalYieldMutex m_aYieldMutex;
// internal event queue
struct SalUserEvent
{
const SalFrame* m_pFrame;
void* m_pData;
sal_uInt16 m_nEvent;
SalUserEvent( const SalFrame* pFrame, void* pData, sal_uInt16 nEvent = SALEVENT_USEREVENT )
: m_pFrame( pFrame ),
m_pData( pData ),
m_nEvent( nEvent )
{}
};
oslMutex m_aEventGuard;
std::list< SalUserEvent > m_aUserEvents;
std::list< SalFrame* > m_aFrames;
bool isFrameAlive( const SalFrame* pFrame ) const;
public:
static SvpSalInstance* s_pDefaultInstance;
SvpSalInstance();
virtual ~SvpSalInstance();
void PostEvent( const SalFrame* pFrame, void* pData, sal_uInt16 nEvent );
void CancelEvent( const SalFrame* pFrame, void* pData, sal_uInt16 nEvent );
void StartTimer( sal_uLong nMS );
void StopTimer();
void Wakeup();
void registerFrame( SalFrame* pFrame ) { m_aFrames.push_back( pFrame ); }
void deregisterFrame( SalFrame* pFrame );
const std::list< SalFrame* >& getFrames() const { return m_aFrames; }
bool CheckTimeout( bool bExecuteTimers = true );
// Frame
virtual SalFrame* CreateChildFrame( SystemParentData* pParent, sal_uLong nStyle );
virtual SalFrame* CreateFrame( SalFrame* pParent, sal_uLong nStyle );
virtual void DestroyFrame( SalFrame* pFrame );
// Object (System Child Window)
virtual SalObject* CreateObject( SalFrame* pParent, SystemWindowData* pWindowData, sal_Bool bShow = sal_True );
virtual void DestroyObject( SalObject* pObject );
// VirtualDevice
// nDX and nDY in Pixel
// nBitCount: 0 == Default(=as window) / 1 == Mono
// pData allows for using a system dependent graphics or device context
virtual SalVirtualDevice* CreateVirtualDevice( SalGraphics* pGraphics,
long nDX, long nDY,
sal_uInt16 nBitCount, const SystemGraphicsData *pData = NULL );
virtual void DestroyVirtualDevice( SalVirtualDevice* pDevice );
// Printer
// pSetupData->mpDriverData can be 0
// pSetupData must be updatet with the current
// JobSetup
virtual SalInfoPrinter* CreateInfoPrinter( SalPrinterQueueInfo* pQueueInfo,
ImplJobSetup* pSetupData );
virtual void DestroyInfoPrinter( SalInfoPrinter* pPrinter );
virtual SalPrinter* CreatePrinter( SalInfoPrinter* pInfoPrinter );
virtual void DestroyPrinter( SalPrinter* pPrinter );
virtual void GetPrinterQueueInfo( ImplPrnQueueList* pList );
virtual void GetPrinterQueueState( SalPrinterQueueInfo* pInfo );
virtual void DeletePrinterQueueInfo( SalPrinterQueueInfo* pInfo );
virtual String GetDefaultPrinter();
// SalTimer
virtual SalTimer* CreateSalTimer();
// SalI18NImeStatus
virtual SalI18NImeStatus* CreateI18NImeStatus();
// SalSystem
virtual SalSystem* CreateSalSystem();
// SalBitmap
virtual SalBitmap* CreateSalBitmap();
// YieldMutex
virtual vos::IMutex* GetYieldMutex();
virtual sal_uLong ReleaseYieldMutex();
virtual void AcquireYieldMutex( sal_uLong nCount );
virtual bool CheckYieldMutex();
// wait next event and dispatch
// must returned by UserEvent (SalFrame::PostEvent)
// and timer
virtual void Yield( bool bWait, bool bHandleAllCurrentEvents );
virtual bool AnyInput( sal_uInt16 nType );
// may return NULL to disable session management
virtual SalSession* CreateSalSession();
virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes );
virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType);
};
#endif // _SV_SALINST_HXX