You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvilib/net/kvi_url.cpp

165 lines
3.1 KiB

//
// File : kvi_url.cpp
// Creation date : Sat Aug 17 14:09:18 2002 GMT by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2002 Szymon Stefanek (pragma at kvirc dot net)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your opinion) any later version.
//
// This program is distributed in the HOPE that it will be USEFUL,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#define __KVILIB__
#include "kvi_url.h"
KviUrl::KviUrl()
{
}
KviUrl::KviUrl(const KviUrl & u)
{
*this = u;
}
KviUrl::KviUrl(const char * szUrl)
{
m_szUrl = szUrl;
parse();
}
KviUrl::KviUrl(const TQString &szUrl)
{
m_szUrl = szUrl;
parse();
}
KviUrl::~KviUrl()
{
}
void KviUrl::parse()
{
m_szProtocol = "";
m_szHost = "";
m_szPath = "";
m_szUser = "";
m_szPass = "";
m_szUrl.stripWhiteSpace();
KviStr u = m_szUrl;
// proto
kvi_u32_t uDefaultPort = 80;
int i = u.findFirstIdx(":/");
if(i != -1)
{
// there is a protocol path
m_szProtocol = u.left(i);
u.cutLeft(i + 2);
u.stripLeft('/');
u.stripWhiteSpace();
// fix the default ports
if(kvi_strEqualCI(m_szProtocol,"https"))uDefaultPort = 443;
else if(kvi_strEqualCI(m_szProtocol,"ftp"))uDefaultPort = 21;
} else {
// no proto... assume http
u.stripLeft('/');
m_szProtocol = "http";
}
m_uPort = uDefaultPort;
// user and pass
i = u.findFirstIdx('@');
if(i != -1)
{
KviStr szUserPass = u.left(i);
szUserPass.stripWhiteSpace();
u.cutLeft(i + 1);
i = szUserPass.findFirstIdx(':');
if(i != -1)
{
m_szUser = szUserPass.left(i);
szUserPass.cutLeft(i + 1);
m_szPass = szUserPass;
m_szPass.stripWhiteSpace();
} else {
m_szUser = szUserPass;
}
}
// host
i = u.findFirstIdx('/');
if(i != -1)
{
KviStr h = u.left(i);
u.cutLeft(i + 1);
i = h.findFirstIdx(':');
if(i != -1)
{
// has a port part
m_szHost = h.left(i);
h.cutLeft(i + 1);
h.stripWhiteSpace();
bool bOk;
m_uPort = h.toUInt(&bOk);
if(!bOk)m_uPort = uDefaultPort;
} else {
// no port : assume default
m_szHost = h;
}
m_szPath = u;
} else {
m_szHost = u;
}
m_szHost.stripWhiteSpace();
m_szPath.stripWhiteSpace();
if(!m_szPath.firstCharIs('/'))m_szPath.prepend('/');
}
KviUrl & KviUrl::operator=(const char * szUrl)
{
m_szUrl = szUrl;
parse();
return *this;
}
KviUrl & KviUrl::operator=(const KviUrl &u)
{
m_szUrl = u.m_szUrl;
m_szProtocol = u.m_szProtocol;
m_szHost = u.m_szHost;
m_szPath = u.m_szPath;
m_szUser = u.m_szUser;
m_szPass = u.m_szPass;
m_uPort = u.m_uPort;
return *this;
}