/*
* Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. The rights granted to you under the License
* may not be used to create, or enable the creation or redistribution of,
* unlawful or unlicensed copies of an Apple operating system, or to
* circumvent, violate, or enable the circumvention or violation of, any
* terms of an Apple operating system software license agreement.
*
* Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
#include <IOKit/pwr_mgt/IOPM.h>
#include <IOKit/pwr_mgt/IOPMPowerSourceList.h>
#include <IOKit/pwr_mgt/IOPMPowerSource.h>
#define super OSObject
OSDefineMetaClassAndStructors(IOPMPowerSourceList, OSObject)
//******************************************************************************
// init
//
//******************************************************************************
void
IOPMPowerSourceList::initialize( void )
{
firstItem = NULL;
length = 0;
}
//******************************************************************************
// addToList
//
//******************************************************************************
IOReturn
IOPMPowerSourceList::addToList(IOPMPowerSource *newPowerSource)
{
IOPMPowerSource * nextPowerSource;
// Is new object already in the list?
nextPowerSource = firstItem;
while (nextPowerSource != NULL) {
if (nextPowerSource == newPowerSource) {
// yes, just return
return IOPMNoErr;
}
nextPowerSource = nextInList(nextPowerSource);
}
// add it to list
newPowerSource->nextInList = firstItem;
firstItem = newPowerSource;
length++;
return IOPMNoErr;
}
//******************************************************************************
// firstInList
//
//******************************************************************************
IOPMPowerSource *
IOPMPowerSourceList::firstInList( void )
{
return firstItem;
}
//******************************************************************************
// nextInList
//
//******************************************************************************
IOPMPowerSource *
IOPMPowerSourceList::nextInList(IOPMPowerSource *currentItem)
{
if (currentItem != NULL) {
return currentItem->nextInList;
}
return NULL;
}
//******************************************************************************
// numberOfItems
//
//******************************************************************************
unsigned long
IOPMPowerSourceList::numberOfItems( void )
{
return length;
}
//******************************************************************************
// removeFromList
//
// Find the item in the list, unlink it, and free it.
//******************************************************************************
IOReturn
IOPMPowerSourceList::removeFromList( IOPMPowerSource * theItem )
{
IOPMPowerSource * item = firstItem;
IOPMPowerSource * temp;
if (NULL == item) {
goto exit;
}
if (item == theItem) {
firstItem = item->nextInList;
length--;
item->release();
return IOPMNoErr;
}
while (item->nextInList != NULL) {
if (item->nextInList == theItem) {
temp = item->nextInList;
item->nextInList = temp->nextInList;
length--;
temp->release();
return IOPMNoErr;
}
item = item->nextInList;
}
exit:
return IOPMNoErr;
}
//******************************************************************************
// free
//
// Free all items in the list, and then free the list itself
//******************************************************************************
void
IOPMPowerSourceList::free(void )
{
IOPMPowerSource * next = firstItem;
while (next != NULL) {
firstItem = next->nextInList;
length--;
next->release();
next = firstItem;
}
super::free();
}