/* -*- 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/. */ #include "Receiver.hxx" #include #include #include #include #include #include #include #include #include #include #include using namespace sd; // using namespace ::com::sun::star::presentation; // using namespace ::com::sun::star; // using namespace ::com::sun::star::frame; // using namespace ::com::sun::star::beans; // using namespace ::com::sun::star::document; namespace css = ::com::sun::star; using rtl::OUString; using rtl::OString; using namespace ::osl; Receiver::Receiver() { g_type_init (); } Receiver::~Receiver() { } void Receiver::executeCommand( JsonObject *aObject, css::uno::Reference xSlideShowController ) { const char* aInstruction = json_node_get_string( json_object_get_member( aObject, "command" ) ); fprintf( stderr, "instruction:%s\n", aInstruction ); if ( strcmp( aInstruction, "transition_next" ) == 0 ) { xSlideShowController->gotoNextEffect(); // Next slide; } else if ( strcmp( aInstruction, "transition_previous" ) == 0 ) { xSlideShowController->gotoPreviousEffect(); } else if ( strcmp( aInstruction, "goto_slide" ) == 0 ) { // } } void Receiver::parseCommand( const char* aCommand, sal_Int32 size, osl::StreamSocket &aStreamSocket ) { css::uno::Reference xSlideShowController; try { css::uno::Reference< css::lang::XMultiServiceFactory > xServiceManager( ::comphelper::getProcessServiceFactory(), css::uno::UNO_QUERY_THROW ); css::uno::Reference< css::frame::XFramesSupplier > xFramesSupplier( xServiceManager->createInstance( "com.sun.star.frame.Desktop" ) , UNO_QUERY_THROW ); css::uno::Reference< css::frame::XFrame > xFrame ( xFramesSupplier->getActiveFrame(), UNO_QUERY_THROW ); Reference xPS ( xFrame->getController()->getModel(), UNO_QUERY_THROW); Reference xPresentation(xPS->getPresentation(), UNO_QUERY_THROW); // Throws an exception if now slideshow running xSlideShowController = Reference( xPresentation->getController(), UNO_QUERY_THROW ); // FIXME: remove later, this is just to test functionality sendPreview( 0, xSlideShowController, aStreamSocket ); } catch ( com::sun::star::uno::RuntimeException &e ) { return; } // Parsing JsonParser *parser; JsonNode *root; GError *error; parser = json_parser_new(); error = NULL; json_parser_load_from_data( parser, aCommand, size, &error ); if (error) { g_error_free( error ); g_object_unref( parser ); } root = json_parser_get_root( parser ); JsonObject *aObject = json_node_get_object( root ); executeCommand( aObject, xSlideShowController ); g_object_unref( parser ); } void sendPreview(sal_uInt32 aSlideNumber, Reference xSlideShowController, osl::StreamSocket &mStreamSocket ) { sal_uInt64 aSize; // Unused css::uno::Sequence aImageData = preparePreview( aSlideNumber, xSlideShowController, 320, 240, aSize ); rtl::OUStringBuffer aStrBuffer; ::sax::Converter::encodeBase64( aStrBuffer, aImageData ); OString aEncodedShortString = rtl::OUStringToOString( aStrBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 ); // Start the writing mStreamSocket.write( "slide_preview\n", strlen( "slide_preview\n" ) ); rtl::OString aSlideNumberString(rtl::OUStringToOString( rtl::OUString::valueOf( 2 ) , RTL_TEXTENCODING_UTF8 )); // FIXME get number mStreamSocket.write( aSlideNumberString.getStr(), aSlideNumberString.getLength() ); mStreamSocket.write( "\n", 1 ); mStreamSocket.write( aEncodedShortString.getStr(), aEncodedShortString.getLength() ); mStreamSocket.write( "\n\n", 2 ); } Sequence preparePreview(sal_uInt32 aSlideNumber, Reference xSlideShowController, sal_uInt32 aWidth, sal_uInt32 aHeight, sal_uInt64 &rSize ) { // Create temp file OUString aFileURL; FileBase::createTempFile( 0, 0, &aFileURL ); css::uno::Reference< css::lang::XMultiServiceFactory > xServiceManager( ::comphelper::getProcessServiceFactory(), css::uno::UNO_QUERY_THROW ); css::uno::Reference< css::document::XFilter > xFilter( xServiceManager->createInstance( "com.sun.star.drawing.GraphicExportFilter" ) , css::uno::UNO_QUERY_THROW ); css::uno::Reference< css::document::XExporter > xExporter( xFilter, css::uno::UNO_QUERY_THROW ); css::uno::Reference< css::lang::XComponent > xSourceDoc( xSlideShowController->getSlideByIndex( aSlideNumber ) , css::uno::UNO_QUERY_THROW ); xExporter->setSourceDocument( xSourceDoc ); css::uno::Sequence< css::beans::PropertyValue > aFilterData(3); aFilterData[0].Name = "PixelWidth"; aFilterData[0].Value <<= 2000; aFilterData[1].Name = "PixelHeight"; aFilterData[1].Value <<= 2000; // Add quality if jpg "Quality" [1-100] // FIXME: is setting color mode needed. aFilterData[2].Name = "ColorMode"; aFilterData[2].Value <<= 0; // Color css::uno::Sequence< css::beans::PropertyValue > aProps(3); aProps[0].Name = "MediaType"; aProps[0].Value <<= OUString( "image/png" ); aProps[1].Name = "URL"; aProps[1].Value <<= aFileURL; aProps[2].Name = "FilterData"; aProps[2].Value <<= aFilterData; xFilter->filter( aProps ); fprintf( stderr, "%s\n", rtl::OUStringToOString( aFileURL , RTL_TEXTENCODING_UTF8 ).getStr() ); // FIXME: error handling. File aFile( aFileURL ); aFile.open(0); sal_uInt64 aRead; rSize = 0; aFile.getSize( rSize ); css::uno::Sequence aContents( rSize ); aFile.read( aContents.getArray(), rSize, aRead ); aFile.close(); File::remove( aFileURL ); return aContents; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */