blob: 1cb57f1a7cdfb9b7c6ed5abc2c1ced771106a676 [file] [log] [blame]
giolekva7be17df2020-03-21 13:57:02 +04001package chunk
2
giolekvac5126d92020-03-21 16:39:56 +04003import (
4 "context"
5 "errors"
6 "io"
giolekva7be17df2020-03-21 13:57:02 +04007
giolekvac5126d92020-03-21 16:39:56 +04008 "pcloud/api"
9)
giolekva7be17df2020-03-21 13:57:02 +040010
11type RemoteChunk struct {
12 chunkId string
13 client api.ChunkStorageClient
14}
15
16func (r *RemoteChunk) SizeBytes() int {
17 return 0
18}
19
20func (r *RemoteChunk) ReadSeeker() io.ReadSeeker {
21 return &remoteChunkReadSeeker{
22 chunkId: r.chunkId,
23 client: r.client}
24}
25
26func (r *RemoteChunk) Writer() io.Writer {
27 return nil
28}
29
30type remoteChunkReadSeeker struct {
31 chunkId string
32 client api.ChunkStorageClient
33 offset int64
34}
35
36func (c *remoteChunkReadSeeker) Seek(offset int64, whence int) (int64, error) {
37 if whence != io.SeekStart {
38 return 0, errors.New("Seek: RemoteChunk only supports SeekStart whence")
39 }
40 c.offset = offset
41 return offset, nil
42}
43
44func (c *remoteChunkReadSeeker) Read(p []byte) (n int, err error) {
45 req := api.ReadChunkRequest{
46 ChunkId: c.chunkId,
47 Offset: int32(c.offset), // TODO(lekva): must be int64
48 NumBytes: int32(len(p))}
49 resp, err := c.client.ReadChunk(context.Background(), &req)
50 if err != nil {
51 return
52 }
53 n = copy(p, resp.Data)
54 c.offset += int64(n)
55 return
56}
57
58type PrimaryReplicaChunk struct {
59 chunkId string
60}