Difference between revisions of "OOConnect"

From Apache OpenOffice Wiki
Jump to: navigation, search
m
m
Line 1: Line 1:
To avoid you to search in the previous chapters we give again our starting code where we insert the new listings given in this chapter. We first give only the main() part :
+
To avoid you to search in the previous chapters we give again our starting code where we insert the new listings given in this chapter.  
 +
We give first the ooConnect() part :
 +
<source lang="cpp">
 +
// Listing 5
 +
// C++
 +
#include <stdio.h>
 +
#include <cppuhelper/bootstrap.hxx>
 +
#include <com/sun/star/bridge/XUnoUrlResolver.hpp>
 +
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
 +
// added
 +
#include <com/sun/star/frame/XComponentLoader.hpp>
 +
 
 +
using namespace com::sun::star::uno;
 +
using namespace com::sun::star::lang;
 +
using namespace com::sun::star::bridge;
 +
// added
 +
using namespace com::sun::star::frame;
 +
 
 +
using namespace rtl;
 +
using namespace cppu;
 +
 
 +
// a procedure for what the so called boostrap
 +
Reference< XMultiServiceFactory > ooConnect(){
 +
  // create the initial component context
 +
  Reference< XComponentContext > rComponentContext =
 +
defaultBootstrap_InitialComponentContext();
 +
 
 +
  // retrieve the servicemanager from the context
 +
  Reference< XMultiComponentFactory > rServiceManager =
 +
rComponentContext->getServiceManager();
 +
 
 +
  // instantiate a sample service with the servicemanager.
 +
  Reference< XInterface > rInstance =  rServiceManager->createInstanceWithContext(
 +
        OUString::createFromAscii("com.sun.star.bridge.UnoUrlResolver" ),rComponentContext );
 +
 
 +
  // Query for the XUnoUrlResolver interface
 +
  Reference< XUnoUrlResolver > rResolver( rInstance, UNO_QUERY );
 +
  if( ! rResolver.is() ){
 +
      printf( "Error: Couldn't instantiate com.sun.star.bridge.UnoUrlResolver service\n" );
 +
      return NULL;
 +
  }
 +
  try {
 +
      // resolve the uno-url
 +
      rInstance = rResolver->resolve( OUString::createFromAscii(
 +
        "uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" ) );
 +
 
 +
      if( ! rInstance.is() ){
 +
        printf( "StarOffice.ServiceManager is not exported from remote counterpart\n" );
 +
        return NULL;
 +
      }
 +
 
 +
      // query for the simpler XMultiServiceFactory interface, sufficient for scripting
 +
      Reference< XMultiServiceFactory > rOfficeServiceManager (rInstance, UNO_QUERY);
 +
 
 +
      if( ! rOfficeServiceManager.is() ){
 +
            printf( "XMultiServiceFactory interface is not exported for StarOffice.ServiceManager\n" );
 +
            return NULL;
 +
        }     
 +
        return rOfficeServiceManager;
 +
  }
 +
  catch( Exception &e ){
 +
      OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
 +
      printf( "Error: %s\n", o.pData->buffer );
 +
      return NULL;
 +
  }
 +
  return NULL;
 +
}
 +
</source>
 +
We second give the main() part :
 
<source lang="cpp">
 
<source lang="cpp">
 
//Listing 1 Again our starting main Code
 
//Listing 1 Again our starting main Code
Line 30: Line 98:
 
}
 
}
 
</source>
 
</source>
 
+
This code is called a [[UNO_registery_and_Bootstrapping#The_Bootstrap|bootstrap]] and uses <idl>com.sun.star.lang.XMultiServiceFactory</idl> interfaces and <idl>com.sun.star.frame.Desktop</idl> services.
 
Remember each time you query for an interface you have to add code lines (if they don't exist) in the source code and a line in the makefile. I will generally add comments to prevent omissions. You can find more explanations [[IDL_Files_and_Cpp#IDL__and_C.2B.2B|here]] (if you are not a beginner).
 
Remember each time you query for an interface you have to add code lines (if they don't exist) in the source code and a line in the makefile. I will generally add comments to prevent omissions. You can find more explanations [[IDL_Files_and_Cpp#IDL__and_C.2B.2B|here]] (if you are not a beginner).
  
 
{{Documentation/Note|'''Important Note''' : The more important point in the compilation chain of the examples below is that <code>cppumaker</code> will construct every hpp and hdl files you need in your application. The SDK is not provinding every hpp files but you have to construt them starting from IDL files provided by SDK.}}
 
{{Documentation/Note|'''Important Note''' : The more important point in the compilation chain of the examples below is that <code>cppumaker</code> will construct every hpp and hdl files you need in your application. The SDK is not provinding every hpp files but you have to construt them starting from IDL files provided by SDK.}}
 
{{Documentation/Note|It is possible to construct all the hpp files when installing the SDK as [[SDKInstallation#Other_Windows_Installations_descriptions|mentioned in a Windows]] installation. It's also possible with other OS. In doing so, you don't need modifying your MakeFile.}}
 
{{Documentation/Note|It is possible to construct all the hpp files when installing the SDK as [[SDKInstallation#Other_Windows_Installations_descriptions|mentioned in a Windows]] installation. It's also possible with other OS. In doing so, you don't need modifying your MakeFile.}}

Revision as of 14:16, 13 April 2009

To avoid you to search in the previous chapters we give again our starting code where we insert the new listings given in this chapter. We give first the ooConnect() part :

// Listing 5
// C++
#include <stdio.h>
#include <cppuhelper/bootstrap.hxx>
#include <com/sun/star/bridge/XUnoUrlResolver.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
// added
#include <com/sun/star/frame/XComponentLoader.hpp>
 
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
using namespace com::sun::star::bridge;
// added
using namespace com::sun::star::frame;
 
using namespace rtl;
using namespace cppu;
 
// a procedure for what the so called boostrap
Reference< XMultiServiceFactory > ooConnect(){
   // create the initial component context
   Reference< XComponentContext > rComponentContext = 
				defaultBootstrap_InitialComponentContext();
 
   // retrieve the servicemanager from the context
   Reference< XMultiComponentFactory > rServiceManager = 
				rComponentContext->getServiceManager();
 
   // instantiate a sample service with the servicemanager.
   Reference< XInterface > rInstance =  rServiceManager->createInstanceWithContext(
         OUString::createFromAscii("com.sun.star.bridge.UnoUrlResolver" ),rComponentContext );
 
   // Query for the XUnoUrlResolver interface
   Reference< XUnoUrlResolver > rResolver( rInstance, UNO_QUERY );
   if( ! rResolver.is() ){
      printf( "Error: Couldn't instantiate com.sun.star.bridge.UnoUrlResolver service\n" );
      return NULL;
   }
   try {
      // resolve the uno-url
      rInstance = rResolver->resolve( OUString::createFromAscii(
         "uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" ) );
 
      if( ! rInstance.is() ){
         printf( "StarOffice.ServiceManager is not exported from remote counterpart\n" );
         return NULL;
      }
 
      // query for the simpler XMultiServiceFactory interface, sufficient for scripting
      Reference< XMultiServiceFactory > rOfficeServiceManager (rInstance, UNO_QUERY);
 
      if( ! rOfficeServiceManager.is() ){
            printf( "XMultiServiceFactory interface is not exported for StarOffice.ServiceManager\n" );
            return NULL;
        }       
        return rOfficeServiceManager;
   }
   catch( Exception &e ){
      OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
      printf( "Error: %s\n", o.pData->buffer );
      return NULL;
   }
   return NULL;
}

We second give the main() part :

//Listing 1 Again our starting main Code
int main( ) {
//retrieve an instance of the remote service manager
    Reference< XMultiServiceFactory > rOfficeServiceManager;
    rOfficeServiceManager = ooConnect();
    if( rOfficeServiceManager.is() ){
        printf( "Connected sucessfully to the office\n" );
    }
 
//get the desktop service using createInstance returns an XInterface type
    Reference< XInterface  > Desktop = rOfficeServiceManager->createInstance(
    OUString::createFromAscii( "com.sun.star.frame.Desktop" ));
 
//query for the XComponentLoader interface
    Reference< XComponentLoader > rComponentLoader (Desktop, UNO_QUERY);
    if( rComponentLoader.is() ){
        	printf( "XComponentloader successfully instanciated\n" );
    	}
 
//get an instance of the spreadsheet
    Reference< XComponent > xcomponent = rComponentLoader->loadComponentFromURL(
	OUString::createFromAscii("private:factory/scalc"),
        OUString::createFromAscii("_blank"),
        0,
        Sequence < ::com::sun::star::beans::PropertyValue >());
// add code here
    return 0;
}

This code is called a bootstrap and uses com.sun.star.lang.XMultiServiceFactory interfaces and com.sun.star.frame.Desktop services. Remember each time you query for an interface you have to add code lines (if they don't exist) in the source code and a line in the makefile. I will generally add comments to prevent omissions. You can find more explanations here (if you are not a beginner).

Template:Documentation/Note Template:Documentation/Note

Personal tools