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:
Ingo Weinhold
2013-04-03 02:06:26 +00:00
parent dd6ec1de82
commit a3dd6caf55
4 changed files with 76 additions and 0 deletions
+6
View File
@@ -141,6 +141,12 @@ public:
static status_t GetArchitectureByName(const BString& name,
BPackageArchitecture& _architecture);
static status_t ParseVersionString(const BString& string,
bool releaseIsOptional,
BPackageVersion& _version,
ParseErrorListener* listener = NULL);
public:
static const char* kElementNames[];
static const char* kArchitectureNames[];
+4
View File
@@ -23,6 +23,8 @@ public:
BPackageVersion();
BPackageVersion(
const BPackageVersionData& data);
BPackageVersion(const BString& versionString,
bool releaseIsOptional = true);
BPackageVersion(const BString& major,
const BString& minor, const BString& micro,
const BString& preRelease, uint8 release);
@@ -41,6 +43,8 @@ public:
void SetTo(const BString& major,
const BString& minor, const BString& micro,
const BString& preRelease, uint8 release);
status_t SetTo(const BString& versionString,
bool releaseIsOptional = true);
void Clear();
int Compare(const BPackageVersion& other) const;
+49
View File
@@ -68,6 +68,10 @@ public:
status_t Parse(const BString& packageInfoString,
BPackageInfo* packageInfo);
status_t ParseVersion(const BString& versionString,
bool releaseIsOptional,
BPackageVersion& _version);
private:
struct Token;
struct ListElementParser;
@@ -82,6 +86,9 @@ private:
BPackageArchitecture* value);
void _ParseVersionValue(BPackageVersion* value,
bool releaseIsOptional);
static void _ParseVersionValue(Token& word,
BPackageVersion* value,
bool releaseIsOptional);
void _ParseList(ListElementParser& elementParser,
bool allowSingleNonListElement);
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::_NextToken()
{
@@ -360,6 +392,14 @@ BPackageInfo::Parser::_ParseVersionValue(BPackageVersion* value,
bool releaseIsOptional)
{
Token word = _NextToken();
_ParseVersionValue(word, value, releaseIsOptional);
}
/*static*/ void
BPackageInfo::Parser::_ParseVersionValue(Token& word, BPackageVersion* value,
bool releaseIsOptional)
{
if (word.type != TOKEN_WORD)
throw ParseError("expected word (a version)", word.pos);
@@ -1365,4 +1405,13 @@ BPackageInfo::GetArchitectureByName(const BString& name,
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
+17
View File
@@ -8,6 +8,7 @@
#include <NaturalCompare.h>
#include <package/PackageInfo.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,
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
BPackageVersion::Clear()
{