summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/LibreOfficeKit/LibreOfficeKit.hxx2
-rw-r--r--include/LibreOfficeKit/LibreOfficeKitInit.h117
-rw-r--r--smoketest/libtest.cxx58
3 files changed, 153 insertions, 24 deletions
diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx
index f61a4b824a2d..f1255f4a59eb 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 010ae9f56733..37a1fb5bfefc 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 14df8825dc70..ae87c796112a 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] );