2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * @file w3c_file_localization.cpp
18 * @author Lukasz Wrzosek (l.wrzosek@samsung.com)
22 #include <sys/types.h>
27 #include <dpl/localization/w3c_file_localization.h>
29 #include <dpl/wrt-dao-ro/widget_dao_read_only.h>
30 #include <dpl/localization/localization_utils.h>
32 #include <dpl/log/log.h>
33 #include <dpl/string.h>
34 #include <dpl/optional.h>
35 #include <dpl/foreach.h>
37 #include <LanguageTagsProvider.h>
39 using namespace WrtDB;
42 const DPL::String FILE_URI_BEGIN = L"file://";
43 const DPL::String WIDGET_URI_BEGIN = L"widget://";
44 const DPL::String LOCALE_PREFIX = L"locales/";
46 DPL::Optional<std::string> GetFilePathInWidgetPackageInternal(
47 const std::string& basePath,
50 LogDebug("Looking for file: " << filePath << " in: " << basePath);
52 const LanguageTags& ltags = LanguageTagsProviderSingleton::Instance().getLanguageTags();
54 //Check if string isn't empty
55 if (filePath.size() == 0) { return DPL::Optional<std::string>::Null; }
56 //Removing preceding '/'
57 if (filePath[0] == '/') { filePath.erase(0, 1); }
58 // In some cases (start file localization) url has unnecessary "/" at the end
59 if(filePath[filePath.size()-1] == '/') { filePath.erase(filePath.size()-1, 1); }
60 //Check if string isn't empty
61 if (filePath.size() == 0) { return DPL::Optional<std::string>::Null; }
63 LogDebug("locales size = " << ltags.size());
64 for (LanguageTags::const_iterator it = ltags.begin();
67 LogDebug("Trying locale: " << *it);
68 std::string path = basePath;
69 if (path[path.size() - 1] == '/') {
70 path.erase(path.size() - 1);
74 path += "/" + filePath;
76 path += "/locales/" + DPL::ToUTF8String(*it) + "/" + filePath;
79 LogDebug("Trying locale: " << *it << " | " << path);
81 if (0 == stat(path.c_str(), &buf)) {
82 if ((buf.st_mode & S_IFMT) == S_IFREG) {
83 path.erase(0, basePath.length());
84 return DPL::Optional<std::string>(path);
89 return DPL::Optional<std::string>::Null;
92 DPL::Optional<DPL::String> GetFilePathInWidgetPackageInternal(
93 const DPL::String& basePath,
94 const DPL::String& filePath)
96 DPL::Optional<std::string> path =
97 GetFilePathInWidgetPackageInternal(DPL::ToUTF8String(basePath),
98 DPL::ToUTF8String(filePath));
99 DPL::Optional<DPL::String> dplPath;
101 dplPath = DPL::FromUTF8String(*path);
107 namespace W3CFileLocalization {
109 DPL::Optional<DPL::String> getFilePathInWidgetPackageFromUrl(
110 DbWidgetHandle widgetHandle,
111 const DPL::String &url)
113 return getFilePathInWidgetPackageFromUrl(
114 WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle)),
118 DPL::Optional<DPL::String> getFilePathInWidgetPackageFromUrl(
119 const WrtDB::WidgetPkgName &pkgname,
120 const DPL::String &url)
122 return getFilePathInWidgetPackageFromUrl(
123 WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)),
127 DPL::Optional<DPL::String> getFilePathInWidgetPackageFromUrl(
128 WrtDB::WidgetDAOReadOnlyPtr dao,
129 const DPL::String &url)
131 DPL::String req = url;
133 if (req.find(WIDGET_URI_BEGIN) == 0) {
134 req.erase(0, WIDGET_URI_BEGIN.length());
135 } else if (req.find(FILE_URI_BEGIN) == 0) {
136 req.erase(0, FILE_URI_BEGIN.length());
137 if (req.find(dao->getPath()) == 0) {
138 req.erase(0, dao->getPath().length());
140 if (req.find(LOCALE_PREFIX) == 0) {
141 req.erase(0, LOCALE_PREFIX.length());
142 size_t position = req.find('/');
143 // should always be >0 as correct locales path is
144 // always locales/xx/ or locales/xx-XX/
145 if (position != std::string::npos && position > 0) {
146 req.erase(0, position+1);
150 LogDebug("Unknown path format, ignoring");
151 return DPL::Optional<DPL::String>::Null;
154 auto widgetPath = dao->getPath();
156 DPL::Optional<DPL::String> found =
157 GetFilePathInWidgetPackageInternal(widgetPath, req);
160 LogError("Path not found within current locale in current widget");
161 return DPL::Optional<DPL::String>::Null;
164 found = widgetPath + *found;
169 DPL::Optional<DPL::String> getFilePathInWidgetPackage(
170 WrtDB::DbWidgetHandle widgetHandle,
171 const DPL::String& file)
173 return getFilePathInWidgetPackage(
174 WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle)),
178 DPL::Optional<DPL::String> getFilePathInWidgetPackage(
179 const WrtDB::WidgetPkgName &pkgname,
180 const DPL::String& file)
182 return getFilePathInWidgetPackage(
183 WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)),
187 DPL::Optional<DPL::String> getFilePathInWidgetPackage(
188 WrtDB::WidgetDAOReadOnlyPtr dao,
189 const DPL::String& file)
191 return GetFilePathInWidgetPackageInternal(dao->getPath(), file);
194 DPL::OptionalString getStartFile(const WrtDB::WidgetPkgName & pkgname)
196 return getStartFile(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)));
199 DPL::OptionalString getStartFile(const WrtDB::DbWidgetHandle handle)
201 return getStartFile(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(handle)));
204 DPL::OptionalString getStartFile(WrtDB::WidgetDAOReadOnlyPtr dao)
206 WidgetDAOReadOnly::LocalizedStartFileList locList = dao->getLocalizedStartFileList();
207 WidgetDAOReadOnly::WidgetStartFileList list = dao->getStartFileList();
208 LanguageTags tagsList = LanguageTagsProviderSingleton::Instance().getLanguageTags();
210 DPL::OptionalString defaultLoc = dao->getDefaultlocale();
212 tagsList.push_back(*defaultLoc);
215 FOREACH(tag, tagsList)
217 FOREACH(sFile, locList)
219 if (*tag == sFile->widgetLocale) {
222 if (it->startFileId == sFile->startFileId) {
230 return DPL::OptionalString::Null;
233 OptionalWidgetIcon getIcon(const WrtDB::WidgetPkgName & pkgname)
235 return getIcon(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)));
238 OptionalWidgetIcon getIcon(WrtDB::DbWidgetHandle widgetHandle)
240 return getIcon(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle)));
243 OptionalWidgetIcon getIcon(WrtDB::WidgetDAOReadOnlyPtr dao)
245 WidgetDAOReadOnly::WidgetLocalizedIconList locList = dao->getLocalizedIconList();
246 WidgetDAOReadOnly::WidgetIconList list = dao->getIconList();
247 LanguageTags tagsList = LanguageTagsProviderSingleton::Instance().getLanguageTags();
249 DPL::OptionalString defaultLoc = dao->getDefaultlocale();
251 tagsList.push_back(*defaultLoc);
254 FOREACH(tag, tagsList)
256 FOREACH(icon, locList)
258 if (*tag == icon->widgetLocale) {
261 if (it->iconId == icon->iconId) {
263 ret.src = it->iconSrc;
264 ret.width = it->iconWidth;
265 ret.height = it->iconHeight;
273 return OptionalWidgetIcon::Null;
276 WidgetIconList getValidIconsList(WrtDB::DbWidgetHandle widgetHandle)
278 return getValidIconsList(
279 WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle)));
282 WidgetIconList getValidIconsList(const WrtDB::WidgetPkgName &pkgname)
284 return getValidIconsList(
285 WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)));
288 WidgetIconList getValidIconsList(WrtDB::WidgetDAOReadOnlyPtr dao)
290 WidgetDAOReadOnly::WidgetIconList list = dao->getIconList();
292 WidgetIconList outlist;
296 LogDebug(":" << it->iconSrc);
297 if (!!getFilePathInWidgetPackage(dao->getHandle(),
301 ret.src = it->iconSrc;
302 ret.width = it->iconWidth;
303 ret.height = it->iconHeight;
304 outlist.push_back(ret);
310 OptionalWidgetStartFileInfo getStartFileInfo(WrtDB::DbWidgetHandle widgetHandle)
312 return getStartFileInfo(
313 WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(widgetHandle)));
316 OptionalWidgetStartFileInfo getStartFileInfo(const WrtDB::WidgetPkgName &pkgname)
318 return getStartFileInfo(
319 WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)));
324 OptionalWidgetStartFileInfo getStartFileInfo(WrtDB::WidgetDAOReadOnlyPtr dao)
326 WidgetStartFileInfo info;
328 WidgetDAOReadOnly::LocalizedStartFileList locList =
329 dao->getLocalizedStartFileList();
330 WidgetDAOReadOnly::WidgetStartFileList list = dao->getStartFileList();
331 const LanguageTags tagsList = LanguageTagsProviderSingleton::Instance().getLanguageTags();
333 FOREACH(tag, tagsList)
335 FOREACH(sFile, locList)
337 if (*tag == sFile->widgetLocale) {
340 if (it->startFileId ==
341 sFile->startFileId) {
343 info.encoding = sFile->encoding;
344 info.type = sFile->type;
346 info.localizedPath = it->src;
348 info.localizedPath = L"locales/" + *tag + L"/";
349 info.localizedPath += it->src;
358 return OptionalWidgetStartFileInfo::Null;
361 WidgetLocalizedInfo getLocalizedInfo(const WrtDB::DbWidgetHandle handle)
363 return getLocalizedInfo(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(handle)));
366 WidgetLocalizedInfo getLocalizedInfo(const WrtDB::WidgetPkgName & pkgname)
368 return getLocalizedInfo(WidgetDAOReadOnlyPtr(new WidgetDAOReadOnly(pkgname)));
371 WidgetLocalizedInfo getLocalizedInfo(WidgetDAOReadOnlyPtr dao)
373 LanguageTags languages = LanguageTagsProviderSingleton::Instance().getLanguageTags();
374 DPL::OptionalString dl = dao->getDefaultlocale();
376 languages.push_back(*dl);
379 WidgetLocalizedInfo result;
380 FOREACH(i, languages)
382 WidgetLocalizedInfo languageResult = dao->getLocalizedInfo(*i);
384 #define OVERWRITE_IF_NULL(FIELD) if (!result.FIELD) { \
385 result.FIELD = languageResult.FIELD; \
388 OVERWRITE_IF_NULL(name);
389 OVERWRITE_IF_NULL(shortName);
390 OVERWRITE_IF_NULL(description);
391 OVERWRITE_IF_NULL(license);
392 OVERWRITE_IF_NULL(licenseHref);
394 #undef OVERWRITE_IF_NULL