I am using nsIStringServive as a factory of nsAString objects.
Would be great if this service become a part of String API.

NS_IMETHOD NS_CreateAString(const PRUnichar *aString, PRInt32 aLength,
nsAString * *_retval)
NS_IMETHOD NS_CreateACString(const char *aString, PRInt32 aLength,
nsACString * *_retval);
NS_IMETHOD NS_DeleteAString(nsAString* str);
NS_IMETHOD NS_DeleteACString(nsACString* str);

 NS_METHOD SetBlah(const nsAString &aBlah);
    void MyCode()
    {
      nsAString* sc;
      if (NS_CreateAString(sc, '', 0))
      {
      const PRUnichar kData[] = {'x','y','z','\0'};
       NS_StringSetData(*sc, kData, sizeof(kData)-1);
        SetBlah(*sc);
        NS_DeleteString(sc);
      }
    }
Are you planing to do something like this?

PS> Sorry for my English.

"Darin Fisher" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> Here you go:
>
>  ( I've also attached the header files: nsStringAPI.h and
nsEmbedString.h )
>
> -----------------------------
> New External String API Notes
> -----------------------------
>
> The methods are:
>
>   NS_C?StringContainerInit
>   NS_C?StringContainerFinish
>   NS_C?StringGetData
>   NS_C?StringSetData
>   NS_C?StringSetDataRange
>   NS_C?StringCopy
>
> Here's an overview of these methods (showing the wide versions only):
>
>   NS_StringContainerInit(nsStringContainer& aString)
>
>     Given a reference to a nsStringContainer struct, this function
>     initializes the struct for use as a nsAString to be used with XPCOM
>     methods.  This acts like a constructor for |aString|.  This method
>     provides external code with the ability to create a string object.
The
>     nsStringContainer struct can be allocated in any way the caller sees
>     fit.  (It turns out that nsStringContainer is large enough to hold a
>     nsString, and NS_StringContainerInit simply calls the C++ placement
new
>     operator to construct a nsString into the given nsStringContainer.)
>     nsStringContainer can be passed to any function expecting a nsAString.
>
>   NS_StringContainerFinish(nsStringContainer& aString)
>
>     Given a reference to a nsStringContainer struct, this function
>     finalizes the struct.  This acts like a destructor for |aString|.
>     This method does not free the |aString| reference, it only frees
>     any data pointers stored in the |aString| members.
>
>   PRUint32
>   NS_StringGetData(const nsAString& aString,
>                    const PRUnichar** aData,
>                    PRBool *aIsTerminated)
>
>     Given a reference to a nsAString, this function returns the length of
>     the string buffer, a pointer to the string buffer, and optionally a
>     boolean indicating whether or not the string buffer is
null-terminated.
>     This function can be used to access the data of any nsAString.
>
>   NS_StringSetData(nsAString& aString,
>                    const PRUnichar* aData,
>                    PRUint32 aDataLength);
>
>     Given a reference to a nsAString, this functions sets the contents of
>     the internal string buffer to a copy of |aData|.
>
>   NS_StringSetDataRange(nsAString& aString,
>                         PRUint32 aCutOffset,
>                         PRUint32 aCutLength,
>                         const PRUnichar* aData,
>                         PRUint32 aDataLength)
>
>     Given a reference to a nsAString, this functions sets a range of
>     characters in the internal string buffer to the given values.  This
>     function allows the caller to append, insert, or replace characters in
>     the nsAString.  There are inline wrapper functions that simplify these
>     tasks.
>
>   NS_StringCopy(nsAString& aDest, const nsAString& aSrc)
>
>     Given references to two nsAString objects, this function copies the
>     value of |aSrc| to |aDest|.  This function exists to take advantage of
>     the copy-on-write feature of the new string classes.
>
>
>
> -Darin
>
>
> Dmitriy B. wrote:
>
> >Hello.
> >In my opinion that is realy cool to have StringAPI to use in embeded
> >application.
> >I would like to see this API. Is it available already?
> >What happen with nsIStringService? Does it has any changes?
> >
> >Best regards, Dmitriy
> >
> >PS> Sorry for my English.
> >
> >"Darin Fisher" <[EMAIL PROTECTED]> wrote in message
> >news:[EMAIL PROTECTED]
> >
> >
> >>-------------------------------
> >>UPCOMING MOZILLA STRING CHANGES
> >>-------------------------------
> >>
> >>
> >>The Mozilla string code will be undergoing extensive revision
> >>following the release of Mozilla 1.7 alpha.  The changes will be
> >>mostly transparent, having very little affect on the string API.
> >>This change will be made first thing during the 1.7 beta cycle.
> >>
> >>The work is being tracked here:
> >>http://bugzilla.mozilla.org/show_bug.cgi?id=231995
> >>
> >>
> >>The major API-level changes include:
> >>
> >>   (1) nsAC?String will no longer be able to represent multi-fragment
> >>       strings.  This allows all implementations of nsAC?String to be
> >>       unified, resulting in a significant reduction of code.
> >>
> >>   (2) nsReadingIterator and nsWritingIterator will be limited to
> >>       iterating over a contiguous buffer.  Previously, operator++ was
> >>       forced to "normalize" the iterator forward to the next fragment.
> >>       This added additional code to every consumer of iterators that
> >>       was almost never needed since multi-fragment strings are very
> >>       uncommon.
> >>
> >>   (3) nsA?String methods are now all non-virtual.  This is possible
> >>       since there is now only one implementation of nsAC?String.  This
> >>       helps reduce code at the call sites and improves performance.
> >>       ABI compatibility with the existing vtable is maintained (more
> >>       on this later).  It is important to note that any external
> >>       components that use multi-fragment strings will be broken, but
> >>       passing multi-fragment strings in external components was
> >>       forbidden anyway (although the prohibition was poorly
> >>       documented) and none of our implementations of multi-fragment
> >>       strings were ever frozen for component developers to use outside
> >>       of the Mozilla codebase.
> >>
> >>   (4) A simplified string API is introduced for embedders and external
> >>       component developers.  nsAC?String's methods are now meant to be
> >>       used only within the Mozilla code base.  The nsEmbedC?String
> >>       class is now implemented in terms of the simplified string API.
> >>
> >>   (5) The following string classes have been eliminated:
> >>
> >>       nsSharableC?String
> >>
> >>         nsC?String will now allocate a sharable buffer by default.  It
> >>         implements thread-safe reference counting, enabling copy-on-
> >>         write semantics for most strings.  Since very little code
> >>         referenced nsSharableC?String, this class name has been
> >>         eliminated.
> >>
> >>       nsDependentSingleFragmentC?Substring
> >>
> >>         This is now equivalent to nsDependentC?Substring.  Since very
> >>         little code referenced nsDependentSingleFragmentC?Substring,
> >>         this class name has been eliminated.
> >>
> >>       nsDependentC?Concatenation
> >>
> >>         Since nsA?CString can no longer represent a multi-fragment
> >>         string, nsDependentC?Concatenation could no longer inherit
> >>         from nsAC?String.  Therefore, this class no longer exists.
> >>         However, efficient string concatenation is still implemented
> >>         using a very similar mechanism.  More on this later.
> >>
> >>   (6) nsStringFwd.h now forward declares all string classes.
> >>
> >>   (7) nsC?Substring has been added to the string hierarchy.  It will
> >>       be the core string class from which all other strings inherit.
> >>       It behaves much like the old nsSingleFragmentA?CString, except
> >>       that it does not reference the nsAC?String vtable to satisfy any
> >>       of its methods.  Many of the "getter"-functions are inlined for
> >>       performance.
> >>
> >>
> >>The revised string hierarchy is depicted below:
> >>
> >>               nsAC?String
> >>                    |
> >>                    |
> >>                    |
> >>              nsC?Substring
> >>                    |
> >>                    |-------- nsDependentC?Substring
> >>                    |
> >>                nsC?String
> >>                    |
> >>                    |------------.----------.----------.
> >>                    |            |          |          |
> >>            nsDepedentC?String   |          |          |
> >>                                 |          |          |
> >>                           nsC?AutoString   |          |
> >>                                            |          |
> >>                                     nsXPIDLC?String   |
> >>                                                       |
> >>                                             nsPromiseFlatC?String
> >>
> >>
> >>Class overview:
> >>
> >>   nsAC?String
> >>
> >>     This class is designed to be subclassed.  It is never directly
> >>     instantiated.  This class exists only to provide backwards
> >>     compatibility with the former string class API.  It is essentially
> >>     equivalent to nsC?Substring.  However, unlike nsC?Substring,
> >>     nsAC?String might be implemented by an external XPCOM component or
> >>     embedding application that has not yet migrated to the new
> >>     (simpler) embedding string API provided by XPCOM.
> >>
> >>   nsC?Substring
> >>
> >>     This class is designed to be subclassed.  It is never directly
> >>     instantiated.  It represents a string fragment that may or may not
> >>     be null-terminated.  It has methods to access and manipulate the
> >>     string buffer.  It has all of the code to manage the various
> >>     different buffer allocation schemes used by the string classes.
> >>     In many ways, the subclasses of nsC?Substring simply provide
> >>     specialized constructors that select the corresponding memory
> >>     allocation scheme.  If nsC?Substring needs to re-allocate the
> >>     buffer, it will allocate a null-terminated, sharable buffer.
> >>
> >>   nsC?String
> >>
> >>     This class is designed to be instantiated directly.  It is the
> >>     main string class.  It provides a heap allocated string buffer.
> >>     It also provides compatibility methods with the "obsolete" string
> >>     API that used to live in xpcom/string/obsolete (i.e., the "Rick
> >>     G." string API).  It always allocates a sharable buffer.
> >>
> >>   nsDependentC?String
> >>
> >>     This class is designed to be instantiated directly.  It provides a
> >>     mechanism to construct a nsC?String that simply stores a raw
> >>     pointer to an externally allocated buffer.  This class depends on
> >>     the user of the class to ensure that the buffer remains valid for
> >>     the lifetime of the nsDependentC?String.  This class can only wrap
> >>     a null-terminated buffer.
> >>
> >>   nsAutoC?String
> >>
> >>     This class is designed to be instantiated directly.  It provides a
> >>     mechanism to construct a nsC?String that optionally uses a fixed-
> >>     size, stack-based buffer.  This class is designed to be allocated
> >>     on the stack.  Allocating this class on the heap is usually a bad
> >>     idea ;-)
> >>
> >>   nsXPIDLC?String
> >>
> >>     This class is designed to be instantiated directly.  It provides
> >>     support for the getter_Copies mechanism.  It also provides support
> >>     for a null buffer.  Unlike nsC?String classes, the result of
> >>     nsXPIDLC?String::get() may return null if the nsXPIDLC?String is
> >>     uninitialized or was told to adopt a null-valued string buffer.
> >>     This class can also be cast automatically to |const char_type*|
> >>     for backwards compatibility.  Use this class when working with
> >>     XPCOM getter methods that return |string| or |wstring|.
> >>
> >>   nsPromiseFlatC?String
> >>
> >>     This class is designed to be instantiated via the
> >>     PromiseFlatC?String family of functions.  PromiseFlatC?String
> >>     takes a nsAC?String and returns a nsPromiseFlatC?String, which
> >>     "promises" to be null-terminated.  PromiseFlatC?String will
> >>     allocate a copy of the given string if necessary in order to
fulfill
> >>     it's promise of a null-terminated string.  The "flat" adjective
> >>     comes from the old string API that supported multi-fragment
strings.
> >>     With these current string changes, PromiseFlatC?String is still
very
> >>     useful for ensuring null-terminated storage.  This is usually only
> >>     important when you need to pass a nsC?Substring to an API that
takes
> >>     a raw character pointer.
> >>
> >>   nsDependentC?Substring
> >>
> >>     This class is designed to be instantiated via the Substring family
> >>     of functions.  It represents an array of characters that are not
> >>     null-terminated.  Much like nsDependentC?String, this class
> >>     depends on an externally allocated string buffer.  Use this class
> >>     to create a nsC?Substring that wraps a pair of raw character
> >>     pointers, a pair of nsReadingIterator<char_type>'s, or a section
> >>     of an existing nsC?Substring.
> >>
> >>
> >>Concatenations in the new world:
> >>
> >>   For the most part, string concatenation will continue to work just
> >>   as they always have.  They continue to be the preferred way to
> >>   compose a new string from several other strings.  The only
> >>   difference in the new world is that the string concatenation class
> >>   no longer inherits from nsAC?String, so it cannot be passed to
> >>   functions expecting a nsAC?String.  However, for compatibility with
> >>   existing code, a concatenation of strings will automatically flatten
> >>   itself into a nsC?String when necessary.
> >>
> >>   For example:
> >>
> >>     void foo( const nsAString& s )
> >>     {
> >>       nsCAutoString buf;
> >>       buf = NS_LITERAL_STRING("prefix") + e;
> >>       ...
> >>     }
> >>
> >>   In this case, the two strings "prefix" and |e| are written directly
> >>   to the buffer owned by |buf|.
> >>
> >>   Here's another example:
> >>
> >>     void bar( const nsAString& s );
> >>
> >>     {
> >>       nsString a, b;
> >>       ...
> >>       bar( a + b );
> >>     }
> >>
> >>   In this case, a temporary nsString is created to hold the result of
> >>   the concatenation of |a| and |b| prior to calling |bar|.  This
> >>   temporary nsString would not have been generated with the previous
> >>   string implementation that supported multi-fragment nsAStrings.
> >>   However, there was a serious bug in the older implementation that
> >>   made doing this kind of thing crash-prone (especially if the
> >>   definition of |bar| looked something like the definition of |foo| in
> >>   the previous example).  See bug 231995 for more details.
> >>
> >>   The main point here is that string concatenations will continue to
> >>   work as they have in the past, with a few minor exceptions.
> >>
> >>   For example, code such as the following will no longer compile:
> >>
> >>     {
> >>       nsString a, b;
> >>       ...
> >>       const nsAString& s = a + b;
> >>       ...
> >>     }
> >>
> >>   Such code is uncommon.  It should be rewritten like this:
> >>
> >>     {
> >>       nsString a, b;
> >>       ...
> >>       nsString r( a + b );
> >>       ...
> >>     }
> >>
> >>   |r| could also be declared a nsAutoString to avoid heap-allocating
> >>   the result of the concatenation.  However, since nsString allocates
> >>   a sharable buffer, the programmer should consider nsString if it is
> >>   expected that |r| might need to be copied elsewhere.
> >>
> >>
> >>Maintaining string ABI compatibility:
> >>
> >>   nsA?CString exists for backwards compatibility with the frozen
> >>   nsAC?String vtable.  ABI compatibility is maintained even though
> >>   nsAC?String's methods are all non-virtual.  While this sounds like a
> >>   contradiction, compatibility exists by having nsAC?String (in the
> >>   new world) store a pointer to an implementation of the old vtable.
> >>   The vtable methods all cast |this| to nsC?Substring and invoke the
> >>   corresponding methods on nsC?Substring.  (Yes, we are utilizing
> >>   knowledge of how the compiler implements virtual functions, but
that's
> >>   not unfamiliar territory -- xpconnect!)  This allows a new
nsAC?String
> >>   to have the same binary signature as an old nsAC?String.  Likewise,
> >>   every method on the new nsAC?String must first check the value of its
> >>   vtable pointer to determine if |this| is really a nsC?Substring
> >>   derived class or actually some other nsAC?String implementation (such
> >>   as the old nsEmbedC?String).
> >>
> >>   An advantage of this approach is that it eliminates virtual function
> >>   calls in most cases (especially for internal Gecko code).  Common
> >>   nsAC?String methods like BeginReading and Length are made much
> >>   faster by avoiding virtual function calls.  Code at the callsite is
> >>   also reduced since there is no need to dereference the |this|
> >>   pointer and the vtable pointer in order to gain access to the
> >>   address of the virtual function.  Now, the callsites make DSO/DLL
> >>   calls which are significantly less costly in terms of codesize and
> >>   runtime.
> >>
> >>
> >>New string API for XPCOM component developers:
> >>
> >>   Going forward, external components and embedding applications should
> >>   not call methods directly on nsA?CString.  These classes should be
> >>   viewed as opaque references to string objects.  This is important
> >>   because it will allow Gecko more flexibility to improve its string
> >>   implementation in the future.
> >>
> >>   The new external string API consists of a small set of functions
> >>   exported from the XPCOM library as well as a number of inline helper
> >>   functions.  Include nsStringAPI.h to use these functions.
> >>
> >>   nsEmbedString has been re-implemented in terms of this new external
> >>   string API.  For Gecko embedders and XPCOM component authors, the
> >>   XPCOM glue provides stub implementations of the new external string
> >>   API.  All one needs to do to use these functions in external code is
> >>   link to the XPCOM glue standalone library (xpcomglue_s).
> >>
> >>   If a component is developed against this new API, then it will only
> >>   work in versions of Mozilla that support this new API (obviously).
> >>   This means that component authors interested in compatibility with
> >>   Mozilla 1.4 (for example) will need to develop their components
> >>   against Mozilla 1.4 instead of the later versions of Mozilla.  New
> >>   versions of Mozilla will continue to be binary compatible with
> >>   FROZEN interfaces defined by older versions of Mozilla (see
> >>   "Maintaining string ABI compatibility" above).
> >>
> >>
> >>So, are we supposed to stop using nsAString?
> >>
> >>   The answer is that it depends.  AString in XPIDL will continue to
> >>   map to nsAString.  Gecko interfaces make extensive use of AString,
> >>   ACString, and AUTF8String, and this isn't going to change.  So,
> >>   nsAC?String will continue to be very important to code that
> >>   interacts with XPCOM interfaces.  However, when it makes sense
> >>   nsC?Substring should be used to pass around string references inside
> >>   the Mozilla codebase.  nsC?Substring unlike nsAC?String can be more
> >>   efficient since it does not need to inspect and possibly jump
> >>   through the vtable on each method call.
> >>
> >>   Moving code from nsA?CString to nsC?Substring is consistent with the
> >>   overall strategy of deCOMification that is on-going within Gecko.
> >>   If it ever happens that we are able to break binary compatibility
> >>   with Mozilla 1.0, then we would want to equate nsAC?String to
> >>   nsC?Substring.  Of course, I'm not counting on this happening
> >>   anytime soon.
> >>
> >>   Embedders and external component developers should treat nsAC?String
> >>   as an opaque handle to a string object.  They should use the new
> >>   external string API and nsEmbedC?String to work with Mozilla
> >>   strings.  <= I'm repeating myself here ;-)
> >>
> >>
> >>I've tried to minimize the impact of these changes.  I don't expect
> >>Mozilla hackers to have to re-learn a new string API.  If you are
> >>writing an external XPCOM component, I hope you will find the new API
> >>easier to work with.  I should add that my goal is to freeze the new
> >>external string API for Mozilla 1.7 final.
> >>
> >>Please let me know if you have any questions or concerns about these
> >>changes.
> >>
> >>
> >>Darin Fisher ([EMAIL PROTECTED])
> >>2004-02-17
> >>
> >>
> >
> >
> >_______________________________________________
> >Mozilla-seamonkey mailing list
> >[EMAIL PROTECTED]
> >http://mail.mozilla.org/listinfo/mozilla-seamonkey
> >
> >
>
>


----------------------------------------------------------------------------
----


> /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset:
4 -*- */
> /* ***** BEGIN LICENSE BLOCK *****
>  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
>  *
>  * The contents of this file are subject to the Mozilla Public License
Version
>  * 1.1 (the "License"); you may not use this file except in compliance
with
>  * the License. You may obtain a copy of the License at
>  * http://www.mozilla.org/MPL/
>  *
>  * Software distributed under the License is distributed on an "AS IS"
basis,
>  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License
>  * for the specific language governing rights and limitations under the
>  * License.
>  *
>  * The Original Code is a small implementation of the nsAString and
nsACString.
>  *
>  * The Initial Developer of the Original Code is
>  *   Peter Annema <[EMAIL PROTECTED]>.
>  *
>  * Portions created by the Initial Developer are Copyright (C) 2002
>  * the Initial Developer. All Rights Reserved.
>  *
>  * Contributor(s):
>  *   Darin Fisher <[EMAIL PROTECTED]>
>  *
>  * Alternatively, the contents of this file may be used under the terms of
>  * either the GNU General Public License Version 2 or later (the "GPL"),
or
>  * the GNU Lesser General Public License Version 2.1 or later (the
"LGPL"),
>  * in which case the provisions of the GPL or the LGPL are applicable
instead
>  * of those above. If you wish to allow use of your version of this file
only
>  * under the terms of either the GPL or the LGPL, and not to allow others
to
>  * use your version of this file under the terms of the MPL, indicate your
>  * decision by deleting the provisions above and replace them with the
notice
>  * and other provisions required by the GPL or the LGPL. If you do not
delete
>  * the provisions above, a recipient may use your version of this file
under
>  * the terms of any one of the MPL, the GPL or the LGPL.
>  *
>  * ***** END LICENSE BLOCK ***** */
>
> #ifndef nsEmbedString_h___
> #define nsEmbedString_h___
>
> #include "nsStringAPI.h"
>
> class nsEmbedString : public nsStringContainer
>   {
>     public:
>       typedef PRUnichar        char_type;
>       typedef nsEmbedString    self_type;
>       typedef nsAString        abstract_string_type;
>       typedef PRUint32         size_type;
>       typedef PRUint32         index_type;
>
>       nsEmbedString()
>         {
>           NS_StringContainerInit(*this);
>         }
>
>       nsEmbedString(const self_type& aString)
>         {
>           NS_StringContainerInit(*this);
>           NS_StringCopy(*this, aString);
>         }
>
>       explicit
>       nsEmbedString(const abstract_string_type& aReadable)
>         {
>           NS_StringContainerInit(*this);
>           NS_StringCopy(*this, aReadable);
>         }
>
>       explicit
>       nsEmbedString(const char_type* aData, size_type aLength =
PR_UINT32_MAX)
>         {
>           NS_StringContainerInit(*this);
>           NS_StringSetData(*this, aData, aLength);
>         }
>
>       ~nsEmbedString()
>         {
>           NS_StringContainerFinish(*this);
>         }
>
>       const char_type* get() const
>         {
>           const char_type* data;
>           NS_StringGetData(*this, &data);
>           return data;
>         }
>
>       size_type Length() const
>         {
>           const char_type* data;
>           return NS_StringGetData(*this, &data);
>         }
>
>       void Assign(const self_type& aString)
>         {
>           NS_StringCopy(*this, aString);
>         }
>       void Assign(const abstract_string_type& aReadable)
>         {
>           NS_StringCopy(*this, aReadable);
>         }
>       void Assign(const char_type* aData, size_type aLength =
PR_UINT32_MAX)
>         {
>           NS_StringSetData(*this, aData, aLength);
>         }
>       void Assign(char_type aChar)
>         {
>           NS_StringSetData(*this, &aChar, 1);
>         }
>
>       self_type& operator=(const self_type& aString)              {
Assign(aString);   return *this; }
>       self_type& operator=(const abstract_string_type& aReadable) {
Assign(aReadable); return *this; }
>       self_type& operator=(const char_type* aPtr)                 {
Assign(aPtr);      return *this; }
>       self_type& operator=(char_type aChar)                       {
Assign(aChar);     return *this; }
>
>       void Replace( index_type cutStart, size_type cutLength, const
char_type* data, size_type length = size_type(-1) )
>         {
>           NS_StringSetDataRange(*this, cutStart, cutLength, data, length);
>         }
>       void Replace( index_type cutStart, size_type cutLength, char_type
c )
>         {
>           Replace(cutStart, cutLength, &c, 1);
>         }
>       void Replace( index_type cutStart, size_type cutLength, const
abstract_string_type& readable )
>         {
>           const char_type* data;
>           PRUint32 dataLen = NS_StringGetData(readable, &data);
>           NS_StringSetDataRange(*this, cutStart, cutLength, data,
dataLen);
>         }
>
>       void Append( char_type c )
{ Replace(size_type(-1), 0, c); }
>       void Append( const char_type* data, size_type length =
size_type(-1) )                     { Replace(size_type(-1), 0, data,
length); }
>       void Append( const abstract_string_type& readable )
{ Replace(size_type(-1), 0, readable); }
>
>       self_type& operator+=( char_type c )
{ Append(c);        return *this; }
>       self_type& operator+=( const char_type* data )
{ Append(data);     return *this; }
>       self_type& operator+=( const abstract_string_type& readable )
{ Append(readable); return *this; }
>
>       void Insert( char_type c, index_type pos )
{ Replace(pos, 0, c); }
>       void Insert( const char_type* data, index_type pos, size_type length
= size_type(-1) )     { Replace(pos, 0, data, length); }
>       void Insert( const abstract_string_type& readable, index_type pos )
{ Replace(pos, 0, readable); }
>
>       void Cut( index_type cutStart, size_type cutLength )
{ Replace(cutStart, cutLength, nsnull, 0); }
>   };
>
> class nsEmbedCString : public nsCStringContainer
>   {
>     public:
>       typedef char             char_type;
>       typedef nsEmbedCString   self_type;
>       typedef nsACString       abstract_string_type;
>       typedef PRUint32         size_type;
>       typedef PRUint32         index_type;
>
>       nsEmbedCString()
>         {
>           NS_CStringContainerInit(*this);
>         }
>
>       nsEmbedCString(const self_type& aString)
>         {
>           NS_CStringContainerInit(*this);
>           NS_CStringCopy(*this, aString);
>         }
>
>       explicit
>       nsEmbedCString(const abstract_string_type& aReadable)
>         {
>           NS_CStringContainerInit(*this);
>           NS_CStringCopy(*this, aReadable);
>         }
>
>       explicit
>       nsEmbedCString(const char_type* aData, size_type aLength =
PR_UINT32_MAX)
>         {
>           NS_CStringContainerInit(*this);
>           NS_CStringSetData(*this, aData, aLength);
>         }
>
>       ~nsEmbedCString()
>         {
>           NS_CStringContainerFinish(*this);
>         }
>
>       const char_type* get() const
>         {
>           const char_type* data;
>           NS_CStringGetData(*this, &data);
>           return data;
>         }
>
>       size_type Length() const
>         {
>           const char_type* data;
>           return NS_CStringGetData(*this, &data);
>         }
>
>       void Assign(const self_type& aString)
>         {
>           NS_CStringCopy(*this, aString);
>         }
>       void Assign(const abstract_string_type& aReadable)
>         {
>           NS_CStringCopy(*this, aReadable);
>         }
>       void Assign(const char_type* aData, size_type aLength =
PR_UINT32_MAX)
>         {
>           NS_CStringSetData(*this, aData, aLength);
>         }
>       void Assign(char_type aChar)
>         {
>           NS_CStringSetData(*this, &aChar, 1);
>         }
>
>       self_type& operator=(const self_type& aString)              {
Assign(aString);   return *this; }
>       self_type& operator=(const abstract_string_type& aReadable) {
Assign(aReadable); return *this; }
>       self_type& operator=(const char_type* aPtr)                 {
Assign(aPtr);      return *this; }
>       self_type& operator=(char_type aChar)                       {
Assign(aChar);     return *this; }
>
>       void Replace( index_type cutStart, size_type cutLength, const
char_type* data, size_type length = size_type(-1) )
>         {
>           NS_CStringSetDataRange(*this, cutStart, cutLength, data,
length);
>         }
>       void Replace( index_type cutStart, size_type cutLength, char_type
c )
>         {
>           Replace(cutStart, cutLength, &c, 1);
>         }
>       void Replace( index_type cutStart, size_type cutLength, const
abstract_string_type& readable )
>         {
>           const char_type* data;
>           PRUint32 dataLen = NS_CStringGetData(readable, &data);
>           NS_CStringSetDataRange(*this, cutStart, cutLength, data,
dataLen);
>         }
>
>       void Append( char_type c )
{ Replace(size_type(-1), 0, c); }
>       void Append( const char_type* data, size_type length =
size_type(-1) )                     { Replace(size_type(-1), 0, data,
length); }
>       void Append( const abstract_string_type& readable )
{ Replace(size_type(-1), 0, readable); }
>
>       self_type& operator+=( char_type c )
{ Append(c);        return *this; }
>       self_type& operator+=( const char_type* data )
{ Append(data);     return *this; }
>       self_type& operator+=( const abstract_string_type& readable )
{ Append(readable); return *this; }
>
>       void Insert( char_type c, index_type pos )
{ Replace(pos, 0, c); }
>       void Insert( const char_type* data, index_type pos, size_type length
= size_type(-1) )     { Replace(pos, 0, data, length); }
>       void Insert( const abstract_string_type& readable, index_type pos )
{ Replace(pos, 0, readable); }
>
>       void Cut( index_type cutStart, size_type cutLength )
{ Replace(cutStart, cutLength, nsnull, 0); }
>   };
>
> #endif // !defined(nsEmbedString_h___)
>


----------------------------------------------------------------------------
----


> /* vim:set ts=2 sw=2 et cindent: */
> /* ***** BEGIN LICENSE BLOCK *****
>  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
>  *
>  * The contents of this file are subject to the Mozilla Public License
Version
>  * 1.1 (the "License"); you may not use this file except in compliance
with
>  * the License. You may obtain a copy of the License at
>  * http://www.mozilla.org/MPL/
>  *
>  * Software distributed under the License is distributed on an "AS IS"
basis,
>  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License
>  * for the specific language governing rights and limitations under the
>  * License.
>  *
>  * The Original Code is Mozilla.
>  *
>  * The Initial Developer of the Original Code is IBM Corporation.
>  * Portions created by IBM Corporation are Copyright (C) 2003
>  * IBM Corporation.  All Rights Reserved.
>  *
>  * Contributor(s):
>  *   Darin Fisher <[EMAIL PROTECTED]>
>  *
>  * Alternatively, the contents of this file may be used under the terms of
>  * either the GNU General Public License Version 2 or later (the "GPL"),
or
>  * the GNU Lesser General Public License Version 2.1 or later (the
"LGPL"),
>  * in which case the provisions of the GPL or the LGPL are applicable
instead
>  * of those above. If you wish to allow use of your version of this file
only
>  * under the terms of either the GPL or the LGPL, and not to allow others
to
>  * use your version of this file under the terms of the MPL, indicate your
>  * decision by deleting the provisions above and replace them with the
notice
>  * and other provisions required by the GPL or the LGPL. If you do not
delete
>  * the provisions above, a recipient may use your version of this file
under
>  * the terms of any one of the MPL, the GPL or the LGPL.
>  *
>  * ***** END LICENSE BLOCK ***** */
>
> #ifndef nsStringAPI_h__
> #define nsStringAPI_h__
>
> /**
>  * nsStringAPI.h
>  *
>  * This file describes a minimal API for working with XPCOM's abstract
>  * string classes.  It divorces the consumer from having any run-time
>  * dependency on the implementation details of the abstract string types.
>  */
>
> #include "nscore.h"
> #define NS_STRINGAPI(x) extern "C" NS_COM x
>
>
/* -------------------------------------------------------------------------
*/
>
> /**
>  * These are dummy class definitions for the abstract string types used in
>  * XPIDL generated header files.  Do not count on the structure of these
>  * classes, and do not try to mix these definitions with the internal
>  * definition of these classes used within the mozilla codebase.
>  */
>
> #ifndef nsAString_external
> #define nsAString_external nsAString
> #endif
>
> class nsAString_external
> {
> private:
>   void *v;
> };
>
> #ifndef nsACString_external
> #define nsACString_external nsACString
> #endif
>
> class nsACString_external
> {
> private:
>   void *v;
> };
>
>
/* -------------------------------------------------------------------------
*/
>
> /**
>  * nsStringContainer
>  *
>  * This is an opaque data type that is large enough to hold the canonical
>  * implementation of nsAString.  The binary structure of this class is an
>  * implementation detail.
>  *
>  * The string data stored in a string container is always single fragment
>  * and null-terminated.
>  *
>  * Typically, string containers are allocated on the stack for temporary
>  * use.  However, they can also be malloc'd if necessary.  In either case,
>  * a string container is not useful until it has been initialized with a
>  * call to NS_StringContainerInit.  The following example shows how to use
>  * a string container to call a function that takes a |nsAString &|
out-param.
>  *
>  *   NS_METHOD GetBlah(nsAString &aBlah);
>  *
>  *   void MyCode()
>  *   {
>  *     nsStringContainer sc;
>  *     if (NS_StringContainerInit(sc))
>  *     {
>  *       nsresult rv = GetBlah(sc);
>  *       if (NS_SUCCEEDED(rv))
>  *       {
>  *         const PRUnichar *data = NS_StringGetDataPtr(sc);
>  *         //
>  *         // |data| now points to the result of the GetBlah function
>  *         //
>  *       }
>  *       NS_StringContainerFinish(sc);
>  *     }
>  *   }
>  *
>  * The following example show how to use a string container to pass a
string
>  * parameter to a function taking a |const nsAString &| in-param.
>  *
>  *   NS_METHOD SetBlah(const nsAString &aBlah);
>  *
>  *   void MyCode()
>  *   {
>  *     nsStringContainer sc;
>  *     if (NS_StringContainerInit(sc))
>  *     {
>  *       const PRUnichar kData[] = {'x','y','z','\0'};
>  *       NS_StringSetData(sc, kData, sizeof(kData)-1);
>  *
>  *       SetBlah(sc);
>  *
>  *       NS_StringContainerFinish(sc);
>  *     }
>  *   }
>  */
> class nsStringContainer : public nsAString_external
> {
> private:
>   void     *d1;
>   PRUint32  d2;
>   void     *d3;
>
> public:
>   nsStringContainer() {} // MSVC6 needs this
> };
>
> /**
>  * NS_StringContainerInit
>  *
>  * @param aContainer    string container reference
>  * @return              true if string container successfully initialized
>  *
>  * This function may allocate additional memory for aContainer.  When
>  * aContainer is no longer needed, NS_StringContainerFinish should be
called.
>  */
> NS_STRINGAPI(PRBool)
> NS_StringContainerInit(nsStringContainer &aContainer);
>
> /**
>  * NS_StringContainerFinish
>  *
>  * @param aContainer    string container reference
>  *
>  * This function frees any memory owned by aContainer.
>  */
> NS_STRINGAPI(void)
> NS_StringContainerFinish(nsStringContainer &aContainer);
>
>
/* -------------------------------------------------------------------------
*/
>
> /**
>  * NS_StringGetData
>  *
>  * This function returns a const character pointer to the string's
internal
>  * buffer, the length of the string, and a boolean value indicating
whether
>  * or not the buffer is null-terminated.
>  *
>  * @param aStr          abstract string reference
>  * @param aData         out param that will hold the address of aStr's
>  *                      internal buffer
>  * @param aTerminated   if non-null, this out param will be set to
indicate
>  *                      whether or not aStr's internal buffer is null-
>  *                      terminated
>  * @return              length of aStr's internal buffer
>  */
> NS_STRINGAPI(PRUint32)
> NS_StringGetData
>   (const nsAString &aStr, const PRUnichar **aData,
>    PRBool *aTerminated = nsnull);
>
> /**
>  * NS_StringSetData
>  *
>  * This function copies aData into aStr.
>  *
>  * @param aStr          abstract string reference
>  * @param aData         character buffer
>  * @param aDataLength   number of characters to copy from source string
(pass
>  *                      PR_UINT32_MAX to copy until end of aData,
designated by
>  *                      a null character)
>  *
>  * This function does not necessarily null-terminate aStr after copying
data
>  * from aData.  The behavior depends on the implementation of the abstract
>  * string, aStr.  If aStr is a reference to a nsStringContainer, then its
data
>  * will be null-terminated by this function.
>  */
> NS_STRINGAPI(void)
> NS_StringSetData
>   (nsAString &aStr, const PRUnichar *aData,
>    PRUint32 aDataLength = PR_UINT32_MAX);
>
> /**
>  * NS_StringSetDataRange
>  *
>  * This function copies aData into a section of aStr.  As a result it can
be
>  * used to insert new characters into the string.
>  *
>  * @param aStr          abstract string reference
>  * @param aCutOffset    starting index where the string's existing data
>  *                      is to be overwritten (pass PR_UINT32_MAX to cause
>  *                      aData to be appended to the end of aStr, in which
>  *                      case the value of aCutLength is ignored).
>  * @param aCutLength    number of characters to overwrite starting at
>  *                      aCutOffset (pass PR_UINT32_MAX to overwrite until
the
>  *                      end of aStr).
>  * @param aData         character buffer (pass null to cause this function
>  *                      to simply remove the "cut" range)
>  * @param aDataLength   number of characters to copy from source string
(pass
>  *                      PR_UINT32_MAX to copy until end of aData,
designated by
>  *                      a null character)
>  *
>  * This function does not necessarily null-terminate aStr after copying
data
>  * from aData.  The behavior depends on the implementation of the abstract
>  * string, aStr.  If aStr is a reference to a nsStringContainer, then its
data
>  * will be null-terminated by this function.
>  */
> NS_STRINGAPI(void)
> NS_StringSetDataRange
>   (nsAString &aStr, PRUint32 aCutOffset, PRUint32 aCutLength,
>    const PRUnichar *aData, PRUint32 aDataLength = PR_UINT32_MAX);
>
> /**
>  * NS_StringCopy
>  *
>  * This function makes aDestStr have the same value as aSrcStr.  It is
>  * provided as an optimization.
>  *
>  * @param aDestStr      abstract string reference to be modified
>  * @param aSrcStr       abstract string reference containing source string
>  *
>  * This function does not necessarily null-terminate aDestStr after
copying
>  * data from aSrcStr.  The behavior depends on the implementation of the
>  * abstract string, aDestStr.  If aDestStr is a reference to a
>  * nsStringContainer, then its data will be null-terminated by this
function.
>  */
> NS_STRINGAPI(void)
> NS_StringCopy
>   (nsAString &aDestStr, const nsAString &aSrcStr);
>
> /**
>  * NS_StringAppendData
>  *
>  * This function appends data to the existing value of aStr.
>  *
>  * @param aStr          abstract string reference to be modified
>  * @param aData         character buffer
>  * @param aDataLength   number of characters to append (pass PR_UINT32_MAX
to
>  *                      append until a null-character is encountered)
>  *
>  * This function does not necessarily null-terminate aStr upon completion.
>  * The behavior depends on the implementation of the abstract string,
aStr.
>  * If aStr is a reference to a nsStringContainer, then its data will be
null-
>  * terminated by this function.
>  */
> inline void
> NS_StringAppendData(nsAString &aStr, const PRUnichar *aData,
>                     PRUint32 aDataLength = PR_UINT32_MAX)
> {
>   NS_StringSetDataRange(aStr, PR_UINT32_MAX, 0, aData, aDataLength);
> }
>
> /**
>  * NS_StringInsertData
>  *
>  * This function inserts data into the existing value of aStr at the
specified
>  * offset.
>  *
>  * @param aStr          abstract string reference to be modified
>  * @param aOffset       specifies where in the string to insert aData
>  * @param aData         character buffer
>  * @param aDataLength   number of characters to append (pass PR_UINT32_MAX
to
>  *                      append until a null-character is encountered)
>  *
>  * This function does not necessarily null-terminate aStr upon completion.
>  * The behavior depends on the implementation of the abstract string,
aStr.
>  * If aStr is a reference to a nsStringContainer, then its data will be
null-
>  * terminated by this function.
>  */
> inline void
> NS_StringInsertData(nsAString &aStr, PRUint32 aOffset, const PRUnichar
*aData,
>                     PRUint32 aDataLength = PR_UINT32_MAX)
> {
>   NS_StringSetDataRange(aStr, aOffset, 0, aData, aDataLength);
> }
>
> /**
>  * NS_StringCutData
>  *
>  * This function shortens the existing value of aStr, by removing
characters
>  * at the specified offset.
>  *
>  * @param aStr          abstract string reference to be modified
>  * @param aCutOffset    specifies where in the string to insert aData
>  * @param aCutLength    number of characters to remove
>  */
> inline void
> NS_StringCutData(nsAString &aStr, PRUint32 aCutOffset, PRUint32
aCutLength)
> {
>   NS_StringSetDataRange(aStr, aCutOffset, aCutLength, nsnull, 0);
> }
>
>
/* -------------------------------------------------------------------------
*/
>
> /**
>  * nsCStringContainer
>  *
>  * This is an opaque data type that is large enough to hold the canonical
>  * implementation of nsACString.  The binary structure of this class is an
>  * implementation detail.
>  *
>  * The string data stored in a string container is always single fragment
>  * and null-terminated.
>  *
>  * @see nsStringContainer for use cases and further documentation.
>  */
> class nsCStringContainer : public nsACString_external
> {
> private:
>   void    *d1;
>   PRUint32 d2;
>   void    *d3;
>
> public:
>   nsCStringContainer() {} // MSVC6 needs this
> };
>
> /**
>  * NS_CStringContainerInit
>  *
>  * @param aContainer    string container reference
>  * @return              true if string container successfully initialized
>  *
>  * This function may allocate additional memory for aContainer.  When
>  * aContainer is no longer needed, NS_CStringContainerFinish should be
called.
>  */
> NS_STRINGAPI(PRBool)
> NS_CStringContainerInit(nsCStringContainer &aContainer);
>
> /**
>  * NS_CStringContainerFinish
>  *
>  * @param aContainer    string container reference
>  *
>  * This function frees any memory owned by aContainer.
>  */
> NS_STRINGAPI(void)
> NS_CStringContainerFinish(nsCStringContainer &aContainer);
>
>
/* -------------------------------------------------------------------------
*/
>
> /**
>  * NS_CStringGetData
>  *
>  * This function returns a const character pointer to the string's
internal
>  * buffer, the length of the string, and a boolean value indicating
whether
>  * or not the buffer is null-terminated.
>  *
>  * @param aStr          abstract string reference
>  * @param aData         out param that will hold the address of aStr's
>  *                      internal buffer
>  * @param aTerminated   if non-null, this out param will be set to
indicate
>  *                      whether or not aStr's internal buffer is null-
>  *                      terminated
>  * @return              length of aStr's internal buffer
>  */
> NS_STRINGAPI(PRUint32)
> NS_CStringGetData
>   (const nsACString &aStr, const char **aData,
>    PRBool *aTerminated = nsnull);
>
> /**
>  * NS_CStringSetData
>  *
>  * This function copies aData into aStr.
>  *
>  * @param aStr          abstract string reference
>  * @param aData         character buffer
>  * @param aDataLength   number of characters to copy from source string
(pass
>  *                      PR_UINT32_MAX to copy until end of aData,
designated by
>  *                      a null character)
>  *
>  * This function does not necessarily null-terminate aStr after copying
data
>  * from aData.  The behavior depends on the implementation of the abstract
>  * string, aStr.  If aStr is a reference to a nsStringContainer, then its
data
>  * will be null-terminated by this function.
>  */
> NS_STRINGAPI(void)
> NS_CStringSetData
>   (nsACString &aStr, const char *aData,
>    PRUint32 aDataLength = PR_UINT32_MAX);
>
> /**
>  * NS_CStringSetDataRange
>  *
>  * This function copies aData into a section of aStr.  As a result it can
be
>  * used to insert new characters into the string.
>  *
>  * @param aStr          abstract string reference
>  * @param aCutOffset    starting index where the string's existing data
>  *                      is to be overwritten (pass PR_UINT32_MAX to cause
>  *                      aData to be appended to the end of aStr, in which
>  *                      case the value of aCutLength is ignored).
>  * @param aCutLength    number of characters to overwrite starting at
>  *                      aCutOffset (pass PR_UINT32_MAX to overwrite until
the
>  *                      end of aStr).
>  * @param aData         character buffer (pass null to cause this function
>  *                      to simply remove the "cut" range)
>  * @param aDataLength   number of characters to copy from source string
(pass
>  *                      PR_UINT32_MAX to copy until end of aData,
designated by
>  *                      a null character)
>  *
>  * This function does not necessarily null-terminate aStr after copying
data
>  * from aData.  The behavior depends on the implementation of the abstract
>  * string, aStr.  If aStr is a reference to a nsStringContainer, then its
data
>  * will be null-terminated by this function.
>  */
> NS_STRINGAPI(void)
> NS_CStringSetDataRange
>   (nsACString &aStr, PRUint32 aCutOffset, PRUint32 aCutLength,
>    const char *aData, PRUint32 aDataLength = PR_UINT32_MAX);
>
> /**
>  * NS_CStringCopy
>  *
>  * This function makes aDestStr have the same value as aSrcStr.  It is
>  * provided as an optimization.
>  *
>  * @param aDestStr      abstract string reference to be modified
>  * @param aSrcStr       abstract string reference containing source string
>  *
>  * This function does not necessarily null-terminate aDestStr after
copying
>  * data from aSrcStr.  The behavior depends on the implementation of the
>  * abstract string, aDestStr.  If aDestStr is a reference to a
>  * nsStringContainer, then its data will be null-terminated by this
function.
>  */
> NS_STRINGAPI(void)
> NS_CStringCopy
>   (nsACString &aDestStr, const nsACString &aSrcStr);
>
> /**
>  * NS_CStringAppendData
>  *
>  * This function appends data to the existing value of aStr.
>  *
>  * @param aStr          abstract string reference to be modified
>  * @param aData         character buffer
>  * @param aDataLength   number of characters to append (pass PR_UINT32_MAX
to
>  *                      append until a null-character is encountered)
>  *
>  * This function does not necessarily null-terminate aStr upon completion.
>  * The behavior depends on the implementation of the abstract string,
aStr.
>  * If aStr is a reference to a nsStringContainer, then its data will be
null-
>  * terminated by this function.
>  */
> inline void
> NS_CStringAppendData(nsACString &aStr, const char *aData,
>                     PRUint32 aDataLength = PR_UINT32_MAX)
> {
>   NS_CStringSetDataRange(aStr, PR_UINT32_MAX, 0, aData, aDataLength);
> }
>
> /**
>  * NS_CStringInsertData
>  *
>  * This function inserts data into the existing value of aStr at the
specified
>  * offset.
>  *
>  * @param aStr          abstract string reference to be modified
>  * @param aOffset       specifies where in the string to insert aData
>  * @param aData         character buffer
>  * @param aDataLength   number of characters to append (pass PR_UINT32_MAX
to
>  *                      append until a null-character is encountered)
>  *
>  * This function does not necessarily null-terminate aStr upon completion.
>  * The behavior depends on the implementation of the abstract string,
aStr.
>  * If aStr is a reference to a nsStringContainer, then its data will be
null-
>  * terminated by this function.
>  */
> inline void
> NS_CStringInsertData(nsACString &aStr, PRUint32 aOffset, const char
*aData,
>                     PRUint32 aDataLength = PR_UINT32_MAX)
> {
>   NS_CStringSetDataRange(aStr, aOffset, 0, aData, aDataLength);
> }
>
> /**
>  * NS_CStringCutData
>  *
>  * This function shortens the existing value of aStr, by removing
characters
>  * at the specified offset.
>  *
>  * @param aStr          abstract string reference to be modified
>  * @param aCutOffset    specifies where in the string to insert aData
>  * @param aCutLength    number of characters to remove
>  */
> inline void
> NS_CStringCutData(nsACString &aStr, PRUint32 aCutOffset, PRUint32
aCutLength)
> {
>   NS_CStringSetDataRange(aStr, aCutOffset, aCutLength, nsnull, 0);
> }
>
> #endif // nsStringAPI_h__
>


_______________________________________________
mozilla-embedding mailing list
[EMAIL PROTECTED]
http://mail.mozilla.org/listinfo/mozilla-embedding

Reply via email to