This commit is contained in:
DavidXanatos 2022-05-16 21:30:40 +02:00
parent b12128d10b
commit 24a13cc3b3
27 changed files with 483 additions and 133 deletions

View File

@ -69,7 +69,7 @@ void CSimpleListModel::Sync(QList<QVariantMap> List)
Changed = true; Changed = true;
ColValue.Raw = Value; ColValue.Raw = Value;
//ColValue.Formated = //ColValue.Formatted =
} }
if(State != Changed) if(State != Changed)
@ -195,7 +195,7 @@ QVariant CListItemModel::Data(const QModelIndex &index, int role, int section) c
case Qt::DisplayRole: case Qt::DisplayRole:
{ {
SListNode::SValue& Value = pNode->Values[section]; SListNode::SValue& Value = pNode->Values[section];
return Value.Formated.isValid() ? Value.Formated : Value.Raw; return Value.Formatted.isValid() ? Value.Formatted : Value.Raw;
} }
case Qt::EditRole: // sort role case Qt::EditRole: // sort role
{ {

View File

@ -56,7 +56,7 @@ protected:
struct SValue struct SValue
{ {
QVariant Raw; QVariant Raw;
QVariant Formated; QVariant Formatted;
}; };
QVector<SValue> Values; QVector<SValue> Values;
}; };

View File

@ -110,7 +110,7 @@ void CSimpleTreeModel::Sync(const QMap<QVariant, QVariantMap>& List)
Changed = true; Changed = true;
ColValue.Raw = Value; ColValue.Raw = Value;
//ColValue.Formated = //ColValue.Formatted =
} }
if(State != Changed) if(State != Changed)
@ -385,7 +385,7 @@ QVariant CTreeItemModel::NodeData(STreeNode* pNode, int role, int section) const
case Qt::DisplayRole: case Qt::DisplayRole:
{ {
STreeNode::SValue& Value = pNode->Values[section]; STreeNode::SValue& Value = pNode->Values[section];
return Value.Formated.isValid() ? Value.Formated : Value.Raw; return Value.Formatted.isValid() ? Value.Formatted : Value.Raw;
} }
case Qt::EditRole: // sort role case Qt::EditRole: // sort role
{ {

View File

@ -80,7 +80,7 @@ protected:
{ {
QVariant Raw; QVariant Raw;
QVariant SortKey; QVariant SortKey;
QVariant Formated; QVariant Formatted;
}; };
QVector<SValue> Values; QVector<SValue> Values;
}; };

View File

@ -106,7 +106,7 @@ CBoxBorder::CBoxBorder(CSbieAPI* pApi, QObject* parent) : QObject(parent)
SetLayeredWindowAttributes(m->BorderWnd, 0, 192, LWA_ALPHA); SetLayeredWindowAttributes(m->BorderWnd, 0, 192, LWA_ALPHA);
::ShowWindow(m->BorderWnd, SW_HIDE); ::ShowWindow(m->BorderWnd, SW_HIDE);
m_uTimerID = startTimer(10); m_uTimerID = startTimer(100);
} }
CBoxBorder::~CBoxBorder() CBoxBorder::~CBoxBorder()

View File

@ -119,6 +119,13 @@ void CSandBox::UpdateDetails()
{ {
} }
void CSandBox::SetBoxPaths(const QString& FilePath, const QString& RegPath, const QString& IpcPath)
{
m_FilePath = FilePath;
m_RegPath = RegPath;
m_IpcPath = IpcPath;
}
SB_STATUS CSandBox::RunStart(const QString& Command, bool Elevated) SB_STATUS CSandBox::RunStart(const QString& Command, bool Elevated)
{ {
#ifdef _DEBUG #ifdef _DEBUG
@ -140,7 +147,7 @@ SB_STATUS CSandBox::TerminateAll()
bool CSandBox::IsEmpty() const bool CSandBox::IsEmpty() const
{ {
return !QDir(m_FilePath).exists(); return !QFile::exists(m_FilePath);
} }
SB_PROGRESS CSandBox::CleanBox() SB_PROGRESS CSandBox::CleanBox()

View File

@ -42,6 +42,7 @@ public:
virtual void UpdateDetails(); virtual void UpdateDetails();
virtual void SetBoxPaths(const QString& FilePath, const QString& RegPath, const QString& IpcPath);
virtual QString GetFileRoot() const { return m_FilePath; } virtual QString GetFileRoot() const { return m_FilePath; }
virtual QString GetRegRoot() const { return m_RegPath; } virtual QString GetRegRoot() const { return m_RegPath; }
virtual QString GetIpcRoot() const { return m_IpcPath; } virtual QString GetIpcRoot() const { return m_IpcPath; }
@ -54,6 +55,7 @@ public:
virtual SB_STATUS RunSandboxed(const QString& Command); virtual SB_STATUS RunSandboxed(const QString& Command);
virtual SB_STATUS TerminateAll(); virtual SB_STATUS TerminateAll();
virtual void OpenBox() {}
virtual void CloseBox() {} virtual void CloseBox() {}
virtual bool IsEnabled() const { return m_IsEnabled; } virtual bool IsEnabled() const { return m_IsEnabled; }

View File

@ -129,7 +129,9 @@ CSbieAPI::CSbieAPI(QObject* parent) : QThread(parent)
m_pGlobalSection = new CSbieIni("GlobalSettings", this, this); m_pGlobalSection = new CSbieIni("GlobalSettings", this, this);
m_pUserSection = new CSbieIni("UserSettings", this, this); // dummy m_pUserSection = new CSbieIni("UserSettings", this, this); // dummy
m_IniReLoad = false;
m_bReloadPending = false; m_bReloadPending = false;
m_bBoxesDirty = false;
m_LastTraceEntry = 0; m_LastTraceEntry = 0;
@ -357,6 +359,7 @@ SB_STATUS CSbieAPI::Disconnect()
m_SandBoxes.clear(); m_SandBoxes.clear();
m_BoxedProxesses.clear(); m_BoxedProxesses.clear();
m_bBoxesDirty = true;
emit StatusChanged(); emit StatusChanged();
return SB_OK; return SB_OK;
@ -786,10 +789,12 @@ SB_STATUS CSbieAPI::TakeOver()
return SB_OK; return SB_OK;
} }
SB_STATUS CSbieAPI::WatchIni(bool bEnable) SB_STATUS CSbieAPI::WatchIni(bool bEnable, bool bReLoad)
{ {
if (bEnable) if (bEnable) {
m_IniWatcher.addPath(m_IniPath); m_IniWatcher.addPath(m_IniPath);
m_IniReLoad = bReLoad;
}
else else
m_IniWatcher.removePath(m_IniPath); m_IniWatcher.removePath(m_IniPath);
return SB_OK; return SB_OK;
@ -807,7 +812,9 @@ void CSbieAPI::OnIniChanged(const QString &path)
void CSbieAPI::OnReloadConfig() void CSbieAPI::OnReloadConfig()
{ {
m_bReloadPending = false; m_bReloadPending = false;
ReloadConfig(); m_bBoxesDirty = true;
if (m_IniReLoad)
ReloadConfig();
} }
typedef struct _FILE_FS_VOLUME_INFORMATION { typedef struct _FILE_FS_VOLUME_INFORMATION {
@ -1115,13 +1122,17 @@ quint32 CSbieAPI::GetSessionID() const
return m->sessionId; return m->sessionId;
} }
SB_STATUS CSbieAPI::ReloadBoxes(bool bFullUpdate) SB_STATUS CSbieAPI::ReloadBoxes(bool bForceUpdate)
{ {
if (bForceUpdate || (!m_bBoxesDirty && !m_IniWatcher.files().isEmpty()))
return SB_OK;
m_bBoxesDirty = false;
QMap<QString, CSandBoxPtr> OldSandBoxes = m_SandBoxes; QMap<QString, CSandBoxPtr> OldSandBoxes = m_SandBoxes;
for (int i = 0;;i++) for (int i = 0;;i++)
{ {
QString BoxName = SbieIniGet(QString(), QString(), (i | CONF_GET_NO_EXPAND)); QString BoxName = SbieIniGet(QString(), QString(), (i | CONF_GET_NO_EXPAND | CONF_GET_NO_TEMPLS));
if (BoxName.isNull()) if (BoxName.isNull())
break; break;
@ -1134,10 +1145,8 @@ SB_STATUS CSbieAPI::ReloadBoxes(bool bFullUpdate)
{ {
pBox = CSandBoxPtr(NewSandBox(BoxName, this)); pBox = CSandBoxPtr(NewSandBox(BoxName, this));
m_SandBoxes.insert(BoxName.toLower(), pBox); m_SandBoxes.insert(BoxName.toLower(), pBox);
UpdateBoxPaths(pBox);
} }
else if(bFullUpdate) UpdateBoxPaths(pBox);
UpdateBoxPaths(pBox);
pBox->m_IsEnabled = bIsEnabled; pBox->m_IsEnabled = bIsEnabled;
@ -1238,6 +1247,8 @@ void CSbieAPI::CommitIniChanges()
SbieIniSet("", "", ""); // commit and refresh SbieIniSet("", "", ""); // commit and refresh
if (bRemoved) m_IniWatcher.addPath(m_IniPath); if (bRemoved) m_IniWatcher.addPath(m_IniPath);
m_bBoxesDirty = true;
} }
QString CSbieAPI::SbieIniGetEx(const QString& Section, const QString& Setting) QString CSbieAPI::SbieIniGetEx(const QString& Section, const QString& Setting)
@ -1405,6 +1416,12 @@ SB_STATUS CSbieAPI::UpdateProcesses(bool bKeep, bool bAllSessions)
if (pBox.isNull()) if (pBox.isNull())
continue; continue;
if (pBox->m_ActiveProcessCount == 0) {
pBox->m_ActiveProcessCount = 1;
pBox->OpenBox();
emit BoxOpened(pBox->GetName());
}
pProcess->m_pBox = pBox.data(); pProcess->m_pBox = pBox.data();
pBox->m_ProcessList.insert(ProcessId, pProcess); pBox->m_ProcessList.insert(ProcessId, pProcess);
m_BoxedProxesses.insert(ProcessId, pProcess); m_BoxedProxesses.insert(ProcessId, pProcess);
@ -1569,9 +1586,11 @@ SB_STATUS CSbieAPI::UpdateBoxPaths(const CSandBoxPtr& pSandBox)
if (!Status) if (!Status)
return Status; return Status;
pSandBox->m_FilePath = Nt2DosPath(QString::fromWCharArray(FileRoot.c_str(), wcslen(FileRoot.c_str()))); QString FilePath = Nt2DosPath(QString::fromWCharArray(FileRoot.c_str(), wcslen(FileRoot.c_str())));
pSandBox->m_RegPath = QString::fromWCharArray(KeyRoot.c_str(), wcslen(KeyRoot.c_str())); QString RegPath = QString::fromWCharArray(KeyRoot.c_str(), wcslen(KeyRoot.c_str()));
pSandBox->m_IpcPath = QString::fromWCharArray(IpcRoot.c_str(), wcslen(IpcRoot.c_str())); QString IpcPath = QString::fromWCharArray(IpcRoot.c_str(), wcslen(IpcRoot.c_str()));
pSandBox->SetBoxPaths(FilePath, RegPath, IpcPath);
return SB_OK; return SB_OK;
} }
@ -2048,7 +2067,7 @@ SB_STATUS CSbieAPI::ReloadConf(quint32 flags, quint32 SessionId)
//emit LogMessage("Sandboxie config has been reloaded.", false); //emit LogMessage("Sandboxie config has been reloaded.", false);
emit LogSbieMessage(0, QStringList() << "Sandboxie config has been reloaded" << "" << "", 4); emit LogSbieMessage(0, QStringList() << "Sandboxie config has been reloaded" << "" << "", 4);
ReloadBoxes(true); m_bBoxesDirty = true;
return SB_OK; return SB_OK;
} }
@ -2318,6 +2337,12 @@ CBoxedProcessPtr CSbieAPI::OnProcessBoxed(quint32 ProcessId, const QString& Path
if (!pBox) if (!pBox)
return CBoxedProcessPtr(); return CBoxedProcessPtr();
if (pBox->m_ActiveProcessCount == 0) {
pBox->m_ActiveProcessCount = 1;
pBox->OpenBox();
emit BoxOpened(pBox->GetName());
}
pProcess = CBoxedProcessPtr(NewBoxedProcess(ProcessId, pBox.data())); pProcess = CBoxedProcessPtr(NewBoxedProcess(ProcessId, pBox.data()));
pBox->m_ProcessList.insert(ProcessId, pProcess); pBox->m_ProcessList.insert(ProcessId, pProcess);
m_BoxedProxesses.insert(ProcessId, pProcess); m_BoxedProxesses.insert(ProcessId, pProcess);

View File

@ -47,7 +47,7 @@ public:
virtual QString GetVersion(); virtual QString GetVersion();
virtual SB_STATUS TakeOver(); virtual SB_STATUS TakeOver();
virtual SB_STATUS WatchIni(bool bEnable = true); virtual SB_STATUS WatchIni(bool bEnable = true, bool bReLoad = true);
virtual QString GetSbiePath() const { return m_SbiePath; } virtual QString GetSbiePath() const { return m_SbiePath; }
virtual QString GetIniPath() const { return m_IniPath; } virtual QString GetIniPath() const { return m_IniPath; }
@ -57,7 +57,7 @@ public:
virtual void UpdateDriveLetters(); virtual void UpdateDriveLetters();
virtual QString Nt2DosPath(QString NtPath, bool* pOk = NULL) const; virtual QString Nt2DosPath(QString NtPath, bool* pOk = NULL) const;
virtual SB_STATUS ReloadBoxes(bool bFullUpdate = false); virtual SB_STATUS ReloadBoxes(bool bForceUpdate = false);
static SB_STATUS ValidateName(const QString& BoxName); static SB_STATUS ValidateName(const QString& BoxName);
virtual SB_STATUS CreateBox(const QString& BoxName, bool bReLoad = true); virtual SB_STATUS CreateBox(const QString& BoxName, bool bReLoad = true);
@ -158,6 +158,7 @@ signals:
void LogSbieMessage(quint32 MsgCode, const QStringList& MsgData, quint32 ProcessId); void LogSbieMessage(quint32 MsgCode, const QStringList& MsgData, quint32 ProcessId);
void ProcessBoxed(quint32 ProcessId, const QString& Path, const QString& Box, quint32 ParentId); void ProcessBoxed(quint32 ProcessId, const QString& Path, const QString& Box, quint32 ParentId);
void FileToRecover(const QString& BoxName, const QString& FilePath, const QString& BoxPath, quint32 ProcessId); void FileToRecover(const QString& BoxName, const QString& FilePath, const QString& BoxPath, quint32 ProcessId);
void BoxOpened(const QString& BoxName);
void BoxClosed(const QString& BoxName); void BoxClosed(const QString& BoxName);
void NotAuthorized(bool bLoginRequired, bool &bRetry); void NotAuthorized(bool bLoginRequired, bool &bRetry);
void QueuedRequest(quint32 ClientPid, quint32 ClientTid, quint32 RequestId, const QVariantMap& Data); void QueuedRequest(quint32 ClientPid, quint32 ClientTid, quint32 RequestId, const QVariantMap& Data);
@ -228,8 +229,9 @@ protected:
QString m_SbiePath; QString m_SbiePath;
QString m_IniPath; QString m_IniPath;
QFileSystemWatcher m_IniWatcher; QFileSystemWatcher m_IniWatcher;
bool m_IniReLoad;
bool m_bReloadPending; bool m_bReloadPending;
bool m_bBoxesDirty;
bool m_bWithQueue; bool m_bWithQueue;
bool m_bTerminate; bool m_bTerminate;

View File

@ -0,0 +1,129 @@
#include "stdafx.h"
#include "BoxMonitor.h"
#include "MiscHelpers/Common/Common.h"
CBoxMonitor::CBoxMonitor()
{
m_bTerminate = false;
start();
}
CBoxMonitor::~CBoxMonitor()
{
m_bTerminate = true;
if (!wait(10 * 1000))
terminate();
}
void CBoxMonitor::Notify(const wstring& strDirectory)
{
m_Mutex.lock();
m_Boxes[QString::fromStdWString(strDirectory)].Changed = true;
m_Mutex.unlock();
}
quint64 CBoxMonitor::CounDirSize(const QString& Directory, SBox* Box)
{
quint64 TotalSize = 0;
if (Box->pBox.isNull() || m_bTerminate)
return TotalSize;
QDir Dir(Directory);
foreach(const QFileInfo & Info, Dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot))
{
if (Info.isDir())
TotalSize += CounDirSize(Info.filePath(), Box);
else
TotalSize += QFile(Info.filePath()).size();
}
return TotalSize;
}
void CBoxMonitor::run()
{
while (!m_bTerminate)
{
m_Mutex.lock();
QList<QString> Keys = m_Boxes.keys();
m_Mutex.unlock();
quint64 CurTick = GetCurTick();
foreach(const QString& Key, Keys) {
m_Mutex.lock();
SBox* Box = &m_Boxes[Key];
m_Mutex.unlock();
quint64 MinScanInterval = Box->ScanDuration * 100;
if (MinScanInterval < 30 * 1000)
MinScanInterval = 30 * 1000;
if (MinScanInterval > 30 * 60 * 1000)
MinScanInterval = 30 * 60 * 1000;
if (Box->Changed && (Box->Closed || Box->LastScan == 0 || (CurTick - Box->LastScan) > MinScanInterval)) {
qDebug() << "Rescanning:" << Key << "(" + QDateTime::currentDateTime().toString() + ")";
quint64 ScanStart = GetCurTick();
Box->TotalSize = CounDirSize(Key, Box);
Box->ScanDuration = GetCurTick() - ScanStart;
Box->LastScan = GetCurTick();
QMetaObject::invokeMethod(this, "UpdateBox", Qt::QueuedConnection,
//Q_RETURN_ARG(int, retVal),
Q_ARG(QString, Key)
);
Box->Changed = false;
}
m_Mutex.lock();
if (Box->pBox.isNull())
m_Boxes.remove(Key);
m_Mutex.unlock();
}
Sleep(1000);
}
}
void CBoxMonitor::UpdateBox(const QString& Path)
{
// Note: this functin runs in the main thread
m_Mutex.lock();
SBox Box = m_Boxes.value(Path);
m_Mutex.unlock();
if (Box.pBox)
Box.pBox->SetSize(Box.TotalSize);
}
void CBoxMonitor::AddBox(CSandBoxPlus* pBox, bool AndWatch)
{
QMutexLocker Lock(&m_Mutex);
m_Boxes[pBox->GetFileRoot()].pBox = pBox;
if (AndWatch) {
m_Boxes[pBox->GetFileRoot()].Closed = false;
AddDirectory(pBox->GetFileRoot().toStdWString().c_str(), true, FILE_NOTIFY_CHANGE_SIZE);
}
else
m_Boxes[pBox->GetFileRoot()].Changed = true;
}
void CBoxMonitor::CloseBox(CSandBoxPlus* pBox, bool AndClear)
{
QMutexLocker Lock(&m_Mutex);
if(AndClear)
m_Boxes[pBox->GetFileRoot()].pBox.clear();
m_Boxes[pBox->GetFileRoot()].Closed = true;
DetachDirectory(pBox->GetFileRoot().toStdWString().c_str());
}

View File

@ -0,0 +1,49 @@
#pragma once
#include "Helpers/ReadDirectoryChanges.h"
#include "SbiePlusAPI.h"
class CBoxMonitor : public QThread, public CReadDirectoryChanges
{
Q_OBJECT
public:
CBoxMonitor();
~CBoxMonitor();
virtual void Notify(const wstring& strDirectory);
virtual void run();
void AddBox(CSandBoxPlus* pBox, bool AndWatch = false);
void CloseBox(CSandBoxPlus* pBox, bool AndClear = false);
private slots:
void UpdateBox(const QString& Path);
protected:
struct SBox
{
SBox() {
Changed = false;
Closed = false;
LastScan = 0;
ScanDuration = 0;
TotalSize = 0;
}
QPointer<CSandBoxPlus> pBox;
bool Changed;
bool Closed;
quint64 LastScan;
quint64 ScanDuration;
quint64 TotalSize;
};
quint64 CounDirSize(const QString& Dir, SBox* Box);
QMutex m_Mutex;
QMap<QString, SBox> m_Boxes;
bool m_bTerminate;
};

View File

@ -54,6 +54,42 @@
<layout class="QGridLayout" name="gridLayout_9"> <layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="0"> <item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_8"> <layout class="QGridLayout" name="gridLayout_8">
<item row="11" column="1">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1" colspan="2">
<widget class="QCheckBox" name="chkNotifications">
<property name="text">
<string>Show Notifications for relevant log Messages</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="11" column="2">
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="8" column="1" colspan="3"> <item row="8" column="1" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
@ -68,83 +104,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="7" column="1" colspan="2">
<widget class="QCheckBox" name="chkAsyncBoxOps">
<property name="text">
<string>Run box operations asynchronously whenever possible (like content deletion)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="uiLang"/>
</item>
<item row="10" column="1">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="1" colspan="2">
<widget class="QCheckBox" name="chkShowRecovery">
<property name="text">
<string>Show first recovery window when emptying sandboxes</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QCheckBox" name="chkDarkTheme">
<property name="text">
<string>Use Dark Theme (fully applied after a restart)</string>
</property>
<property name="tristate">
<bool>true</bool>
</property>
</widget>
</item>
<item row="9" column="1" colspan="2">
<widget class="QCheckBox" name="chkWatchConfig">
<property name="text">
<string>Watch Sandboxie.ini for changes</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QCheckBox" name="chkNotifications">
<property name="text">
<string>Show Notifications for relevant log Messages</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="10" column="2">
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="6" column="1" colspan="2">
<widget class="QCheckBox" name="chkNotifyRecovery">
<property name="text">
<string>Show recoverable files as notifications</string>
</property>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_19"> <widget class="QLabel" name="label_19">
<property name="text"> <property name="text">
@ -155,6 +114,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1" colspan="2">
<widget class="QCheckBox" name="chkAsyncBoxOps">
<property name="text">
<string>Run box operations asynchronously whenever possible (like content deletion)</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2"> <item row="4" column="1" colspan="2">
<widget class="QCheckBox" name="chkSandboxUrls"> <widget class="QCheckBox" name="chkSandboxUrls">
<property name="text"> <property name="text">
@ -165,6 +131,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1" colspan="2">
<widget class="QCheckBox" name="chkShowRecovery">
<property name="text">
<string>Show first recovery window when emptying sandboxes</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="uiLang"/>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="font"> <property name="font">
@ -179,6 +155,37 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1" colspan="2">
<widget class="QCheckBox" name="chkDarkTheme">
<property name="text">
<string>Use Dark Theme (fully applied after a restart)</string>
</property>
<property name="tristate">
<bool>true</bool>
</property>
</widget>
</item>
<item row="10" column="1" colspan="2">
<widget class="QCheckBox" name="chkWatchConfig">
<property name="text">
<string>Watch Sandboxie.ini for changes</string>
</property>
</widget>
</item>
<item row="6" column="1" colspan="2">
<widget class="QCheckBox" name="chkNotifyRecovery">
<property name="text">
<string>Show recoverable files as notifications</string>
</property>
</widget>
</item>
<item row="9" column="1" colspan="2">
<widget class="QCheckBox" name="chkMonitorSize">
<property name="text">
<string>Count and display the disk space ocupied by each sandbox</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>

View File

@ -71,8 +71,8 @@ QList<QVariant> CMonitorModel::Sync(const QMap<QString, CMonitorEntryPtr>& Entry
/*switch (section) /*switch (section)
{ {
//case eType: ColValue.Formated = ; break; //case eType: ColValue.Formatted = ; break;
//case eValue: ColValue.Formated = ; break; //case eValue: ColValue.Formatted = ; break;
}*/ }*/
} }

View File

@ -2,7 +2,6 @@
#include "SbieModel.h" #include "SbieModel.h"
#include "../../MiscHelpers/Common/Common.h" #include "../../MiscHelpers/Common/Common.h"
#include "../../MiscHelpers/Common/IconExtreactor.h" #include "../../MiscHelpers/Common/IconExtreactor.h"
#include <QFileIconProvider>
#include "../SandMan.h" #include "../SandMan.h"
CSbieModel::CSbieModel(QObject *parent) CSbieModel::CSbieModel(QObject *parent)
@ -114,6 +113,8 @@ QList<QVariant> CSbieModel::Sync(const QMap<QString, CSandBoxPtr>& BoxList, cons
QMap<QList<QVariant>, QList<STreeNode*> > New; QMap<QList<QVariant>, QList<STreeNode*> > New;
QHash<QVariant, STreeNode*> Old = m_Map; QHash<QVariant, STreeNode*> Old = m_Map;
bool bWatchSize = theConf->GetBool("Options/WatchBoxSize", false);
foreach(const QString& Group, Groups.keys()) foreach(const QString& Group, Groups.keys())
{ {
if (Group.isEmpty()) if (Group.isEmpty())
@ -232,6 +233,7 @@ QList<QVariant> CSbieModel::Sync(const QMap<QString, CSandBoxPtr>& BoxList, cons
{ {
case eName: Value = pBox->GetName(); break; case eName: Value = pBox->GetName(); break;
case eStatus: Value = pBox.objectCast<CSandBoxPlus>()->GetStatusStr(); break; case eStatus: Value = pBox.objectCast<CSandBoxPlus>()->GetStatusStr(); break;
case eInfo: Value = bWatchSize ? pBox.objectCast<CSandBoxPlus>()->GetSize() : 0; break;
case ePath: Value = pBox->GetFileRoot(); break; case ePath: Value = pBox->GetFileRoot(); break;
} }
@ -245,7 +247,8 @@ QList<QVariant> CSbieModel::Sync(const QMap<QString, CSandBoxPtr>& BoxList, cons
switch (section) switch (section)
{ {
case eName: ColValue.Formated = Value.toString().replace("_", " "); break; case eName: ColValue.Formatted = Value.toString().replace("_", " "); break;
case eInfo: ColValue.Formatted = Value.toULongLong() > 0 ? FormatSize(Value.toULongLong()) : ""; break;
} }
} }
@ -273,8 +276,6 @@ bool CSbieModel::Sync(const CSandBoxPtr& pBox, const QList<QVariant>& Path, cons
int ActiveCount = 0; int ActiveCount = 0;
QFileIconProvider IconProvider;
foreach(const CBoxedProcessPtr& pProc, ProcessList) foreach(const CBoxedProcessPtr& pProc, ProcessList)
{ {
QSharedPointer<CSbieProcess> pProcess = pProc.objectCast<CSbieProcess>(); QSharedPointer<CSbieProcess> pProcess = pProc.objectCast<CSbieProcess>();
@ -326,7 +327,7 @@ bool CSbieModel::Sync(const CSandBoxPtr& pBox, const QList<QVariant>& Path, cons
//else //else
// pNode->Icon = icons.first().pixmap; // pNode->Icon = icons.first().pixmap;
pNode->Icon = IconProvider.icon(QFileInfo(pProcess->GetFileName())); pNode->Icon = m_IconProvider.icon(QFileInfo(pProcess->GetFileName()));
if (pNode->Icon.isNull() || !pNode->Icon.isValid()) if (pNode->Icon.isNull() || !pNode->Icon.isValid())
pNode->Icon = m_ExeIcon; pNode->Icon = m_ExeIcon;
Changed = 1; Changed = 1;
@ -345,7 +346,7 @@ bool CSbieModel::Sync(const CSandBoxPtr& pBox, const QList<QVariant>& Path, cons
case eStatus: Value = pProcess->GetStatusStr(); break; case eStatus: Value = pProcess->GetStatusStr(); break;
case eTitle: Value = theAPI->GetProcessTitle(pProcess->GetProcessId()); break; case eTitle: Value = theAPI->GetProcessTitle(pProcess->GetProcessId()); break;
//case eLogCount: break; // todo Value = pProcess->GetResourceLog().count(); break; //case eLogCount: break; // todo Value = pProcess->GetResourceLog().count(); break;
case eTimeStamp: Value = pProcess->GetTimeStamp(); break; case eInfo: Value = pProcess->GetTimeStamp(); break;
//case ePath: Value = pProcess->GetFileName(); break; //case ePath: Value = pProcess->GetFileName(); break;
case ePath: { case ePath: {
QString CmdLine = pProcess->GetCommandLine(); QString CmdLine = pProcess->GetCommandLine();
@ -364,9 +365,9 @@ bool CSbieModel::Sync(const CSandBoxPtr& pBox, const QList<QVariant>& Path, cons
switch (section) switch (section)
{ {
case eProcessId: ColValue.Formated = QString::number(pProcess->GetProcessId()); break; case eProcessId: ColValue.Formatted = QString::number(pProcess->GetProcessId()); break;
//case eLogCount: ColValue.Formated = QString::number(Value.toInt()); break; //case eLogCount: ColValue.Formatted = QString::number(Value.toInt()); break;
case eTimeStamp: ColValue.Formated = pProcess->GetTimeStamp().toString("hh:mm:ss"); break; case eInfo: ColValue.Formatted = pProcess->GetTimeStamp().toString("hh:mm:ss"); break;
} }
} }
@ -475,8 +476,10 @@ QVariant CSbieModel::headerData(int section, Qt::Orientation orientation, int ro
case eProcessId: return tr("Process ID"); case eProcessId: return tr("Process ID");
case eStatus: return tr("Status"); case eStatus: return tr("Status");
case eTitle: return tr("Title"); case eTitle: return tr("Title");
case eInfo: return tr("Info");
//case eSize: return tr("Size");
//case eLogCount: return tr("Log Count"); //case eLogCount: return tr("Log Count");
case eTimeStamp: return tr("Start Time"); //case eTimeStamp: return tr("Start Time");
case ePath: return tr("Path / Command Line"); case ePath: return tr("Path / Command Line");
} }
} }

View File

@ -4,7 +4,7 @@
#include "../SbieProcess.h" #include "../SbieProcess.h"
#include "../../MiscHelpers/Common/TreeItemModel.h" #include "../../MiscHelpers/Common/TreeItemModel.h"
#include <QMimeData> #include <QMimeData>
#include <QFileIconProvider>
class CSbieModel : public CTreeItemModel class CSbieModel : public CTreeItemModel
{ {
@ -45,8 +45,10 @@ public:
eProcessId, eProcessId,
eTitle, eTitle,
eStatus, eStatus,
eInfo,
//eSize,
//eLogCount, //eLogCount,
eTimeStamp, //eTimeStamp,
ePath, ePath,
eCount eCount
}; };
@ -92,4 +94,5 @@ private:
QIcon m_ExeIcon; QIcon m_ExeIcon;
QString m_SbieModelMimeType; QString m_SbieModelMimeType;
QFileIconProvider m_IconProvider;
}; };

View File

@ -155,20 +155,20 @@ QList<QVariant> CTraceModel::Sync(const QVector<CTraceEntryPtr>& EntryList, int
/*case eProcess: /*case eProcess:
{ {
CBoxedProcessPtr pProcess = theAPI->GetProcessById(pEntry->GetProcessId()); CBoxedProcessPtr pProcess = theAPI->GetProcessById(pEntry->GetProcessId());
ColValue.Formated = QString("%1 (%2, %3)").arg(pProcess.isNull() ? tr("Unknown") : pProcess->GetProcessName()).arg(pEntry->GetProcessId()).arg(pEntry->GetThreadId()); ColValue.Formatted = QString("%1 (%2, %3)").arg(pProcess.isNull() ? tr("Unknown") : pProcess->GetProcessName()).arg(pEntry->GetProcessId()).arg(pEntry->GetThreadId());
break; break;
} }
case eTimeStamp: ColValue.Formated = pEntry->GetTimeStamp().toString("hh:mm:ss.zzz"); break;*/ case eTimeStamp: ColValue.Formatted = pEntry->GetTimeStamp().toString("hh:mm:ss.zzz"); break;*/
case eProcess: case eProcess:
if(!m_bTree) { if(!m_bTree) {
QString Name = pEntry->GetProcessName(); QString Name = pEntry->GetProcessName();
ColValue.Formated = QString("%1 (%2, %3) - %4").arg(Name.isEmpty() ? tr("Unknown") : Name) ColValue.Formatted = QString("%1 (%2, %3) - %4").arg(Name.isEmpty() ? tr("Unknown") : Name)
.arg(pEntry->GetProcessId()).arg(pEntry->GetThreadId()).arg(pEntry->GetTimeStamp().toString("hh:mm:ss.zzz")); .arg(pEntry->GetProcessId()).arg(pEntry->GetThreadId()).arg(pEntry->GetTimeStamp().toString("hh:mm:ss.zzz"));
} else } else
ColValue.Formated = pEntry->GetTimeStamp().toString("hh:mm:ss.zzz"); ColValue.Formatted = pEntry->GetTimeStamp().toString("hh:mm:ss.zzz");
break; break;
//case eType: ColValue.Formated = ; break; //case eType: ColValue.Formatted = ; break;
//case eValue: ColValue.Formated = ; break; //case eValue: ColValue.Formatted = ; break;
} }
} }
@ -252,9 +252,9 @@ CTraceModel::STreeNode* CTraceModel::MkVirtualNode(const QVariant& Id, STreeNode
QString Name = GetProcessName(pid); QString Name = GetProcessName(pid);
pNode->Values[0].Raw = pid; pNode->Values[0].Raw = pid;
if(!Name.isEmpty()) if(!Name.isEmpty())
pNode->Values[0].Formated = tr("%1 (%2)").arg(Name).arg(pid); pNode->Values[0].Formatted = tr("%1 (%2)").arg(Name).arg(pid);
else else
pNode->Values[0].Formated = tr("Process %1").arg(pid); pNode->Values[0].Formatted = tr("Process %1").arg(pid);
} }
else if (typeId.first == "tid") else if (typeId.first == "tid")
{ {
@ -262,10 +262,10 @@ CTraceModel::STreeNode* CTraceModel::MkVirtualNode(const QVariant& Id, STreeNode
quint32 pid = Split2(pParent->ID.toString(), "_").second.toUInt(); quint32 pid = Split2(pParent->ID.toString(), "_").second.toUInt();
LogThreadId(pid, tid); LogThreadId(pid, tid);
pNode->Values[0].Raw = tid; pNode->Values[0].Raw = tid;
pNode->Values[0].Formated = tr("Thread %1").arg(tid); pNode->Values[0].Formatted = tr("Thread %1").arg(tid);
} }
else*/ else*/
pNode->Values[0].Raw = pNode->Values[0].Formated = Id; pNode->Values[0].Raw = pNode->Values[0].Formatted = Id;
return pNode; return pNode;
} }

View File

@ -386,6 +386,8 @@ void CSandMan::CreateMenus()
m_pMenuView->addSeparator(); m_pMenuView->addSeparator();
m_pRefreshAll = m_pMenuView->addAction(CSandMan::GetIcon("Recover"), tr("Refresh View"), this, SLOT(OnRefresh()));
m_pCleanUpMenu = m_pMenuView->addMenu(CSandMan::GetIcon("Clean"), tr("Clean Up")); m_pCleanUpMenu = m_pMenuView->addMenu(CSandMan::GetIcon("Clean"), tr("Clean Up"));
m_pCleanUpProcesses = m_pCleanUpMenu->addAction(tr("Cleanup Processes"), this, SLOT(OnCleanUp())); m_pCleanUpProcesses = m_pCleanUpMenu->addAction(tr("Cleanup Processes"), this, SLOT(OnCleanUp()));
m_pCleanUpMenu->addSeparator(); m_pCleanUpMenu->addSeparator();
@ -1029,8 +1031,10 @@ SB_STATUS CSandMan::DeleteBoxContent(const CSandBoxPtr& pBox, EDelMode Mode, boo
Status = pBox->CleanBox(); Status = pBox->CleanBox();
Ret = Status; Ret = Status;
if (Status.GetStatus() == OP_ASYNC) if (Status.GetStatus() == OP_ASYNC) {
Ret = AddAsyncOp(Status.GetValue(), true, tr("Auto Deleting %1 Content").arg(pBox->GetName())); Ret = AddAsyncOp(Status.GetValue(), true, tr("Auto Deleting %1 Content").arg(pBox->GetName()));
pBox.objectCast<CSandBoxPlus>()->UpdateSize();
}
} }
finish: finish:
@ -1144,8 +1148,7 @@ void CSandMan::OnStatusChanged()
OnIniReloaded(); OnIniReloaded();
if (theConf->GetBool("Options/WatchIni", true)) theAPI->WatchIni(true, theConf->GetBool("Options/WatchIni", true));
theAPI->WatchIni(true);
if (!theAPI->ReloadCert().IsError()) { if (!theAPI->ReloadCert().IsError()) {
CSettingsWindow::LoadCertificate(); CSettingsWindow::LoadCertificate();
@ -1858,6 +1861,20 @@ void CSandMan::SetViewMode(bool bAdvanced)
} }
} }
void CSandMan::OnRefresh()
{
if (!theAPI->IsConnected())
return;
theAPI->ReloadBoxes(true);
if (theConf->GetBool("Options/WatchBoxSize", false)) {
QMap<QString, CSandBoxPtr> Boxes = theAPI->GetAllBoxes();
foreach(const CSandBoxPtr & pBox, Boxes)
pBox.objectCast<CSandBoxPlus>()->UpdateSize();
}
}
void CSandMan::OnCleanUp() void CSandMan::OnCleanUp()
{ {
if (sender() == m_pCleanUpMsgLog || sender() == m_pCleanUpButton) if (sender() == m_pCleanUpMsgLog || sender() == m_pCleanUpButton)

View File

@ -179,6 +179,7 @@ private slots:
void OnViewMode(QAction* action); void OnViewMode(QAction* action);
void OnAlwaysTop(); void OnAlwaysTop();
void OnRefresh();
void OnCleanUp(); void OnCleanUp();
void OnProcView(); void OnProcView();
@ -266,6 +267,7 @@ private:
QAction* m_pShowHidden; QAction* m_pShowHidden;
QAction* m_pWndTopMost; QAction* m_pWndTopMost;
int m_iMenuViewPos; int m_iMenuViewPos;
QAction* m_pRefreshAll;
QMenu* m_pCleanUpMenu; QMenu* m_pCleanUpMenu;
QAction* m_pCleanUpProcesses; QAction* m_pCleanUpProcesses;
QAction* m_pCleanUpMsgLog; QAction* m_pCleanUpMsgLog;

View File

@ -8,6 +8,7 @@ HEADERS += ./stdafx.h \
./SbiePlusAPI.h \ ./SbiePlusAPI.h \
./SbieProcess.h \ ./SbieProcess.h \
./BoxJob.h \ ./BoxJob.h \
./BoxMonitor.h \
./Models/SbieModel.h \ ./Models/SbieModel.h \
./Models/TraceModel.h \ ./Models/TraceModel.h \
./Models/MonitorModel.h \ ./Models/MonitorModel.h \
@ -32,6 +33,7 @@ SOURCES += ./main.cpp \
./SbiePlusAPI.cpp \ ./SbiePlusAPI.cpp \
./SbieProcess.cpp \ ./SbieProcess.cpp \
./BoxJob.cpp \ ./BoxJob.cpp \
./BoxMonitor.cpp \
./Models/TraceModel.cpp \ ./Models/TraceModel.cpp \
./Models/MonitorModel.cpp \ ./Models/MonitorModel.cpp \
./Models/SbieModel.cpp \ ./Models/SbieModel.cpp \

View File

@ -196,8 +196,11 @@
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="BoxJob.cpp" /> <ClCompile Include="BoxJob.cpp" />
<ClCompile Include="BoxMonitor.cpp" />
<ClCompile Include="Dialogs\MultiErrorDialog.cpp" /> <ClCompile Include="Dialogs\MultiErrorDialog.cpp" />
<ClCompile Include="Helpers\FindTool.cpp" /> <ClCompile Include="Helpers\FindTool.cpp" />
<ClCompile Include="Helpers\ReadDirectoryChanges.cpp" />
<ClCompile Include="Helpers\ReadDirectoryChangesPrivate.cpp" />
<ClCompile Include="Helpers\WinAdmin.cpp" /> <ClCompile Include="Helpers\WinAdmin.cpp" />
<ClCompile Include="Helpers\WindowFromPointEx.cpp" /> <ClCompile Include="Helpers\WindowFromPointEx.cpp" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
@ -253,7 +256,11 @@
<QtMoc Include="Dialogs\MultiErrorDialog.h" /> <QtMoc Include="Dialogs\MultiErrorDialog.h" />
<QtMoc Include="BoxJob.h" /> <QtMoc Include="BoxJob.h" />
<ClInclude Include="..\version.h" /> <ClInclude Include="..\version.h" />
<QtMoc Include="BoxMonitor.h" />
<ClInclude Include="Helpers\FindTool.h" /> <ClInclude Include="Helpers\FindTool.h" />
<ClInclude Include="Helpers\ReadDirectoryChanges.h" />
<ClInclude Include="Helpers\ReadDirectoryChangesPrivate.h" />
<ClInclude Include="Helpers\ThreadSafeQueue.h" />
<ClInclude Include="Helpers\WinAdmin.h" /> <ClInclude Include="Helpers\WinAdmin.h" />
<QtMoc Include="Models\MonitorModel.h" /> <QtMoc Include="Models\MonitorModel.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />

View File

@ -153,6 +153,15 @@
<ClCompile Include="Wizards\SetupWizard.cpp"> <ClCompile Include="Wizards\SetupWizard.cpp">
<Filter>Wizards</Filter> <Filter>Wizards</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Helpers\ReadDirectoryChanges.cpp">
<Filter>Helpers</Filter>
</ClCompile>
<ClCompile Include="Helpers\ReadDirectoryChangesPrivate.cpp">
<Filter>Helpers</Filter>
</ClCompile>
<ClCompile Include="BoxMonitor.cpp">
<Filter>SandMan</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="stdafx.h"> <ClInclude Include="stdafx.h">
@ -170,6 +179,15 @@
<ClInclude Include="..\version.h"> <ClInclude Include="..\version.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Helpers\ReadDirectoryChanges.h">
<Filter>Helpers</Filter>
</ClInclude>
<ClInclude Include="Helpers\ReadDirectoryChangesPrivate.h">
<Filter>Helpers</Filter>
</ClInclude>
<ClInclude Include="Helpers\ThreadSafeQueue.h">
<Filter>Helpers</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="SandMan.h"> <QtMoc Include="SandMan.h">
@ -229,6 +247,9 @@
<QtMoc Include="Wizards\SetupWizard.h"> <QtMoc Include="Wizards\SetupWizard.h">
<Filter>Wizards</Filter> <Filter>Wizards</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="BoxMonitor.h">
<Filter>SandMan</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtRcc Include="Resources\SandMan.qrc"> <QtRcc Include="Resources\SandMan.qrc">

View File

@ -4,14 +4,18 @@
#include "SandMan.h" #include "SandMan.h"
#include "..\MiscHelpers\Common\Common.h" #include "..\MiscHelpers\Common\Common.h"
#include <windows.h> #include <windows.h>
#include "BoxMonitor.h"
CSbiePlusAPI::CSbiePlusAPI(QObject* parent) : CSbieAPI(parent) CSbiePlusAPI::CSbiePlusAPI(QObject* parent) : CSbieAPI(parent)
{ {
m_BoxMonitor = new CBoxMonitor();
m_JobCount = 0; m_JobCount = 0;
} }
CSbiePlusAPI::~CSbiePlusAPI() CSbiePlusAPI::~CSbiePlusAPI()
{ {
delete m_BoxMonitor;
} }
CSandBox* CSbiePlusAPI::NewSandBox(const QString& BoxName, class CSbieAPI* pAPI) CSandBox* CSbiePlusAPI::NewSandBox(const QString& BoxName, class CSbieAPI* pAPI)
@ -94,7 +98,10 @@ CSandBoxPlus::CSandBoxPlus(const QString& BoxName, class CSbieAPI* pAPI) : CSand
m_bApplicationCompartment = false; m_bApplicationCompartment = false;
m_iUnsecureDebugging = 0; m_iUnsecureDebugging = 0;
m_TotalSize = theConf->GetValue("SizeCache/" + m_Name, -1).toLongLong();
m_SuspendRecovery = false; m_SuspendRecovery = false;
m_IsEmpty = false;
m_pOptionsWnd = NULL; m_pOptionsWnd = NULL;
m_pRecoveryWnd = NULL; m_pRecoveryWnd = NULL;
@ -154,11 +161,56 @@ void CSandBoxPlus::UpdateDetails()
CSandBox::UpdateDetails(); CSandBox::UpdateDetails();
} }
void CSandBoxPlus::SetBoxPaths(const QString& FilePath, const QString& RegPath, const QString& IpcPath)
{
CSandBox::SetBoxPaths(FilePath, RegPath, IpcPath);
m_IsEmpty = IsEmpty();
if (theConf->GetBool("Options/WatchBoxSize", false) && m_TotalSize == -1)
((CSbiePlusAPI*)theAPI)->m_BoxMonitor->AddBox(this);
}
void CSandBoxPlus::UpdateSize()
{
m_TotalSize = -1;
if(theConf->GetBool("Options/WatchBoxSize", false))
((CSbiePlusAPI*)theAPI)->m_BoxMonitor->AddBox(this);
m_IsEmpty = IsEmpty();
}
void CSandBoxPlus::SetSize(quint64 Size)
{
m_TotalSize = Size;
theConf->SetValue("SizeCache/" + m_Name, Size);
}
void CSandBoxPlus::OpenBox()
{
CSandBox::OpenBox();
m_IsEmpty = false;
if (theConf->GetBool("Options/WatchBoxSize", false))
((CSbiePlusAPI*)theAPI)->m_BoxMonitor->AddBox(this, true);
}
void CSandBoxPlus::CloseBox() void CSandBoxPlus::CloseBox()
{ {
CSandBox::CloseBox(); CSandBox::CloseBox();
m_SuspendRecovery = false; m_SuspendRecovery = false;
((CSbiePlusAPI*)theAPI)->m_BoxMonitor->CloseBox(this);
}
SB_PROGRESS CSandBoxPlus::CleanBox()
{
((CSbiePlusAPI*)theAPI)->m_BoxMonitor->CloseBox(this, true);
SB_PROGRESS Status = CSandBox::CleanBox();
return Status;
} }
bool CSandBoxPlus::CheckUnsecureConfig() const bool CSandBoxPlus::CheckUnsecureConfig() const
@ -190,7 +242,7 @@ QString CSandBoxPlus::GetStatusStr() const
QStringList Status; QStringList Status;
if (IsEmpty()) if (m_IsEmpty)
Status.append(tr("Empty")); Status.append(tr("Empty"));
if (m_bApplicationCompartment) if (m_bApplicationCompartment)
@ -513,6 +565,8 @@ void CSandBoxPlus::OnAsyncFinished()
if (!m_JobQueue.isEmpty()) if (!m_JobQueue.isEmpty())
StartNextJob(); StartNextJob();
else
UpdateSize();
} }
void CSandBoxPlus::OnAsyncMessage(const QString& Text) void CSandBoxPlus::OnAsyncMessage(const QString& Text)

View File

@ -29,6 +29,9 @@ protected:
int m_JobCount; int m_JobCount;
QMultiMap<quint32, QString> m_WindowMap; QMultiMap<quint32, QString> m_WindowMap;
friend class CSandBoxPlus;
class CBoxMonitor* m_BoxMonitor;
}; };
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -44,8 +47,13 @@ public:
virtual void UpdateDetails(); virtual void UpdateDetails();
virtual void SetBoxPaths(const QString& FilePath, const QString& RegPath, const QString& IpcPath);
virtual void OpenBox();
virtual void CloseBox(); virtual void CloseBox();
virtual SB_PROGRESS CleanBox();
virtual QString GetStatusStr() const; virtual QString GetStatusStr() const;
virtual void SetLogApi(bool bEnable); virtual void SetLogApi(bool bEnable);
@ -72,6 +80,10 @@ public:
virtual void SetLeaderProgram(const QString& ProgName, bool bSet); virtual void SetLeaderProgram(const QString& ProgName, bool bSet);
virtual int IsLeaderProgram(const QString& ProgName); virtual int IsLeaderProgram(const QString& ProgName);
virtual void UpdateSize();
virtual quint64 GetSize() const { if(m_TotalSize == -1) return 0; return m_TotalSize; }
virtual void SetSize(quint64 Size); //{ m_TotalSize = Size; }
virtual bool IsRecoverySuspended() const { return m_SuspendRecovery; } virtual bool IsRecoverySuspended() const { return m_SuspendRecovery; }
virtual void SetSuspendRecovery(bool bSet = true) { m_SuspendRecovery = bSet; } virtual void SetSuspendRecovery(bool bSet = true) { m_SuspendRecovery = bSet; }
@ -126,7 +138,10 @@ protected:
bool m_bApplicationCompartment; bool m_bApplicationCompartment;
int m_iUnsecureDebugging; int m_iUnsecureDebugging;
quint64 m_TotalSize;
bool m_SuspendRecovery; bool m_SuspendRecovery;
bool m_IsEmpty;
QString m_StatusStr; QString m_StatusStr;
QSet<QString> m_RecentPrograms; QSet<QString> m_RecentPrograms;

View File

@ -8,7 +8,6 @@
#include "../../MiscHelpers/Common/Common.h" #include "../../MiscHelpers/Common/Common.h"
#include "../Windows/OptionsWindow.h" #include "../Windows/OptionsWindow.h"
#include "../Windows/SnapshotsWindow.h" #include "../Windows/SnapshotsWindow.h"
#include <QFileIconProvider>
#include "../../MiscHelpers/Common/CheckableMessageBox.h" #include "../../MiscHelpers/Common/CheckableMessageBox.h"
#include "../Windows/RecoveryWindow.h" #include "../Windows/RecoveryWindow.h"
#include "../Windows/NewBoxWindow.h" #include "../Windows/NewBoxWindow.h"
@ -1351,8 +1350,6 @@ void CSbieView::UpdateRunMenu(const CSandBoxPtr& pBox)
while (m_iMenuRun < m_pMenuRun->actions().count()) while (m_iMenuRun < m_pMenuRun->actions().count())
m_pMenuRun->removeAction(m_pMenuRun->actions().at(m_iMenuRun)); m_pMenuRun->removeAction(m_pMenuRun->actions().at(m_iMenuRun));
QFileIconProvider IconProvider;
QStringList RunOptions = pBox->GetTextList("RunCommand", true); QStringList RunOptions = pBox->GetTextList("RunCommand", true);
foreach(const QString& RunOption, RunOptions) foreach(const QString& RunOption, RunOptions)
{ {
@ -1372,7 +1369,7 @@ void CSbieView::UpdateRunMenu(const CSandBoxPtr& pBox)
if (Path.left(1) == "\\") if (Path.left(1) == "\\")
Path.prepend(pBox->GetFileRoot()); Path.prepend(pBox->GetFileRoot());
pAction->setIcon(IconProvider.icon(QFileInfo(Path))); pAction->setIcon(m_IconProvider.icon(QFileInfo(Path)));
pAction->setData(NameCmd.second); pAction->setData(NameCmd.second);
} }
@ -1483,4 +1480,4 @@ void CSbieView::OnRemoveItem()
OnSandBoxAction(m_pMenuRemove); OnSandBoxAction(m_pMenuRemove);
else if (!GetSelectedGroups().isEmpty()) else if (!GetSelectedGroups().isEmpty())
OnGroupAction(m_pDelGroupe); OnGroupAction(m_pDelGroupe);
} }

View File

@ -3,6 +3,7 @@
#include "../../MiscHelpers/Common/PanelView.h" #include "../../MiscHelpers/Common/PanelView.h"
#include "../../MiscHelpers/Common/TreeviewEx.h" #include "../../MiscHelpers/Common/TreeviewEx.h"
#include "../Models/SbieModel.h" #include "../Models/SbieModel.h"
#include <QFileIconProvider>
class CSbieView : public CPanelView class CSbieView : public CPanelView
{ {
@ -152,4 +153,6 @@ private:
QAction* m_pRemove; QAction* m_pRemove;
int m_iMenuRun; int m_iMenuRun;
QFileIconProvider m_IconProvider;
}; };

View File

@ -301,6 +301,8 @@ void CSettingsWindow::LoadSettings()
ui.chkPanic->setChecked(theConf->GetBool("Options/EnablePanicKey", false)); ui.chkPanic->setChecked(theConf->GetBool("Options/EnablePanicKey", false));
ui.keyPanic->setKeySequence(QKeySequence(theConf->GetString("Options/PanicKeySequence", "Shift+Pause"))); ui.keyPanic->setKeySequence(QKeySequence(theConf->GetString("Options/PanicKeySequence", "Shift+Pause")));
ui.chkMonitorSize->setChecked(theConf->GetBool("Options/WatchBoxSize", false));
ui.chkWatchConfig->setChecked(theConf->GetBool("Options/WatchIni", true)); ui.chkWatchConfig->setChecked(theConf->GetBool("Options/WatchIni", true));
@ -458,6 +460,8 @@ void CSettingsWindow::SaveSettings()
theConf->SetValue("Options/EnablePanicKey", ui.chkPanic->isChecked()); theConf->SetValue("Options/EnablePanicKey", ui.chkPanic->isChecked());
theConf->SetValue("Options/PanicKeySequence", ui.keyPanic->keySequence().toString()); theConf->SetValue("Options/PanicKeySequence", ui.keyPanic->keySequence().toString());
theConf->SetValue("Options/WatchBoxSize", ui.chkMonitorSize->isChecked());
theConf->SetValue("Options/WatchIni", ui.chkWatchConfig->isChecked()); theConf->SetValue("Options/WatchIni", ui.chkWatchConfig->isChecked());
theConf->SetValue("Options/SysTrayIcon", ui.cmbSysTray->currentIndex()); theConf->SetValue("Options/SysTrayIcon", ui.cmbSysTray->currentIndex());

View File

@ -106,6 +106,7 @@ using namespace std;
#include <QColorDialog> #include <QColorDialog>
#include <QToolButton> #include <QToolButton>
#include <QScreen> #include <QScreen>
#include <QRadioButton>
// other includes // other includes