landing patch for bug 239716 "inout wstring methods are difficult to implement with nsEmbedString" patch by marco@gnome.org r=darin sr=dbaron

This commit is contained in:
darin%meer.net 2004-04-20 00:21:34 +00:00
parent c4323e6baf
commit edc1e0d23c
7 changed files with 124 additions and 28 deletions

View File

@ -78,6 +78,12 @@ NS_StringGetData(const nsAString &aStr, const PRUnichar **aData,
return begin.size_forward();
}
NS_STRINGAPI(PRUnichar *)
NS_StringCloneData(const nsAString &aStr)
{
return ToNewUnicode(aStr);
}
NS_STRINGAPI(nsresult)
NS_StringSetData(nsAString &aStr, const PRUnichar *aData, PRUint32 aDataLength)
{
@ -157,6 +163,12 @@ NS_CStringGetData(const nsACString &aStr, const char **aData,
return begin.size_forward();
}
NS_STRINGAPI(char *)
NS_CStringCloneData(const nsACString &aStr)
{
return ToNewCString(aStr);
}
NS_STRINGAPI(nsresult)
NS_CStringSetData(nsACString &aStr, const char *aData, PRUint32 aDataLength)
{

View File

@ -76,38 +76,40 @@ NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine);
// PUBLIC
typedef nsresult (* InitFunc)(nsIServiceManager* *result, nsIFile* binDirectory, nsIDirectoryServiceProvider* appFileLocationProvider);
typedef nsresult (* ShutdownFunc)(nsIServiceManager* servMgr);
typedef nsresult (* GetServiceManagerFunc)(nsIServiceManager* *result);
typedef nsresult (* GetComponentManagerFunc)(nsIComponentManager* *result);
typedef nsresult (* GetComponentRegistrarFunc)(nsIComponentRegistrar* *result);
typedef nsresult (* GetMemoryManagerFunc)(nsIMemory* *result);
typedef nsresult (* NewLocalFileFunc)(const nsAString &path, PRBool followLinks, nsILocalFile* *result);
typedef nsresult (* NewNativeLocalFileFunc)(const nsACString &path, PRBool followLinks, nsILocalFile* *result);
typedef nsresult (* InitFunc)(nsIServiceManager* *result, nsIFile* binDirectory, nsIDirectoryServiceProvider* appFileLocationProvider);
typedef nsresult (* ShutdownFunc)(nsIServiceManager* servMgr);
typedef nsresult (* GetServiceManagerFunc)(nsIServiceManager* *result);
typedef nsresult (* GetComponentManagerFunc)(nsIComponentManager* *result);
typedef nsresult (* GetComponentRegistrarFunc)(nsIComponentRegistrar* *result);
typedef nsresult (* GetMemoryManagerFunc)(nsIMemory* *result);
typedef nsresult (* NewLocalFileFunc)(const nsAString &path, PRBool followLinks, nsILocalFile* *result);
typedef nsresult (* NewNativeLocalFileFunc)(const nsACString &path, PRBool followLinks, nsILocalFile* *result);
typedef nsresult (* GetDebugFunc)(nsIDebug* *result);
typedef nsresult (* GetTraceRefcntFunc)(nsITraceRefcnt* *result);
typedef nsresult (* GetDebugFunc)(nsIDebug* *result);
typedef nsresult (* GetTraceRefcntFunc)(nsITraceRefcnt* *result);
typedef nsresult (* StringContainerInitFunc)(nsStringContainer&);
typedef void (* StringContainerFinishFunc)(nsStringContainer&);
typedef PRUint32 (* StringGetDataFunc)(const nsAString&, const PRUnichar**, PRBool*);
typedef nsresult (* StringSetDataFunc)(nsAString&, const PRUnichar*, PRUint32);
typedef nsresult (* StringSetDataRangeFunc)(nsAString&, PRUint32, PRUint32, const PRUnichar*, PRUint32);
typedef nsresult (* StringCopyFunc)(nsAString &, const nsAString &);
typedef nsresult (* StringContainerInitFunc)(nsStringContainer&);
typedef void (* StringContainerFinishFunc)(nsStringContainer&);
typedef PRUint32 (* StringGetDataFunc)(const nsAString&, const PRUnichar**, PRBool*);
typedef PRUnichar* (* StringCloneDataFunc)(const nsAString&);
typedef nsresult (* StringSetDataFunc)(nsAString&, const PRUnichar*, PRUint32);
typedef nsresult (* StringSetDataRangeFunc)(nsAString&, PRUint32, PRUint32, const PRUnichar*, PRUint32);
typedef nsresult (* StringCopyFunc)(nsAString &, const nsAString &);
typedef nsresult (* CStringContainerInitFunc)(nsCStringContainer&);
typedef void (* CStringContainerFinishFunc)(nsCStringContainer&);
typedef PRUint32 (* CStringGetDataFunc)(const nsACString&, const char**, PRBool*);
typedef nsresult (* CStringSetDataFunc)(nsACString&, const char*, PRUint32);
typedef nsresult (* CStringSetDataRangeFunc)(nsACString&, PRUint32, PRUint32, const char*, PRUint32);
typedef nsresult (* CStringCopyFunc)(nsACString &, const nsACString &);
typedef nsresult (* CStringContainerInitFunc)(nsCStringContainer&);
typedef void (* CStringContainerFinishFunc)(nsCStringContainer&);
typedef PRUint32 (* CStringGetDataFunc)(const nsACString&, const char**, PRBool*);
typedef char* (* CStringCloneDataFunc)(const nsACString&);
typedef nsresult (* CStringSetDataFunc)(nsACString&, const char*, PRUint32);
typedef nsresult (* CStringSetDataRangeFunc)(nsACString&, PRUint32, PRUint32, const char*, PRUint32);
typedef nsresult (* CStringCopyFunc)(nsACString &, const nsACString &);
typedef nsresult (* CStringToUTF16)(const nsACString &, PRUint32, const nsAString &);
typedef nsresult (* UTF16ToCString)(const nsAString &, PRUint32, const nsACString &);
typedef nsresult (* CStringToUTF16)(const nsACString &, PRUint32, const nsAString &);
typedef nsresult (* UTF16ToCString)(const nsAString &, PRUint32, const nsACString &);
// PRIVATE
typedef nsresult (* RegisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine, PRUint32 priority);
typedef nsresult (* UnregisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine);
typedef nsresult (* RegisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine, PRUint32 priority);
typedef nsresult (* UnregisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine);
typedef struct XPCOMFunctions{
PRUint32 version;
@ -144,7 +146,9 @@ typedef struct XPCOMFunctions{
CStringCopyFunc cstringCopy;
CStringToUTF16 cstringToUTF16;
UTF16ToCString utf16ToCString;
StringCloneDataFunc stringCloneData;
CStringCloneDataFunc cstringCloneData;
} XPCOMFunctions;
typedef nsresult (PR_CALLBACK *GetFrozenFunctionsFunc)(XPCOMFunctions *entryPoints, const char* libraryPath);

View File

@ -860,7 +860,7 @@ NS_GetFrozenFunctions(XPCOMFunctions *functions, const char* libraryPath)
}
// these functions were added post 1.6 (need to check size of |functions|)
if (functions->size > offsetof(XPCOMFunctions, utf16ToCString)) {
if (functions->size > offsetof(XPCOMFunctions, cstringCloneData)) {
GET_FUNC(stringContainerInit, StringContainerInitFunc, "NS_StringContainerInit");
GET_FUNC(stringContainerFinish, StringContainerFinishFunc, "NS_StringContainerFinish");
GET_FUNC(stringGetData, StringGetDataFunc, "NS_StringGetData");
@ -875,6 +875,8 @@ NS_GetFrozenFunctions(XPCOMFunctions *functions, const char* libraryPath)
GET_FUNC(cstringCopy, CStringCopyFunc, "NS_CStringCopy");
GET_FUNC(cstringToUTF16, CStringToUTF16, "NS_CStringToUTF16");
GET_FUNC(utf16ToCString, UTF16ToCString, "NS_UTF16ToCString");
GET_FUNC(stringCloneData, StringCloneDataFunc, "NS_StringCloneData");
GET_FUNC(cstringCloneData, CStringCloneDataFunc, "NS_CStringCloneData");
}
rv = NS_OK;

View File

@ -288,6 +288,14 @@ NS_StringGetData(const nsAString &aStr, const PRUnichar **aBuf, PRBool *aTerm)
return xpcomFunctions.stringGetData(aStr, aBuf, aTerm);
}
extern "C" NS_COM PRUnichar *
NS_StringCloneData(const nsAString &aStr)
{
if (!xpcomFunctions.stringCloneData)
return nsnull;
return xpcomFunctions.stringCloneData(aStr);
}
extern "C" NS_COM nsresult
NS_StringSetData(nsAString &aStr, const PRUnichar *aBuf, PRUint32 aCount)
{
@ -340,6 +348,14 @@ NS_CStringGetData(const nsACString &aStr, const char **aBuf, PRBool *aTerm)
return xpcomFunctions.cstringGetData(aStr, aBuf, aTerm);
}
extern "C" NS_COM char *
NS_CStringCloneData(const nsACString &aStr)
{
if (!xpcomFunctions.cstringCloneData)
return nsnull;
return xpcomFunctions.cstringCloneData(aStr);
}
extern "C" NS_COM nsresult
NS_CStringSetData(nsACString &aStr, const char *aBuf, PRUint32 aCount)
{

View File

@ -172,6 +172,22 @@ NS_StringGetData
(const nsAString &aStr, const PRUnichar **aData,
PRBool *aTerminated = nsnull);
/**
* NS_StringGetData
*
* This function returns a null-terminated copy of the string's
* internal buffer.
*
* @param aStr abstract string reference
* @return null-terminated copy of the string's internal buffer
* (it must be free'd using using nsMemory::Free)
*
* @status FROZEN
*/
NS_STRINGAPI(PRUnichar *)
NS_StringCloneData
(const nsAString &aStr);
/**
* NS_StringSetData
*
@ -381,6 +397,22 @@ NS_CStringGetData
(const nsACString &aStr, const char **aData,
PRBool *aTerminated = nsnull);
/**
* NS_CStringGetData
*
* This function returns a null-terminated copy of the string's
* internal buffer.
*
* @param aStr abstract string reference
* @return null-terminated copy of the string's internal buffer
* (it must be free'd using using nsMemory::Free)
*
* @status FROZEN
*/
NS_STRINGAPI(char *)
NS_CStringCloneData
(const nsACString &aStr);
/**
* NS_CStringSetData
*

View File

@ -78,6 +78,12 @@ NS_StringGetData(const nsAString &aStr, const PRUnichar **aData,
return begin.size_forward();
}
NS_STRINGAPI(PRUnichar *)
NS_StringCloneData(const nsAString &aStr)
{
return ToNewUnicode(aStr);
}
NS_STRINGAPI(nsresult)
NS_StringSetData(nsAString &aStr, const PRUnichar *aData, PRUint32 aDataLength)
{
@ -157,6 +163,12 @@ NS_CStringGetData(const nsACString &aStr, const char **aData,
return begin.size_forward();
}
NS_STRINGAPI(char *)
NS_CStringCloneData(const nsACString &aStr)
{
return ToNewCString(aStr);
}
NS_STRINGAPI(nsresult)
NS_CStringSetData(nsACString &aStr, const char *aData, PRUint32 aDataLength)
{

View File

@ -51,6 +51,7 @@ static PRBool test_basic_1()
const char *ptr;
PRUint32 len;
char *clone;
NS_CStringGetData(s, &ptr);
if (ptr == nsnull || *ptr != '\0')
@ -72,6 +73,14 @@ static PRBool test_basic_1()
return PR_FALSE;
}
clone = NS_CStringCloneData(s);
if (ptr == nsnull || strcmp(ptr, kAsciiData) != 0)
{
NS_ERROR("unexpected result");
return PR_FALSE;
}
nsMemory::Free(clone);
nsCStringContainer temp;
NS_CStringContainerInit(temp);
NS_CStringCopy(temp, s);
@ -101,6 +110,7 @@ static PRBool test_basic_2()
const PRUnichar *ptr;
PRUint32 len;
PRUnichar *clone;
NS_StringGetData(s, &ptr);
if (ptr == nsnull || *ptr != '\0')
@ -122,6 +132,14 @@ static PRBool test_basic_2()
return PR_FALSE;
}
clone = NS_StringCloneData(s);
if (ptr == nsnull || nsCRT::strcmp(ptr, kUnicodeData) != 0)
{
NS_ERROR("unexpected result");
return PR_FALSE;
}
nsMemory::Free(clone);
nsStringContainer temp;
NS_StringContainerInit(temp);
NS_StringCopy(temp, s);