f54b1d1e09
The implementation (in svl/source/svdde/ddedata.cxx) returns any of: * {CF_TEXT=1, CF_BITMAP=2, CF_METFILEPICT=3} from the Windows API; * the return value of Windows API's RegisterClipboardFormatW, which is UINT from the Windows API (i.e., 32-bit unsigned int); * a enum SotClipboardFormatId value, whose underlying type is sal_uInt32. So the natural choice is sal_uInt32 here. (Windows API's UINT would also do, but cannot be used in include/svl/svdde.hxx, which is used on all platforms.) That in turn shows that DdeService's aFormats and HasCbFormat should also use sal_uInt32. (And then, simplify some of the std algorithms use in svl/source/svdde/ddesvr.cxx.) Change-Id: I593d0a7df78bfdd08ce2de04c3da2078d973e262 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106151 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
167 lines
4.1 KiB
C++
167 lines
4.1 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* 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 .
|
|
*/
|
|
|
|
|
|
// ATTENTION: We assume StarView Clipboard format numbers and Windows
|
|
// Format numbers to be the same! If that's not the case, we need to
|
|
// adapt the code here. The implementation uses the conversions here.
|
|
|
|
#include <string.h>
|
|
#include "ddeimp.hxx"
|
|
#include <svl/svdde.hxx>
|
|
#include <o3tl/char16_t2wchar_t.hxx>
|
|
|
|
#include <osl/thread.h>
|
|
#include <sot/exchange.hxx>
|
|
|
|
DdeData::DdeData()
|
|
{
|
|
xImp.reset(new DdeDataImp);
|
|
xImp->hData = nullptr;
|
|
xImp->nData = 0;
|
|
xImp->pData = nullptr;
|
|
xImp->nFmt = SotClipboardFormatId::STRING;
|
|
}
|
|
|
|
DdeData::DdeData(const void* p, tools::Long n, SotClipboardFormatId f)
|
|
{
|
|
xImp.reset(new DdeDataImp);
|
|
xImp->hData = nullptr;
|
|
xImp->pData = p;
|
|
xImp->nData = n;
|
|
xImp->nFmt = f;
|
|
}
|
|
|
|
DdeData::DdeData( const OUString& s )
|
|
{
|
|
xImp.reset(new DdeDataImp);
|
|
xImp->hData = nullptr;
|
|
xImp->pData = s.getStr();
|
|
xImp->nData = s.getLength()+1;
|
|
xImp->nFmt = SotClipboardFormatId::STRING;
|
|
}
|
|
|
|
DdeData::DdeData(const DdeData& rData)
|
|
{
|
|
xImp.reset(new DdeDataImp);
|
|
xImp->hData = rData.xImp->hData;
|
|
xImp->nData = rData.xImp->nData;
|
|
xImp->pData = rData.xImp->pData;
|
|
xImp->nFmt = rData.xImp->nFmt;
|
|
Lock();
|
|
}
|
|
|
|
DdeData::DdeData(DdeData&& rData) noexcept
|
|
: xImp(std::move(rData.xImp))
|
|
{
|
|
}
|
|
|
|
DdeData::~DdeData()
|
|
{
|
|
if (xImp && xImp->hData)
|
|
DdeUnaccessData(xImp->hData);
|
|
}
|
|
|
|
void DdeData::Lock()
|
|
{
|
|
if (xImp->hData)
|
|
xImp->pData = DdeAccessData(xImp->hData, &xImp->nData);
|
|
}
|
|
|
|
SotClipboardFormatId DdeData::GetFormat() const
|
|
{
|
|
return xImp->nFmt;
|
|
}
|
|
|
|
void DdeData::SetFormat(SotClipboardFormatId nFmt)
|
|
{
|
|
xImp->nFmt = nFmt;
|
|
}
|
|
|
|
void const * DdeData::getData() const
|
|
{
|
|
return xImp->pData;
|
|
}
|
|
|
|
tools::Long DdeData::getSize() const
|
|
{
|
|
return xImp->nData;
|
|
}
|
|
|
|
DdeData& DdeData::operator=(const DdeData& rData)
|
|
{
|
|
if ( &rData != this )
|
|
{
|
|
DdeData tmp(rData);
|
|
xImp = std::move(tmp.xImp);
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
DdeData& DdeData::operator=(DdeData&& rData) noexcept
|
|
{
|
|
xImp = std::move(rData.xImp);
|
|
return *this;
|
|
}
|
|
|
|
sal_uInt32 DdeData::GetExternalFormat(SotClipboardFormatId nFmt)
|
|
{
|
|
switch( nFmt )
|
|
{
|
|
case SotClipboardFormatId::STRING:
|
|
return CF_TEXT;
|
|
case SotClipboardFormatId::BITMAP:
|
|
return CF_BITMAP;
|
|
case SotClipboardFormatId::GDIMETAFILE:
|
|
return CF_METAFILEPICT;
|
|
default:
|
|
{
|
|
OUString aName( SotExchange::GetFormatName( nFmt ) );
|
|
if( !aName.isEmpty() )
|
|
return RegisterClipboardFormatW( o3tl::toW(aName.getStr()) );
|
|
}
|
|
}
|
|
return static_cast<sal_uInt32>(nFmt);
|
|
}
|
|
|
|
SotClipboardFormatId DdeData::GetInternalFormat(sal_uLong nFmt)
|
|
{
|
|
switch( nFmt )
|
|
{
|
|
case CF_TEXT:
|
|
return SotClipboardFormatId::STRING;
|
|
case CF_BITMAP:
|
|
return SotClipboardFormatId::BITMAP;
|
|
case CF_METAFILEPICT:
|
|
return SotClipboardFormatId::GDIMETAFILE;
|
|
default:
|
|
if( nFmt >= CF_MAX )
|
|
{
|
|
WCHAR szName[ 256 ];
|
|
|
|
if(GetClipboardFormatNameW( nFmt, szName, SAL_N_ELEMENTS(szName) ))
|
|
return SotExchange::RegisterFormatName( OUString(o3tl::toU(szName)) );
|
|
}
|
|
break;
|
|
}
|
|
return static_cast<SotClipboardFormatId>(nFmt);
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|