/* ============================================================================
* Douglas Thrift's Search Engine License
*
* Copyright (C) 2002-2004, Douglas Thrift. All Rights Reserved.
* 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.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowledgment:
*
* "This product includes software developed by Douglas Thrift
* (http://computers.douglasthrift.net/searchengine/)."
*
* Alternately, this acknowledgment may appear in the software itself, if
* and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Douglas Thrift" and "Douglas Thrift's Search Engine" must not
* be used to endorse or promote products derived from this software without
* specific prior written permission. For written permission, please visit
* http://www.douglasthrift.net/contact.cgi for contact information.
*
* 5. Products derived from this software may not be called "Douglas Thrift's
* Search Engine", nor may "Douglas Thrift's Search Engine" appear in their
* name, without prior written permission.
*
* THIS SOFTWARE IS PROVIDED "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 THE
* COPYRIGHT OWNER 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.
* ============================================================================
*/
// Douglas Thrift's Search Engine Page
//
// Douglas Thrift
//
// $Id$
#include "Page.hpp"
istream& operator>>(istream& is, Page& data)
{
string line;
#ifdef _OpenSSL_
bool set = false;
#endif
getline(is, line);
if (line == " ")
{
do
{
getline(is, line);
if (line.find(" ") == 0)
{
unsigned start = line.find("") + 9;
unsigned finish = line.find("", start);
string address = line.substr(start, finish - start);
entities(address, "<", '<');
entities(address, ">", '>');
entities(address, "&", '&');
data.setAddress(address);
}
else if (line.find(" ") == 0)
{
unsigned start = line.find("") + 6;
unsigned finish = line.find("", start);
istringstream buffer(line.substr(start, finish - start));
unsigned port;
buffer >> port;
data.setPort(port);
#ifdef _OpenSSL_
set = true;
#endif
}
#ifdef _OpenSSL_
else if (line.find(" ") == 0)
{
unsigned start = line.find("") + 5;
unsigned finish = line.find("", start);
istringstream buffer(line.substr(start, finish - start));
bool tls;
buffer.setf(ios_base::boolalpha);
buffer >> tls;
data.setTls(tls);
if (!set && tls) data.setPort(443);
}
#endif
else if (line.find(" ") == 0)
{
unsigned start = line.find("") + 6;
unsigned finish = line.find("", start);
string path = line.substr(start, finish - start);
entities(path, "<", '<');
entities(path, ">", '>');
entities(path, "&", '&');
data.setPath(path);
}
else if (line.find(" ") == 0)
{
unsigned start = line.find("") + 6;
unsigned finish = line.find("", start);
istringstream buffer(line.substr(start, finish - start));
unsigned size;
buffer >> size;
data.setSize(size);
}
else if (line.find(" ") == 0)
{
unsigned start = line.find("") + 7;
unsigned finish = line.find("", start);
string title = line.substr(start, finish - start);
while (finish == string::npos)
{
getline(is, line);
finish = line.find("");
title += '\n' + line.substr(0, finish - 0);
}
entities(title, "<", '<');
entities(title, ">", '>');
entities(title, "&", '&');
data.setTitle(title);
}
else if (line.find(" ") == 0)
{
unsigned start = line.find("") + 13;
unsigned finish = line.find("", start);
string description = line.substr(start, finish - start);
entities(description, "<", '<');
entities(description, ">", '>');
entities(description, "&", '&');
data.setDescription(description);
}
else if (line.find(" ") == 0)
{
unsigned start = line.find("") + 6;
unsigned finish = line.find("", start);
string text = line.substr(start, finish - start);
while (finish == string::npos)
{
getline(is, line);
finish = line.find("");
text += '\n' + line.substr(0, finish - 0);
}
entities(text, "<", '<');
entities(text, ">", '>');
entities(text, "&", '&');
data.setText(text);
}
else if (line.find(" ") == 0)
{
unsigned start = line.find("") + 9;
unsigned finish = line.find("", start);
string heading = line.substr(start, finish - start);
while (finish == string::npos)
{
getline(is, line);
finish = line.find("");
heading += line.substr(0, finish - 0);
}
entities(heading, "<", '<');
entities(heading, ">", '>');
entities(heading, "&", '&');
data.headings.push_back(heading);
}
}
while (line != " ");
}
return is;
}
ostream& operator<<(ostream& os, Page& data)
{
string address(data.getAddress());
entities(address, '&', "&");
entities(address, '<', "<");
entities(address, '>', ">");
os << "\t\n" << "\t\t" << address << "\n";
#ifndef _OpenSSL_
if (data.getPort() != 80)
#else
if ((data.getPort() != 80 && !data.getTls()) || (data.getPort() != 443 &&
data.getTls()))
#endif
{
os << "\t\t" << data.getPort() << "\n";
}
#ifdef _OpenSSL_
os.setf(ios::boolalpha);
os << "\t\t" << data.getTls() << "\n";
#endif
string path(data.getPath());
entities(path, '&', "&");
entities(path, '<', "<");
entities(path, '>', ">");
os << "\t\t" << path << "\n\t\t" << data.getSize()
<< "\n";
if(!data.getTitle().empty())
{
string title(data.getTitle());
entities(title, '&', "&");
entities(title, '<', "<");
entities(title, '>', ">");
os << "\t\t" << title << "\n";
}
if(!data.getDescription().empty())
{
string description(data.getDescription());
entities(description, '&', "&");
entities(description, '<', "<");
entities(description, '>', ">");
os << "\t\t" << description << "\n";
}
string text(data.getText());
entities(text, '&', "&");
entities(text, '<', "<");
entities(text, '>', ">");
os << "\t\t" << text << "\n";
for (size_t index(0); index < data.getHeadings().size(); index++)
{
string heading(data.getHeadings()[index]);
entities(heading, '&', "&");
entities(heading, '<', "<");
entities(heading, '>', ">");
os << "\t\t" << heading << "\n";
}
os << "\t";
return os;
}