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/35430
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: jan iversen <jani@libreoffice.org>
This commit is contained in:
jan Iversen 2017-02-23 12:47:34 +01:00 committed by jan iversen
parent 7a2f07c4bd
commit c1f46c54a6
8 changed files with 693 additions and 4 deletions

View File

@ -43,7 +43,9 @@ extern "C"
#define SEPARATOR '/' #define SEPARATOR '/'
#ifndef __OBJC__ #ifndef __OBJC__
#ifdef __cplusplus
inline inline
#endif
#endif #endif
void *lok_loadlib(const char *pFN) void *lok_loadlib(const char *pFN)
{ {
@ -55,7 +57,9 @@ extern "C"
} }
#ifndef __OBJC__ #ifndef __OBJC__
#ifdef __cplusplus
inline inline
#endif
#endif #endif
char *lok_dlerror(void) char *lok_dlerror(void)
{ {
@ -63,7 +67,9 @@ extern "C"
} }
#ifndef __OBJC__ #ifndef __OBJC__
#ifdef __cplusplus
inline inline
#endif
#endif #endif
void *lok_dlsym(void *Hnd, const char *pName) void *lok_dlsym(void *Hnd, const char *pName)
{ {
@ -71,7 +77,9 @@ extern "C"
} }
#ifndef __OBJC__ #ifndef __OBJC__
#ifdef __cplusplus
inline inline
#endif
#endif #endif
int lok_dlclose(void *Hnd) int lok_dlclose(void *Hnd)
{ {
@ -79,7 +87,9 @@ extern "C"
} }
#ifndef __OBJC__ #ifndef __OBJC__
#ifdef __cplusplus
inline inline
#endif
#endif #endif
void extendUnoPath(const char *pPath) void extendUnoPath(const char *pPath)
{ {

View File

@ -0,0 +1,30 @@
# -*- 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:

View File

@ -14,6 +14,7 @@ $(eval $(call gb_Module_add_targets,ios,\
CustomTarget_Lo_Xcconfig \ CustomTarget_Lo_Xcconfig \
CustomTarget_TiledLibreOffice_app \ CustomTarget_TiledLibreOffice_app \
CustomTarget_Prototype_app \ CustomTarget_Prototype_app \
CustomTarget_LibreOfficeLight_app \
)) ))
endif endif

View File

@ -21,6 +21,17 @@
3992D85E1E5B764A00BEA987 /* ViewFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3992D85C1E5B764A00BEA987 /* ViewFileManager.swift */; }; 3992D85E1E5B764A00BEA987 /* ViewFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3992D85C1E5B764A00BEA987 /* ViewFileManager.swift */; };
399648471E5B87DC00E73E83 /* ViewProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399648461E5B87DC00E73E83 /* ViewProperties.swift */; }; 399648471E5B87DC00E73E83 /* ViewProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399648461E5B87DC00E73E83 /* ViewProperties.swift */; };
399648491E5C4E5500E73E83 /* LO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399648481E5C4E5500E73E83 /* LO.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 */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -61,6 +72,19 @@
3992D85C1E5B764A00BEA987 /* ViewFileManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewFileManager.swift; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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 */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -91,6 +115,8 @@
3911D89F1E5993600050D6BC /* Support files */ = { 3911D89F1E5993600050D6BC /* Support files */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
39B092501E5F3DEA00682A59 /* LibreOfficeLight-Prefix.pch */,
39B084E21E5F0A9600682A59 /* lo.xcconfig */,
397E09071E597BD8001374E0 /* Assets.xcassets */, 397E09071E597BD8001374E0 /* Assets.xcassets */,
397E09041E597BD8001374E0 /* LibreOfficeLight.xcdatamodeld */, 397E09041E597BD8001374E0 /* LibreOfficeLight.xcdatamodeld */,
397E090C1E597BD8001374E0 /* Info.plist */, 397E090C1E597BD8001374E0 /* Info.plist */,
@ -102,6 +128,8 @@
397E08F11E597BD8001374E0 = { 397E08F11E597BD8001374E0 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
39B084E41E5F0B5200682A59 /* Resources */,
3911D89F1E5993600050D6BC /* Support files */,
397E08FC1E597BD8001374E0 /* LibreOfficeLight */, 397E08FC1E597BD8001374E0 /* LibreOfficeLight */,
397E09141E597BD8001374E0 /* LibreOfficeLightTests */, 397E09141E597BD8001374E0 /* LibreOfficeLightTests */,
397E091F1E597BD8001374E0 /* LibreOfficeLightUITests */, 397E091F1E597BD8001374E0 /* LibreOfficeLightUITests */,
@ -122,6 +150,7 @@
397E08FC1E597BD8001374E0 /* LibreOfficeLight */ = { 397E08FC1E597BD8001374E0 /* LibreOfficeLight */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
39A83A8E1E5F471D00D0C683 /* lokit.c */,
397E08FD1E597BD8001374E0 /* AppDelegate.swift */, 397E08FD1E597BD8001374E0 /* AppDelegate.swift */,
3992D8571E5B761700BEA987 /* ViewController.swift */, 3992D8571E5B761700BEA987 /* ViewController.swift */,
3992D85B1E5B764A00BEA987 /* SideMenu.swift */, 3992D85B1E5B764A00BEA987 /* SideMenu.swift */,
@ -132,7 +161,7 @@
399648481E5C4E5500E73E83 /* LO.swift */, 399648481E5C4E5500E73E83 /* LO.swift */,
397E09011E597BD8001374E0 /* Main.storyboard */, 397E09011E597BD8001374E0 /* Main.storyboard */,
397868D81E59A3EA007F9248 /* LaunchScreen.xib */, 397868D81E59A3EA007F9248 /* LaunchScreen.xib */,
3911D89F1E5993600050D6BC /* Support files */, 39A83A8D1E5F471C00D0C683 /* lokit-Bridging-Header.h */,
); );
path = LibreOfficeLight; path = LibreOfficeLight;
sourceTree = SOURCE_ROOT; sourceTree = SOURCE_ROOT;
@ -155,6 +184,22 @@
path = LibreOfficeLightUITests; path = LibreOfficeLightUITests;
sourceTree = SOURCE_ROOT; 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 */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@ -223,6 +268,7 @@
TargetAttributes = { TargetAttributes = {
397E08F91E597BD8001374E0 = { 397E08F91E597BD8001374E0 = {
CreatedOnToolsVersion = 8.2; CreatedOnToolsVersion = 8.2;
LastSwiftMigration = 0820;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
397E09101E597BD8001374E0 = { 397E09101E597BD8001374E0 = {
@ -261,8 +307,18 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
39B091D21E5F109A00682A59 /* icudt58l.dat in Resources */,
397E09081E597BD8001374E0 /* Assets.xcassets 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 */, 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 */, 397E09031E597BD8001374E0 /* Main.storyboard in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -295,6 +351,7 @@
3992D85E1E5B764A00BEA987 /* ViewFileManager.swift in Sources */, 3992D85E1E5B764A00BEA987 /* ViewFileManager.swift in Sources */,
3992D85A1E5B762A00BEA987 /* ViewDocument.swift in Sources */, 3992D85A1E5B762A00BEA987 /* ViewDocument.swift in Sources */,
397E08FE1E597BD8001374E0 /* AppDelegate.swift in Sources */, 397E08FE1E597BD8001374E0 /* AppDelegate.swift in Sources */,
39A83A8F1E5F471D00D0C683 /* lokit.c in Sources */,
399648491E5C4E5500E73E83 /* LO.swift in Sources */, 399648491E5C4E5500E73E83 /* LO.swift in Sources */,
3992D8581E5B761700BEA987 /* ViewController.swift in Sources */, 3992D8581E5B761700BEA987 /* ViewController.swift in Sources */,
); );
@ -354,6 +411,7 @@
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
397E09231E597BD8001374E0 /* Debug */ = { 397E09231E597BD8001374E0 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
@ -392,6 +450,26 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = 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; IPHONEOS_DEPLOYMENT_TARGET = 10.2;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
@ -404,6 +482,7 @@
}; };
397E09241E597BD8001374E0 /* Release */ = { 397E09241E597BD8001374E0 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
@ -436,8 +515,29 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = 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; IPHONEOS_DEPLOYMENT_TARGET = 10.2;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
@ -447,30 +547,51 @@
}; };
397E09261E597BD8001374E0 /* Debug */ = { 397E09261E597BD8001374E0 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 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; INFOPLIST_FILE = LibreOfficeLight/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = jani.libreofficeLight.LibreOfficeLight; PRODUCT_BUNDLE_IDENTIFIER = LibreOfficeLight;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "LibreOfficeLight/lokit-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0; SWIFT_VERSION = 3.0;
}; };
name = Debug; name = Debug;
}; };
397E09271E597BD8001374E0 /* Release */ = { 397E09271E597BD8001374E0 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 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; INFOPLIST_FILE = LibreOfficeLight/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 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)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "LibreOfficeLight/lokit-Bridging-Header.h";
SWIFT_VERSION = 3.0; SWIFT_VERSION = 3.0;
}; };
name = Release; name = Release;
}; };
397E09291E597BD8001374E0 /* Debug */ = { 397E09291E597BD8001374E0 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
@ -485,6 +606,7 @@
}; };
397E092A1E597BD8001374E0 /* Release */ = { 397E092A1E597BD8001374E0 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
@ -499,6 +621,7 @@
}; };
397E092C1E597BD8001374E0 /* Debug */ = { 397E092C1E597BD8001374E0 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = LibreOfficeLightUITests/Info.plist; INFOPLIST_FILE = LibreOfficeLightUITests/Info.plist;
@ -512,6 +635,7 @@
}; };
397E092D1E597BD8001374E0 /* Release */ = { 397E092D1E597BD8001374E0 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 39B084E21E5F0A9600682A59 /* lo.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = LibreOfficeLightUITests/Info.plist; INFOPLIST_FILE = LibreOfficeLightUITests/Info.plist;

View File

@ -16,7 +16,7 @@ class LOkit
{ {
init() init()
{ {
LOkit_Init()
} }

View File

@ -0,0 +1,22 @@
// -*- 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:

View File

@ -0,0 +1,11 @@
//
// 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();

View File

@ -0,0 +1,491 @@
//
// 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;
}