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