• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #include "oscl_configfile_list.h"
19 #include "oscl_string.h"
20 #include "oscl_file_io.h"
21 #include "oscl_file_find.h"
22 #include "oscl_file_types.h"
23 #include "pvlogger.h"
24 #include "oscl_uuid.h"
25 
26 #define CONFIG_FILE_EXTENSION "*.cfg"
27 #define OSCL_NUMBER_OF_CONFIG_FILES 16
28 
SetupLibraryEnv(const char * aEnvName,const char * aEnvValue)29 OSCL_EXPORT_REF OsclLibStatus OsclLibraryUtil::SetupLibraryEnv(const char* aEnvName, const char* aEnvValue)
30 {
31     // currently only MSWIN is supported;
32     // Linux is not implemented since its library search path needs to be set at compilation time
33     OsclLibStatus aStatus = OsclLibSuccess;
34 
35     OSCL_UNUSED_ARG(aEnvName);
36     OSCL_UNUSED_ARG(aEnvValue);
37     aStatus = OsclLibNotSupported;
38     return aStatus;
39 }
40 
41 
OsclConfigFileList()42 OSCL_EXPORT_REF OsclConfigFileList::OsclConfigFileList()
43 {
44     ipLogger = PVLogger::GetLoggerObject("oscllib");
45 #if OSCL_LIBRARY_PERF_LOGGING
46     iDiagnosticsLogger = PVLogger::GetLoggerObject("pvplayerdiagnostics.oscllib.osclconfigfilelist");
47     iCfgFileNum = 0;
48 #endif
49     int32 err = 0;
50     OSCL_TRY(err,
51              iCfgList.reserve(OSCL_NUMBER_OF_CONFIG_FILES);
52             );
53     if (err)
54     {
55         iCfgList.clear();
56         OSCL_LEAVE(err);
57     }
58 }
59 
~OsclConfigFileList()60 OSCL_EXPORT_REF OsclConfigFileList::~OsclConfigFileList()
61 {
62     ipLogger = NULL;
63 #if OSCL_LIBRARY_PERF_LOGGING
64     iDiagnosticsLogger = NULL;
65 #endif
66     iCfgList.clear();
67 }
68 
69 // This method finds all files with extention .cfg in given directory
70 // using oscl_file_find and stores in a vector in iCfgList
71 // each cfg in iCfgList stored with whole pathname
72 // @Return: OsclLibSuccess if any config file found, OsclLibNotFound if not any, OsclLibFail otherwise
73 
Populate(const OSCL_String & aConfigFileDir,OsclConfigFileList::SortType aSortType)74 OSCL_EXPORT_REF OsclLibStatus OsclConfigFileList::Populate(const OSCL_String& aConfigFileDir, OsclConfigFileList::SortType aSortType)
75 {
76     PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, ipLogger, PVLOGMSG_DEBUG,
77                     (0, "OsclConfigFileList::Populate '%s' IN", aConfigFileDir.get_cstr()));
78 #if OSCL_LIBRARY_PERF_LOGGING
79     TICK starttime;
80     SET_TICK(starttime);
81     iCfgFileNum = 0;
82 #endif
83     Oscl_FileFind aCfgFind;
84     OsclLibStatus status = OsclLibSuccess;
85     char* strbuf = (char*)OSCL_MALLOC(OSCL_IO_FILENAME_MAXLEN * sizeof(char));
86     if (NULL == strbuf)
87         return OsclLibOutOfMemory;
88     if (NULL == aCfgFind.FindFirst(aConfigFileDir.get_str(), CONFIG_FILE_EXTENSION, strbuf, OSCL_IO_FILENAME_MAXLEN))
89     {
90         OSCL_FREE(strbuf);
91         strbuf = NULL;
92         if (Oscl_FileFind::E_NO_MATCH == aCfgFind.GetLastError())
93         {
94             status = OsclLibNotFound;
95         }
96         else
97         {
98             iCfgList.clear();
99             return OsclLibFail;
100         }
101     }
102     else
103     {
104         //oscl_file_find return file with pathname.
105         iCfgList.push_front(strbuf);
106 #if OSCL_LIBRARY_PERF_LOGGING
107         iCfgFileNum++;
108 #endif
109         // found first config file, continue until Oscl_FileFind::E_NO_MATCH
110         while (aCfgFind.FindNext(strbuf, OSCL_IO_FILENAME_MAXLEN) && Oscl_FileFind::E_NO_MATCH != aCfgFind.GetLastError())
111         {
112             iCfgList.push_back(strbuf);
113 #if OSCL_LIBRARY_PERF_LOGGING
114             iCfgFileNum++;
115 #endif
116         }
117 #if OSCL_LIBRARY_PERF_LOGGING
118         uint32 difftime;
119         DIFF_TICK(starttime, difftime);
120         PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iDiagnosticsLogger, PVLOGMSG_INFO,
121                         (0, "OsclConfigFileList::Populate - Searching path %s ...", aConfigFileDir.get_cstr()));
122         PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iDiagnosticsLogger, PVLOGMSG_INFO,
123                         (0, "                                   Time taken = %d ticks", difftime));
124         PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iDiagnosticsLogger, PVLOGMSG_INFO,
125                         (0, "                                   Number of config files found = %d", iCfgFileNum));
126 #endif
127     }
128     OSCL_FREE(strbuf);
129     // error if there's none config file found and loaded in the vector,
130     if (iCfgList.size() <= 0)
131     {
132         PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, ipLogger, PVLOGMSG_WARNING,
133                         (0, "OsclConfigFileList::Populate, Didn't find any config file in %s", aConfigFileDir.get_str()));
134         status = OsclLibNotFound;
135     }
136     // Sort the list if requested
137     else if (aSortType != OsclConfigFileList::ENoSort)
138     {
139         Sort();
140     }
141 
142     return status;
143 }
144 
Size()145 OSCL_EXPORT_REF uint32 OsclConfigFileList::Size()
146 {
147     return iCfgList.size();
148 }
149 
GetConfigfileAt(uint32 n)150 OSCL_EXPORT_REF const OSCL_String& OsclConfigFileList::GetConfigfileAt(uint32 n)
151 {
152     return iCfgList[n];
153 }
154 
Sort()155 void OsclConfigFileList::Sort()
156 {
157     uint32 numConfigs = Size();
158     uint32 ii = 0;
159     bool swapped = false;
160 
161     // Bubblesort iCfgList - As long as there aren't very many config files
162     // in the list, efficiency shouldn't be an issue. If the list gets to be
163     // too large (100+) then a new sort algorithm should be used.
164     do
165     {
166         swapped = false;
167         for (ii = 0; ii < numConfigs - 1; ii++)
168         {
169             if (oscl_strncmp(iCfgList[ii].get_cstr(),
170                              iCfgList[ii + 1].get_cstr(),
171                              oscl_strlen(iCfgList[ii].get_cstr())) > 0)
172             {
173                 OSCL_StackString<OSCL_IO_FILENAME_MAXLEN> temp = iCfgList[ii];
174                 iCfgList[ii] = iCfgList[ii + 1];
175                 iCfgList[ii + 1] = temp;
176                 swapped = true;
177             }
178         }
179     }
180     while (swapped);
181 }
182 
183