From 873e4cb481ce68dc1823bb0f66fc510be8080802 Mon Sep 17 00:00:00 2001 From: kichik Date: Sat, 11 Mar 2006 11:13:07 +0000 Subject: [PATCH] centralized classes for writing data this allows global changes to how data is written with one change currently, it only converts from big-endian to little-endian in the future, this will allow an easy transition to writing 64-bit data git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4566 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/writer.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++ Source/writer.h | 70 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 Source/writer.cpp create mode 100644 Source/writer.h diff --git a/Source/writer.cpp b/Source/writer.cpp new file mode 100644 index 00000000..491885ee --- /dev/null +++ b/Source/writer.cpp @@ -0,0 +1,73 @@ +#include "exehead/config.h" +#include "writer.h" +#include "growbuf.h" +#include "util.h" +#include +#include +#include + +void writer_sink::write_byte(const unsigned char b) +{ + write_data(&b, 1); +} + +void writer_sink::write_short(const short s) +{ + short fs = FIX_ENDIAN_INT16(s); + write_data(&fs, sizeof(short)); +} + +void writer_sink::write_int(const int i) +{ + int fi = FIX_ENDIAN_INT32(i); + write_data(&fi, sizeof(int)); +} + +void writer_sink::write_int_array(const int i[], const size_t len) +{ + for (size_t l = 0; l < len; l++) + { + write_int(i[l]); + } +} + +void writer_sink::write_string(const char *s) +{ + write_data(s, strlen(s) + 1); +} + +void writer_sink::write_string(const char *s, const size_t size) +{ + char *wb = new char[size]; + memset(wb, 0, size); + strncpy(wb, s, size); + write_data(wb, size); + delete [] wb; +} + +void writer_sink::write_growbuf(const IGrowBuf *b) +{ + write_data(b->get(), b->getlen()); +} + +void growbuf_writer_sink::write_data(const void *data, const size_t size) +{ + m_buf->add(data, size); +} + +void file_writer_sink::write_data(const void *data, const size_t size) +{ + if (fwrite(data, 1, size, m_fp) != size) + { + throw std::runtime_error("error writing"); + } +} + +#ifdef NSIS_CONFIG_CRC_SUPPORT +extern "C" unsigned long NSISCALL CRC32(unsigned long crc, const unsigned char *buf, unsigned int len); + +void crc_writer_sink::write_data(const void *data, const size_t size) +{ + *m_crc = CRC32(*m_crc, (const unsigned char *) data, size); +} +#endif diff --git a/Source/writer.h b/Source/writer.h new file mode 100644 index 00000000..56ab7adc --- /dev/null +++ b/Source/writer.h @@ -0,0 +1,70 @@ +#ifndef ___WRITER__H___ +#define ___WRITER__H___ + +#include "exehead/config.h" +#include "growbuf.h" +#include + +class writer_sink { +public: + writer_sink() {} + virtual ~writer_sink() {} + + virtual void write_byte(const unsigned char b); + virtual void write_short(const short s); + virtual void write_int(const int i); + virtual void write_int_array(const int i[], const size_t len); + virtual void write_string(const char *s); + virtual void write_string(const char *s, const size_t size); + virtual void write_growbuf(const IGrowBuf *b); + + virtual void write_data(const void *data, const size_t size) = 0; + +}; + +class writer { +public: + writer(writer_sink *sink) : m_sink(sink) {} + virtual ~writer() {} + +protected: + writer_sink *m_sink; + +}; + +class growbuf_writer_sink : public writer_sink { +public: + growbuf_writer_sink(IGrowBuf *buf) : m_buf(buf) {} + + virtual void write_data(const void *data, const size_t size); + +private: + IGrowBuf *m_buf; + +}; + +class file_writer_sink : public writer_sink { +public: + file_writer_sink(FILE *fp) : m_fp(fp) {} + + virtual void write_data(const void *data, const size_t size); + +private: + FILE *m_fp; + +}; + +#ifdef NSIS_CONFIG_CRC_SUPPORT +class crc_writer_sink : public writer_sink { +public: + crc_writer_sink(unsigned long *crc) : m_crc(crc) {} + + virtual void write_data(const void *data, const size_t size); + +private: + unsigned long *m_crc; + +}; +#endif + +#endif//!___WRITER__H___