update changelog
[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         __uuid = impl.__uuid;\r
64         __name = impl.__name;\r
65         __type = impl.__type;\r
66 \r
67         std::unique_ptr<ArrayList> pLanguageList(new(std::nothrow) ArrayList(SingleObjectDeleter));\r
68         SysTryReturnVoidResult(NID_UI_IME, pLanguageList, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");\r
69 \r
70         r = pLanguageList->Construct();\r
71         SysTryReturnVoidResult(NID_UI_IME, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
72 \r
73         __pLanguageList = pLanguageList.release();\r
74 \r
75         r = SetLanguageList(*(impl.__pLanguageList));\r
76         SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));\r
77 \r
78         __pUuid = _StringConverter::CopyToCharArrayN(impl.__uuid);\r
79 \r
80         return;\r
81 \r
82 CATCH:\r
83         delete __pLanguageList;\r
84         __pLanguageList = null;\r
85 \r
86         return;\r
87 }\r
88 \r
89 _InputMethodInfoImpl::~_InputMethodInfoImpl(void)\r
90 {\r
91         delete __pLanguageList;\r
92         __pLanguageList = null;\r
93 \r
94         delete[] __pUuid;\r
95         __pUuid = null;\r
96 }\r
97 \r
98 _InputMethodInfoImpl*\r
99 _InputMethodInfoImpl::GetInstance(InputMethodInfo& inputMethodInfo)\r
100 {\r
101         return inputMethodInfo.__pInputMethodInfoImpl;\r
102 }\r
103 \r
104 _InputMethodInfoImpl&\r
105 _InputMethodInfoImpl::operator=(const _InputMethodInfoImpl& impl)\r
106 {\r
107         result r = E_SUCCESS;\r
108 \r
109         if (&impl != this)\r
110         {\r
111                 __appId = impl.__appId;\r
112                 __uuid = impl.__uuid;\r
113                 __name = impl.__name;\r
114                 __type = impl.__type;\r
115 \r
116                 r = SetLanguageList(*(impl.__pLanguageList));\r
117                 SysTryReturn(NID_UI_IME, r == E_SUCCESS, *this, r, "[%s] Propagating.", GetErrorMessage(r));\r
118 \r
119                 if (__pUuid)\r
120                 {\r
121                         delete[] __pUuid;\r
122                 }\r
123                 __pUuid = _StringConverter::CopyToCharArrayN(impl.__uuid);\r
124         }\r
125 \r
126         return *this;\r
127 }\r
128 \r
129 bool\r
130 _InputMethodInfoImpl::Equals(const Object& object) const\r
131 {\r
132         const _InputMethodInfoImpl* pInputMethodInfoImpl = static_cast<const _InputMethodInfoImpl*>(&object);\r
133         SysTryReturn(NID_UI_IME, pInputMethodInfoImpl, false, E_INVALID_ARG, "Invalid argument(s) is used. The object is not the _InputMethodInfoImpl.");\r
134 \r
135         return __appId.Equals(pInputMethodInfoImpl->__appId, true);\r
136 }\r
137 \r
138 AppId\r
139 _InputMethodInfoImpl::GetAppId(void) const\r
140 {\r
141         return __appId;\r
142 }\r
143 \r
144 const IList*\r
145 _InputMethodInfoImpl::GetLanguageList(void) const\r
146 {\r
147         return __pLanguageList;\r
148 }\r
149 \r
150 String\r
151 _InputMethodInfoImpl::GetName(void) const\r
152 {\r
153         return __name;\r
154 }\r
155 \r
156 InputMethodType\r
157 _InputMethodInfoImpl::GetType(void) const\r
158 {\r
159         return __type;\r
160 }\r
161 \r
162 const char*\r
163 _InputMethodInfoImpl::GetUuid(void) const\r
164 {\r
165         return __pUuid;\r
166 }\r
167 \r
168 void\r
169 _InputMethodInfoImpl::SetAppId(AppId id)\r
170 {\r
171         __appId = id;\r
172 }\r
173 \r
174 void\r
175 _InputMethodInfoImpl::SetUuid(String id)\r
176 {\r
177         __uuid = id;\r
178 \r
179         if (__pUuid)\r
180         {\r
181                 delete[] __pUuid;\r
182         }\r
183         __pUuid = _StringConverter::CopyToCharArrayN(id);\r
184 }\r
185 \r
186 result\r
187 _InputMethodInfoImpl::SetLanguageList(const IList& list)\r
188 {\r
189         result r = E_SUCCESS;\r
190 \r
191         __pLanguageList->RemoveAll();\r
192 \r
193         const ArrayList* pLanguageList = static_cast<const ArrayList*>(&list);\r
194         int languageCount = pLanguageList->GetCount();\r
195 \r
196         r = __pLanguageList->SetCapacity(languageCount);\r
197         SysTryReturnResult(NID_UI_IME, r == E_SUCCESS, r, "Propagating.");\r
198 \r
199         Locale* pDestLanguage = null;\r
200         for (int i = 0; i < languageCount; i++)\r
201         {\r
202                 const Locale* pLanguage = static_cast<const Locale*>(pLanguageList->GetAt(i));\r
203                 r = GetLastResult();\r
204                 SysTryCatch(NID_UI_IME, pLanguage, , r, "[%s] Propagating.", GetErrorMessage(r));\r
205 \r
206                 pDestLanguage = new(std::nothrow) Locale(*pLanguage);\r
207                 SysTryCatch(NID_UI_IME, pDestLanguage, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");\r
208 \r
209                 r = __pLanguageList->Add(pDestLanguage);\r
210                 SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));\r
211                 pDestLanguage = null;\r
212         }\r
213 \r
214         return r;\r
215 \r
216 CATCH:\r
217         __pLanguageList->RemoveAll();\r
218 \r
219         delete pDestLanguage;\r
220 \r
221         return r;\r
222 }\r
223 \r
224 void\r
225 _InputMethodInfoImpl::SetName(const String& name)\r
226 {\r
227         __name = name;\r
228 }\r
229 \r
230 void\r
231 _InputMethodInfoImpl::SetName(const scim::String& name)\r
232 {\r
233         _ScimDataConverter::ConvertString(name, __name);\r
234 }\r
235 \r
236 void\r
237 _InputMethodInfoImpl::SetType(Tizen::Ui::Ime::InputMethodType type)\r
238 {\r
239         __type = type;\r
240 }\r
241 \r
242 result\r
243 _InputMethodInfoImpl::AddLanguage(const char* language)\r
244 {\r
245         result r = E_SUCCESS;\r
246 \r
247         // verify the input parameter\r
248         const int _ISO_639_2_LENGTH = 6;\r
249         const int _ISO_639_2_LANGUAGE_CODE_LENGTH = 3;\r
250         const int _COUNTRY_CODE_LENGTH = 2;\r
251 \r
252         int length = strlen(language);\r
253         SysTryReturnResult(NID_UI_IME, (length == _ISO_639_2_LENGTH), E_INVALID_ARG,\r
254                                         "Invalid argument(s) is used. The language is not a type of ISO 639-2 and is %s.", language);\r
255 \r
256         LanguageCode languageCode = LANGUAGE_INVALID;\r
257         CountryCode countryCode = COUNTRY_INVALID;\r
258 \r
259         // LanguageCode\r
260         char srcLanguage[_ISO_639_2_LANGUAGE_CODE_LENGTH + 1];\r
261         strncpy(srcLanguage, language, _ISO_639_2_LANGUAGE_CODE_LENGTH);\r
262         srcLanguage[_ISO_639_2_LANGUAGE_CODE_LENGTH] = '\0';\r
263 \r
264         languageCode = Locale::StringToLanguageCode(srcLanguage);\r
265         SysTryReturnResult(NID_UI_IME, languageCode != LANGUAGE_INVALID, E_INVALID_ARG,\r
266                                         "Invalid argument(s) is used. The srcLanguage is %s.", srcLanguage);\r
267 \r
268         // CountryCode\r
269         char srcCountry[_COUNTRY_CODE_LENGTH + 1];\r
270         strncpy(srcCountry, language + _ISO_639_2_LANGUAGE_CODE_LENGTH + 1, _COUNTRY_CODE_LENGTH);\r
271         srcCountry[_COUNTRY_CODE_LENGTH] = '\0';\r
272 \r
273         countryCode = Locale::StringToCountryCode(srcCountry);\r
274         SysTryReturnResult(NID_UI_IME, countryCode != COUNTRY_INVALID, E_INVALID_ARG,\r
275                                         "Invalid argument(s) is used. The srcCountry is %s.", srcCountry);\r
276 \r
277         // add the language\r
278         Locale* pLanguage = new(std::nothrow) Locale(languageCode, countryCode);\r
279         SysTryReturnResult(NID_UI_IME, pLanguage, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");\r
280 \r
281         r = __pLanguageList->Add(pLanguage);\r
282         SysTryCatch(NID_UI_IME, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));\r
283         pLanguage = null;\r
284 \r
285         return r;\r
286 \r
287 CATCH:\r
288         delete pLanguage;\r
289 \r
290         return r;\r
291 }\r
292 \r
293 }}} // Tizen::Ui::Ime\r