summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@gmail.com>2013-11-08 16:37:21 +0100
committerMatúš Kukan <matus.kukan@gmail.com>2013-11-13 10:33:18 +0100
commitf116128500531ce3c95d8258a47ddd6d5cb7cb27 (patch)
tree380323ae43c15bbe306b1657a973901d47f43346
parentadd menu item for data streams dialog (diff)
downloadcore-f116128500531ce3c95d8258a47ddd6d5cb7cb27.tar.gz
core-f116128500531ce3c95d8258a47ddd6d5cb7cb27.zip
implement very simple SvScriptStream to read from process
It inherits from SvStream, so it could be used easily. Basically, it's just a simple wrapper around osl_executeProcess_WithRedirectedIO() and osl_readFile(). Change-Id: Ifa225c87d2c9be7e71ea113b0832a4fe83ec65b3
-rw-r--r--include/tools/stream.hxx22
-rw-r--r--tools/source/stream/stream.cxx57
2 files changed, 75 insertions, 4 deletions
diff --git a/include/tools/stream.hxx b/include/tools/stream.hxx
index 3a62e98a1226..e390407a274e 100644
--- a/include/tools/stream.hxx
+++ b/include/tools/stream.hxx
@@ -20,6 +20,7 @@
#define INCLUDED_TOOLS_STREAM_HXX
#include <limits>
+#include <osl/process.h>
#include <tools/toolsdllapi.h>
#include <tools/solar.h>
#include <tools/lineend.hxx>
@@ -362,7 +363,7 @@ public:
@endcode
causing endless loops ...
*/
- bool ReadLine( OString& rStr, sal_Int32 nMaxBytesToRead = 0xFFFE );
+ virtual bool ReadLine( OString& rStr, sal_Int32 nMaxBytesToRead = 0xFFFE );
bool WriteLine( const OString& rStr );
/** Read a line of bytes.
@@ -470,10 +471,10 @@ public:
friend SvStream& operator<<( SvStream& rStr, SvStrPtr f ); // for Manips
/// end of input seen during previous i/o operation
- bool eof() const { return bIsEof; }
+ virtual bool eof() const { return bIsEof; }
/// stream is broken
- bool bad() const { return GetError() != 0; }
+ virtual bool bad() const { return GetError() != 0; }
/** Get state
@@ -488,7 +489,7 @@ public:
If we try to read into a variable v and the operation fails, the value
of v should be unchanged,
*/
- bool good() const { return !(eof() || bad()); }
+ virtual bool good() const { return !(eof() || bad()); }
};
inline SvStream& operator<<( SvStream& rStr, SvStrPtr f )
@@ -759,6 +760,19 @@ public:
virtual sal_Size remainingSize() { return GetBufSize() - Tell(); }
};
+class TOOLS_DLLPUBLIC SvScriptStream: public SvStream
+{
+ oslProcess mpProcess;
+ oslFileHandle mpHandle;
+
+public:
+ SvScriptStream(const OUString& rUrl);
+ ~SvScriptStream();
+
+ virtual bool ReadLine(OString &rStr, sal_Int32) SAL_OVERRIDE;
+ virtual bool good() const SAL_OVERRIDE;
+};
+
/** Data Copy Stream
This class is the foundation for all classes, using SvData
diff --git a/tools/source/stream/stream.cxx b/tools/source/stream/stream.cxx
index 32babd9b7a6a..7cbdca78292b 100644
--- a/tools/source/stream/stream.cxx
+++ b/tools/source/stream/stream.cxx
@@ -1961,6 +1961,63 @@ void SvMemoryStream::SetSize( sal_Size nNewSize )
ReAllocateMemory( nDiff );
}
+SvScriptStream::SvScriptStream(const OUString& rUrl):
+ mpProcess(NULL), mpHandle(NULL)
+{
+ oslProcessError rc;
+ rc = osl_executeProcess_WithRedirectedIO(
+ rUrl.pData,
+ NULL, 0,
+ osl_Process_HIDDEN,
+ NULL,
+ NULL,
+ NULL, 0,
+ &mpProcess,
+ NULL, &mpHandle, NULL);
+ if (osl_Process_E_None != rc)
+ {
+ mpProcess = NULL;
+ mpHandle = NULL;
+ }
+}
+
+SvScriptStream::~SvScriptStream()
+{
+ if (mpProcess)
+ {
+ osl_terminateProcess(mpProcess);
+ osl_freeProcessHandle(mpProcess);
+ }
+ if (mpHandle)
+ osl_closeFile(mpHandle);
+}
+
+bool SvScriptStream::ReadLine(OString &rStr, sal_Int32)
+{
+ rStr = OString();
+ if (!good())
+ return false;
+
+ OStringBuffer sBuf;
+ sal_Char aChar('\n');
+ sal_uInt64 nBytesRead;
+ while (osl_File_E_None == osl_readFile(mpHandle, &aChar, 1, &nBytesRead)
+ && nBytesRead == 1 && aChar != '\n')
+ {
+ sBuf.append( aChar );
+ }
+ rStr = sBuf.makeStringAndClear();
+ if (!rStr.isEmpty())
+ return true;
+
+ return false;
+}
+
+bool SvScriptStream::good() const
+{
+ return mpHandle != NULL;
+}
+
TYPEINIT0 ( SvDataCopyStream )
void SvDataCopyStream::Assign( const SvDataCopyStream& )