AlterOffice
AlterOffice 3.4 SDK C/C++ API Reference
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
uri.hxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 
3 
4 #ifndef INCLUDED_RTL_URI_HXX
5 #define INCLUDED_RTL_URI_HXX
6 
8 #include "rtl/uri.h"
9 #include "rtl/textenc.h"
10 #include "rtl/ustring.hxx"
11 #include "sal/types.h"
12 
13 #if defined LIBO_INTERNAL_ONLY
14 #include <array>
15 #include <cassert>
16 #include <cstddef>
17 #include <string_view>
18 #include "config_global.h"
19 #endif
20 
21 namespace rtl {
22 
25 class Uri
26 {
27 public:
31  static inline rtl::OUString encode(rtl::OUString const & rText,
32  sal_Bool const * pCharClass,
33  rtl_UriEncodeMechanism eMechanism,
34  rtl_TextEncoding eCharset);
35 
39  static inline rtl::OUString encode(rtl::OUString const & rText,
40  rtl_UriCharClass eCharClass,
41  rtl_UriEncodeMechanism eMechanism,
42  rtl_TextEncoding eCharset);
43 
46  static inline rtl::OUString decode(rtl::OUString const & rText,
47  rtl_UriDecodeMechanism eMechanism,
48  rtl_TextEncoding eCharset);
49 
56  static inline rtl::OUString convertRelToAbs(
57  rtl::OUString const & rBaseUriRef, rtl::OUString const & rRelUriRef);
58 
59 private:
61 
63 
65 
66  void operator =(Uri) SAL_DELETED_FUNCTION;
67 };
68 
70  sal_Bool const * pCharClass,
71  rtl_UriEncodeMechanism eMechanism,
72  rtl_TextEncoding eCharset)
73 {
74  rtl::OUString aResult;
75  rtl_uriEncode(const_cast< rtl::OUString & >(rText).pData,
76  pCharClass,
77  eMechanism,
78  eCharset,
79  &aResult.pData);
80  return aResult;
81 }
82 
84  rtl_UriCharClass eCharClass,
85  rtl_UriEncodeMechanism eMechanism,
86  rtl_TextEncoding eCharset)
87 {
88  rtl::OUString aResult;
89  rtl_uriEncode(const_cast< rtl::OUString & >(rText).pData,
90  rtl_getUriCharClass(eCharClass),
91  eMechanism,
92  eCharset,
93  &aResult.pData);
94  return aResult;
95 }
96 
98  rtl_UriDecodeMechanism eMechanism,
99  rtl_TextEncoding eCharset)
100 {
101  rtl::OUString aResult;
102  rtl_uriDecode(const_cast< rtl::OUString & >(rText).pData,
103  eMechanism,
104  eCharset,
105  &aResult.pData);
106  return aResult;
107 }
108 
110  rtl::OUString const & rRelUriRef)
111 {
112  rtl::OUString aResult;
113  rtl::OUString aException;
115  const_cast< rtl::OUString & >(rBaseUriRef).pData,
116  const_cast< rtl::OUString & >(rRelUriRef).pData, &aResult.pData,
117  &aException.pData))
118  throw MalformedUriException(aException);
119  return aResult;
120 }
121 
122 #if defined LIBO_INTERNAL_ONLY
123 
124 constexpr std::size_t UriCharClassSize = 128;
125 
126 // Create a char class (for use with rtl_uriEncode and rtl::Uri::encode), represented as a
127 // compile-time std::array, from an UTF-8 string literal.
128 //
129 // The given `unencoded` lists each ASCII character once that shall not be encoded. (It uses an
130 // UTF-8 string type to emphasize that its characters' values are always interpreted as ASCII
131 // values.)
132 #if HAVE_CPP_CONSTEVAL
133 consteval
134 #else
135 constexpr
136 #endif
137 auto createUriCharClass(
138 #if defined __cpp_lib_char8_t
139  std::u8string_view
140 #else
141  std::string_view
142 #endif
143  unencoded)
144 {
145  std::array<sal_Bool, UriCharClassSize> a = {};
146  for (auto c: unencoded) {
147  assert(!a[c]); // would presumably indicate a typo in the `unencoded` argument
148  a[c] = true;
149  }
150  return a;
151 }
152 
153 #endif
154 
155 }
156 
157 #endif // INCLUDED_RTL_URI_HXX
158 
159 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SAL_DLLPUBLIC void rtl_uriDecode(rtl_uString *pText, rtl_UriDecodeMechanism eMechanism, rtl_TextEncoding eCharset, rtl_uString **pResult) SAL_THROW_EXTERN_C()
Decode (a part of) a URI.
An exception indicating a malformed URI.
Definition: malformeduriexception.hxx:15
SAL_DLLPUBLIC sal_Bool const * rtl_getUriCharClass(rtl_UriCharClass eCharClass) SAL_THROW_EXTERN_C()
Map a predefined rtl_UriCharClass to a form usable by rtl_uriEncode().
unsigned char sal_Bool
Definition: types.h:18
static rtl::OUString convertRelToAbs(rtl::OUString const &rBaseUriRef, rtl::OUString const &rRelUriRef)
A wrapper around rtl_uriConvertRelToAbs() from &lt;rtl/uri.h&gt; (see there).
Definition: uri.hxx:109
rtl_UriDecodeMechanism
The mechanism describing how rtl_uriDecode() translates (part of) a URI into a Unicode string...
Definition: uri.h:168
sal_uInt16 rtl_TextEncoding
The various supported text encodings.
Definition: textenc.h:17
This String class provides base functionality for C++ like Unicode character array handling...
Definition: ustring.hxx:182
pData
Definition: ustring.hxx:334
static rtl::OUString decode(rtl::OUString const &rText, rtl_UriDecodeMechanism eMechanism, rtl_TextEncoding eCharset)
A wrapper around rtl_uriDecode() from &lt;rtl/uri.h&gt; (see there).
Definition: uri.hxx:97
SAL_DLLPUBLIC sal_Bool rtl_uriConvertRelToAbs(rtl_uString *pBaseUriRef, rtl_uString *pRelUriRef, rtl_uString **pResult, rtl_uString **pException) SAL_THROW_EXTERN_C()
Convert a relative URI reference into an absolute URI.
rtl_UriCharClass
Various predefined URI &#39;char classes.
Definition: uri.h:29
rtl_UriEncodeMechanism
The mechanism describing how escape sequences in the input of rtl_uriEncode() are handled...
Definition: uri.h:114
SAL_DLLPUBLIC void rtl_uriEncode(rtl_uString *pText, sal_Bool const *pCharClass, rtl_UriEncodeMechanism eMechanism, rtl_TextEncoding eCharset, rtl_uString **pResult) SAL_THROW_EXTERN_C()
Encode a text as (part of) a URI.
static rtl::OUString encode(rtl::OUString const &rText, sal_Bool const *pCharClass, rtl_UriEncodeMechanism eMechanism, rtl_TextEncoding eCharset)
A wrapper around rtl_uriEncode() from &lt;rtl/uri.h&gt; (see there), using an array of 128 booleans as char...
Definition: uri.hxx:69
A wrapper around the C functions from &lt;rtl/uri.h&gt;.
Definition: uri.hxx:25
#define SAL_DELETED_FUNCTION
short-circuit extra-verbose API namespaces
Definition: types.h:358