/* * Copyright 2010-2013 Haiku Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _B_NETWORK_COOKIE_JAR_H_ #define _B_NETWORK_COOKIE_JAR_H_ #include #include #include #include #include #include #include typedef BObjectList BNetworkCookieList; class BNetworkCookieJar : public BArchivable, public BFlattenable { public: // Nested types class Iterator; class UrlIterator; struct PrivateIterator; struct PrivateHashMap; public: BNetworkCookieJar(); BNetworkCookieJar( const BNetworkCookieJar& other); BNetworkCookieJar( const BNetworkCookieList& otherList); BNetworkCookieJar(BMessage* archive); virtual ~BNetworkCookieJar(); status_t AddCookie(const BNetworkCookie& cookie); status_t AddCookie(const BString& cookie, const BUrl& url); status_t AddCookie(BNetworkCookie* cookie); status_t AddCookies(const BNetworkCookieList& cookies); uint32 DeleteOutdatedCookies(); uint32 PurgeForExit(); // BArchivable members virtual status_t Archive(BMessage* into, bool deep = true) const; static BArchivable* Instantiate(BMessage* archive); // BFlattenable members virtual bool IsFixedSize() const; virtual type_code TypeCode() const; virtual ssize_t FlattenedSize() const; virtual status_t Flatten(void* buffer, ssize_t size) const; virtual bool AllowsTypeCode(type_code code) const; virtual status_t Unflatten(type_code code, const void* buffer, ssize_t size); BNetworkCookieJar& operator=(const BNetworkCookieJar& other); // Iterators Iterator GetIterator() const; UrlIterator GetUrlIterator(const BUrl& url) const; private: void _DoFlatten() const; private: friend class Iterator; friend class UrlIterator; PrivateHashMap* fCookieHashMap; mutable BString fFlattened; }; class BNetworkCookieJar::Iterator { public: Iterator(const Iterator& other); ~Iterator(); bool HasNext() const; BNetworkCookie* Next(); BNetworkCookie* NextDomain(); BNetworkCookie* Remove(); void RemoveDomain(); Iterator& operator=(const Iterator& other); private: Iterator(const BNetworkCookieJar* map); void _FindNext(); private: friend class BNetworkCookieJar; BNetworkCookieJar* fCookieJar; PrivateIterator* fIterator; BNetworkCookieList* fLastList; BNetworkCookieList* fList; BNetworkCookie* fElement; BNetworkCookie* fLastElement; int32 fIndex; }; class BNetworkCookieJar::UrlIterator { public: UrlIterator(const UrlIterator& other); ~UrlIterator(); bool HasNext() const; BNetworkCookie* Next(); BNetworkCookie* Remove(); UrlIterator& operator=(const UrlIterator& other); private: UrlIterator(const BNetworkCookieJar* map, const BUrl& url); bool _SuperDomain(); void _FindNext(); void _FindDomain(); bool _FindPath(); private: friend class BNetworkCookieJar; BNetworkCookieJar* fCookieJar; PrivateIterator* fIterator; BNetworkCookieList* fList; BNetworkCookieList* fLastList; BNetworkCookie* fElement; BNetworkCookie* fLastElement; int32 fIndex; int32 fLastIndex; BUrl fUrl; }; #endif // _B_NETWORK_COOKIE_JAR_