From 18dd3cfeaa01293e3a575b53acc633955ce738cd Mon Sep 17 00:00:00 2001 From: Gerald Begumisa Date: Sat, 8 Sep 2007 14:46:22 +0000 Subject: Added new TapeFileNaming tape processor, corrected it not to modify the MCF file git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@486 09dcff7a-b715-0410-9601-b79a96267cd0 --- orkbasecxx/AudioTape.cpp | 20 +++--- orkbasecxx/AudioTape.h | 2 +- orkbasecxx/TapeFileNaming.cpp | 139 ++++++++++++++++++++++++++++++++++++++++++ orkbasecxx/TapeFileNaming.h | 53 ++++++++++++++++ 4 files changed, 206 insertions(+), 8 deletions(-) create mode 100644 orkbasecxx/TapeFileNaming.cpp create mode 100644 orkbasecxx/TapeFileNaming.h (limited to 'orkbasecxx') diff --git a/orkbasecxx/AudioTape.cpp b/orkbasecxx/AudioTape.cpp index a0d8617..09e8418 100644 --- a/orkbasecxx/AudioTape.cpp +++ b/orkbasecxx/AudioTape.cpp @@ -550,15 +550,15 @@ void AudioTape::GenerateFinalFilePath() } } - if(pathIdentifier.size() > 0) - { - m_filePath = pathIdentifier; + if(pathIdentifier.size() > 0) + { + m_filePath = pathIdentifier; - CStdString mkdirPath; + CStdString mkdirPath; - mkdirPath.Format("%s/%s", CONFIG.m_audioOutputPath, m_filePath); - FileRecursiveMkdir(mkdirPath, CONFIG.m_audioFilePermissions, CONFIG.m_audioFileOwner, CONFIG.m_audioFileGroup, CONFIG.m_audioOutputPath); - } + mkdirPath.Format("%s/%s", CONFIG.m_audioOutputPath, m_filePath); + FileRecursiveMkdir(mkdirPath, CONFIG.m_audioFilePermissions, CONFIG.m_audioFileOwner, CONFIG.m_audioFileGroup, CONFIG.m_audioOutputPath); + } } } @@ -746,9 +746,15 @@ void AudioTape::GenerateFinalFilePathAndIdentifier() { m_fileIdentifier = fileIdentifier; } + } + if(CONFIG.m_tapePathNaming.size() > 0) + { GenerateFinalFilePath(); + } + if(CONFIG.m_tapePathNaming.size() > 0 || CONFIG.m_tapeFileNaming.size() > 0) + { CStdString path = CONFIG.m_audioOutputPath + "/" + m_filePath + "/"; PreventFileIdentifierCollision(path, m_fileIdentifier , m_fileExtension); } diff --git a/orkbasecxx/AudioTape.h b/orkbasecxx/AudioTape.h index c637c01..8d06ae4 100644 --- a/orkbasecxx/AudioTape.h +++ b/orkbasecxx/AudioTape.h @@ -138,7 +138,7 @@ typedef boost::shared_ptr AudioTapeRef; //========================================================== -class TapeAttributes +class DLL_IMPORT_EXPORT_ORKBASE TapeAttributes { public: #define TA_NATIVECALLID "[nativecallid]" diff --git a/orkbasecxx/TapeFileNaming.cpp b/orkbasecxx/TapeFileNaming.cpp new file mode 100644 index 0000000..cb9e296 --- /dev/null +++ b/orkbasecxx/TapeFileNaming.cpp @@ -0,0 +1,139 @@ +/* + * Oreka -- A media capture and retrieval platform + * + * Copyright (C) 2005, orecx LLC + * + * http://www.orecx.com + * + * This program is free software, distributed under the terms of + * the GNU General Public License. + * Please refer to http://www.gnu.org/copyleft/gpl.html + * + */ +#pragma warning( disable: 4786 ) + +#define _WINSOCKAPI_ // prevents the inclusion of winsock.h + +#include +#include + +#include "ConfigManager.h" +#include "ace/OS_NS_unistd.h" +#include "Daemon.h" +#include "Filter.h" +#include "Reporting.h" +#include "TapeFileNaming.h" + +TapeProcessorRef TapeFileNaming::m_singleton; + +void TapeFileNaming::Initialize() +{ + if(m_singleton.get() == NULL) + { + m_singleton.reset(new TapeFileNaming()); + TapeProcessorRegistry::instance()->RegisterTapeProcessor(m_singleton); + } +} + +TapeFileNaming::TapeFileNaming() +{ + m_threadCount = 0; + + struct tm date = {0}; + time_t now = time(NULL); + ACE_OS::localtime_r(&now, &date); + m_currentDay = date.tm_mday; +} + +CStdString __CDECL__ TapeFileNaming::GetName() +{ + return "TapeFileNaming"; +} + +TapeProcessorRef TapeFileNaming::Instanciate() +{ + return m_singleton; +} + +void TapeFileNaming::AddAudioTape(AudioTapeRef& audioTapeRef) +{ + if (!m_audioTapeQueue.push(audioTapeRef)) + { + LOG4CXX_ERROR(LOG.tapeFileNamingLog, CStdString("queue full")); + } +} + +void TapeFileNaming::SetQueueSize(int size) +{ + m_audioTapeQueue.setSize(size); +} + +void TapeFileNaming::ThreadHandler(void *args) +{ + CStdString logMsg; + + CStdString processorName("TapeFileNaming"); + TapeProcessorRef tapeFileNaming = TapeProcessorRegistry::instance()->GetNewTapeProcessor(processorName); + if(tapeFileNaming.get() == NULL) + { + LOG4CXX_ERROR(LOG.tapeFileNamingLog, "Could not instanciate TapeFileNaming"); + return; + } + + TapeFileNaming *pTapeFileNaming = (TapeFileNaming*)(tapeFileNaming->Instanciate().get()); + + pTapeFileNaming->SetQueueSize(20000); + LOG4CXX_INFO(LOG.tapeFileNamingLog, "Started"); + + bool stop = false; + + for(;stop == false;) + { + AudioTapeRef audioTapeRef; + CStdString trackingId = "[no-trk]"; + + try + { + audioTapeRef = pTapeFileNaming->m_audioTapeQueue.pop(); + if(audioTapeRef.get() == NULL) + { + if(Daemon::Singleton()->IsStopping()) + { + stop = true; + } + if(Daemon::Singleton()->GetShortLived()) + { + Daemon::Singleton()->Stop(); + } + } + else + { + CStdString originalFilename, newFilename; + + trackingId = audioTapeRef->m_trackingId; + + originalFilename = CONFIG.m_audioOutputPath + "/" + audioTapeRef->GetFilename(); + audioTapeRef->GenerateFinalFilePathAndIdentifier(); + newFilename = CONFIG.m_audioOutputPath + "/" + audioTapeRef->GetFilename(); + + if(originalFilename.Compare(newFilename) != 0) + { + if(ACE_OS::rename((PCSTR)originalFilename, (PCSTR)newFilename) != 0) + { + logMsg.Format("[%s] error renaming file from %s to %s.", trackingId, originalFilename, newFilename); + LOG4CXX_ERROR(LOG.tapeFileNamingLog, logMsg); + } + } + + pTapeFileNaming->RunNextProcessor(audioTapeRef); + } + } + catch (CStdString& e) + { + LOG4CXX_ERROR(LOG.tapeFileNamingLog, e); + } + } + + LOG4CXX_INFO(LOG.tapeFileNamingLog, CStdString("Exited")); +} + diff --git a/orkbasecxx/TapeFileNaming.h b/orkbasecxx/TapeFileNaming.h new file mode 100644 index 0000000..199dc13 --- /dev/null +++ b/orkbasecxx/TapeFileNaming.h @@ -0,0 +1,53 @@ +/* + * Oreka -- A media capture and retrieval platform + * + * Copyright (C) 2005, orecx LLC + * + * http://www.orecx.com + * + * This program is free software, distributed under the terms of + * the GNU General Public License. + * Please refer to http://www.gnu.org/copyleft/gpl.html + * + */ + +#ifndef __TAPEFILENAMING_H__ +#define __TAPEFILENAMING_H__ 1 + +#include "ThreadSafeQueue.h" +#include "TapeProcessor.h" +#include "AudioTape.h" +#include "ace/Thread_Mutex.h" +#include + +class TapeFileNaming; +typedef boost::shared_ptr TapeFileNamingRef; + +/** + * This tape processor handles the naming of audio files + */ +class DLL_IMPORT_EXPORT_ORKBASE TapeFileNaming : public TapeProcessor +{ +public: + static void Initialize(); + + CStdString __CDECL__ GetName(); + TapeProcessorRef __CDECL__ Instanciate(); + void __CDECL__ AddAudioTape(AudioTapeRef& audioTapeRef); + + static void ThreadHandler(void *args); + + void SetQueueSize(int size); + +private: + TapeFileNaming(); + static TapeProcessorRef m_singleton; + + ThreadSafeQueue m_audioTapeQueue; + + size_t m_threadCount; + ACE_Thread_Mutex m_mutex; + int m_currentDay; +}; + +#endif -- cgit v1.2.3