[prev in list] [next in list] [prev in thread] [next in thread]
List: kmail-devel
Subject: Re: QCString construction
From: David Faure <dfaure () klaralvdalens-datakonsult ! se>
Date: 2007-02-10 1:16:25
Message-ID: 200702100216.31197.dfaure () klaralvdalens-datakonsult ! se
[Download RAW message or body]
This leads me to 3 patches.
One for kmail, I wrote a utility function for creating a QCString from char*+size, \
and used that when creating a QCString from a DwString where it matters (i.e. where I \
found pretty large strings to be used when attaching large files).
Can a kmail developer review the change to KMMessage::asString() and \
asSendableString(), too? It avoids a asString() (Assemble) and a fromString (Parse), \
but I hope it's doing the right thing.
One for Qt itself: why does QCString use the slow way when duplicating QCStrings?
(I know that QCString tmp( s1 ); is shallow copy, but the next line calls operator+= \
which calls detach) Unless someone spots a flaw in this patch I'll be posting it to \
TT (and I'm testing my local kde with it starting from tomorrow ;)
And one for mimelib, not really related to QCString: am I right that memcpy is faster \
than for (i=0; i < pos1; ++i) *to++ = *from++; ? At least in gdb it seems faster, but \
I didn't benchmark it. Hopefully memcpy is done by a single CPU instruction or \
something, right?
Finally, I wish we could avoid the data copying just to null-terminate it in \
KMMessagePart::body(), but I'm not sure how...
--
David Faure, faure@kde.org, dfaure@klaralvdalens-datakonsult.se
KDE/KOffice developer, Qt consultancy projects
Klarälvdalens Datakonsult AB, Platform-independent software solutions
["qcstring.h.diff" (text/x-diff)]
Index: qcstring.h
===================================================================
--- qcstring.h (revision 615855)
+++ qcstring.h (working copy)
@@ -352,14 +352,14 @@ Q_EXPORT inline bool operator>=( const c
Q_EXPORT inline const QCString operator+( const QCString &s1,
const QCString &s2 )
{
- QCString tmp( s1.data() );
+ QCString tmp( s1 );
tmp += s2;
return tmp;
}
Q_EXPORT inline const QCString operator+( const QCString &s1, const char *s2 )
{
- QCString tmp( s1.data() );
+ QCString tmp( s1 );
tmp += s2;
return tmp;
}
@@ -373,7 +373,7 @@ Q_EXPORT inline const QCString operator+
Q_EXPORT inline const QCString operator+( const QCString &s1, char c2 )
{
- QCString tmp( s1.data() );
+ QCString tmp( s1 );
tmp += c2;
return tmp;
}
["dwstring.cpp.diff" (text/x-diff)]
Index: dwstring.cpp
===================================================================
--- dwstring.cpp (revision 631586)
+++ dwstring.cpp (working copy)
@@ -1276,12 +1276,12 @@ void DwString::_replace(size_t aPos1, si
assert(newBuf != 0);
if (newBuf != 0) {
to = newBuf;
- from = mRep->mBuffer + mStart;
- for (i=0; i < pos1; ++i) *to++ = *from++;
- from = aBuf;
- for (i=0; i < len2; ++i) *to++ = *from++;
- from = mRep->mBuffer + mStart + pos1 + len1;
- for (i=0; i < mLength - pos1 - len1; ++i) *to++ = *from++;
+ memcpy(to, mRep->mBuffer + mStart, pos1);
+ to += pos1;
+ memcpy(to, aBuf, len2);
+ to += len2;
+ memcpy(to, mRep->mBuffer + mStart + pos1 + len1, mLength - pos1 - len1);
+ to += mLength - pos1 - len1;
*to = 0;
DwStringRep* rep = new DwStringRep(newBuf, size);
assert(rep != 0);
["kmail.diff" (text/x-diff)]
Index: kmmessage.cpp
===================================================================
--- kmmessage.cpp (revision 631646)
+++ kmmessage.cpp (working copy)
@@ -64,6 +64,7 @@ using namespace KMime::Types;
#include <klocale.h>
#include <stdlib.h>
#include <unistd.h>
+#include "util.h"
#if ALLOW_GUI
#include <kmessagebox.h>
@@ -306,14 +307,15 @@ const DwMessage *KMMessage::asDwMessage(
//-----------------------------------------------------------------------------
QCString KMMessage::asString() const {
- return asDwString().c_str();
+ const DwString& asString = asDwString();
+ return KMail::Util::CString( asString.c_str(), asString.length() );
}
QCString KMMessage::asSendableString() const
{
- KMMessage msg;
- msg.fromString(asString());
+ KMMessage msg( *this );
+ //msg.fromString(asString());
msg.removePrivateHeaderFields();
msg.removeHeaderField("Bcc");
return msg.asString();
@@ -321,8 +323,8 @@ QCString KMMessage::asSendableString() c
QCString KMMessage::headerAsSendableString() const
{
- KMMessage msg;
- msg.fromString(asString());
+ KMMessage msg( *this );
+ //msg.fromString(asString());
msg.removePrivateHeaderFields();
msg.removeHeaderField("Bcc");
return msg.headerAsString().latin1();
@@ -2469,8 +2471,8 @@ void KMMessage::setNeedsAssembly()
//-----------------------------------------------------------------------------
QCString KMMessage::body() const
{
- DwString body = mMsg->Body().AsString();
- QCString str = body.c_str();
+ const DwString& body = mMsg->Body().AsString();
+ QCString str = KMail::Util::CString( body.c_str(), body.length() );
kdWarning( str.length() != body.length(), 5006 )
<< "KMMessage::body(): body is binary but used as text!" << endl;
return str;
@@ -3135,8 +3137,9 @@ DwBodyPart* KMMessage::createDWBodyPart(
if (!contDisp.isEmpty())
headers.ContentDisposition().FromString(contDisp);
- if (!aPart->body().isNull())
- part->Body().FromString(aPart->body());
+ const QCString bodyStr = aPart->body();
+ if (!bodyStr.isNull())
+ part->Body().FromString(bodyStr);
else
part->Body().FromString("");
Index: partNode.cpp
===================================================================
--- partNode.cpp (revision 631646)
+++ partNode.cpp (working copy)
@@ -37,6 +37,7 @@
#include <mimelib/utility.h>
#include <qregexp.h>
#include <kasciistricmp.h>
+#include "util.h"
/*
===========================================================================
@@ -178,8 +179,10 @@ const QCString & partNode::encodedBody()
if ( mEncodedOk )
return mEncodedBody;
- if ( mDwPart )
- mEncodedBody = mDwPart->Body().AsString().c_str();
+ if ( mDwPart ) {
+ const DwString& asString = mDwPart->Body().AsString();
+ mEncodedBody = KMail::Util::CString( asString.c_str(), asString.length() );
+ }
else
mEncodedBody = 0;
mEncodedOk = true;
Index: messagecomposer.cpp
===================================================================
--- messagecomposer.cpp (revision 631646)
+++ messagecomposer.cpp (working copy)
@@ -1577,12 +1577,14 @@ void MessageComposer::composeMessage( KM
DwMediaType& ct = headers.ContentType();
ct.SetBoundary(mSaveBoundary);
dwPart->Assemble();
- mEncodedBody = dwPart->AsString().c_str();
+ const DwString& asString = dwPart->AsString();
+ mEncodedBody = KMail::Util::CString( asString.c_str(), asString.length() );
}
else {
dwPart = theMessage.createDWBodyPart( &mOldBodyPart );
dwPart->Assemble();
- mEncodedBody = dwPart->AsString().c_str();
+ const DwString& asString = dwPart->AsString();
+ mEncodedBody = KMail::Util::CString( asString.c_str(), asString.length() );
}
delete dwPart;
dwPart = 0;
@@ -1784,7 +1786,8 @@ void MessageComposer::addBodyAndAttachme
DwBodyPart* innerDwPart = msg->createDWBodyPart( it->part );
innerDwPart->Assemble();
- QCString encodedAttachment = innerDwPart->AsString().c_str();
+ const DwString& asString = innerDwPart->AsString();
+ QCString encodedAttachment = KMail::Util::CString( asString.c_str(), \
asString.length() ); delete innerDwPart;
innerDwPart = 0;
@@ -1815,7 +1818,8 @@ void MessageComposer::addBodyAndAttachme
rEncryptMessagePart = newAttachPart;
DwBodyPart* dwPart = msg->createDWBodyPart( &newAttachPart );
dwPart->Assemble();
- encodedAttachment = dwPart->AsString().c_str();
+ const DwString& asString = dwPart->AsString();
+ encodedAttachment = KMail::Util::CString( asString.c_str(), \
asString.length() ); delete dwPart;
dwPart = 0;
}
Index: util.h
===================================================================
--- util.h (revision 631646)
+++ util.h (working copy)
@@ -68,6 +68,17 @@ namespace Util {
QCString lf2crlf( const QCString & src );
/**
+ * Construct a QCString from a null-terminated char* and a size (number of \
characters, not including trailing '\0') + */
+ QCString CString( const char* str, size_t strLen );
+
+ inline QCString CString( const char* str, size_t strLen ) {
+ QCString cstr( strLen + 1 );
+ memcpy( cstr.data(), str, strLen + 1 );
+ return cstr;
+ }
+
+ /**
* A LaterDeleter is intended to be used with the RAII ( Resource
* Acquisiation is Initialization ) paradigm. When an instance of it
* goes out of scope it deletes the associated object It can be
_______________________________________________
KMail developers mailing list
KMail-devel@kde.org
https://mail.kde.org/mailman/listinfo/kmail-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic