Kaydet (Commit) 52681e44 authored tarafından Tor Lillqvist's avatar Tor Lillqvist

Use own own <osl/file.h> API to read the source in osl_copyFile()

It seems that we call osl_copyFile() to copy from /assets on Android
in some cases.
üst e580fd50
...@@ -49,6 +49,11 @@ extern "C" { ...@@ -49,6 +49,11 @@ extern "C" {
#define osl_File_OpenFlag_Trunc 0x00000010L #define osl_File_OpenFlag_Trunc 0x00000010L
#define osl_File_OpenFlag_NoExcl 0x00000020L #define osl_File_OpenFlag_NoExcl 0x00000020L
SAL_DLLPUBLIC oslFileError SAL_CALL osl_openFilePath(
const char *cpFilePath,
oslFileHandle* pHandle,
sal_uInt32 uFlags );
/* Get the OS specific "handle" of an open file. */ /* Get the OS specific "handle" of an open file. */
SAL_DLLPUBLIC oslFileError SAL_CALL osl_getFileOSHandle( SAL_DLLPUBLIC oslFileError SAL_CALL osl_getFileOSHandle(
oslFileHandle Handle, oslFileHandle Handle,
......
...@@ -892,7 +892,7 @@ SAL_CALL osl_openMemoryAsFile( void *address, size_t size, oslFileHandle *pHandl ...@@ -892,7 +892,7 @@ SAL_CALL osl_openMemoryAsFile( void *address, size_t size, oslFileHandle *pHandl
#define OPEN_CREATE_FLAGS ( O_CREAT | O_RDWR ) #define OPEN_CREATE_FLAGS ( O_CREAT | O_RDWR )
#endif #endif
static oslFileError oslFileError
SAL_CALL osl_openFilePath( const char *cpFilePath, oslFileHandle* pHandle, sal_uInt32 uFlags ) SAL_CALL osl_openFilePath( const char *cpFilePath, oslFileHandle* pHandle, sal_uInt32 uFlags )
{ {
oslFileError eRet; oslFileError eRet;
...@@ -908,7 +908,10 @@ SAL_CALL osl_openFilePath( const char *cpFilePath, oslFileHandle* pHandle, sal_u ...@@ -908,7 +908,10 @@ SAL_CALL osl_openFilePath( const char *cpFilePath, oslFileHandle* pHandle, sal_u
size_t size; size_t size;
address = lo_apkentry(cpFilePath, &size); address = lo_apkentry(cpFilePath, &size);
if (address == NULL) if (address == NULL)
{
errno = ENOENT;
return osl_File_E_NOENT; return osl_File_E_NOENT;
}
return osl_openMemoryAsFile(address, size, pHandle); return osl_openMemoryAsFile(address, size, pHandle);
} }
#endif #endif
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
************************************************************************/ ************************************************************************/
#include "osl/file.hxx" #include "osl/file.hxx"
#include "osl/detail/file.h"
#include "osl/diagnose.h" #include "osl/diagnose.h"
#include "osl/thread.h" #include "osl/thread.h"
...@@ -833,7 +834,7 @@ static oslFileError osl_psz_copyFile( const sal_Char* pszPath, const sal_Char* p ...@@ -833,7 +834,7 @@ static oslFileError osl_psz_copyFile( const sal_Char* pszPath, const sal_Char* p
int DestFileExists=1; int DestFileExists=1;
/* mfe: does the source file really exists? */ /* mfe: does the source file really exists? */
nRet = lstat(pszPath,&aFileStat); nRet = lstat_c(pszPath,&aFileStat);
if ( nRet < 0 ) if ( nRet < 0 )
{ {
...@@ -1050,13 +1051,23 @@ static int oslDoCopyLink(const sal_Char* pszSourceFileName, const sal_Char* pszD ...@@ -1050,13 +1051,23 @@ static int oslDoCopyLink(const sal_Char* pszSourceFileName, const sal_Char* pszD
static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, size_t nSourceSize, mode_t mode) static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, size_t nSourceSize, mode_t mode)
{ {
int SourceFileFD=0; oslFileHandle SourceFileFH=0;
int DestFileFD=0; int DestFileFD=0;
int nRet=0; int nRet=0;
SourceFileFD=open(pszSourceFileName,O_RDONLY); #ifdef ANDROID
if ( SourceFileFD < 0 ) volatile int beenhere = 0;
if (!beenhere) {
beenhere++;
fprintf(stderr, "Sleeping NOW, start ndk-gdb!\n");
::sleep(20);
}
#endif
if (osl_openFilePath(pszSourceFileName,
&SourceFileFH,
osl_File_OpenFlag_Read|osl_File_OpenFlag_NoLock|osl_File_OpenFlag_NoExcl) != osl_File_E_None)
{ {
// Let's hope errno is still set relevantly after osl_openFilePath...
nRet=errno; nRet=errno;
return nRet; return nRet;
} }
...@@ -1066,7 +1077,7 @@ static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszD ...@@ -1066,7 +1077,7 @@ static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszD
if ( DestFileFD < 0 ) if ( DestFileFD < 0 )
{ {
nRet=errno; nRet=errno;
close(SourceFileFD); osl_closeFile(SourceFileFH);
return nRet; return nRet;
} }
...@@ -1080,15 +1091,17 @@ static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszD ...@@ -1080,15 +1091,17 @@ static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszD
do do
{ {
size_t nToRead = std::min( sizeof(pBuffer), nRemains ); size_t nToRead = std::min( sizeof(pBuffer), nRemains );
sal_Bool succeeded = safeRead( SourceFileFD, pBuffer, nToRead ); sal_uInt64 nRead;
if ( !succeeded ) sal_Bool succeeded;
if ( osl_readFile( SourceFileFH, pBuffer, nToRead, &nRead ) != osl_File_E_None || nRead > nToRead || nRead == 0 )
break; break;
succeeded = safeWrite( DestFileFD, pBuffer, nToRead ); succeeded = safeWrite( DestFileFD, pBuffer, nRead );
if ( !succeeded ) if ( !succeeded )
break; break;
nRemains -= nToRead; // We know nRead <= nToRead, so it must fit in a size_t
nRemains -= (size_t) nRead;
} }
while( nRemains ); while( nRemains );
} }
...@@ -1101,7 +1114,7 @@ static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszD ...@@ -1101,7 +1114,7 @@ static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszD
nRet = ENOSPC; nRet = ENOSPC;
} }
close( SourceFileFD ); osl_closeFile( SourceFileFH );
if ( close( DestFileFD ) == -1 && nRet == 0 ) if ( close( DestFileFD ) == -1 && nRet == 0 )
nRet = errno; nRet = errno;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment