File: queueloader.cpp

package info (click to toggle)
newsbeuter 2.8-2%2Bdeb8u2
  • links: PTS
  • area: main
  • in suites: jessie
  • size: 2,776 kB
  • ctags: 2,323
  • sloc: cpp: 18,133; ruby: 1,796; xml: 350; makefile: 199; sh: 198; perl: 98
file content (142 lines) | stat: -rw-r--r-- 3,993 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stflpp.h>
#include <utils.h>
#include <queueloader.h>
#include <cstdlib>
#include <logger.h>
#include <fstream>
#include <cstring>
#include <config.h>
#include <libgen.h>

#include <unistd.h>

using namespace newsbeuter;

namespace podbeuter {

queueloader::queueloader(const std::string& file, pb_controller * c) : queuefile(file), ctrl(c) {
}

void queueloader::reload(std::vector<download>& downloads, bool remove_unplayed) {
	std::vector<download> dltemp;
	std::fstream f;

	if (downloads.size() > 0) {
		for (std::vector<download>::iterator it=downloads.begin();it!=downloads.end();++it) {
			if (it->status() == DL_DOWNLOADING) { // we are not allowed to reload if a download is in progress!
				LOG(LOG_INFO, "queueloader::reload: aborting reload due to DL_DOWNLOADING status");
				return;
			}
			switch (it->status()) {
				case DL_QUEUED:
				case DL_CANCELLED:
				case DL_FAILED:
				case DL_ALREADY_DOWNLOADED:
				case DL_READY:
					LOG(LOG_DEBUG, "queueloader::reload: storing %s to new vector", it->url());
					dltemp.push_back(*it);
					break;
				case DL_PLAYED:
				case DL_FINISHED:
					if (!remove_unplayed) {
						LOG(LOG_DEBUG, "queueloader::reload: storing %s to new vector", it->url());
						dltemp.push_back(*it);
					}
					break;
				default:
					break;
			}
		}
	}

	f.open(queuefile.c_str(), std::fstream::in);
	if (f.is_open()) {
		std::string line;
		do {
			getline(f, line);
			if (!f.eof() && line.length() > 0) {
				LOG(LOG_DEBUG, "queueloader::reload: loaded `%s' from queue file", line.c_str());
				std::vector<std::string> fields = utils::tokenize_quoted(line);
				bool url_found = false;
				if (!dltemp.empty()) {
					for (std::vector<download>::iterator it=dltemp.begin();it!=dltemp.end();++it) {
						if (fields[0] == it->url()) {
							LOG(LOG_INFO, "queueloader::reload: found `%s' in old vector", fields[0].c_str());
							url_found = true;
							break;
						}
					}
				}
				if (!downloads.empty()) {
					for (std::vector<download>::iterator it=downloads.begin();it!=downloads.end();++it) {
						if (fields[0] == it->url()) {
							LOG(LOG_INFO, "queueloader::reload: found `%s' in new vector", line.c_str());
							url_found = true;
							break;
						}
					}
				}
				if (!url_found) {
					LOG(LOG_INFO, "queueloader::reload: found `%s' nowhere -> storing to new vector", line.c_str());
					download d(ctrl);
					std::string fn;
					if (fields.size() == 1)
						fn = get_filename(fields[0]);
					else
						fn = fields[1];
					d.set_filename(fn);
					if (access(fn.c_str(), F_OK)==0) {
						LOG(LOG_INFO, "queueloader::reload: found `%s' on file system -> mark as already downloaded", fn.c_str());
						if (fields.size() >= 3) {
							if (fields[2] == "downloaded")
								d.set_status(DL_READY);
							if (fields[2] == "played")
								d.set_status(DL_PLAYED);
						}
						else
							d.set_status(DL_ALREADY_DOWNLOADED); // TODO: scrap DL_ALREADY_DOWNLOADED state
					}
					d.set_url(fields[0]);
					dltemp.push_back(d);
				}
			}
		} while (!f.eof());
		f.close();
	}

	f.open(queuefile.c_str(), std::fstream::out);
	if (f.is_open()) {
		for (std::vector<download>::iterator it=dltemp.begin();it!=dltemp.end();++it) {
			f << it->url() << " " << stfl::quote(it->filename());
			if (it->status() == DL_READY)
				f << " downloaded";
			if (it->status() == DL_PLAYED)
				f << " played";
			f << std::endl;
		}
		f.close();
	}

	downloads = dltemp;
}

std::string queueloader::get_filename(const std::string& str) {
	std::string fn = ctrl->get_dlpath();

	if (fn[fn.length()-1] != NEWSBEUTER_PATH_SEP[0])
		fn.append(NEWSBEUTER_PATH_SEP);
	char buf[1024];
	snprintf(buf, sizeof(buf), "%s", str.c_str());
	char * base = basename(buf);
	if (!base || strlen(base) == 0) {
		char lbuf[128];
		time_t t = time(NULL);
		strftime(lbuf, sizeof(lbuf), "%Y-%b-%d-%H%M%S.unknown", localtime(&t));
		fn.append(lbuf);
	} else {
		fn.append(utils::replace_all(base, "'", "%27"));
	}
	return fn;
}

}