コード例 #1
0
ファイル: rar.c プロジェクト: lkunchun/sumatrapdf
static bool rar_restart_solid(ar_archive_rar *rar)
{
    ar_archive *ar = &rar->super;
    size_t current_offset = ar->entry_offset;
    log("Restarting decompression for solid entry");
    if (!ar_parse_entry_at(ar, 0)) {
        ar_parse_entry_at(ar, current_offset);
        return false;
    }
    while (ar->entry_offset != current_offset) {
        size_t size = ar->entry_size_uncompressed;
        rar->entry.restart_solid = false;
        while (size > 0) {
            unsigned char buffer[1024];
            if (!ar_entry_uncompress(ar, buffer, min(size, sizeof(buffer)))) {
                ar_parse_entry_at(ar, current_offset);
                return false;
            }
            size -= min(size, sizeof(buffer));
        }
        if (!ar_parse_entry(ar)) {
            ar_parse_entry_at(ar, current_offset);
            return false;
        }
    }
    rar->entry.restart_solid = false;
    return true;
}
コード例 #2
0
ファイル: rar.c プロジェクト: jra101/sumatrapdf
static bool rar_restart_solid(ar_archive *ar)
{
    ar_archive_rar *rar = (ar_archive_rar *)ar;
    off64_t current_offset = ar->entry_offset;
    log("Restarting decompression for solid entry");
    if (!ar_parse_entry_at(ar, ar->entry_offset_first)) {
        ar_parse_entry_at(ar, current_offset);
        return false;
    }
    while (ar->entry_offset < current_offset) {
        size_t size = ar->entry_size_uncompressed;
        rar->solid.restart = false;
        while (size > 0) {
            unsigned char buffer[1024];
            size_t count = mins(size, sizeof(buffer));
            if (!ar_entry_uncompress(ar, buffer, count)) {
                ar_parse_entry_at(ar, current_offset);
                return false;
            }
            size -= count;
        }
        if (!ar_parse_entry(ar)) {
            ar_parse_entry_at(ar, current_offset);
            return false;
        }
    }
    rar->solid.restart = false;
    return true;
}
コード例 #3
0
ファイル: ArchUtil.cpp プロジェクト: kepazon/my_sumatrapdf
FILETIME ArchFile::GetFileTime(size_t fileindex)
{
    FILETIME ft = { (DWORD)-1, (DWORD)-1 };
    if (ar && fileindex < filepos.Count() && ar_parse_entry_at(ar, filepos.At(fileindex))) {
        time64_t filetime = ar_entry_get_filetime(ar);
        LocalFileTimeToFileTime((FILETIME *)&filetime, &ft);
    }
    return ft;
}
コード例 #4
0
ファイル: ArchUtil.cpp プロジェクト: kepazon/my_sumatrapdf
char *ArchFile::GetFileDataByIdx(size_t fileindex, size_t *len)
{
    if (fileindex >= filenames.Count())
        return nullptr;

    if (!ar || !ar_parse_entry_at(ar, filepos.At(fileindex)))
        return GetFileFromFallback(fileindex, len);

    size_t size = ar_entry_get_size(ar);
    if (size > SIZE_MAX - 3)
        return nullptr;
    ScopedMem<char> data((char *)malloc(size + 3));
    if (!data)
        return nullptr;
    if (!ar_entry_uncompress(ar, data, size))
        return GetFileFromFallback(fileindex, len);
    // zero-terminate for convenience
    data[size] = data[size + 1] = data[size + 2] = '\0';

    if (len)
        *len = size;
    return data.StealData();
}
コード例 #5
0
ファイル: unrar.c プロジェクト: hjw21century/Rakshata
void jumpBackAtBegining(ARCHIVE * archive)
{
	ar_parse_entry_at(archive->archive, 0);
	archive->didJustRewind = true;
}