c463276669554af962daa0d0b573f19e1dc37503
[framework/web/wrt-commons.git] / modules / localization / src / localization_utils.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *    Licensed under the Apache License, Version 2.0 (the "License");
5  *    you may not use this file except in compliance with the License.
6  *    You may obtain a copy of the License at
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *    Unless required by applicable law or agreed to in writing, software
11  *    distributed under the License is distributed on an "AS IS" BASIS,
12  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *    See the License for the specific language governing permissions and
14  *    limitations under the License.
15  */
16 /**
17  * @file    localization_utils.cpp
18  * @author  Bartosz Janiak (b.janiak@samsung.com)
19  * @version 1.0
20  */
21
22 #include <dpl/localization/localization_utils.h>
23
24 #include <dpl/foreach.h>
25 #include <dpl/mutex.h>
26
27 namespace LocalizationUtils {
28 static LanguageTagsList m_systemLanguageTags;
29 static LanguageTagsList m_languageTags;
30 static DPL::ReadWriteMutex m_readWriteMutex;
31
32 template<typename StringType>
33 void FindAndReplace(StringType& source,
34         const StringType& find,
35         const StringType& replace)
36 {
37     size_t pos = 0;
38     while ((pos = source.find(find, pos)) != StringType::npos) {
39         source.replace(pos, find.length(), replace);
40         pos += replace.length();
41     }
42 }
43
44 DPL::String BCP47LanguageTagToLocale(const DPL::String& inLanguageTag)
45 {
46     DPL::String languageTag(inLanguageTag);
47     FindAndReplace(languageTag, DPL::String(L"-"), DPL::String(L"_"));
48     return languageTag;
49 }
50
51 DPL::String LocaleToBCP47LanguageTag(const DPL::String& inLocaleString)
52 {
53     DPL::String localeString = inLocaleString.substr(
54             0,
55             inLocaleString.
56                 find_first_of(L"."));
57     FindAndReplace(localeString, DPL::String(L"_"), DPL::String(L"-"));
58     return localeString;
59 }
60
61 void UpdateUserAgentLanguageTags()
62 {
63     // WARNING!!!!!  This function shall be called
64     // only when mutex is locked in readWriteMode!
65
66     m_languageTags.clear();
67
68     FOREACH(i, m_systemLanguageTags) {
69         DPL::String tag = LocaleToBCP47LanguageTag(*i);
70         while (true) { //W3C Packaging 9. Step 5. 2. D
71             if (tag.empty()) { continue; }
72
73             LogDebug("Adding user locale '" << tag << "'");
74             m_languageTags.push_back(tag);
75
76             size_t subtagPos = tag.find_last_of(L"-");
77             if (subtagPos == DPL::String::npos) {
78                 break;
79             }
80             tag = tag.substr(0, subtagPos);
81         }
82     }
83
84     m_languageTags.push_back(L"en");
85     m_languageTags.push_back(L"");
86 }
87
88 void SetSystemLanguageTags(const LanguageTagsList& tags)
89 {
90     DPL::ReadWriteMutex::ScopedWriteLock lock(&m_readWriteMutex);
91     if (m_systemLanguageTags != tags) {
92         m_systemLanguageTags = tags;
93         UpdateUserAgentLanguageTags();
94     }
95 }
96
97 LanguageTagsList GetUserAgentLanguageTags()
98 {
99     DPL::ReadWriteMutex::ScopedReadLock lock(&m_readWriteMutex);
100     return m_languageTags;
101 }
102 }