xref: /haiku/headers/os/support/Url.h (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 /*
2  * Copyright 2010-2018 Haiku Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _B_URL_H_
6 #define _B_URL_H_
7 
8 
9 #include <Archivable.h>
10 #include <Message.h>
11 #include <Path.h>
12 #include <String.h>
13 
14 
15 class BUrl : public BArchivable {
16 public:
17 								BUrl(const char* url);
18 								BUrl(BMessage* archive);
19 								BUrl(const BUrl& other);
20 								BUrl(const BUrl& base, const BString& relative);
21 								BUrl(const BPath& path);
22 								BUrl();
23 	virtual						~BUrl();
24 
25 	// URL fields modifiers
26 			BUrl&				SetUrlString(const BString& url);
27 			BUrl&				SetProtocol(const BString& scheme);
28 			BUrl&				SetUserName(const BString& user);
29 			BUrl&				SetPassword(const BString& password);
30 			void				SetAuthority(const BString& authority);
31 			BUrl&				SetHost(const BString& host);
32 			BUrl&				SetPort(int port);
33 			BUrl&				SetPath(const BString& path);
34 			BUrl&				SetRequest(const BString& request);
35 			BUrl&				SetFragment(const BString& fragment);
36 
37 	// URL fields access
38 			const BString&		UrlString() const;
39 			const BString&		Protocol() const;
40 			const BString&		UserName() const;
41 			const BString&		Password() const;
42 			const BString&		UserInfo() const;
43 			const BString&		Host() const;
44 			int 				Port() const;
45 			const BString&		Authority() const;
46 			const BString&		Path() const;
47 			const BString&		Request() const;
48 			const BString&		Fragment() const;
49 
50 	// URL fields tests
51 			bool 				IsValid() const;
52 			bool				HasProtocol() const;
53 			bool				HasUserName() const;
54 			bool				HasPassword() const;
55 			bool				HasUserInfo() const;
56 			bool				HasHost() const;
57 			bool				HasPort() const;
58 			bool				HasAuthority() const;
59 			bool				HasPath() const;
60 			bool				HasRequest() const;
61 			bool				HasFragment() const;
62 
63 	// Url encoding/decoding of needed fields
64 			void				UrlEncode(bool strict = false);
65 			void				UrlDecode(bool strict = false);
66 
67 			status_t			IDNAToAscii();
68 			status_t			IDNAToUnicode();
69 
70 	// Url encoding/decoding of strings
71 	static	BString				UrlEncode(const BString& url,
72 									bool strict = false,
73 									bool directory = false);
74 	static	BString				UrlDecode(const BString& url,
75 									bool strict = false);
76 
77 	// utility functionality
78 			bool				HasPreferredApplication() const;
79 			BString				PreferredApplication() const;
80 			status_t			OpenWithPreferredApplication(
81 									bool onProblemAskUser = true) const;
82 
83 	// BArchivable members
84 	virtual	status_t			Archive(BMessage* into,
85 									bool deep = true) const;
86 	static	BArchivable*		Instantiate(BMessage* archive);
87 
88 	// URL comparison
89 			bool				operator==(BUrl& other) const;
90 			bool				operator!=(BUrl& other) const;
91 
92 	// URL assignment
93 			const BUrl&			operator=(const BUrl& other);
94 			const BUrl&			operator=(const BString& string);
95 			const BUrl&			operator=(const char* string);
96 
97 	// URL to string conversion
98 								operator const char*() const;
99 
100 private:
101 			void				_ResetFields();
102 			bool				_ContainsDelimiter(const BString& url);
103 			status_t			_ExplodeUrlString(const BString& urlString,
104 									uint32 flags);
105 			BString				_MergePath(const BString& relative) const;
106 			void				_SetPathUnsafe(const BString& path);
107 
108 	static	BString				_DoUrlEncodeChunk(const BString& chunk,
109 									bool strict, bool directory = false);
110 	static 	BString				_DoUrlDecodeChunk(const BString& chunk,
111 									bool strict);
112 
113 			bool				_IsHostValid() const;
114 			bool				_IsHostIPV6Valid(size_t offset,
115 									int32 length) const;
116 			bool				_IsProtocolValid() const;
117 	static	bool				_IsUnreserved(char c);
118 	static	bool				_IsGenDelim(char c);
119 	static	bool				_IsSubDelim(char c);
120 	static	bool				_IsIPV6Char(char c);
121 	static	bool				_IsUsernameChar(char c);
122 	static	bool				_IsPasswordChar(char c);
123 	static	bool				_IsHostChar(char c);
124 	static	bool				_IsPortChar(char c);
125 
126 	static	void				_RemoveLastPathComponent(BString& path);
127 
128 			BString				_UrlMimeType() const;
129 
130 private:
131 	mutable	BString				fUrlString;
132 	mutable	BString				fAuthority;
133 	mutable	BString				fUserInfo;
134 
135 			BString				fProtocol;
136 			BString				fUser;
137 			BString				fPassword;
138 			BString				fHost;
139 			int					fPort;
140 			BString				fPath;
141 			BString				fRequest;
142 			BString				fFragment;
143 
144 	mutable	bool				fUrlStringValid : 1;
145 	mutable	bool				fAuthorityValid : 1;
146 	mutable bool				fUserInfoValid : 1;
147 
148 			bool				fHasProtocol : 1;
149 			bool				fHasUserName : 1;
150 			bool				fHasPassword : 1;
151 			bool				fHasHost : 1;
152 			bool				fHasPort : 1;
153 			bool				fHasPath : 1;
154 			bool				fHasRequest : 1;
155 			bool				fHasFragment : 1;
156 };
157 
158 #endif  // _B_URL_H_
159