source: filezilla/trunk/fuentes/src/engine/directorylisting.cpp @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 3 years ago

First release to xenial

File size: 4.8 KB
Line 
1#include <filezilla.h>
2
3wxString CDirentry::dump() const
4{
5        wxString str = wxString::Format(_T("name=%s\nsize=%lld\npermissions=%s\nownerGroup=%s\ndir=%d\nlink=%d\ntarget=%s\nunsure=%d\n"),
6                                name, static_cast<long long>(size), *permissions, *ownerGroup, flags & flag_dir, flags & flag_link,
7                                target ? *target : wxString(), flags & flag_unsure);
8
9        if( has_date() ) {
10                str += _T("date=") + time.Format(_T("%Y-%m-%d"), CDateTime::local) + _T("\n");
11        }
12        if( has_time() ) {
13                str += _T("time=") + time.Format(_T("%H-%M-%S"), CDateTime::local) + _T("\n");
14        }
15        return str;
16}
17
18bool CDirentry::operator==(const CDirentry &op) const
19{
20        if (name != op.name)
21                return false;
22
23        if (size != op.size)
24                return false;
25
26        if (permissions != op.permissions)
27                return false;
28
29        if (ownerGroup != op.ownerGroup)
30                return false;
31
32        if (flags != op.flags)
33                return false;
34
35        if( has_date() ) {
36                if (time != op.time)
37                        return false;
38        }
39
40        return true;
41}
42
43void CDirectoryListing::SetCount(unsigned int count)
44{
45        if (count == m_entryCount)
46                return;
47
48        const unsigned int old_count = m_entryCount;
49
50        if (!count)
51        {
52                m_entryCount = 0;
53                return;
54        }
55
56        if (count < old_count)
57        {
58                m_searchmap_case.clear();
59                m_searchmap_nocase.clear();
60        }
61
62        m_entries.Get().resize(count);
63
64        m_entryCount = count;
65}
66
67const CDirentry& CDirectoryListing::operator[](unsigned int index) const
68{
69        // Commented out, too heavy speed penalty
70        // wxASSERT(index < m_entryCount);
71        return *(*m_entries)[index];
72}
73
74CDirentry& CDirectoryListing::operator[](unsigned int index)
75{
76        // Commented out, too heavy speed penalty
77        // wxASSERT(index < m_entryCount);
78        return m_entries.Get()[index].Get();
79}
80
81void CDirectoryListing::Assign(std::deque<CRefcountObject<CDirentry>> &entries)
82{
83        m_entryCount = entries.size();
84
85        std::vector<CRefcountObject<CDirentry> >& own_entries = m_entries.Get();
86        own_entries.clear();
87        own_entries.reserve(m_entryCount);
88
89        m_flags &= ~(listing_has_dirs | listing_has_perms | listing_has_usergroup);
90
91        for (auto & entry : entries) {
92                if (entry->is_dir())
93                        m_flags |= listing_has_dirs;
94                if (!entry->permissions->empty())
95                        m_flags |= listing_has_perms;
96                if (!entry->ownerGroup->empty())
97                        m_flags |= listing_has_usergroup;
98                own_entries.emplace_back(std::move(entry));
99        }
100
101        m_searchmap_case.clear();
102        m_searchmap_nocase.clear();
103}
104
105bool CDirectoryListing::RemoveEntry(unsigned int index)
106{
107        if (index >= GetCount())
108                return false;
109
110        m_searchmap_case.clear();
111        m_searchmap_nocase.clear();
112
113        std::vector<CRefcountObject<CDirentry> >& entries = m_entries.Get();
114        std::vector<CRefcountObject<CDirentry> >::iterator iter = entries.begin() + index;
115        if ((*iter)->is_dir())
116                m_flags |= CDirectoryListing::unsure_dir_removed;
117        else
118                m_flags |= CDirectoryListing::unsure_file_removed;
119        entries.erase(iter);
120
121        --m_entryCount;
122
123        return true;
124}
125
126void CDirectoryListing::GetFilenames(std::vector<fzstring> &names) const
127{
128        names.reserve(GetCount());
129        for (unsigned int i = 0; i < GetCount(); ++i)
130                names.push_back((*m_entries)[i]->name);
131}
132
133int CDirectoryListing::FindFile_CmpCase(const wxString& name) const
134{
135        if (!m_entryCount)
136                return -1;
137
138        if (!m_searchmap_case)
139                m_searchmap_case.Get();
140
141        // Search map
142        auto iter = m_searchmap_case->find(to_fzstring(name));
143        if (iter != m_searchmap_case->end())
144                return iter->second;
145
146        unsigned int i = m_searchmap_case->size();
147        if (i == m_entryCount)
148                return -1;
149
150        auto & searchmap_case = m_searchmap_case.Get();
151
152        // Build map if not yet complete
153        std::vector<CRefcountObject<CDirentry> >::const_iterator entry_iter = m_entries->begin() + i;
154        for (; entry_iter != m_entries->end(); ++entry_iter, ++i) {
155                fzstring const& entry_name = (*entry_iter)->name;
156                searchmap_case.insert(std::pair<fzstring const, unsigned int>(entry_name, i));
157
158                if (entry_name == name)
159                        return i;
160        }
161
162        // Map is complete, item not in it
163        return -1;
164}
165
166int CDirectoryListing::FindFile_CmpNoCase(wxString name) const
167{
168        if (!m_entryCount)
169                return -1;
170
171        if (!m_searchmap_nocase)
172                m_searchmap_nocase.Get();
173
174        name.MakeLower();
175
176        // Search map
177        auto iter = m_searchmap_nocase->find(to_fzstring(name));
178        if (iter != m_searchmap_nocase->end())
179                return iter->second;
180
181        unsigned int i = m_searchmap_nocase->size();
182        if (i == m_entryCount)
183                return -1;
184
185        auto& searchmap_nocase = m_searchmap_nocase.Get();
186
187        // Build map if not yet complete
188        std::vector<CRefcountObject<CDirentry> >::const_iterator entry_iter = m_entries->begin() + i;
189        for (; entry_iter != m_entries->end(); ++entry_iter, ++i) {
190                wxString entry_name = (*entry_iter)->name;
191                entry_name.MakeLower();
192                searchmap_nocase.insert(std::pair<fzstring const, unsigned int>(to_fzstring(entry_name), i));
193
194                if (entry_name == name)
195                        return i;
196        }
197
198        // Map is complete, item not in it
199        return -1;
200}
201
202void CDirectoryListing::ClearFindMap()
203{
204        if (!m_searchmap_case)
205                return;
206
207        m_searchmap_case.clear();
208        m_searchmap_nocase.clear();
209}
Note: See TracBrowser for help on using the repository browser.