Page MenuHomePhabricator (Chris)

No OneTemporary

Authored By
Unknown
Size
21 KB
Referenced Files
None
Subscribers
None
diff --git a/CMakeLists.txt b/CMakeLists.txt
index eee7061..e148fbc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,378 +1,377 @@
cmake_minimum_required(VERSION 3.2)
project(Guitar
VERSION 0.9.0
LANGUAGES CXX C
)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
find_package(Qt5 COMPONENTS Core Widgets Network Svg REQUIRED)
find_package(zlib REQUIRED )
find_package(OpenSSL REQUIRED )
find_package(Qt5LinguistTools REQUIRED)
if(WIN32)
# check package at
# https://github.com/rprichard/winpty
find_package(winpty REQUIRED )
endif()
# extract version information
string(TIMESTAMP Guitar_copyright_year "%Y")
execute_process(
COMMAND git rev-parse --short=7 HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE Guitar_git_hash
OUTPUT_STRIP_TRAILING_WHITESPACE
)
configure_file(version.h.in version.h)
configure_file(win.rc.in win.rc.h)
configure_file(Info.plist.in Info.plist)
set(Guitar_SOURCES
src/main.cpp
src/MainWindow.cpp
src/Git.cpp
src/common/joinpath.cpp
src/common/misc.cpp
src/ConfigCredentialHelperDialog.cpp
src/MySettings.cpp
src/FileDiffWidget.cpp
src/TextEditDialog.cpp
src/LogTableWidget.cpp
src/FileDiffSliderWidget.cpp
src/FileUtil.cpp
src/SettingsDialog.cpp
src/MergeBranchDialog.cpp
src/CloneDialog.cpp
src/AboutDialog.cpp
src/RepositoryInfoFrame.cpp
src/RepositoryPropertyDialog.cpp
src/RepositoryData.cpp
src/MyToolButton.cpp
src/GitDiff.cpp
src/CommitPropertyDialog.cpp
src/Terminal.cpp
src/DeleteTagsDialog.cpp
src/RepositoriesTreeWidget.cpp
src/SelectCommandDialog.cpp
src/ImageViewWidget.cpp
src/FileHistoryWindow.cpp
src/GitPackIdxV2.cpp
src/GitPack.cpp
src/GitObjectManager.cpp
src/FilePropertyDialog.cpp
src/BigDiffWindow.cpp
src/MaximizeButton.cpp
src/CommitExploreWindow.cpp
src/ReadOnlyLineEdit.cpp
src/ReadOnlyPlainTextEdit.cpp
src/MyTableWidgetDelegate.cpp
src/SetRemoteUrlDialog.cpp
src/ClearButton.cpp
src/SetUserDialog.cpp
src/SearchFromGitHubDialog.cpp
src/webclient.cpp
src/charvec.cpp
src/urlencode.cpp
src/HyperLinkLabel.cpp
src/JumpDialog.cpp
src/CheckoutDialog.cpp
src/DeleteBranchDialog.cpp
src/BasicRepositoryDialog.cpp
src/RemoteRepositoriesTableWidget.cpp
src/LocalSocketReader.cpp
src/PushDialog.cpp
src/StatusLabel.cpp
src/RepositoryLineEdit.cpp
src/DirectoryLineEdit.cpp
src/AbstractSettingForm.cpp
src/SettingExampleForm.cpp
src/CreateRepositoryDialog.cpp
src/GitHubAPI.cpp
src/MemoryReader.cpp
src/ExperimentDialog.cpp
src/gunzip.cpp
src/AvatarLoader.cpp
src/SettingNetworkForm.cpp
src/Photoshop.cpp
src/SettingBehaviorForm.cpp
src/MyProcess.cpp
src/FileViewWidget.cpp
src/MyTextEditorWidget.cpp
src/AbstractProcess.cpp
src/texteditor/AbstractCharacterBasedApplication.cpp
src/texteditor/InputMethodPopup.cpp
src/texteditor/TextEditorTheme.cpp
src/texteditor/TextEditorWidget.cpp
src/texteditor/unicode.cpp
src/texteditor/UnicodeWidth.cpp
src/MyImageViewWidget.cpp
src/SetGlobalUserDialog.cpp
src/ReflogWindow.cpp
src/Theme.cpp
src/ApplicationGlobal.cpp
src/BlameWindow.cpp
src/MenuButton.cpp
src/SettingGeneralForm.cpp
src/WelcomeWizardDialog.cpp
src/DialogHeaderFrame.cpp
src/CommitViewWindow.cpp
src/EditRemoteDialog.cpp
src/gpg.cpp
src/SelectGpgKeyDialog.cpp
src/SetGpgSigningDialog.cpp
src/CommitDialog.cpp
src/ConfigSigningDialog.cpp
src/AreYouSureYouWantToContinueConnectingDialog.cpp
src/LineEditDialog.cpp
src/SettingProgramsForm.cpp
src/InputNewTagDialog.cpp
src/EditTagsDialog.cpp
src/darktheme/DarkStyle.cpp
src/darktheme/NinePatch.cpp
src/darktheme/StandardStyle.cpp
src/darktheme/TraditionalWindowsStyleTreeControl.cpp
src/EditGitIgnoreDialog.cpp
src/SelectItemDialog.cpp
src/RebaseOntoDialog.cpp
)
set(Guitar_HEADERS
src/MainWindow.h
src/Git.h
src/common/joinpath.h
src/common/misc.h
src/ConfigCredentialHelperDialog.h
src/MySettings.h
src/main.h
src/FileDiffWidget.h
src/TextEditDialog.h
src/LogTableWidget.h
src/FileDiffSliderWidget.h
src/FileUtil.h
src/SettingsDialog.h
src/MergeBranchDialog.h
src/CloneDialog.h
src/AboutDialog.h
src/RepositoryInfoFrame.h
src/RepositoryPropertyDialog.h
src/RepositoryData.h
src/MyToolButton.h
src/GitDiff.h
src/CommitPropertyDialog.h
src/Terminal.h
src/DeleteTagsDialog.h
src/RepositoriesTreeWidget.h
src/SelectCommandDialog.h
src/ImageViewWidget.h
src/FileHistoryWindow.h
src/Debug.h
src/GitPackIdxV2.h
src/GitPack.h
src/GitObjectManager.h
src/FilePropertyDialog.h
src/BigDiffWindow.h
src/MaximizeButton.h
src/CommitExploreWindow.h
src/ReadOnlyLineEdit.h
src/ReadOnlyPlainTextEdit.h
src/MyTableWidgetDelegate.h
src/SetRemoteUrlDialog.h
- myzlib.h
src/ClearButton.h
src/SetUserDialog.h
src/SearchFromGitHubDialog.h
src/webclient.h
src/charvec.h
src/urlencode.h
src/HyperLinkLabel.h
src/JumpDialog.h
src/CheckoutDialog.h
src/DeleteBranchDialog.h
src/BasicRepositoryDialog.h
src/RemoteRepositoriesTableWidget.h
src/LocalSocketReader.h
src/PushDialog.h
src/StatusLabel.h
src/RepositoryLineEdit.h
src/DirectoryLineEdit.h
src/AbstractSettingForm.h
src/SettingExampleForm.h
src/CreateRepositoryDialog.h
src/GitHubAPI.h
src/MemoryReader.h
src/ExperimentDialog.h
src/gunzip.h
src/AvatarLoader.h
src/SettingNetworkForm.h
src/Photoshop.h
src/SettingBehaviorForm.h
src/MyProcess.h
src/FileViewWidget.h
src/MyTextEditorWidget.h
src/AbstractProcess.h
src/texteditor/AbstractCharacterBasedApplication.h
src/texteditor/InputMethodPopup.h
src/texteditor/TextEditorTheme.h
src/texteditor/TextEditorWidget.h
src/texteditor/unicode.h
src/texteditor/UnicodeWidth.h
src/MyImageViewWidget.h
src/SetGlobalUserDialog.h
src/ReflogWindow.h
src/Theme.h
src/ApplicationGlobal.h
src/BlameWindow.h
src/MenuButton.h
src/SettingGeneralForm.h
src/WelcomeWizardDialog.h
src/DialogHeaderFrame.h
src/CommitViewWindow.h
src/EditRemoteDialog.h
src/gpg.h
src/SelectGpgKeyDialog.h
src/SetGpgSigningDialog.h
src/CommitDialog.h
src/ConfigSigningDialog.h
src/AreYouSureYouWantToContinueConnectingDialog.h
src/LineEditDialog.h
src/SettingProgramsForm.h
src/InputNewTagDialog.h
src/EditTagsDialog.h
src/darktheme/DarkStyle.h
src/darktheme/NinePatch.h
src/darktheme/StandardStyle.h
src/darktheme/TraditionalWindowsStyleTreeControl.h
src/EditGitIgnoreDialog.h
src/SelectItemDialog.h
src/RebaseOntoDialog.h
)
if(UNIX)
list(APPEND Guitar_SOURCES
src/unix/UnixProcess.cpp
src/unix/UnixPtyProcess.cpp
)
list(APPEND Guitar_HEADERS
src/unix/UnixProcess.h
src/unix/UnixPtyProcess.h
)
elseif(WIN32)
list(APPEND Guitar_SOURCES
src/win32/thread.cpp
src/win32/event.cpp
src/win32/win32.cpp
src/win32/Win32Process.cpp
src/win32/Win32PtyProcess.cpp
)
list(APPEND Guitar_HEADERS
src/win32/thread.h
src/win32/event.h
src/win32/mutex.h
src/win32/win32.h
src/win32/Win32Process.h
src/win32/Win32PtyProcess.h
)
endif()
set(Guitar_UIS
src/MainWindow.ui
src/ConfigCredentialHelperDialog.ui
src/TextEditDialog.ui
src/SettingsDialog.ui
src/MergeBranchDialog.ui
src/CloneDialog.ui
src/AboutDialog.ui
src/RepositoryPropertyDialog.ui
src/CommitPropertyDialog.ui
src/DeleteTagsDialog.ui
src/SelectCommandDialog.ui
src/FileDiffWidget.ui
src/FileHistoryWindow.ui
src/FilePropertyDialog.ui
src/BigDiffWindow.ui
src/CommitExploreWindow.ui
src/SetRemoteUrlDialog.ui
src/SetUserDialog.ui
src/SearchFromGitHubDialog.ui
src/JumpDialog.ui
src/CheckoutDialog.ui
src/DeleteBranchDialog.ui
src/PushDialog.ui
src/SettingExampleForm.ui
src/CreateRepositoryDialog.ui
src/ExperimentDialog.ui
src/SettingNetworkForm.ui
src/SettingBehaviorForm.ui
src/SetGlobalUserDialog.ui
src/ReflogWindow.ui
src/BlameWindow.ui
src/SettingGeneralForm.ui
src/WelcomeWizardDialog.ui
src/CommitViewWindow.ui
src/EditRemoteDialog.ui
src/SelectGpgKeyDialog.ui
src/SetGpgSigningDialog.ui
src/CommitDialog.ui
src/ConfigSigningDialog.ui
src/AreYouSureYouWantToContinueConnectingDialog.ui
src/LineEditDialog.ui
src/SettingProgramsForm.ui
src/InputNewTagDialog.ui
src/EditTagsDialog.ui
src/EditGitIgnoreDialog.ui
src/SelectItemDialog.ui
src/RebaseOntoDialog.ui
)
set(Guitar_RESOURCES
src/resources/resources.qrc
)
set(Guitar_TRANSLATIONS
src/resources/translations/ja_JPN.ts
)
qt5_add_translation(Guitar_QM_FILES ${Guitar_TRANSLATIONS})
configure_file(${Guitar_RESOURCES} ${CMAKE_BINARY_DIR} COPYONLY)
add_custom_target(translations ALL DEPENDS ${Guitar_QM_FILES})
add_custom_target(resources ALL DEPENDS ${Guitar_RESOURCES})
add_dependencies(resources translations)
include_directories(src)
include_directories(src/texteditor)
add_executable(${PROJECT_NAME}
${Guitar_SOURCES}
${Guitar_HEADERS}
${Guitar_UIS}
${Guitar_RESOURCES}
${Guitar_QM_FILES}
)
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 11
CXX_EXTENSIONS OFF
)
target_link_libraries(${PROJECT_NAME}
Qt5::Widgets
Qt5::Network
Qt5::Svg
zlib
OpenSSL::SSL OpenSSL::Crypto
)
add_subdirectory(extra)
diff --git a/myzlib.h b/myzlib.h
deleted file mode 100644
index 213d57e..0000000
--- a/myzlib.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifdef __HAIKU__
-#include <zlib.h>
-#else
-#include "../zlib/zlib.h"
-#endif
-//#include <QtZlib/zlib.h>
diff --git a/src/GitPack.cpp b/src/GitPack.cpp
index 74c1306..8819f28 100644
--- a/src/GitPack.cpp
+++ b/src/GitPack.cpp
@@ -1,252 +1,252 @@
#include "GitPack.h"
-#include "../myzlib.h"
+#include <zlib.h>
#include <QDebug>
#include <QFile>
#include "GitPackIdxV2.h"
void GitPack::decodeTree(QByteArray *out)
{
if (out && out->size() > 0) {
QByteArray ba;
uint8_t const *begin = (uint8_t const *)out->data();
uint8_t const *end = begin + out->size();
uint8_t const *ptr = begin;
while (ptr < end) {
int mode = 0;
while (ptr < end) {
int c = *ptr & 0xff;
ptr++;
if (isdigit(c & 0xff)) {
mode = mode * 10 + (c - '0');
} else if (c == ' ') {
break;
}
}
uint8_t const *left = ptr;
while (ptr < end && *ptr) {
ptr++;
}
std::string name(left, ptr);
if (ptr + 20 < end) {
ptr++;
char tmp[100];
sprintf(tmp, "%06u %s ", mode, mode < 100000 ? "tree" : "blob");
char *p = tmp + 12;
for (int i = 0; i < 20; i++) {
sprintf(p, "%02x", ptr[i]);
p += 2;
}
ba.append(tmp, p - tmp);
ba.append('\t');
ba.append(name.c_str(), name.size());
ba.append('\n');
ptr += 20;
} else {
break;
}
}
*out = std::move(ba);
}
}
Git::Object::Type GitPack::stripHeader(QByteArray *out)
{
if (out) {
int n = out->size();
if (n > 0) {
char const *p = out->data();
if (n > 16) n = 16;
for (int i = 0; i < n; i++) {
if (p[i] == 0) {
Git::Object::Type type = Git::Object::Type::UNKNOWN;
if (strncmp(p, "blob ", 5) == 0) {
type = Git::Object::Type::BLOB;
} else if (strncmp(p, "tree ", 5) == 0) {
type = Git::Object::Type::TREE;
} else if (strncmp(p, "commit ", 7) == 0) {
type = Git::Object::Type::COMMIT;
} else if (strncmp(p, "tag ", 4) == 0) {
type = Git::Object::Type::TAG;
}
if (type != Git::Object::Type::UNKNOWN) {
*out = out->mid(i + 1);
}
return type;
}
}
}
}
return Git::Object::Type::UNKNOWN;
}
bool GitPack::decompress(QIODevice *in, size_t expanded_size, QByteArray *out, size_t *consumed, uint32_t *crc)
{
if (consumed) *consumed = 0;
try {
int err;
z_stream d_stream;
d_stream.zalloc = (alloc_func)0;
d_stream.zfree = (free_func)0;
d_stream.opaque = (voidpf)0;
d_stream.next_in = 0;
d_stream.avail_in = 0;
err = inflateInit(&d_stream);
if (err != Z_OK) {
throw QString("failed: inflateInit");
}
while (1) {
if (expanded_size > 0 && (size_t)out->size() > expanded_size) {
throw QString("file too large");
}
uint8_t src[1024];
uint8_t tmp[65536];
if (d_stream.next_in != src && d_stream.avail_in > 0) {
memmove(src, d_stream.next_in, d_stream.avail_in);
}
d_stream.next_in = src;
if (d_stream.avail_in < sizeof(src)) {
int n = sizeof(src) - d_stream.avail_in;
n = in->read((char *)(src + d_stream.avail_in), n);
if (n >= 0) {
d_stream.avail_in += n;
}
}
d_stream.next_out = tmp;
size_t l = expanded_size - out->size();
if (l > sizeof(tmp)) l = sizeof(tmp);
d_stream.avail_out = l;
uLong total = d_stream.total_out;
err = ::inflate(&d_stream, Z_NO_FLUSH);
int in_len = (uint8_t *)d_stream.next_in - src;
if (consumed) *consumed += in_len;
if (crc) *crc = crc32(*crc, src, in_len);
int out_len = d_stream.total_out - total;
out->append((char const *)tmp, out_len);
if (err == Z_STREAM_END) {
break;
}
if (err != Z_OK) {
throw QString("failed: inflate");
}
}
err = inflateEnd(&d_stream);
if (err != Z_OK) {
throw QString("failed: inflateEnd");
}
return true;
} catch (QString const &e) {
qDebug() << e;
}
return false;
}
bool GitPack::seekPackedObject(QIODevice *file, const GitPackIdxItem *item, Info *out)
{
try {
Info info;
auto Read = [&](void *ptr, size_t len){
const auto l = file->read((char *)ptr, len);
if (l < 0 || ((size_t)(l)) != len) {
throw QString("failed to read");
}
info.checksum = crc32(info.checksum, (uint8_t const *)ptr, len);
};
file->seek(0);
uint32_t header[3];
Read(header, sizeof(int32_t) * 3);
if (memcmp(header, "PACK", 4) != 0) throw QString("invalid pack file");
uint32_t version = read_uint32_be(header + 1);
if (version < 2) throw QString("invalid pack file version");
/*int count = */read_uint32_be(header + 2);
file->seek(item->offset);
info.checksum = 0;
// cf. https://github.com/github/git-msysgit/blob/master/builtin/unpack-objects.c
{
size_t size = 0;
char c;
Read(&c, 1);
info.type = (Git::Object::Type)((c >> 4) & 7);
size = c & 0x0f;
int shift = 4;
while (c & 0x80) {
Read(&c, 1);
size |= (c & 0x7f) << shift;
shift += 7;
}
info.expanded_size = size;
}
if (info.type == Git::Object::Type::OFS_DELTA) {
uint64_t offset = 0;
char c;
Read(&c, 1);
offset = c & 0x7f;
while (c & 0x80) {
Read(&c, 1);
offset = ((offset + 1) << 7) | (c & 0x7f);
}
info.offset = offset;
} else if (info.type == Git::Object::Type::REF_DELTA) {
char bin[20];
Read(bin, 20);
char tmp[41];
for (int i = 0; i < 20; i++) {
sprintf(tmp + i * 2, "%02x", bin[i] & 0xff);
}
info.ref_id = QString::fromLatin1(tmp, GIT_ID_LENGTH);
}
*out = info;
return true;
} catch (QString const &e) {
qDebug() << e;
}
return false;
}
bool GitPack::load(QIODevice *file, const GitPackIdxItem *item, Object *out)
{
*out = Object();
try {
seekPackedObject(file, item, out);
if (decompress(file, out->expanded_size, &out->content, &out->packed_size, &out->checksum)) {
out->expanded_size = out->expanded_size;
return true;
}
} catch (QString const &e) {
qDebug() << e;
}
return false;
}
bool GitPack::load(QString const &packfile, const GitPackIdxItem *item, GitPack::Object *out)
{
QFile file(packfile);
if (file.open(QFile::ReadOnly)) {
if (load(&file, item, out)) {
return true;
}
}
return false;
}
diff --git a/src/gunzip.cpp b/src/gunzip.cpp
index 3ffb774..b98156d 100644
--- a/src/gunzip.cpp
+++ b/src/gunzip.cpp
@@ -1,228 +1,228 @@
#include "gunzip.h"
-#include "myzlib.h"
+#include <zlib.h>
#include <stdint.h>
#include <QFile>
void gunzip::set_header_only(bool f)
{
header_only = f;
}
void gunzip::set_maximul_size(int64_t size)
{
maxsize = size;
}
bool gunzip::decode(QIODevice *input, QIODevice *output)
{
error = QString();
try {
struct Header {
uint8_t id1;
uint8_t id2;
uint8_t cm;
uint8_t flg;
uint8_t mtime[4];
uint8_t xfl;
uint8_t os;
};
enum {
FTEXT = 0x01,
FHCRC = 0x02,
FEXTRA = 0x04,
FNAME = 0x08,
FCOMMENT = 0x10,
};
unsigned char ibuf[4096];
bool ok = true;
int n;
n = input->read((char *)ibuf, sizeof(Header));
if (n != 10) {
throw QString("failed to read the header");
}
Header *h = (Header *)ibuf;
if (h->id1 == 0x1f && h->id2 == 0x8b && h->cm == 8) {
// ok
if (header_only) {
return true;
}
} else {
throw QString("invalid input format");
}
auto ReadText = [&](){
char c;
std::vector<uint8_t> vec;
while (1) {
if (input->read(&c, 1) != 1) {
break;
}
if (c == 0) break;
vec.push_back((uint8_t)c);
}
std::string str;
if (!vec.empty()) {
str.assign((char const *)&vec[0], vec.size());
}
return str;
};
if (h->flg & FEXTRA) {
n = input->read((char *)ibuf, 2);
n = ((uint8_t)ibuf[1] << 8) | (uint8_t)ibuf[0];
input->seek(input->pos() + n);
}
if (h->flg & FNAME) {
std::string name = ReadText();
(void)name;
}
if (h->flg & FCOMMENT) {
std::string comment = ReadText();
(void)comment;
}
if (h->flg & FHCRC) {
input->read((char *)ibuf, 2);
}
z_stream stream;
uint32_t crc = 0;
int err;
stream.zalloc = (alloc_func)0;
stream.zfree = (free_func)0;
stream.opaque = (voidpf)0;
stream.next_in = ibuf;
stream.avail_in = 0;
err = inflateInit2(&stream, -MAX_WBITS);
if (err != Z_OK) {
throw QString("inflateInit2 faled");
}
if (open) {
if (!open(output)) {
ok = false;
}
} else {
if (!output->open(QIODevice::WriteOnly)) {
ok = false;
}
}
if (!ok) throw QString("failed to open the output device");
int64_t inpos = input->pos();
auto Close = [&](){
if (close) {
close(output);
} else {
output->close();
}
inflateEnd(&stream);
};
try {
while (1) {
if (stream.avail_in == 0) {
stream.next_in = ibuf;
}
if (stream.avail_in < sizeof(ibuf)) {
stream.next_in = ibuf + stream.avail_in;
auto len = input->read((char *)stream.next_in, sizeof(ibuf) - stream.avail_in);
stream.avail_in += len;
}
unsigned char obuf[65536];
stream.next_out = obuf; /* discard the output */
stream.avail_out = sizeof(obuf);
if (maxsize != -1 && stream.total_out + stream.avail_out > (unsigned)maxsize && (unsigned)maxsize >= stream.total_out) {
stream.avail_out = maxsize - stream.total_out;
}
uLong total_out = stream.total_out;
err = ::inflate(&stream, Z_NO_FLUSH);
int n = stream.total_out - total_out;
if (write) {
if (!write(output, (char const *)obuf, n)) {
ok = false;
}
} else {
int w = output->write((char const *)obuf, n);
if (w != n) {
ok = false;
}
}
if (!ok) throw QString("failed to write to the output device");
crc = crc32(crc, (unsigned char const *)obuf, n);
if (err == Z_STREAM_END) {
break;
}
if (err != Z_OK) {
throw QString("inflate failed");
}
if (stream.total_out >= (unsigned)maxsize) {
break;
}
}
} catch (...) {
Close();
throw;
}
Close();
input->seek(inpos + stream.total_in);
n = input->read((char *)ibuf, 8);
auto ReadU32LE = [](void const *p)->uint32_t{
uint8_t const *q = (uint8_t const *)p;
return (q[3] << 24) | (q[2] << 16) | (q[1] << 8) | q[0];
};
auto c = ReadU32LE(ibuf);
auto l = ReadU32LE(ibuf + 4);
if (c != crc) throw QString("crc incorrect");
if (l != stream.total_out) throw QString("length incorrect");
return true;
} catch (QString const &e) {
error = e;
}
return false;
}
bool gunzip::decode(const QString &inpath, const QString &outpath)
{
QFile infile(inpath);
QFile outfile(outpath);
if (infile.open(QFile::ReadOnly)) {
if (decode(&infile, &outfile)) {
return true;
}
}
return false;
}
bool gunzip::is_valid_gz_file(QIODevice *input)
{
gunzip z;
z.set_header_only(true);
return z.decode(input, nullptr);
}
bool gunzip::is_valid_gz_file(const QString &inpath)
{
QFile infile(inpath);
if (infile.open(QFile::ReadOnly)) {
gunzip z;
if (z.is_valid_gz_file(&infile)) {
return true;
}
}
return false;
}

File Metadata

Mime Type
text/x-diff
Expires
Tue, Jun 16, 2:19 AM (2 w, 13 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
71326
Default Alt Text
(21 KB)

Event Timeline