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