[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-optimize
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 



_______________________________________________
Kde-optimize mailing list
Kde-optimize@kde.org
https://mail.kde.org/mailman/listinfo/kde-optimize


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic