diff options
author | randomdan <randomdan@localhost> | 2010-07-28 23:17:07 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2010-07-28 23:17:07 +0000 |
commit | 7fa007189841b6de90ac54e6c042e601c0b9d56a (patch) | |
tree | 777214cb0970fc50b7e4b996757fdd02d026d2e3 | |
parent | Tidy up no longer required parameters passed to execute (diff) | |
download | project2-7fa007189841b6de90ac54e6c042e601c0b9d56a.tar.bz2 project2-7fa007189841b6de90ac54e6c042e601c0b9d56a.tar.xz project2-7fa007189841b6de90ac54e6c042e601c0b9d56a.zip |
Fix typo in class name
Add file channel suitable for processes
-rw-r--r-- | project2/fileRows.cpp | 2 | ||||
-rw-r--r-- | project2/fileStarGlibIoChannel.cpp | 43 | ||||
-rw-r--r-- | project2/fileStarGlibIoChannel.h | 15 |
3 files changed, 47 insertions, 13 deletions
diff --git a/project2/fileRows.cpp b/project2/fileRows.cpp index 57ff8e5..c2a3a09 100644 --- a/project2/fileRows.cpp +++ b/project2/fileRows.cpp @@ -40,7 +40,7 @@ _FileRows::execute() const if (!f) { throw std::runtime_error("Could not open file"); } - FileStrChannel c(f); + FileStarChannel c(f); c.set_encoding(encoding); c.set_line_term(newline); Glib::ustring line; diff --git a/project2/fileStarGlibIoChannel.cpp b/project2/fileStarGlibIoChannel.cpp index 551763d..72c379f 100644 --- a/project2/fileStarGlibIoChannel.cpp +++ b/project2/fileStarGlibIoChannel.cpp @@ -1,7 +1,10 @@ #include "fileStarGlibIoChannel.h" #include <stdio.h> +#include <errno.h> +#include <string.h> +#include <stdexcept> -FileStrChannel::FileStrChannel(FILE * f) : +FileStarChannel::FileStarChannel(FILE * f) : Glib::IOChannel(), file(f) { @@ -10,33 +13,56 @@ FileStrChannel::FileStrChannel(FILE * f) : gobj()->is_writeable = 0; } -FileStrChannel::~FileStrChannel() +ProcessStarChannel::ProcessStarChannel(FILE * f) : + FileStarChannel(f) +{ + gobj()->is_seekable = 0; + gobj()->is_readable = 1; + gobj()->is_writeable = 0; +} + +FileStarChannel::~FileStarChannel() +{ + close_vfunc(); +} + +Glib::IOStatus +FileStarChannel::close_vfunc() { if (file) { fclose(file); + file = NULL; } + return Glib::IO_STATUS_NORMAL; } -Glib::IOStatus FileStrChannel::close_vfunc() +Glib::IOStatus +ProcessStarChannel::close_vfunc() { if (file) { - fclose(file); + if (pclose(file)) { + file = NULL; + throw std::runtime_error(strerror(errno)); + } file = NULL; } return Glib::IO_STATUS_NORMAL; } -Glib::IOStatus FileStrChannel::set_flags_vfunc(Glib::IOFlags flags) +Glib::IOStatus +FileStarChannel::set_flags_vfunc(Glib::IOFlags flags) { return Glib::IO_STATUS_NORMAL; } -Glib::IOFlags FileStrChannel::get_flags_vfunc() +Glib::IOFlags +FileStarChannel::get_flags_vfunc() { return Glib::IO_FLAG_IS_SEEKABLE | Glib::IO_FLAG_IS_READABLE; } -Glib::IOStatus FileStrChannel::seek_vfunc(gint64 offset, Glib::SeekType type) +Glib::IOStatus +FileStarChannel::seek_vfunc(gint64 offset, Glib::SeekType type) { if (fseek(file, offset, type)) { return Glib::IO_STATUS_ERROR; @@ -44,7 +70,8 @@ Glib::IOStatus FileStrChannel::seek_vfunc(gint64 offset, Glib::SeekType type) return Glib::IO_STATUS_NORMAL; } -Glib::IOStatus FileStrChannel::read_vfunc(char* buf, gsize count, gsize& bytes_read) +Glib::IOStatus +FileStarChannel::read_vfunc(char* buf, gsize count, gsize& bytes_read) { bytes_read = fread(buf, 1, count, file); if (bytes_read == 0) { diff --git a/project2/fileStarGlibIoChannel.h b/project2/fileStarGlibIoChannel.h index 69f09ac..2980a3c 100644 --- a/project2/fileStarGlibIoChannel.h +++ b/project2/fileStarGlibIoChannel.h @@ -3,19 +3,26 @@ #include <glibmm/iochannel.h> -class FileStrChannel : public Glib::IOChannel { +class FileStarChannel : public Glib::IOChannel { public: - FileStrChannel(FILE * f); - virtual ~FileStrChannel(); + FileStarChannel(FILE * f); + virtual ~FileStarChannel(); virtual Glib::IOStatus close_vfunc(); virtual Glib::IOStatus set_flags_vfunc(Glib::IOFlags flags); virtual Glib::IOFlags get_flags_vfunc(); virtual Glib::IOStatus seek_vfunc(gint64 offset, Glib::SeekType type); virtual Glib::IOStatus read_vfunc(char* buf, gsize count, gsize& bytes_read); - private: + protected: FILE * file; }; +class ProcessStarChannel : public FileStarChannel { + public: + ProcessStarChannel(FILE * f); + + virtual Glib::IOStatus close_vfunc(); +}; + #endif |