--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/memspyui/ui/hb/src/memspyheapdumpsview.cpp Thu Jul 22 16:33:59 2010 +0100
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+#include <HbToolBar>
+#include <HbAction>
+#include <HbDataForm>
+#include <HbDataFormModel>
+#include <HbProgressDialog>
+#include <HbMessageBox>
+#include <HbLabel>
+
+#include "memspyheapdumpsview.h"
+#include "enginewrapper.h"
+
+const QStringList MODE_ITEMS = QStringList() <<
+ MemSpyHeapDumpsView::tr("Kernel") <<
+ MemSpyHeapDumpsView::tr("User") <<
+ MemSpyHeapDumpsView::tr("Both");
+
+MemSpyHeapDumpsView::MemSpyHeapDumpsView(EngineWrapper &engine, ViewManager &viewManager) :
+ MemSpyView(engine, viewManager),
+ mModel(0),
+ mModeItem(0),
+ mFilterItem(0),
+ mDwoProgressDialog(0)
+{
+}
+
+MemSpyHeapDumpsView::~MemSpyHeapDumpsView()
+{
+ delete mDwoProgressDialog;
+}
+
+void MemSpyHeapDumpsView::initialize(const QVariantMap& params)
+{
+ setTitle(tr("Heap Dumps"));
+
+ MemSpyView::initialize(params);
+}
+
+HbToolBar* MemSpyHeapDumpsView::createToolBar()
+{
+ HbToolBar* toolBar = new HbToolBar();
+ toolBar->addAction(tr("Dump Now"), this, SLOT(dump()));
+ return toolBar;
+}
+
+HbWidget* MemSpyHeapDumpsView::createCentralWidget()
+{
+ mModel = new HbDataFormModel(this);
+
+ //TODO: uncomment after kernel heap dumps are implemented
+// mModeItem = mModel->appendDataFormItem(
+// HbDataFormModelItem::ComboBoxItem, tr("Heap Dump"));
+// mModeItem->setContentWidgetData("items", MODE_ITEMS);
+// mModeItem->setContentWidgetData("currentIndex", mEngine.settings().heapDumpsMode());
+// modeChanged(mEngine.settings().heapDumpsMode());
+
+ //TODO: remove after kernel heap dumps are implemented
+ createFilterItem();
+
+ HbDataForm* form = new HbDataForm(this);
+ form->setModel(mModel);
+
+ //TODO: uncomment after kernel heap dumps are implemented
+// form->addConnection(mModeItem, SIGNAL(currentIndexChanged(int)), this, SLOT(modeChanged(int)));
+
+ return form;
+}
+
+void MemSpyHeapDumpsView::modeChanged(int mode)
+{
+ if (mode == HeapDumpsModeKernel && mFilterItem)
+ removeFilterItem();
+ else if (mode != HeapDumpsModeKernel && !mFilterItem)
+ createFilterItem();
+}
+
+void MemSpyHeapDumpsView::createFilterItem()
+{
+ mFilterItem = mModel->appendDataFormItem(
+ HbDataFormModelItem::TextItem, tr("Filter"));
+}
+
+void MemSpyHeapDumpsView::removeFilterItem()
+{
+ mModel->removeItem(mFilterItem);
+ mFilterItem = 0;
+}
+
+void MemSpyHeapDumpsView::dump()
+{
+ mEngine.updateOutputSettings();
+
+ HeapDumpsMode mode = HeapDumpsModeUser;
+ //TODO: uncomment after kernel heap dumps are implemented
+ //static_cast<HeapDumpsMode>(mModeItem->contentWidgetData("currentIndex").toInt());
+
+ // save settings
+ //TODO: uncomment after kernel heap dumps are implemented
+ //mEngine.settings().setHeapDumpsMode(mode);
+
+ if (mode == HeapDumpsModeKernel || mode == HeapDumpsModeBoth) {
+ // dump kernel heap
+ mDwoProgressDialog = new HbProgressDialog(HbProgressDialog::WaitDialog);
+ mDwoProgressDialog->setText(tr("Please wait..."));
+ mDwoProgressDialog->show();
+
+ MemSpyKernelHeapDumpTracker* tracker = mEngine.createKernelHeapDumpTracker();
+ connect(tracker, SIGNAL(finished(int)), this, SLOT(asyncOperationFinished(int)));
+ tracker->start();
+ }
+
+ if (mode == HeapDumpsModeUser || mode == HeapDumpsModeBoth) {
+ // dump user heap
+
+ QString filter = mFilterItem->contentWidgetData("text").toString();
+ if (!filter.isEmpty()) {
+
+ int errorCode = mEngine.outputThreadHeapData(filter);
+ if (errorCode == KErrNotFound) {
+ HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeInformation);
+ messageBox->setText(tr("No thread matches your filter"));
+ HbLabel *header = new HbLabel(tr("No such thread"), messageBox);
+ messageBox->setHeadingWidget(header);
+ messageBox->setAttribute(Qt::WA_DeleteOnClose);
+ messageBox->setTimeout(HbPopup::StandardTimeout);
+ messageBox->open();
+ }
+
+
+ } else {
+ mDwoProgressDialog = new HbProgressDialog(HbProgressDialog::ProgressDialog);
+ mDwoProgressDialog->setMinimum(0);
+ mDwoProgressDialog->setMaximum(100);
+ mDwoProgressDialog->show();
+
+ MemSpyDwoTracker* tracker = mEngine.createDeviceWideOperation(OutputHeapData);
+ connect(tracker, SIGNAL(progress(int,QString)), this, SLOT(updateDwoProgress(int,QString)));
+ connect(tracker, SIGNAL(finished(int)), this, SLOT(asyncOperationFinished(int)));
+ connect(mDwoProgressDialog, SIGNAL(cancelled()), tracker, SLOT(cancel()));
+ tracker->start();
+ }
+ }
+}
+
+void MemSpyHeapDumpsView::updateDwoProgress(int progress, const QString& processName)
+{
+ mDwoProgressDialog->setText(processName);
+ mDwoProgressDialog->setProgressValue(progress);
+}
+
+void MemSpyHeapDumpsView::asyncOperationFinished(int errorCode)
+{
+ mDwoProgressDialog->hide();
+ delete mDwoProgressDialog;
+ mDwoProgressDialog = 0;
+
+ delete sender();
+
+ if (errorCode != KErrNone && errorCode != KErrCancel) {
+ HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeWarning);
+ messageBox->setText(tr("An error occured during the operation. Error code: %1").arg(errorCode));
+ HbLabel *header = new HbLabel(tr("Error"), messageBox);
+ messageBox->setHeadingWidget(header);
+ messageBox->setAttribute(Qt::WA_DeleteOnClose);
+ messageBox->setTimeout(HbPopup::StandardTimeout);
+ messageBox->open();
+ }
+}