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) {
delete 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;
}