fixed: LINUX build errors
[xbmc:xbmc.git] / xbmc / ScriptSettings.cpp
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #include "ScriptSettings.h"
23 #include "Util.h"
24 #include "FileSystem/Directory.h"
25 #include "utils/log.h"
26
27 CScriptSettings::CScriptSettings()
28 {
29 }
30
31 CScriptSettings::~CScriptSettings()
32 {
33 }
34
35 bool CScriptSettings::Load(const CStdString& strPath)
36 {
37   m_scriptPath = strPath;
38
39   // create the users filepath
40   CUtil::RemoveSlashAtEnd(m_scriptPath);
41   m_userFileName.Format("special://profile/script_data/%s", CUtil::GetFileName(m_scriptPath));
42   CUtil::AddFileToFolder(m_userFileName, "settings.xml", m_userFileName);
43
44   // Create our final settings path
45   CStdString scriptFileName;
46   CUtil::AddFileToFolder(m_scriptPath, "resources", scriptFileName);
47   CUtil::AddFileToFolder(scriptFileName, "settings.xml", scriptFileName);
48
49   if (!m_pluginXmlDoc.LoadFile(scriptFileName))
50   {
51     CLog::Log(LOGERROR, "Unable to load: %s, Line %d\n%s", scriptFileName.c_str(), m_pluginXmlDoc.ErrorRow(), m_pluginXmlDoc.ErrorDesc());
52     return false;
53   }
54
55   // Make sure that the script XML has the settings element
56   TiXmlElement *setting = m_pluginXmlDoc.RootElement();
57   if (!setting || strcasecmp(setting->Value(), "settings") != 0)
58   {
59     CLog::Log(LOGERROR, "Error loading Settings %s: cannot find root element 'settings'", scriptFileName.c_str());
60     return false;
61   }
62
63   // Load the user saved settings. If it does not exist, create it
64   if (!m_userXmlDoc.LoadFile(m_userFileName))
65   {
66     TiXmlDocument doc;
67     TiXmlDeclaration decl("1.0", "UTF-8", "yes");
68     doc.InsertEndChild(decl);
69
70     TiXmlElement xmlRootElement("settings");
71     doc.InsertEndChild(xmlRootElement);
72
73     m_userXmlDoc = doc;
74
75     // Don't worry about the actual settings, they will be set when the user clicks "Ok"
76     // in the settings dialog
77   }
78
79   return true;
80 }
81
82 bool CScriptSettings::Save(void)
83 {
84   // break down the path into directories
85   CStdString strRoot, strType, strScript;
86   CUtil::GetDirectory(m_userFileName, strScript);
87   CUtil::RemoveSlashAtEnd(strScript);
88   CUtil::GetDirectory(strScript, strType);
89   CUtil::RemoveSlashAtEnd(strType);
90   CUtil::GetDirectory(strType, strRoot);
91   CUtil::RemoveSlashAtEnd(strRoot);
92
93   // create the individual folders
94   if (!DIRECTORY::CDirectory::Exists(strRoot))
95     DIRECTORY::CDirectory::Create(strRoot);
96   if (!DIRECTORY::CDirectory::Exists(strType))
97     DIRECTORY::CDirectory::Create(strType);
98   if (!DIRECTORY::CDirectory::Exists(strScript))
99     DIRECTORY::CDirectory::Create(strScript);
100
101   return m_userXmlDoc.SaveFile(m_userFileName);
102 }
103
104 bool CScriptSettings::SettingsExist(const CStdString& strPath)
105 {
106   CStdString scriptFileName = strPath;
107   CUtil::RemoveSlashAtEnd(scriptFileName);
108
109   CUtil::AddFileToFolder(scriptFileName, "resources", scriptFileName);
110   CUtil::AddFileToFolder(scriptFileName, "settings.xml", scriptFileName);
111
112   // Load the settings file to verify it's valid
113   TiXmlDocument xmlDoc;
114   if (!xmlDoc.LoadFile(scriptFileName))
115     return false;
116
117   // Make sure that the script XML has the settings element
118   TiXmlElement *setting = xmlDoc.RootElement();
119   if (!setting || strcasecmp(setting->Value(), "settings") != 0)
120     return false;
121
122   return true;
123 }
124
125 CScriptSettings& CScriptSettings::operator=(const CBasicSettings& settings)
126 {
127   *((CBasicSettings*)this) = settings;
128
129   return *this;
130 }
131