Looking for help for clipboard in Math

Regina Henschel rb.henschel at t-online.de
Sat Jun 6 13:03:31 PDT 2015


Hi Michael,

thank-you for looking at my problems.

Michael Stahl schrieb:
> On 05.06.2015 01:44, Regina Henschel wrote:
>> Hi all,
>>
>> I struggle with the clipboard. My goal is to import MathML in module
>> Math from clipboard, similar as it is imported from file. But I'm stuck.
>> Therefore some questions:
[skipped a lot of text]
>
> include/sot/formats.hxx: enum class SotClipboardFormatId
>
> there is no MathML in there, but various STARMATH_* ones.
>
>      // the point at which we start allocating "runtime" format IDs
>      USER_END  = STARWRITERGLOB_8_TEMPLATE
>
> so what you probably have as ID is "user-defined", which means we can't
> do anything with it really.
>
> it looks like there needs to be some mapping from the OS-specific
> clipboard to these office-internal IDs - if there's no ID for MathML it
> can't be mapped.
>
> there is a big array in sot/source/base/exchange.cxx, you probably need
> to add an entry for MathML there.
>
> the array is ordered and indexed by the SotClipboardFormatId.
>
> /* 48 SotClipboardFormatId::STARMATH_50*/            {
> "application/x-openoffice-starmath-50;windows_formatname=\"StarMath
> 5.0\"", "StarMath 5.0", &cppu::UnoType<Sequence<sal_Int8>>::get() },
>
> that's the mime-type and human-readable name.
>
> i was wondering how this would work on Windows, given that the Win32
> clipboard presumably does not use mime-types; apparently the
> ";windows_formatname=\"...\"" appendix to the mime-type here covers that.

Helpful comments. Looking around I think, the connection to the OS is 
done in /main/dtrans/source/win32/

I have found the table m_TranslTable, which refers the SOT_FORMATSTR_IDs 
from exchange.cxx. I'll try what happens, when I add the MathML format 
there too. I had already added it in exchange.cxx, but that was not 
enough to be recognized. [I need some time for that. I will report back, 
when I have finished.]


>
>> (5)
>> I try to use SmViewShell::InsertFrom(SfxMedium &rMedium). It seems to
>> work, but when the process arrives at SmXMLImport::endDocument(void),
>> the node tree is empty.  Any tips, what I might have missed?
>
> how do you prepare the SfxMedium?  i'm not sure if it requires an actual
> file, or if it can read from an input stream (XInputStream); it probably
> can't read from a Sequence<sal_Int8> buffer directly...
>
> there is a SfxMedium::setStreamToLoadFrom() which looks promising.

I have used:

TransferableDataHelper aDataHelper( 
TransferableDataHelper::CreateFromSystemClipboard(GetEditWindow()) );
uno::Reference < io::XInputStream > xStrm;
aDataHelper.GetInputStream( nId, xStrm );
SfxMedium* pClipboardMedium = new SfxMedium();
SfxMedium aClipboardMedium = *pClipboardMedium;
aClipboardMedium.setStreamToLoadFrom( xStrm, sal_True /*bIsReadOnly*/ );
InsertFrom(aClipboardMedium);


When I then proof it with

SvStream* pStream = aClipboardMedium.GetInStream();
...
sal_uLong nBytesRead = pStream->Read( aBuffer, nBufferSize );
printf("%s \n", aBuffer);

I can see, that the stream contains the expected MathML-source in case 
the clipboard viewer lists the clipboard format "application/mathml+xml".

In addition I have set the filter by

const SfxFilter* pMathFilter = SfxFilter::GetFilterByName( 
String::CreateFromAscii(MATHML_XML) );
aClipboardMedium.SetFilter(pMathFilter);

so that

if ( rFltName.EqualsAscii(MATHML_XML) )

in InsertFrom becomes true


I'm still a novice in coding and it might be, that I do basic things wrong.


>
> you can create an input stream from the buffer via SvMemoryStream and
> then wrap that in utl::OInputStreamWrapper.

You mean, it will be possible to use the "Unicode-Text"? That would 
help, when copying from Websites. But first I need to solve the problem, 
that I get no node-tree, and the problem to detect the clipboard correctly.

Kind regards
Regina


More information about the LibreOffice mailing list