/* * $Id: URI_Impl.cpp,v 1.6 2006/03/05 05:00:09 ozawa Exp $ * * Copyright 2005- ONGS Inc. All rights reserved. * * author: Masanori OZAWA (ozawa@ongs.co.jp) * version: $Revision: 1.6 $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY ONGS INC ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL ONGS INC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are * those of the authors and should not be interpreted as representing official * policies, either expressed or implied, of the ONGS Inc. * */ #include "xdtp.h" #include "URI_Impl.h" using namespace XDTP; URI_Impl::URI_Impl() : URI() { } URI_Impl::URI_Impl(const Glib::ustring& uri) { m_URIPtr = xmlParseURI(uri.c_str()); #ifdef DEBUG if (!m_URIPtr) { fprintf(stderr, "%s: Unable to parse the URI. (%s)" LINE_SEP, APP_NAME, uri.c_str()); } #if 0 else { fprintf(stdout, "%s: xmlPrintURI: ", APP_NAME); xmlPrintURI(stdout, m_URIPtr); fprintf(stdout, LINE_SEP); fprintf(stdout, "%s: debug: scheme: %s" LINE_SEP, APP_NAME, m_URIPtr->scheme); fprintf(stdout, "%s: debug: opaque: %s" LINE_SEP, APP_NAME, m_URIPtr->opaque); fprintf(stdout, "%s: debug: authority: %s" LINE_SEP, APP_NAME, m_URIPtr->authority); fprintf(stdout, "%s: debug: server: %s" LINE_SEP, APP_NAME, m_URIPtr->server); fprintf(stdout, "%s: debug: user: %s" LINE_SEP, APP_NAME, m_URIPtr->user); fprintf(stdout, "%s: debug: port: %d" LINE_SEP, APP_NAME, m_URIPtr->port); fprintf(stdout, "%s: debug: path: %s" LINE_SEP, APP_NAME, m_URIPtr->path); fprintf(stdout, "%s: debug: query: %s" LINE_SEP, APP_NAME, m_URIPtr->query); fprintf(stdout, "%s: debug: fragment: %s" LINE_SEP, APP_NAME, m_URIPtr->fragment); fprintf(stdout, "%s: debug: cleanup: %d" LINE_SEP, APP_NAME, m_URIPtr->cleanup); } #endif #endif } URI_Impl::~URI_Impl() { // no operation } Glib::ustring URI_Impl::getScheme() const { if (!m_URIPtr) return ""; if (!m_URIPtr->scheme) return ""; return (m_URIPtr->scheme); } bool URI_Impl::isHttpScheme() const { Glib::ustring scheme = getScheme().lowercase(); return ("http" == scheme || "https" == scheme); } bool URI_Impl::isFtpScheme() const { return ("ftp" == getScheme().lowercase()); } bool URI_Impl::isFileScheme() const { return ("file" == getScheme().lowercase()); } Glib::ustring URI_Impl::getHostname() const { if (!m_URIPtr) return ""; if (!m_URIPtr->server) return ""; return (m_URIPtr->server); } Glib::ustring URI_Impl::getUsername() const { if (!m_URIPtr) return ""; if (!m_URIPtr->user) return ""; return (m_URIPtr->user); } int URI_Impl::getPort() const { if (!m_URIPtr) return -1; return (m_URIPtr->port); } Glib::ustring URI_Impl::getPath() const { if (!m_URIPtr) return ""; if (!m_URIPtr->path) { // file:hoge 形式で相対パスを指定した場合の救済処置 // これは、RFC で規定される正しい動作ではありません。 #ifdef WITH_RELIEF_FILE_SCHEME if (isFileScheme()) { if (!m_URIPtr->server && m_URIPtr->opaque && '/' != *(m_URIPtr->opaque)) { return m_URIPtr->opaque; } } #endif return ""; } return (m_URIPtr->path); } Glib::ustring URI_Impl::getAbsolutePath(const Glib::ustring& base) const { Glib::ustring path = getPath(); // URIではパスの区切りは '/' 固定 if (0 < path.length() && '/' != path.at(0)) { if ('/' == base.at(base.length() -1)) { path = base + path; } else { path = base + '/' + path; } } return path; } Glib::ustring URI_Impl::getQuery() const { if (!m_URIPtr) return ""; if (!m_URIPtr->query) return ""; return (m_URIPtr->query); }