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:
committed by
Adrien Destugues
parent
03399b17b8
commit
8e1e00129c
@@ -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
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user