Общие интерфейсы для работы с API AlterOffice UNO

Библиотека UNO (Universal Network Objects) является основным компонентом архитектуры AlterOffice и позволяет создавать, изменять и управлять документами используя API, основанный на объектах.

UNO объекты в AlterOffice API являются модульными, каждый модуль обрабатывает определенный набор функций. Например, модуль com.sun.star.text предоставляет доступ к функциям, связанным с текстовыми документами. Ниже представлены некоторые объекты UNO, используемые для работы с текстовыми документами AText в AlterOffice API.


XMultiComponentFactory


XMultiComponentFactory - интерфейс, который предоставляет доступ к сервисам, реализованным в компонентах AlterOffice. Этот интерфейс используется для создания экземпляров других интерфейсов. 

Пример использования XMultiComponentFactory:

 // Получаем менеджер сервисов по контексту компонента

Reference< XMultiComponentFactory > xServiceManager = 

xComponentContext->getServiceManager();


// Создаем объект UnoUrlResolver

Reference< XInterface >  xInterface   = 

xServiceManager->createInstanceWithContext(

"com.sun.star.bridge.UnoUrlResolver", xComponentContext);


Методы интерфейса XMultiComponentFactory:


  • createInstanceWithArgumentsAndContext(ServiceSpecifier, Arguments, Context) - создает экземпляр компонента, который поддерживает сервисы, указанные фабрикой, и инициализирует новый экземпляр с заданными аргументами и контекстом.
Параметры:
  • string ServiceSpecifier - имя сервиса.
  • sequence< any > Arguments - аргументы.
  • com::sun::star::uno::XComponentContext Context - контекст, из которого экземпляр компонента получает значения развертывания.
Возвращаемое значение: com::sun::star::uno::XInterface

  • createInstanceWithContext(aServiceSpecifier, Context) - создает экземпляр компонента, который поддерживает сервисы, указанные фабрикой.
Параметры:
  • string aServiceSpecifier - имя сервиса.
  • com::sun::star::uno::XComponentContext Context - контекст, из которого экземпляр компонента получает значения развертывания.
Возвращаемое значение: com::sun::star::uno::XInterface

  • getAvailableServiceNames() - позволяет получить имена всех поддерживаемых сервисов.
Параметры:
-
Возвращаемое значение: sequence< string >

XMultiServiceFactory


XMultiServiceFactory позволяет создавать экземпляры объектов, используя их имя.

Пример использования  XMultiServiceFactory:

// Получаем ссылку на XMultiServiceFactory из XTextDocument
Reference<XMultiServiceFactory> xDocMSF(xDoc, UNO_QUERY_THROW);
// Создаем объект таблицы через XMultiServiceFactory
Reference<XTextTable> xTable(xDocMSF->createInstance("com.sun.star.text.TextTable"), UNO_QUERY_THROW);

Методы интерфейса XMultiServiceFactory:


  • createInstance(aServiceSpecifier) - создает экземпляр, классифицированный по указанному имени.
Параметры:
  • string aServiceSpecifier - классифицированное имя экземпляра. 
Возвращаемое значение: com::sun::star::uno::XInterface

  • createInstanceWithArguments(aServiceSpecifier, Arguments) - cоздает экземпляр, классифицированный по указанному имени, и передает аргументы этому экземпляру.
Параметры:
  • string aServiceSpecifier - классифицированное имя экземпляра.
  • sequence< any > Arguments - аргументы, переданные экземпляру.
Возвращаемое значение: com::sun::star::uno::XInterface

  • getAvailableServiceNames() - позволяет получить имена всех поддерживаемых сервисов.
Параметры:
-
Возвращаемое значение: sequence< string >


XIndexAccess


Интерфейс XIndexAccess предоставляет доступ к элементам по  индексу.

Пример использования XIndexAccess:

// Создаем объект  интерфейса XTextTablesSupplier  из xDoc интерфейса XTextDocument

Reference<XTextTablesSupplier> xTablesSupplier(xDoc, UNO_QUERY_THROW);

Reference<XIndexAccess> xIA(xTablesSupplier->getTextTables(), UNO_QUERY);

//Получаем объект таблицы с индексом 0

Reference<XTextTable>xTable(xIA->getByIndex(0), UNO_QUERY);


Методы интерфейса XIndexAccess:


  • getByIndex(Index) - возвращает элемент с указанным индексом.
Параметры:
  • long Index - позиция в массиве. Первый индекс равен 0.
Возвращаемое значение: Any

  • getCount() - возвращает количество элементов. 
Параметры:
-
Возвращаемое значение: long

XNameAccess


Интерфейс XNameAccess используется для доступа к  объектам по имени.

Пример использования XNameAccess:

Reference<XNameAccess> xSheets(xDoc->getSheets(), UNO_QUERY);

Sequence<OUString> sheetNames = xSheets->getElementNames();


Методы интерфейса XNameAccess:


  • getByName(aName) - возвращает объект с указанным именем.
Параметры:
  • string aName - имя объекта.
Возвращаемое значение: Any

  •  getElementNames() - возвращает последовательность всех имен элементов в контейнере. Порядок имен не определен.
Параметры:
-
Возвращаемое значение: sequence<string>

  • hasByName(aName) - возвращает TRUE, если элемент с таким именем находится в контейнере, FALSE если элемента нет.
Параметры:
  • string aName - имя объекта.
Возвращаемое значение: boolean


Использование UNO_QUERY для запроса интерфейсов


При создании объекта с использованием AlterOffice API необходимо получить ссылку на объект, реализующий нужный интерфейс. Для этого используется параметр UNO_QUERY, который позволяет получить объект, реализующий запрашиваемый интерфейс, на основе уже существующего объекта. В данном примере UNO_QUERY используется для получения объекта типа  XStorable.

Reference< XStorable > xStorable(xComponent, UNO_QUERY);

Возможные параметры:

  • UNO_QUERY - это параметр, который используется для  запроса интерфейса у объекта UNO. Данный параметр не выбрасывает исключение при неуспешном присваивании ссылки на запрашиваемый интерфейс. Можно проверить успешность запроса, вызвав метод is() для новой ссылки:

if (!xStorable.is())
       {
           fprintf(stderr, "getting XStorable interface failed!\n");
           return 1;
       }

  • UNO_QUERY_THROW - используется для  запроса интерфейса. Если запрашиваемый интерфейс недоступен, возникает исключение типа RuntimeException.
Исключение:
caught UNO exception: unsatisfied query for interface of type com.sun.star.frame.XStorable!

  • UNO_SET_THROW - генерирует исключение в случае, если производится попытка присвоить пустой указатель.
Исключение:
caught UNO exception: invalid attempt to assign an empty interface of type com.sun.star.frame.XStorable!