2 * Copyright 2011, Haiku Inc. All rights reserved.
3 * This file may be used under the terms of the MIT License.
10 #include "DataStream.h"
17 # define TRACE(x...) dprintf("\33[34mexfat:\33[0m " x)
19 # define TRACE(x...) ;
21 #define ERROR(x...) dprintf("\33[34mexfat:\33[0m " x)
24 DataStream::DataStream(Volume
* volume
, Inode
* inode
, off_t size
)
26 kBlockSize(volume
->BlockSize()),
27 kClusterSize(volume
->ClusterSize()),
32 fNumBlocks
= size
== 0 ? 0 : ((size
- 1) / kBlockSize
) + 1;
36 DataStream::~DataStream()
42 DataStream::FindBlock(off_t pos
, off_t
& physical
, off_t
*_length
)
45 TRACE("FindBlock: offset larger than size\n");
46 return B_ENTRY_NOT_FOUND
;
48 cluster_t clusterIndex
= pos
/ kClusterSize
;
49 uint32 offset
= pos
% kClusterSize
;
51 cluster_t cluster
= fInode
->StartCluster();
52 for (uint32 i
= 0; i
< clusterIndex
; i
++)
53 cluster
= fInode
->NextCluster(cluster
);
55 fVolume
->ClusterToBlock(cluster
, block
);
56 physical
= block
* kBlockSize
+ offset
;
57 for (uint32 i
= 0; i
< 64; i
++) {
58 cluster_t extentEnd
= fInode
->NextCluster(cluster
);
59 if (extentEnd
== EXFAT_CLUSTER_END
|| extentEnd
== cluster
+ 1)
63 *_length
= min_c((cluster
- clusterIndex
+ 1) * kClusterSize
- offset
,
65 TRACE("inode %" B_PRIdINO
": cluster %" B_PRIu32
", pos %" B_PRIdOFF
", %"
66 B_PRIdOFF
"\n", fInode
->ID(), clusterIndex
, pos
, physical
);