forked from forth32/qhuaweiflash
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fwsave.cpp
84 lines (66 loc) · 1.89 KB
/
fwsave.cpp
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
//
// Enregistrer le fichier прошивки на диск
//
#include <QtWidgets>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include "fwsave.h"
#include "ptable.h"
#include "signver.h"
extern QString fwfilename;
//****************************************************************
//* Процедура сохранения образа прошивки в новом файле
//****************************************************************
void fw_saver(bool newname, bool zflag) {
int32_t i;
FILE* out;
uint8_t hdr[92];
uint32_t percent;
char fname[200];
int dlcode;
if (newname || fwfilename.isEmpty()) {
// выбираем новое имя файла
QString fn=fwfilename;
fn=QFileDialog::getSaveFileName(0,"File name",fn,"firmware (*.fw);;All files (*)");
if (fn.isEmpty()) return;
fwfilename=fn;
}
strcpy(fname,fwfilename.toLocal8Bit().data());
dlcode=dload_id&7;
out=fopen(fname,"w");
if (out == 0) {
QMessageBox::critical(0, "Error", "Error while creating file");
return;
}
// записываем заголовок - upgrade state
bzero(hdr,sizeof(hdr));
// выделяем код типа прошивки
hdr[0]=dlcode;
if (signlen != -1) hdr[0]|=0x8;
fwrite(hdr,1,sizeof(hdr),out);
// Формируем окно прогресс-бара
QWidget* pb=new QWidget();
QVBoxLayout* plm=new QVBoxLayout(pb);
QLabel* lb = new QLabel("Save partitions",pb);
QFont font;
font.setPointSize(14);
font.setBold(true);
font.setWeight(75);
lb->setFont(font);
plm->addWidget(lb);
QProgressBar* fbar = new QProgressBar(pb);
fbar->setValue(0);
plm->addWidget(fbar);
pb->show();
// записываем образы всех разделов
for(i=0;i<ptable->index();i++) {
ptable->save_part(i,out,zflag);
percent=(i+1)*100/(ptable->index());
fbar->setValue(percent);
QCoreApplication::processEvents();
}
delete pb;
fclose(out);
}