diff --git a/xpcom/build/nsStringAPI.cpp b/xpcom/build/nsStringAPI.cpp index c36f9d693759..ca9a76e4d7b5 100644 --- a/xpcom/build/nsStringAPI.cpp +++ b/xpcom/build/nsStringAPI.cpp @@ -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) { diff --git a/xpcom/build/nsXPCOMPrivate.h b/xpcom/build/nsXPCOMPrivate.h index 1e7ff967f688..1c9b698efcdd 100644 --- a/xpcom/build/nsXPCOMPrivate.h +++ b/xpcom/build/nsXPCOMPrivate.h @@ -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); diff --git a/xpcom/build/nsXPComInit.cpp b/xpcom/build/nsXPComInit.cpp index d4e8fc7676fc..bbaa423433e6 100644 --- a/xpcom/build/nsXPComInit.cpp +++ b/xpcom/build/nsXPComInit.cpp @@ -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; diff --git a/xpcom/glue/standalone/nsXPCOMGlue.cpp b/xpcom/glue/standalone/nsXPCOMGlue.cpp index 3205c6fa2dab..3bce0690abdd 100644 --- a/xpcom/glue/standalone/nsXPCOMGlue.cpp +++ b/xpcom/glue/standalone/nsXPCOMGlue.cpp @@ -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) { diff --git a/xpcom/string/public/nsStringAPI.h b/xpcom/string/public/nsStringAPI.h index 5edd1a912dee..f00c0ca77d7e 100644 --- a/xpcom/string/public/nsStringAPI.h +++ b/xpcom/string/public/nsStringAPI.h @@ -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 * diff --git a/xpcom/stub/nsStringAPI.cpp b/xpcom/stub/nsStringAPI.cpp index c36f9d693759..ca9a76e4d7b5 100644 --- a/xpcom/stub/nsStringAPI.cpp +++ b/xpcom/stub/nsStringAPI.cpp @@ -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) { diff --git a/xpcom/tests/TestMinStringAPI.cpp b/xpcom/tests/TestMinStringAPI.cpp index fe98a5a583bb..811df1387021 100644 --- a/xpcom/tests/TestMinStringAPI.cpp +++ b/xpcom/tests/TestMinStringAPI.cpp @@ -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);