Sleuth Kit Java Bindings (JNI) 4.14.0
Java bindings for using The Sleuth Kit
Loading...
Searching...
No Matches
LayoutFile.java
Go to the documentation of this file.
1/*
2 * SleuthKit Java Bindings
3 *
4 * Copyright 2011-2022 Basis Technology Corp.
5 * Contact: carrier <at> sleuthkit <dot> org
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package org.sleuthkit.datamodel;
20
21import java.util.Collections;
22import java.util.logging.Level;
23import java.util.logging.Logger;
24import org.sleuthkit.datamodel.TskData.FileKnown;
25import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM;
26import org.sleuthkit.datamodel.TskData.TSK_FS_ATTR_TYPE_ENUM;
27import org.sleuthkit.datamodel.TskData.TSK_FS_META_TYPE_ENUM;
28import org.sleuthkit.datamodel.TskData.TSK_FS_NAME_FLAG_ENUM;
29import org.sleuthkit.datamodel.TskData.TSK_FS_NAME_TYPE_ENUM;
30
44public class LayoutFile extends AbstractFile {
45
46 private long imageHandle = -1;
47
92 LayoutFile(SleuthkitCase db,
93 long objId,
94 long dataSourceObjectId,
96 String name,
100 long size,
101 long ctime, long crtime, long atime, long mtime,
102 String md5Hash, String sha256Hash, String sha1Hash,
104 String parentPath, String mimeType,
105 String ownerUid,
106 Long osAccountObjId) {
107
108 super(db, objId, dataSourceObjectId, fileSystemObjectId, TSK_FS_ATTR_TYPE_ENUM.TSK_FS_ATTR_TYPE_DEFAULT, 0, name, fileType, 0L, 0, dirType, metaType, dirFlag, metaFlags, size, ctime, crtime, atime, mtime, (short) 0, 0, 0, md5Hash, sha256Hash, sha1Hash, knownState, parentPath, mimeType, SleuthkitCase.extractExtension(name), ownerUid, osAccountObjId, TskData.CollectedStatus.UNKNOWN, Collections.emptyList());
109 }
110
116 public int getNumParts() {
117 int numParts = 0;
118 try {
119 numParts = getRanges().size();
120 } catch (TskCoreException ex) {
121 Logger.getLogger(LayoutFile.class.getName()).log(Level.SEVERE, String.format("Error getting layout ranges for layout file (objId = %d)", getId()), ex); //NON-NLS
122 }
123 return numParts;
124 }
125
132 @Override
133 public boolean isRoot() {
134 return false;
135 }
136
141 @Override
142 public void close() {
143 }
144
156 @Override
157 protected int readInt(byte[] buf, long offset, long len) throws TskCoreException {
158 long offsetInThisLayoutContent = 0; // current offset in this LayoutContent
159 int bytesRead = 0; // Bytes read so far
160
161 // if the caller has requested more data than we have in the file
162 // then make sure we don't go beyond the end of the file
163 long readLen = len;
164 if (offset + readLen > size)
165 readLen = size - offset;
166
167 if (imageHandle == -1) {
168 Content dataSource = getDataSource();
169 if ((dataSource != null) && (dataSource instanceof Image)) {
170 Image image = (Image) dataSource;
171 imageHandle = image.getImageHandle();
172 } else {
173 throw new TskCoreException("Data Source of LayoutFile is not Image");
174 }
175 }
176
177 for (TskFileRange range : getRanges()) {
178 if (bytesRead < readLen) { // we haven't read enough yet
179 if (offset < offsetInThisLayoutContent + range.getByteLen()) { // if we are in a range object we want to read from
180 long offsetInRange = 0; // how far into the current range object to start reading
181 if (bytesRead == 0) { // we haven't read anything yet so we want to read from the correct offset in this range object
182 offsetInRange = offset - offsetInThisLayoutContent; // start reading from the correct offset
183 }
184 long offsetInImage = range.getByteStart() + offsetInRange; // how far into the image to start reading
185 long lenToReadInRange = Math.min(range.getByteLen() - offsetInRange, readLen - bytesRead); // how much we can read this time
186 int lenRead = readImgToOffset(imageHandle, buf, bytesRead, offsetInImage, (int) lenToReadInRange);
187 bytesRead += lenRead;
188 if (lenToReadInRange != lenRead) { // If image read failed or was cut short
189 break;
190 }
191 }
192 offsetInThisLayoutContent += range.getByteLen();
193 } else { // we're done reading
194 break;
195 }
196 }
197 return bytesRead;
198 }
199
216 private int readImgToOffset(long imgHandle, byte[] buf, int offsetInBuf, long offsetInImage, int lenToRead) throws TskCoreException {
217 byte[] currentBuffer = new byte[lenToRead]; // the buffer for the current range object
218 int lenRead = SleuthkitJNI.readImg(imgHandle, currentBuffer, offsetInImage, lenToRead);
219 System.arraycopy(currentBuffer, 0, buf, offsetInBuf, lenToRead); // copy what we just read into the main buffer
220 return lenRead;
221 }
222
231 @Override
232 public <T> T accept(ContentVisitor<T> visitor) {
233 return visitor.visit(this);
234 }
235
244 @Override
245 public <T> T accept(SleuthkitItemVisitor<T> visitor) {
246 return visitor.visit(this);
247 }
248
255 @Override
256 public String toString(boolean preserveState) {
257 return super.toString(preserveState) + "LayoutFile [\t" + "]\t"; //NON-NLS
258 }
259}
Set< TSK_FS_META_FLAG_ENUM > metaFlags
final TSK_FS_NAME_TYPE_ENUM dirType
final TSK_FS_META_TYPE_ENUM metaType
final TskData.TSK_DB_FILES_TYPE_ENUM fileType
synchronized long getImageHandle()
Definition Image.java:122
String toString(boolean preserveState)
int readInt(byte[] buf, long offset, long len)
static int readImg(long imgHandle, byte[] readBuffer, long offset, long len)

Copyright © 2011-2024 Brian Carrier. (carrier -at- sleuthkit -dot- org)
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.