34 #include "kmime_util.h"
40 #include "kautodeletehash.h"
46 #include <QtCore/QCoreApplication>
47 #include <QtCore/QMutex>
53 using namespace KMime;
60 K_GLOBAL_STATIC( QMutex, dictLock )
63 void
Codec::cleanupCodec()
69 void Codec::fillDictionary()
78 all->insert(
"x-uuencode",
new UUCodec() );
84 const QByteArray ba( name );
85 return codecForName( ba );
93 qAddPostRoutine( cleanupCodec );
96 QByteArray lowerName = name;
97 kAsciiToLower( lowerName.data() );
98 Codec *codec = ( *all )[ lowerName ];
102 kDebug() <<
"Unknown codec \"" << name <<
"\" requested!";
109 char* &dcursor,
const char *
const dend,
110 bool withCRLF )
const
113 Encoder *enc = makeEncoder( withCRLF );
117 while ( !enc->
encode( scursor, send, dcursor, dend ) ) {
118 if ( dcursor == dend ) {
125 while ( !enc->
finish( dcursor, dend ) ) {
126 if ( dcursor == dend ) {
141 result.resize( maxEncodedSizeFor( src.size(), withCRLF ) );
144 QByteArray::ConstIterator iit = src.begin();
145 QByteArray::ConstIterator iend = src.end();
146 QByteArray::Iterator oit = result.begin();
147 QByteArray::ConstIterator oend = result.end();
150 if ( !encode( iit, iend, oit, oend, withCRLF ) ) {
151 kFatal() << name() <<
"codec lies about it's mEncodedSizeFor()";
155 result.truncate( oit - result.begin() );
164 result.resize( maxDecodedSizeFor( src.size(), withCRLF ) );
167 QByteArray::ConstIterator iit = src.begin();
168 QByteArray::ConstIterator iend = src.end();
169 QByteArray::Iterator oit = result.begin();
170 QByteArray::ConstIterator oend = result.end();
173 if ( !decode( iit, iend, oit, oend, withCRLF ) ) {
174 kFatal() << name() <<
"codec lies about it's maxDecodedSizeFor()";
178 result.truncate( oit - result.begin() );
184 char* &dcursor,
const char *
const dend,
185 bool withCRLF )
const
188 Decoder *dec = makeDecoder( withCRLF );
192 while ( !dec->
decode( scursor, send, dcursor, dend ) ) {
193 if ( dcursor == dend ) {
200 while ( !dec->
finish( dcursor, dend ) ) {
201 if ( dcursor == dend ) {
218 for ( i = 0 ; dcursor != dend && i < mOutputBufferCursor ; ++i ) {
219 *dcursor++ = mOutputBuffer[i];
223 int numCharsLeft = mOutputBufferCursor - i;
225 if ( numCharsLeft ) {
226 ::memmove( mOutputBuffer, mOutputBuffer + i, numCharsLeft );
229 mOutputBufferCursor = numCharsLeft;
231 return !numCharsLeft;