IOReportLegend.cpp [plain text]
#include <IOKit/IOKernelReportStructs.h>
#include <IOKit/IOKernelReporters.h>
#ifdef IORDEBUG_LEGEND
#define IORLEGENDLOG(fmt, args...) \
do { \
IOLog("IOReportLegend | "); \
IOLog(fmt, ##args); \
IOLog("\n"); \
} while(0)
#else
#define IORLEGENDLOG(fmt, args...)
#endif
#define super OSObject
OSDefineMetaClassAndStructors(IOReportLegend, OSObject);
IOReportLegend*
IOReportLegend::with(OSArray *legend)
{
IOReportLegend *iorLegend = new IOReportLegend;
if (iorLegend) {
if (legend != NULL) {
if (iorLegend->initWith(legend) != kIOReturnSuccess) {
OSSafeReleaseNULL(iorLegend);
return NULL;
}
}
return iorLegend;
} else {
return NULL;
}
}
IOReturn
IOReportLegend::initWith(OSArray *legend)
{
if (legend) {
_reportLegend = OSArray::withArray(legend);
}
if (_reportLegend == NULL) {
return kIOReturnError;
} else {
return kIOReturnSuccess;
}
}
void
IOReportLegend::free(void)
{
if (_reportLegend) {
_reportLegend->release();
}
super::free();
}
OSArray*
IOReportLegend::getLegend(void)
{
return _reportLegend;
}
IOReturn
IOReportLegend::addReporterLegend(IOService *reportingService,
IOReporter *reporter,
const char *groupName,
const char *subGroupName)
{
IOReturn res = kIOReturnError;
IOReportLegend *legend = NULL;
OSObject *curLegend = NULL;
if (!reportingService || !reporter) {
goto finish;
}
curLegend = reportingService->copyProperty(kIOReportLegendKey);
legend = IOReportLegend::with(OSDynamicCast(OSArray, curLegend));
if (!legend) {
goto finish;
}
legend->addReporterLegend(reporter, groupName, subGroupName);
reportingService->setProperty(kIOReportLegendKey, legend->getLegend());
reportingService->setProperty(kIOReportLegendPublicKey, true);
res = kIOReturnSuccess;
finish:
if (legend) {
legend->release();
}
if (curLegend) {
curLegend->release();
}
return res;
}
IOReturn
IOReportLegend::addLegendEntry(IOReportLegendEntry *legendEntry,
const char *groupName,
const char *subGroupName)
{
kern_return_t res = kIOReturnError;
const OSSymbol *tmpGroupName = NULL;
const OSSymbol *tmpSubGroupName = NULL;
if (!legendEntry) {
goto finish;
}
if (groupName) {
tmpGroupName = OSSymbol::withCString(groupName);
}
if (subGroupName) {
tmpSubGroupName = OSSymbol::withCString(subGroupName);
}
if (legendEntry) {
res = organizeLegend(legendEntry, tmpGroupName, tmpSubGroupName);
if (tmpGroupName) {
tmpGroupName->release();
}
if (tmpSubGroupName) {
tmpSubGroupName->release();
}
}
finish:
return res;
}
IOReturn
IOReportLegend::addReporterLegend(IOReporter *reporter,
const char *groupName,
const char *subGroupName)
{
IOReturn res = kIOReturnError;
IOReportLegendEntry *legendEntry = NULL;
if (reporter) {
legendEntry = reporter->createLegend();
if (legendEntry) {
res = addLegendEntry(legendEntry, groupName, subGroupName);
legendEntry->release();
}
}
return res;
}
IOReturn
IOReportLegend::organizeLegend(IOReportLegendEntry *legendEntry,
const OSSymbol *groupName,
const OSSymbol *subGroupName)
{
IOReturn res = kIOReturnError;
if (!legendEntry) {
return res = kIOReturnBadArgument;
}
if (!groupName && subGroupName) {
return res = kIOReturnBadArgument;
}
IORLEGENDLOG("IOReportLegend::organizeLegend");
if (_reportLegend == NULL) {
IORLEGENDLOG("IOReportLegend::new legend creation");
_reportLegend = OSArray::withCapacity(1);
if (!_reportLegend) {
return kIOReturnNoMemory;
}
}
if (groupName) {
legendEntry->setObject(kIOReportLegendGroupNameKey, groupName);
}
if (subGroupName) {
legendEntry->setObject(kIOReportLegendSubGroupNameKey, subGroupName);
}
_reportLegend->setObject(legendEntry);
return res = kIOReturnSuccess;
}