Looking for help for clipboard in Math

Michael Stahl mstahl at redhat.com
Fri Jun 5 08:01:49 PDT 2015


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:
> 
> (1)
> Has someone tried such already and found, that it is not possible?

i have no idea about clipboards or Math, but i'm armed with git grep :)

> (2)
> The comments in file exchange.cxx refer to a document "CLIP.SDW". Has 
> someone this document and can provide it?

ehhh.... i'd not hold my breath on that one :)

> (3)
> I have added a .uno command which is executed in 
> SmViewShell::Execute(SfxRequest& rReq)
> 
> My current attempt looks like this:
> 
> TransferableDataHelper aDataHelper( 
> TransferableDataHelper::CreateFromSystemClipboard(GetEditWindow()) );
> SotFormatStringId nId;
> DataFlavorExVector* pFormats;
> pFormats = &aDataHelper.GetDataFlavorExVector();
> DataFlavorExVector::iterator aIter( 
> ((DataFlavorExVector&)*pFormats).begin() ),
>                                  aEnd( 
> ((DataFlavorExVector&)*pFormats).end() );
> while ( aIter != aEnd )
> {
>      nId = (*aIter).mnSotId;
> ...
>      aIter++;
> }
> 
> I get some nId-values and for some of them I can get a stream and can 
> look at the content. But the clipboard content, which is generated by 
> the Windows program "Math Input Control" (mip.exe) is not noticed. But I 
> see that the clipboard has a content "MathML" and a content "MathML 
> Presentation" using the clipboard viewer "Free Clipboard Viewer 2.0". 
> Why do I get no nId for it?

include/sot/exchange.hxx:

struct DataFlavorEx : public ::com::sun::star::datatransfer::DataFlavor

this has a "SotClipboardFormatId mnSotId" and a "string MimeType" - how
does the system specifc clipboard data get translated to that...

> (4)
> The numbers I get in nId are those from the list in exchange.cxx, and 
> for "application/mathml+xml", which is not listed there, I get the next 
> one following the list. But how can I get the MimeType or the 
> HumanPresentableName for the detected nId? My following try does not 
> work, the strings are empty in all cases:
> 
> ::com::sun::star::datatransfer::DataFlavor aFlavor;
> SotExchange::GetFormatDataFlavor( nId, aFlavor ) )
> String sHumanPresentableName(aFlavor.HumanPresentableName);
> String sMimeType(aFlavor.MimeType);

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.

> (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.

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



More information about the LibreOffice mailing list