Как лучше всего разделять объект stream между разными частями библиотечного кода?

Рейтинг: 0Ответов: 0Опубликовано: 14.09.2014

Вопрос: как разделять объект класса по работе со стримом (поток байтов) между разными частями библиотечного кода? Во всех этих частях кода нужно иметь возможность изменять стрим.

Такая же проблема о разделении стрима по библиотечному коду встречается и при разработке библиотеки логирования подобной log4j архитектуре. Когда имеется только один файл, но при этом различные уровни, к примеру такой: 'com.supersite.componentname.applicationname'.

UPD
Пишу библиотеку по работе с PE-форматом. Для работы как с 32- так и 64-битными образами. Образы бывают файловые (на диске, флешке) и виртуальные (процесс запущен на выполнение).

Мне надо:

  • получать доступ по чтению к уже существующей в образе информации;
  • добавлять новую информацию в образ;
  • удалять\изменять существующую информацию из\в образа\зе.

Я не хочу привязываться к файлу или памяти и поэтому решил работать с интерфейсом стрима. В текущий момент времени сделано так:

template<typename arch_type>
class Image {
public:
  Image(std::iostream& stream_) : stream(stream_) {}

  std::iostream& getStream() const { return stream; }

  const IMAGE_EXPORT_DIRECTORY& getExportDirHeader() const { return exportDirHeader; }
  const ImportDescriptors_t& getImportDirHeaders() const { return importDirDescriptors; }

private:
  std::iostream& stream;
  IMAGE_EXPORT_DIRECTORY exportDir;
  ImportDescriptors_t importDirDescriptors;
}

Это минимальный интерфейс класса, есть еще с десяток методов. Также есть другие методы по работе с экспортом, импортом, баундом и др. концепциями, которые возвращают подробности, т.е. список экспортируемых\импортируемых элементов их rva, названия и др. полезные детали.

Пока все выглядит так:

using namespace PE;
using namespace std;

ifstream stream("calc.exe");
Image<arch32> image(stream);

Export::Details exportDetails;
fillDetails(image, &exportDetails);

Import::Details importDetails;
fillDetails(image, &importDetails);

Другими словами:

  1. Перед использованием класса Image создаю стрим и передаю в объект Image.
  2. Каждая функция, которой что-то надо сделать с Image, к примеру вытащить информацию об TLS-калбаках, она берет объект Image, а в своем коде, когда надо использовать стрим, она вызывает getStream().

Получается, что у меня происходит "растекание стрима" по всему библиотечному коду!

Мне это "растекание стрима" очень и очень мешает реализовать фичу.

Ответы

Ответов пока нет.