Add POSIX RandomAccessFile native routines

This commit is contained in:
Vinnie Falco
2013-07-17 12:50:55 -07:00
parent 3a85ad04d3
commit 748de3b2e1
3 changed files with 37 additions and 45 deletions

View File

@@ -505,21 +505,10 @@ Result FileOutputStream::truncate()
} }
//============================================================================== //==============================================================================
RandomAccessFile::RandomAccessFile (int bufferSizeToUse) noexcept
: fileHandle (nullptr)
, currentPosition (0)
, writeBuffer (bufferSizeToUse)
{
}
RandomAccessFile::~RandomAccessFile () Result RandomAccessFile::nativeOpen (File const& path, Mode mode)
{ {
close (); bassert (! isOpen ());
}
Result RandomAccessFile::open (File const& path, Mode mode)
{
close ();
Result result (Result::ok ()); Result result (Result::ok ());
@@ -533,7 +522,7 @@ Result RandomAccessFile::open (File const& path, Mode mode)
break; break;
default: default:
case readWRite: case readWrite:
oflag = O_RDWR; oflag = O_RDWR;
break; break;
}; };
@@ -562,7 +551,7 @@ Result RandomAccessFile::open (File const& path, Mode mode)
} }
else if (mode == readWrite) else if (mode == readWrite)
{ {
const int f = open (file.getFullPathName().toUTF8(), O_RDWR + O_CREAT, 00644); const int f = ::open (file.getFullPathName().toUTF8(), O_RDWR + O_CREAT, 00644);
if (f != -1) if (f != -1)
{ {
@@ -583,17 +572,17 @@ Result RandomAccessFile::open (File const& path, Mode mode)
return result; return result;
} }
void RandomAccessFile::close () void RandomAccessFile::nativeClose ()
{ {
if (fileHandle != nullptr) bassert (isOpen ());
{
file = File::nonexistent (); file = File::nonexistent ();
::close (getFD (fileHandle)); ::close (getFD (fileHandle));
fileHandle = nullptr; fileHandle = nullptr;
} currentPosition = 0;
} }
Result RandomAccessFile::setPosition (Offset newPosition) Result RandomAccessFile::nativeSetPosition (FileOffset newPosition)
{ {
bassert (isOpen ()); bassert (isOpen ());
@@ -607,7 +596,7 @@ Result RandomAccessFile::setPosition (Offset newPosition)
return result; return result;
} }
Result RandomAccessFile::read (void* buffer, ByteCount numBytes, ByteCount* pActualAmount ) Result RandomAccessFile::nativeRead (void* buffer, ByteCount numBytes, ByteCount* pActualAmount)
{ {
bassert (isOpen ()); bassert (isOpen ());
@@ -624,20 +613,20 @@ Result RandomAccessFile::read (void* buffer, ByteCount numBytes, ByteCount* pAct
if (pActualAmount != nullptr) if (pActualAmount != nullptr)
*pActualAmount = amount; *pActualAmount = amount;
return (size_t) result; return result;
} }
Result RandomAccessFile::write (void const* data, ByteCount numBytes, size_t* pActualAmount) Result RandomAccessFile::nativeWrite (void const* data, ByteCount numBytes, size_t* pActualAmount)
{ {
bassert (isOpen ()); bassert (isOpen ());
Result result (Result::ok ()); Result result (Result::ok ());
ssize_t const actual = ::write (getFD (fileHandle), data, numBytes); ssize_t actual = ::write (getFD (fileHandle), data, numBytes);
if (actual == -1) if (actual == -1)
{ {
status = getResultForErrno(); result = getResultForErrno();
actual = 0; actual = 0;
} }
@@ -647,31 +636,34 @@ Result RandomAccessFile::write (void const* data, ByteCount numBytes, size_t* pA
return result; return result;
} }
Result RandomAccessFile::truncate () Result RandomAccessFile::nativeTruncate ()
{ {
bassert (isOpen ());
flush(); flush();
return getResultForReturnValue (ftruncate (getFD (fileHandle), (off_t) currentPosition)); return getResultForReturnValue (ftruncate (getFD (fileHandle), (off_t) currentPosition));
} }
void RandomAccessFile::flush () Result RandomAccessFile::nativeFlush ()
{ {
bassert (isOpen ()); bassert (isOpen ());
if (fileHandle != nullptr) Result result (Result::ok ());
{
if (fsync (getFD (fileHandle)) == -1)
status = getResultForErrno();
#if BEAST_ANDROID if (fsync (getFD (fileHandle)) == -1)
// This stuff tells the OS to asynchronously update the metadata result = getResultForErrno();
// that the OS has cached aboud the file - this metadata is used
// when the device is acting as a USB drive, and unless it's explicitly #if BEAST_ANDROID
// refreshed, it'll get out of step with the real file. // This stuff tells the OS to asynchronously update the metadata
const LocalRef<jstring> t (javaString (file.getFullPathName())); // that the OS has cached aboud the file - this metadata is used
android.activity.callVoidMethod (BeastAppActivity.scanFile, t.get()); // when the device is acting as a USB drive, and unless it's explicitly
#endif // refreshed, it'll get out of step with the real file.
} const LocalRef<jstring> t (javaString (file.getFullPathName()));
android.activity.callVoidMethod (BeastAppActivity.scanFile, t.get());
#endif
return result;
} }
//============================================================================== //==============================================================================

View File

@@ -403,7 +403,7 @@ Result RandomAccessFile::nativeSetPosition (FileOffset newPosition)
return result; return result;
} }
Result RandomAccessFile::nativeRead (void* buffer, ByteCount numBytes, ByteCount* pActualAmount ) Result RandomAccessFile::nativeRead (void* buffer, ByteCount numBytes, ByteCount* pActualAmount)
{ {
bassert (isOpen ()); bassert (isOpen ());

View File

@@ -28,7 +28,7 @@
@tparam Bytes The number of bytes of storage. @tparam Bytes The number of bytes of storage.
*/ */
template <unsigned int Bytes> template <size_t Bytes>
class UnsignedInteger : public SafeBool <UnsignedInteger <Bytes> > class UnsignedInteger : public SafeBool <UnsignedInteger <Bytes> >
{ {
public: public: