packagefs: Package: Add versionedName property
This commit is contained in:
@@ -761,6 +761,7 @@ Package::Package(::Volume* volume, dev_t deviceID, ino_t nodeID)
|
|||||||
fFileName(),
|
fFileName(),
|
||||||
fName(),
|
fName(),
|
||||||
fInstallPath(),
|
fInstallPath(),
|
||||||
|
fVersionedName(),
|
||||||
fVersion(NULL),
|
fVersion(NULL),
|
||||||
fArchitecture(B_PACKAGE_ARCHITECTURE_ENUM_COUNT),
|
fArchitecture(B_PACKAGE_ARCHITECTURE_ENUM_COUNT),
|
||||||
fLinkDirectory(NULL),
|
fLinkDirectory(NULL),
|
||||||
@@ -806,59 +807,11 @@ Package::Init(const char* fileName)
|
|||||||
status_t
|
status_t
|
||||||
Package::Load()
|
Package::Load()
|
||||||
{
|
{
|
||||||
// open package file
|
status_t error = _Load();
|
||||||
int fd = Open();
|
|
||||||
if (fd < 0)
|
|
||||||
RETURN_ERROR(fd);
|
|
||||||
PackageCloser packageCloser(this);
|
|
||||||
|
|
||||||
// initialize package reader
|
|
||||||
LoaderErrorOutput errorOutput(this);
|
|
||||||
|
|
||||||
// try current package file format version
|
|
||||||
{
|
|
||||||
CachingPackageReader packageReader(&errorOutput);
|
|
||||||
status_t error = packageReader.Init(fd, false,
|
|
||||||
BHPKG::B_HPKG_READER_DONT_PRINT_VERSION_MISMATCH_MESSAGE);
|
|
||||||
if (error == B_OK) {
|
|
||||||
// parse content
|
|
||||||
LoaderContentHandler handler(this);
|
|
||||||
error = handler.Init();
|
|
||||||
if (error != B_OK)
|
|
||||||
RETURN_ERROR(error);
|
|
||||||
|
|
||||||
error = packageReader.ParseContent(&handler);
|
|
||||||
if (error != B_OK)
|
|
||||||
RETURN_ERROR(error);
|
|
||||||
|
|
||||||
// get the heap reader
|
|
||||||
fHeapReader = packageReader.DetachCachedHeapReader();
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error != B_MISMATCHED_VALUES)
|
|
||||||
RETURN_ERROR(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
// try package file format version 1
|
|
||||||
PackageReaderImplV1 packageReader(&errorOutput);
|
|
||||||
status_t error = packageReader.Init(fd, false);
|
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
RETURN_ERROR(error);
|
return error;
|
||||||
|
|
||||||
// parse content
|
if (!_InitVersionedName())
|
||||||
LoaderContentHandlerV1 handler(this);
|
|
||||||
error = handler.Init();
|
|
||||||
if (error != B_OK)
|
|
||||||
RETURN_ERROR(error);
|
|
||||||
|
|
||||||
error = packageReader.ParseContent(&handler);
|
|
||||||
if (error != B_OK)
|
|
||||||
RETURN_ERROR(error);
|
|
||||||
|
|
||||||
// create a heap reader
|
|
||||||
fHeapReader = new(std::nothrow) HeapReaderV1(fd);
|
|
||||||
if (fHeapReader == NULL)
|
|
||||||
RETURN_ERROR(B_NO_MEMORY);
|
RETURN_ERROR(B_NO_MEMORY);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -991,3 +944,93 @@ Package::CreateDataReader(const PackageData& data,
|
|||||||
|
|
||||||
return fHeapReader->CreateDataReader(data, _reader);
|
return fHeapReader->CreateDataReader(data, _reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
Package::_Load()
|
||||||
|
{
|
||||||
|
// open package file
|
||||||
|
int fd = Open();
|
||||||
|
if (fd < 0)
|
||||||
|
RETURN_ERROR(fd);
|
||||||
|
PackageCloser packageCloser(this);
|
||||||
|
|
||||||
|
// initialize package reader
|
||||||
|
LoaderErrorOutput errorOutput(this);
|
||||||
|
|
||||||
|
// try current package file format version
|
||||||
|
{
|
||||||
|
CachingPackageReader packageReader(&errorOutput);
|
||||||
|
status_t error = packageReader.Init(fd, false,
|
||||||
|
BHPKG::B_HPKG_READER_DONT_PRINT_VERSION_MISMATCH_MESSAGE);
|
||||||
|
if (error == B_OK) {
|
||||||
|
// parse content
|
||||||
|
LoaderContentHandler handler(this);
|
||||||
|
error = handler.Init();
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
error = packageReader.ParseContent(&handler);
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
// get the heap reader
|
||||||
|
fHeapReader = packageReader.DetachCachedHeapReader();
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error != B_MISMATCHED_VALUES)
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// try package file format version 1
|
||||||
|
PackageReaderImplV1 packageReader(&errorOutput);
|
||||||
|
status_t error = packageReader.Init(fd, false);
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
// parse content
|
||||||
|
LoaderContentHandlerV1 handler(this);
|
||||||
|
error = handler.Init();
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
error = packageReader.ParseContent(&handler);
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
// create a heap reader
|
||||||
|
fHeapReader = new(std::nothrow) HeapReaderV1(fd);
|
||||||
|
if (fHeapReader == NULL)
|
||||||
|
RETURN_ERROR(B_NO_MEMORY);
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Package::_InitVersionedName()
|
||||||
|
{
|
||||||
|
// compute the allocation size needed for the versioned name
|
||||||
|
size_t nameLength = strlen(fName);
|
||||||
|
size_t size = nameLength + 1;
|
||||||
|
|
||||||
|
if (fVersion != NULL) {
|
||||||
|
size += 1 + fVersion->ToString(NULL, 0);
|
||||||
|
// + 1 for the '-'
|
||||||
|
}
|
||||||
|
|
||||||
|
// allocate the name and compose it
|
||||||
|
char* name = (char*)malloc(size);
|
||||||
|
if (name == NULL)
|
||||||
|
return false;
|
||||||
|
MemoryDeleter nameDeleter(name);
|
||||||
|
|
||||||
|
memcpy(name, fName, nameLength + 1);
|
||||||
|
if (fVersion != NULL) {
|
||||||
|
name[nameLength] = '-';
|
||||||
|
fVersion->ToString(name + nameLength + 1, size - nameLength - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fVersionedName.SetTo(name);
|
||||||
|
}
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ public:
|
|||||||
void SetName(const String& name);
|
void SetName(const String& name);
|
||||||
const String& Name() const { return fName; }
|
const String& Name() const { return fName; }
|
||||||
|
|
||||||
|
const String& VersionedName() const
|
||||||
|
{ return fVersionedName; }
|
||||||
|
|
||||||
dev_t DeviceID() const
|
dev_t DeviceID() const
|
||||||
{ return fDeviceID; }
|
{ return fDeviceID; }
|
||||||
ino_t NodeID() const
|
ino_t NodeID() const
|
||||||
@@ -102,12 +105,17 @@ private:
|
|||||||
struct HeapReaderV2;
|
struct HeapReaderV2;
|
||||||
struct CachingPackageReader;
|
struct CachingPackageReader;
|
||||||
|
|
||||||
|
private:
|
||||||
|
status_t _Load();
|
||||||
|
bool _InitVersionedName();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutex fLock;
|
mutex fLock;
|
||||||
::Volume* fVolume;
|
::Volume* fVolume;
|
||||||
String fFileName;
|
String fFileName;
|
||||||
String fName;
|
String fName;
|
||||||
String fInstallPath;
|
String fInstallPath;
|
||||||
|
String fVersionedName;
|
||||||
::Version* fVersion;
|
::Version* fVersion;
|
||||||
BPackageArchitecture fArchitecture;
|
BPackageArchitecture fArchitecture;
|
||||||
PackageLinkDirectory* fLinkDirectory;
|
PackageLinkDirectory* fLinkDirectory;
|
||||||
|
|||||||
@@ -46,34 +46,8 @@ PackageLinkDirectory::~PackageLinkDirectory()
|
|||||||
status_t
|
status_t
|
||||||
PackageLinkDirectory::Init(Directory* parent, Package* package)
|
PackageLinkDirectory::Init(Directory* parent, Package* package)
|
||||||
{
|
{
|
||||||
// compute the allocation size needed for the versioned name
|
|
||||||
size_t nameLength = strlen(package->Name());
|
|
||||||
size_t size = nameLength + 1;
|
|
||||||
|
|
||||||
Version* version = package->Version();
|
|
||||||
if (version != NULL) {
|
|
||||||
size += 1 + version->ToString(NULL, 0);
|
|
||||||
// + 1 for the '-'
|
|
||||||
}
|
|
||||||
|
|
||||||
// allocate the name and compose it
|
|
||||||
char* name = (char*)malloc(size);
|
|
||||||
if (name == NULL)
|
|
||||||
return B_NO_MEMORY;
|
|
||||||
MemoryDeleter nameDeleter(name);
|
|
||||||
|
|
||||||
memcpy(name, package->Name(), nameLength + 1);
|
|
||||||
if (version != NULL) {
|
|
||||||
name[nameLength] = '-';
|
|
||||||
version->ToString(name + nameLength + 1, size - nameLength - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
String nameString;
|
|
||||||
if (!nameString.SetTo(name))
|
|
||||||
return B_NO_MEMORY;
|
|
||||||
|
|
||||||
// init the directory/node
|
// init the directory/node
|
||||||
status_t error = Init(parent, nameString);
|
status_t error = Init(parent, package->VersionedName());
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
RETURN_ERROR(error);
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user