include/LibreOfficeKit/LibreOfficeKit.hxx | 2 include/LibreOfficeKit/LibreOfficeKitInit.h | 117 +++++++++++++++++++++++++--- smoketest/libtest.cxx | 58 +++++++++++-- 3 files changed, 153 insertions(+), 24 deletions(-)
New commits: commit 725a52c55e91d3629dfbfb9ba4758048d8bf1a77 Author: Juergen Funk <juergen.funk...@cib.de> Date: Fri Nov 14 10:56:40 2014 +0100 Preparation of the LibreOfficeKit for Windows - not yet included in the make for windows Change-Id: Iee31b0ed0c6545572295ce00a3bb0f909c428b5a Reviewed-on: https://gerrit.libreoffice.org/12425 Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index f61a4b8..f1255f4 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -38,7 +38,7 @@ public: inline bool saveAs(const char* pUrl, const char* pFormat = NULL, const char* pFilterOptions = NULL) { - return mpDoc->pClass->saveAs(mpDoc, pUrl, pFormat, pFilterOptions); + return mpDoc->pClass->saveAs(mpDoc, pUrl, pFormat, pFilterOptions) != 0; } inline LibreOfficeKitDocument *get() { return mpDoc; } diff --git a/include/LibreOfficeKit/LibreOfficeKitInit.h b/include/LibreOfficeKit/LibreOfficeKitInit.h index 010ae9f..37a1fb5 100644 --- a/include/LibreOfficeKit/LibreOfficeKitInit.h +++ b/include/LibreOfficeKit/LibreOfficeKitInit.h @@ -17,22 +17,115 @@ extern "C" { #endif -#if defined(__linux__) || defined (__FreeBSD_kernel__) || defined(_AIX) +#if defined(__linux__) || defined (__FreeBSD_kernel__) || defined(_AIX) || defined(_WIN32) #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <dlfcn.h> -#ifdef _AIX -# include <sys/ldr.h> + +#ifndef _WIN32 + #include "dlfcn.h" + #ifdef _AIX + # include <sys/ldr.h> + #endif + #define TARGET_LIB "lib" "sofficeapp" ".so" + #define TARGET_MERGED_LIB "lib" "mergedlo" ".so" + #define SEPERATOR '/' + + void *_dlopen(const char *pFN) + { + return dlopen(pFN, RTLD_LAZY); + } + + + void *_dlsym(void *Hnd, const char *pName) + { + return dlsym(Hnd, pName); + } + + + int _dlclose(void *Hnd) + { + return dlclose(Hnd); + } + + void extendUnoPath(const char *pPath) + { + (void)pPath; + } + + +#else + + #include <windows.h> + #define TARGET_LIB "sofficeapp" ".dll" + #define TARGET_MERGED_LIB "mergedlo" ".dll" + #define SEPERATOR '\\' + #define UNOPATH "\\..\\URE\\bin" + + + void *_dlopen(const char *pFN) + { + return (void *) LoadLibrary(pFN); + } + + + void *_dlsym(void *Hnd, const char *pName) + { + return GetProcAddress((HINSTANCE) Hnd, pName); + } + + + int _dlclose(void *Hnd) + { + return FreeLibrary((HINSTANCE) Hnd); + } + + void extendUnoPath(const char *pPath) + { + if (!pPath) + return; + + char* sEnvPath = NULL; + DWORD cChars = GetEnvironmentVariable("PATH", sEnvPath, 0); + if (cChars > 0) + { + sEnvPath = new char[cChars]; + cChars = GetEnvironmentVariable("PATH", sEnvPath, cChars); + //If PATH is not set then it is no error + if (cChars == 0 && GetLastError() != ERROR_ENVVAR_NOT_FOUND) + { + delete[] sEnvPath; + return; + } + } + //prepare the new PATH. Add the Ure/bin directory at the front. + //note also adding ';' + char * sNewPath = new char[strlen(sEnvPath) + strlen(pPath) + strlen(UNOPATH) + 2]; + sNewPath[0] = L'\0'; + strcat(sNewPath, pPath); + strcat(sNewPath, UNOPATH); + if (strlen(sEnvPath)) + { + strcat(sNewPath, ";"); + strcat(sNewPath, sEnvPath); + } + + SetEnvironmentVariable("PATH", sNewPath); + + delete[] sEnvPath; + delete[] sNewPath; + } #endif -#define TARGET_LIB "lib" "sofficeapp" ".so" -#define TARGET_MERGED_LIB "lib" "mergedlo" ".so" + + + typedef LibreOfficeKit *(HookFunction)( const char *install_path); + static LibreOfficeKit *lok_init( const char *install_path ) { char *imp_lib; @@ -54,15 +147,17 @@ static LibreOfficeKit *lok_init( const char *install_path ) strcpy(imp_lib, install_path); - imp_lib[partial_length++] = '/'; + extendUnoPath(install_path); + + imp_lib[partial_length++] = SEPERATOR; strcpy(imp_lib + partial_length, TARGET_LIB); - dlhandle = dlopen(imp_lib, RTLD_LAZY); + dlhandle = _dlopen(imp_lib); if (!dlhandle) { strcpy(imp_lib + partial_length, TARGET_MERGED_LIB); - dlhandle = dlopen(imp_lib, RTLD_LAZY); + dlhandle = _dlopen(imp_lib); if (!dlhandle) { fprintf(stderr, "failed to open library '%s' or '%s' in '%s/'\n", @@ -72,11 +167,11 @@ static LibreOfficeKit *lok_init( const char *install_path ) } } - pSym = (HookFunction *) dlsym( dlhandle, "libreofficekit_hook" ); + pSym = (HookFunction *) _dlsym( dlhandle, "libreofficekit_hook" ); if (!pSym) { fprintf( stderr, "failed to find hook in library '%s'\n", imp_lib ); - dlclose( dlhandle ); + _dlclose( dlhandle ); free( imp_lib ); return NULL; } diff --git a/smoketest/libtest.cxx b/smoketest/libtest.cxx index 14df882..ae87c79 100644 --- a/smoketest/libtest.cxx +++ b/smoketest/libtest.cxx @@ -12,19 +12,55 @@ #include <malloc.h> #include <assert.h> #include <math.h> -#include <sys/time.h> -#include <sal/types.h> + #include <LibreOfficeKit/LibreOfficeKitInit.h> #include <LibreOfficeKit/LibreOfficeKit.hxx> + + +#ifdef _WIN32 +//#include <Windows.h> // come from LibreOfficeKitInit.h + long getTimeMS() + { + return GetTickCount(); + } + + bool IsAbsolutePath(char *pPath) + { + if (pPath[1] != ':') + { + fprintf( stderr, "Absolute path required to libreoffice install\n" ); + return false; + } + + return true; + } + +#else +#include <sys/time.h> +#include <sal/types.h> + long getTimeMS() + { + struct timeval t; + gettimeofday(&t, NULL); + return t.tv_sec*1000 + t.tv_usec/1000; + } + + bool IsAbsolutePath(char *pPath) + { + if (pPath[0] != '/') + { + fprintf( stderr, "Absolute path required to libreoffice install\n" ); + return false; + } + + return true; + } +#endif + + using namespace ::lok; -long getTimeMS() -{ - struct timeval t; - gettimeofday(&t, NULL); - return t.tv_sec*1000 + t.tv_usec/1000; -} static int help() { @@ -42,11 +78,9 @@ int main (int argc, char **argv) ( argc > 1 && ( !strcmp( argv[1], "--help" ) || !strcmp( argv[1], "-h" ) ) ) ) return help(); - if (argv[1][0] != '/') - { - fprintf( stderr, "Absolute path required to libreoffice install\n" ); + + if( !IsAbsolutePath(argv[1]) ) return 1; - } // coverity[tainted_string] - build time test tool Office *pOffice = lok_cpp_init( argv[1] );
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits