summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/winrt/qwinrtfileengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/winrt/qwinrtfileengine.cpp')
-rw-r--r--src/plugins/platforms/winrt/qwinrtfileengine.cpp36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/plugins/platforms/winrt/qwinrtfileengine.cpp b/src/plugins/platforms/winrt/qwinrtfileengine.cpp
index f4e307eb07..719bb18dd6 100644
--- a/src/plugins/platforms/winrt/qwinrtfileengine.cpp
+++ b/src/plugins/platforms/winrt/qwinrtfileengine.cpp
@@ -70,7 +70,7 @@ class QWinRTFileEnginePrivate
{
public:
QWinRTFileEnginePrivate(const QString &fileName, IStorageItem *file)
- : fileName(fileName), file(file)
+ : fileName(fileName), file(file), openMode(QIODevice::NotOpen)
{
HRESULT hr;
hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Storage_Streams_Buffer).Get(),
@@ -101,6 +101,7 @@ public:
int firstDot;
ComPtr<IStorageItem> file;
ComPtr<IRandomAccessStream> stream;
+ QIODevice::OpenMode openMode;
qint64 pos;
@@ -203,6 +204,8 @@ bool QWinRTFileEngine::open(QIODevice::OpenMode openMode)
hr = QWinRTFunctions::await(op, d->stream.GetAddressOf());
RETURN_AND_SET_ERROR_IF_FAILED(QFileDevice::OpenError, false);
+ d->openMode = openMode;
+
return SUCCEEDED(hr);
}
@@ -220,9 +223,33 @@ bool QWinRTFileEngine::close()
hr = closable->Close();
RETURN_AND_SET_ERROR_IF_FAILED(QFileDevice::UnspecifiedError, false);
d->stream.Reset();
+ d->openMode = QIODevice::NotOpen;
return SUCCEEDED(hr);
}
+bool QWinRTFileEngine::flush()
+{
+ Q_D(QWinRTFileEngine);
+
+ if (!d->stream)
+ return false;
+
+ if (!(d->openMode & QIODevice::WriteOnly))
+ return true;
+
+ ComPtr<IOutputStream> stream;
+ HRESULT hr = d->stream.As(&stream);
+ RETURN_AND_SET_ERROR_IF_FAILED(QFileDevice::WriteError, false);
+ ComPtr<IAsyncOperation<bool>> flushOp;
+ hr = stream->FlushAsync(&flushOp);
+ RETURN_AND_SET_ERROR_IF_FAILED(QFileDevice::WriteError, false);
+ boolean flushed;
+ hr = QWinRTFunctions::await(flushOp, &flushed);
+ RETURN_AND_SET_ERROR_IF_FAILED(QFileDevice::WriteError, false);
+
+ return true;
+}
+
qint64 QWinRTFileEngine::size() const
{
Q_D(const QWinRTFileEngine);
@@ -484,13 +511,6 @@ qint64 QWinRTFileEngine::write(const char *data, qint64 maxlen)
hr = QWinRTFunctions::await(op, &length);
RETURN_AND_SET_ERROR_IF_FAILED(QFileDevice::WriteError, -1);
- ComPtr<IAsyncOperation<bool>> flushOp;
- hr = stream->FlushAsync(&flushOp);
- RETURN_AND_SET_ERROR_IF_FAILED(QFileDevice::WriteError, -1);
- boolean flushed;
- hr = QWinRTFunctions::await(flushOp, &flushed);
- RETURN_AND_SET_ERROR_IF_FAILED(QFileDevice::WriteError, -1);
-
return qint64(length);
}