/* ============================================================================ * 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("<title>") + 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; }