More work on package kit:
* added class BPackageInfo, which contains packaging attributes of a package (the values relevant for package management) * implemented parser (mostly) for reading a BPackageInfo from a config file (.PackageInfo) in order to pass them on to the PackageWriter when creating a package * pulled hpkg-related stuff from bin/package into the package kit * adjusted packagefs-Volume to skip .PackageInfo files when populating the mountpoint, as those files shouldn't appear as part of an activated package git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40301 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -15,8 +15,9 @@ extern const char* kPackageVendorAttribute;
|
||||
extern const char* kPackageVersionAttribute;
|
||||
|
||||
// attributes kept local to packages
|
||||
extern const char* kPackageCopyrightAttribute;
|
||||
extern const char* kPackageLicenseAttribute;
|
||||
extern const char* kPackageCopyrightsAttribute;
|
||||
extern const char* kPackageLicensesAttribute;
|
||||
extern const char* kPackagePackagerAttribute;
|
||||
extern const char* kPackageProvidesAttribute;
|
||||
extern const char* kPackageRequiresAttribute;
|
||||
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
/*
|
||||
* Copyright 2011, Oliver Tappe <[email protected]>
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _PACKAGE__PACKAGE_INFO_H_
|
||||
#define _PACKAGE__PACKAGE_INFO_H_
|
||||
|
||||
|
||||
#include <ObjectList.h>
|
||||
#include <String.h>
|
||||
|
||||
|
||||
class BEntry;
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
enum BPackageInfoIndex {
|
||||
B_PACKAGE_INFO_NAME = 0,
|
||||
B_PACKAGE_INFO_SUMMARY, // single line, 72 chars max
|
||||
B_PACKAGE_INFO_DESCRIPTION, // multiple lines possible
|
||||
B_PACKAGE_INFO_VENDOR, // e.g. "Haiku Project"
|
||||
B_PACKAGE_INFO_PACKAGER, // e-mail address preferred
|
||||
B_PACKAGE_INFO_ARCHITECTURE,
|
||||
B_PACKAGE_INFO_VERSION,
|
||||
B_PACKAGE_INFO_COPYRIGHTS, // list
|
||||
B_PACKAGE_INFO_LICENSES, // list
|
||||
B_PACKAGE_INFO_PROVIDES, // list
|
||||
B_PACKAGE_INFO_REQUIRES, // list
|
||||
//
|
||||
B_PACKAGE_INFO_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
enum BPackageArchitecture {
|
||||
B_PACKAGE_ARCHITECTURE_NONE = 0,
|
||||
B_PACKAGE_ARCHITECTURE_X86,
|
||||
B_PACKAGE_ARCHITECTURE_X86_GCC2,
|
||||
//
|
||||
B_PACKAGE_ARCHITECTURE_ENUM_COUNT,
|
||||
};
|
||||
|
||||
|
||||
class BPackageVersion {
|
||||
public:
|
||||
void MakeEmpty() {}
|
||||
};
|
||||
|
||||
|
||||
class BPackageProvision {
|
||||
public:
|
||||
int Compare(const BPackageProvision& other) const
|
||||
{
|
||||
return fX.Compare(other.fX);
|
||||
}
|
||||
private:
|
||||
BString fX;
|
||||
};
|
||||
|
||||
|
||||
class BPackageRequirement {
|
||||
public:
|
||||
int Compare(const BPackageRequirement& other) const
|
||||
{
|
||||
return fX.Compare(other.fX);
|
||||
}
|
||||
private:
|
||||
BString fX;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Keeps a list of package info elements (e.g. name, version, vendor, ...) which
|
||||
* will be converted to package attributes when creating a package. Usually,
|
||||
* these elements have been parsed from a ".PackageInfo"-file.
|
||||
* Alternatively, the package reader populates a BPackageInfo object by
|
||||
* collecting package attributes from an existing package.
|
||||
*/
|
||||
class BPackageInfo {
|
||||
public:
|
||||
struct ParseErrorListener {
|
||||
virtual ~ParseErrorListener();
|
||||
virtual void OnError(const BString& msg, int line, int col) = 0;
|
||||
};
|
||||
|
||||
public:
|
||||
BPackageInfo();
|
||||
~BPackageInfo();
|
||||
|
||||
status_t ReadFromConfigFile(
|
||||
const BEntry& packageInfoEntry,
|
||||
ParseErrorListener* listener = NULL);
|
||||
status_t ReadFromConfigString(
|
||||
const BString& packageInfoString,
|
||||
ParseErrorListener* listener = NULL);
|
||||
|
||||
status_t InitCheck() const;
|
||||
|
||||
const BString& Name() const;
|
||||
const BString& Summary() const;
|
||||
const BString& Description() const;
|
||||
const BString& Vendor() const;
|
||||
const BString& Packager() const;
|
||||
|
||||
BPackageArchitecture Architecture() const;
|
||||
|
||||
const BPackageVersion& Version() const;
|
||||
|
||||
const BObjectList<BString>& Copyrights() const;
|
||||
const BObjectList<BString>& Licenses() const;
|
||||
|
||||
const BObjectList<BPackageRequirement>& Requirements() const;
|
||||
const BObjectList<BPackageProvision>& Provisions() const;
|
||||
|
||||
void SetName(const BString& name);
|
||||
void SetSummary(const BString& summary);
|
||||
void SetDescription(const BString& description);
|
||||
void SetVendor(const BString& vendor);
|
||||
void SetPackager(const BString& packager);
|
||||
|
||||
void SetArchitecture(
|
||||
BPackageArchitecture architecture);
|
||||
|
||||
void SetVersion(const BPackageVersion& version);
|
||||
|
||||
void ClearCopyrights();
|
||||
status_t AddCopyright(const BString& copyright);
|
||||
status_t RemoveCopyright(const BString& copyright);
|
||||
|
||||
void ClearLicenses();
|
||||
status_t AddLicense(const BString& license);
|
||||
status_t RemoveLicense(const BString& license);
|
||||
|
||||
void ClearProvisions();
|
||||
status_t AddProvision(
|
||||
const BPackageProvision& provision);
|
||||
status_t RemoveProvision(
|
||||
const BPackageProvision& provision);
|
||||
|
||||
void ClearRequirements();
|
||||
status_t AddRequirement(
|
||||
const BPackageRequirement& requirement);
|
||||
status_t RemoveRequirement(
|
||||
const BPackageRequirement& requirement);
|
||||
|
||||
void MakeEmpty();
|
||||
|
||||
public:
|
||||
static status_t GetElementName(
|
||||
BPackageInfoIndex index,
|
||||
const char** name);
|
||||
|
||||
private:
|
||||
class Parser;
|
||||
friend class Parser;
|
||||
|
||||
static const char* kElementNames[];
|
||||
static const char* kArchitectureNames[];
|
||||
|
||||
private:
|
||||
BString fName;
|
||||
BString fSummary;
|
||||
BString fDescription;
|
||||
BString fVendor;
|
||||
BString fPackager;
|
||||
|
||||
BPackageArchitecture fArchitecture;
|
||||
|
||||
BPackageVersion fVersion;
|
||||
|
||||
BObjectList<BString> fCopyrights;
|
||||
BObjectList<BString> fLicenses;
|
||||
|
||||
BObjectList<BPackageProvision> fProvisions;
|
||||
BObjectList<BPackageRequirement> fRequirements;
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__PACKAGE_INFO_H_
|
||||
@@ -2,8 +2,8 @@
|
||||
* Copyright 2011, Haiku, Inc.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _PACKAGE__ROSTER_H_
|
||||
#define _PACKAGE__ROSTER_H_
|
||||
#ifndef _PACKAGE__PACKAGE_ROSTER_H_
|
||||
#define _PACKAGE__PACKAGE_ROSTER_H_
|
||||
|
||||
|
||||
#include <Entry.h>
|
||||
@@ -68,4 +68,4 @@ private:
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__ROSTER_H_
|
||||
#endif // _PACKAGE__PACKAGE_ROSTER_H_
|
||||
|
||||
+18
-4
@@ -2,11 +2,18 @@
|
||||
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef BLOCK_BUFFER_CACHE_H
|
||||
#define BLOCK_BUFFER_CACHE_H
|
||||
#ifndef _PACKAGE__HPKG__BLOCK_BUFFER_CACHE_H_
|
||||
#define _PACKAGE__HPKG__BLOCK_BUFFER_CACHE_H_
|
||||
|
||||
|
||||
#include "BufferCache.h"
|
||||
#include <package/hpkg/BufferCache.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class BlockBufferCache : public BufferCache {
|
||||
@@ -54,4 +61,11 @@ public:
|
||||
};
|
||||
|
||||
|
||||
#endif // BLOCK_BUFFER_CACHE_H
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__HPKG__BLOCK_BUFFER_CACHE_H_
|
||||
@@ -2,8 +2,8 @@
|
||||
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef BUFFER_CACHE_H
|
||||
#define BUFFER_CACHE_H
|
||||
#ifndef _PACKAGE__HPKG__BUFFER_CACHE_H_
|
||||
#define _PACKAGE__HPKG__BUFFER_CACHE_H_
|
||||
|
||||
|
||||
#include <stddef.h>
|
||||
@@ -11,6 +11,13 @@
|
||||
#include <util/DoublyLinkedList.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class CachedBuffer : public DoublyLinkedListLinkImpl<CachedBuffer> {
|
||||
public:
|
||||
CachedBuffer(size_t size);
|
||||
@@ -88,4 +95,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
#endif // BUFFER_CACHE_H
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _PACKAGE__HPKG__BUFFER_CACHE_H_
|
||||
@@ -9,6 +9,13 @@
|
||||
#include <SupportDefs.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class DataOutput {
|
||||
public:
|
||||
virtual ~DataOutput();
|
||||
@@ -32,4 +39,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // DATA_OUTPUT_H
|
||||
@@ -9,6 +9,13 @@
|
||||
#include <SupportDefs.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class DataReader {
|
||||
public:
|
||||
virtual ~DataReader();
|
||||
@@ -58,4 +65,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // DATA_READER_H
|
||||
@@ -11,6 +11,13 @@
|
||||
#include <SupportDefs.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class ErrorOutput {
|
||||
public:
|
||||
virtual ~ErrorOutput();
|
||||
@@ -21,4 +28,11 @@ public:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // ERROR_OUTPUT_H
|
||||
@@ -6,6 +6,13 @@
|
||||
#define FD_CLOSER_H
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
struct FDCloser {
|
||||
FDCloser(int fd)
|
||||
:
|
||||
@@ -24,4 +31,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // FD_CLOSER_H
|
||||
+15
-1
@@ -8,7 +8,14 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <haiku_package.h>
|
||||
#include <package/hpkg/haiku_package.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
struct PackageAttributeValue {
|
||||
@@ -144,4 +151,11 @@ PackageAttributeValue::SetToData(uint64 size, const void* rawData)
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // PACKAGE_ATTRIBUTE_VALUE_H
|
||||
@@ -6,7 +6,14 @@
|
||||
#define PACKAGE_DATA_H
|
||||
|
||||
|
||||
#include <haiku_package.h>
|
||||
#include <package/hpkg/haiku_package.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class PackageData {
|
||||
@@ -49,4 +56,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // PACKAGE_DATA_H
|
||||
+15
-1
@@ -6,7 +6,14 @@
|
||||
#define PACKAGE_DATA_READER_H
|
||||
|
||||
|
||||
#include "DataReader.h"
|
||||
#include <package/hpkg/DataReader.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class BufferCache;
|
||||
@@ -48,4 +55,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // PACKAGE_DATA_READER_H
|
||||
@@ -8,7 +8,14 @@
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "PackageData.h"
|
||||
#include <package/hpkg/PackageData.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class PackageEntry {
|
||||
@@ -81,4 +88,11 @@ PackageEntry::SetPermissions(uint32 permissions)
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // PACKAGE_ENTRY_H
|
||||
+15
-1
@@ -6,7 +6,14 @@
|
||||
#define PACKAGE_ENTRY_ATTRIBUTE_H
|
||||
|
||||
|
||||
#include "PackageData.h"
|
||||
#include <package/hpkg/PackageData.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class PackageEntryAttribute {
|
||||
@@ -27,4 +34,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // PACKAGE_ENTRY_ATTRIBUTE_H
|
||||
@@ -10,7 +10,14 @@
|
||||
|
||||
#include <util/SinglyLinkedList.h>
|
||||
|
||||
#include "PackageAttributeValue.h"
|
||||
#include <package/hpkg/PackageAttributeValue.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class ErrorOutput;
|
||||
@@ -163,4 +170,11 @@ PackageReader::_Read(Type& _value)
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // PACKAGE_READER_H
|
||||
@@ -9,12 +9,23 @@
|
||||
#include <util/DoublyLinkedList.h>
|
||||
#include <util/OpenHashTable.h>
|
||||
|
||||
#include "Strings.h"
|
||||
#include <package/hpkg/Strings.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class DataReader;
|
||||
struct hpkg_header;
|
||||
|
||||
namespace BPackageKit {
|
||||
class BPackageInfo;
|
||||
}
|
||||
|
||||
|
||||
class PackageWriter {
|
||||
public:
|
||||
@@ -121,4 +132,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // PACKAGE_WRITER_H
|
||||
@@ -6,6 +6,13 @@
|
||||
#define STACKER_H
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
template<typename Type>
|
||||
class Stacker {
|
||||
public:
|
||||
@@ -37,4 +44,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // STACKER_H
|
||||
@@ -9,6 +9,13 @@
|
||||
#include <util/OpenHashTable.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
uint32 hash_string(const char* string);
|
||||
|
||||
|
||||
@@ -79,4 +86,11 @@ struct CachedStringUsageGreater {
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // STRINGS_H
|
||||
+14
@@ -9,10 +9,24 @@
|
||||
#include <SupportDefs.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class ZlibCompressionBase {
|
||||
public:
|
||||
static status_t TranslateZlibError(int error);
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // ZLIB_COMPRESSION_BASE_H
|
||||
+15
-1
@@ -8,7 +8,14 @@
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
#include "ZlibCompressionBase.h"
|
||||
#include <package/hpkg/ZlibCompressionBase.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class DataOutput;
|
||||
@@ -35,4 +42,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // ZLIB_COMPRESSOR_H
|
||||
+15
-1
@@ -8,7 +8,14 @@
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
#include "ZlibCompressionBase.h"
|
||||
#include <package/hpkg/ZlibCompressionBase.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
class DataOutput;
|
||||
@@ -37,4 +44,11 @@ private:
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // ZLIB_DECOMPRESSOR_H
|
||||
+18
@@ -9,6 +9,13 @@
|
||||
#include <SupportDefs.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// header
|
||||
struct hpkg_header {
|
||||
uint32 magic; // "hpkg"
|
||||
@@ -141,6 +148,10 @@ enum {
|
||||
#define B_HPKG_MAX_INLINE_DATA_SIZE 8
|
||||
|
||||
|
||||
// name of file containing package information (in package's root folder)
|
||||
#define B_HPKG_PACKAGE_INFO_FILE_NAME ".PackageInfo"
|
||||
|
||||
|
||||
// default values
|
||||
enum {
|
||||
B_HPKG_DEFAULT_FILE_TYPE = B_HPKG_FILE_TYPE_FILE,
|
||||
@@ -152,4 +163,11 @@ enum {
|
||||
};
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
|
||||
|
||||
#endif // _HAIKU_PACKAGE_H
|
||||
@@ -8,7 +8,10 @@
|
||||
|
||||
#include <util/AutoLock.h>
|
||||
|
||||
#include "BlockBufferCache.h"
|
||||
#include <package/hpkg/BlockBufferCache.h>
|
||||
|
||||
|
||||
using BPackageKit::BHaikuPackage::BPrivate::BlockBufferCache;
|
||||
|
||||
|
||||
class BlockBufferCacheKernel : public BlockBufferCache {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#include <new>
|
||||
|
||||
#include <haiku_package.h>
|
||||
#include <package/hpkg/haiku_package.h>
|
||||
|
||||
|
||||
static const uint32 kMaxCachedBuffers = 32;
|
||||
|
||||
@@ -6,8 +6,13 @@
|
||||
#define GLOBAL_FACTORY_H
|
||||
|
||||
|
||||
#include <package/hpkg/haiku_package.h>
|
||||
#include <package/hpkg/PackageDataReader.h>
|
||||
|
||||
#include "BlockBufferCacheKernel.h"
|
||||
#include "PackageDataReader.h"
|
||||
|
||||
|
||||
using namespace BPackageKit::BHaikuPackage::BPrivate;
|
||||
|
||||
|
||||
class GlobalFactory {
|
||||
|
||||
@@ -3,7 +3,7 @@ SubDir HAIKU_TOP src add-ons kernel file_systems packagefs ;
|
||||
|
||||
UseLibraryHeaders zlib ;
|
||||
UsePrivateKernelHeaders ;
|
||||
UsePrivateHeaders haiku_package shared ;
|
||||
UsePrivateHeaders shared ;
|
||||
|
||||
DEFINES += B_ENABLE_INCOMPLETE_POSIX_AT_SUPPORT ;
|
||||
# TODO: Remove when it is complete!
|
||||
@@ -46,8 +46,7 @@ HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES =
|
||||
;
|
||||
|
||||
|
||||
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src bin package ] ;
|
||||
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src bin package compression ] ;
|
||||
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package hpkg ] ;
|
||||
|
||||
|
||||
KernelAddon packagefs
|
||||
|
||||
@@ -11,15 +11,18 @@
|
||||
|
||||
#include <fs_cache.h>
|
||||
|
||||
#include "DataOutput.h"
|
||||
#include "DataReader.h"
|
||||
#include "PackageDataReader.h"
|
||||
#include <package/hpkg/DataOutput.h>
|
||||
#include <package/hpkg/DataReader.h>
|
||||
#include <package/hpkg/PackageDataReader.h>
|
||||
|
||||
#include "DebugSupport.h"
|
||||
#include "GlobalFactory.h"
|
||||
#include "Package.h"
|
||||
|
||||
|
||||
using namespace BPackageKit::BHaikuPackage::BPrivate;
|
||||
|
||||
|
||||
// #pragma mark - DataAccessor
|
||||
|
||||
|
||||
|
||||
@@ -6,11 +6,14 @@
|
||||
#define PACKAGE_FILE_H
|
||||
|
||||
|
||||
#include "PackageData.h"
|
||||
#include <package/hpkg/PackageData.h>
|
||||
|
||||
#include "PackageLeafNode.h"
|
||||
|
||||
|
||||
using BPackageKit::BHaikuPackage::BPrivate::PackageData;
|
||||
|
||||
|
||||
class PackageFile : public PackageLeafNode {
|
||||
public:
|
||||
PackageFile(Package* package, mode_t mode,
|
||||
|
||||
@@ -8,9 +8,11 @@
|
||||
|
||||
#include <util/DoublyLinkedList.h>
|
||||
|
||||
#include "PackageData.h"
|
||||
#include <package/hpkg/PackageData.h>
|
||||
|
||||
|
||||
using BPackageKit::BHaikuPackage::BPrivate::PackageData;
|
||||
|
||||
class PackageNode;
|
||||
|
||||
|
||||
|
||||
@@ -23,11 +23,11 @@
|
||||
|
||||
#include <Notifications.h>
|
||||
|
||||
#include "ErrorOutput.h"
|
||||
#include "FDCloser.h"
|
||||
#include "PackageEntry.h"
|
||||
#include "PackageEntryAttribute.h"
|
||||
#include "PackageReader.h"
|
||||
#include <package/hpkg/ErrorOutput.h>
|
||||
#include <package/hpkg/FDCloser.h>
|
||||
#include <package/hpkg/PackageEntry.h>
|
||||
#include <package/hpkg/PackageEntryAttribute.h>
|
||||
#include <package/hpkg/PackageReader.h>
|
||||
|
||||
#include "DebugSupport.h"
|
||||
#include "Directory.h"
|
||||
@@ -38,6 +38,9 @@
|
||||
#include "PackageSymlink.h"
|
||||
|
||||
|
||||
using namespace BPackageKit::BHaikuPackage::BPrivate;
|
||||
|
||||
|
||||
// node ID of the root directory
|
||||
static const ino_t kRootDirectoryID = 1;
|
||||
|
||||
@@ -625,6 +628,9 @@ Volume::_AddPackageContent(Package* package, bool notify)
|
||||
{
|
||||
for (PackageNodeList::Iterator it = package->Nodes().GetIterator();
|
||||
PackageNode* node = it.Next();) {
|
||||
// skip over ".PackageInfo" file, it isn't part of the package content
|
||||
if (strcmp(node->Name(), B_HPKG_PACKAGE_INFO_FILE_NAME) == 0)
|
||||
continue;
|
||||
status_t error = _AddPackageContentRootNode(package, node, notify);
|
||||
if (error != B_OK) {
|
||||
_RemovePackageContent(package, node, notify);
|
||||
@@ -645,6 +651,10 @@ Volume::_RemovePackageContent(Package* package, PackageNode* endNode,
|
||||
if (node == endNode)
|
||||
break;
|
||||
|
||||
// skip over ".PackageInfo" file, it isn't part of the package content
|
||||
if (strcmp(node->Name(), B_HPKG_PACKAGE_INFO_FILE_NAME) == 0)
|
||||
continue;
|
||||
|
||||
PackageNode* nextNode = package->Nodes().GetNext(node);
|
||||
_RemovePackageContentRootNode(package, node, NULL, notify);
|
||||
node = nextNode;
|
||||
|
||||
+1
-21
@@ -1,39 +1,19 @@
|
||||
SubDir HAIKU_TOP src bin package ;
|
||||
|
||||
UseLibraryHeaders zlib ;
|
||||
UsePrivateHeaders kernel shared ;
|
||||
UsePrivateHeaders haiku_package ;
|
||||
|
||||
DEFINES += B_ENABLE_INCOMPLETE_POSIX_AT_SUPPORT ;
|
||||
# TODO: Remove when it is complete!
|
||||
|
||||
SEARCH_SOURCE += [ FDirName $(SUBDIR) compression ] ;
|
||||
|
||||
BinCommand package :
|
||||
BlockBufferCache.cpp
|
||||
BufferCache.cpp
|
||||
command_create.cpp
|
||||
command_dump.cpp
|
||||
command_extract.cpp
|
||||
command_list.cpp
|
||||
DataOutput.cpp
|
||||
DataReader.cpp
|
||||
ErrorOutput.cpp
|
||||
package.cpp
|
||||
PackageData.cpp
|
||||
PackageDataReader.cpp
|
||||
PackageEntry.cpp
|
||||
PackageEntryAttribute.cpp
|
||||
PackageReader.cpp
|
||||
PackageWriter.cpp
|
||||
StandardErrorOutput.cpp
|
||||
Strings.cpp
|
||||
|
||||
# compression
|
||||
ZlibCompressionBase.cpp
|
||||
ZlibCompressor.cpp
|
||||
ZlibDecompressor.cpp
|
||||
:
|
||||
z
|
||||
package be
|
||||
$(TARGET_LIBSUPC++)
|
||||
;
|
||||
|
||||
@@ -6,7 +6,10 @@
|
||||
#define STANDARD_ERROR_OUTPUT_H
|
||||
|
||||
|
||||
#include "ErrorOutput.h"
|
||||
#include <package/hpkg/ErrorOutput.h>
|
||||
|
||||
|
||||
using BPackageKit::BHaikuPackage::BPrivate::ErrorOutput;
|
||||
|
||||
|
||||
class StandardErrorOutput : public ErrorOutput {
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "package.h"
|
||||
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
@@ -13,8 +11,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <Entry.h>
|
||||
|
||||
#include <package/PackageInfo.h>
|
||||
#include <package/hpkg/haiku_package.h>
|
||||
#include <package/hpkg/PackageWriter.h>
|
||||
|
||||
#include "package.h"
|
||||
#include "PackageWriter.h"
|
||||
|
||||
|
||||
using BPackageKit::BPackageInfo;
|
||||
using BPackageKit::BHaikuPackage::BPrivate::PackageWriter;
|
||||
|
||||
|
||||
int
|
||||
@@ -86,6 +93,18 @@ printf("Init(): %s\n", strerror(error));
|
||||
if (strcmp(entry->d_name, ".") == 0
|
||||
|| strcmp(entry->d_name, "..") == 0)
|
||||
continue;
|
||||
|
||||
if (strcmp(entry->d_name, B_HPKG_PACKAGE_INFO_FILE_NAME) == 0) {
|
||||
printf("parsing %s ...\n", entry->d_name);
|
||||
struct ErrorListener : public BPackageInfo::ParseErrorListener {
|
||||
virtual void OnError(const BString& msg, int line, int col) {
|
||||
printf("*** parse error (%d:%d) -> %s\n", line, col, msg.String());
|
||||
}
|
||||
} errorListener;
|
||||
BEntry packageInfoEntry(entry->d_name);
|
||||
BPackageInfo packageInfo;
|
||||
packageInfo.ReadFromConfigFile(packageInfoEntry, &errorListener);
|
||||
}
|
||||
error = packageWriter.AddEntry(entry->d_name);
|
||||
printf("AddEntry(\"%s\"): %s\n", entry->d_name, strerror(error));
|
||||
if (error != B_OK)
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "package.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
@@ -13,13 +11,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <package/hpkg/PackageEntry.h>
|
||||
#include <package/hpkg/PackageEntryAttribute.h>
|
||||
#include <package/hpkg/PackageReader.h>
|
||||
|
||||
#include "package.h"
|
||||
#include "PackageEntry.h"
|
||||
#include "PackageEntryAttribute.h"
|
||||
#include "PackageReader.h"
|
||||
#include "StandardErrorOutput.h"
|
||||
|
||||
|
||||
using namespace BPackageKit::BHaikuPackage::BPrivate;
|
||||
|
||||
|
||||
struct PackageContentDumpHandler : LowLevelPackageContentHandler {
|
||||
PackageContentDumpHandler()
|
||||
:
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "package.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
@@ -23,16 +21,20 @@
|
||||
|
||||
#include <AutoDeleter.h>
|
||||
|
||||
#include "BlockBufferCache.h"
|
||||
#include "FDCloser.h"
|
||||
#include <package/hpkg/BlockBufferCache.h>
|
||||
#include <package/hpkg/FDCloser.h>
|
||||
#include <package/hpkg/PackageDataReader.h>
|
||||
#include <package/hpkg/PackageEntry.h>
|
||||
#include <package/hpkg/PackageEntryAttribute.h>
|
||||
#include <package/hpkg/PackageReader.h>
|
||||
|
||||
#include "package.h"
|
||||
#include "PackageDataReader.h"
|
||||
#include "PackageEntry.h"
|
||||
#include "PackageEntryAttribute.h"
|
||||
#include "PackageReader.h"
|
||||
#include "StandardErrorOutput.h"
|
||||
|
||||
|
||||
using namespace BPackageKit::BHaikuPackage::BPrivate;
|
||||
|
||||
|
||||
struct PackageContentExtractHandler : PackageContentHandler {
|
||||
PackageContentExtractHandler(int packageFileFD)
|
||||
:
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "package.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
@@ -13,13 +11,17 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <package/hpkg/PackageEntry.h>
|
||||
#include <package/hpkg/PackageEntryAttribute.h>
|
||||
#include <package/hpkg/PackageReader.h>
|
||||
|
||||
#include "package.h"
|
||||
#include "PackageEntry.h"
|
||||
#include "PackageEntryAttribute.h"
|
||||
#include "PackageReader.h"
|
||||
#include "StandardErrorOutput.h"
|
||||
|
||||
|
||||
using namespace BPackageKit::BHaikuPackage::BPrivate;
|
||||
|
||||
|
||||
struct PackageContentListHandler : PackageContentHandler {
|
||||
PackageContentListHandler(bool listAttributes)
|
||||
:
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "PackageWriter.h"
|
||||
#include <package/hpkg/PackageWriter.h>
|
||||
|
||||
|
||||
extern const char* __progname;
|
||||
|
||||
@@ -13,15 +13,16 @@
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
// attributes used in package and as file attribute, too
|
||||
// attributes used in package and as BFS-attribute
|
||||
const char* kPackageNameAttribute = "PKG:name";
|
||||
const char* kPackagePlatformAttribute = "PKG:platform";
|
||||
const char* kPackageVendorAttribute = "PKG:vendor";
|
||||
const char* kPackageVersionAttribute = "PKG:version";
|
||||
|
||||
// attributes kept local to packages
|
||||
const char* kPackageCopyrightAttribute = "PKG:copyright";
|
||||
const char* kPackageLicenseAttribute = "PKG:license";
|
||||
const char* kPackageCopyrightsAttribute = "PKG:copyrights";
|
||||
const char* kPackageLicensesAttribute = "PKG:licenses";
|
||||
const char* kPackagePackagerAttribute = "PKG:packager";
|
||||
const char* kPackageProvidesAttribute = "PKG:provides";
|
||||
const char* kPackageRequiresAttribute = "PKG:requires";
|
||||
|
||||
|
||||
@@ -1,6 +1,32 @@
|
||||
SubDir HAIKU_TOP src kits package ;
|
||||
|
||||
UsePrivateHeaders package shared ;
|
||||
UseLibraryHeaders zlib ;
|
||||
|
||||
UsePrivateHeaders
|
||||
kernel
|
||||
shared ;
|
||||
|
||||
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package hpkg ] ;
|
||||
|
||||
HPKG_SOURCES =
|
||||
BlockBufferCache.cpp
|
||||
BufferCache.cpp
|
||||
DataOutput.cpp
|
||||
DataReader.cpp
|
||||
ErrorOutput.cpp
|
||||
PackageData.cpp
|
||||
PackageDataReader.cpp
|
||||
PackageEntry.cpp
|
||||
PackageEntryAttribute.cpp
|
||||
PackageReader.cpp
|
||||
PackageWriter.cpp
|
||||
Strings.cpp
|
||||
|
||||
# compression
|
||||
ZlibCompressionBase.cpp
|
||||
ZlibCompressor.cpp
|
||||
ZlibDecompressor.cpp
|
||||
;
|
||||
|
||||
SharedLibrary libpackage.so
|
||||
:
|
||||
@@ -14,6 +40,7 @@ SharedLibrary libpackage.so
|
||||
FetchFileJob.cpp
|
||||
Job.cpp
|
||||
JobQueue.cpp
|
||||
PackageInfo.cpp
|
||||
PackageRoster.cpp
|
||||
RefreshRepositoryRequest.cpp
|
||||
RemoveRepositoryJob.cpp
|
||||
@@ -23,6 +50,8 @@ SharedLibrary libpackage.so
|
||||
Request.cpp
|
||||
TempfileManager.cpp
|
||||
ValidateChecksumJob.cpp
|
||||
|
||||
$(HPKG_SOURCES)
|
||||
:
|
||||
libshared.a be $(TARGET_LIBSTDC++)
|
||||
libshared.a be z $(TARGET_LIBSTDC++)
|
||||
;
|
||||
|
||||
@@ -0,0 +1,880 @@
|
||||
#include <stdio.h>
|
||||
/*
|
||||
* Copyright 2011, Oliver Tappe <zooey@hirschkaefer.de>
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
|
||||
#include <package/PackageInfo.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <new>
|
||||
|
||||
#include <File.h>
|
||||
#include <Entry.h>
|
||||
#include <String.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
|
||||
enum TokenType {
|
||||
TOKEN_WORD,
|
||||
TOKEN_QUOTED_STRING,
|
||||
TOKEN_OPERATOR_ASSIGN,
|
||||
TOKEN_OPERATOR_LESS,
|
||||
TOKEN_OPERATOR_LESS_EQUAL,
|
||||
TOKEN_OPERATOR_EQUAL,
|
||||
TOKEN_OPERATOR_NOT_EQUAL,
|
||||
TOKEN_OPERATOR_GREATER_EQUAL,
|
||||
TOKEN_OPERATOR_GREATER,
|
||||
TOKEN_OPEN_BRACKET,
|
||||
TOKEN_CLOSE_BRACKET,
|
||||
TOKEN_COMMA,
|
||||
TOKEN_SEMICOLON,
|
||||
TOKEN_COLON,
|
||||
//
|
||||
TOKEN_EOF,
|
||||
};
|
||||
|
||||
|
||||
struct ParseError {
|
||||
BString message;
|
||||
const char* pos;
|
||||
|
||||
ParseError(const BString& _message, const char* _pos)
|
||||
: message(_message), pos(_pos)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
/*
|
||||
* Parses a ".PackageInfo" file and fills a BPackageInfo object with the
|
||||
* package info elements found.
|
||||
*/
|
||||
class BPackageInfo::Parser {
|
||||
public:
|
||||
Parser(ParseErrorListener* listener = NULL);
|
||||
|
||||
status_t Parse(const BString& packageInfoString,
|
||||
BPackageInfo* packageInfo);
|
||||
|
||||
private:
|
||||
struct Token;
|
||||
|
||||
Token _NextToken();
|
||||
void _ParseStringValue(BString* value);
|
||||
void _ParseArchitectureValue(
|
||||
BPackageArchitecture* value);
|
||||
void _Parse(BPackageInfo* packageInfo);
|
||||
|
||||
private:
|
||||
ParseErrorListener* fListener;
|
||||
|
||||
const char* fPos;
|
||||
int fCurrentLine;
|
||||
};
|
||||
|
||||
|
||||
struct BPackageInfo::Parser::Token {
|
||||
TokenType type;
|
||||
BString text;
|
||||
const char* pos;
|
||||
|
||||
Token(TokenType _type, const char* _pos, int length = 0)
|
||||
: type(_type), pos(_pos)
|
||||
{
|
||||
if (length != 0) {
|
||||
text.SetTo(pos, length);
|
||||
|
||||
if (type == TOKEN_QUOTED_STRING) {
|
||||
// unescape value of quoted string
|
||||
char* value = text.LockBuffer(length);
|
||||
if (value == NULL)
|
||||
return;
|
||||
int index = 0;
|
||||
int newIndex = 0;
|
||||
bool lastWasEscape = false;
|
||||
while (char c = value[index++]) {
|
||||
if (lastWasEscape) {
|
||||
lastWasEscape = false;
|
||||
// map \n to newline and \t to tab
|
||||
if (c == 'n')
|
||||
c = '\n';
|
||||
else if (c == 't')
|
||||
c = '\t';
|
||||
} else if (c == '\\') {
|
||||
lastWasEscape = true;
|
||||
continue;
|
||||
}
|
||||
value[newIndex++] = c;
|
||||
}
|
||||
value[newIndex] = '\0';
|
||||
text.UnlockBuffer(newIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return type != TOKEN_EOF;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
BPackageInfo::ParseErrorListener::~ParseErrorListener()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BPackageInfo::Parser::Parser(ParseErrorListener* listener)
|
||||
:
|
||||
fListener(listener),
|
||||
fPos(NULL),
|
||||
fCurrentLine(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::Parser::Parse(const BString& packageInfoString,
|
||||
BPackageInfo* packageInfo)
|
||||
{
|
||||
if (packageInfo == NULL)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
fPos = packageInfoString.String();
|
||||
fCurrentLine = 1;
|
||||
|
||||
try {
|
||||
_Parse(packageInfo);
|
||||
} catch (const ParseError& error) {
|
||||
if (fListener != NULL) {
|
||||
// map error position to line and column
|
||||
int line = 1;
|
||||
int column;
|
||||
int32 offset = error.pos - packageInfoString.String();
|
||||
int32 newlinePos = packageInfoString.FindLast('\n', offset);
|
||||
if (newlinePos < 0)
|
||||
column = offset;
|
||||
else {
|
||||
column = offset - newlinePos;
|
||||
do {
|
||||
line++;
|
||||
newlinePos = packageInfoString.FindLast('\n',
|
||||
newlinePos - 1);
|
||||
} while (newlinePos >= 0);
|
||||
}
|
||||
fListener->OnError(error.message, line, column);
|
||||
}
|
||||
return B_BAD_DATA;
|
||||
}
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
BPackageInfo::Parser::Token
|
||||
BPackageInfo::Parser::_NextToken()
|
||||
{
|
||||
// eat any whitespace or comments
|
||||
printf("1: %p\n", fPos);
|
||||
bool inComment = false;
|
||||
while ((inComment && *fPos != '\0') || isspace(*fPos) || *fPos == '#') {
|
||||
printf("1b: %p\n", fPos);
|
||||
if (*fPos == '#')
|
||||
inComment = true;
|
||||
else if (*fPos == '\n') {
|
||||
inComment = false;
|
||||
fCurrentLine++;
|
||||
}
|
||||
fPos++;
|
||||
}
|
||||
|
||||
printf("2: %p\n", fPos);
|
||||
const char* tokenPos = fPos;
|
||||
switch (*fPos) {
|
||||
case '\0':
|
||||
return Token(TOKEN_EOF, fPos);
|
||||
|
||||
case ':':
|
||||
fPos++;
|
||||
return Token(TOKEN_COLON, tokenPos);
|
||||
|
||||
case ',':
|
||||
fPos++;
|
||||
return Token(TOKEN_COMMA, tokenPos);
|
||||
|
||||
case ';':
|
||||
fPos++;
|
||||
return Token(TOKEN_SEMICOLON, tokenPos);
|
||||
|
||||
case '[':
|
||||
fPos++;
|
||||
return Token(TOKEN_OPEN_BRACKET, tokenPos);
|
||||
|
||||
case ']':
|
||||
fPos++;
|
||||
return Token(TOKEN_CLOSE_BRACKET, tokenPos);
|
||||
|
||||
case '<':
|
||||
fPos++;
|
||||
if (*fPos == '=') {
|
||||
fPos++;
|
||||
return Token(TOKEN_OPERATOR_LESS_EQUAL, tokenPos);
|
||||
}
|
||||
return Token(TOKEN_OPERATOR_LESS, tokenPos);
|
||||
|
||||
case '=':
|
||||
fPos++;
|
||||
if (*fPos == '=') {
|
||||
fPos++;
|
||||
return Token(TOKEN_OPERATOR_EQUAL, tokenPos);
|
||||
}
|
||||
return Token(TOKEN_OPERATOR_ASSIGN, tokenPos);
|
||||
|
||||
case '!':
|
||||
if (fPos[1] == '=') {
|
||||
fPos += 2;
|
||||
return Token(TOKEN_OPERATOR_NOT_EQUAL, tokenPos);
|
||||
}
|
||||
break;
|
||||
|
||||
case '>':
|
||||
fPos++;
|
||||
if (*fPos == '=') {
|
||||
fPos++;
|
||||
return Token(TOKEN_OPERATOR_GREATER_EQUAL, tokenPos);
|
||||
}
|
||||
return Token(TOKEN_OPERATOR_GREATER, tokenPos);
|
||||
|
||||
case '"':
|
||||
{
|
||||
fPos++;
|
||||
const char* start = fPos;
|
||||
// anything until the next quote is part of the value
|
||||
bool lastWasEscape = false;
|
||||
while ((*fPos != '"' || lastWasEscape) && *fPos != '\0') {
|
||||
if (lastWasEscape)
|
||||
lastWasEscape = false;
|
||||
else if (*fPos == '\\')
|
||||
lastWasEscape = true;
|
||||
else if (*fPos == '\n')
|
||||
fCurrentLine++;
|
||||
fPos++;
|
||||
}
|
||||
if (*fPos != '"')
|
||||
throw ParseError("unterminated quoted-string", tokenPos);
|
||||
const char* end = fPos++;
|
||||
return Token(TOKEN_QUOTED_STRING, start, end - start);
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
const char* start = fPos;
|
||||
while (isalnum(*fPos) || *fPos == '.' || *fPos == '-'
|
||||
|| *fPos == '_') {
|
||||
fPos++;
|
||||
}
|
||||
if (fPos == start)
|
||||
break;
|
||||
return Token(TOKEN_WORD, start, fPos - start);
|
||||
}
|
||||
}
|
||||
|
||||
BString error = BString("unknown token '") << *fPos << "' encountered";
|
||||
throw ParseError(error.String(), fPos);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::Parser::_ParseStringValue(BString* value)
|
||||
{
|
||||
Token string = _NextToken();
|
||||
if (string.type != TOKEN_QUOTED_STRING && string.type != TOKEN_WORD)
|
||||
throw ParseError("expected quoted-string or word", string.pos);
|
||||
|
||||
*value = string.text;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::Parser::_ParseArchitectureValue(BPackageArchitecture* value)
|
||||
{
|
||||
Token arch = _NextToken();
|
||||
if (arch.type == TOKEN_WORD) {
|
||||
for (int i = 0; i < B_PACKAGE_ARCHITECTURE_ENUM_COUNT; ++i) {
|
||||
if (arch.text.ICompare(BPackageInfo::kArchitectureNames[i]) == 0) {
|
||||
*value = (BPackageArchitecture)i;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BString error("architecture must be one of: [");
|
||||
for (int i = 0; i < B_PACKAGE_ARCHITECTURE_ENUM_COUNT; ++i) {
|
||||
if (i > 0)
|
||||
error << ",";
|
||||
error << BPackageInfo::kArchitectureNames[i];
|
||||
}
|
||||
error << "]";
|
||||
throw ParseError(error, arch.pos);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::Parser::_Parse(BPackageInfo* packageInfo)
|
||||
{
|
||||
bool seen[B_PACKAGE_INFO_ENUM_COUNT];
|
||||
for (int i = 0; i < B_PACKAGE_INFO_ENUM_COUNT; ++i)
|
||||
seen[i] = false;
|
||||
|
||||
const char* const* names = BPackageInfo::kElementNames;
|
||||
|
||||
while (Token t = _NextToken()) {
|
||||
if (t.type != TOKEN_WORD)
|
||||
throw ParseError("expected word [a variable name]", t.pos);
|
||||
|
||||
Token opAssign = _NextToken();
|
||||
if (opAssign.type != TOKEN_OPERATOR_ASSIGN) {
|
||||
throw ParseError("expected assignment operator ['=']",
|
||||
opAssign.pos);
|
||||
}
|
||||
|
||||
if (t.text.ICompare(names[B_PACKAGE_INFO_NAME]) == 0) {
|
||||
if (seen[B_PACKAGE_INFO_NAME]) {
|
||||
BString error = BString(names[B_PACKAGE_INFO_NAME])
|
||||
<< " already seen!";
|
||||
throw ParseError(error, t.pos);
|
||||
}
|
||||
|
||||
BString name;
|
||||
_ParseStringValue(&name);
|
||||
packageInfo->SetName(name);
|
||||
seen[B_PACKAGE_INFO_NAME] = true;
|
||||
} else if (t.text.ICompare(names[B_PACKAGE_INFO_SUMMARY]) == 0) {
|
||||
if (seen[B_PACKAGE_INFO_SUMMARY]) {
|
||||
BString error = BString(names[B_PACKAGE_INFO_SUMMARY])
|
||||
<< " already seen!";
|
||||
throw ParseError(error, t.pos);
|
||||
}
|
||||
|
||||
BString summary;
|
||||
_ParseStringValue(&summary);
|
||||
packageInfo->SetSummary(summary);
|
||||
seen[B_PACKAGE_INFO_SUMMARY] = true;
|
||||
} else if (t.text.ICompare(names[B_PACKAGE_INFO_DESCRIPTION]) == 0) {
|
||||
if (seen[B_PACKAGE_INFO_DESCRIPTION]) {
|
||||
BString error = BString(names[B_PACKAGE_INFO_DESCRIPTION])
|
||||
<< " already seen!";
|
||||
throw ParseError(error, t.pos);
|
||||
}
|
||||
|
||||
BString description;
|
||||
_ParseStringValue(&description);
|
||||
packageInfo->SetDescription(description);
|
||||
seen[B_PACKAGE_INFO_DESCRIPTION] = true;
|
||||
} else if (t.text.ICompare(names[B_PACKAGE_INFO_VENDOR]) == 0) {
|
||||
if (seen[B_PACKAGE_INFO_VENDOR]) {
|
||||
BString error = BString(names[B_PACKAGE_INFO_VENDOR])
|
||||
<< " already seen!";
|
||||
throw ParseError(error, t.pos);
|
||||
}
|
||||
|
||||
BString vendor;
|
||||
_ParseStringValue(&vendor);
|
||||
packageInfo->SetVendor(vendor);
|
||||
seen[B_PACKAGE_INFO_VENDOR] = true;
|
||||
} else if (t.text.ICompare(names[B_PACKAGE_INFO_PACKAGER]) == 0) {
|
||||
if (seen[B_PACKAGE_INFO_PACKAGER]) {
|
||||
BString error = BString(names[B_PACKAGE_INFO_PACKAGER])
|
||||
<< " already seen!";
|
||||
throw ParseError(error, t.pos);
|
||||
}
|
||||
|
||||
BString packager;
|
||||
_ParseStringValue(&packager);
|
||||
packageInfo->SetPackager(packager);
|
||||
seen[B_PACKAGE_INFO_PACKAGER] = true;
|
||||
} else if (t.text.ICompare(names[B_PACKAGE_INFO_ARCHITECTURE]) == 0) {
|
||||
if (seen[B_PACKAGE_INFO_ARCHITECTURE]) {
|
||||
BString error = BString(names[B_PACKAGE_INFO_ARCHITECTURE])
|
||||
<< " already seen!";
|
||||
throw ParseError(error, t.pos);
|
||||
}
|
||||
|
||||
BPackageArchitecture architecture;
|
||||
_ParseArchitectureValue(&architecture);
|
||||
packageInfo->SetArchitecture(architecture);
|
||||
seen[B_PACKAGE_INFO_ARCHITECTURE] = true;
|
||||
}
|
||||
// } else if (t.text.ICompare(names[B_PACKAGE_INFO_VERSION]) == 0) {
|
||||
// if (seen[B_PACKAGE_INFO_VERSION]) {
|
||||
// BString error = BString(names[B_PACKAGE_INFO_VERSION])
|
||||
// << " already seen!";
|
||||
// throw ParseError(error, t.pos);
|
||||
// }
|
||||
//
|
||||
// BPackageVersion version;
|
||||
// _ParseVersionValue(&version);
|
||||
// packageInfo->SetVersion(version);
|
||||
// seen[B_PACKAGE_INFO_VERSION] = true;
|
||||
// } else if (t.text.ICompare(names[B_PACKAGE_INFO_COPYRIGHTS]) == 0) {
|
||||
// if (seen[B_PACKAGE_INFO_COPYRIGHTS]) {
|
||||
// BString error = BString(names[B_PACKAGE_INFO_COPYRIGHTS])
|
||||
// << " already seen!";
|
||||
// throw ParseError(error, t.pos);
|
||||
// }
|
||||
//
|
||||
// BObjectList<BString> copyrights;
|
||||
// _ParseStringList(©rights);
|
||||
// int count = copyrights.CountItems();
|
||||
// for (int i = 0; i < count; ++i)
|
||||
// packageInfo->AddCopyright(*(copyrights.ItemAt(i)));
|
||||
// seen[B_PACKAGE_INFO_COPYRIGHTS] = true;
|
||||
// } else if (t.text.ICompare(names[B_PACKAGE_INFO_LICENSES]) == 0) {
|
||||
// if (seen[B_PACKAGE_INFO_LICENSES]) {
|
||||
// BString error = BString(names[B_PACKAGE_INFO_LICENSES])
|
||||
// << " already seen!";
|
||||
// throw ParseError(error, t.pos);
|
||||
// }
|
||||
//
|
||||
// BObjectList<BString> licenses;
|
||||
// _ParseStringList(&licenses);
|
||||
// int count = licenses.CountItems();
|
||||
// for (int i = 0; i < count; ++i)
|
||||
// packageInfo->AddLicense(*(licenses.ItemAt(i)));
|
||||
// seen[B_PACKAGE_INFO_LICENSES] = true;
|
||||
// } else if (t.text.ICompare(names[B_PACKAGE_INFO_PROVIDES]) == 0) {
|
||||
// if (seen[B_PACKAGE_INFO_PROVIDES]) {
|
||||
// BString error = BString(names[B_PACKAGE_INFO_PROVIDES])
|
||||
// << " already seen!";
|
||||
// throw ParseError(error, t.pos);
|
||||
// }
|
||||
//
|
||||
// BObjectList<BPackageProvision> provisions;
|
||||
// _ParseProvisionList(&provisions);
|
||||
// int count = provisions.CountItems();
|
||||
// for (int i = 0; i < count; ++i)
|
||||
// packageInfo->AddProvision(*(provisions.ItemAt(i)));
|
||||
// seen[B_PACKAGE_INFO_PROVIDES] = true;
|
||||
// } else if (t.text.ICompare(names[B_PACKAGE_INFO_REQUIRES]) == 0) {
|
||||
// if (seen[B_PACKAGE_INFO_REQUIRES]) {
|
||||
// BString error = BString(names[B_PACKAGE_INFO_REQUIRES])
|
||||
// << " already seen!";
|
||||
// throw ParseError(error, t.pos);
|
||||
// }
|
||||
//
|
||||
// BObjectList<BPackageRequirement> requirements;
|
||||
// _ParseRequirementList(&requirements);
|
||||
// int count = requirements.CountItems();
|
||||
// for (int i = 0; i < count; ++i)
|
||||
// packageInfo->AddRequirement(*(requirements.ItemAt(i)));
|
||||
// seen[B_PACKAGE_INFO_REQUIRES] = true;
|
||||
// }
|
||||
|
||||
Token semicolon = _NextToken();
|
||||
if (semicolon.type != TOKEN_SEMICOLON)
|
||||
throw ParseError("expected semicolon [';']", semicolon.pos);
|
||||
}
|
||||
|
||||
for (int i = 0; i < B_PACKAGE_INFO_ENUM_COUNT; ++i) {
|
||||
if (!seen[i]) {
|
||||
BString error = BString(names[i]) << " is not being set anywhere!";
|
||||
throw ParseError(error, fPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const char* BPackageInfo::kElementNames[B_PACKAGE_INFO_ENUM_COUNT] = {
|
||||
"name",
|
||||
"summary",
|
||||
"description",
|
||||
"vendor",
|
||||
"packager",
|
||||
"architecture",
|
||||
"version",
|
||||
"copyrights",
|
||||
"licenses",
|
||||
"provides",
|
||||
"requires",
|
||||
};
|
||||
|
||||
|
||||
const char*
|
||||
BPackageInfo::kArchitectureNames[B_PACKAGE_ARCHITECTURE_ENUM_COUNT] = {
|
||||
"no_arch",
|
||||
"x86",
|
||||
"x86_gcc2",
|
||||
};
|
||||
|
||||
|
||||
BPackageInfo::BPackageInfo()
|
||||
:
|
||||
fArchitecture(B_PACKAGE_ARCHITECTURE_NONE),
|
||||
fCopyrights(5, true),
|
||||
fLicenses(5, true),
|
||||
fProvisions(20, true),
|
||||
fRequirements(20, true)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BPackageInfo::~BPackageInfo()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::ReadFromConfigFile(const BEntry& packageInfoEntry,
|
||||
ParseErrorListener* listener)
|
||||
{
|
||||
status_t result = packageInfoEntry.InitCheck();
|
||||
if (result != B_OK)
|
||||
return result;
|
||||
|
||||
BFile file(&packageInfoEntry, B_READ_ONLY);
|
||||
if ((result = file.InitCheck()) != B_OK)
|
||||
return result;
|
||||
|
||||
off_t size;
|
||||
if ((result = file.GetSize(&size)) != B_OK)
|
||||
return result;
|
||||
|
||||
BString packageInfoString;
|
||||
char* buffer = packageInfoString.LockBuffer(size);
|
||||
if (buffer == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
if ((result = file.Read(buffer, size)) < size) {
|
||||
packageInfoString.UnlockBuffer(0);
|
||||
return result >= 0 ? B_IO_ERROR : result;
|
||||
}
|
||||
|
||||
buffer[size] = '\0';
|
||||
packageInfoString.UnlockBuffer(size);
|
||||
|
||||
return ReadFromConfigString(packageInfoString, listener);
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::ReadFromConfigString(const BString& packageInfoString,
|
||||
ParseErrorListener* listener)
|
||||
{
|
||||
MakeEmpty();
|
||||
|
||||
Parser parser(listener);
|
||||
return parser.Parse(packageInfoString, this);
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::InitCheck() const
|
||||
{
|
||||
// TODO
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
const BString&
|
||||
BPackageInfo::Name() const
|
||||
{
|
||||
return fName;
|
||||
}
|
||||
|
||||
|
||||
const BString&
|
||||
BPackageInfo::Summary() const
|
||||
{
|
||||
return fSummary;
|
||||
}
|
||||
|
||||
|
||||
const BString&
|
||||
BPackageInfo::Description() const
|
||||
{
|
||||
return fDescription;
|
||||
}
|
||||
|
||||
|
||||
const BString&
|
||||
BPackageInfo::Vendor() const
|
||||
{
|
||||
return fVendor;
|
||||
}
|
||||
|
||||
|
||||
const BString&
|
||||
BPackageInfo::Packager() const
|
||||
{
|
||||
return fPackager;
|
||||
}
|
||||
|
||||
|
||||
BPackageArchitecture
|
||||
BPackageInfo::Architecture() const
|
||||
{
|
||||
return fArchitecture;
|
||||
}
|
||||
|
||||
|
||||
const BPackageVersion&
|
||||
BPackageInfo::Version() const
|
||||
{
|
||||
return fVersion;
|
||||
}
|
||||
|
||||
|
||||
const BObjectList<BString>&
|
||||
BPackageInfo::Copyrights() const
|
||||
{
|
||||
return fCopyrights;
|
||||
}
|
||||
|
||||
|
||||
const BObjectList<BString>&
|
||||
BPackageInfo::Licenses() const
|
||||
{
|
||||
return fLicenses;
|
||||
}
|
||||
|
||||
|
||||
const BObjectList<BPackageRequirement>&
|
||||
BPackageInfo::Requirements() const
|
||||
{
|
||||
return fRequirements;
|
||||
}
|
||||
|
||||
|
||||
const BObjectList<BPackageProvision>&
|
||||
BPackageInfo::Provisions() const
|
||||
{
|
||||
return fProvisions;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::SetName(const BString& name)
|
||||
{
|
||||
fName = name;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::SetSummary(const BString& summary)
|
||||
{
|
||||
fSummary = summary;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::SetDescription(const BString& description)
|
||||
{
|
||||
fDescription = description;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::SetVendor(const BString& vendor)
|
||||
{
|
||||
fVendor = vendor;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::SetPackager(const BString& packager)
|
||||
{
|
||||
fPackager = packager;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::SetVersion(const BPackageVersion& version)
|
||||
{
|
||||
fVersion = version;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::SetArchitecture(BPackageArchitecture architecture)
|
||||
{
|
||||
fArchitecture = architecture;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::ClearCopyrights()
|
||||
{
|
||||
fCopyrights.MakeEmpty();
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::AddCopyright(const BString& copyright)
|
||||
{
|
||||
BString* newCopyright = new (std::nothrow) BString(copyright);
|
||||
if (newCopyright == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
return fCopyrights.AddItem(newCopyright) ? B_OK : B_ERROR;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::RemoveCopyright(const BString& copyright)
|
||||
{
|
||||
int32 count = fCopyrights.CountItems();
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (fCopyrights.ItemAt(i)->Compare(copyright) == 0) {
|
||||
delete fCopyrights.RemoveItemAt(i);
|
||||
return B_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return B_NAME_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::ClearLicenses()
|
||||
{
|
||||
fLicenses.MakeEmpty();
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::AddLicense(const BString& license)
|
||||
{
|
||||
BString* newLicense = new (std::nothrow) BString(license);
|
||||
if (newLicense == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
return fLicenses.AddItem(newLicense) ? B_OK : B_ERROR;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::RemoveLicense(const BString& license)
|
||||
{
|
||||
int32 count = fLicenses.CountItems();
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (fLicenses.ItemAt(i)->Compare(license) == 0) {
|
||||
delete fLicenses.RemoveItemAt(i);
|
||||
return B_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return B_NAME_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::ClearRequirements()
|
||||
{
|
||||
fRequirements.MakeEmpty();
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::AddRequirement(const BPackageRequirement& requirement)
|
||||
{
|
||||
BPackageRequirement* newRequirement
|
||||
= new (std::nothrow) BPackageRequirement(requirement);
|
||||
if (newRequirement == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
return fRequirements.AddItem(newRequirement) ? B_OK : B_ERROR;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::RemoveRequirement(const BPackageRequirement& requirement)
|
||||
{
|
||||
int32 count = fRequirements.CountItems();
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (fRequirements.ItemAt(i)->Compare(requirement)) {
|
||||
delete fRequirements.RemoveItemAt(i);
|
||||
return B_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return B_NAME_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::ClearProvisions()
|
||||
{
|
||||
fProvisions.MakeEmpty();
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::AddProvision(const BPackageProvision& provision)
|
||||
{
|
||||
BPackageProvision* newProvision
|
||||
= new (std::nothrow) BPackageProvision(provision);
|
||||
if (newProvision == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
return fProvisions.AddItem(newProvision) ? B_OK : B_ERROR;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
BPackageInfo::RemoveProvision(const BPackageProvision& provision)
|
||||
{
|
||||
int32 count = fProvisions.CountItems();
|
||||
for (int i = 0; i < count; ++i) {
|
||||
if (fProvisions.ItemAt(i)->Compare(provision) == 0) {
|
||||
delete fProvisions.RemoveItemAt(i);
|
||||
return B_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return B_NAME_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BPackageInfo::MakeEmpty()
|
||||
{
|
||||
fName.Truncate(0);
|
||||
fSummary.Truncate(0);
|
||||
fDescription.Truncate(0);
|
||||
fVendor.Truncate(0);
|
||||
fPackager.Truncate(0);
|
||||
fVersion.MakeEmpty();
|
||||
fArchitecture = B_PACKAGE_ARCHITECTURE_NONE;
|
||||
fCopyrights.MakeEmpty();
|
||||
fLicenses.MakeEmpty();
|
||||
fRequirements.MakeEmpty();
|
||||
fProvisions.MakeEmpty();
|
||||
}
|
||||
|
||||
|
||||
/*static*/ status_t
|
||||
BPackageInfo::GetElementName(BPackageInfoIndex index, const char** name)
|
||||
{
|
||||
if (index < 0 || index >= B_PACKAGE_INFO_ENUM_COUNT || name == NULL)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
*name = kElementNames[index];
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -103,8 +103,10 @@ BRepositoryConfig::SetTo(const BEntry& entry)
|
||||
if (buffer == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
if ((result = file.Read(buffer, size)) < size)
|
||||
if ((result = file.Read(buffer, size)) < size) {
|
||||
configString.UnlockBuffer(0);
|
||||
return (result >= 0) ? B_IO_ERROR : result;
|
||||
}
|
||||
|
||||
buffer[size] = '\0';
|
||||
configString.UnlockBuffer(size);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "BlockBufferCache.h"
|
||||
#include <package/hpkg/BlockBufferCache.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <new>
|
||||
@@ -12,6 +12,13 @@
|
||||
#include <AutoLocker.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// #pragma mark - BlockBufferCache
|
||||
|
||||
|
||||
@@ -206,3 +213,10 @@ void
|
||||
BlockBufferCacheNoLock::Unlock()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,11 +4,18 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "BufferCache.h"
|
||||
#include <package/hpkg/BufferCache.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// #pragma mark - CachedBuffer
|
||||
|
||||
|
||||
@@ -34,3 +41,10 @@ CachedBuffer::~CachedBuffer()
|
||||
BufferCache::~BufferCache()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,11 +4,18 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "DataOutput.h"
|
||||
#include <package/hpkg/DataOutput.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// #pragma mark - DataOutput
|
||||
|
||||
|
||||
@@ -42,3 +49,10 @@ BufferDataOutput::WriteData(const void* buffer, size_t size)
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "DataReader.h"
|
||||
#include <package/hpkg/DataReader.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
@@ -13,6 +13,13 @@
|
||||
#include <fs_attr.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// #pragma mark - DataReader
|
||||
|
||||
|
||||
@@ -91,3 +98,10 @@ BufferDataReader::ReadData(off_t offset, void* buffer, size_t size)
|
||||
memcpy(buffer, (const uint8*)fData + offset, size);
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,11 +4,18 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "ErrorOutput.h"
|
||||
#include <package/hpkg/ErrorOutput.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
ErrorOutput::~ErrorOutput()
|
||||
{
|
||||
}
|
||||
@@ -22,3 +29,10 @@ ErrorOutput::PrintError(const char* format, ...)
|
||||
PrintErrorVarArgs(format, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,11 +4,18 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "PackageData.h"
|
||||
#include <package/hpkg/PackageData.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
PackageData::PackageData()
|
||||
:
|
||||
fCompressedSize(0),
|
||||
@@ -37,3 +44,10 @@ PackageData::SetData(uint8 size, const void* data)
|
||||
memcpy(fInlineData, data, size);
|
||||
fEncodedInline = true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
+19
-6
@@ -4,19 +4,25 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "PackageDataReader.h"
|
||||
#include <package/hpkg/PackageDataReader.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <new>
|
||||
|
||||
#include <haiku_package.h>
|
||||
#include <package/hpkg/haiku_package.h>
|
||||
#include <package/hpkg/BufferCache.h>
|
||||
#include <package/hpkg/DataOutput.h>
|
||||
#include <package/hpkg/PackageData.h>
|
||||
#include <package/hpkg/ZlibDecompressor.h>
|
||||
|
||||
#include "BufferCache.h"
|
||||
#include "DataOutput.h"
|
||||
#include "PackageData.h"
|
||||
#include "ZlibDecompressor.h"
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// minimum/maximum zlib chunk size we consider sane
|
||||
@@ -449,3 +455,10 @@ PackageDataReaderFactory::CreatePackageDataReader(DataReader* dataReader,
|
||||
_reader = reader;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,7 +4,14 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "PackageEntry.h"
|
||||
#include <package/hpkg/PackageEntry.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
PackageEntry::PackageEntry(PackageEntry* parent, const char* name)
|
||||
@@ -22,3 +29,10 @@ PackageEntry::PackageEntry(PackageEntry* parent, const char* name)
|
||||
fCreationTime.tv_sec = 0;
|
||||
fCreationTime.tv_nsec = 0;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
+15
-1
@@ -4,7 +4,14 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "PackageEntryAttribute.h"
|
||||
#include <package/hpkg/PackageEntryAttribute.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
PackageEntryAttribute::PackageEntryAttribute(const char* name)
|
||||
@@ -13,3 +20,10 @@ PackageEntryAttribute::PackageEntryAttribute(const char* name)
|
||||
fType(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "PackageReader.h"
|
||||
#include <package/hpkg/PackageReader.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
@@ -19,14 +19,21 @@
|
||||
|
||||
#include <ByteOrder.h>
|
||||
|
||||
#include <haiku_package.h>
|
||||
#include <package/hpkg/haiku_package.h>
|
||||
|
||||
#include "DataOutput.h"
|
||||
#include "ErrorOutput.h"
|
||||
#include "PackageData.h"
|
||||
#include "PackageEntry.h"
|
||||
#include "PackageEntryAttribute.h"
|
||||
#include "ZlibDecompressor.h"
|
||||
#include <package/hpkg/DataOutput.h>
|
||||
#include <package/hpkg/ErrorOutput.h>
|
||||
#include <package/hpkg/PackageData.h>
|
||||
#include <package/hpkg/PackageEntry.h>
|
||||
#include <package/hpkg/PackageEntryAttribute.h>
|
||||
#include <package/hpkg/ZlibDecompressor.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
//#define TRACE(format...) printf(format)
|
||||
@@ -1378,3 +1385,10 @@ PackageReader::_GetStandardIndex(const AttributeType* type)
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "PackageWriter.h"
|
||||
#include <package/hpkg/PackageWriter.h>
|
||||
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
@@ -23,13 +23,20 @@
|
||||
|
||||
#include <AutoDeleter.h>
|
||||
|
||||
#include <haiku_package.h>
|
||||
#include <package/hpkg/haiku_package.h>
|
||||
|
||||
#include "DataOutput.h"
|
||||
#include "DataReader.h"
|
||||
#include "FDCloser.h"
|
||||
#include "Stacker.h"
|
||||
#include "ZlibCompressor.h"
|
||||
#include <package/hpkg/DataOutput.h>
|
||||
#include <package/hpkg/DataReader.h>
|
||||
#include <package/hpkg/FDCloser.h>
|
||||
#include <package/hpkg/Stacker.h>
|
||||
#include <package/hpkg/ZlibCompressor.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// minimum length of data we require before trying to zlib compress them
|
||||
@@ -1505,3 +1512,10 @@ PackageWriter::_WriteZlibCompressedData(DataReader& dataReader, off_t size,
|
||||
_compressedSize = writeOffset - offsetTableOffset;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
@@ -4,7 +4,14 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "Strings.h"
|
||||
#include <package/hpkg/Strings.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// from the Dragon Book: a slightly modified hashpjw()
|
||||
@@ -25,3 +32,10 @@ hash_string(const char* string)
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
+15
-1
@@ -4,13 +4,20 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "ZlibCompressionBase.h"
|
||||
#include <package/hpkg/ZlibCompressionBase.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
/*static*/ status_t
|
||||
ZlibCompressionBase::TranslateZlibError(int error)
|
||||
{
|
||||
@@ -38,3 +45,10 @@ ZlibCompressionBase::TranslateZlibError(int error)
|
||||
return B_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
+16
-2
@@ -4,12 +4,19 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "ZlibCompressor.h"
|
||||
#include <package/hpkg/ZlibCompressor.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "DataOutput.h"
|
||||
#include <package/hpkg/DataOutput.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
static const size_t kOutputBufferSize = 1024;
|
||||
@@ -169,3 +176,10 @@ ZlibCompressor::CompressSingleBuffer(const void* input, size_t inputSize,
|
||||
_compressedSize = zStream.total_out;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
+16
-2
@@ -4,12 +4,19 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "ZlibDecompressor.h"
|
||||
#include <package/hpkg/ZlibDecompressor.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "DataOutput.h"
|
||||
#include <package/hpkg/DataOutput.h>
|
||||
|
||||
|
||||
namespace BPackageKit {
|
||||
|
||||
namespace BHaikuPackage {
|
||||
|
||||
namespace BPrivate {
|
||||
|
||||
|
||||
// TODO: For the kernel the buffer shouldn't be allocated on the stack.
|
||||
@@ -176,3 +183,10 @@ ZlibDecompressor::DecompressSingleBuffer(const void* input, size_t inputSize,
|
||||
_uncompressedSize = zStream.total_out;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BPrivate
|
||||
|
||||
} // namespace BHaikuPackage
|
||||
|
||||
} // namespace BPackageKit
|
||||
Reference in New Issue
Block a user