[haiku-commits] r40426 - in haiku/trunk: headers/os/package/hpkg headers/private/package/hpkg src/bin/package_repo src/kits/package/hpkg
- From: zooey@xxxxxxxxxxxxxxx
- To: haiku-commits@xxxxxxxxxxxxx
- Date: Thu, 10 Feb 2011 20:05:36 +0100 (CET)
Author: zooey
Date: 2011-02-10 20:05:35 +0100 (Thu, 10 Feb 2011)
New Revision: 40426
Changeset: http://dev.haiku-os.org/changeset/40426
Modified:
haiku/trunk/headers/os/package/hpkg/RepositoryWriter.h
haiku/trunk/headers/private/package/hpkg/RepositoryWriterImpl.h
haiku/trunk/headers/private/package/hpkg/haiku_package.h
haiku/trunk/src/bin/package_repo/command_create.cpp
haiku/trunk/src/kits/package/hpkg/RepositoryWriterImpl.cpp
haiku/trunk/src/kits/package/hpkg/WriterImplBase.cpp
Log:
Fix problems in repository writer
* actually write the checksum
* compress the repository info archive, too (handle it as separate
section)
Modified: haiku/trunk/headers/os/package/hpkg/RepositoryWriter.h
===================================================================
--- haiku/trunk/headers/os/package/hpkg/RepositoryWriter.h 2011-02-10
18:47:21 UTC (rev 40425)
+++ haiku/trunk/headers/os/package/hpkg/RepositoryWriter.h 2011-02-10
19:05:35 UTC (rev 40426)
@@ -36,9 +36,12 @@
virtual void OnPackageAdded(
const
BPackageInfo& packageInfo) = 0;
- virtual void
OnPackageAttributesSizeInfo(uint32 stringCount,
+ virtual void OnRepositoryInfoSectionDone(
uint32
uncompressedSize) = 0;
- virtual void OnRepositorySizeInfo(uint32
headerSize,
+ virtual void OnPackageAttributesSectionDone(
+ uint32
stringCount,
+ uint32
uncompressedSize) = 0;
+ virtual void OnRepositoryDone(uint32
headerSize,
uint32
repositoryInfoLength,
uint32
packageCount,
uint32
packageAttributesSize,
Modified: haiku/trunk/headers/private/package/hpkg/RepositoryWriterImpl.h
===================================================================
--- haiku/trunk/headers/private/package/hpkg/RepositoryWriterImpl.h
2011-02-10 18:47:21 UTC (rev 40425)
+++ haiku/trunk/headers/private/package/hpkg/RepositoryWriterImpl.h
2011-02-10 19:05:35 UTC (rev 40426)
@@ -64,11 +64,11 @@
status_t _Finish();
status_t
_RegisterCurrentPackageInfo();
- status_t _WriteRepositoryInfo(
-
ssize_t& _repositoryInfoLength);
+ status_t
_WriteRepositoryInfo(hpkg_repo_header& header,
+
ssize_t& _infoLengthCompressed);
off_t _WritePackageAttributes(
-
hpkg_repo_header& header,
- off_t
startOffset);
+
hpkg_repo_header& header, off_t startOffset,
+
ssize_t& _packagesLengthCompressed);
struct PackageNameSet;
Modified: haiku/trunk/headers/private/package/hpkg/haiku_package.h
===================================================================
--- haiku/trunk/headers/private/package/hpkg/haiku_package.h 2011-02-10
18:47:21 UTC (rev 40425)
+++ haiku/trunk/headers/private/package/hpkg/haiku_package.h 2011-02-10
19:05:35 UTC (rev 40426)
@@ -49,18 +49,19 @@
uint32 magic; //
"hpkr"
uint16 header_size;
uint16 version;
- uint64 total_size;
+ uint32 total_size;
- // repository header
- uint32 repository_header_length;
+ // repository info section
+ uint32 info_compression;
+ uint32 info_length_compressed;
+ uint32 info_length_uncompressed;
// package attributes section
- uint32 attributes_compression;
- uint32 attributes_length_compressed;
- uint32 attributes_length_uncompressed;
-
- uint64 attributes_strings_length;
- uint64 attributes_strings_count;
+ uint32 packages_compression;
+ uint32 packages_length_compressed;
+ uint32 packages_length_uncompressed;
+ uint32 packages_strings_length;
+ uint32 packages_strings_count;
};
@@ -148,6 +149,7 @@
HPKG_PACKAGE_ATTRIBUTE_FRESHENS,
HPKG_PACKAGE_ATTRIBUTE_REPLACES,
HPKG_PACKAGE_ATTRIBUTE_RESOLVABLE_OPERATOR,
+ HPKG_PACKAGE_ATTRIBUTE_CHECKSUM,
//
HPKG_PACKAGE_ATTRIBUTE_ENUM_COUNT,
};
Modified: haiku/trunk/src/bin/package_repo/command_create.cpp
===================================================================
--- haiku/trunk/src/bin/package_repo/command_create.cpp 2011-02-10 18:47:21 UTC
(rev 40425)
+++ haiku/trunk/src/bin/package_repo/command_create.cpp 2011-02-10 19:05:35 UTC
(rev 40426)
@@ -48,9 +48,10 @@
printf("%s (%s)\n", packageInfo.Name().String(),
packageInfo.Version().ToString().String());
if (fVerbose) {
- printf("\tsummary: %s\n",
packageInfo.Summary().String());
- printf("\tvendor: %s\n",
packageInfo.Vendor().String());
- printf("\tpackager: %s\n",
packageInfo.Packager().String());
+ printf("\tsummary: %s\n",
packageInfo.Summary().String());
+ printf("\tvendor: %s\n",
packageInfo.Vendor().String());
+ printf("\tpackager: %s\n",
packageInfo.Packager().String());
+ printf("\tsha256-checksum: %s\n",
packageInfo.Checksum().String());
if (uint32 flags = packageInfo.Flags()) {
printf("\tflags:\n");
if ((flags & B_PACKAGE_FLAG_APPROVE_LICENSE) !=
0)
@@ -61,21 +62,30 @@
}
}
- virtual void OnPackageAttributesSizeInfo(uint32 stringCount,
+ virtual void OnRepositoryInfoSectionDone(uint32 uncompressedSize)
+ {
+ if (fQuiet || !fVerbose)
+ return;
+
+ printf("----- Repository Info Section --------------------\n");
+ printf("repository info size: %10lu (uncompressed)\n",
+ uncompressedSize);
+ }
+
+ virtual void OnPackageAttributesSectionDone(uint32 stringCount,
uint32 uncompressedSize)
{
if (fQuiet || !fVerbose)
return;
- printf("----- Package Attribute Info ---------------------\n");
+ printf("----- Package Attribute Section -------------------\n");
printf("string count: %10lu\n", stringCount);
printf("package attributes size: %10lu (uncompressed)\n",
uncompressedSize);
}
- virtual void OnRepositorySizeInfo(uint32 headerSize,
- uint32 repositoryInfoSize, uint32 packageCount,
- uint32 packageAttributesSize, uint64 totalSize)
+ virtual void OnRepositoryDone(uint32 headerSize, uint32
repositoryInfoSize,
+ uint32 packageCount, uint32 packageAttributesSize, uint64
totalSize)
{
if (fQuiet)
return;
Modified: haiku/trunk/src/kits/package/hpkg/RepositoryWriterImpl.cpp
===================================================================
--- haiku/trunk/src/kits/package/hpkg/RepositoryWriterImpl.cpp 2011-02-10
18:47:21 UTC (rev 40425)
+++ haiku/trunk/src/kits/package/hpkg/RepositoryWriterImpl.cpp 2011-02-10
19:05:35 UTC (rev 40426)
@@ -228,28 +228,24 @@
hpkg_repo_header header;
// write repository header
- ssize_t repositoryInfoLength;
- status_t result = _WriteRepositoryInfo(repositoryInfoLength);
+ ssize_t infoLengthCompressed;
+ status_t result = _WriteRepositoryInfo(header, infoLengthCompressed);
if (result != B_OK)
return result;
- header.repository_header_length
- = B_HOST_TO_BENDIAN_INT32(repositoryInfoLength);
-
// write package attributes
+ ssize_t packagesLengthCompressed;
off_t totalSize = _WritePackageAttributes(header,
- sizeof(header) + repositoryInfoLength);
+ sizeof(header) + infoLengthCompressed,
packagesLengthCompressed);
- fListener->OnRepositorySizeInfo(sizeof(header), repositoryInfoLength,
- fPackageCount,
- B_BENDIAN_TO_HOST_INT32(header.attributes_length_compressed),
- totalSize);
+ fListener->OnRepositoryDone(sizeof(header), infoLengthCompressed,
+ fPackageCount, packagesLengthCompressed, totalSize);
// general
header.magic = B_HOST_TO_BENDIAN_INT32(B_HPKG_REPO_MAGIC);
header.header_size = B_HOST_TO_BENDIAN_INT16((uint16)sizeof(header));
header.version = B_HOST_TO_BENDIAN_INT16(B_HPKG_REPO_VERSION);
- header.total_size = B_HOST_TO_BENDIAN_INT64(totalSize);
+ header.total_size = B_HOST_TO_BENDIAN_INT32(totalSize);
// write the header
WriteBuffer(&header, sizeof(header), 0);
@@ -350,7 +346,8 @@
status_t
-RepositoryWriterImpl::_WriteRepositoryInfo(ssize_t& _repositoryInfoLength)
+RepositoryWriterImpl::_WriteRepositoryInfo(hpkg_repo_header& header,
+ ssize_t& _infoLengthCompressed)
{
BMessage archive;
status_t result = fRepositoryInfo->Archive(&archive);
@@ -359,22 +356,45 @@
return result;
}
- _repositoryInfoLength = archive.FlattenedSize();
- char buffer[_repositoryInfoLength];
- if ((result = archive.Flatten(buffer, _repositoryInfoLength)) != B_OK) {
+ ssize_t flattenedSize = archive.FlattenedSize();
+ char buffer[flattenedSize];
+ if ((result = archive.Flatten(buffer, flattenedSize)) != B_OK) {
fListener->PrintError("can't flatten repository header!\n");
return result;
}
off_t startOffset = sizeof(hpkg_repo_header);
- WriteBuffer(buffer, _repositoryInfoLength, startOffset);
+ // write the package attributes (zlib writer on top of a file writer)
+ FDDataWriter realWriter(FD(), startOffset, fListener);
+ ZlibDataWriter zlibWriter(&realWriter);
+ SetDataWriter(&zlibWriter);
+ zlibWriter.Init();
+
+ DataWriter()->WriteDataThrows(buffer, flattenedSize);
+
+ zlibWriter.Finish();
+ SetDataWriter(NULL);
+
+ fListener->OnRepositoryInfoSectionDone(zlibWriter.BytesWritten());
+
+ _infoLengthCompressed = realWriter.BytesWritten();
+
+ // update the header
+ header.info_compression
+ = B_HOST_TO_BENDIAN_INT32(B_HPKG_COMPRESSION_ZLIB);
+ header.info_length_compressed
+ = B_HOST_TO_BENDIAN_INT32(_infoLengthCompressed);
+ header.info_length_uncompressed
+ = B_HOST_TO_BENDIAN_INT32(flattenedSize);
+
return B_OK;
}
+
off_t
RepositoryWriterImpl::_WritePackageAttributes(hpkg_repo_header& header,
- off_t startOffset)
+ off_t startOffset, ssize_t& _packagesLengthCompressed)
{
// write the package attributes (zlib writer on top of a file writer)
FDDataWriter realWriter(FD(), startOffset, fListener);
@@ -391,18 +411,20 @@
off_t endOffset = realWriter.Offset();
SetDataWriter(NULL);
- fListener->OnPackageAttributesSizeInfo(stringsCount,
+ fListener->OnPackageAttributesSectionDone(stringsCount,
zlibWriter.BytesWritten());
+ _packagesLengthCompressed = endOffset - startOffset;
+
// update the header
- header.attributes_compression
+ header.packages_compression
= B_HOST_TO_BENDIAN_INT32(B_HPKG_COMPRESSION_ZLIB);
- header.attributes_length_compressed
- = B_HOST_TO_BENDIAN_INT32(endOffset - startOffset);
- header.attributes_length_uncompressed
+ header.packages_length_compressed
+ = B_HOST_TO_BENDIAN_INT32(_packagesLengthCompressed);
+ header.packages_length_uncompressed
= B_HOST_TO_BENDIAN_INT32(zlibWriter.BytesWritten());
- header.attributes_strings_count = B_HOST_TO_BENDIAN_INT32(stringsCount);
- header.attributes_strings_length
+ header.packages_strings_count = B_HOST_TO_BENDIAN_INT32(stringsCount);
+ header.packages_strings_length
= B_HOST_TO_BENDIAN_INT32(stringsLengthUncompressed);
return endOffset;
Modified: haiku/trunk/src/kits/package/hpkg/WriterImplBase.cpp
===================================================================
--- haiku/trunk/src/kits/package/hpkg/WriterImplBase.cpp 2011-02-10
18:47:21 UTC (rev 40425)
+++ haiku/trunk/src/kits/package/hpkg/WriterImplBase.cpp 2011-02-10
19:05:35 UTC (rev 40426)
@@ -479,6 +479,16 @@
=
fPackageStringCache.Get(replacesList.ItemAt(i)->String());
attributeList.Add(replaces);
}
+
+ // checksum (optional, only exists in repositories)
+ if (packageInfo.Checksum().Length() > 0) {
+ PackageAttribute* checksum = new PackageAttribute(
+ HPKG_PACKAGE_ATTRIBUTE_CHECKSUM,
B_HPKG_ATTRIBUTE_TYPE_STRING,
+ B_HPKG_ATTRIBUTE_ENCODING_STRING_TABLE);
+ checksum->string
+ =
fPackageStringCache.Get(packageInfo.Checksum().String());
+ attributeList.Add(checksum);
+ }
}
Other related posts:
- » [haiku-commits] r40426 - in haiku/trunk: headers/os/package/hpkg headers/private/package/hpkg src/bin/package_repo src/kits/package/hpkg - zooey