Add public package version parsing API
* BPackageVersion: Add respective constructor and SetTo(). * BPackageInfo: Add static ParseVersionString() utility method. It's only there because the parser lives in the BPackageInfo implementation.
This commit is contained in:
@@ -141,6 +141,12 @@ public:
|
|||||||
static status_t GetArchitectureByName(const BString& name,
|
static status_t GetArchitectureByName(const BString& name,
|
||||||
BPackageArchitecture& _architecture);
|
BPackageArchitecture& _architecture);
|
||||||
|
|
||||||
|
static status_t ParseVersionString(const BString& string,
|
||||||
|
bool releaseIsOptional,
|
||||||
|
BPackageVersion& _version,
|
||||||
|
ParseErrorListener* listener = NULL);
|
||||||
|
|
||||||
|
public:
|
||||||
static const char* kElementNames[];
|
static const char* kElementNames[];
|
||||||
static const char* kArchitectureNames[];
|
static const char* kArchitectureNames[];
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ public:
|
|||||||
BPackageVersion();
|
BPackageVersion();
|
||||||
BPackageVersion(
|
BPackageVersion(
|
||||||
const BPackageVersionData& data);
|
const BPackageVersionData& data);
|
||||||
|
BPackageVersion(const BString& versionString,
|
||||||
|
bool releaseIsOptional = true);
|
||||||
BPackageVersion(const BString& major,
|
BPackageVersion(const BString& major,
|
||||||
const BString& minor, const BString& micro,
|
const BString& minor, const BString& micro,
|
||||||
const BString& preRelease, uint8 release);
|
const BString& preRelease, uint8 release);
|
||||||
@@ -41,6 +43,8 @@ public:
|
|||||||
void SetTo(const BString& major,
|
void SetTo(const BString& major,
|
||||||
const BString& minor, const BString& micro,
|
const BString& minor, const BString& micro,
|
||||||
const BString& preRelease, uint8 release);
|
const BString& preRelease, uint8 release);
|
||||||
|
status_t SetTo(const BString& versionString,
|
||||||
|
bool releaseIsOptional = true);
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
int Compare(const BPackageVersion& other) const;
|
int Compare(const BPackageVersion& other) const;
|
||||||
|
|||||||
@@ -68,6 +68,10 @@ public:
|
|||||||
status_t Parse(const BString& packageInfoString,
|
status_t Parse(const BString& packageInfoString,
|
||||||
BPackageInfo* packageInfo);
|
BPackageInfo* packageInfo);
|
||||||
|
|
||||||
|
status_t ParseVersion(const BString& versionString,
|
||||||
|
bool releaseIsOptional,
|
||||||
|
BPackageVersion& _version);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Token;
|
struct Token;
|
||||||
struct ListElementParser;
|
struct ListElementParser;
|
||||||
@@ -82,6 +86,9 @@ private:
|
|||||||
BPackageArchitecture* value);
|
BPackageArchitecture* value);
|
||||||
void _ParseVersionValue(BPackageVersion* value,
|
void _ParseVersionValue(BPackageVersion* value,
|
||||||
bool releaseIsOptional);
|
bool releaseIsOptional);
|
||||||
|
static void _ParseVersionValue(Token& word,
|
||||||
|
BPackageVersion* value,
|
||||||
|
bool releaseIsOptional);
|
||||||
void _ParseList(ListElementParser& elementParser,
|
void _ParseList(ListElementParser& elementParser,
|
||||||
bool allowSingleNonListElement);
|
bool allowSingleNonListElement);
|
||||||
void _ParseStringList(BStringList* value,
|
void _ParseStringList(BStringList* value,
|
||||||
@@ -206,6 +213,31 @@ BPackageInfo::Parser::Parse(const BString& packageInfoString,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BPackageInfo::Parser::ParseVersion(const BString& versionString,
|
||||||
|
bool releaseIsOptional, BPackageVersion& _version)
|
||||||
|
{
|
||||||
|
fPos = versionString.String();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Token token(TOKEN_WORD, fPos, versionString.Length());
|
||||||
|
_ParseVersionValue(token, &_version, releaseIsOptional);
|
||||||
|
} catch (const ParseError& error) {
|
||||||
|
if (fListener != NULL) {
|
||||||
|
int32 offset = error.pos - versionString.String();
|
||||||
|
fListener->OnError(error.message, 1, offset);
|
||||||
|
}
|
||||||
|
return B_BAD_DATA;
|
||||||
|
} catch (const std::bad_alloc& e) {
|
||||||
|
if (fListener != NULL)
|
||||||
|
fListener->OnError("out of memory", 0, 0);
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BPackageInfo::Parser::Token
|
BPackageInfo::Parser::Token
|
||||||
BPackageInfo::Parser::_NextToken()
|
BPackageInfo::Parser::_NextToken()
|
||||||
{
|
{
|
||||||
@@ -360,6 +392,14 @@ BPackageInfo::Parser::_ParseVersionValue(BPackageVersion* value,
|
|||||||
bool releaseIsOptional)
|
bool releaseIsOptional)
|
||||||
{
|
{
|
||||||
Token word = _NextToken();
|
Token word = _NextToken();
|
||||||
|
_ParseVersionValue(word, value, releaseIsOptional);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*static*/ void
|
||||||
|
BPackageInfo::Parser::_ParseVersionValue(Token& word, BPackageVersion* value,
|
||||||
|
bool releaseIsOptional)
|
||||||
|
{
|
||||||
if (word.type != TOKEN_WORD)
|
if (word.type != TOKEN_WORD)
|
||||||
throw ParseError("expected word (a version)", word.pos);
|
throw ParseError("expected word (a version)", word.pos);
|
||||||
|
|
||||||
@@ -1365,4 +1405,13 @@ BPackageInfo::GetArchitectureByName(const BString& name,
|
|||||||
return B_NAME_NOT_FOUND;
|
return B_NAME_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*static*/ status_t
|
||||||
|
BPackageInfo::ParseVersionString(const BString& string, bool releaseIsOptional,
|
||||||
|
BPackageVersion& _version, ParseErrorListener* listener)
|
||||||
|
{
|
||||||
|
return Parser(listener).ParseVersion(string, releaseIsOptional, _version);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace BPackageKit
|
} // namespace BPackageKit
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include <NaturalCompare.h>
|
#include <NaturalCompare.h>
|
||||||
|
|
||||||
|
#include <package/PackageInfo.h>
|
||||||
#include <package/hpkg/PackageInfoAttributeValue.h>
|
#include <package/hpkg/PackageInfoAttributeValue.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -30,6 +31,13 @@ BPackageVersion::BPackageVersion(const BPackageVersionData& data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BPackageVersion::BPackageVersion(const BString& versionString,
|
||||||
|
bool releaseIsOptional)
|
||||||
|
{
|
||||||
|
SetTo(versionString, releaseIsOptional);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BPackageVersion::BPackageVersion(const BString& major, const BString& minor,
|
BPackageVersion::BPackageVersion(const BString& major, const BString& minor,
|
||||||
const BString& micro, const BString& preRelease, uint8 release)
|
const BString& micro, const BString& preRelease, uint8 release)
|
||||||
{
|
{
|
||||||
@@ -151,6 +159,15 @@ BPackageVersion::SetTo(const BString& major, const BString& minor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BPackageVersion::SetTo(const BString& versionString, bool releaseIsOptional)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
return BPackageInfo::ParseVersionString(versionString, releaseIsOptional,
|
||||||
|
*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BPackageVersion::Clear()
|
BPackageVersion::Clear()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user