From 55b42c2b4d9ac798d02ed40c7f25413103e03590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sun, 18 Oct 2009 17:59:07 +0000 Subject: [PATCH] Patch by Pieter Panman: * Rewrote Devices application. -> Thanks a bunch!! Nice work! * Put Devices onto the image. Changes by myself: * Merge some code from the old "preflet" which the new app still relied on. * Fixed some coding style issues. I didn't review all of the code yet, though. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33640 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- build/jam/HaikuImage | 10 +- src/apps/devices/ConfigurationWindow.cpp | 633 ------------------ src/apps/devices/Device.cpp | 128 ++++ src/apps/devices/Device.h | 109 +++ src/apps/devices/DevicePCI.cpp | 127 ++++ src/apps/devices/DevicePCI.h | 36 + src/apps/devices/Devices.cpp | 67 -- src/apps/devices/Devices.rdef | 6 +- src/apps/devices/DevicesApplication.cpp | 119 ++++ src/apps/devices/DevicesInfo.cpp | 219 ------ src/apps/devices/DevicesInfo.h | 59 -- src/apps/devices/DevicesView.cpp | 392 +++++++++++ src/apps/devices/DevicesView.h | 85 +++ src/apps/devices/DevicesWindow.cpp | 507 -------------- src/apps/devices/DevicesWindows.h | 106 --- src/apps/devices/Documentation/Design.txt | 128 ++++ .../devices/Documentation/Specification.txt | 69 ++ src/apps/devices/Documentation/Todo.txt | 13 + src/apps/devices/Jamfile | 27 +- src/apps/devices/ModemWindow.cpp | 152 ----- src/apps/devices/PropertyList.cpp | 91 +++ src/apps/devices/PropertyList.h | 51 ++ src/apps/devices/PropertyListPlain.cpp | 104 +++ src/apps/devices/PropertyListPlain.h | 33 + src/apps/devices/cm_wrapper.c | 141 ---- src/apps/devices/cm_wrapper.h | 36 - src/apps/devices/dm_wrapper.c | 69 ++ src/apps/devices/dm_wrapper.h | 21 + 28 files changed, 1599 insertions(+), 1939 deletions(-) delete mode 100644 src/apps/devices/ConfigurationWindow.cpp create mode 100644 src/apps/devices/Device.cpp create mode 100644 src/apps/devices/Device.h create mode 100644 src/apps/devices/DevicePCI.cpp create mode 100644 src/apps/devices/DevicePCI.h delete mode 100644 src/apps/devices/Devices.cpp create mode 100644 src/apps/devices/DevicesApplication.cpp delete mode 100644 src/apps/devices/DevicesInfo.cpp delete mode 100644 src/apps/devices/DevicesInfo.h create mode 100644 src/apps/devices/DevicesView.cpp create mode 100644 src/apps/devices/DevicesView.h delete mode 100644 src/apps/devices/DevicesWindow.cpp delete mode 100644 src/apps/devices/DevicesWindows.h create mode 100644 src/apps/devices/Documentation/Design.txt create mode 100644 src/apps/devices/Documentation/Specification.txt create mode 100644 src/apps/devices/Documentation/Todo.txt delete mode 100644 src/apps/devices/ModemWindow.cpp create mode 100644 src/apps/devices/PropertyList.cpp create mode 100644 src/apps/devices/PropertyList.h create mode 100644 src/apps/devices/PropertyListPlain.cpp create mode 100644 src/apps/devices/PropertyListPlain.h delete mode 100644 src/apps/devices/cm_wrapper.c delete mode 100644 src/apps/devices/cm_wrapper.h create mode 100644 src/apps/devices/dm_wrapper.c create mode 100644 src/apps/devices/dm_wrapper.h diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index 40f29970b4..8cf45c1c18 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -62,9 +62,9 @@ SYSTEM_BIN = "[" addattr alert arp base64 basename bash bc beep bootman bzip2 zdiff zforce zgrep zip zipcloak zipgrep zipnote zipsplit zmore znew ; -SYSTEM_APPS = AboutSystem ActivityMonitor CharacterMap CodyCam DeskCalc DiskProbe - DiskUsage DriveSetup CDPlayer Expander Icon-O-Matic Installer LaunchBox - Magnify Mail MediaConverter MediaPlayer MidiPlayer NetworkStatus +SYSTEM_APPS = AboutSystem ActivityMonitor CharacterMap CodyCam DeskCalc Devices + DiskProbe DiskUsage DriveSetup CDPlayer Expander Icon-O-Matic Installer + LaunchBox Magnify Mail MediaConverter MediaPlayer MidiPlayer NetworkStatus PackageInstaller People PoorMan PowerStatus ProcessController Screenshot ShowImage SoundRecorder StyledEdit Terminal TextSearch TV Workspaces ; @@ -304,8 +304,8 @@ AddSymlinkToHaikuImage home config settings Mail : ../../../mail/in : mailbox ; # Deskbar Application links AddDirectoryToHaikuImage home config be Applications ; DESKBAR_APPLICATIONS = ActivityMonitor CharacterMap CodyCam CDPlayer DeskCalc - DiskProbe DriveSetup DiskUsage Expander Icon-O-Matic Installer Magnify - Mail MediaConverter MediaPlayer MidiPlayer People PoorMan Screenshot + Devices DiskProbe DriveSetup DiskUsage Expander Icon-O-Matic Installer + Magnify Mail MediaConverter MediaPlayer MidiPlayer People PoorMan Screenshot SoundRecorder StyledEdit Terminal TV ; local linkTarget ; diff --git a/src/apps/devices/ConfigurationWindow.cpp b/src/apps/devices/ConfigurationWindow.cpp deleted file mode 100644 index db4de7fd67..0000000000 --- a/src/apps/devices/ConfigurationWindow.cpp +++ /dev/null @@ -1,633 +0,0 @@ -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -// -// Copyright (c) 2003-2004, Haiku -// -// This software is part of the Haiku distribution and is covered -// by the Haiku license. -// -// -// File: ConfigurationWindow.cpp -// Author: Jérôme Duval -// Description: Devices Preferences -// Created : April 22, 2004 -// -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - - -// Includes ------------------------------------------------------------------------------------------ // -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "DevicesWindows.h" -#include "pcihdr.h" - -#define CONFIGURATION_CHANGED 'cfch' -#define IRQ_CHANGED 'irch' -#define DMA_CHANGED 'irch' - -class RangeConfItem : public BListItem -{ - public: - RangeConfItem(uint32 lowAddress, uint32 highAddress); - ~RangeConfItem(); - virtual void DrawItem(BView *, BRect, bool = false); - static int Compare(const void *firstArg, const void *secondArg); - private: - uint32 fLowAddress, fHighAddress; -}; - - -RangeConfItem::RangeConfItem(uint32 lowAddress, uint32 highAddress) - : BListItem(), - fLowAddress(lowAddress), - fHighAddress(highAddress) -{ -} - -RangeConfItem::~RangeConfItem() -{ -} - -/*********************************************************** - * DrawItem - ***********************************************************/ -void -RangeConfItem::DrawItem(BView *owner, BRect itemRect, bool complete) -{ - rgb_color kBlack = { 0,0,0,0 }; - rgb_color kHighlight = { 156,154,156,0 }; - - if (IsSelected() || complete) { - rgb_color color; - if (IsSelected()) - color = kHighlight; - else - color = owner->ViewColor(); - - owner->SetHighColor(color); - owner->SetLowColor(color); - owner->FillRect(itemRect); - owner->SetHighColor(kBlack); - } else { - owner->SetLowColor(owner->ViewColor()); - } - - BFont font = be_plain_font; - font_height finfo; - font.GetHeight(&finfo); - - BPoint point = BPoint(itemRect.left + 4, itemRect.bottom - finfo.descent + 1); - owner->SetFont(be_plain_font); - owner->SetHighColor(kBlack); - owner->MovePenTo(point); - - char string[20]; - - if (fLowAddress >= 0) { - sprintf(string, "0x%04lx", fLowAddress); - owner->DrawString(string); - } - - point += BPoint(75, 0); - owner->MovePenTo(point); - owner->StrokeLine(point + BPoint(0,-3), point + BPoint(4,-3)); - - point += BPoint(15, 0); - owner->MovePenTo(point); - owner->SetFont(be_plain_font); - - if (fHighAddress >= 0) { - sprintf(string, "0x%04lx", fHighAddress); - owner->DrawString(string); - } -} - -int -RangeConfItem::Compare(const void *firstArg, const void *secondArg) -{ - const RangeConfItem *item1 = *static_cast(firstArg); - const RangeConfItem *item2 = *static_cast(secondArg); - - if (item1->fLowAddress < item2->fLowAddress) { - return -1; - } else if (item1->fLowAddress > item2->fLowAddress) { - return 1; - } else - return 0; - -} - - -// -------------------------------------------------------------------------------------------------- // - - -// ConfigurationWindow - Constructor -ConfigurationWindow::ConfigurationWindow(BRect frame, DeviceItem *item) - : BWindow (frame, item->GetInfo()->GetCardName(), B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL , - B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE|B_NOT_RESIZABLE), - fItem(item) -{ - CenterOnScreen(); - fItem->SetWindow(this); - InitWindow(); - - Show(); -} -// -------------------------------------------------------------------------------------------------- // - - -// ConfigurationWindow - Destructor -ConfigurationWindow::~ConfigurationWindow() -{ -} -// -------------------------------------------------------------------------------------------------- // - -// ConfigurationWindow::InitWindow -- Initialization Commands here -void -ConfigurationWindow::InitWindow(void) -{ - DevicesInfo *devicesInfo = fItem->GetInfo(); - - BRect bRect = Bounds(); - - BBox *background = new BBox(bRect, "background", B_FOLLOW_LEFT | B_FOLLOW_TOP, - B_WILL_DRAW, B_NO_BORDER); - AddChild(background); - - BRect rtab = Bounds(); - BRect rlist = Bounds(); - rtab.top += 10; - rlist.top += 11; - rlist.left += 13; - rlist.right -= 13; - rlist.bottom -= 44; - - // Create the TabView and Tabs - BTabView *tabView = new BTabView(rtab,"resource_usage_tabview"); - tabView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - - rtab = tabView->Bounds(); - rtab.InsetBy(5,5); - - // Create the Views - BBox *resources = new BBox(rlist, "resources", - B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW); - - - BMenuItem *menuItem; - fConfigurationMenu = new BPopUpMenu(""); - fConfigurationMenu->AddItem(menuItem = new BMenuItem("Current Configuration", - new BMessage(CONFIGURATION_CHANGED))); - menuItem->SetMarked(true); - fConfigurationMenu->AddItem(menuItem = new BMenuItem("Default Configuration", - new BMessage(CONFIGURATION_CHANGED))); - menuItem->SetEnabled(false); - fConfigurationMenu->AddItem(menuItem = new BMenuItem("Disable Device", - new BMessage(CONFIGURATION_CHANGED))); - menuItem->SetEnabled(false); - fConfigurationMenu->AddSeparatorItem(); - fConfigurationMenu->AddItem(menuItem = new BMenuItem("Possible Configuration 0", - new BMessage(CONFIGURATION_CHANGED))); - - BMenuField *configurationMenuField = new BMenuField(BRect(0,0,174 + (be_plain_font->Size() - 12) * 10,18), "configurationMenuField", - NULL, fConfigurationMenu, true); - resources->SetLabel(configurationMenuField); - - fIRQMenu[0] = new BPopUpMenu(""); - fIRQMenu[1] = new BPopUpMenu(""); - fIRQMenu[2] = new BPopUpMenu(""); - fDMAMenu[0] = new BPopUpMenu(""); - fDMAMenu[1] = new BPopUpMenu(""); - fDMAMenu[2] = new BPopUpMenu(""); - - BRect fieldRect; - fieldRect.top = 25; - fieldRect.left = 22; - fieldRect.right = fieldRect.left + 72; - fieldRect.bottom = fieldRect.top + 18; - - BMenuField *field; - fIRQField[0] = field = new BMenuField(fieldRect, "IRQ1Field", "IRQs", fIRQMenu[0], true); - field->SetEnabled(false); - field->SetDivider(33); - resources->AddChild(field); - fieldRect.left = 25; - fieldRect.OffsetBy(71, 0); - fIRQField[1] = field = new BMenuField(fieldRect, "IRQ2Field", " and", fIRQMenu[1], true); - field->SetEnabled(false); - field->SetDivider(30); - resources->AddChild(field); - fieldRect.OffsetBy(71, 0); - fIRQField[2] = field = new BMenuField(fieldRect, "IRQ3Field", " and", fIRQMenu[2], true); - field->SetEnabled(false); - field->SetDivider(30); - resources->AddChild(field); - - fieldRect.OffsetBy(-142, 23); - fieldRect.left = 14; - fDMAField[0] = field = new BMenuField(fieldRect, "DMA1Field", "DMAs", fDMAMenu[0], true); - field->SetEnabled(false); - field->SetDivider(41); - resources->AddChild(field); - fieldRect.left = 25; - fieldRect.OffsetBy(71, 0); - fDMAField[1] = field = new BMenuField(fieldRect, "DMA2Field", " and", fDMAMenu[1], true); - field->SetEnabled(false); - field->SetDivider(30); - resources->AddChild(field); - fieldRect.OffsetBy(71, 0); - fDMAField[2] = field = new BMenuField(fieldRect, "DMA3Field", " and", fDMAMenu[2], true); - field->SetEnabled(false); - field->SetDivider(30); - resources->AddChild(field); - - fIRQMenu[0]->Superitem()->SetLabel(""); - fIRQMenu[1]->Superitem()->SetLabel(""); - fIRQMenu[2]->Superitem()->SetLabel(""); - fDMAMenu[0]->Superitem()->SetLabel(""); - fDMAMenu[1]->Superitem()->SetLabel(""); - fDMAMenu[2]->Superitem()->SetLabel(""); - - BRect boxRect = resources->Bounds(); - boxRect.top = 74; - boxRect.left += 13; - boxRect.right -= 11; - boxRect.bottom = boxRect.top + 141; - BBox *ioPortBox = new BBox(boxRect, "ioPort", - B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW); - ioPortBox->SetLabel(new BStringView(BRect(0,0,150,15), "ioPortLabel", " IO Port Ranges ")); - resources->AddChild(ioPortBox); - boxRect.OffsetBy(0, 149); - boxRect.bottom = boxRect.top + 140; - BBox *memoryBox = new BBox(boxRect, "memory", - B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW); - memoryBox->SetLabel(new BStringView(BRect(0,0,150,15), "memoryLabel", " Memory Ranges ")); - resources->AddChild(memoryBox); - - ioListView = new BListView(BRect(14,22,164,127), "ioListView"); - memoryListView = new BListView(BRect(14,22,164,127), "memoryListView"); - - BScrollView *ioScrollView = new BScrollView("ioScrollView", ioListView, B_FOLLOW_LEFT|B_FOLLOW_TOP, - 0, false, true, B_FANCY_BORDER); - ioPortBox->AddChild(ioScrollView); - BScrollView *memoryScrollView = new BScrollView("memoryScrollView", memoryListView, B_FOLLOW_LEFT|B_FOLLOW_TOP, - 0, false, true, B_FANCY_BORDER); - memoryBox->AddChild(memoryScrollView); - - - struct device_configuration *current = devicesInfo->GetCurrent(); - resource_descriptor r; - - { - int32 k = 0; - int32 num = count_resource_descriptors_of_type(current, B_IRQ_RESOURCE); - - for (int32 i=0;i>=1,j++) - if (mask & 1) { - char value[50]; - sprintf(value, "%d", j); - BMenuItem *item = new BMenuItem(value, new BMessage(IRQ_CHANGED)); - fIRQMenu[k]->AddItem(item); - item->SetMarked(true); - fIRQField[k]->SetEnabled(true); - } - } - } - - { - int32 k = 0; - int32 num = count_resource_descriptors_of_type(current, B_DMA_RESOURCE); - - for (int32 i=0;i>=1,j++) - if (mask & 1) { - char value[50]; - sprintf(value, "%d", j); - BMenuItem *item = new BMenuItem(value, new BMessage(DMA_CHANGED)); - fDMAMenu[k]->AddItem(item); - item->SetMarked(true); - fDMAField[k++]->SetEnabled(true); - } - } - } - - { - int32 num = count_resource_descriptors_of_type(current, B_IO_PORT_RESOURCE); - - for (int32 i=0;iAddItem(new RangeConfItem(r.d.r.minbase, - r.d.r.minbase + r.d.r.len - 1)); - } - - ioListView->SortItems(&RangeConfItem::Compare); - - } - - { - int32 num = count_resource_descriptors_of_type(current, B_MEMORY_RESOURCE); - - for (int32 i=0;iAddItem(new RangeConfItem(r.d.r.minbase, - r.d.r.minbase + r.d.r.len - 1)); - } - - memoryListView->SortItems(&RangeConfItem::Compare); - - } - - BBox *info = new BBox(rlist, "info", - B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW, B_NO_BORDER); - - bool isISAPnP = false; - BString compatibleIDString; - - if (devicesInfo->GetInfo()->bus == B_ISA_BUS) { - uint32 id = devicesInfo->GetInfo()->id[0]; - if ((id >> 24 == 'P') - && (((id >> 16) & 0xff) == 'n') - && (((id >> 8) & 0xff) == 'P')) { - isISAPnP = true; - - char string[255]; - sprintf(string, "Compatible ID #%ld:", - devicesInfo->GetInfo()->id[3]); - compatibleIDString = string; - } - } - - BRect labelRect(1, 10, 132, 30); - BStringView *label = new BStringView(labelRect, "Card Name", "Card Name:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Device Name", "Device Name:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Logical Device Name", "Logical Device Name:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Bus Type", "Bus Type:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Device Type", "Device Type:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - labelRect.OffsetBy(0, 36); - label = new BStringView(labelRect, "Vendor", "Vendor:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Card ID", "Card ID:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - if (isISAPnP) { - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Logical Device ID", "Logical Device ID:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Compatible ID#", compatibleIDString.String()); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - } - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Current State", "Current State:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Resource Conflicts", "Resource Conflicts:"); - label->SetAlignment(B_ALIGN_RIGHT); - info->AddChild(label); - - BString cardName = ""; - - BString logicalDeviceName = ""; - - BString bus; - switch (devicesInfo->GetInfo()->bus) { - case B_ISA_BUS: bus = "ISA device"; break; - case B_PCI_BUS: bus = "PCI device"; break; - case B_PCMCIA_BUS: bus = "PCMCIA device"; break; - default: bus = ""; break; - } - - BString deviceType1, deviceType2; - deviceType1 += devicesInfo->GetBaseString(); - deviceType1 += " ("; - deviceType1 += devicesInfo->GetSubTypeString(); - deviceType1 += ")"; - char typeString[255]; - sprintf(typeString, "Base: %x Subtype: %x Interface: %x", - devicesInfo->GetInfo()->devtype.base, - devicesInfo->GetInfo()->devtype.subtype, - devicesInfo->GetInfo()->devtype.interface); - deviceType2 = typeString; - BString vendor; - BString vendorString = ""; - BString cardID = ""; - BString resourceConflicts = "None"; - BString logicalString; - - switch (devicesInfo->GetInfo()->bus) { - case B_ISA_BUS: - { - char string[255]; - if (isISAPnP) { - uint32 id = devicesInfo->GetInfo()->id[1]; - sprintf(string, "%c%c%c Product: %x%x%x Revision: %d", - ((uint8)(id >> 2) & 0x1f) + 'A' - 1, - ((uint8)(id & 0x3) << 3) + ((uint8)(id >> 13) & 0x7) + 'A' - 1, - (uint8)(id >> 8) & 0x1f + 'A' - 1, - (uint8)(id >> 20) & 0xf, - (uint8)(id >> 16) & 0xf, - (uint8)(id >> 28) & 0xf, - (uint8)((id >> 24) & 0xf)); - vendor = string; - - sprintf(string, "%08lx", devicesInfo->GetInfo()->id[2]); - cardID = string; - - id = devicesInfo->GetInfo()->id[3]; - sprintf(string, "%c%c%c Product: %x%x%x Revision: %d", - ((uint8)(id >> 2) & 0x1f) + 'A' - 1, - ((uint8)(id & 0x3) << 3) + ((uint8)(id >> 13) & 0x7) + 'A' - 1, - (uint8)(id >> 8) & 0x1f + 'A' - 1, - (uint8)(id >> 20) & 0xf, - (uint8)(id >> 16) & 0xf, - (uint8)(id >> 28) & 0xf, - (uint8)((id >> 24) & 0xf)); - logicalString = string; - - cardName = devicesInfo->GetCardName(); - - } else { - uint32 id = devicesInfo->GetInfo()->id[2]; - sprintf(string, "%c%c%c Product: %x%x Revision: %d", - ((uint8)(id >> 2) & 0x1f) + 'A' - 1, - ((uint8)(id & 0x3) << 3) + ((uint8)(id >> 13) & 0x7) + 'A' - 1, - (uint8)(id >> 8) & 0x1f + 'A' - 1, - (uint8)(id >> 16) & 0xf, - (uint8)(id >> 20) & 0xf, - (uint8)((id >> 24) & 0xff)); - vendor = string; - - cardID = "0"; - } - - } - break; - case B_PCI_BUS: - { - for (uint32 i=0; iGetInfo()->id[0] & 0xffff) { - vendorString = PciVenTable[i].VenFull; - break; - } - - char string[255]; - sprintf(string, "%s (0x%04lx)", vendorString.String(), devicesInfo->GetInfo()->id[0] & 0xffff); - vendor = string; - sprintf(string, "%04lx", devicesInfo->GetInfo()->id[1] & 0xffff); - cardID = string; - - for (uint32 i = 0; i < PCI_DEVTABLE_LEN; i++) { - if (PciDevTable[i].VenId == devicesInfo->GetInfo()->id[0] & 0xffff && - PciDevTable[i].DevId == devicesInfo->GetInfo()->id[1] & 0xffff) { - cardName = PciDevTable[i].ChipDesc; - break; - } - } - } - break; - case B_PCMCIA_BUS: vendor = "XX"; break; - default: vendor = ""; break; - } - - BString state = "Enabled"; - if (!(devicesInfo->GetInfo()->flags & B_DEVICE_INFO_ENABLED)) - switch (devicesInfo->GetInfo()->config_status) { - case B_DEV_RESOURCE_CONFLICT: state = "Disabled by System"; break; - case B_DEV_DISABLED_BY_USER: state = "Disabled by User"; break; - default: state = "Disabled for Unknown Reason"; break; - } - - labelRect = BRect(137, 10, 400, 30); - label = new BStringView(labelRect, "Card Name", cardName.String()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Device Name", devicesInfo->GetDeviceName()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Logical Device Name", logicalDeviceName.String()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Bus Type", bus.String()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Device Type", deviceType1.String()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Device Type", deviceType2.String()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Vendor", vendor.String()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Card ID", cardID.String()); - info->AddChild(label); - if (isISAPnP) { - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Logical Device ID", logicalString.String()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Compatible ID", logicalString.String()); - info->AddChild(label); - } - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Current State", state.String()); - info->AddChild(label); - labelRect.OffsetBy(0, 18); - label = new BStringView(labelRect, "Resource Conflicts", resourceConflicts.String()); - info->AddChild(label); - - - BTab *tab = new BTab(); - tabView->AddTab(resources, tab); - tab->SetLabel("Resources"); - tab = new BTab(); - tabView->AddTab(info, tab); - tab->SetLabel("Info"); - - background->AddChild(tabView); - - ioListView->Select(0); - memoryListView->Select(0); -} -// -------------------------------------------------------------------------------------------------- // - - -// ConfigurationWindow::MessageReceived -- receives messages -void -ConfigurationWindow::MessageReceived (BMessage *message) -{ - switch(message->what) - { - default: - BWindow::MessageReceived(message); - break; - } -} -// -------------------------------------------------------------------------------------------------- // - -// ConfigurationWindow::QuitRequested -- Post a message to the app to quit -bool -ConfigurationWindow::QuitRequested() -{ - fItem->SetWindow(NULL); - return true; -} -// ---------------------------------------------------------------------------------------------------------- // - - - - - diff --git a/src/apps/devices/Device.cpp b/src/apps/devices/Device.cpp new file mode 100644 index 0000000000..6e5b394c5c --- /dev/null +++ b/src/apps/devices/Device.cpp @@ -0,0 +1,128 @@ +/* + * Copyright 2008-2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Pieter Panman + */ + + +#include "Device.h" + +#include + + +// This list comes from the pciid list, except for the last one +const char* kCategoryString[] = { + "Unclassified device", // 0x00 + "Mass storage controller", // 0x01 + "Network controller", // 0x02 + "Display controller", // 0x03 + "Multimedia controller", // 0x04 + "Memory controller", // 0x05 + "Bridge", // 0x06 + "Communication controller", // 0x07 + "Generic system peripheral", // 0x08 + "Input device controller", // 0x09 + "Docking station", // 0x0a + "Processor", // 0x0b + "Serial bus controller", // 0x0c + "Wireless controller", // 0x0d + "Intelligent controller", // 0x0e + "Satellite communications controller", // 0x0f + "Encryption controller", // 0x10 + "Signal processing controller", // 0x11 + "Computer" // 0x12 (added later) +}; + + +Device::Device(Device* physicalParent, BusType busType, Category category, + const BString& name, const BString& manufacturer, + const BString& driverUsed, const BString& devPathsPublished) + : + BStringItem(name.String()), + fBusType(busType), + fCategory(category), + fPhysicalParent(physicalParent) +{ + SetAttribute("Device name", name); + SetAttribute("Manufacturer", manufacturer); + SetAttribute("Driver used", driverUsed); + SetAttribute("Device paths", devPathsPublished); +} + + +Device::~Device() +{ +} + + +void +Device::SetAttribute(const BString& name, const BString& value) +{ + if (name == "Device name") { + SetText(value.String()); + } + fAttributeMap[name] = value; +} + + +Attributes +Device::GetBasicAttributes() +{ + Attributes attributes; + attributes.push_back(Attribute("Device name:", GetName())); + attributes.push_back(Attribute("Manufacturer:", GetManufacturer())); + return attributes; +} + + +Attributes +Device::GetBusAttributes() +{ + Attributes attributes; + attributes.push_back(Attribute("None", "")); + return attributes; +} + + +Attributes +Device::GetAllAttributes() +{ + Attributes attributes; + AttributeMapIterator iter; + for (iter = fAttributeMap.begin(); iter != fAttributeMap.end(); iter++) { + attributes.push_back(Attribute(iter->first, iter->second)); + } + return attributes; +} + + +BString +Device::GetBasicStrings() +{ + BString str; + str << "Device Name\t\t\t\t: " << GetName() << "\n"; + str << "Manufacturer\t\t\t: " << GetManufacturer() << "\n"; + str << "Driver used\t\t\t\t: " << GetDriverUsed() << "\n"; + str << "Device paths\t: " << GetDevPathsPublished(); + return str; +} + +BString +Device::GetBusStrings() +{ + return "None"; +} + + +BString +Device::GetAllStrings() +{ + BString str; + AttributeMapIterator iter; + for (iter = fAttributeMap.begin(); iter != fAttributeMap.end(); iter++) { + str << iter->first << " : " << iter->second << "\n"; + } + return str; +} diff --git a/src/apps/devices/Device.h b/src/apps/devices/Device.h new file mode 100644 index 0000000000..ab8fe40662 --- /dev/null +++ b/src/apps/devices/Device.h @@ -0,0 +1,109 @@ +/* + * Copyright 2008-2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Pieter Panman + */ +#ifndef DEVICE_H +#define DEVICE_H + + +#include +#include + +#include +#include + +extern "C" { +#include "dm_wrapper.h" +} + + +typedef enum { + BUS_ISA = 1, + BUS_PCI, + BUS_SCSI, + BUS_NONE +} BusType; + + +struct Attribute { + Attribute(BString name, BString value) + { fName = name; fValue = value; } + BString fName; + BString fValue; +}; + + +typedef std::map::const_iterator AttributeMapIterator; +typedef std::map AttributeMap; +typedef std::pair AttributePair; +typedef std::vector Attributes; + + +typedef enum { + CAT_NONE = 0, + CAT_BUS = 6, + CAT_COMPUTER = 0x12 +} Category; + + +extern const char* kCategoryString[]; + + +class Device : public BStringItem { +public: + Device(Device* physicalParent, + BusType busType=BUS_NONE, + Category category=CAT_NONE, + const BString& name = "unknown", + const BString& manufacturer = "unknown", + const BString& driverUsed = "unknown", + const BString& devPathsPublished = "unknown"); + virtual ~Device(); + + virtual BString GetName() + { return fAttributeMap["Device name"]; } + virtual BString GetManufacturer() + { return fAttributeMap["Manufacturer"]; } + virtual BString GetDriverUsed() + { return fAttributeMap["Driver used"]; } + virtual BString GetDevPathsPublished() + { return fAttributeMap["Device paths"]; } + virtual Category GetCategory() const + { return fCategory; } + virtual Device* GetPhysicalParent() const + { return fPhysicalParent; } + virtual BusType GetBusType() const + { return fBusType; } + + virtual Attributes GetBasicAttributes(); + virtual Attributes GetBusAttributes(); + virtual Attributes GetAllAttributes(); + + virtual BString GetBasicStrings(); + virtual BString GetBusStrings(); + virtual BString GetAllStrings(); + + virtual BString GetBusTabName() + { return "Bus Information"; } + + virtual Attribute GetAttribute(const BString& name) + { return Attribute(name.String(), + fAttributeMap[name]); } + + virtual void SetAttribute(const BString& name, + const BString& value); + + virtual void InitFromAttributes() { return; } + +protected: + AttributeMap fAttributeMap; + BusType fBusType; + Category fCategory; + Device* fPhysicalParent; +}; + +#endif /* DEVICE_H */ + diff --git a/src/apps/devices/DevicePCI.cpp b/src/apps/devices/DevicePCI.cpp new file mode 100644 index 0000000000..9790b00d23 --- /dev/null +++ b/src/apps/devices/DevicePCI.cpp @@ -0,0 +1,127 @@ +/* + * Copyright 2008-2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Pieter Panman + */ + + +#include + +#include "DevicePCI.h" + +extern "C" { +#include "dm_wrapper.h" +#include "pcihdr.h" +#include "pci-utils.h" +} + + +DevicePCI::DevicePCI(Device* parent) + : + Device(parent), + fClassBaseId(0), + fClassSubId(0), + fClassApiId(0), + fVendorId(0), + fDeviceId(0), + fSubsystemVendorId(0), + fSubSystemId(0) +{ +} + + +DevicePCI::~DevicePCI() +{ +} + + +BString ToHex(uint16 num) +{ + std::stringstream ss; + ss.flags(std::ios::hex | std::ios::showbase); + ss << num; + return BString(ss.str().c_str()); +} + + +void +DevicePCI::InitFromAttributes() +{ + // Process the attributes + fClassBaseId = atoi(fAttributeMap[B_DEVICE_TYPE].String()); + fClassSubId = atoi(fAttributeMap[B_DEVICE_SUB_TYPE].String()); + fClassApiId = atoi(fAttributeMap[B_DEVICE_INTERFACE].String()); + fVendorId = atoi(fAttributeMap[B_DEVICE_VENDOR_ID].String()); + fDeviceId = atoi(fAttributeMap[B_DEVICE_ID].String()); + + // Looks better in Hex, so rewrite + fAttributeMap[B_DEVICE_TYPE] = ToHex(fClassBaseId); + fAttributeMap[B_DEVICE_SUB_TYPE] = ToHex(fClassSubId); + fAttributeMap[B_DEVICE_INTERFACE] = ToHex(fClassApiId); + fAttributeMap[B_DEVICE_VENDOR_ID] = ToHex(fVendorId); + fAttributeMap[B_DEVICE_ID] = ToHex(fDeviceId); + + // Fetch ClassInfo + char classInfo[64]; + get_class_info(fClassBaseId, fClassSubId, fClassApiId, classInfo, sizeof(classInfo)); + + // Fetch ManufacturerName + BString ManufacturerName; + const char *venShort; + const char *venFull; + get_vendor_info(fVendorId, &venShort, &venFull); + if (!venShort && !venFull) { + ManufacturerName << "Unkown"; + } else if (venShort && venFull) { + ManufacturerName << venFull << "(" << venShort << ")"; + } else { + ManufacturerName << (venShort ? venShort : venFull); + } + + // Fetch DeviceName + BString DeviceName; + const char *devShort; + const char *devFull; + get_device_info(fVendorId, fDeviceId, fSubsystemVendorId, fSubSystemId, &devShort, &devFull); + if (!devShort && !devFull) { + DeviceName << "Unknown"; + } else if (devShort && devFull) { + DeviceName << devFull << "(" << devShort << ")"; + } else { + DeviceName << (devShort ? devShort : devFull); + } + + SetAttribute("Device name", DeviceName); + SetAttribute("Manufacturer", ManufacturerName); + SetAttribute("Driver used", "Not implemented"); + SetAttribute("Device paths", "Not implemented"); + SetAttribute("Class Info", classInfo); + fCategory = (Category)fClassBaseId; + BString outlineName; + outlineName << ManufacturerName << " " << DeviceName; + SetText(outlineName.String()); +} + + +Attributes +DevicePCI::GetBusAttributes() +{ + Attributes attributes; + attributes.push_back(GetAttribute(B_DEVICE_TYPE)); + attributes.push_back(GetAttribute(B_DEVICE_SUB_TYPE)); + attributes.push_back(GetAttribute(B_DEVICE_INTERFACE)); + attributes.push_back(GetAttribute(B_DEVICE_VENDOR_ID)); + attributes.push_back(GetAttribute(B_DEVICE_ID)); + return attributes; +} + + +BString +DevicePCI::GetBusStrings() +{ + BString str; + str << "Class Info:\t\t\t\t: " << fAttributeMap["Class Info"]; + return str; +} diff --git a/src/apps/devices/DevicePCI.h b/src/apps/devices/DevicePCI.h new file mode 100644 index 0000000000..87c5575ebf --- /dev/null +++ b/src/apps/devices/DevicePCI.h @@ -0,0 +1,36 @@ +/* + * Copyright 2008-2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Pieter Panman + */ +#ifndef DEVICEPCI_H +#define DEVICEPCI_H + + +#include "Device.h" + + +class DevicePCI : public Device { +public: + DevicePCI(Device* parent); + virtual ~DevicePCI(); + virtual Attributes GetBusAttributes(); + virtual BString GetBusStrings(); + virtual void InitFromAttributes(); + + virtual BString GetBusTabName() + { return "PCI Information"; } + +private: + uint16 fClassBaseId; + uint16 fClassSubId; + uint16 fClassApiId; + uint16 fVendorId; + uint16 fDeviceId; + uint16 fSubsystemVendorId; + uint16 fSubSystemId; +}; + +#endif /* DEVICEPCI_H */ diff --git a/src/apps/devices/Devices.cpp b/src/apps/devices/Devices.cpp deleted file mode 100644 index 84ed7865d1..0000000000 --- a/src/apps/devices/Devices.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -// -// Copyright (c) 2003-2004, Haiku -// -// This software is part of the Haiku distribution and is covered -// by the Haiku license. -// -// -// File: Devices.cpp -// Author: Sikosis, Jérôme Duval -// Description: Devices Preferences -// Created : March 04, 2003 -// -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - - -// Includes -------------------------------------------------------------------------------------------------- // -#include - -#include "DevicesWindows.h" - -#define APP_SIGNATURE "application/x-vnd.Haiku.Devices" // Application Signature and Title - -class Devices : public BApplication -{ - public: - Devices(); - virtual void MessageReceived(BMessage *message); - - private: - -}; - -// ---------------------------------------------------------------------------------------------------------- // - -// Devices -- constructor -Devices::Devices() : BApplication (APP_SIGNATURE) -{ - BRect DevicesWindowRect(0,0,396,400); - new DevicesWindow(DevicesWindowRect); -} -// ---------------------------------------------------------------------------------------------------------- // - - -// Devices::MessageReceived -- handles incoming messages -void Devices::MessageReceived (BMessage *message) -{ - switch(message->what) - { - default: - BApplication::MessageReceived(message); // pass it along ... - break; - } -} -// ---------------------------------------------------------------------------------------------------------- // - - -// Devices Main -int -main(void) -{ - Devices theApp; - theApp.Run(); - return 0; -} -// end ------------------------------------------------------------------------------------------------------ // - diff --git a/src/apps/devices/Devices.rdef b/src/apps/devices/Devices.rdef index 50e43999cd..3556d4f06d 100644 --- a/src/apps/devices/Devices.rdef +++ b/src/apps/devices/Devices.rdef @@ -1,5 +1,5 @@ -resource app_signature "application/x-vnd.Haiku.Devices"; +resource app_signature "application/x-vnd.Haiku-Devices"; resource app_version { @@ -9,12 +9,12 @@ resource app_version /* 0 = development 1 = alpha 2 = beta 3 = gamma 4 = golden master 5 = final */ - variety = 2, + variety = 1, internal = 0, short_info = "Devices", - long_info = "Devices ©2002-2009 Haiku" + long_info = "Devices ©2009 Haiku" }; resource app_flags B_SINGLE_LAUNCH; diff --git a/src/apps/devices/DevicesApplication.cpp b/src/apps/devices/DevicesApplication.cpp new file mode 100644 index 0000000000..f779495aa6 --- /dev/null +++ b/src/apps/devices/DevicesApplication.cpp @@ -0,0 +1,119 @@ +/* + * Copyright 2008-2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT license. + * + * Authors: + * Pieter Panman + */ + +#include +#include +#include + +#include "DevicesView.h" + + +class DevicesApplication : public BApplication { +public: + DevicesApplication(); + virtual void AboutRequested(); + static void ShowAbout(); +}; + + +class DevicesWindow : public BWindow { +public: + DevicesWindow(); + virtual void MessageReceived(BMessage* message); +private: + DevicesView* fDevicesView; +}; + + +DevicesApplication::DevicesApplication() + : + BApplication("application/x-vnd.Haiku-Devices") +{ + DevicesWindow* window = new DevicesWindow(); + window->CenterOnScreen(); + window->Show(); +} + + +void +DevicesApplication::AboutRequested() +{ + ShowAbout(); +} + + +void +DevicesApplication::ShowAbout() +{ + BAlert* alert = new BAlert("about", "Devices\n" + "\twritten by Pieter Panman\n" + "\n" + "\tBased on listdev by Jérôme Duval\n" + "\tand the previous Devices preference\n" + "\tby Jérôme Duval and Sikosis\n" + "\tCopyright 2009, Haiku Inc.\n", "Ok"); + BTextView* view = alert->TextView(); + BFont font; + + view->SetStylable(true); + + view->GetFont(&font); + font.SetSize(18); + font.SetFace(B_BOLD_FACE); + view->SetFontAndColor(0, 7, &font); + + alert->Go(); +} + + +DevicesWindow::DevicesWindow() + : + BWindow(BRect(50, 50, 750, 550), "Devices", B_TITLED_WINDOW, + B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS + | B_QUIT_ON_WINDOW_CLOSE) +{ + float minWidth; + float maxWidth; + float minHeight; + float maxHeight; + GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight); + minWidth = 600; + minHeight = 300; + SetSizeLimits(minWidth, maxWidth, minHeight, maxHeight); + fDevicesView = new DevicesView(Bounds()); + AddChild(fDevicesView); +} + + +void +DevicesWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kMsgRefresh: + case kMsgReportCompatibility: + case kMsgGenerateSysInfo: + case kMsgSelectionChanged: + case kMsgOrderCategory: + case kMsgOrderConnection: + fDevicesView->MessageReceived(message); + break; + + default: + BWindow::MessageReceived(message); + break; + } +} + + +int +main() +{ + DevicesApplication app; + app.Run(); + return 0; +} diff --git a/src/apps/devices/DevicesInfo.cpp b/src/apps/devices/DevicesInfo.cpp deleted file mode 100644 index 983753460d..0000000000 --- a/src/apps/devices/DevicesInfo.cpp +++ /dev/null @@ -1,219 +0,0 @@ -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -// -// Copyright (c) 2004, Haiku -// -// This software is part of the Haiku distribution and is covered -// by the Haiku license. -// -// -// File: DevicesInfo.cpp -// Author: Jérôme Duval -// Description: Devices Preferences -// Created : April 15, 2004 -// -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - -#include -#include -#include -#include -#include "DevicesInfo.h" -#include -#include "isapnpids.h" - -const char *base_desc[] = { - "Legacy", - "Mass Storage Controller", - "Network Controller", // "NIC" - "Display Controller", - "Multimedia Device", - "Memory Controller", - "Bridge Device", - "Communication Device", - "Motherboard Device", // "Generic System Peripheral" - "Input Device", - "Docking Station", - "Processor", // "CPU" - "Serial Bus Controller" -}; - -struct subtype_descriptions { - uchar base, subtype; - char *name; -} subtype_desc[] = { - { 0, 0, "non-VGA" }, - { 0, 0, "VGA" }, - { 1, 0, "SCSI Controller" }, - { 1, 1, "IDE Controller" }, // "IDE" - { 1, 2, "Floppy Controller" }, // "Floppy" - { 1, 3, "IPI" }, - { 1, 4, "RAID" }, - { 2, 0, "Ethernet" }, - { 2, 1, "Token Ring" }, - { 2, 2, "FDDI" }, - { 2, 3, "ATM" }, - { 3, 0, "VGA" }, // "VGA/8514" - { 3, 1, "XGA" }, - { 4, 0, "Video" }, - { 4, 1, "Sound" }, // was "Audio" - { 5, 0, "RAM" }, - { 5, 1, "Flash Memory" }, // "Flash" - { 6, 0, "Host bridge" }, // "Host" - { 6, 1, "ISA bridge" }, // "ISA" - { 6, 2, "EISA" }, - { 6, 3, "MCA" }, - { 6, 4, "PCI-PCI bridge"}, // "PCI-PCI" - { 6, 5, "PCMCIA" }, - { 6, 6, "NuBus" }, - { 6, 7, "CardBus bridge" }, // "CardBus" - { 7, 0, "Serial Port" }, // "Serial" - { 7, 1, "Parallel Port" }, // "Parallel" - { 8, 0, "PIC" }, - { 8, 1, "DMA" }, - { 8, 2, "Timer" }, - { 8, 3, "RTC" }, - { 9, 0, "Keyboard" }, - { 9, 1, "Digitizer" }, - { 9, 2, "Mouse" }, - {10, 0, "Generic" }, - {11, 0, "386" }, - {11, 1, "486" }, - {11, 2, "Pentium" }, - {11,16, "Alpha" }, - {11,32, "PowerPC" }, - {11,48, "Coprocessor" }, - {12, 0, "FireWire" }, // was "IEEE 1394" - {12, 1, "ACCESS" }, - {12, 2, "SSA" }, - {12, 3, "USB" }, - {12, 4, "Fibre Channel" }, - {255,255, NULL } -}; - - -DevicesInfo::DevicesInfo(struct device_info *info, - struct device_configuration *current, - struct possible_device_configurations *possible) - : fInfo(info), - fCurrent(current), - fPossible(possible) -{ - struct subtype_descriptions *s = NULL; - - if (info->devtype.subtype != 0x80) { - s = subtype_desc; - - while (s->name) { - if ((info->devtype.base == s->base) && (info->devtype.subtype == s->subtype)) - break; - s++; - } - } - - fDeviceName = strdup((info->devtype.base < 13) - ? ( (s && s->name) ? s->name : base_desc[info->devtype.base]) - : "Unknown"); - - fCardName = fDeviceName; - if (fInfo->bus == B_ISA_BUS) { - uint32 id = fInfo->id[0]; - if ((id >> 24 == 'P') - && (((id >> 16) & 0xff) == 'n') - && (((id >> 8) & 0xff) == 'P')) { - id = fInfo->id[3]; - char string[255]; - sprintf(string, "%c%c%c%x%x%x%x", - ((uint8)(id >> 2) & 0x1f) + 'A' - 1, - ((uint8)(id & 0x3) << 3) + ((uint8)(id >> 13) & 0x7) + 'A' - 1, - (uint8)(id >> 8) & 0x1f + 'A' - 1, - (uint8)(id >> 20) & 0xf, - (uint8)(id >> 16) & 0xf, - (uint8)(id >> 28) & 0xf, - (uint8)((id >> 24) & 0xf)); - for (uint32 i=0; idevtype.base < 13) ? base_desc[info->devtype.base] : "Unknown"); - fSubTypeString = strdup((s && s->name) ? s->name : "Unknown"); -} - - -DevicesInfo::~DevicesInfo() -{ - delete fInfo; - delete fCurrent; - delete fPossible; - delete fDeviceName; - delete fBaseString; - delete fSubTypeString; -} - - -DeviceItem::DeviceItem(DevicesInfo *info, const char* name) - : BListItem(), - fInfo(info), - fWindow(NULL) -{ - fName = strdup(name); -} - -DeviceItem::~DeviceItem() -{ - delete fName; -} - -/*********************************************************** - * DrawItem - ***********************************************************/ -void -DeviceItem::DrawItem(BView *owner, BRect itemRect, bool complete) -{ - rgb_color kBlack = { 0,0,0,0 }; - rgb_color kHighlight = { 156,154,156,0 }; - - if (IsSelected() || complete) { - rgb_color color; - if (IsSelected()) - color = kHighlight; - else - color = owner->ViewColor(); - - owner->SetHighColor(color); - owner->SetLowColor(color); - owner->FillRect(itemRect); - owner->SetHighColor(kBlack); - - } else { - owner->SetLowColor(owner->ViewColor()); - } - - BFont font = be_plain_font; - font_height finfo; - font.GetHeight(&finfo); - - BPoint point = BPoint(itemRect.left + 4, itemRect.bottom - finfo.descent + 1); - - owner->SetHighColor(kBlack); - owner->SetFont(&font); - owner->MovePenTo(point); - owner->DrawString(fName); - - if (fInfo) { - point += BPoint(222, 0); - BString string = "enabled"; - if (!(fInfo->GetInfo()->flags & B_DEVICE_INFO_ENABLED)) - switch (fInfo->GetInfo()->config_status) { - case B_DEV_RESOURCE_CONFLICT: string = "disabled by system"; break; - case B_DEV_DISABLED_BY_USER: string = "disabled by user"; break; - default: string = "disabled for unknown reason"; break; - } - - owner->MovePenTo(point); - owner->DrawString(string.String()); - } -} - diff --git a/src/apps/devices/DevicesInfo.h b/src/apps/devices/DevicesInfo.h deleted file mode 100644 index db4ff30edc..0000000000 --- a/src/apps/devices/DevicesInfo.h +++ /dev/null @@ -1,59 +0,0 @@ -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -// -// Copyright (c) 2004, Haiku -// -// This software is part of the Haiku distribution and is covered -// by the Haiku license. -// -// -// File: DevicesInfo.h -// Author: Jérôme Duval -// Description: Devices Preferences -// Created : April 15, 2004 -// -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - -#ifndef __DEVICESINFO_H__ -#define __DEVICESINFO_H__ - -#include -#include -#include - -class DevicesInfo -{ - public: - DevicesInfo(struct device_info *info, - struct device_configuration *current, - struct possible_device_configurations *possible); - ~DevicesInfo(); - struct device_info * GetInfo() { return fInfo;} - char * GetDeviceName() const { return fDeviceName; } - char * GetCardName() const { return fCardName; } - char * GetBaseString() const { return fBaseString; } - char * GetSubTypeString() const { return fSubTypeString; } - struct device_configuration * GetCurrent() { return fCurrent;} - char * GetISAName() const; - private: - struct device_info *fInfo; - struct device_configuration *fCurrent; - struct possible_device_configurations *fPossible; - char* fDeviceName, *fCardName, *fBaseString, *fSubTypeString; -}; - -class DeviceItem : public BListItem -{ - public: - DeviceItem(DevicesInfo *info, const char* name); - ~DeviceItem(); - DevicesInfo *GetInfo() { return fInfo; } - virtual void DrawItem(BView *, BRect, bool = false); - BWindow *GetWindow() { return fWindow; }; - void SetWindow(BWindow *window) { fWindow = window; }; - private: - DevicesInfo *fInfo; - char* fName; - BWindow *fWindow; -}; - -#endif diff --git a/src/apps/devices/DevicesView.cpp b/src/apps/devices/DevicesView.cpp new file mode 100644 index 0000000000..7f93ecd44a --- /dev/null +++ b/src/apps/devices/DevicesView.cpp @@ -0,0 +1,392 @@ +/* + * Copyright 2008-2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT license. + * + * Authors: + * Pieter Panman + */ + + +#include +#include + +#include "DevicesView.h" + + +DevicesView::DevicesView(const BRect& rect) + : BView(rect, "DevicesView", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS) +{ + CreateLayout(); + RescanDevices(); + RebuildDevicesOutline(); +} + + +void +DevicesView::CreateLayout() +{ + SetLayout(new BGroupLayout(B_VERTICAL)); + + BMenuBar* menuBar = new BMenuBar("menu"); + BMenu* menu = new BMenu("Devices"); + BMenuItem* item; + menu->AddItem(new BMenuItem("Refresh Devices", new BMessage(kMsgRefresh), 'R')); + menu->AddItem(item = new BMenuItem("Report Compatibility", + new BMessage(kMsgReportCompatibility))); + item->SetEnabled(false); + menu->AddItem(item = new BMenuItem("Generate System Information", + new BMessage(kMsgGenerateSysInfo))); + item->SetEnabled(false); + menu->AddSeparatorItem(); + menu->AddItem(item = new BMenuItem("About Devices" B_UTF8_ELLIPSIS, + new BMessage(B_ABOUT_REQUESTED))); + menu->AddSeparatorItem(); + menu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q')); + menu->SetTargetForItems(this); + item->SetTarget(be_app); + menuBar->AddItem(menu); + + fDevicesOutline = new BOutlineListView("devices_list"); + fDevicesOutline->SetTarget(this); + fDevicesOutline->SetSelectionMessage(new BMessage(kMsgSelectionChanged)); + + BScrollView *scrollView = new BScrollView("devicesScrollView", + fDevicesOutline, B_WILL_DRAW | B_FRAME_EVENTS, true, true); + // Horizontal scrollbar doesn't behave properly like the vertical + // scrollbar... If you make the view bigger (exposing a larger percentage + // of the view), it does not adjust the width of the scroll 'dragger' + // why? Bug? In scrollview or in outlinelistview? + + BPopUpMenu* orderByPopupMenu = new BPopUpMenu("orderByMenu"); + BMenuItem* byCategory = new BMenuItem("category", + new BMessage(kMsgOrderCategory)); + BMenuItem* byConnection = new BMenuItem("connection", + new BMessage(kMsgOrderConnection)); + byCategory->SetMarked(true); + fOrderBy = byCategory->IsMarked() ? ORDER_BY_CATEGORY : + ORDER_BY_CONNECTION; + orderByPopupMenu->AddItem(byCategory); + orderByPopupMenu->AddItem(byConnection); + fOrderByMenu = new BMenuField("Order by:", orderByPopupMenu); + + fTabView = new BTabView("fTabView", B_WIDTH_FROM_LABEL); + + fBasicTab = new BTab(); + fBasicView = new PropertyListPlain("basicView"); + fTabView->AddTab(fBasicView, fBasicTab); + fBasicTab->SetLabel("Basic Information"); + + fDeviceTypeTab = new BTab(); + fBusView = new PropertyListPlain("busView"); + fTabView->AddTab(fBusView, fDeviceTypeTab); + fDeviceTypeTab->SetLabel("Bus"); + + fDetailedTab = new BTab(); + fAttributesView = new PropertyList("attributesView"); + fTabView->AddTab(fAttributesView, fDetailedTab); + fDetailedTab->SetLabel("Detailed"); + + AddChild(BGroupLayoutBuilder(B_VERTICAL,0) + .Add(menuBar) + .Add(BSplitLayoutBuilder(B_HORIZONTAL, 5) + .Add(BGroupLayoutBuilder(B_VERTICAL, 5) + .Add(fOrderByMenu, 1) + .Add(scrollView, 2) + ) + .Add(fTabView, 2) + .SetInsets(5, 5, 5, 5) + ) + ); +} + + +void +DevicesView::RescanDevices() +{ + // Empty the outline and delete the devices in the list, incl. categories + fDevicesOutline->MakeEmpty(); + DeleteDevices(); + DeleteCategoryMap(); + + // Fill the devices list + status_t error; + device_node_cookie rootCookie; + if ((error = init_dm_wrapper()) < 0) { + std::cerr << "Error initializing device manager: " << strerror(error) + << std::endl; + return; + } + + get_root(&rootCookie); + AddDeviceAndChildren(&rootCookie, NULL); + + uninit_dm_wrapper(); + + CreateCategoryMap(); +} + + +void +DevicesView::DeleteDevices() +{ + while(fDevices.size() > 0) { + delete fDevices.back(); + fDevices.pop_back(); + } +} + + +void +DevicesView::CreateCategoryMap() +{ + CategoryMapIterator iter; + for (unsigned int i = 0; i < fDevices.size(); i++) { + Category category = fDevices[i]->GetCategory(); + const char* categoryName = kCategoryString[category]; + + iter = fCategoryMap.find(category); + if( iter == fCategoryMap.end() ) { + // This category has not yet been added, add it. + fCategoryMap[category] = new Device(NULL, BUS_NONE, CAT_NONE, + categoryName); + } + } +} + + +void +DevicesView::DeleteCategoryMap() +{ + CategoryMapIterator iter; + for(iter = fCategoryMap.begin(); iter != fCategoryMap.end(); iter++) { + delete iter->second; + } + fCategoryMap.clear(); +} + + +int +DevicesView::SortItemsCompare(const BListItem *item1, + const BListItem *item2) +{ + const BStringItem* stringItem1 = dynamic_cast(item1); + const BStringItem* stringItem2 = dynamic_cast(item2); + if (!(stringItem1 && stringItem2)) { + // is this check necessary? + std::cerr << "Could not cast BListItem to BStringItem, file a bug\n"; + return 0; + } + return Compare(stringItem1->Text(),stringItem2->Text()); +} + + +void +DevicesView::RebuildDevicesOutline() +{ + // Rearranges existing Devices into the proper hierarchy + fDevicesOutline->MakeEmpty(); + + if (fOrderBy == ORDER_BY_CONNECTION) { + for (unsigned int i = 0; i < fDevices.size(); i++) { + if (fDevices[i]->GetPhysicalParent() == NULL) { + // process each parent device and its children + fDevicesOutline->AddItem(fDevices[i]); + AddChildrenToOutlineByConnection(fDevices[i]); + } + } + } + else if (fOrderBy == ORDER_BY_CATEGORY) { + // Add all categories to the outline + CategoryMapIterator iter; + for (iter = fCategoryMap.begin(); iter != fCategoryMap.end(); iter++) { + fDevicesOutline->AddItem(iter->second); + } + + // Add all devices under the categories + for (unsigned int i = 0; i < fDevices.size(); i++) { + Category category = fDevices[i]->GetCategory(); + + iter = fCategoryMap.find(category); + if(iter == fCategoryMap.end()) { + std::cerr << "Tried to add device without category, file a bug\n"; + continue; + } + else { + fDevicesOutline->AddUnder(fDevices[i], iter->second); + } + } + fDevicesOutline->SortItemsUnder(NULL, true, SortItemsCompare); + } + // TODO: Implement BY_BUS +} + + +void +DevicesView::AddChildrenToOutlineByConnection(Device* parent) +{ + for (unsigned int i = 0; i < fDevices.size(); i++) { + if (fDevices[i]->GetPhysicalParent() == parent) { + fDevicesOutline->AddUnder(fDevices[i], parent); + AddChildrenToOutlineByConnection(fDevices[i]); + } + } +} + + +void +DevicesView::AddDeviceAndChildren(device_node_cookie *node, Device* parent) +{ + Attributes attributes; + Device* newDevice = NULL; + + // Copy all its attributes, + // necessary because we can only request them once from the device manager + char data[256]; + struct device_attr_info attr; + attr.cookie = 0; + attr.node_cookie = *node; + attr.value.raw.data = data; + attr.value.raw.length = sizeof(data); + + while (dm_get_next_attr(&attr) == B_OK) { + BString attrString; + switch (attr.type) { + case B_STRING_TYPE: + attrString << attr.value.string; + break; + case B_UINT8_TYPE: + attrString << attr.value.ui8; + break; + case B_UINT16_TYPE: + attrString << attr.value.ui16; + break; + case B_UINT32_TYPE: + attrString << attr.value.ui32; + break; + case B_UINT64_TYPE: + attrString << attr.value.ui64; + break; + default: + attrString << "Raw data"; + } + attributes.push_back(Attribute(attr.name, attrString)); + } + + // Determine what type of device it is and create it + for (unsigned int i = 0; i < attributes.size(); i++) { + // Devices Root + if (attributes[i].fName == "device/pretty name" + && attributes[i].fValue == "Devices Root") { + newDevice = new Device(parent, BUS_NONE, CAT_COMPUTER, "Computer"); + break; + } + + // PCI bus + if (attributes[i].fName == "device/pretty name" + && attributes[i].fValue == "PCI") { + newDevice = new Device(parent, BUS_PCI, CAT_BUS, "PCI Bus"); + break; + } + + // ISA bus + if (attributes[i].fName == "device/bus" + && attributes[i].fValue == "isa") { + newDevice = new Device(parent, BUS_ISA, CAT_BUS, "ISA Bus"); + break; + } + + // PCI device + if (attributes[i].fName == B_DEVICE_BUS + && attributes[i].fValue == "pci") { + newDevice = new DevicePCI(parent); + break; + } + } + + if (newDevice == NULL) { + newDevice = new Device(parent, BUS_NONE, CAT_NONE, "Unknown Device"); + } + + // Add its attributes to the device, initialize it and add to the list. + for (unsigned int i = 0; i < attributes.size(); i++) { + newDevice->SetAttribute(attributes[i].fName, attributes[i].fValue); + } + newDevice->InitFromAttributes(); + fDevices.push_back(newDevice); + + // Process children + status_t err; + device_node_cookie child = *node; + + if (get_child(&child) != B_OK) + return; + + do { + AddDeviceAndChildren(&child, newDevice); + } while ((err = get_next_child(&child)) == B_OK); +} + + +DevicesView::~DevicesView() +{ + DeleteDevices(); +} + + +void +DevicesView::MessageReceived(BMessage *msg) +{ + switch (msg->what) { + case kMsgSelectionChanged: + { + int32 selected = fDevicesOutline->CurrentSelection(0); + if (selected >= 0) { + Device* device = (Device*)fDevicesOutline->ItemAt(selected); + fBasicView->AddAttributes(device->GetBasicAttributes()); + fBusView->AddAttributes(device->GetBusAttributes()); + fAttributesView->AddAttributes(device->GetAllAttributes()); + fDeviceTypeTab->SetLabel(device->GetBusTabName()); + // hmm the label doesn't automatically refresh + fTabView->Invalidate(); + } + break; + } + + case kMsgOrderCategory: + { + fOrderBy = ORDER_BY_CATEGORY; + RescanDevices(); + RebuildDevicesOutline(); + break; + } + + case kMsgOrderConnection: + { + fOrderBy = ORDER_BY_CONNECTION; + RescanDevices(); + RebuildDevicesOutline(); + break; + } + + case kMsgRefresh: + { + RescanDevices(); + RebuildDevicesOutline(); + break; + } + + case kMsgReportCompatibility: + { + break; + } + + case kMsgGenerateSysInfo: + { + break; + } + + default: + BView::MessageReceived(msg); + break; + } +} diff --git a/src/apps/devices/DevicesView.h b/src/apps/devices/DevicesView.h new file mode 100644 index 0000000000..56f2fbd55a --- /dev/null +++ b/src/apps/devices/DevicesView.h @@ -0,0 +1,85 @@ +/* + * Copyright 2008-2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT license. + * + * Authors: + * Pieter Panman + */ +#ifndef DEVICESVIEW_H +#define DEVICESVIEW_H + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "Device.h" +#include "DevicePCI.h" +#include "PropertyList.h" +#include "PropertyListPlain.h" + +static const uint32 kMsgRefresh = 'refr'; +static const uint32 kMsgReportCompatibility = 'repo'; +static const uint32 kMsgGenerateSysInfo = 'sysi'; +static const uint32 kMsgSelectionChanged = 'selc'; +static const uint32 kMsgOrderCategory = 'ocat'; +static const uint32 kMsgOrderConnection = 'ocon'; + +typedef enum { + ORDER_BY_CONNECTION, + ORDER_BY_CATEGORY +} OrderByType; + +typedef std::map CategoryMap; +typedef std::map::const_iterator CategoryMapIterator; + +typedef std::vector Devices; + + +class DevicesView : public BView { + public: + DevicesView(const BRect& r); + ~DevicesView(); + + virtual void CreateLayout(); + + virtual void MessageReceived(BMessage* msg); + virtual void RescanDevices(); + virtual void CreateCategoryMap(); + virtual void DeleteCategoryMap(); + + virtual void DeleteDevices(); + virtual void RebuildDevicesOutline(); + virtual void AddChildrenToOutlineByConnection(Device* parent); + virtual void AddDeviceAndChildren(device_node_cookie* node, + Device* parent); + static int SortItemsCompare(const BListItem*, const BListItem*); + + private: + BOutlineListView* fDevicesOutline; + PropertyListPlain* fBasicView; + PropertyListPlain* fBusView; + PropertyList* fAttributesView; + BMenuField* fOrderByMenu; + BTabView* fTabView; + Devices fDevices; + OrderByType fOrderBy; + CategoryMap fCategoryMap; + BTab* fBasicTab; + BTab* fDeviceTypeTab; + BTab* fDetailedTab; + +}; + +#endif /* DEVICESVIEW_H */ diff --git a/src/apps/devices/DevicesWindow.cpp b/src/apps/devices/DevicesWindow.cpp deleted file mode 100644 index 1a74b7953f..0000000000 --- a/src/apps/devices/DevicesWindow.cpp +++ /dev/null @@ -1,507 +0,0 @@ -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -// -// Copyright (c) 2003-2004, OpenBeOS -// -// This software is part of the OpenBeOS distribution and is covered -// by the OpenBeOS license. -// -// -// File: DevicesWindow.cpp -// Author: Sikosis, Jérôme Duval -// Description: Devices Preferences -// Created : March 04, 2003 -// -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - -// Includes -------------------------------------------------------------------------------------------------- // -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "DevicesWindows.h" -#include "DevicesInfo.h" - -const uint32 MENU_FILE_ABOUT_DEVICES = 'mfad'; -const uint32 MENU_FILE_QUIT = 'mfqt'; -const uint32 MENU_DEVICES_REMOVE_JUMPERED_DEVICE = 'mdrj'; -const uint32 MENU_DEVICES_NEW_JUMPERED_DEVICE = 'mdnj'; -const uint32 MENU_DEVICES_NEW_JUMPERED_DEVICE_CUSTOM = 'mdcj'; -const uint32 MENU_DEVICES_NEW_JUMPERED_DEVICE_MODEM = 'mdcm'; -const uint32 MENU_DEVICES_RESOURCE_USAGE = 'mdru'; -const uint32 BTN_CONFIGURE = 'bcfg'; -const uint32 SELECTION_CHANGED = 'slch'; - - -// DevicesWindow - Constructor -DevicesWindow::DevicesWindow(BRect frame) : BWindow (frame, "Devices", B_TITLED_WINDOW, B_NORMAL_WINDOW_FEEL , 0) -{ - InitWindow(); - CenterOnScreen(); - - // Load User Settings - BPath path; - find_directory(B_USER_SETTINGS_DIRECTORY,&path); - path.Append("Devices_Settings",true); - BFile file(path.Path(),B_READ_ONLY); - BMessage msg; - msg.Unflatten(&file); - LoadSettings (&msg); - - status_t error; - - if ((error = init_cm_wrapper()) < 0) { - printf("Error initializing configuration manager (%s)\n", strerror(error)); - exit(1); - } - - InitDevices(B_ISA_BUS); - InitDevices(B_PCI_BUS); - - for (int32 i=fList.CountItems()-1; i>=0; i--) { - DevicesInfo *deviceInfo = (DevicesInfo *) fList.ItemAt(i); - struct device_info *info = deviceInfo->GetInfo(); - BListItem *item = systemMenu; - if (info->bus == B_ISA_BUS) { - uint32 id = info->id[0]; - if ((id >> 24 == 'P') - && (((id >> 16) & 0xff) == 'n') - && (((id >> 8) & 0xff) == 'P')) { - item = isaMenu; - } else { - item = systemMenu; - } - } else if (info->bus == B_PCI_BUS) - item = pciMenu; - - outline->AddUnder(new DeviceItem(deviceInfo, deviceInfo->GetCardName()), item); - } - - if (outline->CountItemsUnder(jumperedMenu, true)==0) - outline->AddUnder(new BStringItem(""), jumperedMenu); - if (outline->CountItemsUnder(pciMenu, true)==0) - outline->AddUnder(new BStringItem(""), pciMenu); - if (outline->CountItemsUnder(isaMenu, true)==0) - outline->AddUnder(new BStringItem(""), isaMenu); - if (outline->CountItemsUnder(systemMenu, true)==0) - outline->AddUnder(new BStringItem(""), systemMenu); - - Show(); -} -// ---------------------------------------------------------------------------------------------------------- // - - -// DevicesWindow - Destructor -DevicesWindow::~DevicesWindow() -{ - void *item; - while ((item = fList.RemoveItem((int32)0))) - delete (DevicesInfo*)item; - uninit_cm_wrapper(); -} -// ---------------------------------------------------------------------------------------------------------- // - - -// DevicesWindow::InitWindow -- Initialization Commands here -void DevicesWindow::InitWindow(void) -{ - BRect r; - r = Bounds(); // the whole view - - BMenuItem *mniRemoveJumperedDevice; - - // Add the menu bar - menubar = new BMenuBar(r, "menu_bar"); - - // Add File menu to menu bar - BMenu *menu = new BMenu("File"); - menu->AddItem(new BMenuItem("About Devices" B_UTF8_ELLIPSIS, new BMessage(MENU_FILE_ABOUT_DEVICES), 0)); - menu->AddSeparatorItem(); - menu->AddItem(new BMenuItem("Quit", new BMessage(MENU_FILE_QUIT), 'Q')); - menubar->AddItem(menu); - - menu = new BMenu("Devices"); - menubar->AddItem(menu); - - BMenu *jumperedDevicesMenu = new BMenu("New Jumpered Device"); - jumperedDevicesMenu->AddItem(new BMenuItem("Custom" B_UTF8_ELLIPSIS, new BMessage(MENU_DEVICES_NEW_JUMPERED_DEVICE_CUSTOM), 0)); - jumperedDevicesMenu->AddItem(new BMenuItem("Modem" B_UTF8_ELLIPSIS, new BMessage(MENU_DEVICES_NEW_JUMPERED_DEVICE_MODEM), 0)); - - //DevicesMenu->AddItem(new BMenuItem("New Jumpered Device", new BMessage(MENU_DEVICES_NEW_JUMPERED_DEVICE), NULL)); - menu->AddItem(jumperedDevicesMenu); - - menu->AddItem(mniRemoveJumperedDevice = new BMenuItem("Remove Jumpered Device", new BMessage(MENU_DEVICES_REMOVE_JUMPERED_DEVICE), 'R')); - menu->AddSeparatorItem(); - menu->AddItem(new BMenuItem("Resource Usage", new BMessage(MENU_DEVICES_RESOURCE_USAGE), 'U')); - - mniRemoveJumperedDevice->SetEnabled(false); - - // Create the StringViews - stvDeviceName = new BStringView(BRect(16, 16, 150, 40), "DeviceName", "Device Name"); - stvCurrentState = new BStringView(BRect(248, 16, r.right-10, 40), "CurrentState", "Current State"); - - float fCurrentHeight = 279; - float fCurrentGap = 15; - stvIRQ = new BStringView(BRect(r.left+22,r.top+fCurrentHeight,r.right-13,r.top+fCurrentHeight+20),"IRQ","IRQs:", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM); - fCurrentHeight = fCurrentHeight + fCurrentGap; - stvDMA = new BStringView(BRect(r.left+22,r.top+fCurrentHeight,r.right-13,r.top+fCurrentHeight+20),"DMA","DMAs:", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM); - fCurrentHeight = fCurrentHeight + fCurrentGap; - stvIORanges = new BStringView(BRect(r.left+22,r.top+fCurrentHeight,r.right-13,r.top+fCurrentHeight+20),"IORanges","IO Ranges:", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM); - fCurrentHeight = fCurrentHeight + fCurrentGap; - stvMemoryRanges = new BStringView(BRect(r.left+22,r.top+fCurrentHeight,r.right-13,r.top+fCurrentHeight+20),"MemoryRanges","Memory Ranges:", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM); - fCurrentHeight = fCurrentHeight + fCurrentGap; - - // Create the OutlineView - BRect outlinerect(r.left+14,r.top+45,r.right-28,r.top+262); - BScrollView *outlinesv; - - outline = new BOutlineListView(outlinerect,"devices_list", B_SINGLE_SELECTION_LIST, B_FOLLOW_LEFT_RIGHT|B_FOLLOW_TOP_BOTTOM); - outline->AddItem(systemMenu = new DeviceItem(NULL, "System Devices")); - outline->AddItem(isaMenu = new DeviceItem(NULL, "ISA/Plug and Play Devices")); - outline->AddItem(pciMenu = new DeviceItem(NULL, "PCI Devices")); - outline->AddItem(jumperedMenu = new DeviceItem(NULL, "Jumpered Devices")); - - outline->SetSelectionMessage(new BMessage(SELECTION_CHANGED)); - outline->SetInvocationMessage(new BMessage(BTN_CONFIGURE)); - - // Add ScrollView to Devices Window - outlinesv = new BScrollView("scroll_devices", outline, B_FOLLOW_LEFT_RIGHT|B_FOLLOW_TOP_BOTTOM, 0, false, true, B_FANCY_BORDER); - - // Setup the OutlineView - outline->AllAttached(); - outlinesv->SetBorderHighlighted(true); - - // Back and Fore ground Colours - outline->SetHighColor(0,0,0,0); - outline->SetLowColor(255,255,255,0); - - // Font Settings - BFont OutlineFont; - OutlineFont.SetSpacing(B_CHAR_SPACING); - OutlineFont.SetSize(12); - outline->SetFont(&OutlineFont,B_FONT_SHEAR | B_FONT_SPACING); - - // Create BBox (or Frame) - BBox *BottomFrame; - BRect BottomFrameRect(r.left+11,r.bottom-124,r.right-12,r.bottom-12); - BottomFrame = new BBox(BottomFrameRect, "BottomFrame", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM, B_WILL_DRAW, B_FANCY_BORDER); - BRect bottomFrameBounds = BottomFrame->Bounds(); - - // Create BButton - Configure - BRect ConfigureButtonRect(bottomFrameBounds.left+290, bottomFrameBounds.bottom-37, - bottomFrameBounds.right-13, bottomFrameBounds.bottom-13); - btnConfigure = new BButton(ConfigureButtonRect,"btnConfigure","Configure", new BMessage(BTN_CONFIGURE), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM, B_WILL_DRAW | B_NAVIGABLE); - btnConfigure->MakeDefault(true); - btnConfigure->SetEnabled(false); - - // Create a basic View - BBox *background = new BBox(Bounds(), "background", B_FOLLOW_ALL_SIDES, B_WILL_DRAW, B_PLAIN_BORDER); - AddChild(background); - - // Add Child(ren) - in reverse order to avoid one control overwriting another - background->AddChild(BottomFrame); - BottomFrame->AddChild(btnConfigure); - background->AddChild(outlinesv); - background->AddChild(stvMemoryRanges); - background->AddChild(stvIORanges); - background->AddChild(stvDMA); - background->AddChild(stvIRQ); - background->AddChild(stvDeviceName); - background->AddChild(stvCurrentState); - background->AddChild(menubar); - - // Set Window Limits - float xsize = 396 + (be_plain_font->Size()-10)*40; - if (xsize > 443) - xsize = 443; - SetSizeLimits(xsize,xsize,400,BScreen().Frame().Height()); -} -// ---------------------------------------------------------------------------------------------------------- // - - -// DevicesWindow::QuitRequested -- Post a message to the app to quit -bool DevicesWindow::QuitRequested() -{ - SaveSettings(); - be_app->PostMessage(B_QUIT_REQUESTED); - return true; -} -// ---------------------------------------------------------------------------------------------------------- // - - -// DevicesWindow::LoadSettings -- Loads your current settings -void DevicesWindow::LoadSettings(BMessage *msg) -{ - BRect frame; - - if (B_OK == msg->FindRect("windowframe",&frame)) { - MoveTo(frame.left,frame.top); - ResizeTo(frame.right-frame.left,frame.bottom-frame.top); - } -} -// -------------------------------------------------------------------------------------------------------------- // - - -// DevicesWindow::SaveSettings -- Saves the Users settings -void DevicesWindow::SaveSettings(void) -{ - BMessage msg; - msg.AddRect("windowframe",Frame()); - - BPath path; - status_t result = find_directory(B_USER_SETTINGS_DIRECTORY,&path); - if (result == B_OK) - { - path.Append("Devices_Settings",true); - BFile file(path.Path(),B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); - msg.Flatten(&file); - } -} -// ------------------------------------------------------------------------------- // - - -// DevicesWindow::MessageReceived -- receives messages -void -DevicesWindow::MessageReceived (BMessage *message) -{ - switch(message->what) - { - case MENU_FILE_ABOUT_DEVICES: - { - (new BAlert("", "Devices\n\n\t'Just write a simple app to add a jumpered\n\tdevice to the system', he said.\n\n\tAnd many years later another he said\n\t'recreate it' ;)", "OK"))->Go(); - } - break; - case MENU_FILE_QUIT: - { - QuitRequested(); - } - break; - case MENU_DEVICES_NEW_JUMPERED_DEVICE_MODEM: - { - ptrModemWindow = new ModemWindow(BRect(0,0,200,194), BMessenger(this)); - } - break; - case MENU_DEVICES_RESOURCE_USAGE: - { - ptrResourceUsageWindow = new ResourceUsageWindow(BRect(0,0,430,350), fList); - } - break; - case SELECTION_CHANGED: - { - UpdateDeviceInfo(); - } - break; - case MODEM_ADDED: - { - - } - break; - case BTN_CONFIGURE: - { - DeviceItem *devItem = dynamic_cast(outline->ItemAt(outline->CurrentSelection())); - if (devItem && devItem->GetInfo()) { - if (devItem->GetWindow()!=NULL) - devItem->GetWindow()->Activate(); - else - new ConfigurationWindow(BRect(150,150,562,602), devItem); - } - } - break; - default: - BWindow::MessageReceived(message); - break; - } - UpdateIfNeeded(); -} -// ---------------------------------------------------------------------------------------------------------- // - -void -DevicesWindow::InitDevices(bus_type bus) -{ - status_t size; - uint64 cookie; - struct device_info dummy, *info; - struct device_configuration *current; - struct possible_device_configurations *possible; - - cookie = 0; - while (get_next_device_info(bus, &cookie, &dummy, sizeof(dummy)) == B_OK) { - info = (struct device_info *)malloc(dummy.size); - if (!info) { - printf("Out of core\n"); - break; - } - - if (get_device_info_for(cookie, info, dummy.size) != B_OK) { - printf("Error getting device information\n"); - break; - } - - size = get_size_of_current_configuration_for(cookie); - if (size < B_OK) { - printf("Error getting the size of the current configuration\n"); - break; - } - current = (struct device_configuration *)malloc(size); - if (!current) { - printf("Out of core\n"); - break; - } - - if (get_current_configuration_for(cookie, current, size) != B_OK) { - printf("Error getting the current configuration\n"); - break; - } - - size = get_size_of_possible_configurations_for(cookie); - if (size < B_OK) { - printf("Error getting the size of the possible configurations\n"); - break; - } - possible = (struct possible_device_configurations *)malloc(size); - if (!possible) { - printf("Out of core\n"); - break; - } - - if (get_possible_configurations_for(cookie, possible, size) != B_OK) { - printf("Error getting the possible configurations\n"); - break; - } - - fList.AddItem(new DevicesInfo(info, current, possible)); - } - -} - -void -DevicesWindow::UpdateDeviceInfo() -{ - DeviceItem *item = dynamic_cast(outline->ItemAt(outline->CurrentSelection())); - if (item) { - DevicesInfo *deviceInfo = item->GetInfo(); - if (deviceInfo) { - struct device_configuration *current = deviceInfo->GetCurrent(); - resource_descriptor r; - - { - BString text = "IRQs: "; - bool first = true; - int32 num = count_resource_descriptors_of_type(current, B_IRQ_RESOURCE); - - for (int32 i=0;i>=1,i++) - if (mask & 1) { - char value[50]; - sprintf(value, "%s%d", first ? "" : ", ", i); - text += value; - first = false; - } - } - stvIRQ->SetText(text.String()); - } - - { - BString text = "DMAs: "; - bool first = true; - int32 num = count_resource_descriptors_of_type(current, B_DMA_RESOURCE); - - for (int32 i=0;i>=1,i++) - if (mask & 1) { - char value[50]; - sprintf(value, "%s%d", first ? "" : ", ", i); - text += value; - first = false; - } - } - stvDMA->SetText(text.String()); - } - - { - BString text = "IO Ranges: "; - bool first = true; - int32 num = count_resource_descriptors_of_type(current, B_IO_PORT_RESOURCE); - - for (int32 i=0;i70) { - text.Truncate(70); - text += B_UTF8_ELLIPSIS; - } - stvIORanges->SetText(text.String()); - } - - { - BString text = "Memory Ranges: "; - bool first = true; - int32 num = count_resource_descriptors_of_type(current, B_MEMORY_RESOURCE); - - for (int32 i=0;i70) { - text.Truncate(70); - text += B_UTF8_ELLIPSIS; - } - stvMemoryRanges->SetText(text.String()); - } - - btnConfigure->SetEnabled(true); - } else { - BlankDeviceInfoBox(); - } - } else { - BlankDeviceInfoBox(); - } -} - -void -DevicesWindow::BlankDeviceInfoBox() -{ - stvIRQ->SetText("IRQs: "); - stvDMA->SetText("DMAs: "); - stvIORanges->SetText("IO Ranges: "); - stvMemoryRanges->SetText("Memory Ranges: "); - btnConfigure->SetEnabled(false); -} diff --git a/src/apps/devices/DevicesWindows.h b/src/apps/devices/DevicesWindows.h deleted file mode 100644 index 8615ca7b21..0000000000 --- a/src/apps/devices/DevicesWindows.h +++ /dev/null @@ -1,106 +0,0 @@ -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -// -// Copyright (c) 2003-2004, OpenBeOS -// -// This software is part of the OpenBeOS distribution and is covered -// by the OpenBeOS license. -// -// -// File: DevicesWindows.h -// Author: Sikosis, Jérôme Duval -// Description: Devices Preferences -// Created : March 04, 2003 -// -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - - -#ifndef __DEVICESWINDOWS_H__ -#define __DEVICESWINDOWS_H__ - -#include -#include -#include -#include - -#include "DevicesInfo.h" - -#include "cm_wrapper.h" - -class BMenuField; -class BStringView; - -#define MODEM_ADDED 'moad' - -class ResourceUsageWindow : public BWindow { - public: - ResourceUsageWindow(BRect frame, BList &); - ~ResourceUsageWindow(); - virtual void MessageReceived(BMessage *message); - - private: - void InitWindow(BList &); -}; - - -class ModemWindow : public BWindow { - public: - ModemWindow(BRect frame, BMessenger); - ~ModemWindow(); - virtual void MessageReceived(BMessage *message); - private: - void InitWindow(void); - BMessenger fMessenger; -}; - -class ConfigurationWindow : public BWindow { - public: - ConfigurationWindow(BRect frame, DeviceItem *item); - ~ConfigurationWindow(); - virtual bool QuitRequested(); - virtual void MessageReceived(BMessage *message); - private: - void InitWindow(void); - DeviceItem *fItem; - BMenu *fConfigurationMenu; - BPopUpMenu *fIRQMenu[3]; - BMenuField *fIRQField[3]; - BPopUpMenu *fDMAMenu[3]; - BMenuField *fDMAField[3]; - BListView *ioListView, *memoryListView; -}; - - -class DevicesWindow : public BWindow { - public: - DevicesWindow(BRect frame); - ~DevicesWindow(); - virtual bool QuitRequested(); - virtual void MessageReceived(BMessage *message); - private: - void InitWindow(void); - void InitDevices(bus_type bus); - void LoadSettings(BMessage *msg); - void SaveSettings(void); - void UpdateDeviceInfo(); - void BlankDeviceInfoBox(); - - ResourceUsageWindow* ptrResourceUsageWindow; - ModemWindow* ptrModemWindow; - - BStringView *stvDeviceName; - BStringView *stvCurrentState; - BMenuBar *menubar; - - BList fList; - - BListItem *systemMenu, *isaMenu, *pciMenu, *jumperedMenu; - BOutlineListView *outline; - BStringView *stvIRQ; - BStringView *stvDMA; - BStringView *stvIORanges; - BStringView *stvMemoryRanges; - BButton *btnConfigure; -}; - -#endif - diff --git a/src/apps/devices/Documentation/Design.txt b/src/apps/devices/Documentation/Design.txt new file mode 100644 index 0000000000..e31438da02 --- /dev/null +++ b/src/apps/devices/Documentation/Design.txt @@ -0,0 +1,128 @@ +DeviceManager Design +==================== + +Requirements +------------ +1) Graphically list each device in the system, with all the information available for that specific device type: + - PCI + - USB + - SCSI + - Bluetooth? + - ISA? + - ATAPI? + - AHCI? + - Firewire? + +2) Generate a comprehensive text listing of the devices present to allow users to share detailed information with developers +- Generate an email with this information attached + +3) Let the user generate a report on how well Haiku supports the devices in the system. +- Present a list of devices and per device a star rating on the support, and provide a space for comments on the device support. +- For each device allow comments +- Include all available information for the device (including loaded driver) +- Perhaps this can go into the Haikuware compatibility database? + +4) Arrange the devices in different orders (by category, by connection, by bus type, by resource assignment?) + +Graphical Design +---------------- ++=========+ +| Devices | ++=========+======================================================+ +| Devices | Help | | ++----------------------------------------------------------------+ +| +------------------------+-----------------------------------+ | +| | Sort by: [Category v] | / Basic \/ \/ Advanced \ | | +| | ------------------- | + +--------+----------+--+ | | +| | v Audio/Video Devices | | Device Name: Netlink 5787M | | | +| | Hauppauge WinTV | | Manufacturer: Broadcom | | | +| | Intel HDA Audio | | Category: Network Devices | | | +| | v Human Interface Dev. | | Driver used: broadcom570x | | | +| | USB Mouse | | | | | +| | USB Keyboard | | | | | +| | v Network Devices | | | | | +| | -->Broadcom 5787M<-- | | | | | +| | Intel 4965 WIFI | | | | | +| | v Graphics Card | | | | | +| | NVidia 8600M GT | | | | | +| | .... | +-------------------------------+ | | +| +------------------------+-----------------------------------+ | +| +-------------------------+ +------------+ +-----------+ | +| | Report hardware support | | Gen. email | | Gen. Text | | +| +-------------------------+ +------------+ +-----------+ | ++================================================================+ + +Menu: +Devices +- Refresh devices +- Report compatibility +- Generate system information +- ----- +- About Devices +- ----- +- Quit + +Interface details: +- The left list is an OutlineListView, + - Is inside a scroll container + - Will contain nice icons per type/device + - Clicking on a device will show the details in the right view + +- The right view contains 3 tabs: + - Basic tab: Information available for every kind device + - tab: Information specific to the bus type of device. (PCI, USB, etc) + - Advanced tab: Has a list of name-value pairs of all available information + +- Sort by allows the user to arrange the treeview by: + - Category: + - Connection + - Bus type + +- Report Hardware Support + - List all devices + - For each device + +When you click Report Hardware Support, this appears: + ++=========================+ +| Report Hardware Support | ++=========================+============================+ +| Report Device Supported Comment | +| [x] Broadcom Netlink 5787M ***** _________ | +| [x] Hauppauge WinTV ***** _________ | +| [x] Intel 4965 WIFI ..... _________ | +| [x] Intel HDA Audio ****. _________ | +| [x] NVidia 8600M GT ***.. _________ | +| [x] USB Keyboard ***** _________ | +| [x] USB Mouse ***** _________ | +| [ ] Intel 82801 PCI Bridge ..... _________ | +| [ ] Intel 82801H PCI Express ..... _________ | +| | +| If you wish, you can leave your contact details so | +| developers can get in touch with you for questions | +| about your devices. These will be stored privately. | +| | +| Name: _______________ Email: __________________ | +| | +| Haiku-os.org account: __________________________ | +| | +| +--------------------+ +---------------+ | +| | Preview submission | | Generate File | | +| +--------------------+ +---------------+ | ++======================================================+ + +Interface details: +------------------ +- All devices are _not_ selected for report by default +- As soon as a rating is given, it is selected to be reported +- Preview submission will popup the generated list with a submit button +- Generate file will generate a file that can be uploaded manually, or emailed to a specific address. +- As you mouse over the rating, a popup will appear detailing what each star stands for: + - ..... : No support + - X.... : Crashes Haiku + - **... : Detected but doesn't work with 3rd party driver + - ***.. : Detected but doesn't work out of the box + - ****. : Detected and works with 3rd party driver + - ***** : Detected and works out of the box + + diff --git a/src/apps/devices/Documentation/Specification.txt b/src/apps/devices/Documentation/Specification.txt new file mode 100644 index 0000000000..0433db5002 --- /dev/null +++ b/src/apps/devices/Documentation/Specification.txt @@ -0,0 +1,69 @@ +Each device has: +- Name (long/short) +- Manufacturer (long/short) +- Category (one master list, each bus type maps its device types onto the master list) +- Driver used +- Device paths +- Its bus type +- Its connection parent, if applicable + +Each source has: (currently the RescanDevices method does this) +- Init function +- Scan method that returns the devices. +- DevManSource, USBSource, FWSource, ... + +DeviceManager Specification +=========================== + +DeviceManager : BApplication +------------- + +DeviceManagerView : BView +----------------- + + +Device : public BStringItem +------ +BString GetName() const; +BString GetManufacturer() const; +Category GetCategory() const; +BString DriverUsed() const; +BString DevPathsPublished() const; +BView Get +private: +BString _name; +BString _manufacturer; +Category _category; +BString _driverUsed; +BString devPathsPublished; +map _attributes; + +Bus : public BStringItem +--- +virtual bool IsPresent() const = 0; +virtual Scan() = 0; +virtual vector Devices() = 0; + +PCIBus : public Bus +------ + +PCIDevice: public Device +--------- + +ISABus : public Bus +----- + +ISADevice : public Device +--------- + +USBBus : public Bus +------ + +USBDevice : public Device +--------- + +SCSIBus : public Bus +------- + +SCSIDevice : public Device +---------- diff --git a/src/apps/devices/Documentation/Todo.txt b/src/apps/devices/Documentation/Todo.txt new file mode 100644 index 0000000000..89f01106fb --- /dev/null +++ b/src/apps/devices/Documentation/Todo.txt @@ -0,0 +1,13 @@ +TODO: + * There still is a memory leak somewhere, hunt it down + * Make Get methods of Device const + * Fix view color? + * Fix forwarding of messages to view + * Bottom scrollbar strangeness + * Reduce executable size? + * Find a place for unknown devices (or decypher the names better) + * Reselect currently selected on sort-by change - unique device id (device_node_cookie?) + * Check for keyboard navigation + * Loading and saving settings (sort by, position, size and sizes of views) + * Icons per device type + * Index attributes by enum, not string diff --git a/src/apps/devices/Jamfile b/src/apps/devices/Jamfile index 6dc623f700..60a7054681 100644 --- a/src/apps/devices/Jamfile +++ b/src/apps/devices/Jamfile @@ -1,6 +1,10 @@ SubDir HAIKU_TOP src apps devices ; -SetSubDirSupportedPlatformsBeOSCompatible ; +UsePrivateHeaders shared ; +UsePrivateHeaders interface ; +UsePrivateKernelHeaders ; +UsePrivateSystemHeaders ; + rule ISAPnPHeaderGen { @@ -56,17 +60,18 @@ actions PCIHeaderGen1 PCIHeaderGen [ FGristFiles pcihdr.h ] : pci.ids : pci-header.awk ; -Preference Devices : - Devices.cpp - DevicesWindow.cpp - ResourceUsageWindow.cpp - ModemWindow.cpp - cm_wrapper.c - DevicesInfo.cpp - ConfigurationWindow.cpp - : be $(TARGET_LIBSUPC++) +Application Devices : + DevicesApplication.cpp + DevicesView.cpp + dm_wrapper.c + DevicePCI.cpp + Device.cpp + PropertyList.cpp + PropertyListPlain.cpp + : be libcolumnlistview.a tracker $(TARGET_LIBSUPC++) $(TARGET_LIBSTDC++) : Devices.rdef ; -Includes [ FGristFiles DevicesInfo.cpp ] : [ FGristFiles isapnpids.h usbdevs.h usbdevs_data.h ] ; +Includes [ FGristFiles DevicesInfo.cpp ] : [ FGristFiles isapnpids.h usbdevs.h + usbdevs_data.h ] ; Includes [ FGristFiles ConfigurationWindow.cpp ] : [ FGristFiles pcihdr.h ] ; diff --git a/src/apps/devices/ModemWindow.cpp b/src/apps/devices/ModemWindow.cpp deleted file mode 100644 index 2c35c74a3c..0000000000 --- a/src/apps/devices/ModemWindow.cpp +++ /dev/null @@ -1,152 +0,0 @@ -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -// -// Copyright (c) 2003-2004, OpenBeOS -// -// This software is part of the OpenBeOS distribution and is covered -// by the OpenBeOS license. -// -// -// File: ModemWindow.cpp -// Author: Sikosis, Jérôme Duval -// Description: Devices Preferences -// Created : August 23, 2003 -// -// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - - -// Includes ------------------------------------------------------------------------------------------ // -//#include -#include -#include -#include -#include -//#include -//#include -#include -//#include -//#include -#include -//#include -//#include - -#include "DevicesWindows.h" - -// -------------------------------------------------------------------------------------------------- // -const uint32 BTN_ADD = 'badd'; -const uint32 BTN_CANCEL = 'bcnl'; - -// -------------------------------------------------------------------------------------------------- // - - -// ModemWindow - Constructor -ModemWindow::ModemWindow(BRect frame, BMessenger messenger) - : BWindow (frame, "ModemWindow", B_MODAL_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, B_NOT_RESIZABLE), - fMessenger(messenger) -{ - InitWindow(); - CenterOnScreen(); - Show(); -} -// -------------------------------------------------------------------------------------------------- // - - -// ModemWindow - Destructor -ModemWindow::~ModemWindow() -{ -} -// -------------------------------------------------------------------------------------------------- // - -// ModemWindow::InitWindow -- Initialization Commands here -void -ModemWindow::InitWindow(void) -{ - BRect r; - r = Bounds(); - - BBox *background = new BBox(r, "background", B_FOLLOW_LEFT | B_FOLLOW_TOP, - B_WILL_DRAW, B_PLAIN_BORDER); - AddChild(background); - - BBox *boxInternalModem = new BBox(BRect (r.left+9,r.top+9,r.right-11,r.bottom-44), - "boxInternalModem", B_FOLLOW_LEFT | B_FOLLOW_TOP, - B_WILL_DRAW, B_FANCY_BORDER); - boxInternalModem->SetLabel("Internal Modem"); - boxInternalModem->SetFont(be_plain_font); - - rgb_color black = {0,0,0}; - BRect rect = boxInternalModem->Bounds(); - rect.left += 9; - rect.top += 58; - rect.right -= 11; - rect.bottom -= 20; - BRect textRect(rect); - textRect.OffsetTo(B_ORIGIN); - textRect.InsetBy(1,1); - BTextView *textView = new BTextView(rect, "text", textRect, be_plain_font, &black, B_FOLLOW_TOP | B_FOLLOW_LEFT, B_WILL_DRAW); - textView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - textView->SetText("This is intended for configuring\n" - "jumpered modem only. Plug and\n" - "Play modems are automatically\n" - "detected by the system."); - boxInternalModem->AddChild(textView); - - BRect CancelButtonRect(29,r.bottom-34,104,r.bottom-13); - BButton *btnCancel = new BButton(CancelButtonRect,"btnCancel","Cancel", - new BMessage(BTN_CANCEL), B_FOLLOW_LEFT | B_FOLLOW_TOP, - B_WILL_DRAW | B_NAVIGABLE); - - BRect AddButtonRect(115,r.bottom-34,r.right - 10,r.bottom-13); - BButton *btnAdd = new BButton(AddButtonRect,"btnAdd","Add", - new BMessage(BTN_ADD), B_FOLLOW_LEFT | B_FOLLOW_TOP, - B_WILL_DRAW | B_NAVIGABLE); - btnAdd->MakeDefault(true); - - rect = boxInternalModem->Bounds(); - rect.top += 28; - rect.left += 38; - rect.right = rect.left + 105; - rect.bottom = rect.top + 5; - BPopUpMenu *serialMenu = new BPopUpMenu("pick one"); - BMenuItem *item; - serialMenu->AddItem(item = new BMenuItem("serial3 ", NULL)); - item->SetMarked(true); - serialMenu->AddItem(item = new BMenuItem("serial4 ", NULL)); - - - BMenuField *serialMenuField = new BMenuField(rect, "serialMenuField", - "Port:", serialMenu); - serialMenuField->SetDivider(40.0); - serialMenuField->SetAlignment(B_ALIGN_RIGHT); - boxInternalModem->AddChild(serialMenuField); - - // Create the Views - background->AddChild(boxInternalModem); - background->AddChild(btnCancel); - background->AddChild(btnAdd); -} -// -------------------------------------------------------------------------------------------------- // - - -// ModemWindow::MessageReceived -- receives messages -void -ModemWindow::MessageReceived (BMessage *message) -{ - switch(message->what) - { - case BTN_CANCEL: - { - Quit(); - } - break; - case BTN_ADD: - { - fMessenger.SendMessage(MODEM_ADDED); - Quit(); - } - break; - default: - BWindow::MessageReceived(message); - break; - } -} -// -------------------------------------------------------------------------------------------------- // diff --git a/src/apps/devices/PropertyList.cpp b/src/apps/devices/PropertyList.cpp new file mode 100644 index 0000000000..8d66527bdf --- /dev/null +++ b/src/apps/devices/PropertyList.cpp @@ -0,0 +1,91 @@ +/* + * Copyright 2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT license. + * + * Authors: + * Pieter Panman + */ + + +#include "PropertyList.h" + +#include + +//#include + + +PropertyRow::PropertyRow(const char* name, const char* value) + : BRow(), + fName(name), fValue(value) +{ + SetField(new BStringField(name), kNameColumn); + SetField(new BStringField(value), kValueColumn); +} + + +PropertyRow::~PropertyRow() +{ +} + + +void +PropertyRow::SetName(const char* name) +{ + fName = name; + SetField(new BStringField(name), kNameColumn); +} + + +void +PropertyRow::SetValue(const char* value) +{ + fValue = value; + SetField(new BStringField(value), kValueColumn); +} + + +PropertyList::PropertyList(const char* name) + : BColumnListView(BRect(0.0, 0.0, 1.0, 1.0), name, B_FOLLOW_ALL, 0, + B_NO_BORDER, true) +{ + BStringColumn* nameColumn; + AddColumn(nameColumn = new BStringColumn("Name", 150, 50, 500, + B_TRUNCATE_MIDDLE), + kNameColumn); + AddColumn(new BStringColumn("Value", 150, 50, 500, B_TRUNCATE_END), + kValueColumn); + SetSortColumn(nameColumn, false, true); +} + + +PropertyList::~PropertyList() +{ + RemoveAll(); +} + + +void +PropertyList::AddAttributes(const Attributes& attributes) +{ + RemoveAll(); + for (unsigned int i = 0; i < attributes.size(); i++) { + AddRow(new PropertyRow(attributes[i].fName, attributes[i].fValue)); + } +} + + +void +PropertyList::RemoveAll() +{ + BRow *row; + while ((row = RowAt((int32)0, NULL))!=NULL) { + RemoveRow(row); + delete row; + } +} + + +void +PropertyList::SelectionChanged() +{ +} diff --git a/src/apps/devices/PropertyList.h b/src/apps/devices/PropertyList.h new file mode 100644 index 0000000000..afdc73851a --- /dev/null +++ b/src/apps/devices/PropertyList.h @@ -0,0 +1,51 @@ +/* + * Copyright 2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT license. + * + * Authors: + * Pieter Panman + */ +#ifndef PROPERTYLIST_H +#define PROPERTYLIST_H + + +#include +#include + +#include "Device.h" + + +struct Attribute; + +enum { + kNameColumn, + kValueColumn +}; + + +class PropertyRow : public BRow { +public: + PropertyRow(const char* name, const char* value); + virtual ~PropertyRow(); + + const char* Name() const { return fName.String(); } + const char* Value() const { return fValue.String(); } + void SetName(const char* name); + void SetValue(const char* value); +private: + BString fName; + BString fValue; +}; + + +class PropertyList : public BColumnListView { +public: + PropertyList(const char* name = "Properties"); + virtual ~PropertyList(); + void RemoveAll(); + void AddAttributes(const Attributes& attributes); +protected: + virtual void SelectionChanged(); +}; + +#endif /* PROPERTYLIST_H*/ diff --git a/src/apps/devices/PropertyListPlain.cpp b/src/apps/devices/PropertyListPlain.cpp new file mode 100644 index 0000000000..d82dd0d750 --- /dev/null +++ b/src/apps/devices/PropertyListPlain.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Author: + * Artur Wyszynski + * Modified by Pieter Panman + */ + +#include "PropertyListPlain.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Device.h" + + +PropertyListPlain::PropertyListPlain(const char* name) + : + BView(name, 0, NULL) +{ + SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + SetLayout(new BGroupLayout(B_VERTICAL)); +} + + +PropertyListPlain::~PropertyListPlain() +{ + +} + + +void +PropertyListPlain::AddAttributes(const Attributes& attributes) +{ + RemoveAll(); + BGridLayoutBuilder builder(5, 5); + unsigned int i; + for (i = 0; i < attributes.size(); i++) { + const char* name = attributes[i].fName; + const char* value = attributes[i].fValue; + + BString tempViewName(name); + BStringView *nameView = new BStringView(tempViewName.String(), name); + tempViewName.Append("Value"); + BStringView *valueView = new BStringView(tempViewName.String(), value); + + nameView->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT, + B_ALIGN_VERTICAL_UNSET)); + valueView->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT, + B_ALIGN_VERTICAL_UNSET)); + + builder + .Add(nameView, 0, i) + .Add(valueView, 1, i); + } + + // make sure that all content is left and top aligned + builder.Add(BSpaceLayoutItem::CreateGlue(), 2, i); + + AddChild(BGroupLayoutBuilder(B_VERTICAL,5) + .Add(builder) + .SetInsets(5, 5, 5, 5) + ); +} + + +void +PropertyListPlain::RemoveAll() +{ + BView *child; + while((child = ChildAt(0))) { + RemoveChild(child); + delete child; + } +} + + +void +PropertyListPlain::MessageReceived(BMessage* message) +{ + switch (message->what) { + default: + BView::MessageReceived(message); + } +} + + +void +PropertyListPlain::AttachedToWindow() +{ +} + + +void +PropertyListPlain::DetachedFromWindow() +{ +} diff --git a/src/apps/devices/PropertyListPlain.h b/src/apps/devices/PropertyListPlain.h new file mode 100644 index 0000000000..bbfc00fba9 --- /dev/null +++ b/src/apps/devices/PropertyListPlain.h @@ -0,0 +1,33 @@ +/* + * Copyright 2009 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Author: + * Artur Wyszynski + * Modified by Pieter Panman + */ +#ifndef PROPERTY_LIST_PLAIN_H +#define PROPERTY_LIST_PLAIN_H + + +#include + +#include "Device.h" + + +class PropertyListPlain : public BView { +public: + PropertyListPlain(const char* name); + virtual ~PropertyListPlain(); + + virtual void AddAttributes(const Attributes& attributes); + virtual void RemoveAll(); + + virtual void MessageReceived(BMessage* message); + virtual void AttachedToWindow(); + virtual void DetachedFromWindow(); +private: + BView* rootView; +}; + +#endif /* PROPERTY_LIST_PLAIN_H */ diff --git a/src/apps/devices/cm_wrapper.c b/src/apps/devices/cm_wrapper.c deleted file mode 100644 index 10b983902f..0000000000 --- a/src/apps/devices/cm_wrapper.c +++ /dev/null @@ -1,141 +0,0 @@ -#include -#include -#include -#include - -#include "cm_wrapper.h" -#include "config_driver.h" - -static int fd; - -status_t init_cm_wrapper(void) -{ - static const char device[] = "/dev/" CM_DEVICE_NAME; - - fd = open(device, 0); - if (fd < 0) - return errno; - return B_OK; -} - -status_t uninit_cm_wrapper(void) -{ - close(fd); - return B_OK; -} - -status_t get_next_device_info(bus_type bus, uint64 *cookie, - struct device_info *info, uint32 size) -{ - status_t result; - struct cm_ioctl_data params; - - params.magic = CM_GET_NEXT_DEVICE_INFO; - params.bus = bus; - params.cookie = *cookie; - params.data = (void *)info; - params.data_len = size; - - result = ioctl(fd, params.magic, ¶ms, sizeof(params)); - - if (result == B_OK) *cookie = params.cookie; - - return result; -} - -status_t get_device_info_for(uint64 id, struct device_info *info, - uint32 size) -{ - struct cm_ioctl_data params; - - params.magic = CM_GET_DEVICE_INFO_FOR; - params.cookie = id; - params.data = (void *)info; - params.data_len = size; - - return ioctl(fd, params.magic, ¶ms, sizeof(params)); -} - -status_t get_size_of_current_configuration_for(uint64 id) -{ - struct cm_ioctl_data params; - - params.magic = CM_GET_SIZE_OF_CURRENT_CONFIGURATION_FOR; - params.cookie = id; - - return ioctl(fd, params.magic, ¶ms, sizeof(params)); -} - -status_t get_current_configuration_for(uint64 id, - struct device_configuration *current, uint32 size) -{ - struct cm_ioctl_data params; - - params.magic = CM_GET_CURRENT_CONFIGURATION_FOR; - params.cookie = id; - params.data = (void *)current; - params.data_len = size; - - return ioctl(fd, params.magic, ¶ms, sizeof(params)); -} - -status_t get_size_of_possible_configurations_for(uint64 id) -{ - struct cm_ioctl_data params; - - params.magic = CM_GET_SIZE_OF_POSSIBLE_CONFIGURATIONS_FOR; - params.cookie = id; - - return ioctl(fd, params.magic, ¶ms, sizeof(params)); -} - -status_t get_possible_configurations_for(uint64 id, - struct possible_device_configurations *possible, uint32 size) -{ - struct cm_ioctl_data params; - - params.magic = CM_GET_POSSIBLE_CONFIGURATIONS_FOR; - params.cookie = id; - params.data = (void *)possible; - params.data_len = size; - - return ioctl(fd, params.magic, ¶ms, sizeof(params)); -} - - -status_t count_resource_descriptors_of_type( - struct device_configuration *c, resource_type type) -{ - struct cm_ioctl_data params; - - params.magic = CM_COUNT_RESOURCE_DESCRIPTORS_OF_TYPE; - params.config = c; - params.type = type; - - return ioctl(fd, params.magic, ¶ms, sizeof(params)); -} - -status_t get_nth_resource_descriptor_of_type( - struct device_configuration *c, uint32 n, - resource_type type, resource_descriptor *d, uint32 size) -{ - struct cm_ioctl_data params; - - params.magic = CM_GET_NTH_RESOURCE_DESCRIPTOR_OF_TYPE; - params.config = c; - params.n = n; - params.type = type; - params.data = d; - params.data_len = size; - - return ioctl(fd, params.magic, ¶ms, sizeof(params)); -} - -uchar mask_to_value(uint32 mask) -{ - uchar value; - if (!mask) return 0; - for (value=0,mask>>=1;mask;value++,mask>>=1) - ; - return value; -} diff --git a/src/apps/devices/cm_wrapper.h b/src/apps/devices/cm_wrapper.h deleted file mode 100644 index 54c68593ec..0000000000 --- a/src/apps/devices/cm_wrapper.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _CM_WRAPPER_H_ -#define _CM_WRAPPER_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -status_t init_cm_wrapper(void); -status_t uninit_cm_wrapper(void); - -status_t get_next_device_info(bus_type bus, uint64 *cookie, - struct device_info *info, uint32 size); -status_t get_device_info_for(uint64 id, struct device_info *info, - uint32 size); -status_t get_size_of_current_configuration_for(uint64 id); -status_t get_current_configuration_for(uint64 id, - struct device_configuration *current, uint32 size); -status_t get_size_of_possible_configurations_for(uint64 id); -status_t get_possible_configurations_for(uint64 id, - struct possible_device_configurations *possible, uint32 size); -status_t count_resource_descriptors_of_type( - struct device_configuration *c, resource_type type); -status_t get_nth_resource_descriptor_of_type( - struct device_configuration *c, uint32 n, resource_type type, - resource_descriptor *d, uint32 size); - -uchar mask_to_value(uint32 mask); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/apps/devices/dm_wrapper.c b/src/apps/devices/dm_wrapper.c new file mode 100644 index 0000000000..41b3f2dff8 --- /dev/null +++ b/src/apps/devices/dm_wrapper.c @@ -0,0 +1,69 @@ +/* + * Copyright 2006 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Jerome Duval (listdev) + */ + + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "dm_wrapper.h" + + +status_t +init_dm_wrapper(void) +{ + uint32 version = 0; + return _kern_generic_syscall(DEVICE_MANAGER_SYSCALLS, B_SYSCALL_INFO, + &version, sizeof(version)); +} + + +status_t +uninit_dm_wrapper(void) +{ + return B_OK; +} + + +status_t +get_root(device_node_cookie *cookie) +{ + return _kern_generic_syscall(DEVICE_MANAGER_SYSCALLS, DM_GET_ROOT, cookie, + sizeof(device_node_cookie)); +} + + +status_t +get_child(device_node_cookie *device) +{ + return _kern_generic_syscall(DEVICE_MANAGER_SYSCALLS, DM_GET_CHILD, device, + sizeof(device_node_cookie)); +} + + +status_t +get_next_child(device_node_cookie *device) +{ + return _kern_generic_syscall(DEVICE_MANAGER_SYSCALLS, DM_GET_NEXT_CHILD, + device, sizeof(device_node_cookie)); +} + + +status_t +dm_get_next_attr(struct device_attr_info *attr) +{ + return _kern_generic_syscall(DEVICE_MANAGER_SYSCALLS, + DM_GET_NEXT_ATTRIBUTE, attr, sizeof(struct device_attr_info)); +} diff --git a/src/apps/devices/dm_wrapper.h b/src/apps/devices/dm_wrapper.h new file mode 100644 index 0000000000..1b0bf82412 --- /dev/null +++ b/src/apps/devices/dm_wrapper.h @@ -0,0 +1,21 @@ +/* + * Copyright 2006 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Jerome Duval (listdev) + */ +#ifndef DM_WRAPPER_H +#define DM_WRAPPER_H + + +#include "device_manager_defs.h" + +status_t init_dm_wrapper(void); +status_t uninit_dm_wrapper(void); +status_t get_root(device_node_cookie *cookie); +status_t get_child(device_node_cookie *cookie); +status_t get_next_child(device_node_cookie *cookie); +status_t dm_get_next_attr(struct device_attr_info *attr); + +#endif /* DM_WRAPPER_H */