diff options
Diffstat (limited to 'src/streams-handles.cpp')
| -rw-r--r-- | src/streams-handles.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/streams-handles.cpp b/src/streams-handles.cpp new file mode 100644 index 000000000..0990d0589 --- /dev/null +++ b/src/streams-handles.cpp @@ -0,0 +1,119 @@ +/* + * IO layer : handles for URIs + * + * Authors: + * Johan Ceuppens <jceuppen at easynet dot be> + * + * Copyright (C) 2004 Johan Ceuppens + * + * Released under GNU LGPL, read the file 'COPYING.LIB' for more information + */ + +#include "streams-handles.h" +#include "uri.h" + +#include <iostream> + +namespace Inkscape { + +/** + * FileHandle + */ + +int FileHandle::open(URI const& uri, char const* mode) +{ + if (sys_open(uri, mode) == 0) + return 0; + else + return 1; +} + +FILE *FileHandle::sys_open(URI const& uri, char const* mode) +{ + gchar *filename = uri.toNativeFilename(); + + if ((fp = std::fopen(filename, mode)) == 0) { + error("fopen"); + } +#ifdef DEBUG_STREAMS + std::cout<<"file opened fp="<<fp<<std::endl; +#endif + return fp; +} + +void FileHandle::close() +{ + sys_close(); +} + +void FileHandle::sys_close() +{ + fclose(fp); +} + +int FileHandle::read(void *buf, int buflen) +{ + return sys_read(buf, buflen); +} + +int FileHandle::sys_read (void *buf, int buflen) throw(ReadException) +{ + int nbytes = 0; + if ((nbytes = std::fread(buf, 1, buflen, fp)) < 0) { + if (ferror(fp)) { + error("fread"); + throw ReadException(); + } + } + if (nbytes == 0) + return EOF; + else + return nbytes; +} + +int FileHandle::write (void const *buf, int buflen) +{ + return sys_write(buf, buflen); +} + +int FileHandle::sys_write (void const *buf, int buflen) throw(WriteException) +{ + int nbytes = 0; + if ((nbytes = std::fwrite(buf, 1, buflen, fp)) < 0) { + error("fwrite"); + throw WriteException(); + } + + return nbytes; +} + +int FileHandle::seek(long offset, int whence) +{ + return sys_seek(offset, whence); +} + +int FileHandle::sys_seek(long offset, int whence) +{ + int result; + if ((result = fseek(fp, offset, whence)) < 0) { + error("fseek"); + } + return result; +} +void FileHandle::error(char const *errstr) +{ + std::cerr<<"error FileHandle: "<<errstr<<std::endl; +} + +} // namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : |
