function XT_ProcessItem(nItemID: LongWord; lpReserved: Pointer): integer; stdcall; export;
const
BufLen = 4096;
var
Buf1, outputmessage1 : array[0..Buflen-1] of WideChar;
lpTypeDescr : array[0..Buflen-1] of WideChar;
//UserInput : Int64; optional für später
hOpenResult : THandle = Default(THandle);
nItemVMDKStatus : LongInt = Default(LongInt);
//für Exportieren
ItemSize : Int64 = Default(Int64);
InputBytesBuffer : TBytes;
//n : Int64 = Default(Int64);
m : Int64 = Default(Int64);
x : Int64 = Default(Int64);
OGName : string = Default(string);
BufMax : Int64 = Default(Int64);
ItemSizeAbs : Int64 = Default(Int64);
PartFileID : Int64 = Default(Int64);
intBytesRead : Int64 = Default(Int64);
BytesWritten : Int64 = Default(Int64);
RTAdditionSuccess : Integer = Default(Integer);
OutputStream : TFileStream;
DelFileOK : Boolean = Default(Boolean);
scratchfilename : string = Default(string);
//OutputFilename : string = Default(string); Abwägung GUID oder nativer Filename
//für Importieren in XWF
FirstEvOCreated : THandle = Default(THandle);
Buf2, ExportPath : array[0..Buflen-1] of WideChar;
Buf3, ExportPathFinal : array[0..Buflen-1] of WideChar;
Buf4, ExportPathOG : array[0..Buflen-1] of WideChar;
begin
//Userinput := XWF_GetUserInput(,); //User wird gefragt welche Dateien (z.B. VMDK) er sucht, optional für später
FillChar(lpTypeDescr, Length(lpTypeDescr), $00);
FillChar(Buf1, Length(Buf1), $00);
FillChar(Buf2, Length(Buf2), $00);
FillChar(outputmessage1, Length(outputmessage1), $00);
outputmessage1 := 'VMDK File found'; //Prepare Output Message
lstrcpyw(Buf1, outputmessage1);
nItemVMDKStatus := XWF_GetItemType(nitemID, @lpTypeDescr, Length(lpTypeDescr));
ItemSize := XWF_GetItemSize(nitemID); //Größe der Datei bestimmen
//n := 0;
m := 0; //Stelle ab der die Datei in den Buffer gelesen wird
x := 1; //Variable zur Bennenung der Partfiles (Endung)
BufMax := BufLen; //Maximale Größe des Buffers
ItemSizeAbs := ItemSize; //Absolute ItemSize welche im Folgenden mit BufMax reduziert wird
if lpTypeDescr = 'vmdk' then //wenn VMDK File ACHTUNG
begin
XWF_OutputMessage(@Buf1[0], 0); //gib Nachricht 'VMDK File found' aus
OGName := XWF_GetItemName(nitemID); //Name der Originaldatei bestimmen, siehe oben
//Exportieren der Datei
hOpenResult := XWF_OpenItem(CurrentVolume, nItemID, $01); //Öffnen des Files, returned Handle, bei 0 unsuccessful
if hOpenResult > 0 then //wenn Öffnen des Items erfolgt
begin
while ItemSizeAbs > BufMax do //solange absolute ItemSize größer ist als der Maximale Buffer tue...
begin
FillChar(InputBytesBuffer, Length(InputBytesBuffer), $00); //whipen des Buffers, um Probleme zu vermeiden
PartFileID := x; //Deklaration der ID des Splitterfiles (Endnung)
SetLength(InputBytesBuffer, BufMax); //Länge des Buffers auf BufMax festlegen da sonst zu groß
intBytesRead := XWF_Read(hOpenResult, m, @(InputBytesBuffer)[0], BufMax); //write von m bis BufMax in InputBytesBufferN
if intBytesRead > 0 then
begin
// Write the native file out to disk using the above declared stream
// Use a GUID as a temp filename, or 'tempfile.raw' if that fails,
// then write content of InputBytesBufferN to it
//scratchfilename := TGUID.NewGuid.ToString(true); // FÜR GUID Bezeichnung
scratchfilename := OGName; //FÜR ORIGINAL Bezeichnung
try
if Length(scratchfilename) > 0 then
begin
ExportPath := IncludeTrailingPathDelimiter(OutputFolder) + scratchfilename + '.' + FormatFloat('000', PartFileID); //ACHTUNG
OutputStream := TFileStream.Create(ExportPath, fmCreate);
end
else
begin
scratchfilename := 'tempfile';
OutputStream := TFileStream.Create(IncludeTrailingPathDelimiter(OutputFolder) + scratchfilename + '.' + FormatFloat('000', PartFileID), fmCreate); //ACHTUNG
end;
if OutPutStream.Handle > 0 then
begin
BytesWritten := -1;
BytesWritten := OutputStream.Write(InputBytesBuffer[0], intBytesRead);
OutputStream.Free;
end;
finally
// nothing needed
end;
end;
//n := n + 1;
m := m + BufMax;
x := x + 1;
ItemSizeAbs := ItemSizeAbs - BufMax;
FillChar(Buf2, Length(Buf2), $00);
scratchfilename := Default(string);
BytesWritten := Default(Int64);
IntBytesRead := Default(Int64);
PartFileID := Default(Int64);
end;
end;
//für den Fall dass, die ItemSizeAbs nun kleiner ist als die BufMax schreibe die letzte Datei
FillChar(InputBytesBuffer, Length(InputBytesBuffer), $00); //whipen des Buffers, um Probleme zu vermeiden
SetLength(InputBytesBuffer, ItemSizeAbs); //Länge des Buffers festlegen, Problem HIER ItemSize bei vmdk zu groß für InputBytesBuffer0
intBytesRead := XWF_Read(hOpenResult, m, @(InputBytesBuffer)[0], BufMax); //write von m bis BufMax in InputBytesBufferN
if intBytesRead > 0 then
begin
// Write the native file out to disk using the above declared stream
// Use a GUID as a temp filename, or 'tempfile.raw' if that fails,
// then write content of InputBytesBufferN to it
//scratchfilename := TGUID.NewGuid.ToString(true); // FÜR GUID Bezeichnung
scratchfilename := OGName; //FÜR ORIGINAL Bezeichnung
try
if Length(scratchfilename) > 0 then
begin
ExportPath := IncludeTrailingPathDelimiter(OutputFolder) + scratchfilename + '.' + FormatFloat('000', PartFileID); //ACHTUNG
ExportPathOG := IncludeTrailingPathDelimiter(OutputFolder) + scratchfilename + '.0001';
ExportPathFinal := IncludeTrailingPathDelimiter(OutputFolder);
OutputStream := TFileStream.Create(ExportPath, fmCreate);
end
else
begin
scratchfilename := 'tempfile';
OutputStream := TFileStream.Create(IncludeTrailingPathDelimiter(OutputFolder) + scratchfilename + '.' + FormatFloat('000', PartFileID), fmCreate); //ACHTUNG
end;
if OutPutStream.Handle > 0 then
begin
BytesWritten := -1;
BytesWritten := OutputStream.Write(InputBytesBuffer[0], intBytesRead);
OutputStream.Free;
end;
finally
// nothing needed
end;
end;
//Zusammensetzen der einzeln exportierten Teildateien
lstrcpyw(Buf4, ExportPathOG);
lstrcpyw(Buf3, ExportPathFinal);
CombineFiles(ExportPathOG, ExportPathFinal + '.vmdk');
//Importieren und öffnen der Datei zurück in XWF, in aktuellen Fall als eigenes 'Image'
lstrcpyw(Buf2, ExportPath);
FirstEvOCreated := XWF_CreateEvObj(1,0,ExportPath,0);
result := 0; //Rückgabewert für XT_ProcessItem
end
else //wenn keine vmdk-Datei
begin
result := 0; //Rückgabewert für XT_ProcessItem
end;
end;