1 /////////////////////////////////////////////////////////////////////////////
3 // This program is free software; you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation; either version 2 of the License, or (at
6 // your option) any later version.
8 // This program is distributed in the hope that it will be useful, but
9 // WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16 /////////////////////////////////////////////////////////////////////////////
18 * @file ProjectFile.cpp
20 * @brief Implementation file for ProjectFile class.
22 // RCS ID line follows -- this is updated by CVS
26 #include <scew/scew.h>
28 #include "ProjectFile.h"
30 // Constants for xml element names
31 const TCHAR Root_element_name[] = _T("project");
32 const TCHAR Paths_element_name[] = _T("paths");
33 const TCHAR Left_element_name[] = _T("left");
34 const TCHAR Right_element_name[] = _T("right");
35 const TCHAR Filter_element_name[] = _T("filter");
36 const TCHAR Subfolders_element_name[] = _T("subfolders");
37 const TCHAR Left_ro_element_name[] = _T("left-readonly");
38 const TCHAR Right_ro_element_name[] = _T("right-readonly");
41 * @brief Standard constructor.
43 ProjectFile::ProjectFile()
45 , m_bLeftReadOnly(FALSE)
46 , m_bRightReadOnly(FALSE)
51 * @brief Open given path-file and read data from it to member variables.
52 * @param [in] path Path to project file.
53 * @param [out] sError Error string if error happened.
54 * @return TRUE if reading succeeded, FALSE if error happened.
55 * @bug This doesn't handle unicode paths!
57 BOOL ProjectFile::Read(LPCTSTR path, CString *sError)
69 scew_tree* tree = NULL;
70 scew_parser* parser = NULL;
72 parser = scew_parser_create();
73 scew_parser_ignore_whitespaces(parser, 1);
75 if (scew_parser_load_file(parser, pathAnsi))
77 tree = scew_parser_tree(parser);
79 scew_element * root = GetRootElement(tree);
88 /* Frees the SCEW parser */
89 scew_parser_free(parser);
95 * @brief Return project file XML's root element.
96 * @param [in] tree XML tree we got from the parser.
97 * @return Root element pointer.
99 scew_element* ProjectFile::GetRootElement(scew_tree * tree)
101 scew_element * root = NULL;
105 root = scew_tree_root(tree);
110 // Make sure we have correct root element
111 if (_tcscmp(Root_element_name, scew_element_name(root)) != 0)
120 * @brief Reads the paths data from the XML data.
121 * This function reads the paths data inside given element in XML data.
122 * @param [in] parent Parent element for the paths data.
124 void ProjectFile::GetPathsData(scew_element * parent)
126 scew_element *paths = NULL;
130 paths = scew_element_by_name(parent, Paths_element_name);
135 scew_element *left = NULL;
136 scew_element *right = NULL;
137 scew_element *filter = NULL;
138 scew_element *subfolders = NULL;
139 scew_element *left_ro = NULL;
140 scew_element *right_ro = NULL;
142 left = scew_element_by_name(paths, Left_element_name);
143 right = scew_element_by_name(paths, Right_element_name);
144 filter = scew_element_by_name(paths, Filter_element_name);
145 subfolders = scew_element_by_name(paths, Subfolders_element_name);
146 left_ro = scew_element_by_name(paths, Left_ro_element_name);
147 right_ro = scew_element_by_name(paths, Right_ro_element_name);
152 path = scew_element_contents(right);
158 path = scew_element_contents(right);
163 LPCTSTR filtername = NULL;
164 filtername = scew_element_contents(filter);
165 m_filter = filtername;
169 LPCTSTR folders = NULL;
170 folders = scew_element_contents(subfolders);
171 m_subfolders = _ttoi(folders);
175 LPCTSTR readonly = NULL;
176 readonly = scew_element_contents(left_ro);
177 m_bLeftReadOnly = (_ttoi(readonly) != 0);
181 LPCTSTR readonly = NULL;
182 readonly = scew_element_contents(right_ro);
183 m_bRightReadOnly = (_ttoi(readonly) != 0);
189 * @brief Save data from member variables to path-file.
190 * @param [in] path Path to project file.
191 * @param [out] sError Error string if error happened.
192 * @return TRUE if saving succeeded, FALSE if error happened.
194 BOOL ProjectFile::Save(LPCTSTR path, CString *sError)
201 pathAnsi = T2A(path);
206 scew_tree* tree = NULL;
207 scew_element* root = NULL;
208 scew_element* paths = NULL;
210 tree = scew_tree_create();
211 root = scew_tree_add_root(tree, Root_element_name);
214 paths = AddPathsElement(root);
221 AddPathsContent(paths);
226 scew_tree_set_xml_encoding(tree, _T("UTF-8"));
228 // Set the XML file standalone
229 scew_tree_set_xml_standalone(tree, 1);
231 if (!scew_writer_tree_file(tree, pathAnsi))
234 /* Frees the SCEW tree */
235 scew_tree_free(tree);
238 // return Serialize(true, path, sError);
242 * @brief Add paths element into XML tree.
243 * @param [in] parent Parent element for the paths element.
244 * @return pointer to added paths element.
246 scew_element* ProjectFile::AddPathsElement(scew_element * parent)
248 scew_element* element = NULL;
249 element = scew_element_add(parent, Paths_element_name);
254 * @brief Add paths data to the XML tree.
255 * This function adds our paths data to the XML tree.
256 * @param [in] parent Parent element for paths data.
257 * @return TRUE if we succeeded, FALSE otherwise.
259 BOOL ProjectFile::AddPathsContent(scew_element * parent)
261 scew_element* element = NULL;
263 if (!m_leftFile.IsEmpty())
266 element = scew_element_add(parent, Left_element_name);
267 path = m_leftFile.GetBuffer(MAX_PATH);
268 scew_element_set_contents(element, path);
269 m_leftFile.ReleaseBuffer();
272 if (!m_rightFile.IsEmpty())
275 element = scew_element_add(parent, Right_element_name);
276 path = m_rightFile.GetBuffer(MAX_PATH);
277 scew_element_set_contents(element, path);
278 m_rightFile.ReleaseBuffer();
281 if (!m_filter.IsEmpty())
284 element = scew_element_add(parent, Filter_element_name);
285 filter = m_filter.GetBuffer(MAX_PATH);
286 scew_element_set_contents(element, filter);
287 m_filter.ReleaseBuffer();
290 element = scew_element_add(parent, Subfolders_element_name);
291 if (m_subfolders != 0)
292 scew_element_set_contents(element, _T("1"));
294 scew_element_set_contents(element, _T("0"));
296 element = scew_element_add(parent, Left_ro_element_name);
298 scew_element_set_contents(element, _T("1"));
300 scew_element_set_contents(element, _T("0"));
302 element = scew_element_add(parent, Right_ro_element_name);
303 if (m_bRightReadOnly)
304 scew_element_set_contents(element, _T("1"));
306 scew_element_set_contents(element, _T("0"));
312 * @brief Returns if left path is defined.
314 BOOL ProjectFile::HasLeft() const
316 return !m_leftFile.IsEmpty();
320 * @brief Returns if right path is defined.
322 BOOL ProjectFile::HasRight() const
324 return !m_rightFile.IsEmpty();
328 * @brief Returns if filter is defined.
330 BOOL ProjectFile::HasFilter() const
332 return !m_filter.IsEmpty();
336 * @brief Returns if subfolder is included.
338 BOOL ProjectFile::HasSubfolders() const
340 return (m_subfolders != -1);
344 * @brief Returns left path.
345 * @param [out] pReadOnly TRUE if readonly was specified for path.
347 CString ProjectFile::GetLeft(BOOL * pReadOnly /*=NULL*/) const
350 *pReadOnly = m_bLeftReadOnly;
355 * @brief Returns if left path is specified read-only.
357 BOOL ProjectFile::GetLeftReadOnly() const
359 return m_bLeftReadOnly;
363 * @brief Set left path, returns old left path.
364 * @param [in] sLeft Left path.
365 * @param [in] bReadOnly Will path be recorded read-only?
367 CString ProjectFile::SetLeft(const CString& sLeft, const BOOL * pReadOnly /*=NULL*/)
369 CString sLeftOld = GetLeft();
372 m_bLeftReadOnly = *pReadOnly;
378 * @brief Returns right path.
379 * @param [out] pReadOnly TRUE if readonly was specified for path.
381 CString ProjectFile::GetRight(BOOL * pReadOnly /*=NULL*/) const
384 *pReadOnly = m_bRightReadOnly;
389 * @brief Returns if right path is specified read-only.
391 BOOL ProjectFile::GetRightReadOnly() const
393 return m_bRightReadOnly;
397 * @brief Set right path, returns old right path.
398 * @param [in] sRight Right path.
399 * @param [in] bReadOnly Will path be recorded read-only?
401 CString ProjectFile::SetRight(const CString& sRight, const BOOL * pReadOnly /*=NULL*/)
403 CString sRightOld = GetRight();
404 m_rightFile = sRight;
406 m_bRightReadOnly = *pReadOnly;
412 * @brief Returns filter.
414 CString ProjectFile::GetFilter() const
420 * @brief Set filter, returns old filter.
422 CString ProjectFile::SetFilter(const CString& sFilter)
424 CString sFilterOld = GetFilter();
431 * @brief Returns subfolder included -setting.
433 int ProjectFile::GetSubfolders() const
439 * @brief set subfolder, returns old subfolder value.
441 int ProjectFile::SetSubfolders(const int iSubfolder)
443 int iSubfoldersOld = GetSubfolders();
444 m_subfolders = iSubfolder ? 1 : 0;
446 return iSubfoldersOld;
450 * @brief Returns left and right paths and recursive from project file
452 * @param [out] sLeft Left path
453 * @param [out] sRight Right path
454 * @param [out] bSubFolders If TRUE subfolders included (recursive compare)
456 void ProjectFile::GetPaths(CString & sLeft, CString & sRight,
457 BOOL & bSubfolders) const
464 bSubfolders = (GetSubfolders() == 1);