* Copyright 2011-2013, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include "AutoPackageAttributeDirectoryCookie.h"
#include "DebugSupport.h"
#include "Utils.h"
AutoPackageAttributeDirectoryCookie::AutoPackageAttributeDirectoryCookie()
:
fState(AUTO_PACKAGE_ATTRIBUTE_ENUM_FIRST)
{
}
AutoPackageAttributeDirectoryCookie::~AutoPackageAttributeDirectoryCookie()
{
}
status_t
AutoPackageAttributeDirectoryCookie::Read(dev_t volumeID, ino_t nodeID,
struct dirent* buffer, size_t bufferSize, uint32* _count)
{
uint32 maxCount = *_count;
uint32 count = 0;
dirent* previousEntry = NULL;
String customAttributeName = CurrentCustomAttributeName();
while (fState < AUTO_PACKAGE_ATTRIBUTE_ENUM_COUNT
|| !customAttributeName.IsEmpty()) {
if (count >= maxCount)
break;
if (count > 0) {
addr_t offset = (addr_t)buffer % 8;
if (offset > 0) {
offset = 8 - offset;
if (bufferSize <= offset)
break;
previousEntry->d_reclen += offset;
buffer = (dirent*)((addr_t)buffer + offset);
bufferSize -= offset;
}
}
const String& name = fState < AUTO_PACKAGE_ATTRIBUTE_ENUM_COUNT
? AutoPackageAttributes::NameForAttribute(
(AutoPackageAttribute)fState)
: customAttributeName;
if (!set_dirent_name(buffer, bufferSize, name, strlen(name))) {
if (count == 0)
RETURN_ERROR(B_BUFFER_OVERFLOW);
break;
}
buffer->d_dev = volumeID;
buffer->d_ino = nodeID;
count++;
previousEntry = buffer;
bufferSize -= buffer->d_reclen;
buffer = (dirent*)((addr_t)buffer + buffer->d_reclen);
if (fState < AUTO_PACKAGE_ATTRIBUTE_ENUM_COUNT)
fState++;
else
customAttributeName = NextCustomAttributeName();
}
*_count = count;
return B_OK;
}
status_t
AutoPackageAttributeDirectoryCookie::Rewind()
{
fState = AUTO_PACKAGE_ATTRIBUTE_ENUM_FIRST;
return B_OK;
}
String
AutoPackageAttributeDirectoryCookie::CurrentCustomAttributeName()
{
return String();
}
String
AutoPackageAttributeDirectoryCookie::NextCustomAttributeName()
{
return String();
}