From 34c50b2cc0462a63edaed4b074a24169ecd67c30 Mon Sep 17 00:00:00 2001 From: payton Date: Tue, 2 Jan 2024 13:54:36 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=90=88=E5=B9=B6Linux=E4=B8=8B=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cardv/SrcCode/UIApp/Play/UIAppPlay_Exe.c | 14 +++-- .../cardv/SrcCode/UIApp/Play/UIPlayComm.c | 54 +++++++++++------- code/lib/include/PBXFileList/PBXFileList.h | 1 + .../pbxfilelist_dcf/libpbxfilelist_dcf.a | Bin 10326 -> 11420 bytes .../pbxfilelist_dcf/libpbxfilelist_dcf.so | Bin 14268 -> 14548 bytes 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/code/application/source/cardv/SrcCode/UIApp/Play/UIAppPlay_Exe.c b/code/application/source/cardv/SrcCode/UIApp/Play/UIAppPlay_Exe.c index ee8e118b9..6144b5d24 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Play/UIAppPlay_Exe.c +++ b/code/application/source/cardv/SrcCode/UIApp/Play/UIAppPlay_Exe.c @@ -15,6 +15,7 @@ #include "UIApp/Network/UIAppWiFiCmd.h" #include "GxStrg.h" #include "GxVideoFile.h" +#include "DCF.h" #define PB_FILE_FMT PBFMT_JPG | PBFMT_WAV | PBFMT_AVI | PBFMT_MOVMJPG | PBFMT_MP4 | PBFMT_TS #define RTSP_PLAY_FUNC DISABLE @@ -233,7 +234,7 @@ BOOL PBDecVideoCB(UINT32 uiUserDataAddr, UINT32 uiUserDataSize) */ INT32 PlayExe_OnOpen(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray) { - printf("[------------------------------------------------------------------------------------------------------------------]\n"); + UINT32 useFileDB = 0; UINT32 uiPoolAddr = (UINT32)mempool_filedb; @@ -260,7 +261,7 @@ INT32 PlayExe_OnOpen(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray) if (useFileDB) { CHAR *rootPath = "A:\\"; //CHAR* defaultfolder="A:\\CarDV\\"; - printf("[---------useFileDB IN -]%d\n", useFileDB); + PPBX_FLIST_OBJ pFlist = PBXFList_FDB_getObject(); pFlist->Config(PBX_FLIST_CONFIG_MEM, uiPoolAddr, POOL_SIZE_FILEDB); pFlist->Config(PBX_FLIST_CONFIG_MAX_FILENUM, 5000, 0); @@ -275,8 +276,13 @@ INT32 PlayExe_OnOpen(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray) pFlist->Config(PBX_FLIST_CONFIG_SUPPORT_LONGNAME, 1, 0); PB_SetParam(PBPRMID_FILELIST_OBJ, (UINT32)pFlist); } else { - printf("[---------useFileDB not in -]%d\n", useFileDB); - PB_SetParam(PBPRMID_FILELIST_OBJ, (UINT32)PBXFList_DCF_getObject()); + extern DCF_HANDLE System_Get_DCF_Handle(void); + + PPBX_FLIST_OBJ pFlist = PBXFList_DCF_getObject(); + DCF_HANDLE handle = System_Get_DCF_Handle(); + + pFlist->Config(PBX_FLIST_CONFIG_DCF_HANDLE, (UINT32)handle, 0); + PB_SetParam(PBPRMID_FILELIST_OBJ, (UINT32)pFlist); } PB_SetParam(PBPRMID_DEC_VIDEO_CALLBACK, (UINT32)PBDecVideoCB); PB_SetParam(PBPRMID_ONDRAW_CALLBACK, (UINT32)PBView_OnDrawCB); diff --git a/code/application/source/cardv/SrcCode/UIApp/Play/UIPlayComm.c b/code/application/source/cardv/SrcCode/UIApp/Play/UIPlayComm.c index 9bffa3b03..1a0d1b980 100755 --- a/code/application/source/cardv/SrcCode/UIApp/Play/UIPlayComm.c +++ b/code/application/source/cardv/SrcCode/UIApp/Play/UIPlayComm.c @@ -15,6 +15,7 @@ #define __DBGFLT__ "*" //*=All, [mark]=CustomClass #include +extern DCF_HANDLE System_Get_DCF_Handle(void); void CloseAutoHideTimer(void) { @@ -61,11 +62,13 @@ void ChkKeySoundComm(void) static BOOL gbNoFile = TRUE; + static void xUIPlay_Filesys_DelCB(FIND_DATA *pFindData, BOOL *bDelete, UINT32 Param1, UINT32 Param2) { INT32 fileNum; UINT32 fileType; - UINT32 filterType = (DCF_GetDBInfo(DCF_INFO_VALID_FILE_FMT) | DCF_GetDBInfo(DCF_INFO_DEP_FILE_FMT)); + DCF_HANDLE dcf_handle = System_Get_DCF_Handle(); + UINT32 filterType = (DCF_GetDBInfoEx(dcf_handle, DCF_INFO_VALID_FILE_FMT) | DCF_GetDBInfoEx(dcf_handle, DCF_INFO_DEP_FILE_FMT)); UINT8 attrib; attrib = pFindData->attrib; @@ -85,7 +88,8 @@ static void xUIPlay_Filesys_LockCB(FIND_DATA *pFindData, BOOL *bApply, UINT32 Pa { INT32 fileNum; UINT32 fileType; - UINT32 filterType = (DCF_GetDBInfo(DCF_INFO_VALID_FILE_FMT) | DCF_GetDBInfo(DCF_INFO_DEP_FILE_FMT)); + DCF_HANDLE dcf_handle = System_Get_DCF_Handle(); + UINT32 filterType = (DCF_GetDBInfoEx(dcf_handle, DCF_INFO_VALID_FILE_FMT) | DCF_GetDBInfoEx(dcf_handle, DCF_INFO_DEP_FILE_FMT)); DBG_IND("FileName = %s\r\n", pFindData->FATMainName); @@ -102,14 +106,15 @@ static void xUIPlay_FList_DCF_DelAll(void) char path[DCF_FULL_FILE_PATH_LEN]; BOOL ret; UINT32 i, uiMaxDirNum; + DCF_HANDLE dcf_handle = System_Get_DCF_Handle(); - uiMaxDirNum = DCF_GetDBInfo(DCF_INFO_MAX_DIR_ID); + uiMaxDirNum = DCF_GetDBInfoEx(dcf_handle, DCF_INFO_MAX_DIR_ID); for (i = 100; i <= uiMaxDirNum; i++) { // check if folder has file - ret = DCF_GetDirInfo(i, &dirinfo); + ret = DCF_GetDirInfoEx(dcf_handle, i, &dirinfo); if (ret /*&& dirinfo.uiNumOfDcfObj*/) { // delete all in one folder - DCF_GetDirPath(i, path); + DCF_GetDirPathEx(dcf_handle, i, path); gbNoFile = TRUE; FileSys_DelDirFiles(path, xUIPlay_Filesys_DelCB); // delete empty folder @@ -120,7 +125,7 @@ static void xUIPlay_FList_DCF_DelAll(void) } } } - DCF_Refresh(); + DCF_RefreshEx(dcf_handle); } static ER xUIPlay_FList_FDB_ProtectFile(UINT32 cmdID) { @@ -191,13 +196,14 @@ static void xUIPlay_FList_DCF_LockAll(BOOL bLock) SDCFDIRINFO dirinfo = {0}; char path[DCF_FULL_FILE_PATH_LEN] = {0}; UINT32 i, uiMaxDirNum; + DCF_HANDLE dcf_handle = System_Get_DCF_Handle(); - uiMaxDirNum = DCF_GetDBInfo(DCF_INFO_MAX_DIR_ID); + uiMaxDirNum = DCF_GetDBInfoEx(dcf_handle, DCF_INFO_MAX_DIR_ID); for (i = 100; i <= uiMaxDirNum; i++) { // check if folder has file - if (DCF_GetDirInfo(i, &dirinfo)) { + if (DCF_GetDirInfoEx(dcf_handle, i, &dirinfo)) { if (dirinfo.uiNumOfDcfObj) { - DCF_GetDirPath(i, path); + DCF_GetDirPathEx(dcf_handle, i, path); FileSys_LockDirFiles(path, bLock, xUIPlay_Filesys_LockCB); } } @@ -209,6 +215,7 @@ static ER xUIPlay_FList_DCF_ProtectFile(UINT32 cmdID) char filePath[DCF_FULL_FILE_PATH_LEN]; UINT32 index, i, uiThisFileFormat, tmpFileType; BOOL bLock; + DCF_HANDLE dcf_handle = System_Get_DCF_Handle(); DBG_IND("cmdID=%d\r\n", cmdID); if ((cmdID == PLAY_PROTECT_ONE) || (cmdID == PLAY_UNPROTECT_ONE)) { @@ -217,13 +224,13 @@ static ER xUIPlay_FList_DCF_ProtectFile(UINT32 cmdID) } else { bLock = FALSE; // unlock } - index = DCF_GetCurIndex(); - uiThisFileFormat = DCF_GetDBInfo(DCF_INFO_CUR_FILE_TYPE); + index = DCF_GetDBInfoEx(dcf_handle, DCF_INFO_CUR_INDEX); + uiThisFileFormat = DCF_GetDBInfoEx(dcf_handle, DCF_INFO_CUR_FILE_TYPE); for (i = 0; i <= DCF_FILE_TYPE_NUM; i++) { tmpFileType = 1; tmpFileType <<= i; if (uiThisFileFormat & tmpFileType) { - DCF_GetObjPath(index, tmpFileType, filePath); + DCF_GetObjPathEx(dcf_handle, index, tmpFileType, filePath); FileSys_SetAttrib(filePath, FST_ATTRIB_READONLY, bLock); } } @@ -361,6 +368,9 @@ static ER xUIPlay_FList_FDB_DelFile(UINT32 cmdID) static ER xUIPlay_FList_DCF_DelFile(UINT32 cmdID) { DBG_IND("cmdID=%d\r\n", cmdID); + + DCF_HANDLE dcf_handle = System_Get_DCF_Handle(); + if (cmdID == PB_DELETE_ONE) { //#NT#2016/05/24#Ben Wang -begin //#NT#Fix the coverity issue. @@ -368,14 +378,14 @@ static ER xUIPlay_FList_DCF_DelFile(UINT32 cmdID) //#NT#2016/05/24#Ben Wang -end CHAR filePath[DCF_FULL_FILE_PATH_LEN] = {0}; - index = DCF_GetCurIndex(); - uiThisFileFormat = DCF_GetDBInfo(DCF_INFO_CUR_FILE_TYPE); + index = DCF_GetDBInfoEx(dcf_handle, DCF_INFO_CUR_INDEX); + uiThisFileFormat = DCF_GetDBInfoEx(dcf_handle, DCF_INFO_CUR_FILE_TYPE); for (i = 0; i <= DCF_FILE_TYPE_NUM; i++) { tmpFileType = 0x0001 << i; if (uiThisFileFormat & tmpFileType) { - if (DCF_GetObjPath(index, uiThisFileFormat, filePath)) { + if (DCF_GetObjPathEx(dcf_handle, index, uiThisFileFormat, filePath)) { if (FST_STA_OK == FileSys_DeleteFile(filePath)) { - DCF_DelDBfile(filePath); + DCF_DelDBfileEx(dcf_handle, filePath); } } } @@ -387,9 +397,9 @@ static ER xUIPlay_FList_DCF_DelFile(UINT32 cmdID) UINT32 DirID = 0, FileID = 0, Index = 0, uiThisFileFormat = 0; BOOL isCurrFileReadOnly = FALSE; - Index = DCF_GetDBInfo(DCF_INFO_CUR_INDEX); - DCF_GetObjInfo(Index, &DirID, &FileID, &uiThisFileFormat); - DCF_GetObjPath(Index, uiThisFileFormat, filePath); + Index = DCF_GetDBInfoEx(dcf_handle, DCF_INFO_CUR_INDEX); + DCF_GetObjInfoEx(dcf_handle, Index, &DirID, &FileID, &uiThisFileFormat); + DCF_GetObjPathEx(dcf_handle, Index, uiThisFileFormat, filePath); ret = FileSys_GetAttrib(filePath, &attrib); if ((ret == E_OK) && M_IsReadOnly(attrib) == TRUE) { @@ -399,10 +409,10 @@ static ER xUIPlay_FList_DCF_DelFile(UINT32 cmdID) // --------- delete all files ----------------------- xUIPlay_FList_DCF_DelAll(); if (isCurrFileReadOnly) { - Index = DCF_GetIndexByID(DirID, FileID); - DCF_SetCurIndex(Index); + Index = DCF_GetIndexByIDEx(dcf_handle, DirID, FileID); + DCF_SetCurIndexEx(dcf_handle, Index); } - DCF_Refresh(); + DCF_RefreshEx(dcf_handle); } return E_OK; } diff --git a/code/lib/include/PBXFileList/PBXFileList.h b/code/lib/include/PBXFileList/PBXFileList.h index d2ba23dac..6d1179df5 100755 --- a/code/lib/include/PBXFileList/PBXFileList.h +++ b/code/lib/include/PBXFileList/PBXFileList.h @@ -78,6 +78,7 @@ typedef enum _PBX_FLIST_CONFIG_ID { PBX_FLIST_CONFIG_SORT_BYSN_DELIMSTR = 0x10, ///< only for FileDB, set the delimiter string, e.g. underline "_", "AA" PBX_FLIST_CONFIG_SORT_BYSN_DELIMNUM = 0x11, ///< only for FileDB, set the delimiter count to find the serial number PBX_FLIST_CONFIG_SORT_BYSN_NUMOFSN = 0x12, ///< only for FileDB, set the character number of the serial number + PBX_FLIST_CONFIG_DCF_HANDLE = 0x13, ///< only for DCF , multi storage DCF handle ENUM_DUMMY4WORD(PBX_FLIST_CONFIG_ID) } PBX_FLIST_CONFIG_ID; diff --git a/code/lib/source/pbxfilelist_dcf/libpbxfilelist_dcf.a b/code/lib/source/pbxfilelist_dcf/libpbxfilelist_dcf.a index 6bff2c316a6297526179324384aa6590367fd650..1747f888c89c2c910b22b412bb879282f39eb6e1 100644 GIT binary patch literal 11420 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 z zXnleymhlagxdem2#s&WNXTI4pgE!Z#L32Y55* zmljP8p^RlcDz6~Wb_Oo{1>EuhO#)0%I^D;eryiX5LJvmq_q$ZX*ckG&ez8d7cAUO@O(x##ay06L(sl<*vEWN`)HT3?*^`e_T7en z`->??UmguXeQ#reGH9c|1gg>ZLtF>-y;&tPjW$z^zQ004P+vWQ?4phOxGx%gAK^Nv z&%=UX>`gKHN@xh`YlXff+Nh6j8;!m=lm+!2hrWg8HwI8pUuQrc^%{MfEPYeZcN=n3 zjC~s|eaE4XYk~IRXjay@-_qB))ZhPYeS0i@H=(al>#Ggu8?yA>g}$6org3BkEPc13 z&qX`!AMeo_$wEq?>!3_!{l%t zOfk53t#Ml)t=yN)DP~-JlnkwdTIl0*gegW}!P3_beSZuP{lH~eAOGKk-A%r_ft!Nw zI!rP8@Nzh`u0Da1A%LilZ%vJT8?`=@uRdGu%WQqyE!_P@aQiGAZ?dvYdR*!rvT!lr z8qA;p+yHRF`{T%CmH8#!`0=vV*Q|9kLSOLhFmVji?_0Qoz+KXPNDS_8EZi;NzP$kM z6O98=r3=p=e3xko^|3?|V2*EaLyO?*EZj73e3xp9(U-Dt*A~&&ZsFbpZlh5KYV-|h zoTp{~2wd=ODs5-|md0tAM40pfg&3Bzz~OJ)=g=3p9fkolI8qZ6igyB+#*N8&%%IXf e-hW&J&{r-~NEUw`XfXO#Sh(w0FTb?_?tcM*+u4)= literal 10326 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