/****************************************************************************  
 | 
**  
 | 
** Copyright (C) 2016 The Qt Company Ltd.  
 | 
** Contact: https://www.qt.io/licensing/  
 | 
**  
 | 
** This file is part of the Qt VS Tools.  
 | 
**  
 | 
** $QT_BEGIN_LICENSE:GPL-EXCEPT$  
 | 
** Commercial License Usage  
 | 
** Licensees holding valid commercial Qt licenses may use this file in  
 | 
** accordance with the commercial license agreement provided with the  
 | 
** Software or, alternatively, in accordance with the terms contained in  
 | 
** a written agreement between you and The Qt Company. For licensing terms  
 | 
** and conditions see https://www.qt.io/terms-conditions. For further  
 | 
** information use the contact form at https://www.qt.io/contact-us.  
 | 
**  
 | 
** GNU General Public License Usage  
 | 
** Alternatively, this file may be used under the terms of the GNU  
 | 
** General Public License version 3 as published by the Free Software  
 | 
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT  
 | 
** included in the packaging of this file. Please review the following  
 | 
** information to ensure the GNU General Public License requirements will  
 | 
** be met: https://www.gnu.org/licenses/gpl-3.0.html.  
 | 
**  
 | 
** $QT_END_LICENSE$  
 | 
**  
 | 
****************************************************************************/  
 | 
  
 | 
using System.Collections.Generic;  
 | 
using System.Xml;  
 | 
  
 | 
namespace QtVsTools.Core  
 | 
{  
 | 
    public class QrcParser  
 | 
    {  
 | 
        private readonly string qrcFileName;  
 | 
        private readonly Stack<QrcPrefix> prefixes;  
 | 
        private readonly List<QrcPrefix> prefxs;  
 | 
  
 | 
        public List<QrcPrefix> Prefixes  
 | 
        {  
 | 
            get { return prefxs; }  
 | 
        }  
 | 
  
 | 
        public QrcParser(string fileName)  
 | 
        {  
 | 
            qrcFileName = fileName;  
 | 
            prefixes = new Stack<QrcPrefix>();  
 | 
            prefxs = new List<QrcPrefix>();  
 | 
        }  
 | 
  
 | 
        public bool parse()  
 | 
        {  
 | 
            var fi = new System.IO.FileInfo(qrcFileName);  
 | 
            if (!fi.Exists)  
 | 
                return false;  
 | 
            try {  
 | 
                var reader = new XmlTextReader(qrcFileName);  
 | 
                QrcItem currentItem = null;  
 | 
                QrcPrefix currentPrefix = null;  
 | 
                while (reader.Read()) {  
 | 
                    switch (reader.NodeType) {  
 | 
                    case XmlNodeType.Element:  
 | 
                        if (reader.LocalName.ToLower() == "qresource") {  
 | 
                            currentPrefix = new QrcPrefix();  
 | 
                            currentPrefix.Prefix = reader.GetAttribute("prefix");  
 | 
                            currentPrefix.Language = reader.GetAttribute("lang");  
 | 
                            prefixes.Push(currentPrefix);  
 | 
                        } else if (reader.LocalName.ToLower() == "file") {  
 | 
                            currentItem = new QrcItem();  
 | 
                            currentItem.Alias = reader.GetAttribute("name");  
 | 
                        }  
 | 
                        break;  
 | 
                    case XmlNodeType.EndElement:  
 | 
                        if (reader.LocalName.ToLower() == "qresource") {  
 | 
                            prefxs.Add(prefixes.Pop());  
 | 
                        } else if (reader.LocalName.ToLower() == "file"  
 | 
                              && prefixes.Peek() != null && currentItem != null) {  
 | 
                            prefixes.Peek().AddQrcItem(currentItem);  
 | 
                            currentItem = null;  
 | 
                        }  
 | 
                        break;  
 | 
                    case XmlNodeType.Text:  
 | 
                        if (currentItem != null)  
 | 
                            currentItem.Path = reader.Value;  
 | 
                        break;  
 | 
                    }  
 | 
                }  
 | 
                reader.Close();  
 | 
            } catch (System.Exception) {  
 | 
                return false;  
 | 
            }  
 | 
            return true;  
 | 
        }  
 | 
    }  
 | 
}  
 |