fixed/cleanup osx xcode project/make
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / linux / LinuxTimezone.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 <time.h>
23 #include "system.h"
24 #include "PlatformInclude.h"
25 #include "LinuxTimezone.h"
26 #include "Util.h"
27 #ifdef __APPLE__
28 #include "../osx/OSXGNUReplacements.h"
29 #endif
30
31 using namespace std;
32
33 CLinuxTimezone::CLinuxTimezone() : m_IsDST(0)
34 {
35    char* line = NULL;
36    size_t linelen = 0;
37    CStdString s;
38    vector<CStdString> tokens;
39    
40    // Load timezones
41    FILE* fp = fopen("/usr/share/zoneinfo/zone.tab", "r");
42    if (fp)
43    {
44       CStdString countryCode;
45       CStdString timezoneName;
46
47       while (getdelim(&line, &linelen, '\n', fp) > 0)
48       {
49          tokens.clear();
50          s = line;
51          s.TrimLeft(" \t").TrimRight(" \n");
52
53          if (s.length() == 0)
54             continue;
55
56          if (s[0] == '#')
57             continue;
58
59          CUtil::Tokenize(s, tokens, " \t");
60          if (tokens.size() < 3)
61             continue;
62
63          countryCode = tokens[0];
64          timezoneName = tokens[2];
65
66          if (m_timezonesByCountryCode.count(countryCode) == 0)
67          {
68             vector<CStdString> timezones;
69             timezones.push_back(timezoneName);
70             m_timezonesByCountryCode[countryCode] = timezones;
71          }
72          else
73          {
74             vector<CStdString>& timezones = m_timezonesByCountryCode[countryCode];
75             timezones.push_back(timezoneName);
76          }
77
78          m_countriesByTimezoneName[timezoneName] = countryCode;
79       }
80       fclose(fp);
81    }
82
83    if (line)
84    {
85      free(line);
86      line = NULL;
87      linelen = 0;
88    }
89
90    // Load countries
91    fp = fopen("/usr/share/zoneinfo/iso3166.tab", "r");
92    if (fp)
93    {
94       CStdString countryCode;
95       CStdString countryName;
96
97       while (getdelim(&line, &linelen, '\n', fp) > 0)
98       {
99          s = line;
100          s.TrimLeft(" \t").TrimRight(" \n");
101
102          if (s.length() == 0)
103             continue;
104
105          if (s[0] == '#')
106             continue;
107
108          // Search for the first non space from the 2nd character and on
109          int i = 2;
110          while (s[i] == ' ' || s[i] == '\t') i++;
111
112          countryCode = s.Left(2);
113          countryName = s.Mid(i);
114
115          m_counties.push_back(countryName);
116          m_countryByCode[countryCode] = countryName;
117          m_countryByName[countryName] = countryCode;
118       }
119       sort(m_counties.begin(), m_counties.end(), sortstringbyname());
120       fclose(fp);
121    }
122
123    if (line)
124      free(line);
125 }
126
127 vector<CStdString> CLinuxTimezone::GetCounties()
128 {
129    return m_counties;
130 }
131
132 vector<CStdString> CLinuxTimezone::GetTimezonesByCountry(const CStdString country)
133 {
134    return m_timezonesByCountryCode[m_countryByName[country]];
135 }
136
137 CStdString CLinuxTimezone::GetCountryByTimezone(const CStdString timezone)
138 {
139 #ifdef __APPLE__
140    return CStdString("?");
141 #else
142    return m_countryByCode[m_countriesByTimezoneName[timezone]];
143 #endif
144 }
145
146 void CLinuxTimezone::SetTimezone(CStdString timezoneName)
147 {
148 #ifndef __APPLE__
149    static char env_var[255];
150    sprintf(env_var, "TZ=:%s", timezoneName.c_str());
151    putenv(env_var);
152    tzset();
153 #endif
154 }
155
156 CStdString CLinuxTimezone::GetOSConfiguredTimezone()
157 {
158    char timezoneName[255];
159    timezoneName[0] = 0;
160    FILE* fp = fopen("/etc/timezone", "r");
161    if (fp)
162    {
163       fgets(timezoneName, sizeof(timezoneName), fp);
164       timezoneName[strlen(timezoneName)-1] = '\0';
165       fclose(fp);
166    }
167
168    return timezoneName;
169 }
170
171 CLinuxTimezone g_timezone;