xref: /haiku/headers/private/netservices/NetworkCookieJar.h (revision ef240bfffa9bd342a276eb73691a6996aa254156)
1 /*
2  * Copyright 2010-2013 Haiku Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _B_NETWORK_COOKIE_JAR_H_
6 #define _B_NETWORK_COOKIE_JAR_H_
7 
8 #include <pthread.h>
9 
10 #include <Archivable.h>
11 #include <Flattenable.h>
12 #include <Message.h>
13 #include <NetworkCookie.h>
14 #include <ObjectList.h>
15 #include <String.h>
16 #include <Url.h>
17 
18 
19 namespace BPrivate {
20 
21 namespace Network {
22 
23 
24 class BNetworkCookieList: public BObjectList<const BNetworkCookie> {
25 public:
26 								BNetworkCookieList();
27 								~BNetworkCookieList();
28 
29 			status_t			LockForReading();
30 			status_t			LockForWriting();
31 			status_t			Unlock();
32 private:
33 			pthread_rwlock_t	fLock;
34 };
35 
36 
37 class BNetworkCookieJar : public BArchivable, public BFlattenable {
38 public:
39 			// Nested types
40 			class Iterator;
41 			class UrlIterator;
42 			struct PrivateIterator;
43 			struct PrivateHashMap;
44 
45 public:
46 								BNetworkCookieJar();
47 								BNetworkCookieJar(
48 									const BNetworkCookieJar& other);
49 								BNetworkCookieJar(
50 									const BNetworkCookieList& otherList);
51 								BNetworkCookieJar(BMessage* archive);
52 	virtual						~BNetworkCookieJar();
53 
54 			status_t			AddCookie(const BNetworkCookie& cookie);
55 			status_t			AddCookie(const BString& cookie,
56 									const BUrl& url);
57 			status_t			AddCookie(BNetworkCookie* cookie);
58 			status_t			AddCookies(const BNetworkCookieList& cookies);
59 
60 			uint32				DeleteOutdatedCookies();
61 			uint32				PurgeForExit();
62 
63 	// BArchivable members
64 	virtual	status_t			Archive(BMessage* into,
65 									bool deep = true) const;
66 	static	BArchivable*		Instantiate(BMessage* archive);
67 
68 	// BFlattenable members
69 	virtual	bool				IsFixedSize() const;
70 	virtual	type_code			TypeCode() const;
71 	virtual	ssize_t				FlattenedSize() const;
72 	virtual	status_t			Flatten(void* buffer, ssize_t size)
73 									const;
74 	virtual	bool				AllowsTypeCode(type_code code) const;
75 	virtual	status_t			Unflatten(type_code code,
76 									const void* buffer, ssize_t size);
77 
78 			BNetworkCookieJar&	operator=(const BNetworkCookieJar& other);
79 
80 	// Iterators
81 			Iterator			GetIterator() const;
82 			UrlIterator			GetUrlIterator(const BUrl& url) const;
83 
84 
85 private:
86 			void				_DoFlatten() const;
87 
88 private:
89 	friend	class Iterator;
90 	friend	class UrlIterator;
91 
92 			PrivateHashMap*		fCookieHashMap;
93 	mutable	BString				fFlattened;
94 };
95 
96 
97 class BNetworkCookieJar::Iterator {
98 public:
99 								Iterator(const Iterator& other);
100 								~Iterator();
101 
102 			Iterator& 			operator=(const Iterator& other);
103 
104 			bool 				HasNext() const;
105 	const	BNetworkCookie*		Next();
106 	const	BNetworkCookie*		NextDomain();
107 	const	BNetworkCookie*		Remove();
108 			void				RemoveDomain();
109 
110 private:
111 								Iterator(const BNetworkCookieJar* map);
112 
113 			void 				_FindNext();
114 
115 private:
116 	friend 	class BNetworkCookieJar;
117 
118 			BNetworkCookieJar*	fCookieJar;
119 			PrivateIterator*	fIterator;
120 			BNetworkCookieList* fLastList;
121 			BNetworkCookieList*	fList;
122 	const	BNetworkCookie*		fElement;
123 	const	BNetworkCookie*		fLastElement;
124 			int32				fIndex;
125 };
126 
127 
128 // The copy constructor and assignment operator create new iterators for the
129 // same cookie jar and url. Iteration will start over.
130 class BNetworkCookieJar::UrlIterator {
131 public:
132 								UrlIterator(const UrlIterator& other);
133 								~UrlIterator();
134 
135 			bool 				HasNext() const;
136 	const	BNetworkCookie*		Next();
137 	const	BNetworkCookie*		Remove();
138 			UrlIterator& 		operator=(const UrlIterator& other);
139 
140 private:
141 								UrlIterator(const BNetworkCookieJar* map,
142 									const BUrl& url);
143 
144 			void				_Initialize();
145 			bool				_SuperDomain();
146 			void 				_FindNext();
147 			void				_FindDomain();
148 			bool				_FindPath();
149 
150 private:
151 	friend 	class BNetworkCookieJar;
152 
153 			BNetworkCookieJar*	fCookieJar;
154 			PrivateIterator*	fIterator;
155 			BNetworkCookieList*	fList;
156 			BNetworkCookieList* fLastList;
157 	const	BNetworkCookie*		fElement;
158 	const	BNetworkCookie*		fLastElement;
159 
160 			int32				fIndex;
161 			int32				fLastIndex;
162 
163 			BUrl				fUrl;
164 };
165 
166 
167 } // namespace Network
168 
169 } // namespace BPrivate
170 
171 #endif // _B_NETWORK_COOKIE_JAR_
172