|
a/dirbrowser/rreaper.h |
|
b/dirbrowser/rreaper.h |
|
... |
|
... |
35 |
Q_OBJECT;
|
35 |
Q_OBJECT;
|
36 |
|
36 |
|
37 |
public:
|
37 |
public:
|
38 |
RecursiveReaper(UPnPClient::CDSH server, std::string objid,
|
38 |
RecursiveReaper(UPnPClient::CDSH server, std::string objid,
|
39 |
QObject *parent = 0)
|
39 |
QObject *parent = 0)
|
40 |
: QThread(parent), m_serv(server)
|
40 |
: QThread(parent), m_serv(server), m_cancel(false)
|
41 |
{
|
41 |
{
|
42 |
m_ctobjids.push(objid);
|
42 |
m_ctobjids.push(objid);
|
43 |
m_allctobjids.insert(objid);
|
43 |
m_allctobjids.insert(objid);
|
44 |
}
|
44 |
}
|
45 |
|
45 |
|
|
... |
|
... |
47 |
{
|
47 |
{
|
48 |
}
|
48 |
}
|
49 |
|
49 |
|
50 |
virtual void run() {
|
50 |
virtual void run() {
|
51 |
qDebug() << "RecursiveReaper::run";
|
51 |
qDebug() << "RecursiveReaper::run";
|
52 |
m_slices.push_back(new UPnPClient::UPnPDirContent());
|
|
|
53 |
m_status = UPNP_E_SUCCESS;
|
52 |
m_status = UPNP_E_SUCCESS;
|
54 |
while (!m_ctobjids.empty()) {
|
53 |
while (!m_ctobjids.empty()) {
|
|
|
54 |
if (m_cancel) {
|
|
|
55 |
qDebug() << "RecursiveReaper:: cancelled";
|
|
|
56 |
break;
|
|
|
57 |
}
|
55 |
// We don't stop on a container scan error, minimserver for one
|
58 |
// We don't stop on a container scan error, minimserver for one
|
56 |
// sometimes has dialog hiccups with libupnp, this is not fatal.
|
59 |
// sometimes has dialog hiccups with libupnp, this is not fatal.
|
57 |
scanContainer(m_ctobjids.front());
|
60 |
scanContainer(m_ctobjids.front());
|
58 |
m_ctobjids.pop();
|
61 |
m_ctobjids.pop();
|
59 |
}
|
62 |
}
|
60 |
if (!m_slices.empty() && !m_slices.back()->m_items.empty()) {
|
|
|
61 |
emit sliceAvailable(&*m_slices.back());
|
|
|
62 |
}
|
|
|
63 |
|
|
|
64 |
emit done(m_status);
|
63 |
emit done(m_status);
|
65 |
qDebug() << "RecursiveReaper::done";
|
64 |
qDebug() << "RecursiveReaper::done";
|
66 |
}
|
65 |
}
|
67 |
|
66 |
|
|
|
67 |
void setCancel() {
|
|
|
68 |
m_cancel = true;
|
|
|
69 |
}
|
|
|
70 |
|
68 |
signals:
|
71 |
signals:
|
69 |
void sliceAvailable(const UPnPClient::UPnPDirContent*);
|
72 |
void sliceAvailable(UPnPClient::UPnPDirContent*);
|
70 |
void done(int);
|
73 |
void done(int);
|
71 |
|
74 |
|
72 |
private:
|
75 |
private:
|
73 |
|
76 |
|
74 |
virtual bool scanContainer(const std::string& objid) {
|
77 |
virtual bool scanContainer(const std::string& objid) {
|
|
... |
|
... |
78 |
int toread = 20; // read small count the first time
|
81 |
int toread = 20; // read small count the first time
|
79 |
int total = 1000;// Updated on first read.
|
82 |
int total = 1000;// Updated on first read.
|
80 |
int count;
|
83 |
int count;
|
81 |
|
84 |
|
82 |
while (offset < total) {
|
85 |
while (offset < total) {
|
|
|
86 |
if (m_cancel) {
|
|
|
87 |
qDebug() << "RecursiveReaper:: cancelled";
|
|
|
88 |
break;
|
|
|
89 |
}
|
83 |
UPnPClient::UPnPDirContent& slice = *m_slices.back();
|
90 |
UPnPClient::UPnPDirContent& slice =
|
|
|
91 |
*(new UPnPClient::UPnPDirContent());
|
84 |
|
92 |
|
85 |
unsigned int lastctidx = slice.m_containers.size();
|
93 |
unsigned int lastctidx = slice.m_containers.size();
|
86 |
|
94 |
|
87 |
// Read entries
|
95 |
// Read entries
|
88 |
m_status = m_serv->readDirSlice(objid, offset, toread,
|
96 |
m_status = m_serv->readDirSlice(objid, offset, toread,
|
|
... |
|
... |
117 |
// Make items available
|
125 |
// Make items available
|
118 |
if (!slice.m_items.empty()) {
|
126 |
if (!slice.m_items.empty()) {
|
119 |
qDebug() << "RecursiveReaper::scanCT got " <<
|
127 |
qDebug() << "RecursiveReaper::scanCT got " <<
|
120 |
slice.m_items.size() << " items";
|
128 |
slice.m_items.size() << " items";
|
121 |
emit sliceAvailable(&slice);
|
129 |
emit sliceAvailable(&slice);
|
122 |
m_slices.push_back(new UPnPClient::UPnPDirContent());
|
|
|
123 |
}
|
130 |
}
|
124 |
toread = m_serv->goodSliceSize();
|
131 |
toread = m_serv->goodSliceSize();
|
125 |
}
|
132 |
}
|
126 |
|
133 |
|
127 |
return true;
|
134 |
return true;
|
|
... |
|
... |
129 |
|
136 |
|
130 |
UPnPClient::CDSH m_serv;
|
137 |
UPnPClient::CDSH m_serv;
|
131 |
std::queue<std::string> m_ctobjids;
|
138 |
std::queue<std::string> m_ctobjids;
|
132 |
std::unordered_set<std::string> m_allctobjids;
|
139 |
std::unordered_set<std::string> m_allctobjids;
|
133 |
int m_status;
|
140 |
int m_status;
|
134 |
|
141 |
bool m_cancel;
|
135 |
public:
|
|
|
136 |
// We use a list (vs vector) so that existing element addresses
|
|
|
137 |
// are unchanged when we append
|
|
|
138 |
std::list<UPnPClient::UPnPDirContent*> m_slices;
|
|
|
139 |
};
|
142 |
};
|
140 |
|
143 |
|
141 |
#endif /* _RREAPER_H_INCLUDED_ */
|
144 |
#endif /* _RREAPER_H_INCLUDED_ */
|