Develop and Download Open Source Software

Browse CVS Repository

Contents of /tombo/Tombo/Src/VFManager.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.4 - (show annotations) (download) (as text)
Sun Sep 18 06:45:40 2005 UTC (18 years, 6 months ago) by hirami
Branch: MAIN
CVS Tags: Tombo_2_0a3, Tombo_1_17_1, B191, B192, B193, B194, B196, B197, B198, B199, B200, B201, B202, B203, B205, B206, B207, B208, B187, B186, B189, B188, B213, B212, B211, B217, B216, B215, B214, B219, B218, Tombo_2_0b2, Tombo_2_0b3, Tombo_2_0b1, Tombo_2_0b4, B228, B229, B226, B227, B224, B225, B222, B223, B220, B221, SNAPSHOT20051220, B231, B230, Tombo_1_15, Tombo_1_17, Tombo_1_16, HEAD
Branch point for: Tombo_1_17_1_branch
Changes since 1.3: +1 -1 lines
File MIME type: text/x-c++src
* Change value format note path to uri at virtual folder's "Filter settings" source tab.
* FIX: Encrypted not is not checked on vfolder

- replace VFolder directory scan implementation.

1 #include <windows.h>
2 #include <tchar.h>
3 #include "Message.h"
4 #include "VarBuffer.h"
5 #include "VFManager.h"
6 #include "VFStream.h"
7 #include "PasswordManager.h"
8 #include "Tombo.h"
9 #include "UniConv.h"
10 #include "TString.h"
11 #include "TSParser.h"
12 #include "File.h"
13
14 /////////////////////////////////////////////
15 // ctor & dtor
16 /////////////////////////////////////////////
17
18 VFManager::VFManager() : nGrepCount(0)
19 {
20 }
21
22 VFManager::~VFManager()
23 {
24 ClearInfo();
25 }
26
27 BOOL VFManager::Init()
28 {
29 return vbInfo.Init(5,5);
30 }
31
32 void VFManager::ClearInfo()
33 {
34 // delete vbInfo's items memory
35 DWORD n = vbInfo.NumItems();
36 VFInfo *p;
37 for (DWORD i = 0; i < n; i++) {
38 p = vbInfo.GetUnit(i);
39 p->Release();
40 }
41 vbInfo.Clear(FALSE);
42 }
43
44 /////////////////////////////////////////////
45 // Create stream from VFInfo
46 /////////////////////////////////////////////
47
48 BOOL VFManager::StreamObjectsFactory(const VFInfo *pInfo, VFDirectoryGenerator **ppGen, VFStore **ppStore)
49 {
50 *ppGen = (VFDirectoryGenerator*)pInfo->pGenerator->Clone(ppStore);
51 return *ppGen != NULL;
52 }
53
54 /////////////////////////////////////////////
55 // Get VFInfo
56 /////////////////////////////////////////////
57
58 const VFInfo *VFManager::GetGrepVFInfo(LPCTSTR pPath, LPCTSTR pRegex,
59 BOOL bIsCaseSensitive, BOOL bCheckCrypt, BOOL bCheckFileName, BOOL bNegate)
60 {
61 if (pPath == NULL || pRegex == NULL) {
62 SetLastError(ERROR_INVALID_DATA);
63 return NULL;
64 }
65 VFInfo vInfo;
66
67 // Create template stream
68 VFDirectoryGenerator *pGen = new VFDirectoryGenerator();
69 VFStore *pStore = new VFStore();
70 VFRegexFilter *pFilter = new VFRegexFilter();
71 if (!pGen || !pStore || !pFilter) {
72 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
73 delete pGen;
74 delete pStore;
75 delete pFilter;
76 return NULL;
77 }
78 if (!pGen->Init(pPath, bCheckCrypt) ||
79 !pFilter->Init(pRegex, bIsCaseSensitive, bCheckCrypt, bCheckFileName, bNegate, g_pPasswordManager) ||
80 !pStore->Init()) {
81 delete pGen;
82 delete pStore;
83 delete pFilter;
84 return NULL;
85 }
86
87 pGen->SetNext(pFilter); pFilter->SetNext(pStore); //link objects
88 vInfo.bPersist = FALSE;
89 vInfo.pGenerator = pGen;
90 vInfo.pStore = pStore;
91
92 vInfo.pName = GetNodeName();
93 if (vInfo.pName == NULL) return NULL;
94
95 // Regist data
96 if (!vbInfo.Add(&vInfo)) return FALSE;
97 DWORD n = vbInfo.NumItems();
98 VFInfo *q = vbInfo.GetUnit(n - 1);
99
100 return q;
101 }
102
103 /////////////////////////////////////////////
104 // Enum vfolders
105 /////////////////////////////////////////////
106
107 BOOL VFManager::Enum(VirtualFolderEnumListener *pListener)
108 {
109 VFInfo *pInfo;
110 VFDirectoryGenerator *pGen;
111 VFStore *pStore;
112
113 /// Add virtual folders.
114 TCHAR buf[MAX_PATH + 1];
115 TCHAR buf2[MAX_PATH + 1];
116 GetModuleFileName(NULL, buf, MAX_PATH);
117 GetFilePath(buf2, buf);
118
119 TString sVFpath;
120 if (!sVFpath.Join(buf2, TOMBO_VFOLDER_DEF_FILE)) return FALSE;
121
122 TSParser tp;
123 tp.Parse(sVFpath.Get(), pListener);
124
125 // Enum temporary vfolders
126 DWORD n = vbInfo.NumItems();
127 for (DWORD i = 0; i < n; i++) {
128 pInfo = vbInfo.GetUnit(i);
129 if (!StreamObjectsFactory(pInfo, &pGen, &pStore)) return FALSE;
130 if (!pListener->ProcessStream(pInfo->pName, FALSE, pGen, pStore)) break;
131 }
132 return TRUE;
133 }
134
135 BOOL VFManager::RetrieveInfo(const VFInfo *pInfo, VirtualFolderEnumListener *pListener)
136 {
137 VFDirectoryGenerator *pGen;
138 VFStore *pStore;
139 if (!StreamObjectsFactory(pInfo, &pGen, &pStore)) return FALSE;
140 pListener->ProcessStream(pInfo->pName, pInfo->bPersist, pGen, pStore);
141 return TRUE;
142 }
143
144 /////////////////////////////////////////////
145 // Update vfolders
146 /////////////////////////////////////////////
147
148 BOOL VFManager::UpdateVirtualFolders(VFInfo **ppInfo, DWORD nNumFolders)
149 {
150 // Create tmp file
151 TCHAR buf[MAX_PATH + 1];
152 TCHAR buf2[MAX_PATH + 1];
153 GetModuleFileName(NULL, buf, MAX_PATH);
154 GetFilePath(buf2, buf);
155
156 TString sVFpathTmp, sVFpath;
157 if (!sVFpath.Join(buf2, TOMBO_VFOLDER_DEF_FILE)) return FALSE;
158 if (!sVFpathTmp.Join(buf2, TOMBO_VFOLDER_DEF_FILE, TEXT(".tmp"))) return FALSE;
159 File fNewVFDef;
160 if (!fNewVFDef.Open(sVFpathTmp.Get(), GENERIC_WRITE, FILE_SHARE_WRITE, CREATE_ALWAYS)) return FALSE;
161
162 // prepare headers
163 LPCWSTR pHeader =
164 L"<?xml version='1.0' encoding='UTF-16'?>\n"
165 L"<!DOCTYPE folders SYSTEM \"TOMBO_vfolder.dtd\">\n"
166 L"<folders>\n";
167
168 if (!fNewVFDef.WriteUnicodeString(pHeader)) return FALSE;
169
170 ClearInfo();
171
172 // save virtual folder defs
173 DWORD i;
174 VFInfo *p;
175 for (i = 0; i < nNumFolders; i++) {
176 p = ppInfo[i];
177 if (p->bPersist) {
178 if (!p->WriteXML(&fNewVFDef)) return FALSE;
179 } else {
180 vbInfo.Add(p);
181 p->pGenerator = NULL;
182 p->pName = NULL;
183 }
184 }
185
186 // output footer
187 if (!fNewVFDef.WriteUnicodeString(L"</folders>\n")) return FALSE;
188 fNewVFDef.Close();
189
190 // replace def file
191 DeleteFile(sVFpath.Get());
192 MoveFile(sVFpathTmp.Get(), sVFpath.Get());
193 return TRUE;
194 }
195
196 /////////////////////////////////////////////
197 // Assign name to node
198 /////////////////////////////////////////////
199
200 LPTSTR VFManager::GetNodeName()
201 {
202 LPTSTR pName;
203 pName = new TCHAR[_tcslen(MSG_GREP_NONAME_LABEL) + 10];
204 if (pName == NULL) {
205 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
206 return NULL;
207 }
208 wsprintf(pName, TEXT("%s%03d"), MSG_GREP_NONAME_LABEL, ++nGrepCount);
209 return pName;
210 }
211
212 /////////////////////////////////////////////
213 // VirtualFolderEnumListener implimentation
214 /////////////////////////////////////////////
215
216 VirtualFolderEnumListener::~VirtualFolderEnumListener()
217 {
218 }
219
220 /////////////////////////////////////////////
221 // VFInfo implimentation
222 /////////////////////////////////////////////
223
224 void VFInfo::Release()
225 {
226 delete[] pName;
227 if(pGenerator) pGenerator->FreeObject();
228 }
229
230 /////////////////////////////////////////////
231 // Output XML
232 /////////////////////////////////////////////
233
234 BOOL VFInfo::WriteXML(File *p)
235 {
236 if (pName == NULL) {
237 SetLastError(ERROR_INVALID_DATA);
238 return FALSE;
239 }
240
241 LPWSTR pNameW = ConvTCharToWChar(pName);
242
243 if (!p->WriteUnicodeString(L"<vfolder name=\"") ||
244 !p->Write((LPBYTE)pNameW, wcslen(pNameW) * sizeof(WCHAR)) ||
245 !p->WriteUnicodeString(L"\">\n")) {
246 delete [] pNameW;
247 return FALSE;
248 }
249 delete [] pNameW;
250
251 if (!pGenerator->GenerateXMLOpenTag(p)) return FALSE;
252 if (!pGenerator->GenerateXMLCloseTag(p)) return FALSE;
253
254 if (!p->WriteUnicodeString(L"</vfolder>\n")) return FALSE;
255 return TRUE;
256 }
257
258 /////////////////////////////////////////////
259 // Clone VFInfo
260 /////////////////////////////////////////////
261
262 VFInfo *VFInfo::Clone()
263 {
264 VFInfo *pNew = new VFInfo();
265 if (pNew == NULL) return NULL;
266
267 pNew->pGenerator = (VFDirectoryGenerator*)pGenerator->Clone(&(pNew->pStore));
268 if (pNew->pGenerator == NULL) return NULL;
269
270 pNew->bPersist = bPersist;
271 pNew->pName = StringDup(pName);
272 if (pNew->pName == NULL) {
273 pNew->Release();
274 delete pNew;
275 return NULL;
276 }
277 return pNew;
278 }
279

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26