diff options
Diffstat (limited to 'svl/source/svdde/ddesvr.cxx')
-rw-r--r-- | svl/source/svdde/ddesvr.cxx | 231 |
1 files changed, 123 insertions, 108 deletions
diff --git a/svl/source/svdde/ddesvr.cxx b/svl/source/svdde/ddesvr.cxx index 3d3c5029c6a7..99b8cce0ae71 100644 --- a/svl/source/svdde/ddesvr.cxx +++ b/svl/source/svdde/ddesvr.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -30,16 +31,12 @@ #define UNICODE #include "ddeimp.hxx" +#include <algorithm> #include <svl/svdde.hxx> #include <svl/svarray.hxx> #include <tools/debug.hxx> #include <osl/thread.h> -//static long hCurConv = 0; -//static DWORD hDdeInst = NULL; -//static short nInstance = 0; -//static DdeServices* pServices; - enum DdeItemType { DDEITEM, @@ -64,8 +61,8 @@ HDDEDATA CALLBACK DdeInternal::SvrCallback( WORD nCode, WORD nCbType, HCONV hConv, HSZ hText1, HSZ hText2, HDDEDATA hData, DWORD, DWORD ) #else -#if defined ( MTW ) || ( defined ( GCC ) && defined ( OS2 )) || defined( ICC ) -HDDEDATA CALLBACK __EXPORT DdeInternal::SvrCallback( +#if defined( ICC ) +HDDEDATA CALLBACK DdeInternal::SvrCallback( WORD nCode, WORD nCbType, HCONV hConv, HSZ hText1, HSZ hText2, HDDEDATA hData, DWORD, DWORD ) #else @@ -125,10 +122,10 @@ HDDEDATA CALLBACK _export DdeInternal::SvrCallback( { if ( !hText2 || ( *pService->pName == hText2 ) ) { - for( pTopic = pService->aTopics.First(); pTopic; - pTopic = pService->aTopics.Next() ) + std::vector<DdeTopic*>::const_iterator iter; + for (iter = pService->aTopics.begin(); iter != pService->aTopics.end(); ++iter) { - if ( !hText1 || (*pTopic->pName == hText1) ) + if ( !hText1 || iter->pName == hText1 ) nTopics++; } } @@ -213,7 +210,7 @@ HDDEDATA CALLBACK _export DdeInternal::SvrCallback( pC = new Conversation; pC->hConv = hConv; pC->pTopic = pTopic; - pService->pConv->Insert( pC ); + pService->pConv->push_back( pC ); } } return (HDDEDATA)NULL; @@ -221,9 +218,9 @@ HDDEDATA CALLBACK _export DdeInternal::SvrCallback( for ( pService = rAll.First(); pService; pService = rAll.Next() ) { - for( pC = pService->pConv->First(); pC; - pC = pService->pConv->Next() ) + for ( size_t i = 0, n = pService->pConv->size(); i < n; ++i ) { + pC = (*pService->pConv)[ i ]; if ( pC->hConv == hConv ) goto found; } @@ -235,8 +232,17 @@ found: if ( nCode == XTYP_DISCONNECT) { pC->pTopic->_Disconnect( (long) hConv ); - pService->pConv->Remove( pC ); - delete pC; + for ( ConvList::iterator it = pService->pConv->begin(); + it < pService->pConv->end(); + ++it + ) { + if ( *it == pC ) + { + delete *it; + pService->pConv->erase( it ); + break; + } + } return (HDDEDATA)NULL; } @@ -325,25 +331,38 @@ found: if( !pItem->pImpData && pTopic->StartAdviseLoop() ) { // dann wurde das Item ausgewechselt - pTopic->aItems.Remove( pItem ); - DdeItem* pTmp; - for( pTmp = pTopic->aItems.First(); pTmp; - pTmp = pTopic->aItems.Next() ) - if( *pTmp->pName == hText2 ) + std::vector<DdeItem*>::iterator it(std::find(pTopic->aItems.begin(), + pTopic->aItems.end(), + pItem)); + if (it != pTopic->aItems.end()) + pTopic->aItems.erase(it); + + std::vector<DdeItem*>::iterator iter; + for( iter = pTopic->aItems.begin(); + iter != pTopic->aItems.end(); + ++iter ) + { + if( *(*iter)->pName == hText2 ) { // es wurde tatsaechlich ausgewechselt delete pItem; pItem = 0; break; } + } + if( pItem ) // es wurde doch nicht ausgewechselt, also wieder rein - pTopic->aItems.Insert( pItem ); + pTopic->aItems.push_back(pItem); else - pItem = pTmp; + pItem = iter != pTopic->aItems.end() ? *iter : NULL; + } + + if (pItem) + { + pItem->IncMonitor( (long)hConv ); + pInst->hCurConvSvr = NULL; } - pItem->IncMonitor( (long)hConv ); - pInst->hCurConvSvr = NULL; } return (HDDEDATA)sal_True; @@ -398,17 +417,17 @@ DdeService* DdeInternal::FindService( HSZ hService ) DdeTopic* DdeInternal::FindTopic( DdeService& rService, HSZ hTopic ) { - DdeTopic* s; - DdeTopics& rTopics = rService.aTopics; + std::vector<DdeTopic*>::iterator iter; + std::vector<DdeTopic*> &rTopics = rService.aTopics; int bWeiter = sal_False; DdeInstData* pInst = ImpGetInstData(); DBG_ASSERT(pInst,"SVDDE:No instance data"); do { // middle check loop - for ( s = rTopics.First(); s; s = rTopics.Next() ) + for ( iter = rTopics.begin(); iter != rTopics.end(); ++iter ) { - if ( *s->pName == hTopic ) - return s; + if ( *(*iter)->pName == hTopic ) + return *iter; } bWeiter = !bWeiter; @@ -429,17 +448,17 @@ DdeTopic* DdeInternal::FindTopic( DdeService& rService, HSZ hTopic ) DdeItem* DdeInternal::FindItem( DdeTopic& rTopic, HSZ hItem ) { - DdeItem* s; - DdeItems& rItems = rTopic.aItems; + std::vector<DdeItem*>::iterator iter; + std::vector<DdeItem*> &rItems = rTopic.aItems; DdeInstData* pInst = ImpGetInstData(); DBG_ASSERT(pInst,"SVDDE:No instance data"); int bWeiter = sal_False; do { // middle check loop - for ( s = rItems.First(); s; s = rItems.Next() ) - if ( *s->pName == hItem ) - return s; + for ( iter = rItems.begin(); iter != rItems.end(); ++iter ) + if ( *(*iter)->pName == hItem ) + return *iter; bWeiter = !bWeiter; if( !bWeiter ) @@ -554,28 +573,30 @@ DdeServices& DdeService::GetServices() void DdeService::AddTopic( const DdeTopic& rTopic ) { RemoveTopic( rTopic ); - aTopics.Insert( (DdeTopic*) &rTopic ); + aTopics.push_back((DdeTopic *) &rTopic); } // --- DdeService::RemoveTopic() ----------------------------------- void DdeService::RemoveTopic( const DdeTopic& rTopic ) { - DdeTopic* t; - for ( t = aTopics.First(); t; t = aTopics.Next() ) + std::vector<DdeTopic*>::iterator iter; + for ( iter = aTopics.begin(); iter != aTopics.end(); ++iter ) { - if ( !DdeCmpStringHandles (*t->pName, *rTopic.pName ) ) + if ( !DdeCmpStringHandles (*(*iter)->pName, *rTopic.pName ) ) { - aTopics.Remove( t ); + aTopics.erase(iter); // JP 27.07.95: und alle Conversions loeschen !!! // (sonst wird auf geloeschten Topics gearbeitet!!) - for( sal_uLong n = pConv->Count(); n; ) + for( size_t n = pConv->size(); n; ) { - Conversation* pC = pConv->GetObject( --n ); + Conversation* pC = (*pConv)[ --n ]; if( pC->pTopic == &rTopic ) { - pConv->Remove( pC ); - delete pC; + ConvList::iterator it = pConv->begin(); + ::std::advance( it, n ); + delete *it; + pConv->erase( it ); } } break; @@ -587,7 +608,10 @@ void DdeService::RemoveTopic( const DdeTopic& rTopic ) sal_Bool DdeService::HasCbFormat( sal_uInt16 nFmt ) { - return sal_Bool( aFormats.GetPos( nFmt ) != LIST_ENTRY_NOTFOUND ); + for ( size_t i = 0, n = aFormats.size(); i < n; ++i ) + if ( aFormats[ i ] == nFmt ) + return true; + return false; } // --- DdeService::HasFormat() ------------------------------------- @@ -602,15 +626,23 @@ sal_Bool DdeService::HasFormat( sal_uLong nFmt ) void DdeService::AddFormat( sal_uLong nFmt ) { nFmt = DdeData::GetExternalFormat( nFmt ); - aFormats.Remove( nFmt ); - aFormats.Insert( nFmt ); + for ( size_t i = 0, n = aFormats.size(); i < n; ++i ) + if ( aFormats[ i ] == nFmt ) + return; + aFormats.push_back( nFmt ); } // --- DdeService::RemoveFormat() ---------------------------------- void DdeService::RemoveFormat( sal_uLong nFmt ) { - aFormats.Remove( DdeData::GetExternalFormat( nFmt ) ); + nFmt = DdeData::GetExternalFormat( nFmt ); + for ( DdeFormats::iterator it = aFormats.begin(); it < aFormats.end(); ++it ) { + if ( *it == nFmt ) { + aFormats.erase( it ); + break; + } + } } // --- DdeTopic::DdeTopic() ---------------------------------------- @@ -626,13 +658,13 @@ DdeTopic::DdeTopic( const String& rName ) DdeTopic::~DdeTopic() { - DdeItem* t; - while( ( t = aItems.First() ) != NULL ) + std::vector<DdeItem*>::iterator iter; + for (iter = aItems.begin(); iter != aItems.end(); ++iter) { - aItems.Remove( t ); - t->pMyTopic = 0; - delete t; + (*iter)->pMyTopic = 0; + delete *iter; } + delete pName; } @@ -661,7 +693,7 @@ DdeItem* DdeTopic::AddItem( const DdeItem& r ) s = new DdeItem( r ); if ( s ) { - aItems.Insert( s ); + aItems.push_back( s ); s->pMyTopic = this; } return s; @@ -673,7 +705,7 @@ void DdeTopic::InsertItem( DdeItem* pNew ) { if( pNew ) { - aItems.Insert( pNew ); + aItems.push_back( pNew ); pNew->pMyTopic = this; } } @@ -682,18 +714,18 @@ void DdeTopic::InsertItem( DdeItem* pNew ) void DdeTopic::RemoveItem( const DdeItem& r ) { - DdeItem* s; - for ( s = aItems.First(); s; s = aItems.Next() ) + std::vector<DdeItem*>::iterator iter; + for (iter = aItems.begin(); iter != aItems.end(); ++iter) { - if ( !DdeCmpStringHandles (*s->pName, *r.pName ) ) + if ( !DdeCmpStringHandles (*(*iter)->pName, *r.pName ) ) break; } - if ( s ) + if ( iter != aItems.end() ) { - aItems.Remove( s ); - s->pMyTopic = 0; - delete s; + (*iter)->pMyTopic = 0; + delete *iter; + aItems.erase(iter); } } @@ -701,47 +733,47 @@ void DdeTopic::RemoveItem( const DdeItem& r ) void DdeTopic::NotifyClient( const String& rItem ) { - DdeItem* pItem; + std::vector<DdeItem*>::iterator iter; DdeInstData* pInst = ImpGetInstData(); DBG_ASSERT(pInst,"SVDDE:No instance data"); - for ( pItem = aItems.First(); pItem; pItem = aItems.Next() ) + for ( iter = aItems.begin(); iter != aItems.end(); ++iter) { - if ( pItem->GetName() == rItem ) + if ( (*iter)->GetName() == rItem && (*iter)->pImpData) { - if ( pItem->pImpData ) - DdePostAdvise( pInst->hDdeInstSvr, *pName, *pItem->pName ); + DdePostAdvise( pInst->hDdeInstSvr, *pName, *(*iter)->pName ); + break; } - break; } } // --- DdeTopic::Connect() ----------------------------------------- -void __EXPORT DdeTopic::Connect( long nId ) +void DdeTopic::Connect( long nId ) { aConnectLink.Call( (void*)nId ); } // --- DdeTopic::Disconnect() -------------------------------------- -void __EXPORT DdeTopic::Disconnect( long nId ) +void DdeTopic::Disconnect( long nId ) { aDisconnectLink.Call( (void*)nId ); } // --- DdeTopic::_Disconnect() -------------------------------------- -void __EXPORT DdeTopic::_Disconnect( long nId ) +void DdeTopic::_Disconnect( long nId ) { - for( DdeItem* pItem = aItems.First(); pItem; pItem = aItems.Next() ) - pItem->DecMonitor( nId ); + std::vector<DdeItem*>::iterator iter; + for (iter = aItems.begin(); iter != aItems.end(); ++iter) + (*iter)->DecMonitor( nId ); Disconnect( nId ); } // --- DdeTopic::Get() --------------------------------------------- -DdeData* __EXPORT DdeTopic::Get( sal_uLong nFmt ) +DdeData* DdeTopic::Get( sal_uLong nFmt ) { if ( aGetLink.IsSet() ) return (DdeData*)aGetLink.Call( (void*)nFmt ); @@ -751,7 +783,7 @@ DdeData* __EXPORT DdeTopic::Get( sal_uLong nFmt ) // --- DdeTopic::Put() --------------------------------------------- -sal_Bool __EXPORT DdeTopic::Put( const DdeData* r ) +sal_Bool DdeTopic::Put( const DdeData* r ) { if ( aPutLink.IsSet() ) return (sal_Bool)aPutLink.Call( (void*) r ); @@ -761,7 +793,7 @@ sal_Bool __EXPORT DdeTopic::Put( const DdeData* r ) // --- DdeTopic::Execute() ----------------------------------------- -sal_Bool __EXPORT DdeTopic::Execute( const String* r ) +sal_Bool DdeTopic::Execute( const String* r ) { if ( aExecLink.IsSet() ) return (sal_Bool)aExecLink.Call( (void*)r ); @@ -833,7 +865,8 @@ DdeItem::DdeItem( const DdeItem& r) DdeItem::~DdeItem() { if( pMyTopic ) - pMyTopic->aItems.Remove( this ); + pMyTopic->aItems.erase(std::remove(pMyTopic->aItems.begin(), + pMyTopic->aItems.end(),this)); delete pName; delete pImpData; } @@ -968,18 +1001,18 @@ void DdeGetPutItem::AdviseLoop( sal_Bool ) String DdeService::SysItems() { String s; - DdeTopic* t; - for ( t = aTopics.First(); t; t = aTopics.Next() ) + std::vector<DdeTopic*>::iterator iter; + std::vector<DdeItem*>::iterator iterItem; + for ( iter = aTopics.begin(); iter != aTopics.end(); ++iter ) { - if ( t->GetName() == reinterpret_cast<const sal_Unicode*>(SZDDESYS_TOPIC) ) + if ( (*iter)->GetName() == reinterpret_cast<const sal_Unicode*>(SZDDESYS_TOPIC) ) { short n = 0; - DdeItem* pi; - for ( pi = t->aItems.First(); pi; pi = t->aItems.Next(), n++ ) + for ( iterItem = (*iter)->aItems.begin(); iterItem != (*iter)->aItems.end(); ++iterItem, n++ ) { if ( n ) s += '\t'; - s += pi->GetName(); + s += (*iterItem)->GetName(); } s += String::CreateFromAscii("\r\n"); } @@ -993,14 +1026,14 @@ String DdeService::SysItems() String DdeService::Topics() { String s; - DdeTopic* t; + std::vector<DdeTopic*>::iterator iter; short n = 0; - for ( t = aTopics.First(); t; t = aTopics.Next(), n++ ) + for ( iter = aTopics.begin(); iter != aTopics.end(); ++iter, n++ ) { if ( n ) s += '\t'; - s += t->GetName(); + s += (*iter)->GetName(); } s += String::CreateFromAscii("\r\n"); @@ -1017,8 +1050,9 @@ String DdeService::Formats() LPCTSTR p; short n = 0; - for ( f = aFormats.First(); f; f = aFormats.Next(), n++ ) + for ( size_t i = 0; i < aFormats.size(); ++i, n++ ) { + f = aFormats[ i ]; if ( n ) s += '\t'; p = buf; @@ -1031,28 +1065,8 @@ String DdeService::Formats() case CF_BITMAP: p = reinterpret_cast<LPCTSTR>(String::CreateFromAscii("BITMAP").GetBuffer()); break; -#ifdef OS2 - case CF_DSPTEXT: - p = String::CreateFromAscii("TEXT").GetBuffer(); - break; - case CF_DSPBITMAP: - p = String::CreateFromAscii("BITMAP").GetBuffer(); - break; - case CF_METAFILE: - p = String::CreateFromAscii("METAFILE").GetBuffer(); - break; - case CF_DSPMETAFILE: - p = String::CreateFromAscii("METAFILE").GetBuffer(); - break; - case CF_PALETTE: - p = String::CreateFromAscii("PALETTE").GetBuffer(); - break; - default: - p= String::CreateFromAscii("PRIVATE").GetBuffer(); -#else default: GetClipboardFormatName( (UINT)f, buf, sizeof(buf) / sizeof(TCHAR) ); -#endif } s += String( reinterpret_cast<const sal_Unicode*>(p) ); } @@ -1070,14 +1084,14 @@ String DdeService::Status() // --- DdeService::IsBusy() ---------------------------------------- -sal_Bool __EXPORT DdeService::IsBusy() +sal_Bool DdeService::IsBusy() { return sal_False; } // --- DdeService::GetHelp() ---------------------------------------- -String __EXPORT DdeService::GetHelp() +String DdeService::GetHelp() { return String(); } @@ -1102,3 +1116,4 @@ sal_Bool DdeService::SysTopicExecute( const String* ) return sal_False; } +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |