Kaydet (Commit) c1f46c54 authored tarafından jan Iversen's avatar jan Iversen Kaydeden (comit) jan iversen

ios LibreOfficeLight LOkit integration

Integrated LibreOfficeLight into gbuild.
added lo.xcconfig and Resources (needed to link with LO and run LO)
added swift --> C interface for LOkit
add known commands from JS client

added C++ condition in LibreOfficekitInit.h (inline no good in a C file)

Change-Id: I19ebe8912546408bf701c96c0c63541d6e37cad8
Reviewed-on: https://gerrit.libreoffice.org/35430Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarjan iversen <jani@libreoffice.org>
üst 7a2f07c4
......@@ -43,7 +43,9 @@ extern "C"
#define SEPARATOR '/'
#ifndef __OBJC__
#ifdef __cplusplus
inline
#endif
#endif
void *lok_loadlib(const char *pFN)
{
......@@ -55,7 +57,9 @@ extern "C"
}
#ifndef __OBJC__
#ifdef __cplusplus
inline
#endif
#endif
char *lok_dlerror(void)
{
......@@ -63,7 +67,9 @@ extern "C"
}
#ifndef __OBJC__
#ifdef __cplusplus
inline
#endif
#endif
void *lok_dlsym(void *Hnd, const char *pName)
{
......@@ -71,7 +77,9 @@ extern "C"
}
#ifndef __OBJC__
#ifdef __cplusplus
inline
#endif
#endif
int lok_dlclose(void *Hnd)
{
......@@ -79,7 +87,9 @@ extern "C"
}
#ifndef __OBJC__
#ifdef __cplusplus
inline
#endif
#endif
void extendUnoPath(const char *pPath)
{
......
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
# 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/.
#- Env ------------------------------------------------------------------------
BUILDID :=$(shell cd $(SRCDIR) && git log -1 --format=%H)
#- Targets --------------------------------------------------------------------
.PHONY: LibreOfficeLight_setup
# Register target
$(eval $(call gb_CustomTarget_CustomTarget,ios/LibreOfficeLight))
# Build
# Depend on the custom target that sets up lo.xcconfig
$(call gb_CustomTarget_get_target,ios/LibreOfficeLight): $(call gb_CustomTarget_get_target,ios/Lo_Xcconfig)
$(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),APP,2)
$(call IOSbuild,LibreOfficeLight, clean build)
# Clean
$(call gb_CustomTarget_get_clean_target,ios/LibreOfficeLight):
$(call gb_Output_announce,$(subst $(WORKDIR)/Clean/,,$@),$(false),APP,2)
$(call IOSbuild,LibreOfficeLight, clean)
# vim: set noet sw=4 ts=4:
......@@ -14,6 +14,7 @@ $(eval $(call gb_Module_add_targets,ios,\
CustomTarget_Lo_Xcconfig \
CustomTarget_TiledLibreOffice_app \
CustomTarget_Prototype_app \
CustomTarget_LibreOfficeLight_app \
))
endif
......
......@@ -21,6 +21,17 @@
3992D85E1E5B764A00BEA987 /* ViewFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3992D85C1E5B764A00BEA987 /* ViewFileManager.swift */; };
399648471E5B87DC00E73E83 /* ViewProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399648461E5B87DC00E73E83 /* ViewProperties.swift */; };
399648491E5C4E5500E73E83 /* LO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399648481E5C4E5500E73E83 /* LO.swift */; };
39A83A8F1E5F471D00D0C683 /* lokit.c in Sources */ = {isa = PBXBuildFile; fileRef = 39A83A8E1E5F471D00D0C683 /* lokit.c */; };
39B084E31E5F0A9600682A59 /* lo.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 39B084E21E5F0A9600682A59 /* lo.xcconfig */; };
39B08B9D1E5F0BB600682A59 /* fundamentalrc in Resources */ = {isa = PBXBuildFile; fileRef = 39B084E51E5F0BB400682A59 /* fundamentalrc */; };
39B08B9E1E5F0BB600682A59 /* offapi.rdb in Resources */ = {isa = PBXBuildFile; fileRef = 39B084E61E5F0BB400682A59 /* offapi.rdb */; };
39B08B9F1E5F0BB600682A59 /* oovbaapi.rdb in Resources */ = {isa = PBXBuildFile; fileRef = 39B084E71E5F0BB400682A59 /* oovbaapi.rdb */; };
39B08BD71E5F0BB600682A59 /* rc in Resources */ = {isa = PBXBuildFile; fileRef = 39B085211E5F0BB400682A59 /* rc */; };
39B08BD91E5F0BB600682A59 /* services.rdb in Resources */ = {isa = PBXBuildFile; fileRef = 39B085241E5F0BB400682A59 /* services.rdb */; };
39B091CD1E5F0BB800682A59 /* udkapi.rdb in Resources */ = {isa = PBXBuildFile; fileRef = 39B08B9B1E5F0BB600682A59 /* udkapi.rdb */; };
39B091CE1E5F0BB800682A59 /* unorc in Resources */ = {isa = PBXBuildFile; fileRef = 39B08B9C1E5F0BB600682A59 /* unorc */; };
39B091D01E5F102E00682A59 /* test1.odt in Resources */ = {isa = PBXBuildFile; fileRef = 39B091CF1E5F102E00682A59 /* test1.odt */; };
39B091D21E5F109A00682A59 /* icudt58l.dat in Resources */ = {isa = PBXBuildFile; fileRef = 39B091D11E5F109A00682A59 /* icudt58l.dat */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
......@@ -61,6 +72,19 @@
3992D85C1E5B764A00BEA987 /* ViewFileManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewFileManager.swift; sourceTree = "<group>"; };
399648461E5B87DC00E73E83 /* ViewProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewProperties.swift; sourceTree = "<group>"; };
399648481E5C4E5500E73E83 /* LO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LO.swift; sourceTree = "<group>"; };
39A83A8D1E5F471C00D0C683 /* lokit-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; path = "lokit-Bridging-Header.h"; sourceTree = "<group>"; };
39A83A8E1E5F471D00D0C683 /* lokit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lokit.c; path = LibreOfficeLight/lokit.c; sourceTree = SOURCE_ROOT; };
39B084E21E5F0A9600682A59 /* lo.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = lo.xcconfig; path = "../../../../ios-work/workdir/ios/generated/lo.xcconfig"; sourceTree = SOURCE_ROOT; };
39B084E51E5F0BB400682A59 /* fundamentalrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = fundamentalrc; path = "../../../../ios-work/workdir/ios/resources/fundamentalrc"; sourceTree = SOURCE_ROOT; };
39B084E61E5F0BB400682A59 /* offapi.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = offapi.rdb; path = "../../../../ios-work/workdir/ios/resources/offapi.rdb"; sourceTree = SOURCE_ROOT; };
39B084E71E5F0BB400682A59 /* oovbaapi.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = oovbaapi.rdb; path = "../../../../ios-work/workdir/ios/resources/oovbaapi.rdb"; sourceTree = SOURCE_ROOT; };
39B085211E5F0BB400682A59 /* rc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rc; path = "../../../../ios-work/workdir/ios/resources/rc"; sourceTree = SOURCE_ROOT; };
39B085241E5F0BB400682A59 /* services.rdb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = services.rdb; path = "../../../../ios-work/workdir/ios/resources/services.rdb"; sourceTree = SOURCE_ROOT; };
39B08B9B1E5F0BB600682A59 /* udkapi.rdb */ = {isa = PBXFileReference; lastKnownFileType = file; name = udkapi.rdb; path = "../../../../ios-work/workdir/ios/resources/udkapi.rdb"; sourceTree = SOURCE_ROOT; };
39B08B9C1E5F0BB600682A59 /* unorc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = unorc; path = "../../../../ios-work/workdir/ios/resources/unorc"; sourceTree = SOURCE_ROOT; };
39B091CF1E5F102E00682A59 /* test1.odt */ = {isa = PBXFileReference; lastKnownFileType = file; name = test1.odt; path = ../../../odk/examples/java/DocumentHandling/test/test1.odt; sourceTree = SOURCE_ROOT; };
39B091D11E5F109A00682A59 /* icudt58l.dat */ = {isa = PBXFileReference; lastKnownFileType = file; name = icudt58l.dat; path = "../../../../ios-work/workdir/UnpackedTarball/icu/source/data/in/icudt58l.dat"; sourceTree = "<group>"; };
39B092501E5F3DEA00682A59 /* LibreOfficeLight-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "LibreOfficeLight-Prefix.pch"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
......@@ -91,6 +115,8 @@
3911D89F1E5993600050D6BC /* Support files */ = {
isa = PBXGroup;
children = (
39B092501E5F3DEA00682A59 /* LibreOfficeLight-Prefix.pch */,
39B084E21E5F0A9600682A59 /* lo.xcconfig */,
397E09071E597BD8001374E0 /* Assets.xcassets */,
397E09041E597BD8001374E0 /* LibreOfficeLight.xcdatamodeld */,
397E090C1E597BD8001374E0 /* Info.plist */,
......@@ -102,6 +128,8 @@
397E08F11E597BD8001374E0 = {
isa = PBXGroup;
children = (
39B084E41E5F0B5200682A59 /* Resources */,
3911D89F1E5993600050D6BC /* Support files */,
397E08FC1E597BD8001374E0 /* LibreOfficeLight */,
397E09141E597BD8001374E0 /* LibreOfficeLightTests */,
397E091F1E597BD8001374E0 /* LibreOfficeLightUITests */,
......@@ -122,6 +150,7 @@
397E08FC1E597BD8001374E0 /* LibreOfficeLight */ = {
isa = PBXGroup;
children = (
39A83A8E1E5F471D00D0C683 /* lokit.c */,
397E08FD1E597BD8001374E0 /* AppDelegate.swift */,
3992D8571E5B761700BEA987 /* ViewController.swift */,
3992D85B1E5B764A00BEA987 /* SideMenu.swift */,
......@@ -132,7 +161,7 @@
399648481E5C4E5500E73E83 /* LO.swift */,
397E09011E597BD8001374E0 /* Main.storyboard */,
397868D81E59A3EA007F9248 /* LaunchScreen.xib */,
3911D89F1E5993600050D6BC /* Support files */,
39A83A8D1E5F471C00D0C683 /* lokit-Bridging-Header.h */,
);
path = LibreOfficeLight;
sourceTree = SOURCE_ROOT;
......@@ -155,6 +184,22 @@
path = LibreOfficeLightUITests;
sourceTree = SOURCE_ROOT;
};
39B084E41E5F0B5200682A59 /* Resources */ = {
isa = PBXGroup;
children = (
39B084E51E5F0BB400682A59 /* fundamentalrc */,
39B084E61E5F0BB400682A59 /* offapi.rdb */,
39B084E71E5F0BB400682A59 /* oovbaapi.rdb */,
39B085211E5F0BB400682A59 /* rc */,
39B085241E5F0BB400682A59 /* services.rdb */,
39B08B9B1E5F0BB600682A59 /* udkapi.rdb */,
39B08B9C1E5F0BB600682A59 /* unorc */,
39B091CF1E5F102E00682A59 /* test1.odt */,
39B091D11E5F109A00682A59 /* icudt58l.dat */,
);
name = Resources;
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
......@@ -223,6 +268,7 @@
TargetAttributes = {
397E08F91E597BD8001374E0 = {
CreatedOnToolsVersion = 8.2;
LastSwiftMigration = 0820;
ProvisioningStyle = Automatic;
};
397E09101E597BD8001374E0 = {
......@@ -261,8 +307,18 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
39B091D21E5F109A00682A59 /* icudt58l.dat in Resources */,
397E09081E597BD8001374E0 /* Assets.xcassets in Resources */,
39B08BD71E5F0BB600682A59 /* rc in Resources */,
39B08B9E1E5F0BB600682A59 /* offapi.rdb in Resources */,
39B084E31E5F0A9600682A59 /* lo.xcconfig in Resources */,
397868D61E59A3EA007F9248 /* LaunchScreen.xib in Resources */,
39B08B9F1E5F0BB600682A59 /* oovbaapi.rdb in Resources */,
39B08B9D1E5F0BB600682A59 /* fundamentalrc in Resources */,
39B091CD1E5F0BB800682A59 /* udkapi.rdb in Resources */,
39B08BD91E5F0BB600682A59 /* services.rdb in Resources */,
39B091D01E5F102E00682A59 /* test1.odt in Resources */,
39B091CE1E5F0BB800682A59 /* unorc in Resources */,
397E09031E597BD8001374E0 /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
......@@ -295,6 +351,7 @@
3992D85E1E5B764A00BEA987 /* ViewFileManager.swift in Sources */,
3992D85A1E5B762A00BEA987 /* ViewDocument.swift in Sources */,
397E08FE1E597BD8001374E0 /* AppDelegate.swift in Sources */,
39A83A8F1E5F471D00D0C683 /* lokit.c in Sources */,
399648491E5C4E5500E73E83 /* LO.swift in Sources */,
3992D8581E5B761700BEA987 /* ViewController.swift in Sources */,
);
......@@ -354,6 +411,7 @@
/* Begin XCBuildConfiguration section */
397E09231E597BD8001374E0 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
......@@ -392,6 +450,26 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(LO_BUILDDIR)/config_host",
"$(LO_SRCDIR)/include",
"$(LO_WORKDIR)/UnoApiHeadersTarget/udkapi/comprehensive",
"$(LO_WORKDIR)/UnoApiHeadersTarget/offapi/comprehensive",
"$(LO_WORKDIR)/UnpackedTarball/icu/source/common",
"$(LO_WORKDIR)/ios/generated",
);
"HEADER_SEARCH_PATHS[arch=*]" = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(LO_BUILDDIR)/config_host",
"$(LO_SRCDIR)/include",
"$(LO_WORKDIR)/UnoApiHeadersTarget/udkapi/comprehensive",
"$(LO_WORKDIR)/UnoApiHeadersTarget/offapi/comprehensive",
"$(LO_WORKDIR)/UnpackedTarball/icu/source/common",
"$(LO_WORKDIR)/ios/generated",
);
IPHONEOS_DEPLOYMENT_TARGET = 10.2;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
......@@ -404,6 +482,7 @@
};
397E09241E597BD8001374E0 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
......@@ -436,8 +515,29 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(LO_BUILDDIR)/config_host",
"$(LO_SRCDIR)/include",
"$(LO_WORKDIR)/UnoApiHeadersTarget/udkapi/comprehensive",
"$(LO_WORKDIR)/UnoApiHeadersTarget/offapi/comprehensive",
"$(LO_WORKDIR)/UnpackedTarball/icu/source/common",
"$(LO_WORKDIR)/ios/generated",
);
"HEADER_SEARCH_PATHS[arch=*]" = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(LO_BUILDDIR)/config_host",
"$(LO_SRCDIR)/include",
"$(LO_WORKDIR)/UnoApiHeadersTarget/udkapi/comprehensive",
"$(LO_WORKDIR)/UnoApiHeadersTarget/offapi/comprehensive",
"$(LO_WORKDIR)/UnpackedTarball/icu/source/common",
"$(LO_WORKDIR)/ios/generated",
);
IPHONEOS_DEPLOYMENT_TARGET = 10.2;
MTL_ENABLE_DEBUG_INFO = NO;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = "1,2";
......@@ -447,30 +547,51 @@
};
397E09261E597BD8001374E0 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = NO;
CLANG_WARN_INFINITE_RECURSION = NO;
ENABLE_TESTABILITY = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "LibreOfficeLight/LibreOfficeLight-Prefix.pch";
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
INFOPLIST_FILE = LibreOfficeLight/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = jani.libreofficeLight.LibreOfficeLight;
PRODUCT_BUNDLE_IDENTIFIER = LibreOfficeLight;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "LibreOfficeLight/lokit-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
397E09271E597BD8001374E0 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = NO;
CLANG_WARN_INFINITE_RECURSION = NO;
COPY_PHASE_STRIP = YES;
ENABLE_TESTABILITY = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "LibreOfficeLight/LibreOfficeLight-Prefix.pch";
INFOPLIST_FILE = LibreOfficeLight/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = jani.libreofficeLight.LibreOfficeLight;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = LibreOfficeLight;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "LibreOfficeLight/lokit-Bridging-Header.h";
SWIFT_VERSION = 3.0;
};
name = Release;
};
397E09291E597BD8001374E0 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
......@@ -485,6 +606,7 @@
};
397E092A1E597BD8001374E0 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
......@@ -499,6 +621,7 @@
};
397E092C1E597BD8001374E0 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = LibreOfficeLightUITests/Info.plist;
......@@ -512,6 +635,7 @@
};
397E092D1E597BD8001374E0 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = LibreOfficeLightUITests/Info.plist;
......
......@@ -16,7 +16,7 @@ class LOkit
{
init()
{
LOkit_Init()
}
......
// -*- Mode: ObjC; 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/.
#import <Availability.h>
#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif
#ifdef __OBJC__
#include <premac.h>
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#include <postmac.h>
#endif
// vim:set shiftwidth=4 softtabstop=4 expandtab:
//
// 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/.
//
// Bridge functions to LibreOfficeKit
int LOkit_Init();
//
// 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 <stdio.h>
#define LOK_USE_UNSTABLE_API
#include <LibreOfficeKit/LibreOfficeKitInit.h>
// pointers to our instance
static LibreOfficeKit* kit;
static LibreOfficeKitDocument* document;
// Bridge functions to LibreOfficeKit
int LOkit_Init()
{
// Initialize LibreOfficeKit
kit = lok_init(NULL);
return 0;
}
int LOkit_open(char *file)
{
document = kit->pClass->documentLoad(kit, file);
document->pClass->initializeForRendering(document, "");
return 0;
}
#if 0
// createpath from tiled
static NSString *createPaths(NSString *base, NSString *appRootEscaped, NSArray *fileNames)
{
NSString *result;
NSString *prefix = @"file://";
BOOL first = YES;
result = base;
for (NSString *fileName in fileNames) {
result = [result stringByAppendingString: prefix];
result = [result stringByAppendingString: [appRootEscaped stringByAppendingPathComponent: fileName]];
if (first) {
prefix = [@" " stringByAppendingString:prefix];
first = NO;
}
}
return result;
}
// Force reference to libreofficekit_hook
extern "C" void *libreofficekit_hook(const char *);
static __attribute__((used)) void *(*foop)(const char *) = libreofficekit_hook;
extern "C" void lo_initialize(NSString *documentPath)
{
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *app_root_escaped = [bundlePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *uno_types = createPaths(@"-env:UNO_TYPES=", app_root_escaped, @[@"offapi.rdb", @"oovbaapi.rdb", @"types.rdb"]);
NSString *uno_services = createPaths(@"-env:UNO_SERVICES=", app_root_escaped, @[@"ure/services.rdb", @"services.rdb"]);
int fd = open([[bundlePath stringByAppendingPathComponent:@U_ICUDATA_NAME".dat"] UTF8String], O_RDONLY);
if (fd != -1) {
struct stat st;
if (fstat(fd, &st) != -1
&& st.st_size < (size_t)-1) {
void *icudata = mmap(0, (size_t) st.st_size, PROT_READ, MAP_FILE|MAP_PRIVATE, fd, 0);
if (icudata == MAP_FAILED) {
#if OSL_DEBUG_LEVEL > 0
NSLog(@"mmap failed:%s", strerror(errno));
#endif
} else {
UErrorCode icuStatus = U_ZERO_ERROR;
udata_setCommonData(icudata, &icuStatus);
#if OSL_DEBUG_LEVEL > 0
if (U_FAILURE(icuStatus))
NSLog(@"udata_setCommonData failed");
else {
// Test that ICU works...
UConverter *cnv = ucnv_open("iso-8859-3", &icuStatus);
NSLog(@"ucnv_open(iso-8859-3)-> %p, err = %s, name=%s",
(void *)cnv, u_errorName(icuStatus), (!cnv)?"?":ucnv_getName(cnv,&icuStatus));
if (U_SUCCESS(icuStatus))
ucnv_close(cnv);
}
#endif
}
}
close(fd);
}
const char *argv[] = {
[[[NSBundle mainBundle] executablePath] UTF8String],
"-env:URE_INTERNAL_LIB_DIR=file:///",
[uno_types UTF8String],
[uno_services UTF8String],
[[@"file://" stringByAppendingString: [documentPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] UTF8String]
};
const int argc = sizeof(argv)/sizeof(*argv);
osl_setCommandArgs(argc, (char **) argv);
}
#endif
#if 0
// LOK_main (online)
#endif
// CLIENT COMMAND INTERFACE
static bool client_canceltiles(char *input, int argc, char *args[])
{
// command: canceltiles
// arguments: NONE
// description:
// All outstanding tile messages from the client to the server are
// dropped and will not be handled, except tile messages with an id
// parameter. There is no guarantee of exactly which tile: messages
// might still be sent back to the client.
//
return true;
}
static bool client_clientvisiblearea(char *input, int argc, char *args[])
{
// command: clientvisiblearea
// arguments: x=<x>
// y=<y>
// width=<width>
// height=<height>
return true;
}
static bool client_closedocument(char *input, int argc, char *args[])
{
// command: closedocument
// arguments: None
// description:
// This gives document owners the ability to terminate all sessions
// currently having that document opened. This functionality is enabled
// only in case WOPI. host mentions 'EnableOwnerTermination' flag in
// its CheckFileInfo response
return true;
}
static bool client_commandvalues(char *input, int argc, char *args[])
{
// command: commandvalues
// arguments: None
return true;
}
static bool client_downloadas(char *input, int argc, char *args[])
{
// command: downloadas
// arguments: name=<fileName>
// id=<id>
// format=<document format>
// options=<SkipImages, etc>
// description:
// Exports the current document to the desired format and returns a
// download URL. The id identifies the request on the client. id can
// take following values:
// * 'print': When request for download is basically for print purposes
// * 'slideshow': When request for download is for showing slideshow
// * 'export': Just a simple download
return true;
}
static bool client_getchildid(char *input, int argc, char *args[])
{
// command: getchildid
// arguments: None
// description:
// Requests the child id so that it knows where the files needs to be sent
// when it is inserted in the document
return true;
}
static bool client_gettextselection(char *input, int argc, char *args[])
{
// command: gettextselection
// arguments: None
// description:
// Request selection's content
return true;
}
static bool client_insertfile(char *input, int argc, char *args[])
{
// command: insertfile
// arguments: name=<name>
// type=<type>
// description:
// Inserts the file with the name <name> into the document,
// we currently support type = 'graphic'
return true;
}
static bool client_key(char *input, int argc, char *args[])
{
// command: key
// arguments: type=<type>
// char=<charcode>
// key=<keycode>
// description:
// <type> is 'input' or 'up', <charcode> and <keycode> are numbers.
return true;
}
static bool client_load(char *input, int argc, char *args[])
{
// command: load
// arguments: [part=<partNumber>]
// url=<url>
// [timestamp=<time>]
//. [options=<options>]
// description:
// part is an optional parameter. <partNumber> is a number.
// timestamp is an optional parameter. <time> is provided in
// microseconds since the Unix epoch - midnight, January 1, 1970.
// options are the whole rest of the line, not URL-encoded,
// and must be valid JSON.
return true;
}
static bool client_loolclient(char *input, int argc, char *args[])
{
// command: loolclient
// arguments: <major.minor[-patch]>
// description:
// Upon connection, a client must announce the version number it supports.
// Major: an integer that must always match between client and server,
// otherwise there are no guarantees of any sensible compatibility.
// This is bumped when API changes.
// Minor: an integer is more flexible and is at the discretion of either party.
// Security fixes that do not alter the API would bump the minor version number.
// Patch: an optional string that is informational.
return true;
}
static bool client_mouse(char *input, int argc, char *args[])
{
// command: mouse
// arguments: type=<type>
// x=<x>
// y=<y>
// count=<count>
// description:
// <type> is 'buttondown', 'buttonup' or 'move', others are numbers.
return true;
}
static bool client_paste(char *input, int argc, char *args[])
{
// command: paste
// arguments: mimetype=<mimeType>
// <binaryPasteData>
// description:
// Paste content at the current cursor position
return true;
}
static bool client_ping(char *input, int argc, char *args[])
{
// command: ping
// argument: None
// description:
// requests a 'pong' server message.
return true;
}
static bool client_renderfont(char *input, int argc, char *args[])
{
// command: renderfont
// arguments: font=<font>
// char=<characters>
// description:
// requests the rendering of the given font.
// The font parameter is URL encoded
// The char parameter is URL encoded
return true;
}
static bool client_requestloksession(char *input, int argc, char *args[])
{
// command: requestloksession
// arguments: None
// description:
// requests the initialization of a LOK process in an attempt
// to predict the user's interaction with the document
return true;
}
static bool client_resetselection(char *input, int argc, char *args[])
{
// command: resetselection
// arguments: None
return true;
}
static bool client_saveas(char *input, int argc, char *args[])
{
// command: saveas
// arguments: url=<url>
// format=<format>
// options=<options>
// description:
// <url> is a URL, encoded. <format> is also URL-encoded,
// i.e. spaces as %20 and it can be empty
// options are the whole rest of the line, not URL-encoded, and can be empty
return true;
}
static bool client_selectgraphic(char *input, int argc, char *args[])
{
// command: selectgraphic
// arguments: type=<type>
// x=<x>
// y=<y>
// description:
// <type> is 'start' or 'end'. <x> and <y> are numbers.
return true;
}
static bool client_selecttext(char *input, int argc, char *args[])
{
// command: selecttext
// arguments: type=<type>
// x=<x>
// y=<y>
// description:
// <type> is 'start', 'end' or 'reset', <x> and <y> are numbers.
return true;
}
static bool client_setclientpart(char *input, int argc, char *args[])
{
// command: setclientpart
// arguments: part=<partNumber>
// description:
// Informs the server that the client changed to part <partNumber>.
return true;
}
static bool client_status(char *input, int argc, char *args[])
{
// command: status
// arguments: None
return true;
}
static bool client_styles(char *input, int argc, char *args[])
{
// command: styles
// arguments: None
return true;
}
static bool client_tile(char *input, int argc, char *args[])
{
// command: tile
// arguments: part=<partNumber>
// width=<width>
// height=<height>
// tileposx=<xpos>
// tileposy=<ypos>
// tilewidth=<tileWidth>
// tileheight=<tileHeight>
// [timestamp=<time>]
// [id=<id>]
// [broadcast=<yesOrNo>]
// [oldhash=<hash>]
// description:
// Parameters are numbers except broadcast which is 'yes' or 'no'
// and hash which is a 64-bit hash. (There is no need for the client
// to parse it into a number, it can be treated as an opaque string.)
// Note: id must be echoed back in the response verbatim. It and the
// following parameter, broadcast, are used when rendering slide
// previews of presentation documents, and not for anything else. It
// is only useful to loleaflet and will break it if not returned in
// the response.
return true;
}
static bool client_tilecombine(char *input, int argc, char *args[])
{
// command: tilecombine
// arguments: <parameters>
// description:
// Accepts same parameters as the 'tile' message except that
// parameters 'tileposx', 'tileposy' and 'oldhash' are
// comma-separated lists, and the number of elements in each
// must be same.
return true;
}
static bool client_uno(char *input, int argc, char *args[])
{
// command: uno
// arguments: <command>
// description:
// <command> is a line of text.
return true;
}
static bool client_useractive(char *input, int argc, char *args[])
{
// command: useractive
// arguments: None
// description:
// Sent when the user regains focus or clicks within the active
// area to disable the inactive state.
// Will send invalidation and update notifications to force refreshing the screen.
// See 'userinactive'.
return true;
}
static bool client_userinactive(char *input, int argc, char *args[])
{
// command: userinactive
// arguments: None
// description:
// Sent when the user has switched tabs or away from the Browser
// altogether. It should throttle updates until the user is active again.
// See 'useractive'.
return true;
}
typedef struct {const char *command; bool (*funcCmd)(char *, int, char *[]);} CLIENTCOMMAND;
static CLIENTCOMMAND clientcommands[] = {{"canceltiles", client_canceltiles},
{"clientvisiblearea", client_clientvisiblearea},
{"closedocument", client_closedocument},
{"commandvalues", client_commandvalues},
{"downloadas", client_downloadas},
{"getchildid", client_getchildid},
{"gettextselection", client_gettextselection},
{"insertfile", client_insertfile},
{"key", client_key},
{"load", client_load},
{"loolclient", client_loolclient},
{"mouse", client_mouse},
{"paste", client_paste},
{"ping", client_ping},
{"renderfont", client_renderfont},
{"requestloksession", client_requestloksession},
{"resetselection", client_resetselection},
{"saveas", client_saveas},
{"selectgraphic", client_selectgraphic},
{"selecttext", client_selecttext},
{"setclientpart", client_setclientpart},
{"status", client_status},
{"styles", client_styles},
{"tile", client_tile},
{"tilecombine", client_tilecombine},
{"uno", client_uno},
{"useractive", client_useractive},
{"userinactive", client_userinactive},
{NULL, NULL}
};
bool ClientCommand(char *input)
{
CLIENTCOMMAND *cmd = clientcommands;
// Split input into cmd + args
// Locate correct command
for (; cmd->command; ++cmd)
if (!strcmp(cmd->command,"mycommand"))
return cmd->funcCmd(input, 0, NULL);
// Call/Return from command
return false;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment