Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
core
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
LibreOffice
core
Commits
9013a3a7
Kaydet (Commit)
9013a3a7
authored
Kas 15, 2013
tarafından
Michael Meeks
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
liblibo: expose a C API for ABI reasons, and wrap with C++.
Change-Id: I7b3bcead05788e663d94724522bfa3f227b15499
üst
96e23cb9
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
170 additions
and
56 deletions
+170
-56
Library_libreoffice.mk
desktop/Library_libreoffice.mk
+1
-1
liblibreoffice.h
desktop/inc/liblibreoffice.h
+46
-0
liblibreoffice.hxx
desktop/inc/liblibreoffice.hxx
+38
-8
init.cxx
desktop/source/lib/init.cxx
+71
-35
shim.c
desktop/source/lib/shim.c
+13
-11
libtest.cxx
smoketest/libtest.cxx
+1
-1
No files found.
desktop/Library_libreoffice.mk
Dosyayı görüntüle @
9013a3a7
...
...
@@ -25,7 +25,7 @@ $(eval $(call gb_StaticLibrary_use_libraries,libreoffice,\
$(gb_UWINAPI) \
))
$(eval $(call gb_StaticLibrary_add_
exception_
objects,libreoffice,\
$(eval $(call gb_StaticLibrary_add_
c
objects,libreoffice,\
desktop/source/lib/shim \
))
...
...
desktop/inc/liblibreoffice.h
0 → 100644
Dosyayı görüntüle @
9013a3a7
/* -*- Mode: C; 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/.
*/
#ifndef INCLUDED_DESKTOP_INC_LIBLIBREOFFICE_H
#define INCLUDED_DESKTOP_INC_LIBLIBREOFFICE_H
#ifdef __cplusplus
extern
"C"
{
#endif
typedef
struct
_LibreOffice
LibreOffice
;
typedef
struct
_LibreOfficeDocument
LibreOfficeDocument
;
struct
_LibreOffice
{
int
nSize
;
void
(
*
destroy
)
(
LibreOffice
*
pThis
);
int
(
*
initialize
)
(
LibreOffice
*
pThis
,
const
char
*
pInstallPath
);
LibreOfficeDocument
*
(
*
documentLoad
)
(
LibreOffice
*
pThis
,
const
char
*
pURL
);
char
*
(
*
getError
)
(
LibreOffice
*
pThis
);
};
struct
_LibreOfficeDocument
{
int
nSize
;
void
(
*
destroy
)
(
LibreOfficeDocument
*
pThis
);
int
(
*
saveAs
)
(
LibreOfficeDocument
*
pThis
,
const
char
*
pUrl
,
const
char
*
pFormat
);
};
LibreOffice
*
lo_init
(
const
char
*
install_path
);
#ifdef __cplusplus
}
#endif
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
desktop/inc/liblibreoffice.hxx
Dosyayı görüntüle @
9013a3a7
...
...
@@ -10,30 +10,60 @@
#ifndef INCLUDED_DESKTOP_INC_LIBLIBREOFFICE_HXX
#define INCLUDED_DESKTOP_INC_LIBLIBREOFFICE_HXX
#include <liblibreoffice.h>
/*
* The reasons this C++ code is not as pretty as it could be are:
* a) provide a pure C API - that's useful for some people
* b) allow ABI stability - C++ vtables are not good for that.
* c) avoid C++ types as part of the API.
*/
class
LODocument
{
LibreOfficeDocument
*
mpDoc
;
public
:
virtual
~
LODocument
()
{}
inline
LODocument
(
LibreOfficeDocument
*
pDoc
)
:
mpDoc
(
pDoc
)
{}
inline
~
LODocument
()
{
mpDoc
->
destroy
(
mpDoc
);
}
// Save as the given format, if format is NULL sniff from ext'n
virtual
bool
saveAs
(
const
char
*
url
,
const
char
*
format
=
NULL
)
=
0
;
inline
bool
saveAs
(
const
char
*
url
,
const
char
*
format
=
NULL
)
{
return
mpDoc
->
saveAs
(
mpDoc
,
url
,
format
);
}
};
class
LibLibreOffice
{
LibreOffice
*
mpThis
;
public
:
virtual
~
LibLibreOffice
()
{};
inline
LibLibreOffice
(
LibreOffice
*
pThis
)
:
mpThis
(
pThis
)
{}
inline
~
LibLibreOffice
()
{
mpThis
->
destroy
(
mpThis
);
};
virtual
bool
initialize
(
const
char
*
installPath
)
=
0
;
inline
bool
initialize
(
const
char
*
installPath
)
{
return
mpThis
->
initialize
(
mpThis
,
installPath
);
}
virtual
LODocument
*
documentLoad
(
const
char
*
url
)
=
0
;
inline
LODocument
*
documentLoad
(
const
char
*
url
)
{
LibreOfficeDocument
*
pDoc
=
mpThis
->
documentLoad
(
mpThis
,
url
);
if
(
!
pDoc
)
return
NULL
;
return
new
LODocument
(
pDoc
);
}
// return the last error as a string, free me.
virtual
char
*
getError
()
=
0
;
inline
char
*
getError
()
{
return
mpThis
->
getError
(
mpThis
);
}
};
LibLibreOffice
*
lo_init
(
const
char
*
install_path
);
inline
LibLibreOffice
*
lo_cpp_init
(
const
char
*
install_path
)
{
LibreOffice
*
pThis
=
lo_init
(
install_path
);
if
(
!
pThis
||
!
pThis
->
nSize
>
0
)
return
NULL
;
return
new
LibLibreOffice
(
pThis
);
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
desktop/source/lib/init.cxx
Dosyayı görüntüle @
9013a3a7
...
...
@@ -13,7 +13,7 @@
#include <string.h>
#include <stdlib.h>
#include "liblibreoffice.h
xx
"
#include "liblibreoffice.h"
#include <tools/errinf.hxx>
#include <osl/file.hxx>
...
...
@@ -97,29 +97,53 @@ aImpressExtensionMap[] = {
{
NULL
,
NULL
}
};
extern
"C"
{
SAL_DLLPUBLIC_EXPORT
LibreOffice
*
liblibreoffice_hook
(
void
);
static
void
doc_destroy
(
LibreOfficeDocument
*
pThis
);
static
int
doc_saveAs
(
LibreOfficeDocument
*
pThis
,
const
char
*
pUrl
,
const
char
*
pFormat
);
class
LibLODocument_Impl
:
public
LO
Document
struct
LibLODocument_Impl
:
public
_LibreOffice
Document
{
uno
::
Reference
<
css
::
lang
::
XComponent
>
mxComponent
;
public
:
LibLODocument_Impl
(
const
uno
::
Reference
<
css
::
lang
::
XComponent
>
&
xComponent
)
:
mxComponent
(
xComponent
)
{
}
virtual
bool
saveAs
(
const
char
*
url
,
const
char
*
format
);
{
nSize
=
sizeof
(
LibreOffice
);
destroy
=
doc_destroy
;
saveAs
=
doc_saveAs
;
}
};
class
LibLibreOffice_Impl
:
public
LibLibreOffice
static
void
doc_destroy
(
LibreOfficeDocument
*
pThis
)
{
public
:
rtl
::
OUString
maLastExceptionMsg
;
LibLODocument_Impl
*
pDocument
=
static_cast
<
LibLODocument_Impl
*>
(
pThis
);
delete
pDocument
;
}
virtual
bool
initialize
(
const
char
*
installPath
);
static
void
lo_destroy
(
LibreOffice
*
pThis
);
static
int
lo_initialize
(
LibreOffice
*
pThis
,
const
char
*
pInstallPath
);
static
LibreOfficeDocument
*
lo_documentLoad
(
LibreOffice
*
pThis
,
const
char
*
pURL
);
static
char
*
lo_getError
(
LibreOffice
*
pThis
);
virtual
LODocument
*
documentLoad
(
const
char
*
url
);
struct
LibLibreOffice_Impl
:
public
_LibreOffice
{
rtl
::
OUString
maLastExceptionMsg
;
virtual
char
*
getError
();
LibLibreOffice_Impl
()
{
nSize
=
sizeof
(
LibreOfficeDocument
);
virtual
~
LibLibreOffice_Impl
();
destroy
=
lo_destroy
;
initialize
=
lo_initialize
;
documentLoad
=
lo_documentLoad
;
getError
=
lo_getError
;
}
};
// Wonder global state ...
...
...
@@ -149,15 +173,17 @@ static OUString getAbsoluteURL( const char *pURL )
return
sAbsoluteDocUrl
;
}
LO
Document
*
LibLibreOffice_Impl
::
documentLoad
(
const
char
*
docUrl
)
static
LibreOffice
Document
*
lo_documentLoad
(
LibreOffice
*
pThis
,
const
char
*
pURL
)
{
OUString
aURL
=
getAbsoluteURL
(
docUrl
);
LibLibreOffice_Impl
*
pLib
=
static_cast
<
LibLibreOffice_Impl
*>
(
pThis
);
OUString
aURL
=
getAbsoluteURL
(
pURL
);
uno
::
Reference
<
css
::
frame
::
XDesktop2
>
xComponentLoader
=
css
::
frame
::
Desktop
::
create
(
xContext
);
maLastExceptionMsg
=
""
;
pLib
->
maLastExceptionMsg
=
""
;
try
{
uno
::
Reference
<
css
::
lang
::
XComponent
>
xComponent
=
xComponentLoader
->
loadComponentFromURL
(
...
...
@@ -166,21 +192,26 @@ LibLibreOffice_Impl::documentLoad( const char *docUrl )
if
(
xComponentLoader
.
is
()
)
return
new
LibLODocument_Impl
(
xComponent
);
else
maLastExceptionMsg
=
"unknown load failure"
;
pLib
->
maLastExceptionMsg
=
"unknown load failure"
;
}
catch
(
const
uno
::
Exception
&
ex
)
{
maLastExceptionMsg
=
ex
.
Message
;
pLib
->
maLastExceptionMsg
=
ex
.
Message
;
}
return
NULL
;
}
bool
LibLODocument_Impl
::
saveAs
(
const
char
*
url
,
const
char
*
format
)
static
int
doc_saveAs
(
LibreOfficeDocument
*
pThis
,
const
char
*
url
,
const
char
*
format
)
{
LibLODocument_Impl
*
pDocument
=
static_cast
<
LibLODocument_Impl
*>
(
pThis
);
OUString
sFormat
=
getUString
(
format
);
OUString
aURL
=
getAbsoluteURL
(
url
);
try
{
uno
::
Reference
<
frame
::
XModel
>
xDocument
(
mxComponent
,
uno
::
UNO_QUERY_THROW
);
uno
::
Reference
<
frame
::
XModel
>
xDocument
(
pDocument
->
mxComponent
,
uno
::
UNO_QUERY_THROW
);
uno
::
Sequence
<
beans
::
PropertyValue
>
aSeq
=
xDocument
->
getArgs
();
OUString
aDocumentService
;
...
...
@@ -242,7 +273,8 @@ bool LibLODocument_Impl::saveAs (const char *url, const char *format)
aSeq
[
1
].
Name
=
"FilterName"
;
aSeq
[
1
].
Value
<<=
aFilterName
;
uno
::
Reference
<
frame
::
XStorable
>
xStorable
(
mxComponent
,
uno
::
UNO_QUERY_THROW
);
uno
::
Reference
<
frame
::
XStorable
>
xStorable
(
pDocument
->
mxComponent
,
uno
::
UNO_QUERY_THROW
);
xStorable
->
storeToURL
(
aURL
,
aSeq
);
return
true
;
...
...
@@ -252,9 +284,11 @@ bool LibLODocument_Impl::saveAs (const char *url, const char *format)
}
}
char
*
LibLibreOffice_Impl
::
getError
()
static
char
*
lo_getError
(
LibreOffice
*
pThis
)
{
OString
aStr
=
rtl
::
OUStringToOString
(
maLastExceptionMsg
,
RTL_TEXTENCODING_UTF8
);
LibLibreOffice_Impl
*
pLib
=
static_cast
<
LibLibreOffice_Impl
*>
(
pThis
);
OString
aStr
=
rtl
::
OUStringToOString
(
pLib
->
maLastExceptionMsg
,
RTL_TEXTENCODING_UTF8
);
char
*
pMem
=
(
char
*
)
malloc
(
aStr
.
getLength
()
+
1
);
strcpy
(
pMem
,
aStr
.
getStr
()
);
return
pMem
;
...
...
@@ -308,21 +342,23 @@ initialize_uno( const OUString &aAppURL )
// configmgr setup ?
}
bool
LibLibreOffice_Impl
::
initialize
(
const
char
*
app_path
)
static
int
lo_initialize
(
LibreOffice
*
pThis
,
const
char
*
app_path
)
{
(
void
)
pThis
;
static
bool
bInitialized
=
false
;
if
(
bInitialized
)
return
true
;
return
1
;
if
(
!
app_path
)
return
false
;
return
0
;
OUString
aAppPath
(
app_path
,
strlen
(
app_path
),
RTL_TEXTENCODING_UTF8
);
OUString
aAppURL
;
if
(
osl
::
FileBase
::
getFileURLFromSystemPath
(
aAppPath
,
aAppURL
)
!=
osl
::
FileBase
::
E_None
)
return
false
;
return
0
;
try
{
initialize_uno
(
aAppURL
);
...
...
@@ -344,23 +380,23 @@ LibLibreOffice_Impl::initialize( const char *app_path )
return
bInitialized
;
}
extern
"C"
{
SAL_DLLPUBLIC_EXPORT
LibLibreOffice
*
liblibreoffice_hook
(
void
);
}
LibLibreOffice
*
liblibreoffice_hook
(
void
)
LibreOffice
*
liblibreoffice_hook
(
void
)
{
if
(
!
gImpl
)
{
fprintf
(
stderr
,
"create libreoffice object
\n
"
);
gImpl
=
new
LibLibreOffice_Impl
();
}
return
gImpl
;
return
static_cast
<
LibreOffice
*>
(
gImpl
)
;
}
LibLibreOffice_Impl
::~
LibLibreOffice_Impl
(
)
static
void
lo_destroy
(
LibreOffice
*
pThis
)
{
LibLibreOffice_Impl
*
pLib
=
static_cast
<
LibLibreOffice_Impl
*>
(
pThis
);
delete
pLib
;
gImpl
=
NULL
;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
desktop/source/lib/shim.c
xx
→
desktop/source/lib/shim.c
Dosyayı görüntüle @
9013a3a7
...
...
@@ -14,7 +14,7 @@
#include <osl/module.h>
#include <sal/types.h>
#include <liblibreoffice.h
xx
>
#include <liblibreoffice.h>
#include <dlfcn.h>
#ifdef AIX
...
...
@@ -23,32 +23,34 @@
#define TARGET_LIB SAL_MODULENAME( "sofficeapp" )
extern
"C"
{
typedef
LibLibreOffice
*
(
HookFunction
)(
void
);
};
typedef
LibreOffice
*
(
HookFunction
)(
void
);
SAL_DLLPUBLIC_EXPORT
Lib
Lib
reOffice
*
lo_init
(
const
char
*
install_path
)
SAL_DLLPUBLIC_EXPORT
LibreOffice
*
lo_init
(
const
char
*
install_path
)
{
char
*
imp_lib
;
void
*
dlhandle
;
HookFunction
*
pSym
;
if
(
!
install_path
)
return
NULL
;
char
*
imp_lib
=
(
char
*
)
malloc
(
strlen
(
install_path
)
+
sizeof
(
TARGET_LIB
)
+
2
);
if
(
!
imp_lib
)
if
(
!
(
imp_lib
=
(
char
*
)
malloc
(
strlen
(
install_path
)
+
sizeof
(
TARGET_LIB
)
+
2
)
)
)
{
fprintf
(
stderr
,
"failed to open library : not enough memory
\n
"
);
return
NULL
;
}
strcpy
(
imp_lib
,
install_path
);
strcat
(
imp_lib
,
"/"
);
strcat
(
imp_lib
,
TARGET_LIB
);
void
*
dlhandle
=
dlopen
(
imp_lib
,
RTLD_LAZY
);
if
(
!
dlhandle
)
if
(
!
(
dlhandle
=
dlopen
(
imp_lib
,
RTLD_LAZY
)
)
)
{
fprintf
(
stderr
,
"failed to open library '%s'
\n
"
,
imp_lib
);
free
(
imp_lib
);
return
NULL
;
}
HookFunction
*
pSym
=
(
HookFunction
*
)
dlsym
(
dlhandle
,
"liblibreoffice_hook"
);
pSym
=
(
HookFunction
*
)
dlsym
(
dlhandle
,
"liblibreoffice_hook"
);
if
(
!
pSym
)
{
fprintf
(
stderr
,
"failed to find hook in library '%s'
\n
"
,
imp_lib
);
free
(
imp_lib
);
...
...
@@ -59,6 +61,6 @@ SAL_DLLPUBLIC_EXPORT LibLibreOffice *lo_init( const char *install_path )
return
pSym
();
}
#endif //
LINUX -
port me !
#endif //
not LINUX =>
port me !
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
smoketest/libtest.cxx
Dosyayı görüntüle @
9013a3a7
...
...
@@ -44,7 +44,7 @@ int main (int argc, char **argv)
return
1
;
}
LibLibreOffice
*
pOffice
=
lo_init
(
argv
[
1
]
);
LibLibreOffice
*
pOffice
=
lo_
cpp_
init
(
argv
[
1
]
);
if
(
!
pOffice
)
{
fprintf
(
stderr
,
"Failed to initialize
\n
"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment