// This header file is automatically generated at build-time
// *** OFFICIAL RELEASE INFO -- Will not auto update
-#define PV2WAY_ENGINE_SDKINFO_LABEL "1017470"
+#define PV2WAY_ENGINE_SDKINFO_LABEL "1017508"
#define PV2WAY_ENGINE_SDKINFO_DATE 0x20091013
#endif //PV_2WAY_SDKINFO_H_INCLUDED
// This header file is automatically generated at build-time
// *** OFFICIAL RELEASE INFO -- Will not auto update
-#define PVAUTHOR_ENGINE_SDKINFO_LABEL "1017470"
+#define PVAUTHOR_ENGINE_SDKINFO_LABEL "1017508"
#define PVAUTHOR_ENGINE_SDKINFO_DATE 0x20091013
#endif //PV_AUTHOR_SDKINFO_H_INCLUDED
// This header file is automatically generated at build-time
// *** OFFICIAL RELEASE INFO -- Will not auto update
-#define PVPLAYER_ENGINE_SDKINFO_LABEL "1017470"
+#define PVPLAYER_ENGINE_SDKINFO_LABEL "1017508"
#define PVPLAYER_ENGINE_SDKINFO_DATE 0x20091013
#endif //PV_PLAYER_SDKINFO_H_INCLUDED
OsclThreadPriority iPriority;
OsclSemaphore iSem;
+ uint32 iAppenderType; //Type of appender to be used for the logging 0-> Err Appender, 1-> File Appender
+ Oscl_Vector<LoggerConfigElement, OsclMemAllocator> iLoggerConfigElements;
+ OSCL_wHeapString<OsclMemAllocator> iLogfilename;
};
/**
iErrorEventObserver = aContainer->iErrorEventObserver;
iInfoEventObserver = aContainer->iInfoEventObserver;
+ if (aContainer->iMode == PV_METADATA_ENGINE_THREADED_MODE)
+ {
+ Oscl_Vector<LoggerConfigElement, OsclMemAllocator>::iterator it;
+ PVLoggerAppender *appender = NULL;
+ OsclRefCounter *refCounter = NULL;
+
+ iAppenderType = aContainer->iAppenderType;
+ iLoggerConfigElements = aContainer->iLoggerConfigElements;
+
+ if (iAppenderType == 1)
+ {
+ logfilename = aContainer->iLogfilename;
+ }
+
+ if (iAppenderType == 0)
+ {
+ appender = new StdErrAppender<TimeAndIdLayout, 1024>();
+ OsclRefCounterSA<AppenderDestructDealloc<StdErrAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+ new OsclRefCounterSA<AppenderDestructDealloc<StdErrAppender<TimeAndIdLayout, 1024> > >(appender);
+ refCounter = appenderRefCounter;
+ }
+ else if (iAppenderType == 1)
+ {
+ appender = (PVLoggerAppender*)TextFileAppender<TimeAndIdLayout, 1024>::CreateAppender(logfilename.get_str());
+ OsclRefCounterSA<AppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+ new OsclRefCounterSA<AppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > >(appender);
+ refCounter = appenderRefCounter;
+ }
+ else
+ {
+ appender = (PVLoggerAppender*)MemAppender<TimeAndIdLayout, 1024>::CreateAppender(logfilename.get_str());
+ OsclRefCounterSA<AppenderDestructDealloc<MemAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+ new OsclRefCounterSA<AppenderDestructDealloc<MemAppender<TimeAndIdLayout, 1024> > >(appender);
+ refCounter = appenderRefCounter;
+ }
+
+ OsclSharedPtr<PVLoggerAppender> appenderPtr(appender, refCounter);
+
+
+ for (it = iLoggerConfigElements.begin(); it != iLoggerConfigElements.end(); it++)
+ {
+ PVLogger *node = NULL;
+ node = PVLogger::GetLoggerObject(it->iLoggerString);
+ node->AddAppender(appenderPtr);
+ node->SetLogLevel(it->iLogLevel);
+ }
+ }
+
iCommandIdMut.Create();
iOOTSyncCommandSem.Create();
iThreadSafeQueue.Configure(this);
#include "test_pvme.h"
#endif
-#ifndef PVLOGGER_CFG_FILE_PARSER_H_INCLUDED
-#include "pvlogger_cfg_file_parser.h"
-#endif
-
#include "test_pvme_testset1.h"
FILE* file;
return nch;
}
+bool PVLoggerConfigFile::get_next_line(const char *start_ptr, const char * end_ptr,
+ const char *& line_start,
+ const char *& line_end)
+{
+ // Finds the boundaries of the next non-empty line within start
+ // and end ptrs
+
+ // This initializes line_start to the first non-whitespace character
+ line_start = skip_whitespace_and_line_term(start_ptr, end_ptr);
+
+ line_end = skip_to_line_term(line_start, end_ptr);
+
+ return (line_start < end_ptr);
+
+}
+
+
+bool PVLoggerConfigFile::IsLoggerConfigFilePresent()
+{
+ if (-1 != ReadAndParseLoggerConfigFile())
+ return true;
+ return false;
+}
+
+//Read and parse the config file
+//retval = -1 if the config file doesnt exist
+int8 PVLoggerConfigFile::ReadAndParseLoggerConfigFile()
+{
+ int8 retval = 1;
+
+ if (0 != iLogFile.Open(iLogFileName, Oscl_File::MODE_READ, iFileServer))
+ {
+ retval = -1;
+ }
+ else
+ {
+ if (!iLogFileRead)
+ {
+ iLogFile.Read(ibuffer, 1, sizeof(ibuffer));
+ //Parse the buffer for \n chars
+ Oscl_Vector<char*, OsclMemAllocator> LogConfigStrings;
+
+ const char *end_ptr = ibuffer + oscl_strlen(ibuffer) ; // Point just beyond the end
+ const char *section_start_ptr;
+ const char *line_start_ptr, *line_end_ptr;
+ char* end_temp_ptr;
+
+ section_start_ptr = skip_whitespace_and_line_term(ibuffer, end_ptr);
+
+ while (section_start_ptr < end_ptr)
+ {
+ if (!get_next_line(section_start_ptr, end_ptr,
+ line_start_ptr, line_end_ptr))
+ {
+ break;
+ }
+
+
+ section_start_ptr = line_end_ptr + 1;
+
+ end_temp_ptr = (char*)line_end_ptr;
+ *end_temp_ptr = '\0';
+
+ LogConfigStrings.push_back((char*)line_start_ptr);
+
+ }
+
+ //Populate the LoggerConfigElements vector
+ {
+ if (!LogConfigStrings.empty())
+ {
+ Oscl_Vector<char*, OsclMemAllocator>::iterator it;
+ it = LogConfigStrings.begin();
+ uint32 appenderType;
+ PV_atoi(*it, 'd', oscl_strlen(*it), appenderType);
+ iAppenderType = appenderType;
+
+ if (LogConfigStrings.size() > 1)
+ {
+ for (it = LogConfigStrings.begin() + 1; it != LogConfigStrings.end(); it++)
+ {
+ char* CommaIndex = (char*)oscl_strstr(*it, ",");
+ if (CommaIndex != NULL)
+ {
+ *CommaIndex = '\0';
+ LoggerConfigElement obj;
+ uint32 logLevel;
+ PV_atoi(*it, 'd', oscl_strlen(*it), logLevel);
+ obj.iLogLevel = logLevel;
+ obj.iLoggerString = CommaIndex + 1;
+ iLoggerConfigElements.push_back(obj);
+ }
+ }
+ }
+ else
+ {
+ //Add the config element for complete logging fo all the modules
+ LoggerConfigElement obj;
+ obj.iLoggerString = (char*)"";
+ obj.iLogLevel = 8;
+ iLoggerConfigElements.push_back(obj);
+ }
+ }
+ }
+ iLogFile.Close();
+ iLogFileRead = true;
+ }
+ }
+ return retval;
+}
+
+void PVLoggerConfigFile::SetLoggerSettings()
+{
+ Oscl_Vector<LoggerConfigElement, OsclMemAllocator>::iterator it;
+
+ PVLoggerAppender *appender = NULL;
+ OsclRefCounter *refCounter = NULL;
+ if (iLoggerConfigElements.empty())
+ {
+ return;
+ }
+
+ if (iAppenderType == 0)
+ {
+ appender = new StdErrAppender<TimeAndIdLayout, 1024>();
+ OsclRefCounterSA<LogAppenderDestructDealloc<StdErrAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+ new OsclRefCounterSA<LogAppenderDestructDealloc<StdErrAppender<TimeAndIdLayout, 1024> > >(appender);
+ refCounter = appenderRefCounter;
+ }
+ else if (iAppenderType == 1)
+ {
+ OSCL_wHeapString<OsclMemAllocator> testlogfilename;
+ //File to be sent to pvme for logging in threaded mode
+ logfilename += OUTPUTNAME_PREPEND_WSTRING;
+ logfilename += _STRLIT_WCHAR("pvme.log");
+ //File for logging PVME test log statements in threaded mode, all logs in non-threaded mode
+ testlogfilename += OUTPUTNAME_PREPEND_WSTRING;
+ testlogfilename += _STRLIT_WCHAR("pvme_test.log");
+ appender = (PVLoggerAppender*)TextFileAppender<TimeAndIdLayout, 1024>::CreateAppender(testlogfilename.get_str());
+ OsclRefCounterSA<LogAppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+ new OsclRefCounterSA<LogAppenderDestructDealloc<TextFileAppender<TimeAndIdLayout, 1024> > >(appender);
+ refCounter = appenderRefCounter;
+ }
+ else
+ {
+ OSCL_wHeapString<OsclMemAllocator> testlogfilename;
+ logfilename += OUTPUTNAME_PREPEND_WSTRING;
+ logfilename += _STRLIT_WCHAR("pvme.log");
+ testlogfilename += OUTPUTNAME_PREPEND_WSTRING;
+ testlogfilename += _STRLIT_WCHAR("pvme_test.log");
+ appender = (PVLoggerAppender*)MemAppender<TimeAndIdLayout, 1024>::CreateAppender(testlogfilename.get_str());
+ OsclRefCounterSA<LogAppenderDestructDealloc<MemAppender<TimeAndIdLayout, 1024> > > *appenderRefCounter =
+ new OsclRefCounterSA<LogAppenderDestructDealloc<MemAppender<TimeAndIdLayout, 1024> > >(appender);
+ refCounter = appenderRefCounter;
+ }
+
+ OsclSharedPtr<PVLoggerAppender> appenderPtr(appender, refCounter);
+
+ for (it = iLoggerConfigElements.begin(); it != iLoggerConfigElements.end(); it++)
+ {
+ PVLogger *node = NULL;
+ node = PVLogger::GetLoggerObject(it->iLoggerString);
+ node->AddAppender(appenderPtr);
+ node->SetLogLevel(it->iLogLevel);
+ }
+}
//Find test range args:
//To run a range of tests by enum ID:
else
{
fprintf(file, "\nStarting Test %d: ", iCurrentTestNumber);
- PVLogger::Init();
- OSCL_HeapString<OsclMemAllocator> cfgfilename(PVLOG_PREPEND_CFG_FILENAME);
- cfgfilename += PVLOG_CFG_FILENAME;
- OSCL_HeapString<OsclMemAllocator> logfilename(PVLOG_PREPEND_OUT_FILENAME);
- logfilename += PVLOG_OUT_FILENAME;
- PVLoggerCfgFileParser::Parse(cfgfilename.get_str(), logfilename.get_str());
- OsclScheduler::Init("PVMetadataEngineTestScheduler"); // construct and install active scheduler
+ SetupLoggerScheduler();
}
// Setup the standard test case parameters based on current unit test settings
switch (iCurrentTestNumber)
{
case GetSourceMetadataNonThreadedModeTest:
- iCurrentTest = new pv_metadata_engine_test(testparam, PV_METADATA_ENGINE_NON_THREADED_MODE);
+ iCurrentTest = new pv_metadata_engine_test(testparam, PV_METADATA_ENGINE_NON_THREADED_MODE, obj);
break;
case GetSourceMetadataThreadedModeTest:
- iCurrentTest = new pv_metadata_engine_test(testparam, PV_METADATA_ENGINE_THREADED_MODE);
+ iCurrentTest = new pv_metadata_engine_test(testparam, PV_METADATA_ENGINE_THREADED_MODE, obj);
break;
case BeyondLastTest:
}
}
+void pvmetadataengine_test::SetupLoggerScheduler()
+{
+ // Enable the following code for logging (on Symbian, RDebug)
+ PVLogger::Init();
+ if (obj.IsLoggerConfigFilePresent())
+ {
+ obj.SetLoggerSettings();
+ }
+ // Construct and install the active scheduler
+ OsclScheduler::Init("PVMetadataEngineTestScheduler");
+}
+
+
+
class pv_metadata_engine_test;
+template<class DestructClass>
+class LogAppenderDestructDealloc : public OsclDestructDealloc
+{
+ public:
+ virtual void destruct_and_dealloc(OsclAny *ptr)
+ {
+ delete((DestructClass*)ptr);
+ }
+};
+
//This function is used to read the contents of a file, one line at a time.
int fgetline(Oscl_File* aFp, char aLine[], int aMax);
+class PVLoggerConfigFile
+{
+ /* To change the logging settings without the need to compile the test application
+ Let us read the logging settings from the file instead of hard coding them over here
+ The name of the config file is pvlogger.ini
+ The format of entries in it is like
+ First entry will decide if the file appender has to be used or error appender will be used.
+ 0 -> ErrAppender will be used
+ 1 -> File Appender will be used
+ 2 -> Mem Appender will be used
+ Entries after this will decide the module whose logging has to be taken.For example, contents of one sample config file could be
+ 1
+ 1,PVMetadataEngine
+ (pls note that no space is allowed between loglevel and logger tag)
+ This means, we intend to have logging of level 1 for the module PVMetadataEngine
+ on file.
+ */
+ public:
+
+ uint32 iAppenderType; //Type of appender to be used for the logging 0-> Err Appender, 1-> File Appender
+ Oscl_Vector<LoggerConfigElement, OsclMemAllocator> iLoggerConfigElements;
+ OSCL_wHeapString<OsclMemAllocator> logfilename;
+
+ PVLoggerConfigFile(): iLogFileRead(false)
+ {
+ iFileServer.Connect();
+ // Full path of pvlogger.ini is: SOURCENAME_PREPEND_STRING + pvlogger.ini
+ oscl_strncpy(iLogFileName, SOURCENAME_PREPEND_STRING,
+ oscl_strlen(SOURCENAME_PREPEND_STRING) + 1);
+ oscl_strcat(iLogFileName, "pvlogger.ini");
+ oscl_memset(ibuffer, 0, sizeof(ibuffer));
+ iAppenderType = 0;
+
+ }
+
+ ~PVLoggerConfigFile()
+ {
+ iFileServer.Close();
+ }
+
+ bool get_next_line(const char *start_ptr, const char * end_ptr,
+ const char *& line_start,
+ const char *& line_end);
+
+ bool IsLoggerConfigFilePresent();
+
+ int8 ReadAndParseLoggerConfigFile();
+
+ void SetLoggerSettings();
+
+ private:
+
+ bool iLogFileRead;
+ Oscl_File iLogFile;
+ Oscl_FileServer iFileServer;
+ char iLogFileName[255];
+ char ibuffer[1024];
+
+};
+
+
class pvme_test_suite : public test_case
{
public:
// For logging
int32 iLogLevel;
+ PVLoggerConfigFile obj;
// For memory statistics
uint32 iTotalAlloc;
iThreadSafeInfoQueue.Configure(this);
iPVMEContainer.iSem.Create();
+
+ iPVMEContainer.iAppenderType = iLoggerInfo.iAppenderType;
+ iPVMEContainer.iLogfilename = iLoggerInfo.logfilename;
+ iPVMEContainer.iLoggerConfigElements = iLoggerInfo.iLoggerConfigElements;
}
OSCL_TRY(error, PVMetadataEngineFactory::CreatePVMetadataEngine(iPVMEContainer));
Oscl_FileServer fileServer;
err = fileServer.Connect();
+ // Full path of MetadataFile is: SOURCENAME_PREPEND_STRING + pvlogger.ini
oscl_strncpy(KeysFileName, SOURCENAME_PREPEND_STRING,
oscl_strlen(SOURCENAME_PREPEND_STRING) + 1);
oscl_strcat(KeysFileName, "MetadataKeys.txt");
if (0 == err)
{
Oscl_File *ClipsFile = new Oscl_File;
+ // Full path of ClipsFile is: SOURCENAME_PREPEND_STRING + pvlogger.ini
oscl_strncpy(ClipsFileName, SOURCENAME_PREPEND_STRING,
oscl_strlen(SOURCENAME_PREPEND_STRING) + 1);
oscl_strcat(ClipsFileName, "Clips.txt");
#include "oscl_file_io.h"
#endif
+#ifndef PVMI_CONFIG_AND_CAPABILITY_H_INCLUDED
+#include "pvmi_config_and_capability.h"
+#endif
+
#ifndef OSCL_ERROR_CODES_H_INCLUDED
#include "oscl_error_codes.h"
#endif
class pvmetadataengine_test_observer;
+class PVLoggerConfigFile;
extern FILE* file;
#define MAX_LEN 100
public ThreadSafeQueueObserver
{
public:
- pv_metadata_engine_test(PVMetadataEngineTestParam aTestParam, PVMetadataEngineThreadMode aMode):
+ pv_metadata_engine_test(PVMetadataEngineTestParam aTestParam, PVMetadataEngineThreadMode aMode, PVLoggerConfigFile& aLoggerInfo):
OsclTimerObject(OsclActiveObject::EPriorityNominal, "PVMetadataEngineTest")
- , iCurrentCmdId(0)
+ , iCurrentCmdId(0), iLoggerInfo(aLoggerInfo)
{
OSCL_ASSERT(aTestParam.iObserver != NULL);
//Threaded or Non-Threaded Mode
PVMetadataEngineThreadMode iMode;
+ //To pass logging information to PVME
+ PVLoggerConfigFile& iLoggerInfo;
+
//To store the clips
Oscl_Vector<char*, OsclMemAllocator> iClips;
Oscl_Vector<char*, OsclMemAllocator>::iterator it;