Sandboxie/SandboxiePlus/SandMan/Engine/BoxObject.cpp

111 lines
3.9 KiB
C++

#include "stdafx.h"
#include "BoxObject.h"
#include "../SandMan.h"
#include "../Views/SbieView.h"
#include "../Windows/SettingsWindow.h"
#include "../QSbieAPI/SbieUtils.h"
quint32 CBoxObject::StartTask(const QString& Command, const QVariantMap& Options)
{
SB_RESULT(quint32) result = theGUI->RunStart(getName(), Command, Options["elevalted"].toBool() ? CSbieAPI::eStartElevated : CSbieAPI::eStartDefault, Options["directory"].toString());
return result.IsError() ? -1 : result.GetValue();
}
QVariantList CBoxObject::ListTasks()
{
QVariantList List;
foreach(const CBoxedProcessPtr& pProcess, m_pIni.objectCast<CSandBox>()->GetProcessList())
List.append(TaskInfo(pProcess));
return List;
}
bool CBoxObject::StopTask(quint32 pid)
{
CBoxedProcessPtr pProcess = m_pIni.objectCast<CSandBox>()->GetProcessList().value(pid);
if (!pProcess)
return false;
SB_STATUS Status = pProcess->Terminate();
return !Status.IsError();
}
bool CBoxObject::Terminate()
{
SB_STATUS Status = m_pIni.objectCast<CSandBox>()->TerminateAll();
return !Status.IsError();
}
QVariantMap CBoxObject::TaskInfo(quint32 pid)
{
return TaskInfo(m_pIni.objectCast<CSandBox>()->GetProcessList().value(pid));
}
QVariantMap CBoxObject::TaskInfo(const CBoxedProcessPtr& pProcess)
{
QVariantMap Info;
Info["pid"] = pProcess->GetProcessId();
Info["parentId"] = pProcess->GetParendPID();
Info["name"] = pProcess->GetProcessName();
Info["commandline"] = pProcess->GetCommandLine();
Info["fileName"] = pProcess->GetFileName();
Info["timeStamp"] = pProcess->GetTimeStamp();
Info["flags"] = pProcess->GetProcessFlags();
Info["type"] = pProcess->GetImageType();
if (pProcess->IsTerminated()) {
Info["isRunning"] = false;
Info["returnCode"] = pProcess->GetReturnCode();
} else
Info["isRunning"] = true;
return Info;
}
bool CBoxObject::DeleteContent()
{
SB_STATUS Status = theGUI->DeleteBoxContent(m_pIni.objectCast<CSandBox>(), CSandMan::eCleanUp);
return !Status.IsError();
}
bool CBoxObject::RemoveSandbox()
{
SB_STATUS Status = theGUI->DeleteBoxContent(m_pIni.objectCast<CSandBox>(), CSandMan::eForDelete);
if (Status.GetMsgCode() == SB_Canceled)
return false;
Status = m_pIni.objectCast<CSandBox>()->RemoveBox();
return !Status.IsError();
}
bool CBoxObject::MakeShortcut(const QString& Target, const QVariantMap& Options)
{
QString Location = Options["location"].toString();
QStandardPaths::StandardLocation location = (QStandardPaths::StandardLocation)-1;
if (Location.compare("desktop", Qt::CaseInsensitive) == 0)
location = QStandardPaths::DesktopLocation;
else if (Location.compare("startmenu", Qt::CaseInsensitive) == 0)
location = QStandardPaths::ApplicationsLocation;
else if (Location.compare("documents", Qt::CaseInsensitive) == 0)
location = QStandardPaths::DocumentsLocation;
QString Name = Options["name"].toString();
if (location != -1) {
QString Path = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).replace("/", "\\");
if (Target == "default_browser")
Path += "\\" + CSettingsWindow::tr("Sandboxed Web Browser") + ".lnk";
else if (!Name.isEmpty())
Path += "\\" + Name + ".lnk";
else
return false;
QString StartExe = theAPI->GetSbiePath() + "\\SandMan.exe";
return CSbieUtils::CreateShortcut(StartExe, Path, "", getName(), Target);
}
return CSbieView::CreateShortcutEx(Target, getName(), Name, Options["iconPath"].toString(), Options["iconIndex"].toInt(), Options["workDir"].toString());
}
void CSBoxObject::Start(const QString& Command, bool bElevale)
{
m_pIni.objectCast<CSandBox>()->RunStart(Command.isEmpty() ? "run_dialog" : Command, bElevale);
}
void CSBoxObject::ApplyChanges(bool bApply)
{
CWizardEngine* pEngine = qobject_cast<CWizardEngine*>(parent());
pEngine->SetApplyShadow(m_OriginalName, bApply);
}