No Need to Bootstrap with UNO? Better for threading?

The Application Programming Interface and the OASIS Open Document Format

No Need to Bootstrap with UNO? Better for threading?

Postby groverblue » Mon Aug 25, 2008 8:27 pm

This is a two question post. Currently, all the development I do with Open Office relies on bootstrapping OOo before working with documents/services. From what I understand, UNO/URE allow for development without having to bootstrap (soffice.exe). Is that correct? Below is sample code from:
http://www.openoffice.org/source/browse ... iew=markup

Code: Select all   Expand viewCollapse view
package com.sun.star.demo;

import java.io.IOException;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.PropertyState;
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.io.BufferSizeExceededException;
import com.sun.star.io.NotConnectedException;
import com.sun.star.io.XInputStream;
import com.sun.star.io.XOutputStream;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.text.XSimpleText;
import com.sun.star.text.XText;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextRange;
import com.sun.star.uno.IBridge;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.uno.XNamingService;

public class TestOffice {
   static void testPipe(XMultiServiceFactory rSmgr) throws com.sun.star.uno.Exception {
      XOutputStream rOut = (XOutputStream) rSmgr.createInstance("com.sun.star.io.Pipe");

      {
         byte bytes[] = new byte[10];
         bytes[0] = 42;
         rOut.writeBytes(bytes);
      }
   
      
      {
         byte bytes[][] = new byte[1][];

         XInputStream rIn = (XInputStream)UnoRuntime.queryInterface(XInputStream.class, rOut);
         if(rIn.available() != 10)
            System.err.println("wrong bytes available\n");

         if(rIn.readBytes(bytes, 10) != 10)
            System.err.println("wrong bytes read\n");

         if(42 != bytes[0][0])
            System.err.println("wrong element in sequence\n");
      }
   }


   static void testWriter(XComponent rCmp) throws IOException {
      XTextDocument rTextDoc = (XTextDocument)UnoRuntime.queryInterface(XTextDocument.class, rCmp);

      XText rText = (XText)UnoRuntime.queryInterface(XText.class, rTextDoc.getText());
      XTextCursor rCursor = (XTextCursor)UnoRuntime.queryInterface(XTextCursor.class, rText.createTextCursor());
      XTextRange rRange = (XTextRange)UnoRuntime.queryInterface(XTextRange.class, rCursor);

      byte pcText[] = new byte[1024];
      pcText[0] = 0;
      System.err.println("pleast type any text\n");
      while(true)   {
         System.in.read(pcText);

         String string = new String(pcText);
         if(string.equals("end")) break;

         string += " ";

         rText.insertString(rRange , string, false);
      }
   }

   static void testDocument(XMultiServiceFactory rSmgr) throws com.sun.star.uno.Exception, IOException {
      XComponentLoader rLoader = (XComponentLoader)UnoRuntime.queryInterface(XComponentLoader.class, rSmgr.createInstance("com.sun.star.frame.Desktop"));

      String urls[] = new String[] {
         "private:factory/swriter",
         "private:factory/scalc",
         "private:factory/sdraw",
         "http://www.heise.de",
      };

      String docu[] = new String[] {
         "a new writer document ...\n",
         "a new calc document ...\n",
         "a new draw document ...\n",
         "www.heise.de\n",
      };

      for(int i = 0; i < urls.length; ++ i)   {
         System.err.println("press any key to open "  + docu[i]);

         System.in.read();
         while(System.in.available() > 0)
            System.in.read();

         XComponent rComponent = rLoader.loadComponentFromURL(urls[i], "_blank",   0, new PropertyValue[0]);

//             testWriter(rComponent);
         System.err.println("press any key to close the document");
         System.in.read();
         while(System.in.available() > 0)
            System.in.read();

         rComponent.dispose();
      }
   }

   static void doSomething(Object r) throws com.sun.star.uno.Exception, IOException {
      XNamingService rName = (XNamingService)UnoRuntime.queryInterface(XNamingService.class, r);

      if(rName != null) {
         System.err.println("got the remote naming service !");
         Object rXsmgr = rName.getRegisteredObject("StarOffice.ServiceManager");
         
         XMultiServiceFactory rSmgr = (XMultiServiceFactory)UnoRuntime.queryInterface(XMultiServiceFactory.class, rXsmgr);
         if(rSmgr != null) {
            System.err.println("got the remote service manager !");
//              testPipe(rSmgr);
            testDocument(rSmgr);
         }
      }
   }



   static String neededServices[] = new String[] {
      "com.sun.star.comp.servicemanager.ServiceManager",
      "com.sun.star.comp.loader.JavaLoader",
      "com.sun.star.comp.connections.Connector",
      "com.sun.star.comp.bridgefactory.BridgeFactory",
      "com.sun.star.comp.urlresolver.UrlResolver"
   };

   public static void main(String argv[]) throws Exception {
      if(argv.length != 1)   {
         System.err.println("usage : testoffice uno:connection;protocol;objectName");
         System.exit(-1);
      }

      com.sun.star.comp.servicemanager.ServiceManager smgr = new com.sun.star.comp.servicemanager.ServiceManager();
      smgr.addFactories(neededServices);

      Object  resolver  = smgr.createInstance("com.sun.star.bridge.UnoUrlResolver" );
      XUnoUrlResolver resolver_xUnoUrlResolver = (XUnoUrlResolver)UnoRuntime.queryInterface(XUnoUrlResolver.class, resolver);

        Object rInitialObject = resolver_xUnoUrlResolver.resolve(argv[0]);

      if(rInitialObject != null) {
         System.err.println("got the remote object");
         doSomething(rInitialObject);
      }
   }
}



I'm still a confused on the differences and what UNO actually provides developers. What restrictions are there when working with OOo objects in this way? Can I still grab XPrintable interfaces, or export documents (even to PDF)? Does UNO require an Open Office running (ie, a remote server)? etc, etc.

If soffice in server mode is not a requirement, then how would this play out in a threaded application? Right now Open Office has problems when working with multiple documents from multiple threads. Would this eliminate such problems?
groverblue
 
Posts: 40
Joined: Wed Mar 26, 2008 6:17 pm

Return to UNO API and ODF

Who is online

Users browsing this forum: No registered users and 1 guest