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