[haiku-commits] r40509 - in haiku/trunk: headers/os/package src/kits/package

  • From: zooey@xxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 15 Feb 2011 16:47:20 +0100 (CET)

Author: zooey
Date: 2011-02-15 16:47:20 +0100 (Tue, 15 Feb 2011)
New Revision: 40509
Changeset: http://dev.haiku-os.org/changeset/40509

Modified:
   haiku/trunk/headers/os/package/RepositoryCache.h
   haiku/trunk/src/kits/package/RepositoryCache.cpp
Log:
* implemented reading of package-infos in BRepositoryCache


Modified: haiku/trunk/headers/os/package/RepositoryCache.h
===================================================================
--- haiku/trunk/headers/os/package/RepositoryCache.h    2011-02-15 12:48:02 UTC 
(rev 40508)
+++ haiku/trunk/headers/os/package/RepositoryCache.h    2011-02-15 15:47:20 UTC 
(rev 40509)
@@ -30,12 +30,19 @@
 
                        void                            SetIsUserSpecific(bool 
isUserSpecific);
 
+                       uint32                          PackageCount() const;
+
 private:
+                       struct PackageMap;
+
+private:
                        status_t                        fInitStatus;
 
                        BEntry                          fEntry;
                        BRepositoryInfo         fInfo;
                        bool                            fIsUserSpecific;
+
+                       PackageMap*                     fPackageMap;
 };
 
 

Modified: haiku/trunk/src/kits/package/RepositoryCache.cpp
===================================================================
--- haiku/trunk/src/kits/package/RepositoryCache.cpp    2011-02-15 12:48:02 UTC 
(rev 40508)
+++ haiku/trunk/src/kits/package/RepositoryCache.cpp    2011-02-15 15:47:20 UTC 
(rev 40509)
@@ -9,6 +9,8 @@
 
 #include <package/RepositoryCache.h>
 
+#include <stdio.h>
+
 #include <new>
 
 #include <Directory.h>
@@ -16,21 +18,220 @@
 #include <FindDirectory.h>
 #include <Path.h>
 
+#include <HashMap.h>
+#include <HashString.h>
 
+#include <package/hpkg/ErrorOutput.h>
+#include <package/hpkg/PackageInfoAttributeValue.h>
+#include <package/hpkg/RepositoryContentHandler.h>
+#include <package/hpkg/RepositoryReader.h>
+#include <package/PackageInfo.h>
+#include <package/RepositoryInfo.h>
+
+
 namespace BPackageKit {
 
 
+using namespace BHPKG;
+
+
+namespace {
+
+
+struct HashableString : public BString {
+       uint32  hashCode;
+
+       HashableString()
+               :
+               hashCode(0)
+       {
+       }
+
+       HashableString(const BString& string_)
+               :
+               BString(string_),
+               hashCode(string_hash(String()))
+       {
+       }
+
+       inline uint32 GetHashCode() const
+       {
+               return hashCode;
+       }
+
+       inline bool operator!= (const HashableString& other) const
+       {
+               return Compare(other) != 0 || hashCode != other.hashCode;
+       }
+};
+
+
+typedef ::BPrivate::HashMap<HashableString, BPackageInfo> PackageHashMap;
+
+struct RepositoryContentHandler : BRepositoryContentHandler {
+       RepositoryContentHandler(BRepositoryInfo* repositoryInfo,
+               PackageHashMap* packageMap)
+               :
+               fRepositoryInfo(repositoryInfo),
+               fPackageMap(packageMap)
+       {
+       }
+
+       virtual status_t HandleEntry(BPackageEntry* entry)
+       {
+               return B_OK;
+       }
+
+       virtual status_t HandleEntryAttribute(BPackageEntry* entry,
+               BPackageEntryAttribute* attribute)
+       {
+               return B_OK;
+       }
+
+       virtual status_t HandleEntryDone(BPackageEntry* entry)
+       {
+               return B_OK;
+       }
+
+       virtual status_t HandlePackageAttribute(
+               const BPackageInfoAttributeValue& value)
+       {
+               switch (value.attributeID) {
+                       case B_PACKAGE_INFO_NAME:
+                               fPackageInfo.SetName(value.string);
+                               break;
+
+                       case B_PACKAGE_INFO_SUMMARY:
+                               fPackageInfo.SetSummary(value.string);
+                               break;
+
+                       case B_PACKAGE_INFO_DESCRIPTION:
+                               fPackageInfo.SetDescription(value.string);
+                               break;
+
+                       case B_PACKAGE_INFO_VENDOR:
+                               fPackageInfo.SetVendor(value.string);
+                               break;
+
+                       case B_PACKAGE_INFO_PACKAGER:
+                               fPackageInfo.SetPackager(value.string);
+                               break;
+
+                       case B_PACKAGE_INFO_FLAGS:
+                               fPackageInfo.SetFlags(value.unsignedInt);
+                               break;
+
+                       case B_PACKAGE_INFO_ARCHITECTURE:
+                               fPackageInfo.SetArchitecture(
+                                       
(BPackageArchitecture)value.unsignedInt);
+                               break;
+
+                       case B_PACKAGE_INFO_VERSION:
+                               fPackageInfo.SetVersion(value.version);
+                               break;
+
+                       case B_PACKAGE_INFO_COPYRIGHTS:
+                               fPackageInfo.AddCopyright(value.string);
+                               break;
+
+                       case B_PACKAGE_INFO_LICENSES:
+                               fPackageInfo.AddLicense(value.string);
+                               break;
+
+                       case B_PACKAGE_INFO_PROVIDES:
+                               fPackageInfo.AddProvides(value.resolvable);
+                               break;
+
+                       case B_PACKAGE_INFO_REQUIRES:
+                               
fPackageInfo.AddRequires(value.resolvableExpression);
+                               break;
+
+                       case B_PACKAGE_INFO_SUPPLEMENTS:
+                               
fPackageInfo.AddSupplements(value.resolvableExpression);
+                               break;
+
+                       case B_PACKAGE_INFO_CONFLICTS:
+                               
fPackageInfo.AddConflicts(value.resolvableExpression);
+                               break;
+
+                       case B_PACKAGE_INFO_FRESHENS:
+                               
fPackageInfo.AddFreshens(value.resolvableExpression);
+                               break;
+
+                       case B_PACKAGE_INFO_REPLACES:
+                               fPackageInfo.AddReplaces(value.string);
+                               break;
+
+                       case B_PACKAGE_INFO_CHECKSUM:
+                       {
+                               fPackageInfo.SetChecksum(value.string);
+                               status_t result = fPackageInfo.InitCheck();
+                               if (result != B_OK)
+                                       return result;
+
+                               if 
(fPackageMap->ContainsKey(fPackageInfo.Name()))
+                                       return B_NAME_IN_USE;
+                               result = fPackageMap->Put(fPackageInfo.Name(), 
fPackageInfo);
+                               if (result != B_OK)
+                                       return result;
+
+                               fPackageInfo.Clear();
+                               break;
+                       }
+
+                       default:
+                               return B_BAD_DATA;
+               }
+
+               return B_OK;
+       }
+
+       virtual status_t HandleRepositoryInfo(const BRepositoryInfo& 
repositoryInfo)
+       {
+               *fRepositoryInfo = repositoryInfo;
+
+               return B_OK;
+       }
+
+       virtual void HandleErrorOccurred()
+       {
+       }
+
+private:
+       BRepositoryInfo*        fRepositoryInfo;
+       BPackageInfo            fPackageInfo;
+       PackageHashMap*         fPackageMap;
+};
+
+
+class StandardErrorOutput : public BErrorOutput {
+       virtual void PrintErrorVarArgs(const char* format, va_list args)
+       {
+               vfprintf(stderr, format, args);
+       }
+};
+
+
+}      // anonymous namespace
+
+
+struct BRepositoryCache::PackageMap : public PackageHashMap {
+};
+
+
 BRepositoryCache::BRepositoryCache()
        :
        fInitStatus(B_NO_INIT),
-       fIsUserSpecific(false)
+       fIsUserSpecific(false),
+       fPackageMap(new (std::nothrow) PackageMap)
 {
 }
 
 
 BRepositoryCache::BRepositoryCache(const BEntry& entry)
        :
-       fIsUserSpecific(false)
+       fIsUserSpecific(false),
+       fPackageMap(new (std::nothrow) PackageMap)
 {
        fInitStatus = SetTo(entry);
 }
@@ -38,6 +239,7 @@
 
 BRepositoryCache::~BRepositoryCache()
 {
+       delete fPackageMap;
 }
 
 
@@ -79,18 +281,27 @@
 status_t
 BRepositoryCache::SetTo(const BEntry& entry)
 {
+       if (fPackageMap == NULL)
+               return B_NO_MEMORY;
+       status_t result = fPackageMap->InitCheck();
+       if (result != B_OK)
+               return result;
+
        fEntry = entry;
+       fPackageMap->Clear();
 
-       BFile file(&entry, B_READ_ONLY);
-       status_t result = file.InitCheck();
-       if (result != B_OK)
+       BPath repositoryCachePath;
+       if ((result = entry.GetPath(&repositoryCachePath)) != B_OK)
                return result;
 
-       BMessage headerMsg;
-       if ((result = headerMsg.Unflatten(&file)) != B_OK)
+       // read repository cache
+       StandardErrorOutput errorOutput;
+       BRepositoryReader repositoryReader(&errorOutput);
+       if ((result = repositoryReader.Init(repositoryCachePath.Path())) != 
B_OK)
                return result;
 
-       if ((result = fInfo.SetTo(&headerMsg)) != B_OK)
+       RepositoryContentHandler handler(&fInfo, fPackageMap);
+       if ((result = repositoryReader.ParseContent(&handler)) != B_OK)
                return result;
 
        BPath userSettingsPath;
@@ -104,26 +315,14 @@
 }
 
 
-//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;
-//}
+uint32
+BRepositoryCache::PackageCount() const
+{
+       if (fPackageMap == NULL)
+               return 0;
 
+       return fPackageMap->Size();
+}
 
+
 }      // namespace BPackageKit


Other related posts:

  • » [haiku-commits] r40509 - in haiku/trunk: headers/os/package src/kits/package - zooey