1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_stoc.hxx" 26 27 #include "UriReference.hxx" 28 29 #include "osl/diagnose.h" 30 #include "osl/mutex.hxx" 31 #include "rtl/string.h" 32 #include "rtl/ustrbuf.hxx" 33 #include "rtl/ustring.hxx" 34 #include "sal/types.h" 35 36 namespace css = com::sun::star; 37 using stoc::uriproc::UriReference; 38 39 UriReference::UriReference( 40 rtl::OUString const & scheme, bool bIsHierarchical, bool bHasAuthority, 41 rtl::OUString const & authority, rtl::OUString const & path, 42 bool bHasQuery, rtl::OUString const & query): 43 m_scheme(scheme), 44 m_authority(authority), 45 m_path(path), 46 m_query(query), 47 m_isHierarchical(bIsHierarchical), 48 m_hasAuthority(bHasAuthority), 49 m_hasQuery(bHasQuery), 50 m_hasFragment(false) 51 { 52 OSL_ASSERT(scheme.getLength() != 0 || bIsHierarchical); 53 OSL_ASSERT(!bHasAuthority || bIsHierarchical); 54 OSL_ASSERT(authority.getLength() == 0 || bHasAuthority); 55 OSL_ASSERT(!bHasQuery || bIsHierarchical); 56 OSL_ASSERT(query.getLength() == 0 || bHasQuery); 57 } 58 59 UriReference::~UriReference() {} 60 61 rtl::OUString UriReference::getUriReference() throw (css::uno::RuntimeException) 62 { 63 osl::MutexGuard g(m_mutex); 64 rtl::OUStringBuffer buf; 65 if (m_scheme.getLength() != 0) { 66 buf.append(m_scheme); 67 buf.append(static_cast< sal_Unicode >(':')); 68 } 69 appendSchemeSpecificPart(buf); 70 if (m_hasFragment) { 71 buf.append(static_cast< sal_Unicode >('#')); 72 buf.append(m_fragment); 73 } 74 return buf.makeStringAndClear(); 75 } 76 77 sal_Bool UriReference::isAbsolute() throw (css::uno::RuntimeException) { 78 return m_scheme.getLength() != 0; 79 } 80 81 rtl::OUString UriReference::getScheme() throw (css::uno::RuntimeException) { 82 return m_scheme; 83 } 84 85 rtl::OUString UriReference::getSchemeSpecificPart() 86 throw (css::uno::RuntimeException) 87 { 88 osl::MutexGuard g(m_mutex); 89 rtl::OUStringBuffer buf; 90 appendSchemeSpecificPart(buf); 91 return buf.makeStringAndClear(); 92 } 93 94 sal_Bool UriReference::isHierarchical() throw (css::uno::RuntimeException) { 95 osl::MutexGuard g(m_mutex); 96 return m_isHierarchical; 97 } 98 99 sal_Bool UriReference::hasAuthority() throw (css::uno::RuntimeException) { 100 osl::MutexGuard g(m_mutex); 101 return m_hasAuthority; 102 } 103 104 rtl::OUString UriReference::getAuthority() throw (css::uno::RuntimeException) { 105 osl::MutexGuard g(m_mutex); 106 return m_authority; 107 } 108 109 rtl::OUString UriReference::getPath() throw (css::uno::RuntimeException) { 110 osl::MutexGuard g(m_mutex); 111 return m_path; 112 } 113 114 sal_Bool UriReference::hasRelativePath() throw (css::uno::RuntimeException) { 115 osl::MutexGuard g(m_mutex); 116 return m_isHierarchical && !m_hasAuthority 117 && (m_path.getLength() == 0 || m_path[0] != '/'); 118 } 119 120 sal_Int32 UriReference::getPathSegmentCount() throw (css::uno::RuntimeException) 121 { 122 osl::MutexGuard g(m_mutex); 123 if (!m_isHierarchical || m_path.getLength() == 0) { 124 return 0; 125 } else { 126 sal_Int32 n = m_path[0] == '/' ? 0 : 1; 127 for (sal_Int32 i = 0;; ++i) { 128 i = m_path.indexOf('/', i); 129 if (i < 0) { 130 break; 131 } 132 ++n; 133 } 134 return n; 135 } 136 } 137 138 rtl::OUString UriReference::getPathSegment(sal_Int32 index) 139 throw (css::uno::RuntimeException) 140 { 141 osl::MutexGuard g(m_mutex); 142 if (m_isHierarchical && m_path.getLength() != 0 && index >= 0) { 143 for (sal_Int32 i = m_path[0] == '/' ? 1 : 0;; ++i) { 144 if (index-- == 0) { 145 sal_Int32 j = m_path.indexOf('/', i); 146 return j < 0 ? m_path.copy(i) : m_path.copy(i, j - i); 147 } 148 i = m_path.indexOf('/', i); 149 if (i < 0) { 150 break; 151 } 152 } 153 } 154 return rtl::OUString(); 155 } 156 157 sal_Bool UriReference::hasQuery() throw (css::uno::RuntimeException) { 158 osl::MutexGuard g(m_mutex); 159 return m_hasQuery; 160 } 161 162 rtl::OUString UriReference::getQuery() throw (css::uno::RuntimeException) { 163 osl::MutexGuard g(m_mutex); 164 return m_query; 165 } 166 167 sal_Bool UriReference::hasFragment() throw (css::uno::RuntimeException) { 168 osl::MutexGuard g(m_mutex); 169 return m_hasFragment; 170 } 171 172 rtl::OUString UriReference::getFragment() throw (css::uno::RuntimeException) { 173 osl::MutexGuard g(m_mutex); 174 return m_fragment; 175 } 176 177 void UriReference::setFragment(rtl::OUString const & fragment) 178 throw (css::uno::RuntimeException) 179 { 180 osl::MutexGuard g(m_mutex); 181 m_hasFragment = true; 182 m_fragment = fragment; 183 } 184 185 void UriReference::clearFragment() throw (css::uno::RuntimeException) { 186 osl::MutexGuard g(m_mutex); 187 m_hasFragment = false; 188 m_fragment = rtl::OUString(); 189 } 190 191 void UriReference::appendSchemeSpecificPart(rtl::OUStringBuffer & buffer) const 192 { 193 if (m_hasAuthority) { 194 buffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("//")); 195 buffer.append(m_authority); 196 } 197 buffer.append(m_path); 198 if (m_hasQuery) { 199 buffer.append(static_cast< sal_Unicode >('?')); 200 buffer.append(m_query); 201 } 202 } 203