Merge "Alarm Conditional AppLaunch Refactoring" into tizen_2.2
[platform/framework/native/appfw.git] / src / io / FIo_DataControlResultSetImpl.cpp
index 33174ef..1378cdc 100644 (file)
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
@@ -50,17 +49,20 @@ using namespace Tizen::Base::Utility;
 using namespace Tizen::Base::Collection;
 using namespace Tizen::App;
 
-const char* _DATACONTROL_RESULTSET_DIR = "/tmp/osp/DataControlResultSet/\0";
+const char* _DATACONTROL_RESULT_DIR = "/tmp/osp/data-control/result/\0";
+const char* _DATACONTROL_RESULT_COMPAT_DIR = "/tmp/osp/DataControlResult/\0";
 
 namespace Tizen { namespace Io
 {
 
+static const int _DATACONTROL_PACKET_INDEX_COLUMNCOUNT = 1;
+
 _DataControlResultSetImpl::_DataControlResultSetImpl(RequestId reqId)
        : __constructed(true)
        , __pageNo(1)
        , __countPerPage(0)
        , __result(E_SUCCESS)
-       , __tmpPath("")
+       , __tmpPath(L"")
        , __reqId(reqId)
 {
 }
@@ -84,13 +86,13 @@ _DataControlResultSetImpl::~_DataControlResultSetImpl(void)
 // [sizeof(int)] size
 // [  varient  ] content
 result
-_DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
+_DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum, String& version)
 {
-       String tempFilePath(_DATACONTROL_RESULTSET_DIR);
+       String tempFilePath;
        String columnName;
-       String* pAppId = null;
-       String* pRequestType = null;
-       String* pReqId = null;
+       String callerAppId;
+       String reqType;
+       String callerReqId;
        String* pNo = null;
        String* pCount = null;
        String* pColumnCount = null;
@@ -110,50 +112,55 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
        SysAssertf(__constructed == true, "Not yet constructed. Construct() should be called before use.\n\n");
 
        _AppControlManager* pAppMgr = _AppControlManager::GetInstance();
-       SysTryReturnResult(NID_APP, pAppMgr, E_SYSTEM, "Failed to get instance.");
+       SysTryReturnResult(NID_IO, pAppMgr, E_SYSTEM, "Failed to get instance.");
 
-       _ResultInfo* pResultInfo = pAppMgr->__resultManager.FindItem(static_cast< int >(__reqId));
-       SysTryReturnResult(NID_APP, pResultInfo, E_OBJ_NOT_FOUND,
-                       "The data control request specified with the reqId (%ld) did not exist.", __reqId);
+       _ResultInfo* pResultInfo = pAppMgr->__resultManager.FindItem(static_cast< int >(__reqId)); // provider reqId
+       SysTryReturnResult(NID_IO, pResultInfo, E_OBJ_NOT_FOUND,
+                       "The data control request specified with the req (%ld) did not exist.", __reqId);
 
        const _AppArg& arg = pResultInfo->arg;
 
-       std::unique_ptr<ArrayList, AllElementsDeleter> pList(arg.GetArgListN(0));
-       SysTryReturnResult(NID_APP, pList, E_SYSTEM, "Invalid result object.");
-
        // key-based request
-       pAppId = dynamic_cast< String* >(pList->GetAt(0)); // key[0]
-       SysTryReturnResult(NID_APP, pAppId, E_SYSTEM, "Invalid request.");
-
-       pRequestType = dynamic_cast< String* >(pList->GetAt(1)); // key[1]
-       SysTryReturnResult(NID_APP, pRequestType, E_SYSTEM, "Invalid request.");
-       Integer::Parse(*pRequestType, type);
+       reqType = arg.GetValue(OSP_K_DATACONTROL_REQUEST_TYPE);
+       Integer::Parse(reqType, type);
        requestType = static_cast< _DataControlRequestType >(type);
-       SysTryReturnResult(NID_APP, requestType ==  _DATACONTROL_REQUEST_TYPE_SQL_QUERY, E_INVALID_ARG,
+       SysTryReturnResult(NID_IO, requestType ==  _DATACONTROL_REQUEST_TYPE_SQL_QUERY, E_INVALID_ARG,
                        "The reqId should be for the data control query request.");
 
-       pReqId = dynamic_cast< String* >(pList->GetAt(2)); // key[2]
-       SysTryReturnResult(NID_APP, pReqId, E_SYSTEM, "Invalid request.");
+       callerAppId = arg.GetCallerAppId();
+       callerReqId = arg.GetValue(OSP_K_REQUEST_ID);
 
        // list-based request
-       pColumnCount = dynamic_cast< String* >(pList->GetAt(5));
-       SysTryReturnResult(NID_APP, pColumnCount, E_SYSTEM, "Invalid result object.");
+       std::unique_ptr< ArrayList, AllElementsDeleter > pList(_AppArg::GetListN(arg.GetBundle(), OSP_K_ARG));
+       SysTryReturnResult(NID_IO, pList, E_SYSTEM, "Invalid result object.");
+
+       pColumnCount = dynamic_cast< String* >(pList->GetAt(_DATACONTROL_PACKET_INDEX_COLUMNCOUNT));
+       SysTryReturnResult(NID_IO, pColumnCount, E_SYSTEM, "Invalid result object.");
        Integer::Parse(*pColumnCount, columnCount);
 
-       pageNoIndex = 5 + columnCount + 2 + 1;
+       pageNoIndex = _DATACONTROL_PACKET_INDEX_COLUMNCOUNT + columnCount + 2 + 1;
 
        pNo = dynamic_cast< String* >(pList->GetAt(pageNoIndex));
-       SysTryReturnResult(NID_APP, pNo, E_SYSTEM, "Invalid result object.");
+       SysTryReturnResult(NID_IO, pNo, E_SYSTEM, "Invalid result object.");
        Integer::Parse(*pNo, pageNo);
 
        pCount = dynamic_cast< String* >(pList->GetAt(pageNoIndex + 1));
-       SysTryReturnResult(NID_APP, pCount, E_SYSTEM, "Invalid result object.");
+       SysTryReturnResult(NID_IO, pCount, E_SYSTEM, "Invalid result object.");
        Integer::Parse(*pCount, countPerPage);
 
        this->SetCapacity(pageNo, countPerPage);
-       tempFilePath.Append(*pAppId);
-       tempFilePath.Append(*pReqId);
+       if (version == L"ver_2.1.0.3")
+       {
+               tempFilePath.Append(_DATACONTROL_RESULT_DIR);
+       }
+       else
+       {
+               tempFilePath.Append(_DATACONTROL_RESULT_COMPAT_DIR);
+       }
+       tempFilePath.Append(callerAppId);
+       tempFilePath.Append(callerReqId);
        __tmpPath = tempFilePath;
+       SysSecureLog(NID_IO, "[DC_PROV_SEND] temp file path: %ls", tempFilePath.GetPointer());
 
        // initialize
        r = pDbEnum->Reset();
@@ -167,7 +174,7 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
                if (r == E_OUT_OF_RANGE) // the previous pages do not exist
                {
                        __result = E_OUT_OF_RANGE;
-                       SysTryReturnResult(NID_APP, false, E_SUCCESS, "Out of range error.");
+                       SysTryReturnResult(NID_IO, false, E_SUCCESS, "Out of range error.");
                }
                SysTryReturnResult(NID_IO, !IsFailed(r), E_DATABASE,
                                   "The database engine has failed to enumerator result set.");
@@ -178,7 +185,7 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
        if (r == E_OUT_OF_RANGE) // the specific page is empty
        {
                __result = E_OUT_OF_RANGE;
-               SysTryReturnResult(NID_APP, false, E_SUCCESS, "Out of range error.");
+               SysTryReturnResult(NID_IO, false, E_SUCCESS, "Out of range error.");
        }
        SysTryReturnResult(NID_IO, !IsFailed(r), E_DATABASE,
                           "The database engine has failed to enumerate the result set.");
@@ -188,12 +195,12 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
 
        SysTryReturnResult(NID_IO, pFile != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
 
-       r = pFile->Construct(__tmpPath, "w+", true);
+       r = pFile->Construct(__tmpPath, L"w+", true);
        SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] Failed to create temp file (%ls) for result set.",
                        GetErrorMessage(r), __tmpPath.GetPointer());
 
        columnCount = pDbEnum->GetColumnCount();
-       SysLog(NID_IO, "column count is %d.\n", columnCount);
+       SysSecureLog(NID_IO, "column count is %d.\n", columnCount);
 
        r = pFile->Seek(FILESEEKPOSITION_BEGIN, sizeof(int));
        SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
@@ -235,8 +242,14 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
                        break;
                }
 
+               case DB_COLUMNTYPE_NULL:
+               {
+                       type = 5; // null type
+                       break;
+               }
+
                default:
-                       SysLog(NID_IO, "type: UNDEFINDE (%d)", type);
+                       SysLog(NID_IO, "type: UNDEFINED (%d)", type);
                        break;
                }
                r = pFile->Write(&type, sizeof(int));
@@ -261,7 +274,7 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
                byte = strlen(pColumnName);
                totalSizeOfColumnNames += byte;
 
-               SysLog(NID_IO, "[%d] column name: %s", i, pColumnName);
+               SysSecureLog(NID_IO, "[%d] column name: %s", i, pColumnName);
                delete[] pColumnName;
        }
        r = pFile->Seek(FILESEEKPOSITION_BEGIN, sizeof(int) * 2);
@@ -296,7 +309,6 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
 
                                r = pFile->Write(&size, sizeof(int));
                                SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
-
                                r = pFile->Write(&int64Value, sizeof(long long));
                                SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
                                break;
@@ -342,9 +354,11 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
                                r = pFile->Write(&size, sizeof(int));
                                SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
 
-                               r = pFile->Write(pContent.get(), size);
-                               SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
-
+                               if (size > 0)
+                               {
+                                       r = pFile->Write(pContent.get(), size);
+                                       SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
+                               }
                                break;
                        }
 
@@ -367,7 +381,23 @@ _DataControlResultSetImpl::FillWith(IDbEnumerator* pDbEnum)
                                r = pFile->Write(&size, sizeof(int));
                                SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
 
-                               r = pFile->Write(blobValue);
+                               if (size > 0)
+                               {
+                                       r = pFile->Write(blobValue);
+                                       SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
+                               }
+                               break;
+                       }
+
+                       case DB_COLUMNTYPE_NULL:
+                       {
+                               int type = 5; // null
+                               int size = 0;
+
+                               r = pFile->Write(&type, sizeof(int));
+                               SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
+
+                               r = pFile->Write(&size, sizeof(int));
                                SysTryReturn(NID_IO, r == E_SUCCESS, r, r, "[%s] System error was occurred.", GetErrorMessage(r));
                                break;
                        }