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");
39 * @brief Standard constructor.
41 ProjectFile::ProjectFile()
43 , m_bLeftReadOnly(FALSE)
44 , m_bRightReadOnly(FALSE)
49 * @brief Open given path-file and read data from it to member variables.
50 * @param [in] path Path to project file.
51 * @param [out] sError Error string if error happened.
52 * @return TRUE if reading succeeded, FALSE if error happened.
53 * @bug This doesn't handle unicode paths!
55 BOOL ProjectFile::Read(LPCTSTR path, CString *sError)
67 scew_tree* tree = NULL;
68 scew_parser* parser = NULL;
70 parser = scew_parser_create();
71 scew_parser_ignore_whitespaces(parser, 1);
73 if (scew_parser_load_file(parser, pathAnsi))
75 tree = scew_parser_tree(parser);
77 scew_element * root = GetRootElement(tree);
86 /* Frees the SCEW parser */
87 scew_parser_free(parser);
93 * @brief Return project file XML's root element.
94 * @param [in] tree XML tree we got from the parser.
95 * @return Root element pointer.
97 scew_element* ProjectFile::GetRootElement(scew_tree * tree)
99 scew_element * root = NULL;
103 root = scew_tree_root(tree);
108 // Make sure we have correct root element
109 if (_tcscmp(Root_element_name, scew_element_name(root)) != 0)
118 * @brief Reads the paths data from the XML data.
119 * This function reads the paths data inside given element in XML data.
120 * @param [in] parent Parent element for the paths data.
122 void ProjectFile::GetPathsData(scew_element * parent)
124 scew_element *paths = NULL;
128 paths = scew_element_by_name(parent, Paths_element_name);
133 scew_element *left = NULL;
134 scew_element *right = NULL;
135 scew_element *filter = NULL;
136 scew_element *subfolders = NULL;
138 left = scew_element_by_name(paths, Left_element_name);
139 right = scew_element_by_name(paths, Right_element_name);
140 filter = scew_element_by_name(paths, Filter_element_name);
141 subfolders = scew_element_by_name(paths, Subfolders_element_name);
146 path = scew_element_contents(right);
152 path = scew_element_contents(right);
157 LPCTSTR filtername = NULL;
158 filtername = scew_element_contents(filter);
159 m_filter = filtername;
163 LPCTSTR folders = NULL;
164 folders = scew_element_contents(subfolders);
165 m_subfolders = _ttoi(folders);
171 * @brief Save data from member variables to path-file.
172 * @param [in] path Path to project file.
173 * @param [out] sError Error string if error happened.
174 * @return TRUE if saving succeeded, FALSE if error happened.
176 BOOL ProjectFile::Save(LPCTSTR path, CString *sError)
183 pathAnsi = T2A(path);
188 scew_tree* tree = NULL;
189 scew_element* root = NULL;
190 scew_element* paths = NULL;
192 tree = scew_tree_create();
193 root = scew_tree_add_root(tree, Root_element_name);
196 paths = AddPathsElement(root);
203 AddPathsContent(paths);
208 scew_tree_set_xml_encoding(tree, _T("UTF-8"));
210 // Set the XML file standalone
211 scew_tree_set_xml_standalone(tree, 1);
213 if (!scew_writer_tree_file(tree, pathAnsi))
216 /* Frees the SCEW tree */
217 scew_tree_free(tree);
220 // return Serialize(true, path, sError);
224 * @brief Add paths element into XML tree.
225 * @param [in] parent Parent element for the paths element.
226 * @return pointer to added paths element.
228 scew_element* ProjectFile::AddPathsElement(scew_element * parent)
230 scew_element* element = NULL;
231 element = scew_element_add(parent, Paths_element_name);
236 * @brief Add paths data to the XML tree.
237 * This function adds our paths data to the XML tree.
238 * @param [in] parent Parent element for paths data.
239 * @return TRUE if we succeeded, FALSE otherwise.
241 BOOL ProjectFile::AddPathsContent(scew_element * parent)
243 scew_element* element = NULL;
245 if (!m_leftFile.IsEmpty())
248 element = scew_element_add(parent, Left_element_name);
249 path = m_leftFile.GetBuffer(MAX_PATH);
250 scew_element_set_contents(element, path);
251 m_leftFile.ReleaseBuffer();
254 if (!m_rightFile.IsEmpty())
257 element = scew_element_add(parent, Right_element_name);
258 path = m_rightFile.GetBuffer(MAX_PATH);
259 scew_element_set_contents(element, path);
260 m_rightFile.ReleaseBuffer();
263 if (!m_filter.IsEmpty())
266 element = scew_element_add(parent, Filter_element_name);
267 filter = m_filter.GetBuffer(MAX_PATH);
268 scew_element_set_contents(element, filter);
269 m_filter.ReleaseBuffer();
273 element = scew_element_add(parent, Subfolders_element_name);
274 if (m_subfolders != 0)
276 scew_element_set_contents(element, _T("1"));
280 scew_element_set_contents(element, _T("0"));
286 * @brief Returns if left path is defined.
288 BOOL ProjectFile::HasLeft() const
290 return !m_leftFile.IsEmpty();
294 * @brief Returns if right path is defined.
296 BOOL ProjectFile::HasRight() const
298 return !m_rightFile.IsEmpty();
302 * @brief Returns if filter is defined.
304 BOOL ProjectFile::HasFilter() const
306 return !m_filter.IsEmpty();
310 * @brief Returns if subfolder is included.
312 BOOL ProjectFile::HasSubfolders() const
314 return (m_subfolders != -1);
318 * @brief Returns left path.
319 * @param [out] pReadOnly TRUE if readonly was specified for path.
321 CString ProjectFile::GetLeft(BOOL * pReadOnly /*=NULL*/) const
324 *pReadOnly = m_bLeftReadOnly;
329 * @brief Returns if left path is specified read-only.
331 BOOL ProjectFile::GetLeftReadOnly() const
333 return m_bLeftReadOnly;
337 * @brief Set left path, returns old left path.
338 * @param [in] sLeft Left path.
339 * @param [in] bReadOnly Will path be recorded read-only?
341 CString ProjectFile::SetLeft(const CString& sLeft, const BOOL * pReadOnly /*=NULL*/)
343 CString sLeftOld = GetLeft();
346 m_bLeftReadOnly = *pReadOnly;
352 * @brief Returns right path.
353 * @param [out] pReadOnly TRUE if readonly was specified for path.
355 CString ProjectFile::GetRight(BOOL * pReadOnly /*=NULL*/) const
358 *pReadOnly = m_bRightReadOnly;
363 * @brief Returns if right path is specified read-only.
365 BOOL ProjectFile::GetRightReadOnly() const
367 return m_bRightReadOnly;
371 * @brief Set right path, returns old right path.
372 * @param [in] sRight Right path.
373 * @param [in] bReadOnly Will path be recorded read-only?
375 CString ProjectFile::SetRight(const CString& sRight, const BOOL * pReadOnly /*=NULL*/)
377 CString sRightOld = GetRight();
378 m_rightFile = sRight;
380 m_bRightReadOnly = *pReadOnly;
386 * @brief Returns filter.
388 CString ProjectFile::GetFilter() const
394 * @brief Set filter, returns old filter.
396 CString ProjectFile::SetFilter(const CString& sFilter)
398 CString sFilterOld = GetFilter();
405 * @brief Returns subfolder included -setting.
407 int ProjectFile::GetSubfolders() const
413 * @brief set subfolder, returns old subfolder value.
415 int ProjectFile::SetSubfolders(const int iSubfolder)
417 int iSubfoldersOld = GetSubfolders();
418 m_subfolders = iSubfolder ? 1 : 0;
420 return iSubfoldersOld;
424 * @brief Returns left and right paths and recursive from project file
426 * @param [out] sLeft Left path
427 * @param [out] sRight Right path
428 * @param [out] bSubFolders If TRUE subfolders included (recursive compare)
430 void ProjectFile::GetPaths(CString & sLeft, CString & sRight,
431 BOOL & bSubfolders) const
438 bSubfolders = (GetSubfolders() == 1);