summaryrefslogtreecommitdiff
path: root/TAO/tao/Compression/zlib/ZlibCompressor_Factory.cpp
blob: 213f37cb44e403eb864d51d9d4771323ce375d10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "tao/Compression/zlib/ZlibCompressor_Factory.h"
#include "tao/Compression/zlib/ZlibCompressor.h"
#include "ace/Min_Max.h"
#include "zlib.h"

TAO_BEGIN_VERSIONED_NAMESPACE_DECL

namespace TAO
{

Zlib_CompressorFactory::Zlib_CompressorFactory (void) :
  ::TAO::CompressorFactory (::Compression::COMPRESSORID_ZLIB)
{
}

::Compression::Compressor_ptr
Zlib_CompressorFactory::get_compressor (
    ::Compression::CompressionLevel compression_level)
{
    // Ensure Compression range 0-9 and will also convert -1(default) to 9(max).
    compression_level = ace_range(  ::Compression::CompressionLevel(Z_NO_COMPRESSION),   // Min value
                                    ::Compression::CompressionLevel(Z_BEST_COMPRESSION), // Max value
                                    compression_level); // Argument value

    ::Compression::Compressor_ptr compressor = 0;

    {   // Ensure scoped lock for compressor Map container

        ACE_GUARD_RETURN( TAO_SYNCH_MUTEX, ace_mon, this->mutex_, 0 );

        try {
            // Try and locate the compressor (we may already have it)
            ZlibCompressorMap::iterator it = this->compressors_.find(compression_level);

            if (it == this->compressors_.end())
            {  // Does not yet exist so create it
                ACE_NEW_RETURN(compressor, ::TAO::ZlibCompressor(this, compression_level), 0);
                it = this->compressors_.insert(ZlibCompressorMap::value_type(compression_level, compressor)).first;
            }

            compressor = (*it).second.in();

        } catch (...) {
            TAOLIB_ERROR_RETURN((LM_ERROR,
                ACE_TEXT("(%P | %t) ERROR: ZlibCompressor - Unable to create Zlib Compressor at level [%d].\n"),
                int(compression_level)),0);
        }

    }   // End of scoped container locking

    return ::Compression::Compressor::_duplicate(compressor);
}

}

TAO_END_VERSIONED_NAMESPACE_DECL