Installer: handle hpkg files in _packages_ directory

Fixes #14310.

Change-Id: Iafd75b86d242af816a089dd1bdaea2c697668f5d
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2184
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Adrien Destugues
2020-02-20 16:25:38 +00:00
committed by Adrien Destugues
parent 03399b17b8
commit 8e1e00129c
3 changed files with 49 additions and 41 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ Application Installer :
Utility.cpp
: be tracker translation shared [ TargetLibstdc++ ]
localestub
localestub package
: Installer.rdef
;
+35 -28
View File
@@ -17,6 +17,8 @@
#include <LayoutUtils.h>
#include <Locale.h>
#include <Messenger.h>
#include <package/PackageInfo.h>
#include <Path.h>
#include <ScrollBar.h>
#include <String.h>
#include <View.h>
@@ -51,58 +53,63 @@ Package::~Package()
Package *
Package::PackageFromEntry(BEntry &entry)
{
char folder[B_FILE_NAME_LENGTH];
entry.GetName(folder);
BDirectory directory(&entry);
if (directory.InitCheck() != B_OK)
BPath path;
entry.GetPath(&path);
BPackageKit::BPackageInfo info;
info.ReadFromPackageFile(path.Path());
if (info.InitCheck() != B_OK)
return NULL;
Package *package = new Package(folder);
bool alwaysOn;
bool onByDefault;
int32 size;
Package *package = new Package(path.Path());
package->fName = info.Name();
package->fDescription = info.Summary();
bool alwaysOn = false;
bool onByDefault = true;
off_t size = 0;
entry.GetSize(&size);
char group[64];
memset(group, 0, 64);
if (directory.ReadAttr("INSTALLER PACKAGE: NAME", B_STRING_TYPE, 0,
package->fName, 64) < 0) {
goto err;
}
if (directory.ReadAttr("INSTALLER PACKAGE: GROUP", B_STRING_TYPE, 0,
BNode node(&entry);
// FIXME enable these when the attributes on the packages are actually
// populated by the buildsystem. For now, assume everything is
// on-by-default and optional, and have no groups.
#if 0
if (node.ReadAttr("INSTALLER PACKAGE: GROUP", B_STRING_TYPE, 0,
group, 64) < 0) {
goto err;
}
if (directory.ReadAttr("INSTALLER PACKAGE: DESCRIPTION", B_STRING_TYPE, 0,
package->fDescription, 64) < 0) {
goto err;
}
if (directory.ReadAttr("INSTALLER PACKAGE: ON_BY_DEFAULT", B_BOOL_TYPE, 0,
if (node.ReadAttr("INSTALLER PACKAGE: ON_BY_DEFAULT", B_BOOL_TYPE, 0,
&onByDefault, sizeof(onByDefault)) < 0) {
goto err;
}
if (directory.ReadAttr("INSTALLER PACKAGE: ALWAYS_ON", B_BOOL_TYPE, 0,
if (node.ReadAttr("INSTALLER PACKAGE: ALWAYS_ON", B_BOOL_TYPE, 0,
&alwaysOn, sizeof(alwaysOn)) < 0) {
goto err;
}
if (directory.ReadAttr("INSTALLER PACKAGE: SIZE", B_INT32_TYPE, 0,
&size, sizeof(size)) < 0) {
goto err;
}
#endif
package->SetGroupName(group);
package->SetSize(size);
package->SetAlwaysOn(alwaysOn);
package->SetOnByDefault(onByDefault);
attr_info info;
if (directory.GetAttrInfo(ICON_ATTRIBUTE, &info) == B_OK) {
char buffer[info.size];
attr_info attributes;
if (node.GetAttrInfo(ICON_ATTRIBUTE, &attributes) == B_OK) {
char buffer[attributes.size];
BMessage msg;
if ((directory.ReadAttr(ICON_ATTRIBUTE, info.type, 0, buffer,
info.size) == info.size)
if ((node.ReadAttr(ICON_ATTRIBUTE, attributes.type, 0, buffer,
attributes.size) == attributes.size)
&& (msg.Unflatten(buffer) == B_OK)) {
package->SetIcon(new BBitmap(&msg));
}
}
return package;
#if 0
err:
#endif
delete package;
return NULL;
}
+13 -12
View File
@@ -12,6 +12,7 @@
#include <CheckBox.h>
#include <Entry.h>
#include <List.h>
#include <String.h>
#include <StringView.h>
@@ -33,12 +34,12 @@ public:
Package(const char* folder);
virtual ~Package();
void SetFolder(const char* folder)
{ strcpy(fFolder, folder); }
void SetName(const char* name)
{ strcpy(fName, name); }
void SetDescription(const char* description)
{ strcpy(fDescription, description); }
void SetFolder(BString folder)
{ fFolder = folder; }
void SetName(const BString name)
{ fName = name; }
void SetDescription(const BString description)
{ fDescription = description; }
void SetSize(const int32 size)
{ fSize = size; }
void SetIcon(BBitmap* icon)
@@ -47,11 +48,11 @@ public:
{ fOnByDefault = onByDefault; }
void SetAlwaysOn(bool alwaysOn)
{ fAlwaysOn = alwaysOn; }
const char* Folder() const
BString Folder() const
{ return fFolder; }
const char* Name() const
BString Name() const
{ return fName; }
const char* Description() const
BString Description() const
{ return fDescription; }
const int32 Size() const
{ return fSize; }
@@ -67,9 +68,9 @@ public:
static Package* PackageFromEntry(BEntry &dir);
private:
char fFolder[64];
char fName[64];
char fDescription[64];
BString fFolder;
BString fName;
BString fDescription;
int32 fSize;
BBitmap* fIcon;
bool fAlwaysOn;