Commit e467968c authored by Mati's avatar Mati

Imported Upstream version 0.7.1

parents
[General]
DebuggerCmdStr=
DriverName=GDB
FileVersion=1
OptionsSelected=
ProgramArgs=cfg=./guymager.cfg SignalHandling=off
TTYLevel=7
WorkingDirectory=
[Memory]
ColumnWidths=80,0
NumExprs=0
[Watches]
Expr0=pDlgAcquireRule
Expr1=pLineEdit
Expr2=pLineEditDest
Expr3=pDlgAcquireFields
Expr4=i
Expr5=Row
[Buildset]
BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x00)
[MakeBuilder]
Abort on First Error=false
Number Of Jobs=7
[Project]
VersionControlSupport=kdevsubversion
This diff is collapsed.
Joachim Metz <jbmetz at users.sourceforge.net>
Guymager uses Joachim's libewf for writing EWF image files. Without
Joachim's work on the EWF format, the Guymager project would probably
never have been started. Special thanks to Joachim as well for
believing in the idea of parallelised compression and adding the
necessary extra functions to libewf for Guymager.
Michael Prokop <mika at debian.org>
Mika took care of correctly packaging Guymager and making it available in
the main repositories. Without him, the Guymager installation would have
remained the nightmare it was before. As well, many thanks to Mika for his
patience while answering my numerous questions about copyright and his
suggestions for giving the sources a GPL compliant shape.
Erwin van Eijk <erwin.van.eijk at gmail.com>
Erwin not only had many good ideas for new Guymager features, but also
directly put them into working code which he shared in his feedbacks. Among
others, the job queue, the user field and the running statistics are based
on Erwin's work and ideas. Many thanks for this and for supporting the
spirit of open source.
Wilhelm Spiegl
Software is only as good as it has been tested. Willi always played an
important role in this. Many thanks for his persistent testing and
detailed problem documentation. If Guymager is said to be stable
and user friendly it's because of Willi's unwearied work.
This diff is collapsed.
// ****************************************************************************
// Project: GUYMAGER
// ****************************************************************************
// Programmer: Guy Voncken
// Police Grand-Ducale
// Service de Police Judiciaire
// Section Nouvelles Technologies
// ****************************************************************************
// Module: Multithreaded AFF (AAFF = Advanced AFF)
// ****************************************************************************
// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Guy Voncken
//
// This file is part of guymager.
//
// guymager is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// guymager is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with guymager. If not, see <http://www.gnu.org/licenses/>.
#ifndef __AAFF_H__
#define __AAFF_H__
#include "hash.h"
typedef struct _t_Aaff *t_pAaff;
typedef struct
{
bool Zero; // Tells AaffWrite that all data is 0
bool Compressed; // Tells AaffWrite whether the data should be written compressed or uncompressed
int DataLenOut; // If Compressed is true: The size of the compressed data
} t_AaffPreprocess, *t_pAaffPreprocess;
#define AAFF_SEGNAME_COMMAND_LINE "acquisition_commandline"
#define AAFF_SEGNAME_MACADDR "acquisition_macaddr"
#define AAFF_SEGNAME_DATE "acquisition_date" // Format: YYYY-MM-DD HH:MM:SS TZT
#define AAFF_SEGNAME_DEVICE "acquisition_device"
#define AAFF_SEGNAME_MODEL "device_model"
#define AAFF_SEGNAME_SN "device_sn"
// ------------------------------------
// Functions
// ------------------------------------
// Write access functions
APIRET AaffOpen (t_pAaff *ppAaff, const char *pFilename, unsigned long long DeviceSize, unsigned int SectorSize, unsigned int PageSize);
APIRET AaffPreprocess (t_pAaffPreprocess pPreprocess, unsigned char *pDataIn, unsigned int DataLenIn, unsigned char *pDataOut, unsigned int DataLenOut);
APIRET AaffWrite (t_pAaff pAaff, t_pAaffPreprocess pPreprocess, const unsigned char *pData, unsigned int DataLen);
APIRET AaffClose (t_pAaff *ppAaff, unsigned long long BadSectors, const unsigned char *pMD5, const unsigned char *pSHA1, const unsigned char *pSHA256, uint Duration);
// Read access functions
APIRET AaffOpen (t_pAaff *ppAaff, const char *pFilename, unsigned long long DeviceSize);
APIRET AaffReadNextPage (t_pAaff pAaff, unsigned char *pData, unsigned int *pDataLen, QString *pImageFilename, t_pHashMD5Digest pMD5Digest, bool *pMD5valid);
APIRET AaffClose (t_pAaff *ppAaff);
APIRET AaffWriteSegmentStr (t_pAaff pAaff, const char *pName, unsigned int Argument, const char *pStr);
APIRET AaffCopyBadSectorMarker (unsigned char *pBuffer, unsigned int Len);
// Misc. functions
unsigned int AaffPreprocessExtraSpace (unsigned int FifoBlockSize);
APIRET AaffInit (void);
APIRET AaffDeInit (void);
// ------------------------------------
// Error codes
// ------------------------------------
enum
{
ERROR_AAFF_CANNOT_CLOSE_FILE = ERROR_BASE_AAFF + 1,
ERROR_AAFF_CANNOT_CREATE_FILE,
ERROR_AAFF_CANNOT_FLUSH_FILE,
ERROR_AAFF_CANNOT_OPEN_FILE,
ERROR_AAFF_CANNOT_READ_DATA,
ERROR_AAFF_CANNOT_SEEK,
ERROR_AAFF_CANNOT_WRITE_FILE,
ERROR_AAFF_INVALID_FOOTER,
ERROR_AAFF_INVALID_HEADER,
ERROR_AAFF_INVALID_PAGE_ARGUMENT,
ERROR_AAFF_INVALID_PAGE_NUMBER,
ERROR_AAFF_INVALID_PAGE_ORDER,
ERROR_AAFF_INVALID_SEGMENTLEN,
ERROR_AAFF_INVALID_SEGMENT_NAME,
ERROR_AAFF_INVALID_SIGNATURE,
ERROR_AAFF_MEMALLOC_FAILED,
ERROR_AAFF_PAGE_LARGER_THAN_BUFFER,
ERROR_AAFF_SECTORSIZE_TOO_BIG,
ERROR_AAFF_UNCOMPRESS_FAILED
};
#endif
This diff is collapsed.
// ****************************************************************************
// Project: GUYMAGER
// ****************************************************************************
// Programmer: Guy Voncken
// Police Grand-Ducale
// Service de Police Judiciaire
// Section Nouvelles Technologies
// ****************************************************************************
// Module: Multithreaded AEWF (AEWF = Advanced EWF)
// ****************************************************************************
// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Guy Voncken
//
// This file is part of guymager.
//
// guymager is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// guymager is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with guymager. If not, see <http://www.gnu.org/licenses/>.
#ifndef __AEWF_H__
#define __AEWF_H__
#include "hash.h"
class t_Aewf;
typedef t_Aewf *t_pAewf;
typedef struct
{
bool Compressed; // Tells AewfWrite whether the data should be written compressed or uncompressed
int DataLenOut; // If Compressed - is true: The size of the compressed data
// - is false: The size of the original data + size of CRC
} t_AewfPreprocess, *t_pAewfPreprocess;
typedef enum
{
AEWF_MEDIATYPE_REMOVABLE = 0x00,
AEWF_MEDIATYPE_FIXED = 0x01,
AEWF_MEDIATYPE_OPTICAL = 0x03
} t_AewfMediaType;
typedef enum
{
AEWF_MEDIAFLAGS_IMAGE = 0x01,
AEWF_MEDIAFLAGS_PHYSICAL = 0x02,
AEWF_MEDIAFLAGS_FASTBLOCK_USED = 0x04,
AEWF_MEDIAFLAGS_TABLEAU_USED = 0x08
} t_AewfMediaFlags;
// ------------------------------------
// Functions
// ------------------------------------
// Write access functions
// ----------------------
APIRET AewfOpen (t_pAewf *ppAewf, const char *pFilename,
quint64 DeviceSize, quint64 SegmentSize,
uint ChunkSize , uint SectorSize,
t_AewfMediaType MediaType,
t_AewfMediaFlags MediaFlags,
QString Description, QString CaseNumber, QString EvidenceNumber, QString Examiner,
QString Notes, QString DeviceModel, QString SerialNumber, QString ImagerVersion,
QString OSVersion);
APIRET AewfPreprocess ( t_pAewfPreprocess pPreprocess, uchar *pDataIn, uint DataLenIn, uchar *pDataOut, uint DataLenOut);
APIRET AewfWrite (t_pAewf pAewf, t_pAewfPreprocess pPreprocess, const uchar *pData, uint DataLen);
APIRET AewfClose (t_pAewf *ppAewf, QList<quint64> &BadSectors, const uchar *pMD5, const uchar *pSHA1, const uchar *pSHA256);
// Read access functions
// ---------------------
APIRET AewfOpen (t_pAewf *ppAewf, const char *pFilename);
APIRET AewfReadNextChunk (t_pAewf pAewf, uchar *pData, uint *pDataLen, QString *pSegmentFilename, t_pHashMD5Digest pMD5, bool *pMD5valid, bool *pFinished);
APIRET AewfClose (t_pAewf *ppAewf);
// Misc. functions
// ---------------
uint AewfPreprocessExtraSpace (uint FifoBlockSize);
APIRET AewfInit (void);
APIRET AewfDeInit (void);
// ------------------------------------
// Error codes
// ------------------------------------
enum
{
ERROR_AEWF_MEMALLOC_FAILED = ERROR_BASE_AEWF + 1,
ERROR_AEWF_CANNOT_CREATE_FILE,
ERROR_AEWF_CANNOT_WRITE_FILE,
ERROR_AEWF_ANOTHER_FILE_STILL_OPEN,
ERROR_AEWF_NO_FILE_OPEN,
ERROR_AEWF_CANNOT_FLUSH_FILE,
ERROR_AEWF_CANNOT_CLOSE_FILE,
ERROR_AEWF_INVALID_COMPRESSION_LEVEL,
ERROR_AEWF_COMPRESSION_FAILED,
ERROR_AEWF_CANNOT_SEEK,
ERROR_AEWF_CANNOT_OPEN_FILE,
ERROR_AEWF_TABLE_CORRUPT,
ERROR_AEWF_VERIFY_BUFFER_TOO_SMALL,
ERROR_AEWF_CANNOT_READ_DATA,
ERROR_AEWF_DATA_CRC_ERROR,
ERROR_AEWF_UNCOMPRESS_FAILED,
ERROR_AEWF_UNCOMPRESS_ZEROBLOCK_FAILED,
ERROR_AEWF_WRONG_SEGMENT_NUMBER,
ERROR_AEWF_WRONG_SECTION_CRC,
ERROR_AEWF_ENDING_SECTION_MISSING,
ERROR_AEWF_EXPECTED_SECTION_TABLE,
ERROR_AEWF_TABLE_WRONG_CRC1,
ERROR_AEWF_TABLE_WRONG_CRC2,
ERROR_AEWF_TOO_MANY_TABLE_OFFSETS,
ERROR_AEWF_DATA_FOLLOWING_LAST_SECTION,
ERROR_AEWF_WRONG_SECTION_LENGTH,
ERROR_AEWF_INVALID_EWFNAMING
};
#endif
This diff is collapsed.
// ****************************************************************************
// Project: GUYMAGER
// ****************************************************************************
// Programmer: Guy Voncken
// Police Grand-Ducale
// Service de Police Judiciaire
// Section Nouvelles Technologies
// ****************************************************************************
// Module: Standard include file
// ****************************************************************************
// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Guy Voncken
//
// This file is part of guymager.
//
// guymager is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// guymager is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with guymager. If not, see <http://www.gnu.org/licenses/>.
#ifdef LINT_CODE_CHECK
#include "macros_for_lint.h"
#endif
#ifndef __COMMON_H__
#define __COMMON_H__
//#define USE_MD5_FROM_OPENSSL
//#define USE_SHA256_FROM_OPENSSL
// GNU C lib definitions
// ---------------------
#ifndef _LARGEFILE_SOURCE
#define _LARGEFILE_SOURCE 1
#endif
#ifndef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 64
#endif
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#ifndef _THREAD_SAFE
#define _THREAD_SAFE 1
#endif
#ifndef _STDIO_H
#include <stdio.h>
#endif
#include <limits.h>
#include "toolglobalid.h"
#include "toolerror.h"
#include "toollog.h"
#include "tooltypes.h"
#include "modules.h"
#include "error.h"
#define QSTR_TO_PSZ(QStr) (QStr).toAscii().constData()
extern void *pOffsetOfNullPointer;
#define OFFSET_OF(Type, Element) \
((unsigned int) &(((Type*)pOffsetOfNullPointer)->Element))
class t_Device; // As t_Device is the core structure of guymager and as it is needed
typedef t_Device *t_pDevice; // all the time, it is easiest to declare it here (eventhough I don't
typedef t_Device const *t_pcDevice; // like that style too much, but we won't change C++ at this time).
class t_Acquisition;
typedef t_Acquisition *t_pAcquisition;
typedef t_Acquisition const *t_pcAcquisition;
#define EWF_MULTITHREADED_COMPRESSION_CHUNK_SIZE 32768
const unsigned long long BYTES_PER_MiB = 1ULL << 20;
const unsigned long long BYTES_PER_GiB = 1ULL << 30;
const unsigned long long BYTES_PER_TiB = 1ULL << 40;
const unsigned long long BYTES_PER_PiB = 1ULL << 50;
const unsigned long long BYTES_PER_EiB = 1ULL << 60;
const unsigned long long EWF_MIN_SEGMENT_SIZE = 20 * BYTES_PER_MiB;
const unsigned long long EWF_MAX_SEGMENT_SIZE = 2047 * BYTES_PER_MiB;
const unsigned long long EWF_MAX_SEGMENT_SIZE_EXT = LONG_LONG_MAX - 10 * BYTES_PER_PiB; // Let's keep some distance from the absolute maximum - just for safety.
#define GETMAX(a,b) ((a)>(b)?(a):(b))
#define GETMIN(a,b) ((a)<(b)?(a):(b))
typedef unsigned char t_uint8;
typedef unsigned short t_uint16;
typedef unsigned int t_uint32;
typedef unsigned long long t_uint64;
typedef char t_int8;
typedef short t_int16;
typedef int t_int32;
typedef long long t_int64;
#endif
// ****************************************************************************
// Project: GUYMAGER
// ****************************************************************************
// Programmer: Guy Voncken
// Police Grand-Ducale
// Service de Police Judiciaire
// Section Nouvelles Technologies
// ****************************************************************************
// This external constant allows other modules to access the compilation
// timestamp. The constant itself is instantiated in compileinfo.cpp which is
// generated automatically when calling make.
// See .pro file as well.
// ****************************************************************************
// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Guy Voncken
//
// This file is part of guymager.
//
// guymager is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// guymager is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with guymager. If not, see <http://www.gnu.org/licenses/>.
extern const char *pCompileInfoTimestamp;
extern const char *pCompileInfoVersion;
#!/bin/bash
echo '// Automatically generated file. See project file and compileinfo.sh for further information.'
date '+const char *pCompileInfoTimestamp = "%Y-%m-%d-%H.%M.%S";'
head -qn 1 changelog debian/changelog 2>/dev/null | awk '{
Version = $2
gsub ("\\(", "", Version)
gsub ("\\)", "", Version)
print "const char *pCompileInfoVersion = \"" Version "\";"}'
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
// ****************************************************************************
// Project: GUYMAGER
// ****************************************************************************
// Programmer: Guy Voncken
// Police Grand-Ducale
// Service de Police Judiciaire
// Section Nouvelles Technologies
// ****************************************************************************
// Module: Provides all information for displaying the DeviceList on
// screen
// ****************************************************************************
// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Guy Voncken
//
// This file is part of guymager.
//
// guymager is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// guymager is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with guymager. If not, see <http://www.gnu.org/licenses/>.
#ifndef __DEVICELISTMODEL_H__
#define __DEVICELISTMODEL_H__
#include <QObject>
#include <QList>
#include <QAbstractTableModel>
#include "device.h"
class t_DeviceListModel: public QAbstractTableModel
{
Q_OBJECT
public:
t_DeviceListModel ();
t_DeviceListModel (t_pDeviceList pDeviceList);
int rowCount (const QModelIndex & parent= QModelIndex()) const;
int columnCount (const QModelIndex & parent= QModelIndex()) const;
QVariant data (const QModelIndex &Index, int Role) const;
QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
public slots:
void SlotRefresh (void);
// void SlotUpdate (void);
public:
typedef QVariant (* t_pGetDataFn) (t_pDevice pDevice);
private:
enum
{
DATATYPE_QSTRING,
DATATYPE_INT32,
DATATYPE_INT64,
DATATYPE_DEVICE_STATE,
DATATYPE_ACQUIRE_STATE,
};
typedef struct
{
QString Name; // The column name as displayed in the table header
t_pGetDataFn pGetDataFn;
int DisplayType; // One of the display type as defined in t_ItemDelegate
int Alignment; // Use Qt::AlignLeft, Qt::AlignRight, ...
int MinWidth; // Set to 0 for default width
} t_ColAssoc;
QList<t_ColAssoc> ColAssocList;
t_pDeviceList poDeviceList;
};
#endif
// ****************************************************************************
// Project: GUYMAGER
// ****************************************************************************
// Programmer: Guy Voncken
// Police Grand-Ducale
// Service de Police Judiciaire
// Section Nouvelles Technologies
// ****************************************************************************
// Module: Dialog that is opened when aborting an acquisition
// ****************************************************************************
// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Guy Voncken
//
// This file is part of guymager.
//
// guymager is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// guymager is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with guymager. If not, see <http://www.gnu.org/licenses/>.
#include "dlgabort.h"
#include "config.h"
#include "qtutil.h"
// -----------------------------
// Constants
// -----------------------------
// -----------------------------
// Classes
// -----------------------------
class t_DlgAbortLocal
{
public:
QCheckBox *pCheckBoxDelete;
};
t_DlgAbort::t_DlgAbort (void)
{
CHK_EXIT (ERROR_DLGABORT_CONSTRUCTOR_NOT_SUPPORTED)
} //lint !e1401 pOwn not initialised
t_DlgAbort::t_DlgAbort (t_pcDevice pDevice, QWidget *pParent, Qt::WFlags Flags)
:QDialog (pParent, Flags)
{
static bool Initialised = false;
QString Text;
bool Acquisition;
if (!Initialised)
{
CHK_EXIT (TOOL_ERROR_REGISTER_CODE (ERROR_DLGABORT_CONSTRUCTOR_NOT_SUPPORTED))
Initialised = true;
}
QTUTIL_SET_FONT (this, FONTOBJECT_MESSAGE_DIALOGS)
pOwn = new t_DlgAbortLocal;
pOwn->pCheckBoxDelete = NULL;
Acquisition = ((pDevice->GetState() == t_Device::Acquire) ||
(pDevice->GetState() == t_Device::AcquirePaused) ||
(pDevice->GetState() == t_Device::Queued));
if (Acquisition)
Text = tr ("Do you want to abort the acquisition of %1?" ) .arg(pDevice->LinuxDevice);
else Text = tr ("Do you want to abort the verification of %1?") .arg(pDevice->LinuxDevice);
QVBoxLayout *pMainLayout = new QVBoxLayout ();
QHBoxLayout *pButtonLayout= new QHBoxLayout ();
QLabel *pLabel = new QLabel (Text, this);
QPushButton *pButtonOk = new QPushButton (QObject::tr("Ok" ), this);
QPushButton *pButtonCancel= new QPushButton (QObject::tr("Cancel"), this);
if (!pDevice->Acquisition1.Clone)
{
pOwn->pCheckBoxDelete = new QCheckBox (tr("Delete partial image files"), this);
pOwn->pCheckBoxDelete->setChecked (Acquisition);
}
pMainLayout->addWidget (pLabel);
if (pOwn->pCheckBoxDelete)
pMainLayout->addWidget (pOwn->pCheckBoxDelete);
pMainLayout->addLayout (pButtonLayout);
pButtonLayout->addWidget (pButtonOk);
pButtonLayout->addWidget (pButtonCancel);
setLayout (pMainLayout);
setWindowTitle (tr("Abort?", "Dialog title"));
CHK_QT_EXIT (connect (pButtonOk , SIGNAL (released()), this, SLOT(accept())))
CHK_QT_EXIT (connect (pButtonCancel, SIGNAL (released()), this, SLOT(reject())))
}
t_DlgAbort::~t_DlgAbort ()
{
delete pOwn;
}
APIRET t_DlgAbort::Show (t_pcDevice pDevice, bool &Abort, bool &Delete)
{
t_DlgAbort *pDlg;
int Result;
pDlg = new t_DlgAbort (pDevice);
pDlg->setModal (true);
Result = pDlg->exec();
Abort = (Result == QDialog::Accepted);
if (pDlg->pOwn->pCheckBoxDelete)
Delete = (Abort && pDlg->pOwn->pCheckBoxDelete->isChecked());
else Delete = false;
delete pDlg;
return NO_ERROR;
}
// ****************************************************************************
// Project: GUYMAGER
// ****************************************************************************
// Programmer: Guy Voncken
// Police Grand-Ducale
// Service de Police Judiciaire
// Section Nouvelles Technologies
// ****************************************************************************
// Module: Dialog that is opened when aborting an acquisition
// ****************************************************************************
// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Guy Voncken
//
// This file is part of guymager.
//
// guymager is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// guymager is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with guymager. If not, see <http://www.gnu.org/licenses/>.
#ifndef __DLGABORT_H__
#define __DLGABORT_H__
#include <QtGui> //lint !e537 Repeated include
#ifndef __COMMON_H__
#include "common.h"
#endif
#ifndef __DEVICE_H__
#include "device.h"
#endif