b7617ddd68
This change is needed for implementing cookie persistence in Web+ using the network kit backend. The current implementation requires the user to unarchive the cookie jar, then hand it over to the BUrlContext which will copy it to its own field. This makes the code simpler, but maybe doing a complete copy (with all the cookies) is an heavy operation and could be avoided.
146 lines
3.4 KiB
C++
146 lines
3.4 KiB
C++
/*
|
|
* 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 <Archivable.h>
|
|
#include <Flattenable.h>
|
|
#include <Message.h>
|
|
#include <ObjectList.h>
|
|
#include <NetworkCookie.h>
|
|
#include <String.h>
|
|
#include <Url.h>
|
|
|
|
|
|
typedef BObjectList<BNetworkCookie> 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_
|