Switch to unified view

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_ */