Stream's classes was hidden

This commit is contained in:
Ivan Morozov
2022-10-31 17:30:40 +03:00
parent b607481860
commit c66424204d
18 changed files with 278 additions and 192 deletions

View File

@ -0,0 +1,76 @@
#include "fstream_utils.h"
#include "fstream_wrapper.h"
#include "stream_utils.h"
#include "../../DesktopEditor/common/File.h"
using namespace CFCPP;
CFCPP::Stream CFCPP::OpenFileStream(std::wstring filename, bool bRewrite, bool trunc)
{
BYTE* pUtf8 = nullptr;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(filename.c_str(), filename.length(), pUtf8, lLen, false);
std::string utf8filename(pUtf8, pUtf8 + lLen);
delete [] pUtf8;
return OpenFileStream(utf8filename, bRewrite, trunc);
}
CFCPP::Stream CFCPP::OpenFileStream(std::string filename, bool bRewrite, bool trunc)
{
CFCPP::Stream st;
// it's not good, but otherwise file doesn't create or if use ios::app, then the seek for writing will be blocked
if (bRewrite)
std::fstream create(filename, std::ios::app | std::ios::out);
if (trunc && bRewrite)
st.reset(new FStreamWrapper(filename, std::ios::binary | std::ios::in | std::ios::out | std::ios::trunc));
else if (bRewrite)
st.reset(new FStreamWrapper(filename, std::ios::binary | std::ios::in | std::ios::out));
else
st.reset(new FStreamWrapper(filename, std::ios::binary | std::ios::in));
return st;
}
_INT64 CFCPP::FileLenght(std::wstring filename)
{
auto stream = OpenFileStream(filename);
auto lenght = Length(stream);
stream->close();
return lenght;
}
ULONG64 CFCPP::FileFNVHash(std::wstring filename, _INT64 len, _INT64 offset)
{
auto stream = OpenFileStream(filename);
if (!IsOpen(stream))
return 0;
if (len < 0)
len = Length(stream);
stream->seek(offset);
ULONG64 h = 2166136261;
constexpr _INT64 bufLen = 0x2000;
char buffer[bufLen];
while (len > 0)
{
memset(buffer, 0, bufLen);
_INT64 readLen = std::min(bufLen, len);
stream->read(buffer, readLen);
_INT64 i;
for (i = 0; i < readLen; i++)
h = (h * 16777619) ^ buffer[i];
len -= readLen;
}
return h;
}

View File

@ -0,0 +1,44 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
#include "stream.h"
namespace CFCPP
{
Stream OpenFileStream(std::wstring filename, bool bRewrite = false, bool trunc = false);
Stream OpenFileStream(std::string filename, bool bRewrite = false, bool trunc = false);
_INT64 FileLenght(std::wstring filename);
ULONG64 FileFNVHash(std::wstring filename, _INT64 len = -1, _INT64 offset = 0);
}

View File

@ -0,0 +1,69 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
#include <fstream>
#include "stream.h"
namespace CFCPP
{
class FStreamWrapper : public IStream, public std::fstream
{
public:
FStreamWrapper(std::string filename, std::ios_base::openmode openmode) :
std::fstream(filename, openmode) {}
inline _INT64 tell() override {
return std::fstream::tellg();
}
inline _INT64 seek(_INT64 offset, std::ios_base::seekdir mode = std::ios::beg) override {
std::fstream::seekp(offset, mode);
std::fstream::seekg(offset, mode);
return tell();
}
inline _INT64 read(char* buffer, _INT64 len) override {
std::fstream::read(buffer, len);
return tell();
}
inline void write (const char* buffer, _INT64 len) override {
std::fstream::write(buffer, len);
}
inline void flush() override {
std::fstream::flush();
}
inline void close() override {
std::fstream::close();
}
};
}

View File

@ -31,15 +31,12 @@
*/
#pragma once
#include <sstream>
#include <fstream>
#include <memory>
#include <algorithm>
#include <iosfwd>
#include <ios>
#include "../DocxFormat/Source/Base/Types_32.h"
#include "../../DesktopEditor/common/Types.h"
namespace CFCPP
{
class IStream
@ -54,46 +51,4 @@ namespace CFCPP
};
using Stream = std::shared_ptr<IStream>;
class FStreamWrapper : public IStream, public std::fstream
{
public:
FStreamWrapper(std::string filename, std::ios_base::openmode openmode) :
std::fstream(filename, openmode) {}
inline _INT64 tell() override {
return std::fstream::tellg();
}
inline _INT64 seek(_INT64 offset, std::ios_base::seekdir mode = std::ios::beg) override {
std::fstream::seekp(offset, mode);
std::fstream::seekg(offset, mode);
return tell();
}
inline _INT64 read(char* buffer, _INT64 len) override {
std::fstream::read(buffer, len);
return tell();
}
inline void write (const char* buffer, _INT64 len) override {
std::fstream::write(buffer, len);
}
inline void flush() override {
std::fstream::flush();
}
inline void close() override {
std::fstream::close();
}
};
std::string CorrectUnixPath(const std::string original);
Stream OpenFileStream(std::wstring filename, bool bRewrite = false, bool trunc = false);
Stream OpenFileStream(std::string filename, bool bRewrite = false, bool trunc = false);
bool IsOpen(const Stream& st);
_INT64 Length(const Stream& st);
_INT64 FileLenght(std::wstring filename);
ULONG64 FileFNVHash(std::wstring filename, _INT64 len = -1, _INT64 offset = 0);
}

View File

@ -0,0 +1,27 @@
#include "stream_utils.h"
#include "fstream_wrapper.h"
using namespace CFCPP;
_INT64 CFCPP::Length(const CFCPP::Stream& st)
{
if (st.get() == nullptr)
return 0;
auto curPos = st->tell();
st->seek(0, std::ios_base::end);
auto ssize = st->tell();
st->seek(curPos);
return ssize;
}
bool CFCPP::IsOpen(const Stream &st)
{
if (std::dynamic_pointer_cast<FStreamWrapper>(st))
return std::static_pointer_cast<FStreamWrapper>(st)->is_open();
return false;
}

View File

@ -0,0 +1,41 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
#include "stream.h"
namespace CFCPP
{
bool IsOpen(const Stream& st);
_INT64 Length(const Stream& st);
}

View File

@ -13,6 +13,8 @@ include(../base.pri)
SOURCES += \
RBTree/rbtree.cpp \
Stream/fstream_utils.cpp \
Stream/stream_utils.cpp \
cfitem.cpp \
cfstorage.cpp \
cfstream.cpp \
@ -21,7 +23,6 @@ SOURCES += \
header.cpp \
sector.cpp \
sectorcollection.cpp \
stream.cpp \
streamrw.cpp \
streamview.cpp
@ -29,6 +30,9 @@ HEADERS += \
RBTree/irbnode.h \
RBTree/rbtree.h \
RBTree/rbtreeexception.h \
Stream/fstream_utils.h \
Stream/fstream_wrapper.h \
Stream/stream_utils.h \
cfexception.h \
cfitem.h \
cfstorage.h \
@ -43,7 +47,7 @@ HEADERS += \
sector.h \
sectorcollection.h \
slist.h \
stream.h \
Stream/stream.h \
streamrw.h \
streamview.h \
svector.h

View File

@ -33,6 +33,7 @@
#include "cfexception.h"
#include "idirectoryentry.h"
#include "compoundfile_impl.h"
#include "Stream/stream_utils.h"
using namespace CFCPP;

View File

@ -31,7 +31,7 @@
*/
#pragma once
#include "stream.h"
#include "Stream/stream.h"
#include "cfitem.h"
#include <vector>

View File

@ -37,7 +37,8 @@
#include <algorithm>
#include <cmath>
#include <array>
#include "Stream/fstream_utils.h"
#include "Stream/stream_utils.h"
#include "sector.h"
//--------------------------------------------------------------------------------

View File

@ -40,6 +40,7 @@
#include "idirectoryentry.h"
#include <mutex>
#include "header.h"
#include "fstream"
namespace CFCPP
{

View File

@ -30,6 +30,7 @@
*
*/
#include "directoryentry.h"
#include <sstream>
#include "cfexception.h"
#include "streamrw.h"
#include <stdexcept>

View File

@ -32,7 +32,7 @@
#pragma once
#include <map>
#include "stream.h"
#include "Stream/stream.h"
#include "RBTree/irbnode.h"
#include "guid.h"

View File

@ -30,6 +30,8 @@
*
*/
#include "sector.h"
#include "Stream/stream_utils.h"
using namespace CFCPP;

View File

@ -34,8 +34,7 @@
#include <memory>
#include <vector>
#include <mutex>
#include "stream.h"
#include "../DocxFormat/Source/Base/Types_32.h"
#include "Stream/stream.h"
namespace CFCPP

View File

@ -1,136 +0,0 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#include "stream.h"
#include "../../DesktopEditor/common/File.h"
#include <algorithm>
_INT64 CFCPP::Length(const CFCPP::Stream& st)
{
if (st.get() == nullptr)
return 0;
auto curPos = st->tell();
st->seek(0, std::ios_base::end);
auto ssize = st->tell();
st->seek(curPos);
return ssize;
}
CFCPP::Stream CFCPP::OpenFileStream(std::wstring filename, bool bRewrite, bool trunc)
{
BYTE* pUtf8 = nullptr;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(filename.c_str(), filename.length(), pUtf8, lLen, false);
std::string utf8filename(pUtf8, pUtf8 + lLen);
delete [] pUtf8;
return OpenFileStream(utf8filename, bRewrite, trunc);
}
CFCPP::Stream CFCPP::OpenFileStream(std::string filename, bool bRewrite, bool trunc)
{
CFCPP::Stream st;
// it's not good, but otherwise file doesn't create or if use ios::app, then the seek for writing will be blocked
if (bRewrite)
std::fstream create(filename, std::ios::app | std::ios::out);
if (trunc && bRewrite)
st.reset(new FStreamWrapper(filename, std::ios::binary | std::ios::in | std::ios::out | std::ios::trunc));
else if (bRewrite)
st.reset(new FStreamWrapper(filename, std::ios::binary | std::ios::in | std::ios::out));
else
st.reset(new FStreamWrapper(filename, std::ios::binary | std::ios::in));
return st;
}
bool CFCPP::IsOpen(const Stream &st)
{
if (std::dynamic_pointer_cast<FStreamWrapper>(st))
return std::static_pointer_cast<FStreamWrapper>(st)->is_open();
return false;
}
std::string CFCPP::CorrectUnixPath(const std::string original)
{
#if !defined(_WIN32) && !defined (_WIN64)
return original;
#else
auto str = original;
std::replace(str.begin(), str.end(), '/', '\\');
return str;
#endif
}
_INT64 CFCPP::FileLenght(std::wstring filename)
{
auto stream = OpenFileStream(filename);
auto lenght = Length(stream);
stream->close();
return lenght;
}
ULONG64 CFCPP::FileFNVHash(std::wstring filename, _INT64 len, _INT64 offset)
{
auto stream = OpenFileStream(filename);
if (!IsOpen(stream))
return 0;
if (len < 0)
len = Length(stream);
stream->seek(offset);
ULONG64 h = 2166136261;
constexpr _INT64 bufLen = 0x2000;
char buffer[bufLen];
while (len > 0)
{
memset(buffer, 0, bufLen);
_INT64 readLen = std::min(bufLen, len);
stream->read(buffer, readLen);
_INT64 i;
for (i = 0; i < readLen; i++)
h = (h * 16777619) ^ buffer[i];
len -= readLen;
}
return h;
}

View File

@ -34,7 +34,7 @@
#include <fstream>
#include <array>
#include <vector>
#include "stream.h"
#include "Stream/stream.h"
namespace CFCPP

View File

@ -6,7 +6,8 @@
#include <gtest/gtest.h>
#include <gmock/gmock-matchers.h>
#include "../../DesktopEditor/common/File.h"
#include "../stream.h"
#include "../Stream/fstream_utils.h"
#include "../Stream/stream_utils.h"
#include "../../DesktopEditor/common/Directory.h"