fdo#48017 WIN32 long path support in Hyphen and MyThes
Change-Id: Ifb068efb553ed24a7caf65dbab28726bdeced0e6
This commit is contained in:
+1
@@ -17,6 +17,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,hyphen,\
|
||||
external/hyphen/hyphen-android.patch \
|
||||
external/hyphen/hyphen-rhmin.patch \
|
||||
external/hyphen/hyphen-build.patch \
|
||||
external/hyphen/hyphen-fdo48017-wfopen.patch \
|
||||
))
|
||||
|
||||
# vim: set noet sw=4 ts=4:
|
||||
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
diff -u hyphen/hyphen.c build/hyphen/hyphen.c
|
||||
--- hyphen/hyphen.c 2014-05-22 00:28:13.164587974 +0200
|
||||
+++ build/hyphen/hyphen.c 2014-05-22 11:08:55.000000000 +0200
|
||||
@@ -44,6 +44,11 @@
|
||||
#include <unistd.h> /* for exit */
|
||||
#endif
|
||||
|
||||
+#ifdef _WIN32
|
||||
+#include <windows.h>
|
||||
+#include <wchar.h>
|
||||
+#endif
|
||||
+
|
||||
#define noVERBOSE
|
||||
|
||||
/* calculate hyphenmin values with long ligature length (2 or 3 characters
|
||||
@@ -371,6 +376,21 @@
|
||||
}
|
||||
}
|
||||
|
||||
+FILE * hnj_fopen(const char * path, const char * mode) {
|
||||
+#ifdef _WIN32
|
||||
+#define WIN32_LONG_PATH_PREFIX "\\\\?\\"
|
||||
+ if (strncmp(path, WIN32_LONG_PATH_PREFIX, 4) == 0) {
|
||||
+ int len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0);
|
||||
+ wchar_t *buff = (wchar_t *) malloc(len * sizeof(wchar_t));
|
||||
+ MultiByteToWideChar(CP_UTF8, 0, path, -1, buff, len);
|
||||
+ FILE * f = _wfopen(buff, (strcmp(mode, "r") == 0) ? L"r" : L"rb");
|
||||
+ free(buff);
|
||||
+ return f;
|
||||
+ }
|
||||
+#endif
|
||||
+ return fopen(path, mode);
|
||||
+}
|
||||
+
|
||||
HyphenDict *
|
||||
hnj_hyphen_load (const char *fn)
|
||||
{
|
||||
@@ -383,7 +403,7 @@
|
||||
HashEntry *e;
|
||||
int state_num = 0;
|
||||
|
||||
- f = fopen (fn, "r");
|
||||
+ f = hnj_fopen (fn, "r");
|
||||
if (f == NULL)
|
||||
return NULL;
|
||||
|
||||
+1
@@ -15,6 +15,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,mythes,\
|
||||
external/mythes/mythes-1.2.0-vanilla-th-gen-idx.patch \
|
||||
external/mythes/mythes-1.2.0-android.patch \
|
||||
external/mythes/mythes-ssizet.patch \
|
||||
external/mythes/mythes-fdo48017-wfopen.patch \
|
||||
))
|
||||
|
||||
# vim: set noet sw=4 ts=4:
|
||||
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
diff -u mythes/mythes.cxx build/mythes/mythes.cxx
|
||||
--- mythes/mythes.cxx 2014-05-22 00:27:38.508588487 +0200
|
||||
+++ build/mythes/mythes.cxx 2014-05-22 10:07:06.107547417 +0200
|
||||
@@ -8,6 +8,11 @@
|
||||
|
||||
#include "mythes.hxx"
|
||||
|
||||
+#ifdef _WIN32
|
||||
+#include <windows.h>
|
||||
+#include <wchar.h>
|
||||
+#endif
|
||||
+
|
||||
MyThes::MyThes(const char* idxpath, const char * datpath)
|
||||
{
|
||||
nw = 0;
|
||||
@@ -35,7 +40,7 @@
|
||||
{
|
||||
|
||||
// open the index file
|
||||
- FILE * pifile = fopen(idxpath,"r");
|
||||
+ FILE * pifile = myfopen(idxpath,"r");
|
||||
if (!pifile) {
|
||||
return 0;
|
||||
}
|
||||
@@ -90,7 +95,7 @@
|
||||
fclose(pifile);
|
||||
|
||||
/* next open the data file */
|
||||
- pdfile = fopen(datpath,"r");
|
||||
+ pdfile = myfopen(datpath,"r");
|
||||
if (!pdfile) {
|
||||
return 0;
|
||||
}
|
||||
@@ -370,3 +375,17 @@
|
||||
return -1;
|
||||
}
|
||||
|
||||
+FILE * MyThes::myfopen(const char * path, const char * mode) {
|
||||
+#ifdef _WIN32
|
||||
+#define WIN32_LONG_PATH_PREFIX "\\\\?\\"
|
||||
+ if (strncmp(path, WIN32_LONG_PATH_PREFIX, 4) == 0) {
|
||||
+ int len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0);
|
||||
+ wchar_t *buff = (wchar_t *) malloc(len * sizeof(wchar_t));
|
||||
+ MultiByteToWideChar(CP_UTF8, 0, path, -1, buff, len);
|
||||
+ FILE * f = _wfopen(buff, (strcmp(mode, "r") == 0) ? L"r" : L"rb");
|
||||
+ free(buff);
|
||||
+ return f;
|
||||
+ }
|
||||
+#endif
|
||||
+ return fopen(path, mode);
|
||||
+}
|
||||
diff -u mythes/mythes.hxx build/mythes/mythes.hxx
|
||||
--- mythes/mythes.hxx 2010-03-04 12:56:23.000000000 +0100
|
||||
+++ build/mythes/mythes.hxx 2014-05-22 10:11:14.363543731 +0200
|
||||
@@ -30,6 +30,7 @@
|
||||
MyThes & operator = (const MyThes &);
|
||||
|
||||
public:
|
||||
+ // use UTF-8 encoded paths in WIN32 environment
|
||||
MyThes(const char* idxpath, const char* datpath);
|
||||
~MyThes();
|
||||
|
||||
@@ -66,6 +67,9 @@
|
||||
// return index of char in string
|
||||
int mystr_indexOfChar(const char * d, int c);
|
||||
|
||||
+ // fopen or _wfopen
|
||||
+ FILE * myfopen(const char * path, const char * mode);
|
||||
+
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -285,14 +285,12 @@ Reference< XHyphenatedWord > SAL_CALL Hyphenator::hyphenate( const OUString& aWo
|
||||
OUString dictpath;
|
||||
|
||||
osl::FileBase::getSystemPathFromFileURL( DictFN, dictpath );
|
||||
OString sTmp( OU2ENC( dictpath, osl_getThreadTextEncoding() ) );
|
||||
|
||||
#if defined(WNT)
|
||||
// workaround for Windows specific problem that the
|
||||
// path length in calls to 'fopen' is limted to somewhat
|
||||
// about 120+ characters which will usually be exceed when
|
||||
// using dictionaries as extensions.
|
||||
sTmp = Win_GetShortPathName( dictpath );
|
||||
// Hyphen waits UTF-8 encoded paths with \\?\ long path prefix.
|
||||
OString sTmp = OUStringToOString(dicpath, RTL_TEXTENCODING_UTF8);
|
||||
#else
|
||||
OString sTmp( OU2ENC( dictpath, osl_getThreadTextEncoding() ) );
|
||||
#endif
|
||||
|
||||
if ( ( dict = hnj_hyphen_load ( sTmp.getStr()) ) == NULL )
|
||||
|
||||
@@ -17,10 +17,6 @@
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#if defined(WNT)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include <osl/thread.h>
|
||||
#include <osl/file.hxx>
|
||||
#include <tools/debug.hxx>
|
||||
@@ -45,29 +41,6 @@
|
||||
using ::com::sun::star::lang::Locale;
|
||||
using namespace ::com::sun::star;
|
||||
|
||||
#if defined(WNT)
|
||||
OString Win_GetShortPathName( const OUString &rLongPathName )
|
||||
{
|
||||
OString aRes;
|
||||
|
||||
sal_Unicode aShortBuffer[1024] = {0};
|
||||
sal_Int32 nShortBufSize = SAL_N_ELEMENTS( aShortBuffer );
|
||||
|
||||
// use the version of 'GetShortPathName' that can deal with Unicode...
|
||||
sal_Int32 nShortLen = GetShortPathNameW(
|
||||
reinterpret_cast<LPCWSTR>( rLongPathName.getStr() ),
|
||||
reinterpret_cast<LPWSTR>( aShortBuffer ),
|
||||
nShortBufSize );
|
||||
|
||||
if (nShortLen < nShortBufSize) // conversion successful?
|
||||
aRes = OString( OU2ENC( OUString( aShortBuffer, nShortLen ), osl_getThreadTextEncoding()) );
|
||||
else
|
||||
OSL_FAIL( "Win_GetShortPathName: buffer to short" );
|
||||
|
||||
return aRes;
|
||||
}
|
||||
#endif //defined(WNT)
|
||||
|
||||
// build list of old style diuctionaries (not as extensions) to use.
|
||||
// User installed dictionaries (the ones residing in the user paths)
|
||||
// will get precedence over system installed ones for the same language.
|
||||
|
||||
@@ -48,16 +48,6 @@ inline bool operator == ( const ::com::sun::star::lang::Locale &rL1, const ::com
|
||||
rL1.Variant == rL2.Variant;
|
||||
}
|
||||
|
||||
#if defined(WNT)
|
||||
|
||||
// to be use to get a short path name under Windows that still can be used with
|
||||
// the 'fopen' call. This is necessary since under Windows there seems to be
|
||||
// a restriction of only about 110-130 characters length to a path name in order
|
||||
// for it to work with 'fopen'. And that length is usually easily exceeded
|
||||
// when using extensions...
|
||||
OString Win_GetShortPathName( const OUString &rLongPathName );
|
||||
#endif
|
||||
|
||||
// temporary function, to be removed when new style dictionaries
|
||||
// using configuration entries are fully implemented and provided
|
||||
std::vector< SvtLinguConfigDictionaryEntry > GetOldStyleDics( const char * pDicType );
|
||||
|
||||
@@ -328,16 +328,14 @@ Sequence < Reference < ::com::sun::star::linguistic2::XMeaning > > SAL_CALL Thes
|
||||
OUString nidx;
|
||||
osl::FileBase::getSystemPathFromFileURL(datpath,ndat);
|
||||
osl::FileBase::getSystemPathFromFileURL(idxpath,nidx);
|
||||
OString aTmpidx(OU2ENC(nidx,osl_getThreadTextEncoding()));
|
||||
OString aTmpdat(OU2ENC(ndat,osl_getThreadTextEncoding()));
|
||||
|
||||
#if defined(WNT)
|
||||
// workaround for Windows specific problem that the
|
||||
// path length in calls to 'fopen' is limted to somewhat
|
||||
// about 120+ characters which will usually be exceed when
|
||||
// using dictionaries as extensions.
|
||||
aTmpidx = Win_GetShortPathName( nidx );
|
||||
aTmpdat = Win_GetShortPathName( ndat );
|
||||
// MyThes waits UTF-8 encoded paths with \\?\ long path prefix.
|
||||
OString aTmpidx = OUStringToOString(nidx, RTL_TEXTENCODING_UTF8);
|
||||
OString aTmpdat = OUStringToOString(ndat, RTL_TEXTENCODING_UTF8);
|
||||
#else
|
||||
OString aTmpidx(OU2ENC(nidx,osl_getThreadTextEncoding()));
|
||||
OString aTmpdat(OU2ENC(ndat,osl_getThreadTextEncoding()));
|
||||
#endif
|
||||
|
||||
aThes[i] = new MyThes(aTmpidx.getStr(),aTmpdat.getStr());
|
||||
|
||||
Reference in New Issue
Block a user