2013-10-15 23:19:15 +08:00
|
|
|
/* ffsengine.h
|
|
|
|
|
|
|
|
Copyright (c) 2013, Nikolaj Schlej. All rights reserved.
|
|
|
|
This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHWARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __FFSENGINE_H__
|
|
|
|
#define __FFSENGINE_H__
|
|
|
|
|
|
|
|
#include <QObject>
|
|
|
|
#include <QModelIndex>
|
|
|
|
#include <QByteArray>
|
2013-11-07 21:46:28 +08:00
|
|
|
#include <QQueue>
|
2013-10-15 23:19:15 +08:00
|
|
|
|
|
|
|
#include "basetypes.h"
|
2013-11-07 21:46:28 +08:00
|
|
|
#include "treeitem.h"
|
2013-10-15 23:19:15 +08:00
|
|
|
#include "treemodel.h"
|
2013-11-17 17:01:11 +08:00
|
|
|
#include "messagelistitem.h"
|
2013-10-15 23:19:15 +08:00
|
|
|
|
|
|
|
class TreeModel;
|
|
|
|
|
|
|
|
class FfsEngine : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
2013-11-07 21:46:28 +08:00
|
|
|
// Default constructor and destructor
|
2013-10-15 23:19:15 +08:00
|
|
|
FfsEngine(QObject *parent = 0);
|
|
|
|
~FfsEngine(void);
|
2013-11-15 18:48:14 +08:00
|
|
|
|
2013-11-07 21:46:28 +08:00
|
|
|
// Returns model for Qt view classes
|
2013-10-15 23:19:15 +08:00
|
|
|
TreeModel* model() const;
|
2013-11-15 18:48:14 +08:00
|
|
|
|
2013-11-17 17:01:11 +08:00
|
|
|
// Returns message items queue
|
2013-11-17 19:13:37 +08:00
|
|
|
QQueue<MessageListItem> message();
|
2013-10-15 23:19:15 +08:00
|
|
|
|
2013-11-07 21:46:28 +08:00
|
|
|
// Firmware image parsing
|
2013-10-15 23:19:15 +08:00
|
|
|
UINT8 parseInputFile(const QByteArray & buffer);
|
2013-11-16 17:50:13 +08:00
|
|
|
UINT8 parseIntelImage(const QByteArray & flashImage, const QModelIndex & parent = QModelIndex());
|
|
|
|
UINT8 parseGbeRegion(const QByteArray & gbe, const QModelIndex & parent = QModelIndex());
|
|
|
|
UINT8 parseMeRegion(const QByteArray & me, const QModelIndex & parent = QModelIndex());
|
|
|
|
UINT8 parseBiosRegion(const QByteArray & bios, const QModelIndex & parent = QModelIndex());
|
|
|
|
UINT8 parsePdrRegion(const QByteArray & pdr, const QModelIndex & parent = QModelIndex());
|
2013-10-15 23:19:15 +08:00
|
|
|
UINT8 parseBios(const QByteArray & bios, const QModelIndex & parent = QModelIndex());
|
2013-11-07 21:46:28 +08:00
|
|
|
UINT8 findNextVolume(const QByteArray & bios, const UINT32 volumeOffset, UINT32 & nextVolumeOffset);
|
|
|
|
UINT8 getVolumeSize(const QByteArray & bios, const UINT32 volumeOffset, UINT32 & volumeSize);
|
2013-11-14 18:40:39 +08:00
|
|
|
UINT8 parseVolume(const QByteArray & volume, const QModelIndex & parent = QModelIndex(), const UINT8 mode = INSERT_MODE_APPEND);
|
2013-11-07 21:46:28 +08:00
|
|
|
UINT8 getFileSize(const QByteArray & volume, const UINT32 fileOffset, UINT32 & fileSize);
|
2013-11-18 23:23:59 +08:00
|
|
|
UINT8 parseFile(const QByteArray & file, const UINT8 revision, const UINT8 erasePolarity = ERASE_POLARITY_UNKNOWN, const QModelIndex & parent = QModelIndex(), const UINT8 mode = INSERT_MODE_APPEND);
|
2013-11-07 21:46:28 +08:00
|
|
|
UINT8 getSectionSize(const QByteArray & file, const UINT32 sectionOffset, UINT32 & sectionSize);
|
2013-11-18 23:23:59 +08:00
|
|
|
UINT8 parseSections(const QByteArray & body, const QModelIndex & parent = QModelIndex());
|
|
|
|
UINT8 parseSection(const QByteArray & section, const QModelIndex & parent = QModelIndex(), const UINT8 mode = INSERT_MODE_APPEND);
|
2013-10-15 23:19:15 +08:00
|
|
|
|
2013-11-07 21:46:28 +08:00
|
|
|
// Compression routines
|
2013-11-14 18:40:39 +08:00
|
|
|
UINT8 decompress(const QByteArray & compressed, const UINT8 compressionType, QByteArray & decompressedData, UINT8 * algorithm = NULL);
|
2013-11-07 21:46:28 +08:00
|
|
|
UINT8 compress(const QByteArray & data, const UINT8 algorithm, QByteArray & compressedData);
|
|
|
|
|
|
|
|
// Construction routines
|
|
|
|
UINT8 reconstructImage(QByteArray & reconstructed);
|
2013-11-18 23:23:59 +08:00
|
|
|
UINT8 constructPadFile(const UINT32 size, const UINT8 revision, const UINT8 erasePolarity, QByteArray & pad);
|
|
|
|
UINT8 reconstruct(const QModelIndex & index, QQueue<QByteArray> & queue, const UINT8 revision = 2, const UINT8 erasePolarity = ERASE_POLARITY_UNKNOWN);
|
2013-11-15 18:48:14 +08:00
|
|
|
UINT8 growVolume(QByteArray & header, const UINT32 size, UINT32 & newSize);
|
|
|
|
|
2013-11-07 21:46:28 +08:00
|
|
|
// Operations on tree items
|
2013-11-17 17:01:11 +08:00
|
|
|
UINT8 extract(const QModelIndex & index, QByteArray & extracted, const UINT8 mode);
|
|
|
|
UINT8 insert(const QModelIndex & index, const QByteArray & object, const UINT8 objectType, const UINT8 mode);
|
2013-11-07 21:46:28 +08:00
|
|
|
UINT8 remove(const QModelIndex & index);
|
2013-11-18 23:23:59 +08:00
|
|
|
UINT8 rebuild(const QModelIndex & index);
|
|
|
|
UINT8 changeCompression(const QModelIndex & index, const UINT8 algorithm);
|
2013-10-15 23:19:15 +08:00
|
|
|
|
|
|
|
private:
|
2013-11-07 21:46:28 +08:00
|
|
|
TreeItem *rootItem;
|
2013-10-15 23:19:15 +08:00
|
|
|
TreeModel *treeModel;
|
2013-11-17 17:01:11 +08:00
|
|
|
|
|
|
|
// Message helper
|
2013-11-17 19:13:37 +08:00
|
|
|
QQueue<MessageListItem> messageItems;
|
2013-11-15 18:48:14 +08:00
|
|
|
void msg(const QString & message, const QModelIndex index = QModelIndex());
|
2013-11-17 17:01:11 +08:00
|
|
|
|
|
|
|
// Internal operations
|
|
|
|
QModelIndex findParentOfType(UINT8 type, const QModelIndex & index) const;
|
|
|
|
bool hasIntersection(const UINT32 begin1, const UINT32 end1, const UINT32 begin2, const UINT32 end2);
|
2013-10-15 23:19:15 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|