-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnspsplitter.cpp
More file actions
88 lines (66 loc) · 2.3 KB
/
nspsplitter.cpp
File metadata and controls
88 lines (66 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "nspsplitter.h"
NSPSplitter::NSPSplitter()
{
}
int NSPSplitter::nspCalcParts(size_t size){
if(size <= 0) return -1;
int parts = (int) (size / _FAT32PartSize);
return parts+1;
}
int NSPSplitter::nspSplit(NSP* nsp){
size_t filesize = nsp->size();
int parts = nspCalcParts(filesize);
if(parts <= 1) return -1;
_nsp.open(nsp->path().toStdString(),std::ios::in | std::ios::binary);
_nsp.seekg(_nsp.beg);
/* make new nsp-folder/container for splitted files */
QString sourceFileName = nsp->name().remove(".nsp");
sourceFileName.append("_split.nsp");
QString savePath = makeSaveDir(sourceFileName);
for(int i = 0; i < parts; i++){
/* for every part, calculate read starting-pos. and create new file */
size_t pos = i * _FAT32PartSize;
char buf[_FAT32BlockSize];
QString partSavePath(savePath);
QString partName = QStringLiteral("/%1").arg(i,2,10,QLatin1Char('0'));
partSavePath.append(partName);
std::ofstream outStream;
outStream.open(partSavePath.toStdString(), std::ios::out | std::ios::binary);
/* read sourcefile blockwise and copy to dest., stop at part-end/file-end */
while((pos < filesize) && (pos < (i+1)*_FAT32PartSize)){
if(filesize > pos+sizeof(buf)){
_nsp.seekg(pos);
_nsp.read(buf,sizeof(buf));
outStream.write(buf,sizeof(buf));
pos += sizeof(buf);
}
else{
_nsp.seekg(pos);
size_t leftover = filesize - pos+1;
std::vector<char> buf2(leftover);
_nsp.read(buf2.data(),leftover);
outStream.write(buf2.data(),leftover);
break;
}
int prog = std::lround(((double)pos / (double)filesize)*100);
//qDebug() << "current pos: " << pos << "prog.: "<< prog << "%";
emit progress(prog);
}
outStream.close();
}
_nsp.close();
return 0;
}
int NSPSplitter::setSavePath(QString path){
if(!QDir(path).exists()){
return -1;
}
_outPath = path;
return 0;
}
QString NSPSplitter::makeSaveDir(QString name)
{
QString savePath = _outPath + '/' + name;
QDir().mkdir(savePath);
return savePath;
}