154 lines
3.5 KiB
C++
154 lines
3.5 KiB
C++
/*******************************************************************************
|
|
* *
|
|
* Société de Transports de Montréal. *
|
|
* 2012 - 2013 *
|
|
* *
|
|
* Projet Zones Tests *
|
|
* *
|
|
* *
|
|
* *
|
|
*******************************************************************************/
|
|
/*
|
|
Description:
|
|
Cette classe vérifie constamment la présence de la clef USB et permet d'obtenir
|
|
le répertoire visé par la clef.
|
|
|
|
*/
|
|
|
|
/* ************************************************************************** */
|
|
/* Revision:
|
|
### YYYMMDD JFM
|
|
Verision d'origine.
|
|
|
|
### YYYYMMDD Description du besoin ou du bug
|
|
Description du changement.
|
|
*/
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#include "USBDriveInterface.h"
|
|
#ifndef WINDOWS_OS
|
|
#include <mntent.h>
|
|
#endif
|
|
#include "EngLog.h"
|
|
|
|
CUSBDriveInterface::CUSBDriveInterface()
|
|
{
|
|
|
|
mDriveDetected = false;
|
|
mDriveEmulationEnabled = false;
|
|
|
|
mDrivePresenceUpdateTimer = new QTimer();
|
|
mDrivePresenceUpdateTimer->setSingleShot(false);
|
|
mDrivePresenceUpdateTimer->setInterval(1000);
|
|
connect(mDrivePresenceUpdateTimer,SIGNAL(timeout()),this,SLOT(CheckDrivePresence()));
|
|
|
|
}
|
|
|
|
CUSBDriveInterface::~CUSBDriveInterface()
|
|
{
|
|
mDrivePresenceUpdateTimer->stop();
|
|
delete mDrivePresenceUpdateTimer;
|
|
}
|
|
|
|
unsigned int CUSBDriveInterface::Start()
|
|
{
|
|
mDrivePresenceUpdateTimer->start();
|
|
return RET_OK;
|
|
}
|
|
|
|
void CUSBDriveInterface::CheckDrivePresence()
|
|
{
|
|
if(mDriveEmulationEnabled == true)
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
#ifdef WINDOWS_OS
|
|
mDriveDetected = false;
|
|
#else
|
|
FILE* mtab = setmntent("/etc/mtab", "r");
|
|
struct mntent* m;
|
|
struct mntent mnt;
|
|
char strings[4096];
|
|
|
|
//parse the mounted drives list
|
|
while ((m = getmntent_r(mtab, &mnt, strings, sizeof(strings))))
|
|
{
|
|
if ((mnt.mnt_dir != NULL) /*&& (statfs(mnt.mnt_dir, &fs) == 0)*/)
|
|
{
|
|
QString type = (mnt.mnt_type);
|
|
|
|
//filter the "vfat" drive type (usb flash drive is vfat)
|
|
if(type == "vfat")
|
|
{
|
|
|
|
QString temp(mnt.mnt_dir);
|
|
if(temp.contains("/media/usb"))
|
|
{
|
|
if(mDriveDetected == false)
|
|
{
|
|
mDriveDetected = true;
|
|
mDrivePath = temp;
|
|
qDebug("Flash Detected: %s",mDrivePath.toAscii().data());
|
|
CEngLog::instance()->AddLogString("Clef USB détectée");
|
|
}
|
|
endmntent(mtab);
|
|
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if(mDriveDetected == true)
|
|
{
|
|
mDriveDetected = false;
|
|
mDrivePath.clear();
|
|
qDebug("Flash drive disconnected");
|
|
CEngLog::instance()->AddLogString("Clef USB débranchée");
|
|
}
|
|
endmntent(mtab);
|
|
|
|
#endif
|
|
}
|
|
}
|
|
|
|
QString CUSBDriveInterface::GetDrivePath()
|
|
{
|
|
return mDrivePath;
|
|
}
|
|
|
|
bool CUSBDriveInterface::IsDriveDetected()
|
|
{
|
|
return mDriveDetected;
|
|
}
|
|
|
|
unsigned int CUSBDriveInterface::EmulateDrivePresence(bool DrivePresent)
|
|
{
|
|
if(mDriveEmulationEnabled == false)
|
|
return RET_ERROR;
|
|
|
|
mDriveDetected = DrivePresent;
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
unsigned int CUSBDriveInterface::EnableDriveEmulation(bool Enabled)
|
|
{
|
|
mDriveEmulationEnabled = Enabled;
|
|
|
|
if(Enabled == true)
|
|
{
|
|
mDrivePath = ".";
|
|
}
|
|
else
|
|
{
|
|
mDriveDetected = false;
|
|
}
|
|
return RET_OK;
|
|
|
|
}
|