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

List:       kde-commits
Subject:    [dferry] serialization: Rework getting the current signature of a Reader.
From:       Andreas Hartmetz <ahartmetz () gmail ! com>
Date:       2016-11-17 1:34:24
Message-ID: E1c7Baq-0002rY-Rf () code ! kde ! org
[Download RAW message or body]

Git commit 7ab2162e82e41b39063af430ad44d1f21ea437ac by Andreas Hartmetz.
Committed on 17/11/2016 at 00:46.
Pushed by ahartmetz into branch 'master'.

Rework getting the current signature of a Reader.

There are really two use cases, one of which needs a new method.
Also reorder the arguments.h header for more consistent grouping,
no functional change intended there.

M  +15   -4    serialization/arguments.cpp
M  +41   -40   serialization/arguments.h

http://commits.kde.org/dferry/7ab2162e82e41b39063af430ad44d1f21ea437ac

diff --git a/serialization/arguments.cpp b/serialization/arguments.cpp
index 2919219..731f23b 100644
--- a/serialization/arguments.cpp
+++ b/serialization/arguments.cpp
@@ -949,10 +949,21 @@ bool Arguments::Reader::isInsideEmptyArray() const
 
 cstring Arguments::Reader::currentSignature() const
 {
-    // ### not sure if determining length like that is the best way, \
                should probably be as similar to
-    //     libdbus-1 as possible (unless we can do much better).
-    return cstring(d->m_signature.ptr,
-                   std::max(uint32(0), std::min(d->m_signature.length, \
d->m_signaturePosition))); +    return d->m_signature;
+}
+
+cstring Arguments::Reader::currentSingleCompleteTypeSignature() const
+{
+    const uint32 startingLength = d->m_signature.length - \
d->m_signaturePosition; +    cstring sigCopy = { d->m_signature.ptr + \
d->m_signaturePosition, startingLength }; +    Nesting nest;
+    if (!parseSingleCompleteType(&sigCopy, &nest)) {
+        // the signature should have been validated before, but e.g. in \
Finished state this may happen +        return cstring();
+    }
+    sigCopy.ptr = d->m_signature.ptr + d->m_signaturePosition;
+    sigCopy.length = startingLength - sigCopy.length;
+    return sigCopy;
 }
 
 void Arguments::Reader::replaceData(chunk data)
diff --git a/serialization/arguments.h b/serialization/arguments.h
index 4081e26..5d86866 100644
--- a/serialization/arguments.h
+++ b/serialization/arguments.h
@@ -37,53 +37,19 @@ class Message;
 class DFERRY_EXPORT Arguments
 {
 public:
-    Arguments(); // constructs an empty argument list
-    // constructs an argument list to deserialize data in @p data with \
                signature @p signature;
-    // if memOwnership is non-null, this means that signature and data's \
                memory is contained in
-    // a malloc()ed block starting at memOwnership, and ~Arguments will \
                free it.
-    // Otherwise, the instance assumes that @p signature and @p data live \
                in "borrowed" memory and
-    // you need to make sure that the memory lives as long as the \
                Arguments.
-    // (A notable user of this is Message - you can only get a const ref \
                to its internal Arguments
-    //  so you need to copy to take the Arguments away from the Message, \
                which copies out of the
-    //  borrowed memory into heap memory so the copy is safe)
-    // The copy contructor and assignment operator will always copy the \
                data, so copying is safe
-    // regarding memory correctness but has a significant performance \
                impact.
-    Arguments(byte *memOwnership, cstring signature, chunk data, bool \
                isByteSwapped = false);
-
-    // use these wherever possible if you care at all about efficiency!!
-    Arguments(Arguments &&other);
-    Arguments &operator=(Arguments &&other);
-
-    // copying needs special treatment due to the d-pointer
-    Arguments(const Arguments &other);
-    Arguments &operator=(const Arguments &other);
-
-    ~Arguments();
-
-    // error (if any) propagates to Message, so it is still available \
                later
-    Error error() const;
-
-    std::string prettyPrint() const;
-
-    cstring signature() const;
-    chunk data() const;
-
     enum SignatureType
     {
         MethodSignature = 0,
         VariantSignature
     };
 
-    static bool isStringValid(cstring string);
-    static bool isObjectPathValid(cstring objectPath);
-    static bool isObjectPathElementValid(cstring pathElement);
-    static bool isSignatureValid(cstring signature, SignatureType type = \
                MethodSignature);
-
-    enum {
+    enum
+    {
         MaxSignatureLength = 255
     };
 
-    enum IoState {
+    enum IoState
+    {
         // "exceptional" states
         NotStarted = 0,
         Finished,
@@ -124,8 +90,43 @@ public:
         UnixFd
     };
 
-private:
+    Arguments(); // constructs an empty argument list
+    // constructs an argument list to deserialize data in @p data with \
signature @p signature; +    // if memOwnership is non-null, this means \
that signature and data's memory is contained in +    // a malloc()ed block \
starting at memOwnership, and ~Arguments will free it. +    // Otherwise, \
the instance assumes that @p signature and @p data live in "borrowed" \
memory and +    // you need to make sure that the memory lives as long as \
the Arguments. +    // (A notable user of this is Message - you can only \
get a const ref to its internal Arguments +    //  so you need to copy to \
take the Arguments away from the Message, which copies out of the +    //  \
borrowed memory into heap memory so the copy is safe) +    // The copy \
contructor and assignment operator will always copy the data, so copying is \
safe +    // regarding memory correctness but has a significant performance \
impact. +    Arguments(byte *memOwnership, cstring signature, chunk data, \
bool isByteSwapped = false); +
+    // use these wherever possible if you care at all about efficiency!!
+    Arguments(Arguments &&other);
+    Arguments &operator=(Arguments &&other);
+
+    // copying needs special treatment due to the d-pointer
+    Arguments(const Arguments &other);
+    Arguments &operator=(const Arguments &other);
+
+    ~Arguments();
+
+    // error (if any) propagates to Message, so it is still available \
later +    Error error() const;
 
+    std::string prettyPrint() const;
+
+    cstring signature() const;
+    chunk data() const;
+
+    static bool isStringValid(cstring string);
+    static bool isObjectPathValid(cstring objectPath);
+    static bool isObjectPathElementValid(cstring pathElement);
+    static bool isSignatureValid(cstring signature, SignatureType type = \
MethodSignature); +
+private:
     struct podCstring // Same as cstring but without ctor.
                       // Can't put the cstring type into a union because \
it has a constructor :/  {
@@ -148,7 +149,6 @@ private:
     } DataUnion;
 
 public:
-
     // error handling is done by asking state() or isError(), not by \
                method return values.
     // occasionally looking at isError() is less work than checking every \
call.  class DFERRY_EXPORT Reader
@@ -171,6 +171,7 @@ public:
         cstring stateString() const;
         bool isInsideEmptyArray() const;
         cstring currentSignature() const; // current signature, either \
main signature or current variant +        cstring \
                currentSingleCompleteTypeSignature() const;
         // HACK call this in NeedMoreData state when more data has been \
                added; this replaces m_data
         // WARNING: calling replaceData() invalidates copies (if any) of \
this Reader  void replaceData(chunk data);


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

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