From 10fce5d67b0ef6b99a7ff2113b8c3b5c0f93a663 Mon Sep 17 00:00:00 2001 From: forth32 Date: Wed, 13 Mar 2019 15:55:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=B0=20=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=B9=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cpfiledir.cpp | 27 ++++++++++++++-- cpfiledir.h | 3 +- cpio.cpp | 80 +++++++++++++++++++++++++++++++++++++++++++++++- cpio.h | 3 +- qhuaweiflash.pro | 2 +- 5 files changed, 108 insertions(+), 7 deletions(-) diff --git a/cpfiledir.cpp b/cpfiledir.cpp index 8cd3586..4238ef2 100644 --- a/cpfiledir.cpp +++ b/cpfiledir.cpp @@ -11,9 +11,9 @@ #include #include "cpio.h" -//****************************************************** -//* Конструктор класса хранилища файлов -//****************************************************** +//******************************************************************** +//* Конструктор класса хранилища файлов - добавление из cpio-потока +//******************************************************************** cpfiledir::cpfiledir(uint8_t* iptr) { phdr=new cpio_header_t; @@ -32,6 +32,27 @@ memcpy(fimage,iptr+sizeof(cpio_header_t)+nsz,fsz); } +//******************************************************************** +//* Конструктор для добавления файлов со стороны +//******************************************************************** +cpfiledir::cpfiledir(cpio_header_t* header, uint8_t* fname, uint8_t* data) { + +phdr=new cpio_header_t; + +memcpy(phdr,header,sizeof(cpio_header_t)); // копируем себе заголовок +int nsz=nsize(); +volatile int fsz=fsize(); + +// имя файла +filename=new char[nsz]; +memcpy(filename,fname,nsz); + +// тело файла +if (fsz != 0) fimage=new char[fsz]; +memcpy(fimage,data,fsz); +} + + //****************************************************** //* Деструктор класса хранилища файлов //****************************************************** diff --git a/cpfiledir.h b/cpfiledir.h index e00400b..191483c 100644 --- a/cpfiledir.h +++ b/cpfiledir.h @@ -71,6 +71,7 @@ class cpfiledir { public: cpfiledir(uint8_t* hdr); + cpfiledir(cpio_header_t* header, uint8_t* fname, uint8_t* data); ~cpfiledir(); QList* subdir=0; // ссылка на контейнер поддиректории @@ -104,4 +105,4 @@ int find_file(QString name, QList* dir); uint32_t cpio_load_file(uint8_t* iptr, QList* dir, int plen, char* fname); uint32_t fullsize(QList* root); -#endif \ No newline at end of file +#endif diff --git a/cpio.cpp b/cpio.cpp index 26dc9f3..4e4d94e 100644 --- a/cpio.cpp +++ b/cpio.cpp @@ -48,6 +48,8 @@ menu_edit->addAction(QIcon::fromTheme("edit-delete"),"Удалить файл",t menu_edit->addAction(QIcon(":/icon_hex.png"),"HEX-просмотр/редактор",this,SLOT(hexedit_file()),QKeySequence("F2")); menu_edit->addAction(QIcon(":/icon_view.png"),"Текстовый просмотр",this,SLOT(view_file()),QKeySequence("F3")); menu_edit->addAction(QIcon(":/icon_edit.png"),"Текстовый редактор",this,SLOT(edit_file()),QKeySequence("F4")); +menu_edit->addAction(QIcon::fromTheme("list-add"),"Добавить новый файл",this,SLOT(add_file()),QKeySequence("+")); +menu_edit->addSeparator(); menu_edit->addAction(QIcon::fromTheme("file-save"),"Сохранить изменения",this,SLOT(saveall()),QKeySequence("Ctrl+S")); // Пункты тулбара @@ -58,6 +60,8 @@ toolbar->addAction(QIcon::fromTheme("edit-delete"),"Удалить файл",thi toolbar->addAction(QIcon(":/icon_hex.png"),"HEX-просмотр/редактор",this,SLOT(hexedit_file())); toolbar->addAction(QIcon(":/icon_view.png"),"Текстовый просмотр",this,SLOT(view_file())); toolbar->addAction(QIcon(":/icon_edit.png"),"Текстовый редактор",this,SLOT(edit_file())); +toolbar->addSeparator(); +toolbar->addAction(QIcon::fromTheme("list-add"),"Добавить новый файл",this,SLOT(add_file())); toolbar->setEnabled(false); // закрываем доступ к меню menu_edit->setEnabled(false); @@ -492,4 +496,78 @@ pdata=ndata; plen=nlen; } - +//********************************************************************* +//* Добавление нового файла +//********************************************************************* +void cpioedit::add_file() { + +cpfiledir* fd; +QString fn; +uint32_t fsize; +uint8_t* fbuf=0; +uint8_t filename[100]; +char str[10]; + +// эмуляция заголовка cpio +cpio_header_t hdr; +// заполняем константы заголовка +memset(&hdr,'0',sizeof(hdr)); +memcpy(hdr.c_magic,"070701",6); +memcpy(hdr.c_mode,"000081B4",8); + +fn=QFileDialog::getOpenFileName(this,"Добавление нового файла",fn,"All files (*.*)"); +if (fn.isEmpty()) return; + +QFile in(fn,this); +if (!in.open(QIODevice::ReadOnly)) { + QMessageBox::critical(0,"Ошибка","Ошибка чтения файла"); + return; +} +fsize=in.size(); +if (fsize != 0) { + fbuf=new uint8_t[fsize]; // файловый буфер + // читаем весь файл в буфер + in.read((char*)fbuf,fsize); +} + +// Получаем информацию о файле +QFileInfo fi=QFileInfo(in); +// дата-время +sprintf(str,"%08x",fi.created().toSecsSinceEpoch()&0xffffffff); +memcpy(hdr.c_mtime,str,8); +// gid +sprintf(str,"%08x",fi.groupId()); +memcpy(hdr.c_gid,str,8); +// uid +sprintf(str,"%08x",fi.ownerId()); +memcpy(hdr.c_uid,str,8); +// атрибуты +uint32_t attr=fi.permissions()&0xfff; +attr=(attr&7) | ((attr&0xf0)>>1) | ((attr&0xf00)>>2); // преобразуем из формата QT в нормальный юниксовый +attr|=0x8000; // поднимаем флаг регулярного файла //81b4 1000 000 110 110 100 6644 110 0110 0100 0100 +//printf("\n attr = %08x\n",fi.permissions()); +sprintf(str,"%08x",attr); +memcpy(hdr.c_mode,str,8); +// имя файла +fn=fi.fileName(); +sprintf(str,"%08x",fn.size()+1); // длина имени файла +memcpy(hdr.c_namesize,str,8); +memcpy(filename,fn.toLocal8Bit().data(),fn.size()+1); // имя файла +// размер файла +sprintf(str,"%08x",fsize); +memcpy(hdr.c_filesize,str,8); + +// файл больше не нужен +in.close(); + +// создаем ноую запись о файле +fd=new cpfiledir(&hdr, filename, fbuf); +if (fbuf != 0) delete [] fbuf; + +// добавляем файл в текущий каталог +currentdir->append(fd); +cpio_hide_dir(); +cpio_show_dir(currentdir,true); + +} + diff --git a/cpio.h b/cpio.h index 2e98ad5..5b95325 100644 --- a/cpio.h +++ b/cpio.h @@ -61,6 +61,7 @@ void replace_file(); // замена файлов void delete_file(); // удаление файлов void view_file(); // просмотр void edit_file(); // просмотр +void add_file(); // добавить новый файл void hexedit_file(); // hex-просмотр/редактор void setModified() {is_modified=true;} // установка признака модификации содержимого архива void saveall(); @@ -69,4 +70,4 @@ void go_up(); }; -#endif \ No newline at end of file +#endif diff --git a/qhuaweiflash.pro b/qhuaweiflash.pro index d5d713f..7fa6bee 100644 --- a/qhuaweiflash.pro +++ b/qhuaweiflash.pro @@ -7,7 +7,7 @@ TARGET = qhuaweiflash INCLUDEPATH += . QT += widgets -QMAKE_CXXFLAGS += -Wno-unused-result -std=c++11 -g -Wno-write-strings +QMAKE_CXXFLAGS += -Wno-unused-result -std=c++11 -g -Wno-write-strings -fpermissive #QMAKE_LFLAGS += -static # Input HEADERS += MainWindow.h sio.h ptable.h usbloader.h fwsave.h signver.h parts.h cpfiledir.h \