#include "Xpclucene.h" #include "nsLuceneUtils.h" #include "nsIServiceManager.h" #include "nsCOMPtr.h" #include "nsString.h" #include "nsMemory.h" #include "nsTextFormatter.h" #include "prtime.h" #include "prprf.h" #include "nsITextToSubURI.h" #include nsresult nsLuceneUtils::urlDecode(const nsACString& url, PRUnichar** decoded) { nsresult rv; nsCOMPtr ttsu = do_GetService(NS_ITEXTTOSUBURI_CONTRACTID, &rv); if (NS_SUCCEEDED(rv)) { rv = ttsu->UnEscapeAndConvert("UTF-8", PromiseFlatCString(url).get(), decoded); } return rv; } nsresult nsLuceneUtils::ParseRFC3339GMT(const nsAString& date, PRTime* aResult) { PRExplodedTime et; PR_sscanf(NS_ConvertUTF16toUTF8(date).get(), "%d-%d-%dT%d:%d:%d+00:00", &et.tm_year, &et.tm_month, &et.tm_mday, &et.tm_hour, &et.tm_min, &et.tm_sec); et.tm_usec = 0; et.tm_params.tp_gmt_offset = 0; et.tm_params.tp_dst_offset = 0; *aResult = PR_ImplodeTime(&et); return NS_OK; } nsresult nsLuceneUtils::FormatRFC3339GMT(PRTime aTime, nsAString& aResult) { PRExplodedTime exploded; PR_ExplodeTime(aTime, PR_GMTParameters, &exploded); nsAutoString temp; nsTextFormatter::ssprintf(temp, NS_LITERAL_STRING("%04d-%02d-%02dT%02d:%02d:%02d+00:00").get(), exploded.tm_year, exploded.tm_month + 1, exploded.tm_mday, exploded.tm_hour, exploded.tm_min, exploded.tm_sec); /* * Workaround for bug #323376 */ aResult.Assign(temp.get()); return NS_OK; } nsresult nsLuceneUtils::ParseIndexDateGMT(const nsAString& date, PRTime* aResult) { PRExplodedTime et; PR_sscanf(NS_ConvertUTF16toUTF8(date).get(), "%4d%2d%2d%2d%2d%2d", &et.tm_year, &et.tm_month, &et.tm_mday, &et.tm_hour, &et.tm_min, &et.tm_sec); et.tm_usec = 0; et.tm_params.tp_gmt_offset = 0; et.tm_params.tp_dst_offset = 0; *aResult = PR_ImplodeTime(&et); return NS_OK; } nsresult nsLuceneUtils::FormatIndexDateGMT(PRTime aTime, nsAString& aResult) { PRExplodedTime exploded; PR_ExplodeTime(aTime, PR_GMTParameters, &exploded); nsAutoString temp; nsTextFormatter::ssprintf(temp, NS_LITERAL_STRING("%04d%02d%02d%02d%02d%02d").get(), exploded.tm_year, exploded.tm_month + 1, exploded.tm_mday, exploded.tm_hour, exploded.tm_min, exploded.tm_sec); /* * Workaround for bug #323376 */ aResult.Assign(temp.get()); return NS_OK; } nsresult nsLuceneUtils::FormatRFC3339Local(PRTime aTime, nsAString& aResult) { PRExplodedTime exploded; PR_ExplodeTime(aTime, PR_LocalTimeParameters, &exploded); /* * XXX: Do I need to consider dst offset? */ PRInt32 offset = exploded.tm_params.tp_gmt_offset; PRInt32 offsetHours = offset / (60 * 60); offset -= offsetHours * 60 * 60; PRInt32 offsetMinutes = offset / 60; nsAutoString temp; nsTextFormatter::ssprintf(temp, NS_LITERAL_STRING("%04d-%02d-%02dT%02d:%02d:%02d%03d:%02d").get(), exploded.tm_year, exploded.tm_month + 1, exploded.tm_mday, exploded.tm_hour, exploded.tm_min, exploded.tm_sec, offsetHours, offsetMinutes); /* * Workaround for bug #323376 */ aResult.Assign(temp.get()); return NS_OK; }