diff --git a/headers/os/package/DropRepositoryRequest.h b/headers/os/package/DropRepositoryRequest.h new file mode 100644 index 0000000000..e993ffb04d --- /dev/null +++ b/headers/os/package/DropRepositoryRequest.h @@ -0,0 +1,36 @@ +/* + * Copyright 2011, Haiku, Inc. + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE__DROP_REPOSITORY_REQUEST_H_ +#define _PACKAGE__DROP_REPOSITORY_REQUEST_H_ + + +#include + +#include +#include + + +namespace BPackageKit { + + +class DropRepositoryRequest : public BRequest { + typedef BRequest inherited; + +public: + DropRepositoryRequest(const BContext& context, + const BString& repositoryName); + virtual ~DropRepositoryRequest(); + + virtual status_t CreateInitialJobs(); + +private: + BString fRepositoryName; +}; + + +} // namespace BPackageKit + + +#endif // _PACKAGE__ADD_REPOSITORY_REQUEST_H_ diff --git a/headers/os/package/RepositoryCache.h b/headers/os/package/RepositoryCache.h index 6c40f54f29..6fc96efb92 100644 --- a/headers/os/package/RepositoryCache.h +++ b/headers/os/package/RepositoryCache.h @@ -9,8 +9,7 @@ #include #include - -class BEntry; +#include namespace BPackageKit { @@ -28,7 +27,7 @@ public: status_t SetTo(const BEntry& entry); status_t InitCheck() const; -// const RepositoryHeader* Header() const; + const BRepositoryHeader& Header() const; const BEntry& Entry() const; bool IsUserSpecific() const; @@ -38,7 +37,7 @@ private: status_t fInitStatus; BEntry fEntry; -// RepositoryHeader* fHeader; + BRepositoryHeader fHeader; bool fIsUserSpecific; }; diff --git a/headers/os/package/RepositoryConfig.h b/headers/os/package/RepositoryConfig.h index 52d5f79970..9f35d1b40d 100644 --- a/headers/os/package/RepositoryConfig.h +++ b/headers/os/package/RepositoryConfig.h @@ -6,62 +6,46 @@ #define _PACKAGE__REPOSITORY_CONFIG_H_ -#include #include #include -class BEntry; - - namespace BPackageKit { -class BRepositoryConfig : public BArchivable { - typedef BArchivable inherited; - +class BRepositoryConfig { public: BRepositoryConfig(); BRepositoryConfig(const BString& name, - const BString& url, - uint8 priority = kDefaultPriority); + const BString& url, uint8 priority); BRepositoryConfig(const BEntry& entry); - BRepositoryConfig(BMessage* data); virtual ~BRepositoryConfig(); - virtual status_t Archive(BMessage* data, bool deep = true) const; - - status_t StoreAsConfigFile(const BEntry& entry) const; + status_t Store(const BEntry& entry) const; status_t SetTo(const BEntry& entry); - status_t SetTo(const BMessage* data); status_t InitCheck() const; const BString& Name() const; - const BString& URL() const; + const BString& BaseURL() const; uint8 Priority() const; bool IsUserSpecific() const; const BEntry& Entry() const; void SetName(const BString& name); - void SetURL(const BString& url); + void SetBaseURL(const BString& url); void SetPriority(uint8 priority); void SetIsUserSpecific(bool isUserSpecific); public: - static BRepositoryConfig* Instantiate(BMessage* data); - - static const uint8 kDefaultPriority; - static const char* kNameField; - static const char* kURLField; - static const char* kPriorityField; + static const uint8 kUnsetPriority = 0; private: status_t fInitStatus; BString fName; - BString fURL; + BString fBaseURL; uint8 fPriority; bool fIsUserSpecific; diff --git a/headers/os/package/RepositoryHeader.h b/headers/os/package/RepositoryHeader.h new file mode 100644 index 0000000000..7c6834c63e --- /dev/null +++ b/headers/os/package/RepositoryHeader.h @@ -0,0 +1,70 @@ +/* + * Copyright 2011, Haiku, Inc. + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE__REPOSITORY_HEADER_H_ +#define _PACKAGE__REPOSITORY_HEADER_H_ + + +#include +#include + + +namespace BPackageKit { + + +class BRepositoryHeader : public BArchivable { + typedef BArchivable inherited; + +public: + BRepositoryHeader(); + BRepositoryHeader(BMessage* data); + virtual ~BRepositoryHeader(); + + virtual status_t Archive(BMessage* data, bool deep = true) const; + + status_t SetTo(const BMessage* data); + status_t InitCheck() const; + + const BString& Name() const; + const BString& OriginalBaseURL() const; + const BString& Vendor() const; + const BString& ShortDescription() const; + const BString& LongDescription() const; + uint8 Priority() const; + + void SetName(const BString& name); + void SetOriginalBaseURL(const BString& url); + void SetVendor(const BString& vendor); + void SetShortDescription(const BString& description); + void SetLongDescription(const BString& description); + void SetPriority(uint8 priority); + +public: + static BRepositoryHeader* Instantiate(BMessage* data); + + static const uint8 kDefaultPriority; + + static const char* kNameField; + static const char* kURLField; + static const char* kVendorField; + static const char* kShortDescriptionField; + static const char* kLongDescriptionField; + static const char* kPriorityField; + +private: + status_t fInitStatus; + + BString fName; + BString fOriginalBaseURL; + BString fVendor; + BString fShortDescription; + BString fLongDescription; + uint8 fPriority; +}; + + +} // namespace BPackageKit + + +#endif // _PACKAGE__REPOSITORY_HEADER_H_ diff --git a/headers/private/package/ActivateRepositoryCacheJob.h b/headers/private/package/ActivateRepositoryCacheJob.h index 09009fb7bc..105c38f6c6 100644 --- a/headers/private/package/ActivateRepositoryCacheJob.h +++ b/headers/private/package/ActivateRepositoryCacheJob.h @@ -19,7 +19,7 @@ namespace BPrivate { class ActivateRepositoryCacheJob : public BJob { - typedef BJob inherited; + typedef BJob inherited; public: ActivateRepositoryCacheJob( diff --git a/headers/private/package/ActivateRepositoryConfigJob.h b/headers/private/package/ActivateRepositoryConfigJob.h index 8df69b7025..c211b04a51 100644 --- a/headers/private/package/ActivateRepositoryConfigJob.h +++ b/headers/private/package/ActivateRepositoryConfigJob.h @@ -19,13 +19,13 @@ namespace BPrivate { class ActivateRepositoryConfigJob : public BJob { - typedef BJob inherited; + typedef BJob inherited; public: ActivateRepositoryConfigJob( const BContext& context, const BString& title, - const BEntry& archivedRepoConfigEntry, + const BEntry& archivedRepoHeaderEntry, const BString& repositoryBaseURL, const BDirectory& targetDirectory); virtual ~ActivateRepositoryConfigJob(); @@ -37,7 +37,7 @@ protected: virtual void Cleanup(status_t jobResult); private: - BEntry fArchivedRepoConfigEntry; + BEntry fArchivedRepoHeaderEntry; BString fRepositoryBaseURL; BDirectory fTargetDirectory; BEntry fTargetEntry; diff --git a/headers/private/package/FetchFileJob.h b/headers/private/package/FetchFileJob.h index 60ee799477..f43f8a23f2 100644 --- a/headers/private/package/FetchFileJob.h +++ b/headers/private/package/FetchFileJob.h @@ -18,7 +18,7 @@ namespace BPrivate { class FetchFileJob : public BJob { - typedef BJob inherited; + typedef BJob inherited; public: FetchFileJob(const BContext& context, diff --git a/headers/private/package/RemoveRepositoryJob.h b/headers/private/package/RemoveRepositoryJob.h new file mode 100644 index 0000000000..8e9618fc26 --- /dev/null +++ b/headers/private/package/RemoveRepositoryJob.h @@ -0,0 +1,42 @@ +/* + * Copyright 2011, Oliver Tappe + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE__PRIVATE__REMOVE_REPOSITORY_JOB_H_ +#define _PACKAGE__PRIVATE__REMOVE_REPOSITORY_JOB_H_ + + +#include + +#include + + +namespace BPackageKit { + +namespace BPrivate { + + +class RemoveRepositoryJob : public BJob { + typedef BJob inherited; + +public: + RemoveRepositoryJob( + const BContext& context, + const BString& title, + const BString& repositoryName); + virtual ~RemoveRepositoryJob(); + +protected: + virtual status_t Execute(); + +private: + BString fRepositoryName; +}; + + +} // namespace BPrivate + +} // namespace BPackageKit + + +#endif // _PACKAGE__PRIVATE__REMOVE_REPOSITORY_JOB_H_ diff --git a/headers/private/package/ValidateChecksumJob.h b/headers/private/package/ValidateChecksumJob.h index 7cc0c4fd99..09f2a390dc 100644 --- a/headers/private/package/ValidateChecksumJob.h +++ b/headers/private/package/ValidateChecksumJob.h @@ -20,7 +20,7 @@ namespace BPrivate { class ValidateChecksumJob : public BJob { - typedef BJob inherited; + typedef BJob inherited; public: ValidateChecksumJob( diff --git a/src/bin/pkgman/Jamfile b/src/bin/pkgman/Jamfile index c433f82480..f8f93155e8 100644 --- a/src/bin/pkgman/Jamfile +++ b/src/bin/pkgman/Jamfile @@ -4,6 +4,7 @@ UsePrivateHeaders support ; BinCommand pkgman : command_add_repo.cpp + command_drop_repo.cpp command_list_repos.cpp command_refresh.cpp DecisionProvider.cpp diff --git a/src/bin/pkgman/command_drop_repo.cpp b/src/bin/pkgman/command_drop_repo.cpp new file mode 100644 index 0000000000..fecdd87e9a --- /dev/null +++ b/src/bin/pkgman/command_drop_repo.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2011, Oliver Tappe + * Distributed under the terms of the MIT License. + */ + + +#include +#include +#include + +#include +#include + +#include +#include + +#include "DecisionProvider.h" +#include "JobStateListener.h" +#include "pkgman.h" + + +using namespace BPackageKit; + + +// TODO: internationalization! + + +static const char* kCommandUsage = + "Usage: %s drop-repo \n" + "Drops (i.e. removes) the repository with the given name.\n" + "\n" +; + + +static void +print_command_usage_and_exit(bool error) +{ + fprintf(error ? stderr : stdout, kCommandUsage, kProgramName); + exit(error ? 1 : 0); +} + + +int +command_drop_repo(int argc, const char* const* argv) +{ + bool yesMode = false; + + while (true) { + static struct option sLongOptions[] = { + { "help", no_argument, 0, 'h' }, + { "yes", no_argument, 0, 'y' }, + { 0, 0, 0, 0 } + }; + + opterr = 0; // don't print errors + int c = getopt_long(argc, (char**)argv, "hu", sLongOptions, NULL); + if (c == -1) + break; + + switch (c) { + case 'h': + print_command_usage_and_exit(false); + break; + + case 'y': + yesMode = true; + break; + + default: + print_command_usage_and_exit(true); + break; + } + } + + // The remaining argument is a repo name, i. e. one more argument. + if (argc != optind + 1) + print_command_usage_and_exit(true); + + const char* repoName = argv[optind]; + + DecisionProvider decisionProvider; +// if (yesMode) +// decisionProvider.SetAcceptEverything(true); + JobStateListener listener; + BContext context(decisionProvider, listener); + + status_t result; + DropRepositoryRequest dropRequest(context, repoName); + result = dropRequest.InitCheck(); + if (result != B_OK) + DIE(result, "unable to create request for dropping repository"); + result = dropRequest.CreateInitialJobs(); + if (result != B_OK) + DIE(result, "unable to create necessary jobs"); + + while (BJob* job = dropRequest.PopRunnableJob()) { + result = job->Run(); + delete job; + if (result == B_CANCELED) + return 1; + } + + return 0; +} diff --git a/src/bin/pkgman/pkgman.cpp b/src/bin/pkgman/pkgman.cpp index 9d927f7d80..dc2f9c8912 100644 --- a/src/bin/pkgman/pkgman.cpp +++ b/src/bin/pkgman/pkgman.cpp @@ -53,16 +53,16 @@ main(int argc, const char* const* argv) print_usage_and_exit(true); const char* command = argv[1]; - if (strcmp(command, "add-repo") == 0 || strcmp(command, "ar") == 0) + if (strncmp(command, "add-r", 5) == 0) return command_add_repo(argc - 1, argv + 1); -// if (strcmp(command, "drop-repo") == 0) -// return command_drop_repo(argc - 1, argv + 1); + if (strncmp(command, "drop-r", 6) == 0) + return command_drop_repo(argc - 1, argv + 1); - if (strcmp(command, "list-repos") == 0 || strcmp(command, "lr") == 0) + if (strncmp(command, "list-r", 6) == 0) return command_list_repos(argc - 1, argv + 1); - if (strcmp(command, "refresh") == 0) + if (strncmp(command, "refr", 4) == 0) return command_refresh(argc - 1, argv + 1); // if (strcmp(command, "search") == 0) diff --git a/src/kits/package/ActivateRepositoryConfigJob.cpp b/src/kits/package/ActivateRepositoryConfigJob.cpp index 6fcadf3623..59d9c0d149 100644 --- a/src/kits/package/ActivateRepositoryConfigJob.cpp +++ b/src/kits/package/ActivateRepositoryConfigJob.cpp @@ -10,9 +10,13 @@ #include #include +#include + +#include #include #include +#include namespace BPackageKit { @@ -22,11 +26,11 @@ namespace BPrivate { ActivateRepositoryConfigJob::ActivateRepositoryConfigJob( const BContext& context, const BString& title, - const BEntry& archivedRepoConfigEntry, const BString& repositoryBaseURL, + const BEntry& archivedRepoHeaderEntry, const BString& repositoryBaseURL, const BDirectory& targetDirectory) : inherited(context, title), - fArchivedRepoConfigEntry(archivedRepoConfigEntry), + fArchivedRepoHeaderEntry(archivedRepoHeaderEntry), fRepositoryBaseURL(repositoryBaseURL), fTargetDirectory(targetDirectory) { @@ -41,7 +45,7 @@ ActivateRepositoryConfigJob::~ActivateRepositoryConfigJob() status_t ActivateRepositoryConfigJob::Execute() { - BFile archiveFile(&fArchivedRepoConfigEntry, B_READ_ONLY); + BFile archiveFile(&fArchivedRepoHeaderEntry, B_READ_ONLY); status_t result = archiveFile.InitCheck(); if (result != B_OK) return result; @@ -50,16 +54,17 @@ ActivateRepositoryConfigJob::Execute() if ((result = archive.Unflatten(&archiveFile)) != B_OK) return result; - BRepositoryConfig* repoConfig = BRepositoryConfig::Instantiate(&archive); - if (repoConfig == NULL) + BRepositoryHeader* repoHeader = BRepositoryHeader::Instantiate(&archive); + if (repoHeader == NULL) return B_BAD_DATA; - if ((result = repoConfig->InitCheck()) != B_OK) + ObjectDeleter repoHeaderDeleter(repoHeader); + if ((result = repoHeader->InitCheck()) != B_OK) return result; - fTargetEntry.SetTo(&fTargetDirectory, repoConfig->Name().String()); + fTargetEntry.SetTo(&fTargetDirectory, repoHeader->Name().String()); if (fTargetEntry.Exists()) { BString description = BString("A repository configuration for ") - << repoConfig->Name() << " already exists."; + << repoHeader->Name() << " already exists."; BString question("overwrite?"); bool yes = fContext.DecisionProvider().YesNoDecisionNeeded( description, question, "yes", "no", "no"); @@ -69,13 +74,17 @@ ActivateRepositoryConfigJob::Execute() } } - // inject the URL that was actually used and write the config file - repoConfig->SetURL(fRepositoryBaseURL); - if ((result = repoConfig->StoreAsConfigFile(fTargetEntry)) != B_OK) + // create and store the configuration (injecting the BaseURL that was + // actually used) + BRepositoryConfig repoConfig; + repoConfig.SetName(repoHeader->Name()); + repoConfig.SetBaseURL(fRepositoryBaseURL); + repoConfig.SetPriority(repoHeader->Priority()); + if ((result = repoConfig.Store(fTargetEntry)) != B_OK) return result; // store name of activated repository as result - fRepositoryName = repoConfig->Name(); + fRepositoryName = repoConfig.Name(); return B_OK; } diff --git a/src/kits/package/DropRepositoryRequest.cpp b/src/kits/package/DropRepositoryRequest.cpp new file mode 100644 index 0000000000..c4dba669c5 --- /dev/null +++ b/src/kits/package/DropRepositoryRequest.cpp @@ -0,0 +1,61 @@ +/* + * Copyright 2011, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Oliver Tappe + */ + + +#include + +#include +#include + +#include +#include + + +namespace BPackageKit { + + +using namespace BPrivate; + + +DropRepositoryRequest::DropRepositoryRequest(const BContext& context, + const BString& repositoryName) + : + inherited(context), + fRepositoryName(repositoryName) +{ +} + + +DropRepositoryRequest::~DropRepositoryRequest() +{ +} + + +status_t +DropRepositoryRequest::CreateInitialJobs() +{ + status_t result = InitCheck(); + if (result != B_OK) + return B_NO_INIT; + + RemoveRepositoryJob* removeRepoJob + = new (std::nothrow) RemoveRepositoryJob(fContext, + BString("Removing repository ") << fRepositoryName, + fRepositoryName); + if (removeRepoJob == NULL) + return B_NO_MEMORY; + if ((result = QueueJob(removeRepoJob)) != B_OK) { + delete removeRepoJob; + return result; + } + + return B_OK; +} + + +} // namespace BPackageKit diff --git a/src/kits/package/Jamfile b/src/kits/package/Jamfile index fdc10af289..e1f1bd1a4c 100644 --- a/src/kits/package/Jamfile +++ b/src/kits/package/Jamfile @@ -10,14 +10,16 @@ SharedLibrary libpackage.so Attributes.cpp ChecksumAccessors.cpp Context.cpp + DropRepositoryRequest.cpp FetchFileJob.cpp Job.cpp JobQueue.cpp PackageRoster.cpp RefreshRepositoryRequest.cpp + RemoveRepositoryJob.cpp RepositoryCache.cpp RepositoryConfig.cpp -# RepositoryHeader.cpp + RepositoryHeader.cpp Request.cpp TempfileManager.cpp ValidateChecksumJob.cpp diff --git a/src/kits/package/RefreshRepositoryRequest.cpp b/src/kits/package/RefreshRepositoryRequest.cpp index c1194a32ba..58f7a3d74c 100644 --- a/src/kits/package/RefreshRepositoryRequest.cpp +++ b/src/kits/package/RefreshRepositoryRequest.cpp @@ -58,10 +58,10 @@ BRefreshRepositoryRequest::CreateInitialJobs() if (result != B_OK) return result; BString repoChecksumURL - = BString(fRepoConfig.URL()) << "/" << "repo.sha256"; + = BString(fRepoConfig.BaseURL()) << "/" << "repo.sha256"; FetchFileJob* fetchChecksumJob = new (std::nothrow) FetchFileJob( fContext, - BString("Fetching repository checksum from ") << fRepoConfig.URL(), + BString("Fetching repository checksum from ") << fRepoConfig.BaseURL(), repoChecksumURL, fFetchedChecksumFile); if (fetchChecksumJob == NULL) return B_NO_MEMORY; @@ -119,9 +119,9 @@ BRefreshRepositoryRequest::_FetchRepositoryCache() status_t result = fContext.GetNewTempfile("repocache-", &tempRepoCache); if (result != B_OK) return result; - BString repoCacheURL = BString(fRepoConfig.URL()) << "/" << "repo"; + BString repoCacheURL = BString(fRepoConfig.BaseURL()) << "/" << "repo"; FetchFileJob* fetchCacheJob = new (std::nothrow) FetchFileJob(fContext, - BString("Fetching repository-cache from ") << fRepoConfig.URL(), + BString("Fetching repository-cache from ") << fRepoConfig.BaseURL(), repoCacheURL, tempRepoCache); if (fetchCacheJob == NULL) return B_NO_MEMORY; diff --git a/src/kits/package/RemoveRepositoryJob.cpp b/src/kits/package/RemoveRepositoryJob.cpp new file mode 100644 index 0000000000..a3ad23298a --- /dev/null +++ b/src/kits/package/RemoveRepositoryJob.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2011, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Oliver Tappe + */ + + +#include + +#include + +#include +#include +#include +#include + + +namespace BPackageKit { + +namespace BPrivate { + + +RemoveRepositoryJob::RemoveRepositoryJob(const BContext& context, + const BString& title, const BString& repositoryName) + : + inherited(context, title), + fRepositoryName(repositoryName) +{ +} + + +RemoveRepositoryJob::~RemoveRepositoryJob() +{ +} + + +status_t +RemoveRepositoryJob::Execute() +{ + BPackageRoster roster; + BRepositoryConfig repoConfig; + status_t result = roster.GetRepositoryConfig(fRepositoryName, &repoConfig); + if (result != B_OK) { + if (result == B_ENTRY_NOT_FOUND) { + BString error = BString("repository '") << fRepositoryName + << "' not found!"; + SetErrorString(error); + } + return result; + } + + BString question = BString("Really remove the repository '") + << fRepositoryName << "'?"; + bool yes = fContext.DecisionProvider().YesNoDecisionNeeded("", question, + "yes", "no", "no"); + if (!yes) + return B_CANCELED; + + BEntry repoConfigEntry = repoConfig.Entry(); + if ((result = repoConfigEntry.Remove()) != B_OK) + return result; + + BRepositoryCache repoCache; + if (roster.GetRepositoryCache(fRepositoryName, &repoCache) == B_OK) { + BEntry repoCacheEntry = repoCache.Entry(); + if ((result = repoCacheEntry.Remove()) != B_OK) + return result; + } + + return B_OK; +} + + +} // namespace BPrivate + +} // namespace BPackageKit diff --git a/src/kits/package/RepositoryCache.cpp b/src/kits/package/RepositoryCache.cpp index 8707fda80c..f04a208c37 100644 --- a/src/kits/package/RepositoryCache.cpp +++ b/src/kits/package/RepositoryCache.cpp @@ -9,8 +9,6 @@ #include -#include - #include #include @@ -31,8 +29,10 @@ BRepositoryCache::BRepositoryCache() BRepositoryCache::BRepositoryCache(const BEntry& entry) + : + fIsUserSpecific(false) { - SetTo(entry); + fInitStatus = SetTo(entry); } @@ -55,6 +55,13 @@ BRepositoryCache::Entry() const } +const BRepositoryHeader& +BRepositoryCache::Header() const +{ + return fHeader; +} + + bool BRepositoryCache::IsUserSpecific() const { @@ -73,7 +80,6 @@ status_t BRepositoryCache::SetTo(const BEntry& entry) { fEntry = entry; - fInitStatus = B_NO_INIT; BFile file(&entry, B_READ_ONLY); status_t result = file.InitCheck(); @@ -84,7 +90,8 @@ BRepositoryCache::SetTo(const BEntry& entry) if ((result = headerMsg.Unflatten(&file)) != B_OK) return result; - // TODO: unarchive header and read packages + if ((result = fHeader.SetTo(&headerMsg)) != B_OK) + return result; BPath userSettingsPath; if (find_directory(B_USER_SETTINGS_DIRECTORY, &userSettingsPath) == B_OK) { @@ -93,10 +100,30 @@ BRepositoryCache::SetTo(const BEntry& entry) } else fIsUserSpecific = false; - fInitStatus = B_OK; - return B_OK; } +//status_t +//BRepositoryCache::_ReadPackageHeaders() +//{ +//// if (fPackageHeaders != NULL) +//// return B_OK; +// +// BFile file(&fEntry, B_READ_ONLY); +// status_t result = file.InitCheck(); +// if (result != B_OK) +// return result; +// +// BMessage headerMsg; +// if ((result = headerMsg.Unflatten(&file)) != B_OK) +// return result; +// +// +// // TODO: read packages! +// +// return B_OK; +//} + + } // namespace BPackageKit diff --git a/src/kits/package/RepositoryConfig.cpp b/src/kits/package/RepositoryConfig.cpp index 857f075a31..0d70369bb9 100644 --- a/src/kits/package/RepositoryConfig.cpp +++ b/src/kits/package/RepositoryConfig.cpp @@ -23,16 +23,10 @@ namespace BPackageKit { -const uint8 BRepositoryConfig::kDefaultPriority = 50; -const char* BRepositoryConfig::kNameField = "name"; -const char* BRepositoryConfig::kURLField = "url"; -const char* BRepositoryConfig::kPriorityField = "priority"; - - BRepositoryConfig::BRepositoryConfig() : fInitStatus(B_NO_INIT), - fPriority(kDefaultPriority), + fPriority(kUnsetPriority), fIsUserSpecific(false) { } @@ -44,20 +38,12 @@ BRepositoryConfig::BRepositoryConfig(const BEntry& entry) } -BRepositoryConfig::BRepositoryConfig(BMessage* data) - : - inherited(data) -{ - SetTo(data); -} - - -BRepositoryConfig::BRepositoryConfig(const BString& name, const BString& url, - uint8 priority) +BRepositoryConfig::BRepositoryConfig(const BString& name, + const BString& baseURL, uint8 priority) : fInitStatus(B_OK), fName(name), - fURL(url), + fBaseURL(baseURL), fPriority(priority), fIsUserSpecific(false) { @@ -69,36 +55,8 @@ BRepositoryConfig::~BRepositoryConfig() } -/*static*/ BRepositoryConfig* -BRepositoryConfig::Instantiate(BMessage* data) -{ - if (validate_instantiation(data, "BPackageKit::BRepositoryConfig")) - return new (std::nothrow) BRepositoryConfig(data); - - return NULL; -} - - status_t -BRepositoryConfig::Archive(BMessage* data, bool deep) const -{ - status_t result = inherited::Archive(data, deep); - if (result != B_OK) - return result; - - if ((result = data->AddString(kNameField, fName)) != B_OK) - return result; - if ((result = data->AddString(kURLField, fURL)) != B_OK) - return result; - if ((result = data->AddUInt8(kPriorityField, fPriority)) != B_OK) - return result; - - return B_OK; -} - - -status_t -BRepositoryConfig::StoreAsConfigFile(const BEntry& entry) const +BRepositoryConfig::Store(const BEntry& entry) const { BFile file(&entry, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE); status_t result = file.InitCheck(); @@ -107,7 +65,7 @@ BRepositoryConfig::StoreAsConfigFile(const BEntry& entry) const BString configString; configString - << "url=" << fURL << "\n" + << "url=" << fBaseURL << "\n" << "priority=" << fPriority << "\n"; int32 size = configString.Length(); @@ -169,9 +127,9 @@ BRepositoryConfig::SetTo(const BEntry& entry) return result; fName = name; - fURL = url; + fBaseURL = url; fPriority = priorityString == NULL - ? kDefaultPriority : atoi(priorityString); + ? kUnsetPriority : atoi(priorityString); BPath userSettingsPath; if (find_directory(B_USER_SETTINGS_DIRECTORY, &userSettingsPath) == B_OK) { @@ -186,30 +144,6 @@ BRepositoryConfig::SetTo(const BEntry& entry) } -status_t -BRepositoryConfig::SetTo(const BMessage* data) -{ - fInitStatus = B_NO_INIT; - - if (data == NULL) - return B_BAD_VALUE; - - status_t result; - if ((result = data->FindString(kNameField, &fName)) != B_OK) - return result; - if ((result = data->FindString(kURLField, &fURL)) != B_OK) - return result; - if ((result = data->FindUInt8(kPriorityField, &fPriority)) != B_OK) - return result; - - fIsUserSpecific = false; - - fInitStatus = B_OK; - - return B_OK; -} - - const BString& BRepositoryConfig::Name() const { @@ -218,9 +152,9 @@ BRepositoryConfig::Name() const const BString& -BRepositoryConfig::URL() const +BRepositoryConfig::BaseURL() const { - return fURL; + return fBaseURL; } @@ -253,9 +187,9 @@ BRepositoryConfig::SetName(const BString& name) void -BRepositoryConfig::SetURL(const BString& url) +BRepositoryConfig::SetBaseURL(const BString& baseURL) { - fURL = url; + fBaseURL = baseURL; } diff --git a/src/kits/package/RepositoryHeader.cpp b/src/kits/package/RepositoryHeader.cpp new file mode 100644 index 0000000000..3694c876dc --- /dev/null +++ b/src/kits/package/RepositoryHeader.cpp @@ -0,0 +1,202 @@ +/* + * Copyright 2011, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Oliver Tappe + */ + + +#include + +#include + + +namespace BPackageKit { + + +const uint8 BRepositoryHeader::kDefaultPriority = 50; + +const char* BRepositoryHeader::kNameField = "name"; +const char* BRepositoryHeader::kURLField = "url"; +const char* BRepositoryHeader::kVendorField = "vendor"; +const char* BRepositoryHeader::kShortDescriptionField = "shortDescr"; +const char* BRepositoryHeader::kLongDescriptionField = "longDescr"; +const char* BRepositoryHeader::kPriorityField = "priority"; + + +BRepositoryHeader::BRepositoryHeader() + : + fInitStatus(B_NO_INIT), + fPriority(kDefaultPriority) +{ +} + + +BRepositoryHeader::BRepositoryHeader(BMessage* data) + : + inherited(data) +{ + fInitStatus = SetTo(data); +} + + +BRepositoryHeader::~BRepositoryHeader() +{ +} + + +/*static*/ BRepositoryHeader* +BRepositoryHeader::Instantiate(BMessage* data) +{ + if (validate_instantiation(data, "BPackageKit::BRepositoryHeader")) + return new (std::nothrow) BRepositoryHeader(data); + + return NULL; +} + + +status_t +BRepositoryHeader::Archive(BMessage* data, bool deep) const +{ + status_t result = inherited::Archive(data, deep); + if (result != B_OK) + return result; + + if ((result = data->AddString(kNameField, fName)) != B_OK) + return result; + if ((result = data->AddString(kURLField, fOriginalBaseURL)) != B_OK) + return result; + if ((result = data->AddString(kVendorField, fVendor)) != B_OK) + return result; + result = data->AddString(kShortDescriptionField, fShortDescription); + if (result != B_OK) + return result; + result = data->AddString(kLongDescriptionField, fLongDescription); + if (result != B_OK) + return result; + if ((result = data->AddUInt8(kPriorityField, fPriority)) != B_OK) + return result; + + return B_OK; +} + + +status_t +BRepositoryHeader::InitCheck() const +{ + return fInitStatus; +} + + +status_t +BRepositoryHeader::SetTo(const BMessage* data) +{ + if (data == NULL) + return B_BAD_VALUE; + + status_t result; + if ((result = data->FindString(kNameField, &fName)) != B_OK) + return result; + if ((result = data->FindString(kURLField, &fOriginalBaseURL)) != B_OK) + return result; + if ((result = data->FindString(kVendorField, &fVendor)) != B_OK) + return result; + result = data->FindString(kShortDescriptionField, &fShortDescription); + if (result != B_OK) + return result; + result = data->FindString(kLongDescriptionField, &fLongDescription); + if (result != B_OK) + return result; + if ((result = data->FindUInt8(kPriorityField, &fPriority)) != B_OK) + return result; + + return B_OK; +} + + +const BString& +BRepositoryHeader::Name() const +{ + return fName; +} + + +const BString& +BRepositoryHeader::OriginalBaseURL() const +{ + return fOriginalBaseURL; +} + + +const BString& +BRepositoryHeader::Vendor() const +{ + return fVendor; +} + + +const BString& +BRepositoryHeader::ShortDescription() const +{ + return fShortDescription; +} + + +const BString& +BRepositoryHeader::LongDescription() const +{ + return fLongDescription; +} + + +uint8 +BRepositoryHeader::Priority() const +{ + return fPriority; +} + + +void +BRepositoryHeader::SetName(const BString& name) +{ + fName = name; +} + + +void +BRepositoryHeader::SetOriginalBaseURL(const BString& url) +{ + fOriginalBaseURL = url; +} + + +void +BRepositoryHeader::SetVendor(const BString& vendor) +{ + fVendor = vendor; +} + + +void +BRepositoryHeader::SetShortDescription(const BString& description) +{ + fShortDescription = description; +} + + +void +BRepositoryHeader::SetLongDescription(const BString& description) +{ + fLongDescription = description; +} + + +void +BRepositoryHeader::SetPriority(uint8 priority) +{ + fPriority = priority; +} + + +} // namespace BPackageKit diff --git a/src/tests/kits/package/make_repo.cpp b/src/tests/kits/package/make_repo.cpp index 93015d3e06..896f3bca2f 100644 --- a/src/tests/kits/package/make_repo.cpp +++ b/src/tests/kits/package/make_repo.cpp @@ -5,7 +5,7 @@ #include #include -#include +#include using namespace BPackageKit; @@ -20,22 +20,21 @@ main(int argc, const char** argv) return 1; } - BRepositoryConfig repoConfig(argv[1], argv[2], atoi(argv[3])); - status_t status = repoConfig.InitCheck(); - if (status != B_OK) { - fprintf(stderr, "couldn't initialize repository-config\n"); - return 1; - } + BRepositoryHeader repoHeader; + repoHeader.SetName(argv[1]); + repoHeader.SetOriginalBaseURL(argv[2]); + repoHeader.SetPriority(atoi(argv[3])); - BMessage repoConfigArchive; - if ((status = repoConfig.Archive(&repoConfigArchive)) != B_OK) { - fprintf(stderr, "couldn't archive repository-config\n"); + BMessage repoHeaderArchive; + status_t result = repoHeader.Archive(&repoHeaderArchive); + if (result != B_OK) { + fprintf(stderr, "couldn't archive repository-header\n"); return 1; } BFile output(argv[1], B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); - if ((status = repoConfigArchive.Flatten(&output)) != B_OK) { - fprintf(stderr, "couldn't flatten repository-config archive\n"); + if ((result = repoHeaderArchive.Flatten(&output)) != B_OK) { + fprintf(stderr, "couldn't flatten repository-header archive\n"); return 1; } @@ -69,8 +68,8 @@ main(int argc, const char** argv) } } - status = pkg.Flatten(&output); - if (status != B_OK) { + result = pkg.Flatten(&output); + if (result != B_OK) { fprintf(stderr, "couldn't flatten pkg message #%d\n", i + 1); return 1; }