merge with master
[platform/framework/native/ime.git] / src / FUiIme_InputMethodInfoImpl.cpp
1 //\r
2 // Open Service Platform\r
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.\r
4 //\r
5 // Licensed under the Apache License, Version 2.0 (the License);\r
6 // you may not use this file except in compliance with the License.\r
7 // You may obtain a copy of the License at\r
8 //\r
9 //     http://www.apache.org/licenses/LICENSE-2.0\r
10 //\r
11 // Unless required by applicable law or agreed to in writing, software\r
12 // distributed under the License is distributed on an "AS IS" BASIS,\r
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 // See the License for the specific language governing permissions and\r
15 // limitations under the License.\r
16 //\r
17 \r
18 /**\r
19  * @file        FUiIme_InputMethodInfoImpl.cpp\r
20  * @brief       This is the implementation file for the %_InputMethodInfoImpl class.\r
21  *\r
22  * This implementation file contains definition of the %_InputMethodInfoImpl class.\r
23  */\r
24 \r
25 #include <new>\r
26 #include <string.h>\r
27 #include <unique_ptr.h>\r
28 \r
29 #include <FBaseColTypes.h>\r
30 #include <FBaseSysLog.h>\r
31 \r
32 #include <FBase_StringConverter.h>\r
33 \r
34 #include "FUiIme_InputMethodInfoImpl.h"\r
35 #include "FUiIme_ScimDataConverter.h"\r
36 \r
37 using namespace Tizen::App;\r
38 using namespace Tizen::Base;\r
39 using namespace Tizen::Base::Collection;\r
40 using namespace Tizen::Locales;\r
41 \r
42 namespace Tizen { namespace Ui { namespace Ime {\r
43 \r
44 _InputMethodInfoImpl::_InputMethodInfoImpl(void)\r
45         :__pUuid(null)\r
46 {\r
47         result r = E_SUCCESS;\r
48 \r
49         std::unique_ptr<ArrayList> pLanguageList(new(std::nothrow) ArrayList(SingleObjectDeleter));\r
50         SysTryReturnVoidResult(NID_UI_IME, pLanguageList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");\r
51 \r
52         r = pLanguageList->Construct();\r
53         SysTryReturnVoidResult(NID_UI_IME, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
54 \r
55         __pLanguageList = pLanguageList.release();\r
56 }\r
57 \r
58 _InputMethodInfoImpl::_InputMethodInfoImpl(const _InputMethodInfoImpl& impl)\r
59 {\r
60         result r = E_SUCCESS;\r
61 \r
62         __appId = impl.__appId;\r
63         __name = impl.__name;\r
64 \r
65         std::unique_ptr<ArrayList> pLanguageList(new(std::nothrow) ArrayList(SingleObjectDeleter));\r
66         SysTryReturnVoidResult(NID_UI_IME, pLanguageList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");\r
67 \r
68         r = pLanguageList->Construct();\r
69         SysTryReturnVoidResult(NID_UI_IME, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
70 \r
71         __pLanguageList = pLanguageList.release();\r
72 \r
73         r = SetLanguageList(*(impl.__pLanguageList));\r
74         SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));\r
75 \r
76         __pUuid = _StringConverter::CopyToCharArrayN(impl.__uuid);\r
77 \r
78         return;\r
79 \r
80 CATCH:\r
81         delete __pLanguageList;\r
82         __pLanguageList = null;\r
83 \r
84         return;\r
85 }\r
86 \r
87 _InputMethodInfoImpl::~_InputMethodInfoImpl(void)\r
88 {\r
89         delete __pLanguageList;\r
90         __pLanguageList = null;\r
91 \r
92         delete[] __pUuid;\r
93         __pUuid = null;\r
94 }\r
95 \r
96 _InputMethodInfoImpl*\r
97 _InputMethodInfoImpl::GetInstance(InputMethodInfo& inputMethodInfo)\r
98 {\r
99         return inputMethodInfo.__pInputMethodInfoImpl;\r
100 }\r
101 \r
102 _InputMethodInfoImpl&\r
103 _InputMethodInfoImpl::operator=(const _InputMethodInfoImpl& impl)\r
104 {\r
105         result r = E_SUCCESS;\r
106 \r
107         if (&impl != this)\r
108         {\r
109                 __appId = impl.__appId;\r
110                 __name = impl.__name;\r
111 \r
112                 r = SetLanguageList(*(impl.__pLanguageList));\r
113                 SysTryReturn(NID_UI_IME, r == E_SUCCESS, *this, r, "[%s] Propagating.", GetErrorMessage(r));\r
114 \r
115                 if (__pUuid)\r
116                 {\r
117                         delete[] __pUuid;\r
118                 }\r
119                 __pUuid = _StringConverter::CopyToCharArrayN(impl.__uuid);\r
120         }\r
121 \r
122         return *this;\r
123 }\r
124 \r
125 bool\r
126 _InputMethodInfoImpl::Equals(const Object& object) const\r
127 {\r
128         const _InputMethodInfoImpl* pInputMethodInfoImpl = static_cast<const _InputMethodInfoImpl*>(&object);\r
129         SysTryReturn(NID_UI_IME, pInputMethodInfoImpl, false, E_INVALID_ARG, "Invalid argument(s) is used. The object is not the _InputMethodInfoImpl.");\r
130 \r
131         return __appId.Equals(pInputMethodInfoImpl->__appId, true);\r
132 }\r
133 \r
134 AppId\r
135 _InputMethodInfoImpl::GetAppId(void) const\r
136 {\r
137         return __appId;\r
138 }\r
139 \r
140 const IList*\r
141 _InputMethodInfoImpl::GetLanguageList(void) const\r
142 {\r
143         return __pLanguageList;\r
144 }\r
145 \r
146 String\r
147 _InputMethodInfoImpl::GetName(void) const\r
148 {\r
149         return __name;\r
150 }\r
151 \r
152 const char*\r
153 _InputMethodInfoImpl::GetUuid(void) const\r
154 {\r
155         return __pUuid;\r
156 }\r
157 \r
158 void\r
159 _InputMethodInfoImpl::SetAppId(AppId id)\r
160 {\r
161         __appId = id;\r
162 }\r
163 \r
164 void\r
165 _InputMethodInfoImpl::SetUuid(String id)\r
166 {\r
167         __uuid = id;\r
168 \r
169         if (__pUuid)\r
170         {\r
171                 delete[] __pUuid;\r
172         }\r
173         __pUuid = _StringConverter::CopyToCharArrayN(id);\r
174 }\r
175 \r
176 result\r
177 _InputMethodInfoImpl::SetLanguageList(const IList& list)\r
178 {\r
179         result r = E_SUCCESS;\r
180 \r
181         __pLanguageList->RemoveAll();\r
182 \r
183         const ArrayList* pLanguageList = static_cast<const ArrayList*>(&list);\r
184         int languageCount = pLanguageList->GetCount();\r
185 \r
186         r = __pLanguageList->SetCapacity(languageCount);\r
187         SysTryReturnResult(NID_UI_IME, r == E_SUCCESS, r, "Propagating.");\r
188 \r
189         Locale* pDestLanguage = null;\r
190         for (int i = 0; i < languageCount; i++)\r
191         {\r
192                 const Locale* pLanguage = static_cast<const Locale*>(pLanguageList->GetAt(i));\r
193                 r = GetLastResult();\r
194                 SysTryCatch(NID_UI_IME, pLanguage, , r, "[%s] Propagating.", GetErrorMessage(r));\r
195 \r
196                 pDestLanguage = new(std::nothrow) Locale(*pLanguage);\r
197                 SysTryCatch(NID_UI_IME, pDestLanguage, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");\r
198 \r
199                 r = __pLanguageList->Add(pDestLanguage);\r
200                 SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));\r
201         }\r
202 \r
203         return r;\r
204 \r
205 CATCH:\r
206         __pLanguageList->RemoveAll();\r
207 \r
208         delete pDestLanguage;\r
209 \r
210         return r;\r
211 }\r
212 \r
213 void\r
214 _InputMethodInfoImpl::SetName(const String& name)\r
215 {\r
216         __name = name;\r
217 }\r
218 \r
219 void\r
220 _InputMethodInfoImpl::SetName(const scim::String& name)\r
221 {\r
222         _ScimDataConverter::ConvertString(name, __name);\r
223 }\r
224 \r
225 result\r
226 _InputMethodInfoImpl::AddLanguage(const char* language)\r
227 {\r
228         result r = E_SUCCESS;\r
229 \r
230         // verify the input parameter\r
231         const int _ISO_639_2_LENGTH = 6;\r
232         const int _ISO_639_2_LANGUAGE_CODE_LENGTH = 3;\r
233         const int _COUNTRY_CODE_LENGTH = 2;\r
234 \r
235         int length = strlen(language);\r
236         SysTryReturnResult(NID_UI_IME, (length == _ISO_639_2_LENGTH), E_INVALID_ARG,\r
237                                         "Invalid argument(s) is used. The language is not a type of ISO 639-2 and is %s.", language);\r
238 \r
239         LanguageCode languageCode = LANGUAGE_INVALID;\r
240         CountryCode countryCode = COUNTRY_INVALID;\r
241 \r
242         // LanguageCode\r
243         char srcLanguage[_ISO_639_2_LANGUAGE_CODE_LENGTH + 1];\r
244         strncpy(srcLanguage, language, _ISO_639_2_LANGUAGE_CODE_LENGTH);\r
245         srcLanguage[_ISO_639_2_LANGUAGE_CODE_LENGTH] = '\0';\r
246 \r
247         languageCode = Locale::StringToLanguageCode(srcLanguage);\r
248         SysTryReturnResult(NID_UI_IME, languageCode != LANGUAGE_INVALID, E_INVALID_ARG,\r
249                                         "Invalid argument(s) is used. The srcLanguage is %s.", srcLanguage);\r
250 \r
251         // CountryCode\r
252         char srcCountry[_COUNTRY_CODE_LENGTH + 1];\r
253         strncpy(srcCountry, language + _ISO_639_2_LANGUAGE_CODE_LENGTH + 1, _COUNTRY_CODE_LENGTH);\r
254         srcCountry[_COUNTRY_CODE_LENGTH] = '\0';\r
255 \r
256         countryCode = Locale::StringToCountryCode(srcCountry);\r
257         SysTryReturnResult(NID_UI_IME, countryCode != COUNTRY_INVALID, E_INVALID_ARG,\r
258                                         "Invalid argument(s) is used. The srcCountry is %s.", srcCountry);\r
259 \r
260         // add the language\r
261         Locale* pLanguage = new(std::nothrow) Locale(languageCode, countryCode);\r
262         SysTryReturnResult(NID_UI_IME, pLanguage, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");\r
263 \r
264         r = __pLanguageList->Add(pLanguage);\r
265         SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));\r
266 \r
267         return r;\r
268 \r
269 CATCH:\r
270         delete pLanguage;\r
271 \r
272         return r;\r
273 }\r
274 \r
275 }}} // Tizen::Ui::Ime\r