int main(int argc, char* argv[]) { if (test_common_init(&argc, &argv) != 0) return -1; nsresult rv; if (argc < 4) { printf("usage: %s <file-to-read> <start-offset> <read-length>\n", argv[0]); return -1; } char* fileName = argv[1]; int64_t offset, length; int err = PR_sscanf(argv[2], "%lld", &offset); if (err == -1) { printf("Start offset must be an integer!\n"); return 1; } err = PR_sscanf(argv[3], "%lld", &length); if (err == -1) { printf("Length must be an integer!\n"); return 1; } { nsCOMPtr<nsIServiceManager> servMan; NS_InitXPCOM2(getter_AddRefs(servMan), nullptr, nullptr); nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan); NS_ASSERTION(registrar, "Null nsIComponentRegistrar"); if (registrar) registrar->AutoRegister(nullptr); #if defined(PR_LOGGING) gTestLog = PR_NewLogModule("Test"); #endif nsCOMPtr<nsIFile> file; rv = NS_NewNativeLocalFile(nsDependentCString(fileName), false, getter_AddRefs(file)); if (NS_FAILED(rv)) return rv; rv = RunTest(file, offset, length); NS_ASSERTION(NS_SUCCEEDED(rv), "RunTest failed"); // give background threads a chance to finish whatever work they may // be doing. PR_Sleep(PR_SecondsToInterval(1)); } // this scopes the nsCOMPtrs // no nsCOMPtrs are allowed to be alive when you call NS_ShutdownXPCOM rv = NS_ShutdownXPCOM(nullptr); NS_ASSERTION(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM failed"); return NS_OK; }
NS_IMETHODIMP sbDatetimePropertyInfo::MakeSearchable(const nsAString & aValue, nsAString & _retval) { nsresult rv; PRInt64 value = 0; NS_ConvertUTF16toUTF8 narrow(aValue); _retval = aValue; _retval.StripWhitespace(); sbSimpleAutoLock lock(mMinMaxDateTimeLock); if(PR_sscanf(narrow.get(), gsFmtRadix10, &value) != 1) { _retval = EmptyString(); return NS_ERROR_INVALID_ARG; } char out[32] = {0}; if(PR_snprintf(out, 32, gsSortFmtRadix10, value) == (PRUint32)-1) { rv = NS_ERROR_FAILURE; _retval = EmptyString(); } else { NS_ConvertUTF8toUTF16 wide(out); rv = NS_OK; _retval = wide; } return rv; }
int32_t nsAString::ToInteger(nsresult *aErrorCode, uint32_t aRadix) const { NS_ConvertUTF16toUTF8 narrow(*this); const char *fmt; switch (aRadix) { case 10: fmt = "%i"; break; case 16: fmt = "%x"; break; default: NS_ERROR("Unrecognized radix!"); *aErrorCode = NS_ERROR_INVALID_ARG; return 0; } int32_t result = 0; if (PR_sscanf(narrow.get(), fmt, &result) == 1) *aErrorCode = NS_OK; else *aErrorCode = NS_ERROR_FAILURE; return result; }
int64_t nsACString::ToInteger64(nsresult *aErrorCode, uint32_t aRadix) const { const char *fmt; switch (aRadix) { case 10: fmt = "%lli"; break; case 16: fmt = "%llx"; break; default: NS_ERROR("Unrecognized radix!"); *aErrorCode = NS_ERROR_INVALID_ARG; return 0; } int64_t result = 0; if (PR_sscanf(nsCString(*this).get(), fmt, &result) == 1) *aErrorCode = NS_OK; else *aErrorCode = NS_ERROR_FAILURE; return result; }
/** * Reads one table of results from the response. Leaves begin pointing at the * next table. */ nsresult nsUrlClassifierHashCompleterRequest::HandleTable(nsACString::const_iterator& begin, const nsACString::const_iterator& end) { nsACString::const_iterator iter; iter = begin; if (!FindCharInReadable(':', iter, end)) { // No table line. NS_WARNING("Received badly-formatted gethash response."); return NS_ERROR_FAILURE; } const nsCSubstring& tableName = Substring(begin, iter); iter++; begin = iter; if (!FindCharInReadable('\n', iter, end)) { // Unterminated header line. NS_WARNING("Received badly-formatted gethash response."); return NS_ERROR_FAILURE; } const nsCSubstring& remaining = Substring(begin, iter); iter++; begin = iter; PRUint32 chunkId; PRInt32 size; if (PR_sscanf(PromiseFlatCString(remaining).get(), "%u:%d", &chunkId, &size) != 2) { NS_WARNING("Received badly-formatted gethash response."); return NS_ERROR_FAILURE; } if (size % COMPLETE_LENGTH != 0) { NS_WARNING("Unexpected gethash response length"); return NS_ERROR_FAILURE; } // begin now refers to the hash data. if (begin.size_forward() < size) { NS_WARNING("Response does not match the expected response length."); return NS_ERROR_FAILURE; } for (PRInt32 i = 0; i < (size / COMPLETE_LENGTH); i++) { // Read the complete hash. iter.advance(COMPLETE_LENGTH); nsresult rv = HandleItem(Substring(begin, iter), tableName, chunkId); NS_ENSURE_SUCCESS(rv, rv); begin = iter; } // begin now points at the end of the hash data. return NS_OK; }
static PRUint32 ParseVersion(const char *versionStr) { PRUint16 major, minor; if (PR_sscanf(versionStr, "%hu.%hu", &major, &minor) != 2) { NS_WARNING("invalid version string"); return 0; } return PRUint32(major) << 16 | PRUint32(minor); }
nsresult mozSqlResultODBC::BuildRows() { while (SQL_SUCCEEDED(SQLFetch(mResult))) { nsCOMPtr<nsIRDFResource> resource; nsresult rv = gRDFService->GetAnonymousResource(getter_AddRefs(resource)); if (NS_FAILED(rv)) return rv; Row* row = Row::Create(mAllocator, resource, mColumnInfo); for (PRInt32 j = 0; j < mColumnInfo.Count(); j++) { SQLINTEGER indicator; SQLCHAR buf[512]; if(SQL_SUCCEEDED(SQLGetData(mResult, j+1, SQL_C_TCHAR, buf, sizeof(buf), &indicator)) && indicator != SQL_NULL_DATA) { char* value = (char*)buf; Cell* cell = row->mCells[j]; cell->SetNull(PR_FALSE); PRInt32 type = cell->GetType(); if (type == mozISqlResult::TYPE_STRING) cell->SetString(ToNewUnicode(nsDependentCString(value))); else if (type == mozISqlResult::TYPE_INT) PR_sscanf(value, "%d", &cell->mInt); else if (type == mozISqlResult::TYPE_FLOAT) PR_sscanf(value, "%f", &cell->mFloat); else if (type == mozISqlResult::TYPE_DECIMAL) PR_sscanf(value, "%f", &cell->mFloat); else if (type == mozISqlResult::TYPE_DATE || type == mozISqlResult::TYPE_TIME || type == mozISqlResult::TYPE_DATETIME) PR_ParseTimeString(value, PR_FALSE, &cell->mDate); else if (type == mozISqlResult::TYPE_BOOL) cell->mBool = !strcmp(value, "t"); } } mRows.AppendElement(row); nsVoidKey key(resource); mSources.Put(&key, row); } return NS_OK; }
NS_IMETHODIMP nsInstallVersion::Init(const nsString& version) { mMajor = mMinor = mRelease = mBuild = 0; // nsString is a flat string if (PR_sscanf(NS_ConvertUTF16toUTF8(version).get(),"%d.%d.%d.%d",&mMajor,&mMinor,&mRelease,&mBuild) < 1) return NS_ERROR_UNEXPECTED; return NS_OK; }
void nsUrlClassifierUtils::CanonicalNum(const nsACString& num, uint32_t bytes, bool allowOctal, nsACString& _retval) { _retval.Truncate(); if (num.Length() < 1) { return; } uint32_t val; if (allowOctal && IsOctal(num)) { if (PR_sscanf(PromiseFlatCString(num).get(), "%o", &val) != 1) { return; } } else if (IsDecimal(num)) { if (PR_sscanf(PromiseFlatCString(num).get(), "%u", &val) != 1) { return; } } else if (IsHex(num)) { if (PR_sscanf(PromiseFlatCString(num).get(), num[1] == 'X' ? "0X%x" : "0x%x", &val) != 1) { return; } } else { return; } while (bytes--) { char buf[20]; PR_snprintf(buf, sizeof(buf), "%u", val & 0xff); if (_retval.IsEmpty()) { _retval.Assign(buf); } else { _retval = nsDependentCString(buf) + NS_LITERAL_CSTRING(".") + _retval; } val >>= 8; } }
nsresult mozSqlResultMysql::BuildRows() { MYSQL_ROW resultrow; while ((resultrow = mysql_fetch_row(mResult))){ nsCOMPtr<nsIRDFResource> resource; nsresult rv = gRDFService->GetAnonymousResource(getter_AddRefs(resource)); if (NS_FAILED(rv)) return rv; Row* row = Row::Create(mAllocator, resource, mColumnInfo); for (PRInt32 j = 0; j < mColumnInfo.Count(); j++) { char* value = resultrow[j]; if (value){ Cell* cell = row->mCells[j]; cell->SetNull(PR_FALSE); PRInt32 type = cell->GetType(); if (type == mozISqlResult::TYPE_STRING) cell->SetString(UTF8ToNewUnicode(nsDependentCString(value))); else if (type == mozISqlResult::TYPE_INT) PR_sscanf(value, "%d", &cell->mInt); else if (type == mozISqlResult::TYPE_FLOAT) PR_sscanf(value, "%f", &cell->mFloat); else if (type == mozISqlResult::TYPE_DECIMAL) PR_sscanf(value, "%f", &cell->mFloat); else if (type == mozISqlResult::TYPE_DATE || type == mozISqlResult::TYPE_TIME || type == mozISqlResult::TYPE_DATETIME) PR_ParseTimeString(value, PR_FALSE, &cell->mDate); else if (type == mozISqlResult::TYPE_BOOL) cell->mBool = !strcmp(value, "t"); } } mRows.AppendElement(row); nsVoidKey key(resource); mSources.Put(&key, row); } return NS_OK; }
nsresult SdpHelper::GetComponent(const std::string& candidate, size_t* component) { unsigned int temp; int32_t result = PR_sscanf(candidate.c_str(), "%*s %u", &temp); if (result == 1) { *component = temp; return NS_OK; } SDP_SET_ERROR("Malformed ICE candidate: " << candidate); return NS_ERROR_INVALID_ARG; }
/* static */ bool LookupCache::IsCanonicalizedIP(const nsACString& aHost) { // The canonicalization process will have left IP addresses in dotted // decimal with no surprises. uint32_t i1, i2, i3, i4; char c; if (PR_sscanf(PromiseFlatCString(aHost).get(), "%u.%u.%u.%u%c", &i1, &i2, &i3, &i4, &c) == 4) { return (i1 <= 0xFF && i2 <= 0xFF && i3 <= 0xFF && i4 <= 0xFF); } return false; }
char * get_post_assertion_data(Session *sn, Request *rq, char *url) { int i = 0; char *body = NULL; int cl = 0; char *cl_str = NULL; /** * content length and body * * note: memory allocated in here should be released by * other function such as: "policy_unregister_post" */ request_header("content-length", &cl_str, sn, rq); if(cl_str == NULL) cl_str = pblock_findval("content-length", rq->headers); if(cl_str == NULL) return body; if(PR_sscanf(cl_str, "%ld", &cl) == 1) { body = (char *)malloc(cl + 1); if(body != NULL){ for (i = 0; i < cl; i++) { int ch = netbuf_getc(sn->inbuf); if (ch==IO_ERROR || ch == IO_EOF) { break; } body[i] = ch; } body[i] = '\0'; } } else { am_web_log_error("Error reading POST content body"); } am_web_log_max_debug("Read POST content body : %s", body); /** * need to reset content length before redirect, * otherwise, web server will wait for serveral minutes * for non existant data */ param_free(pblock_remove("content-length", rq->headers)); pblock_nvinsert("content-length", "0", rq->headers); return body; }
PRStatus TimelineInit(void) { char *timeStr; char *fileName; PRInt32 secs, msecs; PRFileDesc *fd; PRInt64 tmp1, tmp2; PRStatus status = PR_NewThreadPrivateIndex( &gTLSIndex, ThreadDestruct ); NS_WARN_IF_FALSE(status==0, "TimelineService could not allocate TLS storage."); timeStr = PR_GetEnv("NS_TIMELINE_INIT_TIME"); #ifdef XP_MAC initInterval = PR_IntervalNow(); #endif // NS_TIMELINE_INIT_TIME only makes sense for the main thread, so if it // exists, set it there. If not, let normal thread management code take // care of setting the init time. if (timeStr != NULL && 2 == PR_sscanf(timeStr, "%d.%d", &secs, &msecs)) { PRTime &initTime = GetThisThreadData()->initTime; LL_MUL(tmp1, (PRInt64)secs, 1000000); LL_MUL(tmp2, (PRInt64)msecs, 1000); LL_ADD(initTime, tmp1, tmp2); #ifdef XP_MAC initInterval -= PR_MicrosecondsToInterval( (PRUint32)(PR_Now() - initTime)); #endif } // Get the log file. #ifdef XP_MAC fileName = "timeline.txt"; #else fileName = PR_GetEnv("NS_TIMELINE_LOG_FILE"); #endif if (fileName != NULL && (fd = PR_Open(fileName, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE, 0666)) != NULL) { timelineFD = fd; PR_fprintf(fd, "NOTE: due to asynchrony, the indentation that you see does" " not necessarily correspond to nesting in the code.\n\n"); } // Runtime disable of timeline if (PR_GetEnv("NS_TIMELINE_ENABLE")) gTimelineDisabled = PR_FALSE; return PR_SUCCESS; }
NSS_IMPLEMENT CK_VERSION nss_dbm_db_get_format_version ( nss_dbm_db_t *db ) { CK_VERSION rv; DBT k, v; int dbrv; char buffer[64]; rv.major = rv.minor = 0; k.data = PREFIX_METADATA "FormatVersion"; k.size = nssUTF8_Size((NSSUTF8 *)k.data, (PRStatus *)NULL); (void)memset(&v, 0, sizeof(v)); /* Locked region */ { if( CKR_OK != NSSCKFWMutex_Lock(db->crustylock) ) { return rv; } dbrv = db->db->get(db->db, &k, &v, 0); if( dbrv == 0 ) { CK_ULONG major = 0, minor = 0; (void)PR_sscanf(v.data, "%ld.%ld", &major, &minor); rv.major = major; rv.minor = minor; } else if( dbrv > 0 ) { (void)PR_snprintf(buffer, sizeof(buffer), "%ld.%ld", nss_dbm_db_format_version.major, nss_dbm_db_format_version.minor); v.data = buffer; v.size = nssUTF8_Size((NSSUTF8 *)v.data, (PRStatus *)NULL); dbrv = db->db->put(db->db, &k, &v, 0); (void)db->db->sync(db->db, 0); rv = nss_dbm_db_format_version; } else { /* No error return.. */ ; } (void)NSSCKFWMutex_Unlock(db->crustylock); } return rv; }
// Decode Q encoding (RFC 2047). // static char *DecodeQ(const char *in, PRUint32 length) { char *out, *dest = 0; out = dest = (char *)PR_Calloc(length + 1, sizeof(char)); if (dest == nsnull) return nsnull; while (length > 0) { PRUintn c = 0; switch (*in) { case '=': // check if |in| in the form of '=hh' where h is [0-9a-fA-F]. if (length < 3 || !ISHEXCHAR(in[1]) || !ISHEXCHAR(in[2])) goto badsyntax; PR_sscanf(in + 1, "%2X", &c); *out++ = (char) c; in += 3; length -= 3; break; case '_': *out++ = ' '; in++; length--; break; default: if (*in & 0x80) goto badsyntax; *out++ = *in++; length--; } } *out++ = '\0'; for (out = dest; *out ; ++out) { if (*out == '\t') *out = ' '; } return dest; badsyntax: PR_Free(dest); return nsnull; }
NS_IMETHODIMP sbDatetimePropertyInfo::Validate(const nsAString & aValue, bool *_retval) { NS_ENSURE_ARG_POINTER(_retval); PRInt64 value = 0; NS_ConvertUTF16toUTF8 narrow(aValue); *_retval = PR_TRUE; if(PR_sscanf(narrow.get(), gsFmtRadix10, &value) != 1) { *_retval = PR_FALSE; return NS_OK; } sbSimpleAutoLock lock(mMinMaxDateTimeLock); if(value < mMinDateTime || value > mMaxDateTime) { *_retval = PR_FALSE; } return NS_OK; }
void nsIOService::ParsePortList(nsIPrefBranch *prefBranch, const char *pref, bool remove) { nsXPIDLCString portList; // Get a pref string and chop it up into a list of ports. prefBranch->GetCharPref(pref, getter_Copies(portList)); if (portList) { nsTArray<nsCString> portListArray; ParseString(portList, ',', portListArray); uint32_t index; for (index=0; index < portListArray.Length(); index++) { portListArray[index].StripWhitespace(); int32_t portBegin, portEnd; if (PR_sscanf(portListArray[index].get(), "%d-%d", &portBegin, &portEnd) == 2) { if ((portBegin < 65536) && (portEnd < 65536)) { int32_t curPort; if (remove) { for (curPort=portBegin; curPort <= portEnd; curPort++) mRestrictedPortList.RemoveElement(curPort); } else { for (curPort=portBegin; curPort <= portEnd; curPort++) mRestrictedPortList.AppendElement(curPort); } } } else { nsresult aErrorCode; int32_t port = portListArray[index].ToInteger(&aErrorCode); if (NS_SUCCEEDED(aErrorCode) && port < 65536) { if (remove) mRestrictedPortList.RemoveElement(port); else mRestrictedPortList.AppendElement(port); } } } } }
extern PRFileMap * _md_ImportFileMapFromString( const char *fmstring ) { PRStatus rc; PRInt32 osfd; PRIntn prot; /* really: a PRFileMapProtect */ PRFileDesc *fd; PRFileMap *fm = NULL; /* default return value */ PRFileInfo64 info; PR_sscanf( fmstring, "%ld:%d", &osfd, &prot ); /* import the os file descriptor */ fd = PR_ImportFile( osfd ); if ( NULL == fd ) { PR_LOG( _pr_shma_lm, PR_LOG_DEBUG, ("_md_ImportFileMapFromString(): PR_ImportFile() failed")); goto Finished; } rc = PR_GetOpenFileInfo64( fd, &info ); if ( PR_FAILURE == rc ) { PR_LOG( _pr_shma_lm, PR_LOG_DEBUG, ("_md_ImportFileMapFromString(): PR_GetOpenFileInfo64() failed")); goto Finished; } fm = PR_CreateFileMap( fd, info.size, (PRFileMapProtect)prot ); if ( NULL == fm ) { PR_LOG( _pr_shma_lm, PR_LOG_DEBUG, ("_md_ImportFileMapFromString(): PR_CreateFileMap() failed")); } Finished: return(fm); } /* end _md_ImportFileMapFromString() */
nsresult sbDeviceStatistics::UpdateForItem(sbIMediaItem* aMediaItem, PRBool aItemAdded) { // Validate arguments. NS_ENSURE_ARG_POINTER(aMediaItem); // Function variables. nsresult rv; // Ignore media lists. nsCOMPtr<sbIMediaList> mediaList = do_QueryInterface(aMediaItem, &rv); if (NS_SUCCEEDED(rv)) return NS_OK; // Get the item content type. PRUint32 contentType; rv = mBaseDevice->GetItemContentType(aMediaItem, &contentType); if (NS_FAILED(rv)) { contentType = sbIDeviceCapabilities::CONTENT_UNKNOWN; } // Get the item count update value. PRInt32 itemCountUpdate; if (aItemAdded) itemCountUpdate = 1; else itemCountUpdate = -1; // Get the item used update value. PRInt64 itemUsedUpdate; rv = aMediaItem->GetContentLength(&itemUsedUpdate); NS_ENSURE_SUCCESS(rv, rv); if (!aItemAdded) itemUsedUpdate = -itemUsedUpdate; // Get the item play time update value. PRInt64 itemPlayTimeUpdate = 0; nsAutoString duration; rv = aMediaItem->GetProperty(NS_LITERAL_STRING(SB_PROPERTY_DURATION), duration); if (NS_SUCCEEDED(rv)) { if (PR_sscanf(NS_ConvertUTF16toUTF8(duration).get(), "%lld", &itemPlayTimeUpdate) == 0) { itemPlayTimeUpdate = 0; } } if (!aItemAdded) itemPlayTimeUpdate = -itemPlayTimeUpdate; // Update appropriate statistics depending upon the content type. // Statistics for other content types will be collected together elsewhere // in the total other statistics. if (contentType == sbIDeviceCapabilities::CONTENT_AUDIO) { AddAudioCount(itemCountUpdate); AddAudioUsed(itemUsedUpdate); AddAudioPlayTime(itemPlayTimeUpdate); } else if (contentType == sbIDeviceCapabilities::CONTENT_VIDEO) { AddVideoCount(itemCountUpdate); AddVideoUsed(itemUsedUpdate); AddVideoPlayTime(itemPlayTimeUpdate); } return NS_OK; }
NS_IMETHODIMP nsXULTemplateQueryProcessorStorage::CompileQuery(nsIXULTemplateBuilder* aBuilder, nsIDOMNode* aQueryNode, nsIAtom* aRefVariable, nsIAtom* aMemberVariable, nsISupports** aReturn) { nsCOMPtr<nsIDOMNodeList> childNodes; aQueryNode->GetChildNodes(getter_AddRefs(childNodes)); PRUint32 length; childNodes->GetLength(&length); nsCOMPtr<mozIStorageStatement> statement; nsCOMPtr<nsIContent> queryContent = do_QueryInterface(aQueryNode); nsAutoString sqlQuery; // Let's get all text nodes (which should be the query) nsContentUtils::GetNodeTextContent(queryContent, PR_FALSE, sqlQuery); nsresult rv = mStorageConnection->CreateStatement(NS_ConvertUTF16toUTF8(sqlQuery), getter_AddRefs(statement)); NS_ENSURE_SUCCESS(rv, rv); PRUint32 parameterCount = 0; PRUint32 count = queryContent->GetChildCount(); for (PRUint32 i = 0; i < count; ++i) { nsIContent *child = queryContent->GetChildAt(i); if (child->NodeInfo()->Equals(nsGkAtoms::param, kNameSpaceID_XUL)) { nsAutoString value; nsContentUtils::GetNodeTextContent(child, PR_FALSE, value); PRUint32 index = parameterCount; nsAutoString name, indexValue; if (child->GetAttr(kNameSpaceID_None, nsGkAtoms::name, name)) { rv = statement->GetParameterIndex(NS_ConvertUTF16toUTF8(name), &index); NS_ENSURE_SUCCESS(rv, rv); parameterCount++; } else if (child->GetAttr(kNameSpaceID_None, nsGkAtoms::index, indexValue)) { PR_sscanf(NS_ConvertUTF16toUTF8(indexValue).get(),"%d",&index); if (index > 0) index--; } else { parameterCount++; } static nsIContent::AttrValuesArray sTypeValues[] = { &nsGkAtoms::int32, &nsGkAtoms::integer, &nsGkAtoms::int64, &nsGkAtoms::null, &nsGkAtoms::double_, &nsGkAtoms::string, nsnull }; PRInt32 typeError, typeValue = child->FindAttrValueIn(kNameSpaceID_None, nsGkAtoms::type, sTypeValues, eCaseMatters); rv = NS_ERROR_ILLEGAL_VALUE; PRInt32 valInt32 = 0; PRInt64 valInt64 = 0; PRFloat64 valFloat = 0; switch (typeValue) { case 0: case 1: typeError = PR_sscanf(NS_ConvertUTF16toUTF8(value).get(),"%d",&valInt32); if (typeError > 0) rv = statement->BindInt32Parameter(index, valInt32); break; case 2: typeError = PR_sscanf(NS_ConvertUTF16toUTF8(value).get(),"%lld",&valInt64); if (typeError > 0) rv = statement->BindInt64Parameter(index, valInt64); break; case 3: rv = statement->BindNullParameter(index); break; case 4: typeError = PR_sscanf(NS_ConvertUTF16toUTF8(value).get(),"%lf",&valFloat); if (typeError > 0) rv = statement->BindDoubleParameter(index, valFloat); break; case 5: case nsIContent::ATTR_MISSING: rv = statement->BindStringParameter(index, value); break; } NS_ENSURE_SUCCESS(rv, rv); } } *aReturn = statement; NS_IF_ADDREF(*aReturn); return NS_OK; }
nsresult nsSiteSecurityService::ProcessHeaderMutating(uint32_t aType, nsIURI* aSourceURI, char* aHeader, uint32_t aFlags, uint64_t *aMaxAge, bool *aIncludeSubdomains) { SSSLOG(("SSS: processing header '%s'", aHeader)); // "Strict-Transport-Security" ":" OWS // STS-d *( OWS ";" OWS STS-d OWS) // // ; STS directive // STS-d = maxAge / includeSubDomains // // maxAge = "max-age" "=" delta-seconds v-ext // // includeSubDomains = [ "includeSubDomains" ] // // The order of the directives is not significant. // All directives must appear only once. // Directive names are case-insensitive. // The entire header is invalid if a directive not conforming to the // syntax is encountered. // Unrecognized directives (that are otherwise syntactically valid) are // ignored, and the rest of the header is parsed as normal. bool foundMaxAge = false; bool foundIncludeSubdomains = false; bool foundUnrecognizedDirective = false; int64_t maxAge = 0; NS_NAMED_LITERAL_CSTRING(max_age_var, "max-age"); NS_NAMED_LITERAL_CSTRING(include_subd_var, "includesubdomains"); nsSecurityHeaderParser parser(aHeader); nsresult rv = parser.Parse(); if (NS_FAILED(rv)) { SSSLOG(("SSS: could not parse header")); return rv; } mozilla::LinkedList<nsSecurityHeaderDirective> *directives = parser.GetDirectives(); for (nsSecurityHeaderDirective *directive = directives->getFirst(); directive != nullptr; directive = directive->getNext()) { if (directive->mName.Length() == max_age_var.Length() && directive->mName.EqualsIgnoreCase(max_age_var.get(), max_age_var.Length())) { if (foundMaxAge) { SSSLOG(("SSS: found two max-age directives")); return NS_ERROR_FAILURE; } SSSLOG(("SSS: found max-age directive")); foundMaxAge = true; size_t len = directive->mValue.Length(); for (size_t i = 0; i < len; i++) { char chr = directive->mValue.CharAt(i); if (chr < '0' || chr > '9') { SSSLOG(("SSS: invalid value for max-age directive")); return NS_ERROR_FAILURE; } } if (PR_sscanf(directive->mValue.get(), "%lld", &maxAge) != 1) { SSSLOG(("SSS: could not parse delta-seconds")); return NS_ERROR_FAILURE; } SSSLOG(("SSS: parsed delta-seconds: %lld", maxAge)); } else if (directive->mName.Length() == include_subd_var.Length() && directive->mName.EqualsIgnoreCase(include_subd_var.get(), include_subd_var.Length())) { if (foundIncludeSubdomains) { SSSLOG(("SSS: found two includeSubdomains directives")); return NS_ERROR_FAILURE; } SSSLOG(("SSS: found includeSubdomains directive")); foundIncludeSubdomains = true; if (directive->mValue.Length() != 0) { SSSLOG(("SSS: includeSubdomains directive unexpectedly had value '%s'", directive->mValue.get())); return NS_ERROR_FAILURE; } } else { SSSLOG(("SSS: ignoring unrecognized directive '%s'", directive->mName.get())); foundUnrecognizedDirective = true; } } // after processing all the directives, make sure we came across max-age // somewhere. if (!foundMaxAge) { SSSLOG(("SSS: did not encounter required max-age directive")); return NS_ERROR_FAILURE; } // record the successfully parsed header data. SetState(aType, aSourceURI, maxAge, foundIncludeSubdomains, aFlags); if (aMaxAge != nullptr) { *aMaxAge = (uint64_t)maxAge; } if (aIncludeSubdomains != nullptr) { *aIncludeSubdomains = foundIncludeSubdomains; } return foundUnrecognizedDirective ? NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA : NS_OK; }
NS_IMETHODIMP nsXULTemplateQueryProcessorStorage::CompileQuery(nsIXULTemplateBuilder* aBuilder, nsIDOMNode* aQueryNode, nsIAtom* aRefVariable, nsIAtom* aMemberVariable, nsISupports** aReturn) { nsCOMPtr<nsIDOMNodeList> childNodes; aQueryNode->GetChildNodes(getter_AddRefs(childNodes)); uint32_t length; childNodes->GetLength(&length); nsCOMPtr<mozIStorageStatement> statement; nsCOMPtr<nsIContent> queryContent = do_QueryInterface(aQueryNode); nsAutoString sqlQuery; // Let's get all text nodes (which should be the query) nsContentUtils::GetNodeTextContent(queryContent, false, sqlQuery); nsresult rv = mStorageConnection->CreateStatement(NS_ConvertUTF16toUTF8(sqlQuery), getter_AddRefs(statement)); if (NS_FAILED(rv)) { nsXULContentUtils::LogTemplateError(ERROR_TEMPLATE_STORAGE_BAD_QUERY); return rv; } uint32_t parameterCount = 0; for (nsIContent* child = queryContent->GetFirstChild(); child; child = child->GetNextSibling()) { if (child->NodeInfo()->Equals(nsGkAtoms::param, kNameSpaceID_XUL)) { nsAutoString value; nsContentUtils::GetNodeTextContent(child, false, value); uint32_t index = parameterCount; nsAutoString name, indexValue; if (child->GetAttr(kNameSpaceID_None, nsGkAtoms::name, name)) { rv = statement->GetParameterIndex(NS_ConvertUTF16toUTF8(name), &index); if (NS_FAILED(rv)) { nsXULContentUtils::LogTemplateError(ERROR_TEMPLATE_STORAGE_UNKNOWN_QUERY_PARAMETER); return rv; } parameterCount++; } else if (child->GetAttr(kNameSpaceID_None, nsGkAtoms::index, indexValue)) { PR_sscanf(NS_ConvertUTF16toUTF8(indexValue).get(),"%d",&index); if (index > 0) index--; } else { parameterCount++; } static nsIContent::AttrValuesArray sTypeValues[] = { &nsGkAtoms::int32, &nsGkAtoms::integer, &nsGkAtoms::int64, &nsGkAtoms::null, &nsGkAtoms::double_, &nsGkAtoms::string, nullptr }; int32_t typeError = 1; int32_t typeValue = child->FindAttrValueIn(kNameSpaceID_None, nsGkAtoms::type, sTypeValues, eCaseMatters); rv = NS_ERROR_ILLEGAL_VALUE; int32_t valInt32 = 0; int64_t valInt64 = 0; double valFloat = 0; switch (typeValue) { case 0: case 1: typeError = PR_sscanf(NS_ConvertUTF16toUTF8(value).get(),"%d",&valInt32); if (typeError > 0) rv = statement->BindInt32ByIndex(index, valInt32); break; case 2: typeError = PR_sscanf(NS_ConvertUTF16toUTF8(value).get(),"%lld",&valInt64); if (typeError > 0) rv = statement->BindInt64ByIndex(index, valInt64); break; case 3: rv = statement->BindNullByIndex(index); break; case 4: typeError = PR_sscanf(NS_ConvertUTF16toUTF8(value).get(),"%lf",&valFloat); if (typeError > 0) rv = statement->BindDoubleByIndex(index, valFloat); break; case 5: case nsIContent::ATTR_MISSING: rv = statement->BindStringByIndex(index, value); break; default: typeError = 0; } if (typeError <= 0) { nsXULContentUtils::LogTemplateError(ERROR_TEMPLATE_STORAGE_WRONG_TYPE_QUERY_PARAMETER); return rv; } if (NS_FAILED(rv)) { nsXULContentUtils::LogTemplateError(ERROR_TEMPLATE_STORAGE_QUERY_PARAMETER_NOT_BOUND); return rv; } } } *aReturn = statement; NS_IF_ADDREF(*aReturn); return NS_OK; }
NS_IMETHODIMP nsJPEGEncoder::InitFromData(const PRUint8* aData, PRUint32 aLength, // (unused, req'd by JS) PRUint32 aWidth, PRUint32 aHeight, PRUint32 aStride, PRUint32 aInputFormat, const nsAString& aOutputOptions) { // validate input format if (aInputFormat != INPUT_FORMAT_RGB && aInputFormat != INPUT_FORMAT_RGBA && aInputFormat != INPUT_FORMAT_HOSTARGB) return NS_ERROR_INVALID_ARG; // Stride is the padded width of each row, so it better be longer (I'm afraid // people will not understand what stride means, so check it well) if ((aInputFormat == INPUT_FORMAT_RGB && aStride < aWidth * 3) || ((aInputFormat == INPUT_FORMAT_RGBA || aInputFormat == INPUT_FORMAT_HOSTARGB) && aStride < aWidth * 4)) { NS_WARNING("Invalid stride for InitFromData"); return NS_ERROR_INVALID_ARG; } // can't initialize more than once if (mImageBuffer != nsnull) return NS_ERROR_ALREADY_INITIALIZED; // options: we only have one option so this is easy int quality = 50; if (aOutputOptions.Length() > 0) { // have options string const nsString qualityPrefix(NS_LITERAL_STRING("quality=")); if (aOutputOptions.Length() > qualityPrefix.Length() && StringBeginsWith(aOutputOptions, qualityPrefix)) { // have quality string nsCString value = NS_ConvertUTF16toUTF8(Substring(aOutputOptions, qualityPrefix.Length())); int newquality = -1; if (PR_sscanf(PromiseFlatCString(value).get(), "%d", &newquality) == 1) { if (newquality >= 0 && newquality <= 100) { quality = newquality; } else { NS_WARNING("Quality value out of range, should be 0-100, using default"); } } else { NS_WARNING("Quality value invalid, should be integer 0-100, using default"); } } } jpeg_compress_struct cinfo; // We set up the normal JPEG error routines, then override error_exit. // This must be done before the call to create_compress encoder_error_mgr errmgr; cinfo.err = jpeg_std_error(&errmgr.pub); errmgr.pub.error_exit = errorExit; // Establish the setjmp return context for my_error_exit to use. if (setjmp(errmgr.setjmp_buffer)) { // If we get here, the JPEG code has signaled an error. // We need to clean up the JPEG object, close the input file, and return. return NS_ERROR_FAILURE; } jpeg_create_compress(&cinfo); cinfo.image_width = aWidth; cinfo.image_height = aHeight; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; cinfo.data_precision = 8; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, 1); // quality here is 0-100 // set up the destination manager jpeg_destination_mgr destmgr; destmgr.init_destination = initDestination; destmgr.empty_output_buffer = emptyOutputBuffer; destmgr.term_destination = termDestination; cinfo.dest = &destmgr; cinfo.client_data = this; jpeg_start_compress(&cinfo, 1); // feed it the rows if (aInputFormat == INPUT_FORMAT_RGB) { while (cinfo.next_scanline < cinfo.image_height) { const PRUint8* row = &aData[cinfo.next_scanline * aStride]; jpeg_write_scanlines(&cinfo, NS_CONST_CAST(PRUint8**, &row), 1); } } else if (aInputFormat == INPUT_FORMAT_RGBA) {
NS_IMETHODIMP sbDatetimePropertyInfo::Format(const nsAString & aValue, nsAString & _retval) { PRInt32 timeType = 0; PRInt64 value = 0; NS_ConvertUTF16toUTF8 narrow(aValue); nsresult rv = GetTimeType(&timeType); NS_ENSURE_SUCCESS(rv, rv); if(PR_sscanf(narrow.get(), gsFmtRadix10, &value) != 1) { return NS_ERROR_INVALID_ARG; } { sbSimpleAutoLock lock(mMinMaxDateTimeLock); if(value < mMinDateTime || value > mMaxDateTime) { return NS_ERROR_INVALID_ARG; } } if(timeType != sbIDatetimePropertyInfo::TIMETYPE_TIMESTAMP) { nsAutoString out; sbSimpleAutoLock lockLocale(mAppLocaleLock); if(!mAppLocale) { nsCOMPtr<nsILocaleService> localeService = do_GetService("@mozilla.org/intl/nslocaleservice;1", &rv); NS_ENSURE_SUCCESS(rv, rv); rv = localeService->GetApplicationLocale(getter_AddRefs(mAppLocale)); NS_ENSURE_SUCCESS(rv, rv); } sbSimpleAutoLock lockFormatter(mDateTimeFormatLock); if(!mDateTimeFormat) { mDateTimeFormat = do_CreateInstance(NS_DATETIMEFORMAT_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); } switch(mTimeType) { case sbIDatetimePropertyInfo::TIMETYPE_TIME: { PRExplodedTime explodedTime = {0}; PR_ExplodeTime((PRTime) (value * PR_USEC_PER_MSEC), PR_LocalTimeParameters, &explodedTime); rv = mDateTimeFormat->FormatPRExplodedTime(mAppLocale, kDateFormatNone, kTimeFormatSeconds, &explodedTime, out); } break; case sbIDatetimePropertyInfo::TIMETYPE_DATE: { PRExplodedTime explodedTime = {0}; PR_ExplodeTime((PRTime) (value * PR_USEC_PER_MSEC), PR_LocalTimeParameters, &explodedTime); rv = mDateTimeFormat->FormatPRExplodedTime(mAppLocale, kDateFormatLong, kTimeFormatNone, &explodedTime, out); } break; case sbIDatetimePropertyInfo::TIMETYPE_DATETIME: { PRExplodedTime explodedTime = {0}; PR_ExplodeTime((PRTime) (value * PR_USEC_PER_MSEC), PR_LocalTimeParameters, &explodedTime); rv = mDateTimeFormat->FormatPRExplodedTime(mAppLocale, kDateFormatShort, kTimeFormatNoSeconds, &explodedTime, out); } break; } NS_ENSURE_SUCCESS(rv, rv); _retval = out; } else { _retval = aValue; CompressWhitespace(_retval); } return NS_OK; }
nsresult nsDirIndexParser::ParseData(nsIDirIndex *aIdx, char* aDataStr) { // Parse a "201" data line, using the field ordering specified in // mFormat. if (!mFormat) { // Ignore if we haven't seen a format yet. return NS_OK; } nsresult rv = NS_OK; nsCAutoString filename; for (PRInt32 i = 0; mFormat[i] != -1; ++i) { // If we've exhausted the data before we run out of fields, just // bail. if (! *aDataStr) break; while (*aDataStr && nsCRT::IsAsciiSpace(*aDataStr)) ++aDataStr; char *value = aDataStr; if (*aDataStr == '"' || *aDataStr == '\'') { // it's a quoted string. snarf everything up to the next quote character const char quotechar = *(aDataStr++); ++value; while (*aDataStr && *aDataStr != quotechar) ++aDataStr; *aDataStr++ = '\0'; if (! aDataStr) { NS_WARNING("quoted value not terminated"); } } else { // it's unquoted. snarf until we see whitespace. value = aDataStr; while (*aDataStr && (!nsCRT::IsAsciiSpace(*aDataStr))) ++aDataStr; *aDataStr++ = '\0'; } fieldType t = fieldType(mFormat[i]); switch (t) { case FIELD_FILENAME: { // don't unescape at this point, so that UnEscapeAndConvert() can filename = value; PRBool success = PR_FALSE; nsAutoString entryuri; if (gTextToSubURI) { PRUnichar *result = nsnull; if (NS_SUCCEEDED(rv = gTextToSubURI->UnEscapeAndConvert(mEncoding.get(), filename.get(), &result)) && (result)) { if (*result) { aIdx->SetLocation(filename.get()); if (!mHasDescription) aIdx->SetDescription(result); success = PR_TRUE; } NS_Free(result); } else { NS_WARNING("UnEscapeAndConvert error"); } } if (!success) { // if unsuccessfully at charset conversion, then // just fallback to unescape'ing in-place // XXX - this shouldn't be using UTF8, should it? // when can we fail to get the service, anyway? - bbaetz aIdx->SetLocation(filename.get()); if (!mHasDescription) { aIdx->SetDescription(NS_ConvertUTF8toUTF16(value).get()); } } } break; case FIELD_DESCRIPTION: nsUnescape(value); aIdx->SetDescription(NS_ConvertUTF8toUTF16(value).get()); break; case FIELD_CONTENTLENGTH: { PRInt64 len; PRInt32 status = PR_sscanf(value, "%lld", &len); if (status == 1) aIdx->SetSize(len); else aIdx->SetSize(LL_MAXUINT); // LL_MAXUINT means unknown } break; case FIELD_LASTMODIFIED: { PRTime tm; nsUnescape(value); if (PR_ParseTimeString(value, PR_FALSE, &tm) == PR_SUCCESS) { aIdx->SetLastModified(tm); } } break; case FIELD_CONTENTTYPE: aIdx->SetContentType(value); break; case FIELD_FILETYPE: // unescape in-place nsUnescape(value); if (!nsCRT::strcasecmp(value, "directory")) { aIdx->SetType(nsIDirIndex::TYPE_DIRECTORY); } else if (!nsCRT::strcasecmp(value, "file")) { aIdx->SetType(nsIDirIndex::TYPE_FILE); } else if (!nsCRT::strcasecmp(value, "symbolic-link")) { aIdx->SetType(nsIDirIndex::TYPE_SYMLINK); } else { aIdx->SetType(nsIDirIndex::TYPE_UNKNOWN); } break; case FIELD_UNKNOWN: // ignore break; } } return NS_OK; }
nsresult nsStrictTransportSecurityService::ProcessStsHeaderMutating(nsIURI* aSourceURI, char* aHeader, uint64_t *aMaxAge, bool *aIncludeSubdomains) { STSLOG(("STS: ProcessStrictTransportHeader(%s)\n", aHeader)); // "Strict-Transport-Security" ":" OWS // STS-d *( OWS ";" OWS STS-d OWS) // // ; STS directive // STS-d = maxAge / includeSubDomains // // maxAge = "max-age" "=" delta-seconds v-ext // // includeSubDomains = [ "includeSubDomains" ] const char* directive; bool foundMaxAge = false; bool foundUnrecognizedTokens = false; bool includeSubdomains = false; int64_t maxAge = 0; NS_NAMED_LITERAL_CSTRING(max_age_var, "max-age"); NS_NAMED_LITERAL_CSTRING(include_subd_var, "includesubdomains"); while ((directive = NS_strtok(";", &aHeader))) { //skip leading whitespace directive = NS_strspnp(" \t", directive); STS_PARSER_FAIL_IF(!(*directive), ("error removing initial whitespace\n.")); if (!PL_strncasecmp(directive, max_age_var.get(), max_age_var.Length())) { // skip directive name directive += max_age_var.Length(); // skip leading whitespace directive = NS_strspnp(" \t", directive); STS_PARSER_FAIL_IF(*directive != '=', ("No equal sign found in max-age directive\n")); // skip over the equal sign STS_PARSER_FAIL_IF(*(++directive) == '\0', ("No delta-seconds present\n")); // obtain the delta-seconds value STS_PARSER_FAIL_IF(PR_sscanf(directive, "%lld", &maxAge) != 1, ("Could not convert delta-seconds\n")); STSLOG(("STS: ProcessStrictTransportHeader() STS found maxage %lld\n", maxAge)); foundMaxAge = true; // skip max-age value and trailing whitespace directive = NS_strspnp("0123456789 \t", directive); // log unknown tokens, but don't fail (for forwards compatibility) if (*directive != '\0') { foundUnrecognizedTokens = true; STSLOG(("Extra stuff in max-age after delta-seconds: %s \n", directive)); } } else if (!PL_strncasecmp(directive, include_subd_var.get(), include_subd_var.Length())) { directive += include_subd_var.Length(); // only record "includesubdomains" if it is a token by itself... for // example, don't set includeSubdomains = true if the directive is // "includesubdomainsFooBar". if (*directive == '\0' || *directive =='\t' || *directive == ' ') { includeSubdomains = true; STSLOG(("STS: ProcessStrictTransportHeader: obtained subdomains status\n")); // skip trailing whitespace directive = NS_strspnp(" \t", directive); if (*directive != '\0') { foundUnrecognizedTokens = true; STSLOG(("Extra stuff after includesubdomains: %s\n", directive)); } } else { foundUnrecognizedTokens = true; STSLOG(("Unrecognized directive in header: %s\n", directive)); } } else { // log unknown directives, but don't fail (for backwards compatibility) foundUnrecognizedTokens = true; STSLOG(("Unrecognized directive in header: %s\n", directive)); } } // after processing all the directives, make sure we came across max-age // somewhere. STS_PARSER_FAIL_IF(!foundMaxAge, ("Parse ERROR: couldn't locate max-age token\n")); // record the successfully parsed header data. SetStsState(aSourceURI, maxAge, includeSubdomains); if (aMaxAge != nullptr) { *aMaxAge = (uint64_t)maxAge; } if (aIncludeSubdomains != nullptr) { *aIncludeSubdomains = includeSubdomains; } return foundUnrecognizedTokens ? NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA : NS_OK; }
NS_IMETHODIMP nsIncrementalDownload::OnStartRequest(nsIRequest *request, nsISupports *context) { nsresult rv; nsCOMPtr<nsIHttpChannel> http = do_QueryInterface(request, &rv); if (NS_FAILED(rv)) return rv; // Ensure that we are receiving a 206 response. PRUint32 code; rv = http->GetResponseStatus(&code); if (NS_FAILED(rv)) return rv; if (code != 206) { // We may already have the entire file downloaded, in which case // our request for a range beyond the end of the file would have // been met with an error response code. if (code == 416 && mTotalSize == PRInt64(-1)) { mTotalSize = mCurrentSize; // Return an error code here to suppress OnDataAvailable. return NS_ERROR_DOWNLOAD_COMPLETE; } // The server may have decided to give us all of the data in one chunk. If // we requested a partial range, then we don't want to download all of the // data at once. So, we'll just try again, but if this keeps happening then // we'll eventually give up. if (code == 200) { if (mInterval) { mChannel = nsnull; if (++mNonPartialCount > MAX_RETRY_COUNT) { NS_WARNING("unable to fetch a byte range; giving up"); return NS_ERROR_FAILURE; } // Increase delay with each failure. StartTimer(mInterval * mNonPartialCount); return NS_ERROR_DOWNLOAD_NOT_PARTIAL; } // Since we have been asked to download the rest of the file, we can deal // with a 200 response. This may result in downloading the beginning of // the file again, but that can't really be helped. } else { NS_WARNING("server response was unexpected"); return NS_ERROR_UNEXPECTED; } } else { // We got a partial response, so clear this counter in case the next chunk // results in a 200 response. mNonPartialCount = 0; } // Do special processing after the first response. if (mTotalSize == PRInt64(-1)) { // Update knowledge of mFinalURI rv = http->GetURI(getter_AddRefs(mFinalURI)); if (NS_FAILED(rv)) return rv; if (code == 206) { // OK, read the Content-Range header to determine the total size of this // download file. nsCAutoString buf; rv = http->GetResponseHeader(NS_LITERAL_CSTRING("Content-Range"), buf); if (NS_FAILED(rv)) return rv; PRInt32 slash = buf.FindChar('/'); if (slash == kNotFound) { NS_WARNING("server returned invalid Content-Range header!"); return NS_ERROR_UNEXPECTED; } if (PR_sscanf(buf.get() + slash + 1, "%lld", (PRInt64 *) &mTotalSize) != 1) return NS_ERROR_UNEXPECTED; } else { // Use nsIPropertyBag2 to fetch the content length as it exposes the // value as a 64-bit number. nsCOMPtr<nsIPropertyBag2> props = do_QueryInterface(request, &rv); if (NS_FAILED(rv)) return rv; rv = props->GetPropertyAsInt64(NS_CHANNEL_PROP_CONTENT_LENGTH, &mTotalSize); // We need to know the total size of the thing we're trying to download. if (mTotalSize == PRInt64(-1)) { NS_WARNING("server returned no content-length header!"); return NS_ERROR_UNEXPECTED; } // Need to truncate (or create, if it doesn't exist) the file since we // are downloading the whole thing. WriteToFile(mDest, nsnull, 0, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE); mCurrentSize = 0; } // Notify observer that we are starting... rv = CallOnStartRequest(); if (NS_FAILED(rv)) return rv; } // Adjust mChunkSize accordingly if mCurrentSize is close to mTotalSize. PRInt64 diff = mTotalSize - mCurrentSize; if (diff <= PRInt64(0)) { NS_WARNING("about to set a bogus chunk size; giving up"); return NS_ERROR_UNEXPECTED; } if (diff < PRInt64(mChunkSize)) mChunkSize = PRUint32(diff); mChunk = new char[mChunkSize]; if (!mChunk) rv = NS_ERROR_OUT_OF_MEMORY; return rv; }
NS_IMETHODIMP nsIncrementalDownload::OnStartRequest(nsIRequest *request, nsISupports *context) { nsresult rv; nsCOMPtr<nsIHttpChannel> http = do_QueryInterface(request, &rv); if (NS_FAILED(rv)) return rv; // Ensure that we are receiving a 206 response. uint32_t code; rv = http->GetResponseStatus(&code); if (NS_FAILED(rv)) return rv; if (code != 206) { // We may already have the entire file downloaded, in which case // our request for a range beyond the end of the file would have // been met with an error response code. if (code == 416 && mTotalSize == int64_t(-1)) { mTotalSize = mCurrentSize; // Return an error code here to suppress OnDataAvailable. return NS_ERROR_DOWNLOAD_COMPLETE; } // The server may have decided to give us all of the data in one chunk. If // we requested a partial range, then we don't want to download all of the // data at once. So, we'll just try again, but if this keeps happening then // we'll eventually give up. if (code == 200) { if (mInterval) { mChannel = nullptr; if (++mNonPartialCount > MAX_RETRY_COUNT) { NS_WARNING("unable to fetch a byte range; giving up"); return NS_ERROR_FAILURE; } // Increase delay with each failure. StartTimer(mInterval * mNonPartialCount); return NS_ERROR_DOWNLOAD_NOT_PARTIAL; } // Since we have been asked to download the rest of the file, we can deal // with a 200 response. This may result in downloading the beginning of // the file again, but that can't really be helped. } else { NS_WARNING("server response was unexpected"); return NS_ERROR_UNEXPECTED; } } else { // We got a partial response, so clear this counter in case the next chunk // results in a 200 response. mNonPartialCount = 0; // confirm that the content-range response header is consistent with // expectations on each 206. If it is not then drop this response and // retry with no-cache set. if (!mCacheBust) { nsAutoCString buf; int64_t startByte = 0; bool confirmedOK = false; rv = http->GetResponseHeader(NS_LITERAL_CSTRING("Content-Range"), buf); if (NS_FAILED(rv)) return rv; // it isn't a useful 206 without a CONTENT-RANGE of some sort // Content-Range: bytes 0-299999/25604694 int32_t p = buf.Find("bytes "); // first look for the starting point of the content-range // to make sure it is what we expect if (p != -1) { char *endptr = nullptr; const char *s = buf.get() + p + 6; while (*s && *s == ' ') s++; startByte = strtol(s, &endptr, 10); if (*s && endptr && (endptr != s) && (mCurrentSize == startByte)) { // ok the starting point is confirmed. We still need to check the // total size of the range for consistency if this isn't // the first chunk if (mTotalSize == int64_t(-1)) { // first chunk confirmedOK = true; } else { int32_t slash = buf.FindChar('/'); int64_t rangeSize = 0; if (slash != kNotFound && (PR_sscanf(buf.get() + slash + 1, "%lld", (int64_t *) &rangeSize) == 1) && rangeSize == mTotalSize) { confirmedOK = true; } } } } if (!confirmedOK) { NS_WARNING("unexpected content-range"); mCacheBust = true; mChannel = nullptr; if (++mNonPartialCount > MAX_RETRY_COUNT) { NS_WARNING("unable to fetch a byte range; giving up"); return NS_ERROR_FAILURE; } // Increase delay with each failure. StartTimer(mInterval * mNonPartialCount); return NS_ERROR_DOWNLOAD_NOT_PARTIAL; } } } // Do special processing after the first response. if (mTotalSize == int64_t(-1)) { // Update knowledge of mFinalURI rv = http->GetURI(getter_AddRefs(mFinalURI)); if (NS_FAILED(rv)) return rv; http->GetResponseHeader(NS_LITERAL_CSTRING("Etag"), mPartialValidator); if (StringBeginsWith(mPartialValidator, NS_LITERAL_CSTRING("W/"))) mPartialValidator.Truncate(); // don't use weak validators if (mPartialValidator.IsEmpty()) http->GetResponseHeader(NS_LITERAL_CSTRING("Last-Modified"), mPartialValidator); if (code == 206) { // OK, read the Content-Range header to determine the total size of this // download file. nsAutoCString buf; rv = http->GetResponseHeader(NS_LITERAL_CSTRING("Content-Range"), buf); if (NS_FAILED(rv)) return rv; int32_t slash = buf.FindChar('/'); if (slash == kNotFound) { NS_WARNING("server returned invalid Content-Range header!"); return NS_ERROR_UNEXPECTED; } if (PR_sscanf(buf.get() + slash + 1, "%lld", (int64_t *) &mTotalSize) != 1) return NS_ERROR_UNEXPECTED; } else { rv = http->GetContentLength(&mTotalSize); if (NS_FAILED(rv)) return rv; // We need to know the total size of the thing we're trying to download. if (mTotalSize == int64_t(-1)) { NS_WARNING("server returned no content-length header!"); return NS_ERROR_UNEXPECTED; } // Need to truncate (or create, if it doesn't exist) the file since we // are downloading the whole thing. WriteToFile(mDest, nullptr, 0, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE); mCurrentSize = 0; } // Notify observer that we are starting... rv = CallOnStartRequest(); if (NS_FAILED(rv)) return rv; } // Adjust mChunkSize accordingly if mCurrentSize is close to mTotalSize. int64_t diff = mTotalSize - mCurrentSize; if (diff <= int64_t(0)) { NS_WARNING("about to set a bogus chunk size; giving up"); return NS_ERROR_UNEXPECTED; } if (diff < int64_t(mChunkSize)) mChunkSize = uint32_t(diff); mChunk = MakeUniqueFallible<char[]>(mChunkSize); if (!mChunk) rv = NS_ERROR_OUT_OF_MEMORY; return rv; }
NS_IMETHODIMP nsLocaleService::GetLocaleFromAcceptLanguage(const char *acceptLanguage, nsILocale **_retval) { char* input; char* cPtr; char* cPtr1; char* cPtr2; int i; int j; int countLang = 0; char acceptLanguageList[NSILOCALE_MAX_ACCEPT_LANGUAGE][NSILOCALE_MAX_ACCEPT_LENGTH]; nsresult result; input = new char[strlen(acceptLanguage)+1]; NS_ASSERTION(input!=nsnull,"nsLocaleFactory::GetLocaleFromAcceptLanguage: memory allocation failed."); if (input == (char*)NULL){ return NS_ERROR_OUT_OF_MEMORY; } strcpy(input, acceptLanguage); cPtr1 = input-1; cPtr2 = input; /* put in standard form */ while (*(++cPtr1)) { if (isalpha(*cPtr1)) *cPtr2++ = tolower(*cPtr1); /* force lower case */ else if (isspace(*cPtr1)) ; /* ignore any space */ else if (*cPtr1=='-') *cPtr2++ = '_'; /* "-" -> "_" */ else if (*cPtr1=='*') ; /* ignore "*" */ else *cPtr2++ = *cPtr1; /* else unchanged */ } *cPtr2 = '\0'; countLang = 0; if (strchr(input,';')) { /* deal with the quality values */ float qvalue[NSILOCALE_MAX_ACCEPT_LANGUAGE]; float qSwap; float bias = 0.0f; char* ptrLanguage[NSILOCALE_MAX_ACCEPT_LANGUAGE]; char* ptrSwap; cPtr = nsCRT::strtok(input,",",&cPtr2); while (cPtr) { qvalue[countLang] = 1.0f; /* add extra parens to get rid of warning */ if ((cPtr1 = strchr(cPtr,';')) != nsnull) { PR_sscanf(cPtr1,";q=%f",&qvalue[countLang]); *cPtr1 = '\0'; } if (strlen(cPtr)<NSILOCALE_MAX_ACCEPT_LANGUAGE) { /* ignore if too long */ qvalue[countLang] -= (bias += 0.0001f); /* to insure original order */ ptrLanguage[countLang++] = cPtr; if (countLang>=NSILOCALE_MAX_ACCEPT_LANGUAGE) break; /* quit if too many */ } cPtr = nsCRT::strtok(cPtr2,",",&cPtr2); } /* sort according to decending qvalue */ /* not a very good algorithm, but count is not likely large */ for ( i=0 ; i<countLang-1 ; i++ ) { for ( j=i+1 ; j<countLang ; j++ ) { if (qvalue[i]<qvalue[j]) { qSwap = qvalue[i]; qvalue[i] = qvalue[j]; qvalue[j] = qSwap; ptrSwap = ptrLanguage[i]; ptrLanguage[i] = ptrLanguage[j]; ptrLanguage[j] = ptrSwap; } } } for ( i=0 ; i<countLang ; i++ ) { PL_strncpyz(acceptLanguageList[i],ptrLanguage[i],NSILOCALE_MAX_ACCEPT_LENGTH); } } else { /* simple case: no quality values */ cPtr = nsCRT::strtok(input,",",&cPtr2); while (cPtr) { if (strlen(cPtr)<NSILOCALE_MAX_ACCEPT_LENGTH) { /* ignore if too long */ PL_strncpyz(acceptLanguageList[countLang++],cPtr,NSILOCALE_MAX_ACCEPT_LENGTH); if (countLang>=NSILOCALE_MAX_ACCEPT_LENGTH) break; /* quit if too many */ } cPtr = nsCRT::strtok(cPtr2,",",&cPtr2); } } // // now create the locale // result = NS_ERROR_FAILURE; if (countLang>0) { result = NewLocale(NS_ConvertASCIItoUTF16(acceptLanguageList[0]), _retval); } // // clean up // delete[] input; return result; }