Hello. That is Ok, if i am using C++. But many people are using others programming languages. For me it PASCAL. If i load XPCOM to be use in PASCAL or (VB for instance, i can use interfaces without fail) i must implement the C++ sringservice.dll (which exports String API functions) and link it to my PASCAL(VB) application:( That is realy not comfortable.
No problem for me when my application is C++ code only. Best regards, Dmitriy PS ; Sorry for my English. "Darin Fisher" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > Dmitriy, > > This new external string API is meant to make nsIStringService > unnecessary. It actually provides a very similar API. For example, I > could implement the methods you propose using this new API. > > > Dmitriy B. wrote: > > >I am using nsIStringServive as a factory of nsAString objects. > > > > > > nsIStringService was removed from the source tree not long ago. It was > never made an official Gecko API. I hope its removal doesn't complicate > things for you. > > > >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); > > > > > > > > Here's how these methods could be implemented: > > NS_CreateAString(const PRUnichar *aString, PRInt32 aLength, nsAString > **_retval) > { > nsStringContainer *sc = new nsStringContainer; > NS_StringContainerInit(*sc); > NS_StringSetData(*sc, aString, aLength); > *_retval = sc; > } > > NS_DeleteAString(nsAString *str) > { > nsStringContainer *sc = (nsStringContainer *) str; > NS_StringContainerFinish(*sc); > delete sc; > } > > NOTE: I don't think these methods are ideal. Let me show you how I > would write SetBlah using the new external string API. > > > > 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); > > } > > } > > > > > > > > NS_METHOD SetBlah(const nsAString &aBlah); > > void MyCode() > { > nsStringContainer sc; > NS_StringContainerInit(sc); > > const PRUnichar kData[] = {'x','y','z','\0'}; > NS_StringSetData(sc, kData, sizeof(kData)-1); > > SetBlah(sc); > > NS_StringContainerFinish(sc); > } > > But an even easier solution that is exactly equivalent would be to use > nsEmbedString, like this: > > void MyCode() > { > const PRUnichar kData[] = {'x','y','z','\0'}; > > nsEmbedString str(kData, sizeof(kData)-1); > > SetBlah(str); > } > > Notice that you don't have to worry about calling > NS_StringContainerFinish, and the resulting code is much simpler. > > -Darin > > > >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-seamonkey mailing list > >[EMAIL PROTECTED] > >http://mail.mozilla.org/listinfo/mozilla-seamonkey > > > > > _______________________________________________ Mozilla-xpcom mailing list [EMAIL PROTECTED] http://mail.mozilla.org/listinfo/mozilla-xpcom
