2 * Copyright (C) 2009 by Aiwota Programmer
3 * aiwotaprog@tetteke.tk
5 * This file is part of Dialektos.
7 * Dialektos is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * Dialektos is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Dialektos. If not, see <http://www.gnu.org/licenses/>.
21 #include "thread_window.hxx"
23 #include <glibmm/convert.h>
24 #include <boost/date_time/posix_time/posix_time.hpp>
25 #include <boost/filesystem.hpp>
28 #include "bbs_detail_base.hxx"
29 #include "thread_idx.hxx"
30 #include "http_get.hxx"
36 void ThreadWindow::create(std::auto_ptr<bbs_detail::Base> bbs) {
37 regist(new ThreadWindow(bbs));
40 ThreadWindow::ThreadWindow(std::auto_ptr<bbs_detail::Base> bbs) :
43 scrolled_(text_view_.get_adjustment()),
44 bbs_(bbs), http_getter_(), idx_() {
46 set_default_size(400,300);
48 scrolled_.add(text_view_);
51 text_view_.signal_button_press_event().connect_notify(
52 sigc::mem_fun(*this, &ThreadWindow::on_child_button_press));
59 bool ThreadWindow::load() {
60 using namespace boost::posix_time;
61 ptime start = microsec_clock::local_time();
65 bbs_->load_thread(text_view_);
66 text_view_.relayout();
67 text_view_.queue_draw();
70 to_simple_string(microsec_clock::local_time() - start) << std::endl;
72 idx_ = ThreadIdx::from_xml(bbs_->get_thread_idx_path());
78 bool ThreadWindow::is_same(const bbs_detail::Base& bbs) const {
79 const bbs_detail::Base& lhs = *bbs_;
83 void ThreadWindow::on_action_view_refresh() {
84 if (http_getter_) return;
86 statusbar_.push("HTTP/1.0 GET...");
88 const std::string uri = bbs_->get_thread_dat_uri();
89 http::Header request_header = bbs_->get_thread_dat_request_header();
90 if (request_header.find("Range") != request_header.end()) {
91 if (!idx_.last_modified_.empty())
92 request_header.insert(
93 std::make_pair("If-Modified-Since", idx_.last_modified_));
94 if (!idx_.etag_.empty())
95 request_header.insert(std::make_pair("If-None-Match", idx_.etag_));
98 http_getter_.reset(new http::GetInThread(uri, request_header));
99 http_getter_->signal_end().connect(
100 sigc::mem_fun(*this, &ThreadWindow::on_http_get_end));
104 void ThreadWindow::on_http_get_end(bool success) {
105 // const std::string uri = http_getter_->get_uri();
106 // const http::Header request_header = http_getter_->get_request_header();
107 const http::Response response = http_getter_->get_response();
108 http_getter_.reset(0);
109 on_refresh_end(response.get_status_line(), response.get_header());
111 const int code = response.get_status_line().get_code();
112 if (code != 200 && code != 206) return;
114 bbs_->load_thread_from_string(response.get_content(), text_view_);
115 text_view_.relayout();
116 text_view_.queue_draw();
118 save_content(response);
121 void ThreadWindow::on_refresh_end(const http::StatusLine& status,
122 const http::Header& header) {
123 std::string message = status.get_line();
124 http::Header::const_iterator it = header.find("Last-Modified");
125 if (it != header.end()) {
127 message += it->second;
129 statusbar_.push(message);
132 void ThreadWindow::save_content(const http::Response& response) {
133 const int code = response.get_status_line().get_code();
134 if (code != 200 && code != 206) return;
136 std::ofstream ofs(bbs_->get_thread_file_path().c_str(),
138 std::ios::out | std::ios::trunc : std::ios::out | std::ios::app);
139 ofs << response.get_content();
143 idx_.title_ = bbs_->get_title_from_string(response.get_content());
145 http::Header::const_iterator it = response.get_header().find("Last-Modified");
146 if (it != response.get_header().end()) idx_.last_modified_ = it->second;
147 it = response.get_header().find("ETag");
148 if (it != response.get_header().end()) idx_.etag_ = it->second;
150 idx_.line_count_ = text_view_.get_res_num();
152 idx_.to_xml(boost::filesystem::path(bbs_->get_thread_idx_path()));
156 } // namespace dialektos