blob: 072394374503a514bd953131a1394fc9c9183038 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#ifndef SDP_MEDIAPARSER_REGISTRY_H
#define SDP_MEDIAPARSER_REGISTRY_H
#include "oscl_mem.h"
#include "oscl_map.h"
#include "oscl_string_containers.h"
#include "oscl_base_alloc.h"
#include "oscl_string.h"
#include "oscl_str_ptr_len.h"
//use an appropriate registry
#include "oscl_error.h"
// TLS registry
#define SDPMEDIAPARSER_REGISTRY OsclTLSRegistryEx
#define SDPMEDIAPARSER_REGISTRY_ID OSCL_TLS_ID_SDPMEDIAPARSER
#define SDPMEDIAPARSER_REGISTRY_WRAPPER OsclTLSEx
class SDPBaseMediaInfoParser;
class SDPMediaParserFactory : public OsclDestructDealloc
{
public:
virtual ~SDPMediaParserFactory() {}
virtual SDPBaseMediaInfoParser* createSDPMediaParserInstance() = 0;
virtual void destruct_and_dealloc(OsclAny* ptr) = 0;
};
typedef OSCL_HeapString<OsclMemAllocator> string_key_type;
template<class Alloc> struct SDPRegMimeStringCompare
{
bool operator()(const string_key_type& x, const string_key_type& y) const
{
if ((oscl_CIstrcmp(x.get_str(), y.get_str())) < 0)
{
return true;
}
else
{
return false;
}
}
};
class SDPMediaParserRegistry
{
public:
/**
* SDPMediaParserRegistry needs to be initialized once per thread.
* This creates the SDPMediaParserRegistry singleton that is used
* throughout the duration of the thread.
*
* @exception leaves if out of memory
*/
static void Init()
{
/*
* If the registry does not exist, create one
*/
if (SDPMEDIAPARSER_REGISTRY::getInstance(SDPMEDIAPARSER_REGISTRY_ID) == NULL)
{
Oscl_TAlloc<SDPMediaParserRegistry, OsclMemAllocator> talloc;
SDPMediaParserRegistry *sdpMediaParserReg = OSCL_ALLOC_NEW(talloc, SDPMediaParserRegistry, ());
SDPMEDIAPARSER_REGISTRY::registerInstance(sdpMediaParserReg, SDPMEDIAPARSER_REGISTRY_ID);
}
}
/**
* Frees the SDPMediaParserRegistry singleton used by the current
* thread. This must be called before thread exit.
*
* @return
*/
static void Cleanup()
{
SDPMediaParserRegistry *sdpMediaParserReg =
OSCL_STATIC_CAST(SDPMediaParserRegistry*, SDPMEDIAPARSER_REGISTRY::getInstance(SDPMEDIAPARSER_REGISTRY_ID));
Oscl_TAlloc<SDPMediaParserRegistry, OsclMemAllocator> talloc;
OSCL_ALLOC_DELETE(sdpMediaParserReg, talloc, SDPMediaParserRegistry);
SDPMEDIAPARSER_REGISTRY::registerInstance(NULL, SDPMEDIAPARSER_REGISTRY_ID);
}
virtual ~SDPMediaParserRegistry() {};
/**
* Get the sdp media parser registry. There is only one
* registry instance per thread.
*/
static SDPMediaParserRegistry* GetSDPMediaParserRegistry()
{
SDPMEDIAPARSER_REGISTRY_WRAPPER< SDPMediaParserRegistry, SDPMEDIAPARSER_REGISTRY_ID > sdpMediaParserRegSng;
return &(*sdpMediaParserRegSng);
}
bool addMediaParserFactoryToRegistry(StrPtrLen mimeType,
SDPMediaParserFactory* mediaParserFactory)
{
string_key_type mimeString(OSCL_CONST_CAST(const char*, mimeType.c_str()));
_SDPMediaParserRegistry.insert(value_type(mimeString, mediaParserFactory));
return true;
};
SDPMediaParserFactory*
lookupSDPMediaParserFactory(OsclMemoryFragment memFrag)
{
string_key_type mimeString;
mimeString.set((const char*)(memFrag.ptr), memFrag.len);
Oscl_Map<string_key_type, SDPMediaParserFactory*, OsclMemAllocator, string_key_compare_class>::iterator it;
it = _SDPMediaParserRegistry.find(mimeString);
if (it != _SDPMediaParserRegistry.end())
{
return (((*it).second));
}
return NULL;
}
private:
SDPMediaParserRegistry() {};
typedef SDPRegMimeStringCompare<OsclMemAllocator> string_key_compare_class;
typedef Oscl_Map<string_key_type, SDPMediaParserFactory*, OsclMemAllocator, string_key_compare_class>::value_type value_type;
Oscl_Map<string_key_type, SDPMediaParserFactory*, OsclMemAllocator, string_key_compare_class> _SDPMediaParserRegistry;
};
#endif //SDP_REGISTRAR_H