2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FApp_DataControlProviderManagerImpl.cpp
20 * @brief This is the implementation for the %_DataControlProviderManagerImpl class.
23 #include <unique_ptr.h>
25 #include <FBaseDataType.h>
26 #include <FBaseInteger.h>
27 #include <FBaseString.h>
28 #include <FBaseLongLong.h>
29 #include <FBaseColArrayList.h>
30 #include <FBaseColIList.h>
31 #include <FBaseErrors.h>
32 #include <FAppAppManager.h>
33 #include <FAppSqlDataControl.h>
34 #include <FAppMapDataControl.h>
35 #include <FAppDataControlProviderManager.h>
37 #include <FBaseSysLog.h>
38 #include <FIo_DataControlResultSetImpl.h>
41 #include "FApp_AppArg.h"
42 #include "FApp_AppInfo.h"
43 #include "FApp_AppImpl.h"
44 #include "FApp_AppControlManager.h"
45 #include "FApp_SqlDataControlImpl.h"
46 #include "FApp_MapDataControlImpl.h"
47 #include "FApp_DataControlProviderManagerImpl.h"
49 using namespace Tizen::Base;
50 using namespace Tizen::Base::Collection;
51 using namespace Tizen::Io;
53 extern const char* _DATACONTROL_RESULTSET_DIR;
55 namespace Tizen { namespace App
59 _DataControlProviderManagerImpl::SetSqlDataControlProviderEventListener(ISqlDataControlProviderEventListener* pListener)
61 _AppImpl* pAppImpl = _AppImpl::GetInstance();
62 SysTryReturn(NID_APP, pAppImpl, false, E_INVALID_STATE, "[E_INVALID_STATE] Getting _AppImpl instance failed.");
64 return pAppImpl->SetSqlDataControlProviderEventListener(pListener);
68 _DataControlProviderManagerImpl::SetMapDataControlProviderEventListener(IMapDataControlProviderEventListener* pListener)
70 _AppImpl* pAppImpl = _AppImpl::GetInstance();
71 SysTryReturn(NID_APP, pAppImpl, false, E_INVALID_STATE, "[E_INVALID_STATE] Getting _AppImpl instance failed.");
73 return pAppImpl->SetMapDataControlProviderEventListener(pListener);
77 _DataControlProviderManagerImpl::SendDataControlResult(RequestId reqId, _DataControlRequestType apiType,
78 IDbEnumerator* pDbEnum, IList* pResultValueList, long long insertRowId, bool providerResult, const String* pErrorMsg)
80 ArrayList* pList = null;
81 String* pAppId = null;
82 String* pRequestType = null;
84 _DataControlRequestType requestType = _DATACONTROL_REQUEST_TYPE_UNDEFINED;
85 String* pProviderId = null;
86 String* pReqId = null;
87 ArrayList* pResultArgList = null;
88 String* pResult = null;
89 String* pErrorMessage = null;
90 String* pTempFilePath = null;
93 String* pCount = null;
95 String* pResultCount = null;
96 String* pResultValue = null;
100 _AppControlManager* pAppMgr = _AppControlManager::GetInstance();
101 SysTryReturnResult(NID_APP, pAppMgr, E_SYSTEM, "Failed to get instance.");
103 _ResultInfo* pResultInfo = pAppMgr->__resultManager.FindItem(static_cast< int >(reqId));
104 SysTryReturnResult(NID_APP, pResultInfo, E_OBJ_NOT_FOUND,
105 "The data control request specified with the reqId (%ld) did not exist.", reqId);
107 const _AppArg& arg = pResultInfo->arg;
109 pList = arg.GetArgListN(0);
110 SysTryCatch(NID_APP, pList, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
113 pAppId = dynamic_cast< String* >(pList->GetAt(0)); // request key[0]
114 SysTryCatch(NID_APP, pAppId, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
116 pRequestType = dynamic_cast< String* >(pList->GetAt(1)); // request key[1]
117 SysTryCatch(NID_APP, pRequestType, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
118 Integer::Parse(*pRequestType, type);
119 requestType = static_cast< _DataControlRequestType >(type);
121 if (providerResult == true && apiType != requestType)
123 if ((apiType == _DATACONTROL_REQUEST_TYPE_SQL_UPDATE /*UpdateDelete*/ && requestType == _DATACONTROL_REQUEST_TYPE_SQL_DELETE) ||
124 apiType == _DATACONTROL_REQUEST_TYPE_UNDEFINED /*MAP*/)
131 SysLog(NID_APP, "[E_INVALID_ARG] This method cannot send the result set for the specified reqId.");
136 pReqId = dynamic_cast< String* >(pList->GetAt(2)); // request key[2]
137 SysTryCatch(NID_APP, pReqId, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
139 pProviderId = dynamic_cast< String* >(pList->GetAt(3)); // request key[3]
140 SysTryCatch(NID_APP, pProviderId, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
142 // Serializes the result
143 pResultArgList = new (std::nothrow) ArrayList();
144 SysTryCatch(NID_APP, pResultArgList, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
145 "[E_OUT_OF_MEMORY] The memory was insufficient.");
146 pResultArgList->Construct();
148 pResult = new (std::nothrow) String();
149 SysTryCatch(NID_APP, pResult, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
150 "[E_OUT_OF_MEMORY] The memory was insufficient.");
151 pResult->Append(static_cast< int >(providerResult));
152 pResultArgList->Add(*pResult); // result list[0]
154 if (pErrorMsg == null)
156 pErrorMessage = new (std::nothrow) String();
160 pErrorMessage = new (std::nothrow) String(*pErrorMsg);
162 SysTryCatch(NID_APP, pErrorMessage, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
163 "[E_OUT_OF_MEMORY] The memory was insufficient.");
164 pResultArgList->Add(*pErrorMessage); // result list[1]
168 case _DATACONTROL_REQUEST_TYPE_SQL_QUERY:
172 std::unique_ptr<_DataControlResultSetImpl> pResultSet(new (std::nothrow) _DataControlResultSetImpl(reqId));
173 SysTryCatch(NID_APP, pResultSet, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
174 "[E_OUT_OF_MEMORY] The memory is insufficient.");
176 r = pResultSet->FillWith(pDbEnum);
177 SysTryCatch(NID_APP, !IsFailed(r), , E_SYSTEM,
178 "[E_SYSTEM] The method cannot proceed due to a severe system error.");
180 String tempFilePath(_DATACONTROL_RESULTSET_DIR);
181 tempFilePath.Append(*pAppId);
182 tempFilePath.Append(*pReqId);
183 pTempFilePath = new (std::nothrow) String(tempFilePath);
187 pTempFilePath = new (std::nothrow) String(L"NoResultSet");
189 SysTryCatch(NID_APP, pTempFilePath, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
190 "[E_OUT_OF_MEMORY] The memory is insufficient.");
192 pResultArgList->Add(*pTempFilePath); // result list[2]
195 case _DATACONTROL_REQUEST_TYPE_SQL_INSERT:
196 pResultArgList->Add(*(new String(LongLong::ToString(insertRowId)))); // result list[2]
199 case _DATACONTROL_REQUEST_TYPE_SQL_UPDATE:
201 case _DATACONTROL_REQUEST_TYPE_SQL_DELETE:
204 case _DATACONTROL_REQUEST_TYPE_MAP_QUERY:
206 SysTryCatch(NID_APP, !(providerResult == true && pResultValueList == null), r = E_INVALID_ARG, E_INVALID_ARG,
207 "[E_INVALID_ARG] The specified pResultValueList should not be null if the request is GetValue query.");
209 if (pResultValueList)
211 // list-based request
212 pNo = dynamic_cast< String* >(pList->GetAt(6)); // request list[2]
213 SysTryCatch(NID_APP, pNo, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
214 Integer::Parse(*pNo, pageNo);
216 pCount = dynamic_cast< String* >(pList->GetAt(7)); // request list[3]
217 SysTryCatch(NID_APP, pCount, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
218 Integer::Parse(*pCount, countPerPage);
221 int num = pResultValueList->GetCount();
222 int currentoffset = (pageNo - 1) * countPerPage;
223 int remainingNum = num - currentoffset;
224 remainingNum = (remainingNum > 0) ? remainingNum : 0; // round off to zero if negative num is found
225 int addItemCount = (countPerPage > remainingNum) ? remainingNum : countPerPage;
226 resultCount.Append(addItemCount);
228 pResultCount = new (std::nothrow) String(resultCount);
229 SysTryCatch(NID_APP, pResultCount, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
230 "[E_OUT_OF_MEMORY] The memory was insufficient.");
231 pResultArgList->Add(*pResultCount); // result list[2]
233 for (int i = currentoffset; i < num; i++)
235 String* pTempValue = dynamic_cast< String* >(pResultValueList->GetAt(i));
236 SysTryCatch(NID_APP, pTempValue != null, r = E_INVALID_ARG, E_INVALID_ARG,
237 "[E_INVALID_ARG] The specified pResultValueList parameter should be String class.");
239 pResultValue = new (std::nothrow) String(*pTempValue);
240 SysTryCatch(NID_APP, pResultValue, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY,
241 "[E_OUT_OF_MEMORY] The memory was insufficient.");
242 pResultArgList->Add(*pResultValue); // list[3] ~
247 case _DATACONTROL_REQUEST_TYPE_MAP_INSERT:
249 case _DATACONTROL_REQUEST_TYPE_MAP_UPDATE:
251 case _DATACONTROL_REQUEST_TYPE_MAP_DELETE:
252 SysTryCatch(NID_APP, !(providerResult == true && pResultValueList != null), r = E_INVALID_ARG, E_INVALID_ARG,
253 "[E_INVALID_ARG] The specified pResultValueList should be null if the request is \
254 one of AddValue, SetValue, RemoveValue queries.");
258 SysTryCatch(NID_APP, false, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] invalid result object");
262 r = resultArg.ConstructResult(arg, pResultArgList);
263 SysTryCatch(NID_APP, !IsFailed(r), r = E_SYSTEM, r, "[%s] Propagating.", GetErrorMessage(r));
266 r = _Aul::SendResult(resultArg.GetBundle(), static_cast< appsvc_result_val >(0));
267 SysTryCatch(NID_APP, !IsFailed(r), , r, "[%s] Failed to send result.", GetErrorMessage(r));
269 // Erases _AppArg after sending the result back to the caller
270 pAppMgr->__resultManager.RemoveItem(static_cast< int >(reqId));
275 pList->RemoveAll(true);
281 pResultArgList->RemoveAll(true);
283 delete pResultArgList;
289 _DataControlProviderManagerImpl::SendSqlDataControlSelectResult(RequestId reqId, IDbEnumerator* pDbEnum)
291 return _DataControlProviderManagerImpl::SendDataControlResult(reqId, _DATACONTROL_REQUEST_TYPE_SQL_QUERY,
292 pDbEnum, null, -1, true, null);
296 _DataControlProviderManagerImpl::SendSqlDataControlInsertResult(RequestId reqId, long long insertRowId)
298 return _DataControlProviderManagerImpl::SendDataControlResult(reqId, _DATACONTROL_REQUEST_TYPE_SQL_INSERT,
299 null, null, insertRowId, true, null);
303 _DataControlProviderManagerImpl::SendSqlDataControlUpdateDeleteResult(RequestId reqId)
305 return _DataControlProviderManagerImpl::SendDataControlResult(reqId, _DATACONTROL_REQUEST_TYPE_SQL_UPDATE,
306 null, null, -1, true, null);
310 _DataControlProviderManagerImpl::SendMapDataControlResult(RequestId reqId, IList* pResultValueList)
312 return _DataControlProviderManagerImpl::SendDataControlResult(reqId, _DATACONTROL_REQUEST_TYPE_UNDEFINED,
313 null, pResultValueList, -1, true, null);
317 _DataControlProviderManagerImpl::SendDataControlError(RequestId reqId, const String& errorMsg)
319 return _DataControlProviderManagerImpl::SendDataControlResult(reqId, _DATACONTROL_REQUEST_TYPE_UNDEFINED,
320 null, null, -1, false, &errorMsg);
323 DataControlProviderManager*
324 _DataControlProviderManagerImpl::GetInstance(void)
326 static DataControlProviderManager* pDcMgr = null;
330 pDcMgr = new (std::nothrow) DataControlProviderManager();
331 SysTryReturn(NID_APP, pDcMgr, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory was insufficient.");
338 _DataControlProviderManagerImpl::_DataControlProviderManagerImpl(void)
342 _DataControlProviderManagerImpl::~_DataControlProviderManagerImpl(void)