blob: 62c8150aec72abad8a387610546071e5779e55fb [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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svl.hxx"
// ACHTUNG: es wird angenommen, dass StarView-Clipboard-Foamatnummern
// und Windows-Formatnummern identisch sind! Ist dies einmal nicht der
// Fall, muessen die Routinen hier angepasst werden. Die Implementation
// verwendet die hier defineirten Konversionen.
#define UNICODE
#include <string.h>
#include "ddeimp.hxx"
#include <svl/svdde.hxx>
#include <osl/thread.h>
// --- DdeData::DdeData() ------------------------------------------
DdeData::DdeData()
{
pImp = new DdeDataImp;
pImp->hData = NULL;
pImp->nData = 0;
pImp->pData = NULL;
pImp->nFmt = CF_TEXT;
}
// --- DdeData::DdeData() ------------------------------------------
DdeData::DdeData( const void* p, long n, sal_uLong f )
{
pImp = new DdeDataImp;
pImp->hData = NULL;
pImp->pData = (LPBYTE)p;
pImp->nData = n;
pImp->nFmt = f;
}
// --- DdeData::DdeData() ------------------------------------------
DdeData::DdeData( const String& s )
{
pImp = new DdeDataImp;
pImp->hData = NULL;
pImp->pData = (LPBYTE)s.GetBuffer();
pImp->nData = s.Len()+1;
pImp->nFmt = CF_TEXT;
}
// --- DdeData::DdeData() ------------------------------------------
DdeData::DdeData( const DdeData& rData )
{
pImp = new DdeDataImp;
pImp->hData = rData.pImp->hData;
pImp->nData = rData.pImp->nData;
pImp->pData = rData.pImp->pData;
pImp->nFmt = rData.pImp->nFmt;
Lock();
}
// --- DdeData::~DdeData() -----------------------------------------
DdeData::~DdeData()
{
if ( pImp && pImp->hData )
DdeUnaccessData( pImp->hData );
delete pImp;
}
// --- DdeData::Lock() ---------------------------------------------
void DdeData::Lock()
{
if ( pImp->hData )
pImp->pData = DdeAccessData( pImp->hData, (LPDWORD) &pImp->nData );
}
// --- DdeData::GetFormat() ----------------------------------------
sal_uLong DdeData::GetFormat() const
{
return pImp->nFmt;
}
void DdeData::SetFormat( sal_uLong nFmt )
{
pImp->nFmt = nFmt;
}
// --- DdeData::operator const char*() -----------------------------
DdeData::operator const void*() const
{
return pImp->pData;
}
// --- DdeData::operator long() ------------------------------------
DdeData::operator long() const
{
return pImp->nData;
}
// --- DdeData::operator =() ---------------------------------------
DdeData& DdeData::operator = ( const DdeData& rData )
{
if ( &rData != this )
{
DdeData tmp( rData );
delete pImp;
pImp = tmp.pImp;
tmp.pImp = NULL;
}
return *this;
}
sal_uLong DdeData::GetExternalFormat( sal_uLong nFmt )
{
switch( nFmt )
{
case FORMAT_STRING:
nFmt = CF_TEXT;
break;
case FORMAT_BITMAP:
nFmt = CF_BITMAP;
break;
case FORMAT_GDIMETAFILE:
nFmt = CF_METAFILEPICT;
break;
default:
{
#if defined(WNT) || defined( PM2 )
String aName( SotExchange::GetFormatName( nFmt ) );
#if defined(WNT)
if( aName.Len() )
nFmt = RegisterClipboardFormat( reinterpret_cast<LPCWSTR>(aName.GetBuffer()) );
#endif
#if defined( PM2 )
if( aName.Len() )
{
HATOMTBL hSysTable = WinQuerySystemAtomTable();
nFmt = (sal_uLong)WinAddAtom( hSysTable, (PSZ)aName.GetBuffer() );
}
#endif
#endif
}
}
return nFmt;
}
sal_uLong DdeData::GetInternalFormat( sal_uLong nFmt )
{
switch( nFmt )
{
case CF_TEXT:
nFmt = FORMAT_STRING;
break;
case CF_BITMAP:
nFmt = FORMAT_BITMAP;
break;
case CF_METAFILEPICT:
nFmt = FORMAT_GDIMETAFILE;
break;
default:
#if defined(WNT)
if( nFmt >= CF_MAX )
{
TCHAR szName[ 256 ];
if( GetClipboardFormatName( nFmt, szName, sizeof(szName) ) )
nFmt = SotExchange::RegisterFormatName( String(reinterpret_cast<const sal_Unicode*>(szName)) );
}
#endif
#if defined(PM2)
if( nFmt > CF_PALETTE )
{
char szName[ 256 ];
HATOMTBL hSysTable = WinQuerySystemAtomTable();
WinQueryAtomName( hSysTable, (ATOM)nFmt, (PSZ)szName,
sizeof( szName ) );
nFmt = SotExchange::RegisterFormatName( String( szName ) );
}
#endif
break;
}
return nFmt;
}