OnlineLibrary

Форк
0
72 строки · 1.3 Кб
1
package lkf
2

3
import (
4
	"fmt"
5
	"io"
6

7
	"gitverse.ru/kvark128/lkf"
8
)
9

10
type Reader struct {
11
	src       io.ReadSeeker
12
	buf       []byte
13
	bufLength int
14
	c         *lkf.Cryptor
15
	lastError error
16
}
17

18
func NewReader(src io.ReadSeeker) *Reader {
19
	return &Reader{
20
		src: src,
21
		buf: make([]byte, lkf.BlockSize*32), // 16 Kb
22
		c:   new(lkf.Cryptor),
23
	}
24
}
25

26
func (r *Reader) Read(p []byte) (int, error) {
27
	if len(p) == 0 {
28
		return 0, nil
29
	}
30

31
	if r.bufLength == 0 {
32
		for r.bufLength < len(r.buf) && r.lastError == nil {
33
			var nRead int
34
			nRead, r.lastError = r.src.Read(r.buf[r.bufLength:])
35
			r.bufLength += nRead
36
		}
37

38
		if r.bufLength == 0 && r.lastError != nil {
39
			return 0, r.lastError
40
		}
41

42
		t := r.buf[:r.bufLength]
43
		r.c.Decrypt(t, t)
44
	}
45

46
	n := copy(p, r.buf[:r.bufLength])
47
	copy(r.buf, r.buf[n:r.bufLength])
48
	r.bufLength -= n
49
	return n, nil
50
}
51

52
func (r *Reader) Seek(offset int64, whence int) (int64, error) {
53
	if whence != io.SeekStart {
54
		return 0, fmt.Errorf("LKFReader: Seek: only io.SeekStart is supported")
55
	}
56

57
	r.bufLength = 0
58
	r.lastError = nil
59

60
	blockOffset := offset % lkf.BlockSize
61
	pos, err := r.src.Seek(offset-blockOffset, whence)
62
	if err != nil {
63
		return 0, err
64
	}
65

66
	if blockOffset == 0 {
67
		return pos, nil
68
	}
69

70
	n, err := io.ReadFull(r, make([]byte, blockOffset))
71
	return pos + int64(n), err
72
}
73

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.