Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
67d3afb0
Commit
67d3afb0
authored
Jan 07, 2005
by
Marcus Meissner
Committed by
Alexandre Julliard
Jan 07, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Load libcapi20.so.* dynamically on demand.
parent
346188b7
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
186 additions
and
16 deletions
+186
-16
configure
configure
+75
-4
configure.ac
configure.ac
+1
-1
Makefile.in
dlls/capi2032/Makefile.in
+0
-1
cap20wxx.c
dlls/capi2032/cap20wxx.c
+107
-10
config.h.in
include/config.h.in
+3
-0
No files found.
configure
View file @
67d3afb0
...
...
@@ -311,7 +311,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
ac_subst_vars
=
'SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS WIN16_FILES WIN16_INSTALL DLLDEFS build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX CPPBIN ac_ct_CPPBIN TOOLSDIR CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS LEX LEXLIB LEX_OUTPUT_ROOT XLEX BISON AS ac_ct_AS LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP WINDRES ac_ct_WINDRES LN_S LN EGREP LDCONFIG INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LINT LINTFLAGS DB2HTML DB2PDF DB2PS DB2TXT FONTFORGE LIBPTHREAD XLIB XFILES OPENGLFILES GLU32FILES OPENGL_LIBS GLUT_LIBS GLUT32FILES NASLIBS CURSESLIBS sane_devel SANELIBS SANEINCL ICULIBS ft_devel ft_devel2 FREETYPELIBS FREETYPEINCL FONTSSUBDIRS ARTSCCONFIG ARTSLIBS ARTSINCL ALSALIBS AUDIOIOLIBS
CAPI4LINUXLIBS
EXTRACFLAGS DLLEXT DLLFLAGS DLLIBS LDSHARED LDDLLFLAGS LIBEXT IMPLIBEXT DLLTOOL ac_ct_DLLTOOL DLLWRAP ac_ct_DLLWRAP LDEXECFLAGS LDLIBWINEFLAGS COREFOUNDATIONLIB IOKITLIB CROSSTEST CROSSCC CROSSWINDRES LDPATH CRTLIBS SOCKETLIBS WINE_BINARIES MAIN_BINARY LDD ALLOCA LIBOBJS LTLIBOBJS'
ac_subst_vars
=
'SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS WIN16_FILES WIN16_INSTALL DLLDEFS build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX CPPBIN ac_ct_CPPBIN TOOLSDIR CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS LEX LEXLIB LEX_OUTPUT_ROOT XLEX BISON AS ac_ct_AS LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP WINDRES ac_ct_WINDRES LN_S LN EGREP LDCONFIG INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LINT LINTFLAGS DB2HTML DB2PDF DB2PS DB2TXT FONTFORGE LIBPTHREAD XLIB XFILES OPENGLFILES GLU32FILES OPENGL_LIBS GLUT_LIBS GLUT32FILES NASLIBS CURSESLIBS sane_devel SANELIBS SANEINCL ICULIBS ft_devel ft_devel2 FREETYPELIBS FREETYPEINCL FONTSSUBDIRS ARTSCCONFIG ARTSLIBS ARTSINCL ALSALIBS AUDIOIOLIBS EXTRACFLAGS DLLEXT DLLFLAGS DLLIBS LDSHARED LDDLLFLAGS LIBEXT IMPLIBEXT DLLTOOL ac_ct_DLLTOOL DLLWRAP ac_ct_DLLWRAP LDEXECFLAGS LDLIBWINEFLAGS COREFOUNDATIONLIB IOKITLIB CROSSTEST CROSSCC CROSSWINDRES LDPATH CRTLIBS SOCKETLIBS WINE_BINARIES MAIN_BINARY LDD ALLOCA LIBOBJS LTLIBOBJS'
ac_subst_files
=
'MAKE_RULES MAKE_DLL_RULES MAKE_TEST_RULES MAKE_LIB_RULES MAKE_PROG_RULES'
# Initialize some variables set by options.
...
...
@@ -12050,8 +12050,6 @@ cat >>confdefs.h <<\_ACEOF
#define HAVE_CAPI4LINUX 1
_ACEOF
CAPI4LINUXLIBS
=
"-lcapi20"
fi
...
...
@@ -15776,6 +15774,80 @@ cat >>confdefs.h <<_ACEOF
#define SONAME_LIBLCMS "
$ac_cv_lib_soname_lcms
"
_ACEOF
fi
echo
"
$as_me
:
$LINENO
: checking for -lcapi20 soname"
>
&5
echo
$ECHO_N
"checking for -lcapi20 soname...
$ECHO_C
"
>
&6
if
test
"
${
ac_cv_lib_soname_capi20
+set
}
"
=
set
;
then
echo
$ECHO_N
"(cached)
$ECHO_C
"
>
&6
else
ac_get_soname_save_LIBS
=
$LIBS
LIBS
=
"-lcapi20
$LIBS
"
cat
>
conftest.
$ac_ext
<<
_ACEOF
/* confdefs.h. */
_ACEOF
cat
confdefs.h
>>
conftest.
$ac_ext
cat
>>
conftest.
$ac_ext
<<
_ACEOF
/* end confdefs.h. */
/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char capi20_isinstalled ();
int
main ()
{
capi20_isinstalled ();
;
return 0;
}
_ACEOF
rm
-f
conftest.
$ac_objext
conftest
$ac_exeext
if
{
(
eval echo
"
$as_me
:
$LINENO
:
\"
$ac_link
\"
"
)
>
&5
(
eval
$ac_link
)
2>conftest.er1
ac_status
=
$?
grep
-v
'^ *+'
conftest.er1
>
conftest.err
rm
-f
conftest.er1
cat
conftest.err
>
&5
echo
"
$as_me
:
$LINENO
:
\$
? =
$ac_status
"
>
&5
(
exit
$ac_status
)
;
}
&&
{
ac_try
=
'test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{
(
eval echo
"
$as_me
:
$LINENO
:
\"
$ac_try
\"
"
)
>
&5
(
eval
$ac_try
)
2>&5
ac_status
=
$?
echo
"
$as_me
:
$LINENO
:
\$
? =
$ac_status
"
>
&5
(
exit
$ac_status
)
;
}
;
}
&&
{
ac_try
=
'test -s conftest$ac_exeext'
{
(
eval echo
"
$as_me
:
$LINENO
:
\"
$ac_try
\"
"
)
>
&5
(
eval
$ac_try
)
2>&5
ac_status
=
$?
echo
"
$as_me
:
$LINENO
:
\$
? =
$ac_status
"
>
&5
(
exit
$ac_status
)
;
}
;
}
;
then
ac_cv_lib_soname_capi20
=
`
$ac_cv_path_LDD
conftest
$ac_exeext
|
grep
libcapi20
\\
.
$LIBEXT
|
sed
"s/^.*
\(
libcapi20
\.
$LIBEXT
[^ ]*
\)
.*
$/
\1
/"
`
if
test
"x
$ac_cv_lib_soname_capi20
"
=
"x"
then
ac_cv_lib_soname_capi20
=
"libcapi20.
$LIBEXT
"
fi
else
echo
"
$as_me
: failed program was:"
>
&5
sed
's/^/| /'
conftest.
$ac_ext
>
&5
ac_cv_lib_soname_capi20
=
"libcapi20.
$LIBEXT
"
fi
rm
-f
conftest.err conftest.
$ac_objext
\
conftest
$ac_exeext
conftest.
$ac_ext
LIBS
=
$ac_get_soname_save_LIBS
fi
echo
"
$as_me
:
$LINENO
: result:
$ac_cv_lib_soname_capi20
"
>
&5
echo
"
${
ECHO_T
}
$ac_cv_lib_soname_capi20
"
>
&6
if
test
"x
$ac_cv_lib_soname_capi20
"
!=
xNONE
then
cat
>>
confdefs.h
<<
_ACEOF
#define SONAME_LIBCAPI20 "
$ac_cv_lib_soname_capi20
"
_ACEOF
fi
fi
...
...
@@ -20835,7 +20907,6 @@ s,@ARTSLIBS@,$ARTSLIBS,;t t
s,@ARTSINCL@,
$ARTSINCL
,;t t
s,@ALSALIBS@,
$ALSALIBS
,;t t
s,@AUDIOIOLIBS@,
$AUDIOIOLIBS
,;t t
s,@CAPI4LINUXLIBS@,
$CAPI4LINUXLIBS
,;t t
s,@EXTRACFLAGS@,
$EXTRACFLAGS
,;t t
s,@DLLEXT@,
$DLLEXT
,;t t
s,@DLLFLAGS@,
$DLLFLAGS
,;t t
...
...
configure.ac
View file @
67d3afb0
...
...
@@ -700,7 +700,6 @@ AC_CHECK_HEADERS(capi20.h,[
AC_CHECK_HEADERS(linux/capi.h,[
AC_CHECK_LIB(capi20,capi20_register,[
AC_DEFINE(HAVE_CAPI4LINUX,1,[Define if you have capi4linux libs and headers])
AC_SUBST(CAPI4LINUXLIBS,"-lcapi20")
])
])
])
...
...
@@ -1106,6 +1105,7 @@ then
WINE_GET_SONAME(ungif,DGifOpen)
WINE_GET_SONAME(gif,DGifOpen)
WINE_GET_SONAME(lcms,cmsOpenProfileFromFile)
WINE_GET_SONAME(capi20,capi20_isinstalled)
fi
...
...
dlls/capi2032/Makefile.in
View file @
67d3afb0
...
...
@@ -4,7 +4,6 @@ SRCDIR = @srcdir@
VPATH
=
@srcdir@
MODULE
=
capi2032.dll
IMPORTS
=
kernel32
EXTRALIBS
=
@CAPI4LINUXLIBS@
C_SRCS
=
cap20wxx.c
...
...
dlls/capi2032/cap20wxx.c
View file @
67d3afb0
...
...
@@ -22,6 +22,7 @@
#define __NO_CAPIUTILS__
#include "config.h"
#include "wine/port.h"
#include <stdio.h>
#include <sys/types.h>
...
...
@@ -36,18 +37,67 @@
#ifdef HAVE_CAPI20_H
# include <capi20.h>
#endif
#include "wine/library.h"
#include "wine/debug.h"
#include "cap20wxx.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
capi
);
#ifdef HAVE_CAPI4LINUX
#ifndef SONAME_LIBCAPI20
#define SONAME_LIBCAPI20 "libcapi20.so"
#endif
static
unsigned
(
*
pcapi20_register
)(
unsigned
,
unsigned
,
unsigned
,
unsigned
*
)
=
NULL
;
static
unsigned
(
*
pcapi20_release
)(
unsigned
)
=
NULL
;
static
unsigned
(
*
pcapi20_put_message
)(
unsigned
,
unsigned
char
*
)
=
NULL
;
static
unsigned
(
*
pcapi20_get_message
)(
unsigned
,
unsigned
char
**
)
=
NULL
;
static
unsigned
(
*
pcapi20_waitformessage
)(
unsigned
,
struct
timeval
*
)
=
NULL
;
static
unsigned
(
*
pcapi20_isinstalled
)()
=
NULL
;
static
unsigned
(
*
pcapi20_get_profile
)(
unsigned
,
unsigned
char
*
)
=
NULL
;
static
unsigned
char
*
(
*
pcapi20_get_manufacturer
)(
unsigned
,
unsigned
char
*
)
=
NULL
;
static
unsigned
char
*
(
*
pcapi20_get_serial_number
)(
unsigned
,
unsigned
char
*
)
=
NULL
;
static
unsigned
char
*
(
*
pcapi20_get_version
)(
unsigned
,
unsigned
char
*
)
=
NULL
;
static
void
load_functions
()
{
void
*
capi_handle
=
NULL
;
if
(
pcapi20_register
)
/* loaded already */
return
;
capi_handle
=
wine_dlopen
(
SONAME_LIBCAPI20
,
RTLD_NOW
,
NULL
,
0
);
if
(
!
capi_handle
)
{
FIXME
(
"Wine cannot find the library %s, capi2032.dll not working.
\n
"
,
SONAME_LIBCAPI20
);
return
;
}
#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(capi_handle, #f, NULL, 0)) == NULL){WARN("Can't find symbol %s\n", #f); return;}
LOAD_FUNCPTR
(
capi20_register
);
LOAD_FUNCPTR
(
capi20_release
);
LOAD_FUNCPTR
(
capi20_put_message
);
LOAD_FUNCPTR
(
capi20_get_message
);
LOAD_FUNCPTR
(
capi20_waitformessage
);
LOAD_FUNCPTR
(
capi20_isinstalled
);
LOAD_FUNCPTR
(
capi20_get_profile
);
LOAD_FUNCPTR
(
capi20_get_manufacturer
);
LOAD_FUNCPTR
(
capi20_get_serial_number
);
LOAD_FUNCPTR
(
capi20_get_version
);
#undef LOAD_FUNCPTR
}
#endif
/*===========================================================================*\
\*===========================================================================*/
DWORD
WINAPI
wrapCAPI_REGISTER
(
DWORD
MessageBufferSize
,
DWORD
maxLogicalConnection
,
DWORD
maxBDataBlocks
,
DWORD
maxBDataLen
,
DWORD
*
pApplID
)
{
#ifdef HAVE_CAPI4LINUX
unsigned
aid
=
0
;
DWORD
fret
=
capi20_register
(
maxLogicalConnection
,
maxBDataBlocks
,
maxBDataLen
,
&
aid
);
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_register
)
return
0x1009
;
fret
=
pcapi20_register
(
maxLogicalConnection
,
maxBDataBlocks
,
maxBDataLen
,
&
aid
);
*
pApplID
=
aid
;
TRACE
(
"(%lx) -> %lx
\n
"
,
*
pApplID
,
fret
);
return
fret
;
...
...
@@ -61,7 +111,12 @@ DWORD WINAPI wrapCAPI_REGISTER (DWORD MessageBufferSize, DWORD maxLogicalConnect
\*---------------------------------------------------------------------------*/
DWORD
WINAPI
wrapCAPI_RELEASE
(
DWORD
ApplID
)
{
#ifdef HAVE_CAPI4LINUX
DWORD
fret
=
capi20_release
(
ApplID
);
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_release
)
return
0x1109
;
fret
=
pcapi20_release
(
ApplID
);
TRACE
(
"(%lx) -> %lx
\n
"
,
ApplID
,
fret
);
return
fret
;
#else
...
...
@@ -73,7 +128,12 @@ DWORD WINAPI wrapCAPI_RELEASE (DWORD ApplID) {
\*---------------------------------------------------------------------------*/
DWORD
WINAPI
wrapCAPI_PUT_MESSAGE
(
DWORD
ApplID
,
PVOID
pCAPIMessage
)
{
#ifdef HAVE_CAPI4LINUX
DWORD
fret
=
capi20_put_message
(
ApplID
,
pCAPIMessage
);
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_put_message
)
return
0x1109
;
fret
=
pcapi20_put_message
(
ApplID
,
pCAPIMessage
);
TRACE
(
"(%lx) -> %lx
\n
"
,
ApplID
,
fret
);
return
fret
;
#else
...
...
@@ -85,7 +145,12 @@ DWORD WINAPI wrapCAPI_PUT_MESSAGE (DWORD ApplID, PVOID pCAPIMessage) {
\*---------------------------------------------------------------------------*/
DWORD
WINAPI
wrapCAPI_GET_MESSAGE
(
DWORD
ApplID
,
PVOID
*
ppCAPIMessage
)
{
#ifdef HAVE_CAPI4LINUX
DWORD
fret
=
capi20_get_message
(
ApplID
,
(
unsigned
char
**
)
ppCAPIMessage
);
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_get_message
)
return
0x1109
;
fret
=
pcapi20_get_message
(
ApplID
,
(
unsigned
char
**
)
ppCAPIMessage
);
TRACE
(
"(%lx) -> %lx
\n
"
,
ApplID
,
fret
);
return
fret
;
#else
...
...
@@ -98,7 +163,12 @@ DWORD WINAPI wrapCAPI_GET_MESSAGE (DWORD ApplID, PVOID *ppCAPIMessage) {
DWORD
WINAPI
wrapCAPI_WAIT_FOR_SIGNAL
(
DWORD
ApplID
)
{
#ifdef HAVE_CAPI4LINUX
TRACE
(
"(%lx)
\n
"
,
ApplID
);
return
capi20_waitformessage
(
ApplID
,
NULL
);
load_functions
();
if
(
!
pcapi20_waitformessage
)
return
0x1109
;
return
pcapi20_waitformessage
(
ApplID
,
NULL
);
#else
return
0x1109
;
#endif
...
...
@@ -108,7 +178,13 @@ DWORD WINAPI wrapCAPI_WAIT_FOR_SIGNAL (DWORD ApplID) {
\*---------------------------------------------------------------------------*/
DWORD
WINAPI
wrapCAPI_GET_MANUFACTURER
(
char
*
SzBuffer
)
{
#ifdef HAVE_CAPI4LINUX
DWORD
fret
=
(
capi20_get_manufacturer
(
0
,
SzBuffer
)
!=
0
)
?
0
:
0x1108
;
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_get_manufacturer
)
return
0x1109
;
fret
=
(
pcapi20_get_manufacturer
(
0
,
SzBuffer
)
!=
0
)
?
0
:
0x1108
;
if
(
!
strncmp
(
SzBuffer
,
"AVM"
,
3
))
{
strcpy
(
SzBuffer
,
"AVM-GmbH"
);
}
...
...
@@ -124,7 +200,12 @@ DWORD WINAPI wrapCAPI_GET_MANUFACTURER (char *SzBuffer) {
DWORD
WINAPI
wrapCAPI_GET_VERSION
(
DWORD
*
pCAPIMajor
,
DWORD
*
pCAPIMinor
,
DWORD
*
pManufacturerMajor
,
DWORD
*
pManufacturerMinor
)
{
#ifdef HAVE_CAPI4LINUX
unsigned
char
version
[
4
*
sizeof
(
unsigned
)];
DWORD
fret
=
(
capi20_get_version
(
0
,
version
)
!=
0
)
?
0
:
0x1108
;
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_get_version
)
return
0x1109
;
fret
=
(
pcapi20_get_version
(
0
,
version
)
!=
0
)
?
0
:
0x1108
;
*
pCAPIMajor
=
*
(
unsigned
*
)(
version
+
0
*
sizeof
(
unsigned
));
*
pCAPIMinor
=
*
(
unsigned
*
)(
version
+
1
*
sizeof
(
unsigned
));
*
pManufacturerMajor
=
*
(
unsigned
*
)(
version
+
2
*
sizeof
(
unsigned
));
...
...
@@ -141,7 +222,12 @@ DWORD WINAPI wrapCAPI_GET_VERSION (DWORD *pCAPIMajor, DWORD *pCAPIMinor, DWORD *
\*---------------------------------------------------------------------------*/
DWORD
WINAPI
wrapCAPI_GET_SERIAL_NUMBER
(
char
*
SzBuffer
)
{
#ifdef HAVE_CAPI4LINUX
DWORD
fret
=
(
capi20_get_serial_number
(
0
,
SzBuffer
)
!=
0
)
?
0
:
0x1108
;
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_get_serial_number
)
return
0x1109
;
fret
=
(
pcapi20_get_serial_number
(
0
,
SzBuffer
)
!=
0
)
?
0
:
0x1108
;
TRACE
(
"(%s) -> %lx
\n
"
,
SzBuffer
,
fret
);
return
fret
;
#else
...
...
@@ -153,7 +239,13 @@ DWORD WINAPI wrapCAPI_GET_SERIAL_NUMBER (char *SzBuffer) {
\*---------------------------------------------------------------------------*/
DWORD
WINAPI
wrapCAPI_GET_PROFILE
(
PVOID
SzBuffer
,
DWORD
CtlrNr
)
{
#ifdef HAVE_CAPI4LINUX
DWORD
fret
=
capi20_get_profile
(
CtlrNr
,
SzBuffer
);
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_get_profile
)
return
0x1109
;
fret
=
pcapi20_get_profile
(
CtlrNr
,
SzBuffer
);
TRACE
(
"(%lx,%x) -> %lx
\n
"
,
CtlrNr
,
*
(
unsigned
short
*
)
SzBuffer
,
fret
);
return
fret
;
#else
...
...
@@ -165,7 +257,12 @@ DWORD WINAPI wrapCAPI_GET_PROFILE (PVOID SzBuffer, DWORD CtlrNr) {
\*---------------------------------------------------------------------------*/
DWORD
WINAPI
wrapCAPI_INSTALLED
(
void
)
{
#ifdef HAVE_CAPI4LINUX
DWORD
fret
=
capi20_isinstalled
();
DWORD
fret
;
load_functions
();
if
(
!
pcapi20_isinstalled
)
return
0x1109
;
fret
=
pcapi20_isinstalled
();
TRACE
(
"() -> %lx
\n
"
,
fret
);
return
fret
;
#else
...
...
include/config.h.in
View file @
67d3afb0
...
...
@@ -833,6 +833,9 @@
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define to the soname of the libcapi20 library. */
#undef SONAME_LIBCAPI20
/* Define to the soname of the libcrypto library. */
#undef SONAME_LIBCRYPTO
...
...
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