void nsCSSSelector::AppendToStringWithoutCombinatorsOrNegations (nsAString& aString, nsCSSStyleSheet* aSheet, bool aIsNegated) const { nsAutoString temp; bool isPseudoElement = IsPseudoElement(); // For non-pseudo-element selectors or for lone pseudo-elements, deal with // namespace prefixes. bool wroteNamespace = false; if (!isPseudoElement || !mNext) { // append the namespace prefix if needed nsXMLNameSpaceMap *sheetNS = aSheet ? aSheet->GetNameSpaceMap() : nullptr; // sheetNS is non-null if and only if we had an @namespace rule. If it's // null, that means that the only namespaces we could have are the // wildcard namespace (which can be implicit in this case) and the "none" // namespace, which then needs to be explicitly specified. if (!sheetNS) { NS_ASSERTION(mNameSpace == kNameSpaceID_Unknown || mNameSpace == kNameSpaceID_None, "How did we get this namespace?"); if (mNameSpace == kNameSpaceID_None) { aString.Append(PRUnichar('|')); wroteNamespace = true; } } else if (sheetNS->FindNameSpaceID(nullptr) == mNameSpace) { // We have the default namespace (possibly including the wildcard // namespace). Do nothing. NS_ASSERTION(mNameSpace == kNameSpaceID_Unknown || CanBeNamespaced(aIsNegated), "How did we end up with this namespace?"); } else if (mNameSpace == kNameSpaceID_None) { NS_ASSERTION(CanBeNamespaced(aIsNegated), "How did we end up with this namespace?"); aString.Append(PRUnichar('|')); wroteNamespace = true; } else if (mNameSpace != kNameSpaceID_Unknown) { NS_ASSERTION(CanBeNamespaced(aIsNegated), "How did we end up with this namespace?"); nsIAtom *prefixAtom = sheetNS->FindPrefix(mNameSpace); NS_ASSERTION(prefixAtom, "how'd we get a non-default namespace " "without a prefix?"); nsStyleUtil::AppendEscapedCSSIdent(nsDependentAtomString(prefixAtom), aString); aString.Append(PRUnichar('|')); wroteNamespace = true; } else { // A selector for an element in any namespace, while the default // namespace is something else. :not() is special in that the default // namespace is not implied for non-type selectors, so if this is a // negated non-type selector we don't need to output an explicit wildcard // namespace here, since those default to a wildcard namespace. if (CanBeNamespaced(aIsNegated)) { aString.AppendLiteral("*|"); wroteNamespace = true; } } } if (!mLowercaseTag) { // Universal selector: avoid writing the universal selector when we // can avoid it, especially since we're required to avoid it for the // inside of :not() if (wroteNamespace || (!mIDList && !mClassList && !mPseudoClassList && !mAttrList && (aIsNegated || !mNegations))) { aString.Append(PRUnichar('*')); } } else { // Append the tag name nsAutoString tag; (isPseudoElement ? mLowercaseTag : mCasedTag)->ToString(tag); if (isPseudoElement) { if (!mNext) { // Lone pseudo-element selector -- toss in a wildcard type selector // XXXldb Why? aString.Append(PRUnichar('*')); } if (!nsCSSPseudoElements::IsCSS2PseudoElement(mLowercaseTag)) { aString.Append(PRUnichar(':')); } // This should not be escaped since (a) the pseudo-element string // has a ":" that can't be escaped and (b) all pseudo-elements at // this point are known, and therefore we know they don't need // escaping. aString.Append(tag); } else { nsStyleUtil::AppendEscapedCSSIdent(tag, aString); } } // Append the id, if there is one if (mIDList) { nsAtomList* list = mIDList; while (list != nullptr) { list->mAtom->ToString(temp); aString.Append(PRUnichar('#')); nsStyleUtil::AppendEscapedCSSIdent(temp, aString); list = list->mNext; } } // Append each class in the linked list if (mClassList) { if (isPseudoElement) { #ifdef MOZ_XUL NS_ABORT_IF_FALSE(nsCSSAnonBoxes::IsTreePseudoElement(mLowercaseTag), "must be tree pseudo-element"); aString.Append(PRUnichar('(')); for (nsAtomList* list = mClassList; list; list = list->mNext) { nsStyleUtil::AppendEscapedCSSIdent(nsDependentAtomString(list->mAtom), aString); aString.Append(PRUnichar(',')); } // replace the final comma with a close-paren aString.Replace(aString.Length() - 1, 1, PRUnichar(')')); #else NS_ERROR("Can't happen"); #endif } else { nsAtomList* list = mClassList; while (list != nullptr) { list->mAtom->ToString(temp); aString.Append(PRUnichar('.')); nsStyleUtil::AppendEscapedCSSIdent(temp, aString); list = list->mNext; } } } // Append each attribute selector in the linked list if (mAttrList) { nsAttrSelector* list = mAttrList; while (list != nullptr) { aString.Append(PRUnichar('[')); // Append the namespace prefix if (list->mNameSpace == kNameSpaceID_Unknown) { aString.Append(PRUnichar('*')); aString.Append(PRUnichar('|')); } else if (list->mNameSpace != kNameSpaceID_None) { if (aSheet) { nsXMLNameSpaceMap *sheetNS = aSheet->GetNameSpaceMap(); nsIAtom *prefixAtom = sheetNS->FindPrefix(list->mNameSpace); // Default namespaces don't apply to attribute selectors, so // we must have a useful prefix. NS_ASSERTION(prefixAtom, "How did we end up with a namespace if the prefix " "is unknown?"); nsAutoString prefix; prefixAtom->ToString(prefix); nsStyleUtil::AppendEscapedCSSIdent(prefix, aString); aString.Append(PRUnichar('|')); } } // Append the attribute name list->mCasedAttr->ToString(temp); nsStyleUtil::AppendEscapedCSSIdent(temp, aString); if (list->mFunction != NS_ATTR_FUNC_SET) { // Append the function if (list->mFunction == NS_ATTR_FUNC_INCLUDES) aString.Append(PRUnichar('~')); else if (list->mFunction == NS_ATTR_FUNC_DASHMATCH) aString.Append(PRUnichar('|')); else if (list->mFunction == NS_ATTR_FUNC_BEGINSMATCH) aString.Append(PRUnichar('^')); else if (list->mFunction == NS_ATTR_FUNC_ENDSMATCH) aString.Append(PRUnichar('$')); else if (list->mFunction == NS_ATTR_FUNC_CONTAINSMATCH) aString.Append(PRUnichar('*')); aString.Append(PRUnichar('=')); // Append the value nsStyleUtil::AppendEscapedCSSString(list->mValue, aString); } aString.Append(PRUnichar(']')); list = list->mNext; } } // Append each pseudo-class in the linked list for (nsPseudoClassList* list = mPseudoClassList; list; list = list->mNext) { nsCSSPseudoClasses::PseudoTypeToString(list->mType, temp); // This should not be escaped since (a) the pseudo-class string // has a ":" that can't be escaped and (b) all pseudo-classes at // this point are known, and therefore we know they don't need // escaping. aString.Append(temp); if (list->u.mMemory) { aString.Append(PRUnichar('(')); if (nsCSSPseudoClasses::HasStringArg(list->mType)) { nsStyleUtil::AppendEscapedCSSIdent( nsDependentString(list->u.mString), aString); } else if (nsCSSPseudoClasses::HasNthPairArg(list->mType)) { int32_t a = list->u.mNumbers[0], b = list->u.mNumbers[1]; temp.Truncate(); if (a != 0) { if (a == -1) { temp.Append(PRUnichar('-')); } else if (a != 1) { temp.AppendInt(a); } temp.Append(PRUnichar('n')); } if (b != 0 || a == 0) { if (b >= 0 && a != 0) // check a != 0 for whether we printed above temp.Append(PRUnichar('+')); temp.AppendInt(b); } aString.Append(temp); } else { NS_ASSERTION(nsCSSPseudoClasses::HasSelectorListArg(list->mType), "unexpected pseudo-class"); nsString tmp; list->u.mSelectors->ToString(tmp, aSheet); aString.Append(tmp); } aString.Append(PRUnichar(')')); } } }
NS_LogRelease(void* aPtr, nsrefcnt aRefcnt, const char* aClazz) { #ifdef NS_IMPL_REFCNT_LOGGING ASSERT_ACTIVITY_IS_LEGAL; if (!gInitialized) InitTraceLog(); if (gLogging) { LOCK_TRACELOG(); if (gBloatLog) { BloatEntry* entry = GetBloatEntry(aClazz, 0); if (entry) { entry->Release(aRefcnt); } } bool loggingThisType = (!gTypesToLog || LogThisType(aClazz)); intptr_t serialno = 0; if (gSerialNumbers && loggingThisType) { serialno = GetSerialNumber(aPtr, false); NS_ASSERTION(serialno != 0, "Serial number requested for unrecognized pointer! " "Are you memmoving a refcounted object?"); int32_t* count = GetRefCount(aPtr); if(count) (*count)--; } bool loggingThisObject = (!gObjectsToLog || LogThisObj(serialno)); if (gRefcntsLog && loggingThisType && loggingThisObject) { if (gLogToLeaky) { (*leakyLogRelease)(aPtr, aRefcnt + 1, aRefcnt); } else { // Can't use PR_LOG(), b/c it truncates the line fprintf(gRefcntsLog, "\n<%s> 0x%08X %ld Release %d\n", aClazz, NS_PTR_TO_INT32(aPtr), serialno, aRefcnt); nsTraceRefcntImpl::WalkTheStack(gRefcntsLog); fflush(gRefcntsLog); } } // Here's the case where MOZ_COUNT_DTOR was not used, // yet we still want to see deletion information: if (aRefcnt == 0 && gAllocLog && loggingThisType && loggingThisObject) { fprintf(gAllocLog, "\n<%s> 0x%08X %ld Destroy\n", aClazz, NS_PTR_TO_INT32(aPtr), serialno); nsTraceRefcntImpl::WalkTheStack(gAllocLog); } if (aRefcnt == 0 && gSerialNumbers && loggingThisType) { RecycleSerialNumberPtr(aPtr); } UNLOCK_TRACELOG(); } #endif }
// |aTexCoordRect| is the rectangle from the texture that we want to // draw using the given program. The program already has a necessary // offset and scale, so the geometry that needs to be drawn is a unit // square from 0,0 to 1,1. // // |aTexSize| is the actual size of the texture, as it can be larger // than the rectangle given by |aTexCoordRect|. void CompositorOGL::BindAndDrawQuadWithTextureRect(ShaderProgramOGL *aProg, const Rect& aTexCoordRect, TextureSource *aTexture) { NS_ASSERTION(aProg->HasInitialized(), "Shader program not correctly initialized"); GLuint vertAttribIndex = aProg->AttribLocation(ShaderProgramOGL::VertexCoordAttrib); GLuint texCoordAttribIndex = aProg->AttribLocation(ShaderProgramOGL::TexCoordAttrib); NS_ASSERTION(texCoordAttribIndex != GLuint(-1), "no texture coords?"); // Given what we know about these textures and coordinates, we can // compute fmod(t, 1.0f) to get the same texture coordinate out. If // the texCoordRect dimension is < 0 or > width/height, then we have // wraparound that we need to deal with by drawing multiple quads, // because we can't rely on full non-power-of-two texture support // (which is required for the REPEAT wrap mode). GLContext::RectTriangles rects; GLenum wrapMode = aTexture->AsSourceOGL()->GetWrapMode(); IntSize realTexSize = aTexture->GetSize(); if (!mGLContext->CanUploadNonPowerOfTwo()) { realTexSize = IntSize(NextPowerOfTwo(realTexSize.width), NextPowerOfTwo(realTexSize.height)); } // We need to convert back to actual texels here to get proper behaviour with // our GL helper functions. Should fix this sometime. // I want to vomit. IntRect texCoordRect = IntRect(NS_roundf(aTexCoordRect.x * aTexture->GetSize().width), NS_roundf(aTexCoordRect.y * aTexture->GetSize().height), NS_roundf(aTexCoordRect.width * aTexture->GetSize().width), NS_roundf(aTexCoordRect.height * aTexture->GetSize().height)); // This is fairly disgusting - if the texture should be flipped it will have a // negative height, in which case we un-invert the texture coords and pass the // flipped 'flag' to the functions below. We can't just use the inverted coords // because our GL funtions use an explicit flag. bool flipped = false; if (texCoordRect.height < 0) { flipped = true; texCoordRect.y = texCoordRect.YMost(); texCoordRect.height = -texCoordRect.height; } if (wrapMode == LOCAL_GL_REPEAT) { rects.addRect(/* dest rectangle */ 0.0f, 0.0f, 1.0f, 1.0f, /* tex coords */ texCoordRect.x / GLfloat(realTexSize.width), texCoordRect.y / GLfloat(realTexSize.height), texCoordRect.XMost() / GLfloat(realTexSize.width), texCoordRect.YMost() / GLfloat(realTexSize.height), flipped); } else { nsIntRect tcRect(texCoordRect.x, texCoordRect.y, texCoordRect.width, texCoordRect.height); GLContext::DecomposeIntoNoRepeatTriangles(tcRect, nsIntSize(realTexSize.width, realTexSize.height), rects, flipped); } DrawWithVertexBuffer2(mGLContext, mVBOs, LOCAL_GL_TRIANGLES, rects.elements(), vertAttribIndex, rects.vertexPointer(), texCoordAttribIndex, rects.texCoordPointer()); }
nsXPInstallManager::~nsXPInstallManager() { NS_ASSERT_OWNINGTHREAD(nsXPInstallManager); NS_ASSERTION(!mTriggers, "Shutdown not called, triggers still alive"); }
NS_IMETHODIMP nsXPInstallManager::DownloadNext() { nsresult rv = NS_OK; mContentLength = 0; if (mCancelled) { // Don't download any more if we were cancelled Shutdown(); return NS_OK; } if ( mNextItem < mTriggers->Size() ) { //------------------------------------------------- // There are items to download, get the next one //------------------------------------------------- mItem = (nsXPITriggerItem*)mTriggers->Get(mNextItem++); NS_ASSERTION( mItem, "bogus Trigger slipped through" ); NS_ASSERTION( !mItem->mURL.IsEmpty(), "bogus trigger"); if ( !mItem || mItem->mURL.IsEmpty() ) { // serious problem with trigger! Can't notify anyone of the // error without the URL, just try to carry on. return DownloadNext(); } // --- Tell the dialog we're starting a download if (mDlg) mDlg->OnStateChange( mNextItem-1, nsIXPIProgressDialog::DOWNLOAD_START, 0 ); if ( mItem->IsFileURL() && mChromeType == NOT_CHROME ) { //-------------------------------------------------- // Already local, we can open it where it is //-------------------------------------------------- nsCOMPtr<nsIURI> pURL; rv = NS_NewURI(getter_AddRefs(pURL), mItem->mURL); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(pURL,&rv); if (fileURL) { nsCOMPtr<nsIFile> localFile; rv = fileURL->GetFile(getter_AddRefs(localFile)); if (NS_SUCCEEDED(rv)) { mItem->mFile = do_QueryInterface(localFile,&rv); } } } if ( NS_FAILED(rv) || !mItem->mFile ) { // send error status back if (mDlg) mDlg->OnStateChange( mNextItem-1, nsIXPIProgressDialog::INSTALL_DONE, nsInstall::UNEXPECTED_ERROR ); mTriggers->SendStatus( mItem->mURL.get(), nsInstall::UNEXPECTED_ERROR ); mItem->mFile = 0; } else if (mDlg) { mDlg->OnStateChange( mNextItem-1, nsIXPIProgressDialog::DOWNLOAD_DONE, 0); } // --- on to the next one return DownloadNext(); } else { //-------------------------------------------------- // We have one to download //-------------------------------------------------- rv = GetDestinationFile(mItem->mURL, getter_AddRefs(mItem->mFile)); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIURI> pURL; rv = NS_NewURI(getter_AddRefs(pURL), mItem->mURL); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIChannel> channel; rv = NS_NewChannel(getter_AddRefs(channel), pURL, nsnull, mLoadGroup, this); if (NS_SUCCEEDED(rv)) { rv = channel->AsyncOpen(this, nsnull); } } } if (NS_FAILED(rv)) { // announce failure if (mDlg) mDlg->OnStateChange( mNextItem-1, nsIXPIProgressDialog::INSTALL_DONE, nsInstall::DOWNLOAD_ERROR ); mTriggers->SendStatus( mItem->mURL.get(), nsInstall::DOWNLOAD_ERROR ); mItem->mFile = 0; // We won't get Necko callbacks so start the next one now return DownloadNext(); } } } else { //------------------------------------------------------ // all downloaded, install them //------------------------------------------------------ InstallItems(); Shutdown(); } return rv; }
void nsHttpPipeline::OnTransportStatus(nsITransport* transport, nsresult status, PRUint64 progress) { LOG(("nsHttpPipeline::OnStatus [this=%x status=%x progress=%llu]\n", this, status, progress)); NS_ASSERTION(PR_GetCurrentThread() == gSocketThread, "wrong thread"); nsAHttpTransaction *trans; PRInt32 i, count; switch (status) { case NS_NET_STATUS_RESOLVING_HOST: case NS_NET_STATUS_RESOLVED_HOST: case NS_NET_STATUS_CONNECTING_TO: case NS_NET_STATUS_CONNECTED_TO: // These should only appear at most once per pipeline. // Deliver to the first transaction. trans = Request(0); if (!trans) trans = Response(0); if (trans) trans->OnTransportStatus(transport, status, progress); break; case NS_NET_STATUS_SENDING_TO: // This is generated by the socket transport when (part) of // a transaction is written out // // In pipelining this is generated out of FillSendBuf(), but it cannot do // so until the connection is confirmed by CONNECTED_TO. // See patch for bug 196827. // if (mSuppressSendEvents) { mSuppressSendEvents = false; // catch up by sending the event to all the transactions that have // moved from request to response and any that have been partially // sent. Also send WAITING_FOR to those that were completely sent count = mResponseQ.Length(); for (i = 0; i < count; ++i) { Response(i)->OnTransportStatus(transport, NS_NET_STATUS_SENDING_TO, progress); Response(i)->OnTransportStatus(transport, NS_NET_STATUS_WAITING_FOR, progress); } if (mRequestIsPartial && Request(0)) Request(0)->OnTransportStatus(transport, NS_NET_STATUS_SENDING_TO, progress); mSendingToProgress = progress; } // otherwise ignore it break; case NS_NET_STATUS_WAITING_FOR: // Created by nsHttpConnection when request pipeline has been totally // sent. Ignore it here because it is simulated in FillSendBuf() when // a request is moved from request to response. // ignore it break; case NS_NET_STATUS_RECEIVING_FROM: // Forward this only to the transaction currently recieving data. It is // normally generated by the socket transport, but can also // be repeated by the pushbackwriter if necessary. mReceivingFromProgress = progress; if (Response(0)) Response(0)->OnTransportStatus(transport, status, progress); break; default: // forward other notifications to all request transactions count = mRequestQ.Length(); for (i = 0; i < count; ++i) Request(i)->OnTransportStatus(transport, status, progress); break; } }
int main(void) { nsresult rv; #ifdef XPCOM_GLUE XPCOMGlueStartup(nsnull); #endif // Initialize XPCOM nsCOMPtr<nsIServiceManager> servMan; rv = NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull); if (NS_FAILED(rv)) { printf("ERROR: XPCOM intialization error [%x].\n", rv); return -1; } // register all components in our default component directory nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan); NS_ASSERTION(registrar, "Null nsIComponentRegistrar"); registrar->AutoRegister(nsnull); nsCOMPtr<nsIComponentManager> manager = do_QueryInterface(registrar); NS_ASSERTION(registrar, "Null nsIComponentManager"); // Create an instance of our component nsCOMPtr<nsISample> mysample; rv = manager->CreateInstanceByContractID(NS_SAMPLE_CONTRACTID, nsnull, NS_GET_IID(nsISample), getter_AddRefs(mysample)); if (NS_FAILED(rv)) { printf("ERROR: Cannot create instance of component " NS_SAMPLE_CONTRACTID " [%x].\n" "Debugging hint:\n" "\tsetenv NSPR_LOG_MODULES nsComponentManager:5\n" "\tsetenv NSPR_LOG_FILE xpcom.log\n" "\t./nsTestSample\n" "\t<check the contents for xpcom.log for possible cause of error>.\n", rv); return -2; } // Call methods on our sample to test it out. rv = mysample->WriteValue("Inital print:"); if (NS_FAILED(rv)) { printf("ERROR: Calling nsISample::WriteValue() [%x]\n", rv); return -3; } const char *testValue = "XPCOM defies gravity"; rv = mysample->SetValue(testValue); if (NS_FAILED(rv)) { printf("ERROR: Calling nsISample::SetValue() [%x]\n", rv); return -3; } printf("Set value to: %s\n", testValue); #ifndef XPCOM_GLUE nsXPIDLCString str; rv = mysample->GetValue(getter_Copies(str)); #else char *str; rv = mysample->GetValue(&str); #endif if (NS_FAILED(rv)) { printf("ERROR: Calling nsISample::GetValue() [%x]\n", rv); return -3; } if (strcmp(str, testValue)) { printf("Test FAILED.\n"); return -4; } #ifdef XPCOM_GLUE nsMemory::Free(str); #endif rv = mysample->WriteValue("Final print :"); printf("Test passed.\n"); // All nsCOMPtr's must be deleted prior to calling shutdown XPCOM // as we should not hold references passed XPCOM Shutdown. servMan = 0; registrar = 0; manager = 0; mysample = 0; // Shutdown XPCOM NS_ShutdownXPCOM(nsnull); #ifdef XPCOM_GLUE XPCOMGlueShutdown(); #endif return 0; }
nsresult nsOutlookMail::ImportMailbox( PRUint32 *pDoneSoFar, PRBool *pAbort, PRInt32 index, const PRUnichar *pName, nsIFile *pDest, PRInt32 *pMsgCount) { if ((index < 0) || (index >= m_folderList.GetSize())) { IMPORT_LOG0( "*** Bad mailbox identifier, unable to import\n"); *pAbort = PR_TRUE; return( NS_ERROR_FAILURE); } PRInt32 dummyMsgCount = 0; if (pMsgCount) *pMsgCount = 0; else pMsgCount = &dummyMsgCount; CMapiFolder *pFolder = m_folderList.GetItem( index); OpenMessageStore( pFolder); if (!m_lpMdb) { IMPORT_LOG1( "*** Unable to obtain mapi message store for mailbox: %S\n", pName); return( NS_ERROR_FAILURE); } if (pFolder->IsStore()) return( NS_OK); nsresult rv; nsOutlookCompose compose; SimpleBufferTonyRCopiedTwice copy; copy.Allocate( kCopyBufferSize); // now what? CMapiFolderContents contents( m_lpMdb, pFolder->GetCBEntryID(), pFolder->GetEntryID()); BOOL done = FALSE; ULONG cbEid; LPENTRYID lpEid; ULONG oType; LPMESSAGE lpMsg = nsnull; int attachCount; ULONG totalCount; PRFloat64 doneCalc; nsCString fromLine; int fromLen; PRBool lostAttach = PR_FALSE; nsCOMPtr<nsIOutputStream> destOutputStream; rv = NS_NewLocalFileOutputStream(getter_AddRefs(destOutputStream), pDest, -1, 0600); NS_ENSURE_SUCCESS(rv, rv); while (!done) { if (!contents.GetNext( &cbEid, &lpEid, &oType, &done)) { IMPORT_LOG1( "*** Error iterating mailbox: %S\n", pName); return( NS_ERROR_FAILURE); } totalCount = contents.GetCount(); doneCalc = *pMsgCount; doneCalc /= totalCount; doneCalc *= 1000; if (pDoneSoFar) { *pDoneSoFar = (PRUint32) doneCalc; if (*pDoneSoFar > 1000) *pDoneSoFar = 1000; } if (!done && (oType == MAPI_MESSAGE)) { if (!m_mapi.OpenMdbEntry( m_lpMdb, cbEid, lpEid, (LPUNKNOWN *) &lpMsg)) { IMPORT_LOG1( "*** Error opening messages in mailbox: %S\n", pName); return( NS_ERROR_FAILURE); } CMapiMessage msg( lpMsg); BOOL bResult = msg.FetchHeaders(); if (bResult) bResult = msg.FetchBody(); if (bResult) fromLine = msg.GetFromLine( fromLen); attachCount = msg.CountAttachments(); BuildAttachments( msg, attachCount); if (!bResult) { IMPORT_LOG1( "*** Error reading message from mailbox: %S\n", pName); return( NS_ERROR_FAILURE); } // -------------------------------------------------------------- compose.SetBody( msg.GetBody()); // Need to convert all headers to unicode (for i18n). // Init header here since 'composes' is used for all msgs. compose.SetHeaders(""); nsAutoString newheader; nsCAutoString tempCStr(msg.GetHeaders(), msg.GetHeaderLen()); rv = nsMsgI18NConvertToUnicode(nsMsgI18NFileSystemCharset(), tempCStr, newheader); NS_ASSERTION(NS_SUCCEEDED(rv), "failed to convert headers to utf8"); if (NS_SUCCEEDED(rv)) compose.SetHeaders(NS_ConvertUTF16toUTF8(newheader).get()); compose.SetAttachments( &m_attachments); // See if it's a drafts folder. Outlook doesn't allow drafts // folder to be configured so it's ok to hard code it here. nsAutoString folderName(pName); nsMsgDeliverMode mode = nsIMsgSend::nsMsgDeliverNow; mode = nsIMsgSend::nsMsgSaveAsDraft; if ( folderName.LowerCaseEqualsLiteral("drafts") ) mode = nsIMsgSend::nsMsgSaveAsDraft; /* If I can't get no headers, I can't get no satisfaction */ if (msg.GetHeaderLen()) { nsCAutoString cType; SetDefaultContentType(msg, cType); nsCOMPtr<nsIFile> compositionFile; rv = compose.SendTheMessage(mode, cType, getter_AddRefs(compositionFile)); if (NS_SUCCEEDED( rv)) { rv = compose.CopyComposedMessage( fromLine, compositionFile, destOutputStream, copy); DeleteFile( compositionFile); if (NS_FAILED( rv)) { IMPORT_LOG0( "*** Error copying composed message to destination mailbox\n"); return( rv); } (*pMsgCount)++; } } else rv = NS_OK; // The following code to write msg to folder when compose.SendTheMessage() fails is commented // out for now because the code doesn't handle attachments and users will complain anyway so // until we fix the code to handle all kinds of msgs correctly we should not even make users // think that all msgs are imported ok. This will also help users to identify which msgs are // not imported and help to debug the problem. #if 0 if (NS_FAILED( rv)) { /* NS_PRECONDITION( FALSE, "Manual breakpoint"); */ IMPORT_LOG1( "Message #%d failed.\n", (int) (*pMsgCount)); DumpAttachments(); // -------------------------------------------------------------- // This is the OLD way of writing out the message which uses // all kinds of crufty old crap for attachments. // Since we now use Compose to send attachments, // this is only fallback error stuff. // Attachments get lost. if (attachCount) { lostAttach = PR_TRUE; attachCount = 0; } BOOL needsTerminate = FALSE; if (!WriteMessage( destOutputStream, &msg, attachCount, &needsTerminate)) { IMPORT_LOG0( "*** Error writing message\n"); *pAbort = PR_TRUE; return( NS_ERROR_FAILURE); } if (needsTerminate) { if (!WriteMimeBoundary( destOutputStream, &msg, TRUE)) { IMPORT_LOG0( "*** Error writing message mime boundary\n"); *pAbort = PR_TRUE; return( NS_ERROR_FAILURE); } } } #endif // Just for YUCKS, let's try an extra endline WriteData( destOutputStream, "\x0D\x0A", 2); } } return( NS_OK); }
// Call this method to interrupt a file copy operation that is occuring on // a background thread. The status parameter passed to this function must // be a failure code and is set as the status of this file copy operation. void Interrupt(nsresult status) { NS_ASSERTION(NS_FAILED(status), "must be a failure code"); mInterruptStatus = status; }
nsBlockReflowState::nsBlockReflowState(const nsHTMLReflowState& aReflowState, nsPresContext* aPresContext, nsBlockFrame* aFrame, const nsHTMLReflowMetrics& aMetrics, PRBool aTopMarginRoot, PRBool aBottomMarginRoot, PRBool aBlockNeedsFloatManager) : mBlock(aFrame), mPresContext(aPresContext), mReflowState(aReflowState), mOverflowTracker(nsnull), mPrevBottomMargin(), mLineNumber(0), mFlags(0), mFloatBreakType(NS_STYLE_CLEAR_NONE) { SetFlag(BRS_ISFIRSTINFLOW, aFrame->GetPrevInFlow() == nsnull); SetFlag(BRS_ISOVERFLOWCONTAINER, IS_TRUE_OVERFLOW_CONTAINER(aFrame)); const nsMargin& borderPadding = BorderPadding(); if (aTopMarginRoot || 0 != aReflowState.mComputedBorderPadding.top) { SetFlag(BRS_ISTOPMARGINROOT, PR_TRUE); } if (aBottomMarginRoot || 0 != aReflowState.mComputedBorderPadding.bottom) { SetFlag(BRS_ISBOTTOMMARGINROOT, PR_TRUE); } if (GetFlag(BRS_ISTOPMARGINROOT)) { SetFlag(BRS_APPLYTOPMARGIN, PR_TRUE); } if (aBlockNeedsFloatManager) { SetFlag(BRS_FLOAT_MGR, PR_TRUE); } mFloatManager = aReflowState.mFloatManager; NS_ASSERTION(mFloatManager, "FloatManager should be set in nsBlockReflowState" ); if (mFloatManager) { // Translate into our content area and then save the // coordinate system origin for later. mFloatManager->Translate(borderPadding.left, borderPadding.top); mFloatManager->GetTranslation(mFloatManagerX, mFloatManagerY); mFloatManager->PushState(&mFloatManagerStateBefore); // never popped } mReflowStatus = NS_FRAME_COMPLETE; mPresContext = aPresContext; mNextInFlow = static_cast<nsBlockFrame*>(mBlock->GetNextInFlow()); NS_WARN_IF_FALSE(NS_UNCONSTRAINEDSIZE != aReflowState.ComputedWidth(), "have unconstrained width; this should only result from " "very large sizes, not attempts at intrinsic width " "calculation"); mContentArea.width = aReflowState.ComputedWidth(); // Compute content area height. Unlike the width, if we have a // specified style height we ignore it since extra content is // managed by the "overflow" property. When we don't have a // specified style height then we may end up limiting our height if // the availableHeight is constrained (this situation occurs when we // are paginated). if (NS_UNCONSTRAINEDSIZE != aReflowState.availableHeight) { // We are in a paginated situation. The bottom edge is just inside // the bottom border and padding. The content area height doesn't // include either border or padding edge. mBottomEdge = aReflowState.availableHeight - borderPadding.bottom; mContentArea.height = NS_MAX(0, mBottomEdge - borderPadding.top); } else { // When we are not in a paginated situation then we always use // an constrained height. SetFlag(BRS_UNCONSTRAINEDHEIGHT, PR_TRUE); mContentArea.height = mBottomEdge = NS_UNCONSTRAINEDSIZE; } mY = borderPadding.top; mPrevChild = nsnull; mCurrentLine = aFrame->end_lines(); mMinLineHeight = aReflowState.CalcLineHeight(); }
PRBool nsBlockReflowState::FlowAndPlaceFloat(nsIFrame* aFloat, nsReflowStatus& aReflowStatus, PRBool aForceFit) { aReflowStatus = NS_FRAME_COMPLETE; // Save away the Y coordinate before placing the float. We will // restore mY at the end after placing the float. This is // necessary because any adjustments to mY during the float // placement are for the float only, not for any non-floating // content. nscoord saveY = mY; // Grab the float's display information const nsStyleDisplay* floatDisplay = aFloat->GetStyleDisplay(); // The float's old region, so we can propagate damage. nsRect oldRegion = nsFloatManager::GetRegionFor(aFloat); // Enforce CSS2 9.5.1 rule [2], i.e., make sure that a float isn't // ``above'' another float that preceded it in the flow. mY = NS_MAX(mFloatManager->GetLowestFloatTop() + BorderPadding().top, mY); // See if the float should clear any preceding floats... // XXX We need to mark this float somehow so that it gets reflowed // when floats are inserted before it. if (NS_STYLE_CLEAR_NONE != floatDisplay->mBreakType) { // XXXldb Does this handle vertical margins correctly? mY = ClearFloats(mY, floatDisplay->mBreakType); } // Get the band of available space nsFlowAreaRect floatAvailableSpace = GetFloatAvailableSpace(mY, aForceFit); NS_ASSERTION(aFloat->GetParent() == mBlock, "Float frame has wrong parent"); // Reflow the float nsMargin floatMargin; // computed margin mBlock->ReflowFloat(*this, floatAvailableSpace.mRect, aFloat, floatMargin, aReflowStatus); if (aFloat->GetPrevInFlow()) floatMargin.top = 0; if (NS_FRAME_IS_NOT_COMPLETE(aReflowStatus)) floatMargin.bottom = 0; #ifdef DEBUG if (nsBlockFrame::gNoisyReflow) { nsRect region = aFloat->GetRect(); nsFrame::IndentBy(stdout, nsBlockFrame::gNoiseIndent); printf("flowed float: "); nsFrame::ListTag(stdout, aFloat); printf(" (%d,%d,%d,%d)\n", region.x, region.y, region.width, region.height); } #endif nsSize floatSize = aFloat->GetSize() + nsSize(floatMargin.LeftRight(), floatMargin.TopBottom()); // Find a place to place the float. The CSS2 spec doesn't want // floats overlapping each other or sticking out of the containing // block if possible (CSS2 spec section 9.5.1, see the rule list). NS_ASSERTION((NS_STYLE_FLOAT_LEFT == floatDisplay->mFloats) || (NS_STYLE_FLOAT_RIGHT == floatDisplay->mFloats), "invalid float type"); // Can the float fit here? PRBool keepFloatOnSameLine = PR_FALSE; while (!CanPlaceFloat(floatSize, floatDisplay->mFloats, floatAvailableSpace, aForceFit)) { if (floatAvailableSpace.mRect.height <= 0) { // No space, nowhere to put anything. mY = saveY; return PR_FALSE; } // Nope. try to advance to the next band. if (NS_STYLE_DISPLAY_TABLE != floatDisplay->mDisplay || eCompatibility_NavQuirks != mPresContext->CompatibilityMode() ) { mY += floatAvailableSpace.mRect.height; floatAvailableSpace = GetFloatAvailableSpace(mY, aForceFit); } else { // This quirk matches the one in nsBlockFrame::ReflowFloat // IE handles float tables in a very special way // see if the previous float is also a table and has "align" nsFloatCache* fc = mCurrentLineFloats.Head(); nsIFrame* prevFrame = nsnull; while (fc) { if (fc->mFloat == aFloat) { break; } prevFrame = fc->mFloat; fc = fc->Next(); } if(prevFrame) { //get the frame type if (nsGkAtoms::tableOuterFrame == prevFrame->GetType()) { //see if it has "align=" // IE makes a difference between align and he float property nsIContent* content = prevFrame->GetContent(); if (content) { // we're interested only if previous frame is align=left // IE messes things up when "right" (overlapping frames) if (content->AttrValueIs(kNameSpaceID_None, nsGkAtoms::align, NS_LITERAL_STRING("left"), eIgnoreCase)) { keepFloatOnSameLine = PR_TRUE; // don't advance to next line (IE quirkie behaviour) // it breaks rule CSS2/9.5.1/1, but what the hell // since we cannot evangelize the world break; } } } } // the table does not fit anymore in this line so advance to next band mY += floatAvailableSpace.mRect.height; floatAvailableSpace = GetFloatAvailableSpace(mY, aForceFit); // reflow the float again now since we have more space // XXXldb We really don't need to Reflow in a loop, we just need // to ComputeSize in a loop (once ComputeSize depends on // availableWidth, which should make this work again). mBlock->ReflowFloat(*this, floatAvailableSpace.mRect, aFloat, floatMargin, aReflowStatus); // Get the floats bounding box and margin information floatSize = aFloat->GetSize() + nsSize(floatMargin.LeftRight(), floatMargin.TopBottom()); } } // If the float is continued, it will get the same absolute x value as its prev-in-flow // We don't worry about the geometry of the prev in flow, let the continuation // place and size itself as required. // Assign an x and y coordinate to the float. Note that the x,y // coordinates are computed <b>relative to the translation in the // spacemanager</b> which means that the impacted region will be // <b>inside</b> the border/padding area. nscoord floatX, floatY; if (NS_STYLE_FLOAT_LEFT == floatDisplay->mFloats) { floatX = floatAvailableSpace.mRect.x; } else { if (!keepFloatOnSameLine) { floatX = floatAvailableSpace.mRect.XMost() - floatSize.width; } else { // this is the IE quirk (see few lines above) // the table is kept in the same line: don't let it overlap the // previous float floatX = floatAvailableSpace.mRect.x; } } const nsMargin& borderPadding = BorderPadding(); floatY = mY - borderPadding.top; if (floatY < 0) { // CSS2 spec, 9.5.1 rule [4]: "A floating box's outer top may not // be higher than the top of its containing block." (Since the // containing block is the content edge of the block box, this // means the margin edge of the float can't be higher than the // content edge of the block that contains it.) floatY = 0; } // Calculate the actual origin of the float frame's border rect // relative to the parent block; floatX/Y must be converted from space-manager // coordinates to parent coordinates, and the margin must be added in // to get the border rect nsPoint origin(borderPadding.left + floatMargin.left + floatX, borderPadding.top + floatMargin.top + floatY); // If float is relatively positioned, factor that in as well origin += aFloat->GetRelativeOffset(floatDisplay); // Position the float and make sure and views are properly // positioned. We need to explicitly position its child views as // well, since we're moving the float after flowing it. aFloat->SetPosition(origin); nsContainerFrame::PositionFrameView(aFloat); nsContainerFrame::PositionChildViews(aFloat); // Update the float combined area state nsRect combinedArea = aFloat->GetOverflowRect() + origin; // XXX Floats should really just get invalidated here if necessary mFloatCombinedArea.UnionRect(combinedArea, mFloatCombinedArea); // Place the float in the float manager // calculate region nsRect region = nsFloatManager::CalculateRegionFor(aFloat, floatMargin); // if the float split, then take up all of the vertical height if (NS_FRAME_IS_NOT_COMPLETE(aReflowStatus) && (NS_UNCONSTRAINEDSIZE != mContentArea.height)) { region.height = NS_MAX(region.height, mContentArea.height - floatY); } nsresult rv = // spacemanager translation is inset by the border+padding. mFloatManager->AddFloat(aFloat, region - nsPoint(borderPadding.left, borderPadding.top)); NS_ABORT_IF_FALSE(NS_SUCCEEDED(rv), "bad float placement"); // store region rv = nsFloatManager::StoreRegionFor(aFloat, region); NS_ABORT_IF_FALSE(NS_SUCCEEDED(rv), "float region storage failed"); // If the float's dimensions have changed, note the damage in the // float manager. if (region != oldRegion) { // XXXwaterson conservative: we could probably get away with noting // less damage; e.g., if only height has changed, then only note the // area into which the float has grown or from which the float has // shrunk. nscoord top = NS_MIN(region.y, oldRegion.y) - borderPadding.top; nscoord bottom = NS_MAX(region.YMost(), oldRegion.YMost()) - borderPadding.left; mFloatManager->IncludeInDamage(top, bottom); } #ifdef NOISY_FLOATMANAGER nscoord tx, ty; mFloatManager->GetTranslation(tx, ty); nsFrame::ListTag(stdout, mBlock); printf(": FlowAndPlaceFloat: AddFloat: txy=%d,%d (%d,%d) {%d,%d,%d,%d}\n", tx, ty, mFloatManagerX, mFloatManagerY, region.x, region.y, region.width, region.height); #endif // Now restore mY mY = saveY; #ifdef DEBUG if (nsBlockFrame::gNoisyReflow) { nsRect r = aFloat->GetRect(); nsFrame::IndentBy(stdout, nsBlockFrame::gNoiseIndent); printf("placed float: "); nsFrame::ListTag(stdout, aFloat); printf(" %d,%d,%d,%d\n", r.x, r.y, r.width, r.height); } #endif return PR_TRUE; }
// XXXldb This behavior doesn't quite fit with CSS1 and CSS2 -- // technically we're supposed let the current line flow around the // float as well unless it won't fit next to what we already have. // But nobody else implements it that way... PRBool nsBlockReflowState::AddFloat(nsLineLayout* aLineLayout, nsIFrame* aFloat, nscoord aAvailableWidth, nsReflowStatus& aReflowStatus) { NS_PRECONDITION(!aLineLayout || mBlock->end_lines() != mCurrentLine, "null ptr"); NS_PRECONDITION(aFloat->GetStateBits() & NS_FRAME_OUT_OF_FLOW, "aFloat must be an out-of-flow frame"); // Set the geometric parent of the float aFloat->SetParent(mBlock); aReflowStatus = NS_FRAME_COMPLETE; // Because we are in the middle of reflowing a placeholder frame // within a line (and possibly nested in an inline frame or two // that's a child of our block) we need to restore the space // manager's translation to the space that the block resides in // before placing the float. nscoord ox, oy; mFloatManager->GetTranslation(ox, oy); nscoord dx = ox - mFloatManagerX; nscoord dy = oy - mFloatManagerY; mFloatManager->Translate(-dx, -dy); PRBool placed; // Now place the float immediately if possible. Otherwise stash it // away in mPendingFloats and place it later. // If one or more floats has already been pushed to the next line, // don't let this one go on the current line, since that would violate // float ordering. nsRect floatAvailableSpace = GetFloatAvailableSpace().mRect; if (!aLineLayout || (mBelowCurrentLineFloats.IsEmpty() && (aLineLayout->LineIsEmpty() || mBlock->ComputeFloatWidth(*this, floatAvailableSpace, aFloat) <= aAvailableWidth))) { // And then place it // force it to fit if we're at the top of the block and we can't // break before this PRBool forceFit = !aLineLayout || (IsAdjacentWithTop() && !aLineLayout->LineIsBreakable()); placed = FlowAndPlaceFloat(aFloat, aReflowStatus, forceFit); NS_ASSERTION(placed || !forceFit, "If we asked for force-fit, it should have been placed"); if (forceFit || (placed && !NS_FRAME_IS_TRUNCATED(aReflowStatus))) { // Pass on updated available space to the current inline reflow engine nsFlowAreaRect floatAvailSpace = GetFloatAvailableSpace(mY, forceFit); nsRect availSpace(nsPoint(floatAvailSpace.mRect.x + BorderPadding().left, mY), floatAvailSpace.mRect.Size()); if (aLineLayout) { aLineLayout->UpdateBand(availSpace, aFloat); // Record this float in the current-line list mCurrentLineFloats.Append(mFloatCacheFreeList.Alloc(aFloat)); } // If we can't break here, hide the fact that it's truncated // XXX We can probably do this more cleanly aReflowStatus &= ~NS_FRAME_TRUNCATED; } else { if (IsAdjacentWithTop()) { // Pushing the line to the next page won't give us any more space; // therefore, we break. NS_ASSERTION(aLineLayout->LineIsBreakable(), "We can't get here unless forceFit is false"); aReflowStatus = NS_INLINE_LINE_BREAK_BEFORE(); } else { // Make sure we propagate the truncated status; this signals the // block to push the line to the next page. aReflowStatus |= NS_FRAME_TRUNCATED; } } } else { // Always claim to be placed; we don't know whether we fit yet, so we // deal with this in PlaceBelowCurrentLineFloats placed = PR_TRUE; // This float will be placed after the line is done (it is a // below-current-line float). mBelowCurrentLineFloats.Append(mFloatCacheFreeList.Alloc(aFloat)); } // Restore coordinate system mFloatManager->Translate(dx, dy); return placed; }
// Compute the amount of available space for reflowing a block frame // at the current Y coordinate. This method assumes that // GetAvailableSpace has already been called. void nsBlockReflowState::ComputeBlockAvailSpace(nsIFrame* aFrame, const nsStyleDisplay* aDisplay, const nsFlowAreaRect& aFloatAvailableSpace, PRBool aBlockAvoidsFloats, nsRect& aResult) { #ifdef REALLY_NOISY_REFLOW printf("CBAS frame=%p has floats %d\n", aFrame, aFloatAvailableSpace.mHasFloats); #endif aResult.y = mY; aResult.height = GetFlag(BRS_UNCONSTRAINEDHEIGHT) ? NS_UNCONSTRAINEDSIZE : NS_MAX(0, mReflowState.availableHeight - mY); // mY might be greater than mBottomEdge if the block's top margin pushes // it off the page/column. Negative available height can confuse other code // and is nonsense in principle. const nsMargin& borderPadding = BorderPadding(); // XXX Do we really want this condition to be this restrictive (i.e., // more restrictive than it used to be)? The |else| here is allowed // by the CSS spec, but only out of desperation given implementations, // and the behavior it leads to is quite undesirable (it can cause // things to become extremely narrow when they'd fit quite well a // little bit lower). Should the else be a quirk or something that // applies to a specific set of frame classes and no new ones? // If we did that, then for those frames where the condition below is // true but nsBlockFrame::BlockCanIntersectFloats is false, // nsBlockFrame::WidthToClearPastFloats would need to use the // shrink-wrap formula, max(MIN_WIDTH, min(avail width, PREF_WIDTH)) // rather than just using MIN_WIDTH. NS_ASSERTION(nsBlockFrame::BlockCanIntersectFloats(aFrame) == !aBlockAvoidsFloats, "unexpected replaced width"); if (!aBlockAvoidsFloats) { if (aFloatAvailableSpace.mHasFloats) { // Use the float-edge property to determine how the child block // will interact with the float. const nsStyleBorder* borderStyle = aFrame->GetStyleBorder(); switch (borderStyle->mFloatEdge) { default: case NS_STYLE_FLOAT_EDGE_CONTENT: // content and only content does runaround of floats // The child block will flow around the float. Therefore // give it all of the available space. aResult.x = borderPadding.left; aResult.width = mContentArea.width; break; case NS_STYLE_FLOAT_EDGE_MARGIN: { // The child block's margins should be placed adjacent to, // but not overlap the float. aResult.x = aFloatAvailableSpace.mRect.x + borderPadding.left; aResult.width = aFloatAvailableSpace.mRect.width; } break; } } else { // Since there are no floats present the float-edge property // doesn't matter therefore give the block element all of the // available space since it will flow around the float itself. aResult.x = borderPadding.left; aResult.width = mContentArea.width; } } else { nsBlockFrame::ReplacedElementWidthToClear replacedWidthStruct; nsBlockFrame::ReplacedElementWidthToClear *replacedWidth = nsnull; if (aFrame->GetType() == nsGkAtoms::tableOuterFrame) { replacedWidth = &replacedWidthStruct; replacedWidthStruct = nsBlockFrame::WidthToClearPastFloats(*this, aFloatAvailableSpace.mRect, aFrame); } nscoord leftOffset, rightOffset; ComputeReplacedBlockOffsetsForFloats(aFrame, aFloatAvailableSpace.mRect, leftOffset, rightOffset, replacedWidth); aResult.x = borderPadding.left + leftOffset; aResult.width = mContentArea.width - leftOffset - rightOffset; } #ifdef REALLY_NOISY_REFLOW printf(" CBAS: result %d %d %d %d\n", aResult.x, aResult.y, aResult.width, aResult.height); #endif }
/*static*/ void TouchManager::InitializeStatics() { NS_ASSERTION(!gCaptureTouchList, "InitializeStatics called multiple times!"); gCaptureTouchList = new nsRefPtrHashtable<nsUint32HashKey, dom::Touch>; }
void nsHttpPipeline::GetConnectionInfo(nsHttpConnectionInfo **result) { NS_ASSERTION(mConnection, "no connection"); mConnection->GetConnectionInfo(result); }
void SortLayersBy3DZOrder(nsTArray<Layer*>& aLayers) { uint32_t nodeCount = aLayers.Length(); if (nodeCount > MAX_SORTABLE_LAYERS) { return; } DirectedGraph<Layer*> graph; #ifdef DEBUG if (gDumpLayerSortList) { for (uint32_t i = 0; i < nodeCount; i++) { if (aLayers.ElementAt(i)->GetDebugColorIndex() == 0) { aLayers.ElementAt(i)->SetDebugColorIndex(gColorIndex++); if (gColorIndex > 7) { gColorIndex = 1; } } } fprintf(stderr, " --- Layers before sorting: --- \n"); DumpLayerList(aLayers); } #endif // Iterate layers and determine edges. for (uint32_t i = 0; i < nodeCount; i++) { for (uint32_t j = i + 1; j < nodeCount; j++) { Layer* a = aLayers.ElementAt(i); Layer* b = aLayers.ElementAt(j); LayerSortOrder order = CompareDepth(a, b); if (order == ABeforeB) { graph.AddEdge(a, b); } else if (order == BBeforeA) { graph.AddEdge(b, a); } } } #ifdef DEBUG if (gDumpLayerSortList) { fprintf(stderr, " --- Edge List: --- \n"); DumpEdgeList(graph); } #endif // Build a new array using the graph. nsTArray<Layer*> noIncoming; nsTArray<Layer*> sortedList; // Make a list of all layers with no incoming edges. noIncoming.AppendElements(aLayers); const nsTArray<DirectedGraph<Layer*>::Edge>& edges = graph.GetEdgeList(); for (uint32_t i = 0; i < edges.Length(); i++) { noIncoming.RemoveElement(edges.ElementAt(i).mTo); } // Move each item without incoming edges into the sorted list, // and remove edges from it. do { if (!noIncoming.IsEmpty()) { uint32_t last = noIncoming.Length() - 1; Layer* layer = noIncoming.ElementAt(last); MOZ_ASSERT(layer); // don't let null layer pointers sneak into sortedList noIncoming.RemoveElementAt(last); sortedList.AppendElement(layer); nsTArray<DirectedGraph<Layer*>::Edge> outgoing; graph.GetEdgesFrom(layer, outgoing); for (uint32_t i = 0; i < outgoing.Length(); i++) { DirectedGraph<Layer*>::Edge edge = outgoing.ElementAt(i); graph.RemoveEdge(edge); if (!graph.NumEdgesTo(edge.mTo)) { // If this node also has no edges now, add it to the list noIncoming.AppendElement(edge.mTo); } } } // If there are no nodes without incoming edges, but there // are still edges, then we have a cycle. if (noIncoming.IsEmpty() && graph.GetEdgeCount()) { // Find the node with the least incoming edges. uint32_t minEdges = UINT_MAX; Layer* minNode = nullptr; for (uint32_t i = 0; i < aLayers.Length(); i++) { uint32_t edgeCount = graph.NumEdgesTo(aLayers.ElementAt(i)); if (edgeCount && edgeCount < minEdges) { minEdges = edgeCount; minNode = aLayers.ElementAt(i); if (minEdges == 1) { break; } } } if (minNode) { // Remove all of them! graph.RemoveEdgesTo(minNode); noIncoming.AppendElement(minNode); } } } while (!noIncoming.IsEmpty()); NS_ASSERTION(!graph.GetEdgeCount(), "Cycles detected!"); #ifdef DEBUG if (gDumpLayerSortList) { fprintf(stderr, " --- Layers after sorting: --- \n"); DumpLayerList(sortedList); } #endif aLayers.Clear(); aLayers.AppendElements(sortedList); }
void nsHttpPipeline::GetSecurityInfo(nsISupports **result) { NS_ASSERTION(mConnection, "no connection"); mConnection->GetSecurityInfo(result); }
//------------------------------------------------------------------------- // If aFormat is CF_DIB, aMIMEImageFormat must be a type for which we have // an image encoder (e.g. image/png). // For other values of aFormat, it is OK to pass null for aMIMEImageFormat. nsresult nsClipboard::GetNativeDataOffClipboard(IDataObject * aDataObject, UINT aIndex, UINT aFormat, const char * aMIMEImageFormat, void ** aData, PRUint32 * aLen) { nsresult result = NS_ERROR_FAILURE; *aData = nsnull; *aLen = 0; if ( !aDataObject ) return result; UINT format = aFormat; HRESULT hres = S_FALSE; // XXX at the moment we only support global memory transfers // It is here where we will add support for native images // and IStream FORMATETC fe; STGMEDIUM stm; hres = FillSTGMedium(aDataObject, format, &fe, &stm, TYMED_HGLOBAL); // Currently this is only handling TYMED_HGLOBAL data // For Text, Dibs, Files, and generic data (like HTML) if (S_OK == hres) { static CLIPFORMAT fileDescriptorFlavorA = ::RegisterClipboardFormat( CFSTR_FILEDESCRIPTORA ); static CLIPFORMAT fileDescriptorFlavorW = ::RegisterClipboardFormat( CFSTR_FILEDESCRIPTORW ); static CLIPFORMAT fileFlavor = ::RegisterClipboardFormat( CFSTR_FILECONTENTS ); switch (stm.tymed) { case TYMED_HGLOBAL: { switch (fe.cfFormat) { case CF_TEXT: { // Get the data out of the global data handle. The size we return // should not include the null because the other platforms don't // use nulls, so just return the length we get back from strlen(), // since we know CF_TEXT is null terminated. Recall that GetGlobalData() // returns the size of the allocated buffer, not the size of the data // (on 98, these are not the same) so we can't use that. PRUint32 allocLen = 0; if ( NS_SUCCEEDED(GetGlobalData(stm.hGlobal, aData, &allocLen)) ) { *aLen = strlen ( reinterpret_cast<char*>(*aData) ); result = NS_OK; } } break; case CF_UNICODETEXT: { // Get the data out of the global data handle. The size we return // should not include the null because the other platforms don't // use nulls, so just return the length we get back from strlen(), // since we know CF_UNICODETEXT is null terminated. Recall that GetGlobalData() // returns the size of the allocated buffer, not the size of the data // (on 98, these are not the same) so we can't use that. PRUint32 allocLen = 0; if ( NS_SUCCEEDED(GetGlobalData(stm.hGlobal, aData, &allocLen)) ) { *aLen = nsCRT::strlen(reinterpret_cast<PRUnichar*>(*aData)) * 2; result = NS_OK; } } break; case CF_DIB : if (aMIMEImageFormat) { PRUint32 allocLen = 0; unsigned char * clipboardData; if (NS_SUCCEEDED(GetGlobalData(stm.hGlobal, (void **)&clipboardData, &allocLen))) { nsImageFromClipboard converter; nsIInputStream * inputStream; converter.GetEncodedImageStream(clipboardData, aMIMEImageFormat, &inputStream); // addrefs for us, don't release if ( inputStream ) { *aData = inputStream; *aLen = sizeof(nsIInputStream*); result = NS_OK; } } } break; case CF_HDROP : { // in the case of a file drop, multiple files are stashed within a // single data object. In order to match mozilla's D&D apis, we // just pull out the file at the requested index, pretending as // if there really are multiple drag items. HDROP dropFiles = (HDROP) GlobalLock(stm.hGlobal); UINT numFiles = ::DragQueryFileW(dropFiles, 0xFFFFFFFF, NULL, 0); NS_ASSERTION ( numFiles > 0, "File drop flavor, but no files...hmmmm" ); NS_ASSERTION ( aIndex < numFiles, "Asked for a file index out of range of list" ); if (numFiles > 0) { UINT fileNameLen = ::DragQueryFileW(dropFiles, aIndex, nsnull, 0); PRUnichar* buffer = reinterpret_cast<PRUnichar*>(nsMemory::Alloc((fileNameLen + 1) * sizeof(PRUnichar))); if ( buffer ) { ::DragQueryFileW(dropFiles, aIndex, buffer, fileNameLen + 1); *aData = buffer; *aLen = fileNameLen * sizeof(PRUnichar); result = NS_OK; } else result = NS_ERROR_OUT_OF_MEMORY; } GlobalUnlock (stm.hGlobal) ; } break; default: { if ( fe.cfFormat == fileDescriptorFlavorA || fe.cfFormat == fileDescriptorFlavorW || fe.cfFormat == fileFlavor ) { NS_WARNING ( "Mozilla doesn't yet understand how to read this type of file flavor" ); } else { // Get the data out of the global data handle. The size we return // should not include the null because the other platforms don't // use nulls, so just return the length we get back from strlen(), // since we know CF_UNICODETEXT is null terminated. Recall that GetGlobalData() // returns the size of the allocated buffer, not the size of the data // (on 98, these are not the same) so we can't use that. // // NOTE: we are assuming that anything that falls into this default case // is unicode. As we start to get more kinds of binary data, this // may become an incorrect assumption. Stay tuned. PRUint32 allocLen = 0; if ( NS_SUCCEEDED(GetGlobalData(stm.hGlobal, aData, &allocLen)) ) { if ( fe.cfFormat == CF_HTML ) { // CF_HTML is actually UTF8, not unicode, so disregard the assumption // above. We have to check the header for the actual length, and we'll // do that in FindPlatformHTML(). For now, return the allocLen. This // case is mostly to ensure we don't try to call strlen on the buffer. *aLen = allocLen; } else *aLen = nsCRT::strlen(reinterpret_cast<PRUnichar*>(*aData)) * sizeof(PRUnichar); result = NS_OK; } } } break; } // switch } break; case TYMED_GDI: { #ifdef DEBUG PR_LOG(gWin32ClipboardLog, PR_LOG_ALWAYS, ("*********************** TYMED_GDI\n")); #endif } break; default: break; } //switch ReleaseStgMedium(&stm); } return result; }
nsresult nsHttpPipeline::WriteSegments(nsAHttpSegmentWriter *writer, PRUint32 count, PRUint32 *countWritten) { LOG(("nsHttpPipeline::WriteSegments [this=%x count=%u]\n", this, count)); NS_ASSERTION(PR_GetCurrentThread() == gSocketThread, "wrong thread"); if (mClosed) return NS_SUCCEEDED(mStatus) ? NS_BASE_STREAM_CLOSED : mStatus; nsAHttpTransaction *trans; nsresult rv; trans = Response(0); if (!trans) { if (mRequestQ.Length() > 0) rv = NS_BASE_STREAM_WOULD_BLOCK; else rv = NS_BASE_STREAM_CLOSED; } else { // // ask the transaction to consume data from the connection. // PushBack may be called recursively. // rv = trans->WriteSegments(writer, count, countWritten); if (rv == NS_BASE_STREAM_CLOSED || trans->IsDone()) { trans->Close(NS_OK); NS_RELEASE(trans); mResponseQ.RemoveElementAt(0); mResponseIsPartial = false; ++mHttp1xTransactionCount; // ask the connection manager to add additional transactions // to our pipeline. gHttpHandler->ConnMgr()->AddTransactionToPipeline(this); } else mResponseIsPartial = true; } if (mPushBackLen) { nsHttpPushBackWriter writer(mPushBackBuf, mPushBackLen); PRUint32 len = mPushBackLen, n; mPushBackLen = 0; // This progress notification has previously been sent from // the socket transport code, but it was delivered to the // previous transaction on the pipeline. nsITransport *transport = Transport(); if (transport) OnTransportStatus(transport, nsISocketTransport::STATUS_RECEIVING_FROM, mReceivingFromProgress); // the push back buffer is never larger than NS_HTTP_SEGMENT_SIZE, // so we are guaranteed that the next response will eat the entire // push back buffer (even though it might again call PushBack). rv = WriteSegments(&writer, len, &n); } return rv; }
//------------------------------------------------------------------------- nsresult nsClipboard::GetDataFromDataObject(IDataObject * aDataObject, UINT anIndex, nsIWidget * aWindow, nsITransferable * aTransferable) { // make sure we have a good transferable if ( !aTransferable ) return NS_ERROR_INVALID_ARG; nsresult res = NS_ERROR_FAILURE; // get flavor list that includes all flavors that can be written (including ones // obtained through conversion) nsCOMPtr<nsISupportsArray> flavorList; res = aTransferable->FlavorsTransferableCanImport ( getter_AddRefs(flavorList) ); if ( NS_FAILED(res) ) return NS_ERROR_FAILURE; // Walk through flavors and see which flavor is on the clipboard them on the native clipboard, PRUint32 i; PRUint32 cnt; flavorList->Count(&cnt); for (i=0;i<cnt;i++) { nsCOMPtr<nsISupports> genericFlavor; flavorList->GetElementAt ( i, getter_AddRefs(genericFlavor) ); nsCOMPtr<nsISupportsCString> currentFlavor ( do_QueryInterface(genericFlavor) ); if ( currentFlavor ) { nsXPIDLCString flavorStr; currentFlavor->ToString(getter_Copies(flavorStr)); UINT format = GetFormat(flavorStr); // Try to get the data using the desired flavor. This might fail, but all is // not lost. void* data = nsnull; PRUint32 dataLen = 0; PRBool dataFound = PR_FALSE; if (nsnull != aDataObject) { if ( NS_SUCCEEDED(GetNativeDataOffClipboard(aDataObject, anIndex, format, flavorStr, &data, &dataLen)) ) dataFound = PR_TRUE; } else if (nsnull != aWindow) { if ( NS_SUCCEEDED(GetNativeDataOffClipboard(aWindow, anIndex, format, &data, &dataLen)) ) dataFound = PR_TRUE; } // This is our second chance to try to find some data, having not found it // when directly asking for the flavor. Let's try digging around in other // flavors to help satisfy our craving for data. if ( !dataFound ) { if ( strcmp(flavorStr, kUnicodeMime) == 0 ) dataFound = FindUnicodeFromPlainText ( aDataObject, anIndex, &data, &dataLen ); else if ( strcmp(flavorStr, kURLMime) == 0 ) { // drags from other windows apps expose the native // CFSTR_INETURL{A,W} flavor dataFound = FindURLFromNativeURL ( aDataObject, anIndex, &data, &dataLen ); if ( !dataFound ) dataFound = FindURLFromLocalFile ( aDataObject, anIndex, &data, &dataLen ); } } // if we try one last ditch effort to find our data // Hopefully by this point we've found it and can go about our business if ( dataFound ) { nsCOMPtr<nsISupports> genericDataWrapper; if ( strcmp(flavorStr, kFileMime) == 0 ) { // we have a file path in |data|. Create an nsLocalFile object. nsDependentString filepath(reinterpret_cast<PRUnichar*>(data)); nsCOMPtr<nsILocalFile> file; if ( NS_SUCCEEDED(NS_NewLocalFile(filepath, PR_FALSE, getter_AddRefs(file))) ) genericDataWrapper = do_QueryInterface(file); nsMemory::Free(data); } else if ( strcmp(flavorStr, kNativeHTMLMime) == 0) { // the editor folks want CF_HTML exactly as it's on the clipboard, no conversions, // no fancy stuff. Pull it off the clipboard, stuff it into a wrapper and hand // it back to them. if ( FindPlatformHTML(aDataObject, anIndex, &data, &dataLen) ) nsPrimitiveHelpers::CreatePrimitiveForData ( flavorStr, data, dataLen, getter_AddRefs(genericDataWrapper) ); else { nsMemory::Free(data); continue; // something wrong with this flavor, keep looking for other data } nsMemory::Free(data); } else if ( strcmp(flavorStr, kJPEGImageMime) == 0 || strcmp(flavorStr, kPNGImageMime) == 0) { nsIInputStream * imageStream = reinterpret_cast<nsIInputStream*>(data); genericDataWrapper = do_QueryInterface(imageStream); NS_IF_RELEASE(imageStream); } else { // we probably have some form of text. The DOM only wants LF, so convert from Win32 line // endings to DOM line endings. PRInt32 signedLen = static_cast<PRInt32>(dataLen); nsLinebreakHelpers::ConvertPlatformToDOMLinebreaks ( flavorStr, &data, &signedLen ); dataLen = signedLen; nsPrimitiveHelpers::CreatePrimitiveForData ( flavorStr, data, dataLen, getter_AddRefs(genericDataWrapper) ); nsMemory::Free(data); } NS_ASSERTION ( genericDataWrapper, "About to put null data into the transferable" ); aTransferable->SetTransferData(flavorStr, genericDataWrapper, dataLen); res = NS_OK; // we found one, get out of the loop break; } } } // foreach flavor return res; }
NS_IMETHODIMP nsXPInstallManager::OnStopRequest(nsIRequest *request, nsISupports *ctxt, nsresult status) { nsresult rv; switch( status ) { case NS_BINDING_SUCCEEDED: NS_ASSERTION( mItem->mOutStream, "XPIManager: output stream doesn't exist"); rv = NS_OK; break; case NS_BINDING_FAILED: case NS_BINDING_ABORTED: rv = status; // XXX need to note failure, both to send back status // to the callback, and also so we don't try to install // this probably corrupt file. break; default: rv = NS_ERROR_ILLEGAL_VALUE; } NS_ASSERTION( mItem, "Bad state in XPIManager"); if ( mItem && mItem->mOutStream ) { mItem->mOutStream->Close(); mItem->mOutStream = nsnull; } if (NS_FAILED(rv) || mCancelled) { // Download error! // -- first clean up partially downloaded file if ( mItem && mItem->mFile ) { PRBool flagExists; nsresult rv2 ; rv2 = mItem->mFile->Exists(&flagExists); if (NS_SUCCEEDED(rv2) && flagExists) mItem->mFile->Remove(PR_FALSE); mItem->mFile = 0; } // -- then notify interested parties PRInt32 errorcode = mCancelled ? nsInstall::USER_CANCELLED : nsInstall::DOWNLOAD_ERROR; if (mDlg) mDlg->OnStateChange( mNextItem-1, nsIXPIProgressDialog::INSTALL_DONE, errorcode ); if (mItem) mTriggers->SendStatus( mItem->mURL.get(), errorcode ); } else if (mDlg) { mDlg->OnStateChange( mNextItem-1, nsIXPIProgressDialog::DOWNLOAD_DONE, 0); } DownloadNext(); return rv; }
/* * This is for IRIX N32 ABI * * When we're called, the "gp" registers are stored in gprData and * the "fp" registers are stored in fprData. There are 8 regs * available which coorespond to the first 7 parameters of the * function and the "this" pointer. If there are additional parms, * they are stored on the stack at address "args". * */ extern "C" nsresult PrepareAndDispatch(nsXPTCStubBase* self, PRUint32 methodIndex, PRUint64* args, PRUint64 *gprData, double *fprData) { #define PARAM_BUFFER_COUNT 16 #define PARAM_GPR_COUNT 7 #define PARAM_FPR_COUNT 7 nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT]; nsXPTCMiniVariant* dispatchParams = NULL; nsIInterfaceInfo* iface_info = NULL; const nsXPTMethodInfo* info; PRUint8 paramCount; PRUint8 i; nsresult result = NS_ERROR_FAILURE; NS_ASSERTION(self,"no self"); self->GetInterfaceInfo(&iface_info); NS_ASSERTION(iface_info,"no interface info"); iface_info->GetMethodInfo(PRUint16(methodIndex), &info); NS_ASSERTION(info,"no interface info"); paramCount = info->GetParamCount(); // setup variant array pointer if(paramCount > PARAM_BUFFER_COUNT) dispatchParams = new nsXPTCMiniVariant[paramCount]; else dispatchParams = paramBuffer; NS_ASSERTION(dispatchParams,"no place for params"); PRUint64* ap = args; PRUint32 iCount = 0; for(i = 0; i < paramCount; i++) { const nsXPTParamInfo& param = info->GetParam(i); const nsXPTType& type = param.GetType(); nsXPTCMiniVariant* dp = &dispatchParams[i]; if(param.IsOut() || !type.IsArithmetic()) { if (iCount < PARAM_GPR_COUNT) dp->val.p = (void*)gprData[iCount++]; else dp->val.p = (void*)*ap++; continue; } // else switch(type) { case nsXPTType::T_I8: if (iCount < PARAM_GPR_COUNT) dp->val.i8 = (PRInt8)gprData[iCount++]; else dp->val.i8 = (PRInt8)*ap++; break; case nsXPTType::T_I16: if (iCount < PARAM_GPR_COUNT) dp->val.i16 = (PRInt16)gprData[iCount++]; else dp->val.i16 = (PRInt16)*ap++; break; case nsXPTType::T_I32: if (iCount < PARAM_GPR_COUNT) dp->val.i32 = (PRInt32)gprData[iCount++]; else dp->val.i32 = (PRInt32)*ap++; break; case nsXPTType::T_I64: if (iCount < PARAM_GPR_COUNT) dp->val.i64 = (PRInt64)gprData[iCount++]; else dp->val.i64 = (PRInt64)*ap++; break; case nsXPTType::T_U8: if (iCount < PARAM_GPR_COUNT) dp->val.u8 = (PRUint8)gprData[iCount++]; else dp->val.u8 = (PRUint8)*ap++; break; case nsXPTType::T_U16: if (iCount < PARAM_GPR_COUNT) dp->val.u16 = (PRUint16)gprData[iCount++]; else dp->val.u16 = (PRUint16)*ap++; break; case nsXPTType::T_U32: if (iCount < PARAM_GPR_COUNT) dp->val.u32 = (PRUint32)gprData[iCount++]; else dp->val.u32 = (PRUint32)*ap++; break; case nsXPTType::T_U64: if (iCount < PARAM_GPR_COUNT) dp->val.u64 = (PRUint64)gprData[iCount++]; else dp->val.u64 = (PRUint64)*ap++; break; case nsXPTType::T_FLOAT: if (iCount < PARAM_FPR_COUNT) dp->val.f = (double)fprData[iCount++]; else dp->val.f = *((double*)ap++); break; case nsXPTType::T_DOUBLE: if (iCount < PARAM_FPR_COUNT) dp->val.d = (double)fprData[iCount++]; else dp->val.d = *((double*)ap++); break; case nsXPTType::T_BOOL: if (iCount < PARAM_GPR_COUNT) dp->val.b = (PRBool)gprData[iCount++]; else dp->val.b = (PRBool)*ap++; break; case nsXPTType::T_CHAR: if (iCount < PARAM_GPR_COUNT) dp->val.c = (char)gprData[iCount++]; else dp->val.c = (char)*ap++; break; case nsXPTType::T_WCHAR: if (iCount < PARAM_GPR_COUNT) dp->val.wc = (wchar_t)gprData[iCount++]; else dp->val.wc = (wchar_t)*ap++; break; default: NS_ASSERTION(0, "bad type"); break; } } result = self->CallMethod((PRUint16)methodIndex, info, dispatchParams); NS_RELEASE(iface_info); if(dispatchParams != paramBuffer) delete [] dispatchParams; return result; }
NS_IMETHODIMP nsXPInstallManager::OpenProgressDialog(const PRUnichar **aPackageList, PRUint32 aCount, nsIObserver *aObserver) { // --- convert parameters into nsISupportArray members nsCOMPtr<nsIDialogParamBlock> list; nsresult rv = LoadParams( aCount, aPackageList, getter_AddRefs(list) ); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsISupportsInterfacePointer> listwrap(do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID)); if (listwrap) { listwrap->SetData(list); listwrap->SetDataIID(&NS_GET_IID(nsIDialogParamBlock)); } nsCOMPtr<nsISupportsInterfacePointer> callbackwrap(do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID)); if (callbackwrap) { callbackwrap->SetData(aObserver); callbackwrap->SetDataIID(&NS_GET_IID(nsIObserver)); } nsCOMPtr<nsISupportsArray> params(do_CreateInstance(NS_SUPPORTSARRAY_CONTRACTID)); if ( !params || !listwrap || !callbackwrap ) return NS_ERROR_FAILURE; params->AppendElement(listwrap); params->AppendElement(callbackwrap); // --- open the window nsCOMPtr<nsIWindowWatcher> wwatch(do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv)); if (!wwatch) return rv; char *statusDialogURL, *statusDialogType; nsCOMPtr<nsIPrefBranch> pref(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (!pref) return rv; const char* statusDlg = mChromeType == CHROME_SKIN ? PREF_XPINSTALL_STATUS_DLG_SKIN : PREF_XPINSTALL_STATUS_DLG_CHROME; rv = pref->GetCharPref(statusDlg, &statusDialogURL); NS_ASSERTION(NS_SUCCEEDED(rv), "Can't invoke XPInstall FE without a FE URL! Set xpinstall.dialog.status"); if (NS_FAILED(rv)) return rv; const char* statusType = mChromeType == CHROME_SKIN ? PREF_XPINSTALL_STATUS_DLG_TYPE_SKIN : PREF_XPINSTALL_STATUS_DLG_TYPE_CHROME; rv = pref->GetCharPref(statusType, &statusDialogType); nsAutoString type; type.AssignWithConversion(statusDialogType); if (NS_SUCCEEDED(rv) && !type.IsEmpty()) { nsCOMPtr<nsIWindowMediator> wm = do_GetService(NS_WINDOWMEDIATOR_CONTRACTID); nsCOMPtr<nsIDOMWindowInternal> recentWindow; wm->GetMostRecentWindow(type.get(), getter_AddRefs(recentWindow)); if (recentWindow) { nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService(); os->NotifyObservers(params, "xpinstall-download-started", nsnull); recentWindow->Focus(); return NS_OK; } } nsCOMPtr<nsIDOMWindow> newWindow; rv = wwatch->OpenWindow(0, statusDialogURL, "_blank", "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable", params, getter_AddRefs(newWindow)); return rv; }
nsresult SVGLengthListSMILType::ComputeDistance(const nsSMILValue& aFrom, const nsSMILValue& aTo, double& aDistance) const { NS_PRECONDITION(aFrom.mType == this, "Unexpected SMIL type"); NS_PRECONDITION(aTo.mType == this, "Incompatible SMIL type"); const SVGLengthListAndInfo& from = *static_cast<const SVGLengthListAndInfo*>(aFrom.mU.mPtr); const SVGLengthListAndInfo& to = *static_cast<const SVGLengthListAndInfo*>(aTo.mU.mPtr); // To understand this code, see the comments documenting our Init() method, // and documenting SVGLengthListAndInfo::CanZeroPadList(). NS_ASSERTION((from.CanZeroPadList() == to.CanZeroPadList()) || (from.CanZeroPadList() && from.IsEmpty()) || (to.CanZeroPadList() && to.IsEmpty()), "Only \"zero\" nsSMILValues from the SMIL engine should " "return PR_TRUE for CanZeroPadList() when the attribute " "being animated can't be zero padded"); if ((from.Length() < to.Length() && !from.CanZeroPadList()) || (to.Length() < from.Length() && !to.CanZeroPadList())) { // nsSVGUtils::ReportToConsole return NS_ERROR_FAILURE; } // We return the root of the sum of the squares of the deltas between the // user unit values of the lengths at each correspanding index. In the // general case, paced animation is probably not useful, but this strategy at // least does the right thing for paced animation in the face of simple // 'values' lists such as: // // values="100 200 300; 101 201 301; 110 210 310" // // I.e. half way through the simple duration we'll get "105 205 305". double total = 0.0; PRUint32 i = 0; for (; i < from.Length() && i < to.Length(); ++i) { double f = from[i].GetValueInUserUnits(from.Element(), from.Axis()); double t = to[i].GetValueInUserUnits(to.Element(), to.Axis()); double delta = t - f; total += delta * delta; } // In the case that from.Length() != to.Length(), one of the following loops // will run. (OK since CanZeroPadList()==true for the other list.) for (; i < from.Length(); ++i) { double f = from[i].GetValueInUserUnits(from.Element(), from.Axis()); total += f * f; } for (; i < to.Length(); ++i) { double t = to[i].GetValueInUserUnits(to.Element(), to.Axis()); total += t * t; } float distance = sqrt(total); if (!NS_FloatIsFinite(distance)) { return NS_ERROR_FAILURE; } aDistance = distance; return NS_OK; }
// static XPCWrappedNativeProto* XPCWrappedNativeProto::GetNewOrUsed(XPCCallContext& ccx, XPCWrappedNativeScope* Scope, nsIClassInfo* ClassInfo, const XPCNativeScriptableCreateInfo* ScriptableCreateInfo, JSBool ForceNoSharing, JSBool isGlobal, QITableEntry* offsets) { NS_ASSERTION(Scope, "bad param"); NS_ASSERTION(ClassInfo, "bad param"); AutoMarkingWrappedNativeProtoPtr proto(ccx); ClassInfo2WrappedNativeProtoMap* map = nsnull; XPCLock* lock = nsnull; JSBool shared; JSUint32 ciFlags; if(NS_FAILED(ClassInfo->GetFlags(&ciFlags))) ciFlags = 0; if(ciFlags & XPC_PROTO_DONT_SHARE) { NS_ERROR("reserved flag set!"); ciFlags &= ~XPC_PROTO_DONT_SHARE; } if(ForceNoSharing || (ciFlags & nsIClassInfo::PLUGIN_OBJECT) || (ScriptableCreateInfo && ScriptableCreateInfo->GetFlags().DontSharePrototype())) { ciFlags |= XPC_PROTO_DONT_SHARE; shared = JS_FALSE; } else { shared = JS_TRUE; } if(shared) { JSBool mainThreadOnly = !!(ciFlags & nsIClassInfo::MAIN_THREAD_ONLY); map = Scope->GetWrappedNativeProtoMap(mainThreadOnly); lock = mainThreadOnly ? nsnull : Scope->GetRuntime()->GetMapLock(); { // scoped lock XPCAutoLock al(lock); proto = map->Find(ClassInfo); if(proto) return proto; } } AutoMarkingNativeSetPtr set(ccx); set = XPCNativeSet::GetNewOrUsed(ccx, ClassInfo); if(!set) return nsnull; proto = new XPCWrappedNativeProto(Scope, ClassInfo, ciFlags, set, offsets); if(!proto || !proto->Init(ccx, isGlobal, ScriptableCreateInfo)) { delete proto.get(); return nsnull; } if(shared) { // scoped lock XPCAutoLock al(lock); map->Add(ClassInfo, proto); } return proto; }
nsresult SVGLengthListSMILType::Interpolate(const nsSMILValue& aStartVal, const nsSMILValue& aEndVal, double aUnitDistance, nsSMILValue& aResult) const { NS_PRECONDITION(aStartVal.mType == aEndVal.mType, "Trying to interpolate different types"); NS_PRECONDITION(aStartVal.mType == this, "Unexpected types for interpolation"); NS_PRECONDITION(aResult.mType == this, "Unexpected result type"); const SVGLengthListAndInfo& start = *static_cast<const SVGLengthListAndInfo*>(aStartVal.mU.mPtr); const SVGLengthListAndInfo& end = *static_cast<const SVGLengthListAndInfo*>(aEndVal.mU.mPtr); SVGLengthListAndInfo& result = *static_cast<SVGLengthListAndInfo*>(aResult.mU.mPtr); // To understand this code, see the comments documenting our Init() method, // and documenting SVGLengthListAndInfo::CanZeroPadList(). NS_ASSERTION((start.CanZeroPadList() == end.CanZeroPadList()) || (start.CanZeroPadList() && start.IsEmpty()) || (end.CanZeroPadList() && end.IsEmpty()), "Only \"zero\" nsSMILValues from the SMIL engine should " "return PR_TRUE for CanZeroPadList() when the attribute " "being animated can't be zero padded"); if ((start.Length() < end.Length() && !start.CanZeroPadList()) || (end.Length() < start.Length() && !end.CanZeroPadList())) { // nsSVGUtils::ReportToConsole return NS_ERROR_FAILURE; } if (!result.SetLength(NS_MAX(start.Length(), end.Length()))) { return NS_ERROR_OUT_OF_MEMORY; } PRUint32 i = 0; for (; i < start.Length() && i < end.Length(); ++i) { float s; if (start[i].GetUnit() == end[i].GetUnit()) { s = start[i].GetValueInCurrentUnits(); } else { // If units differ, we use the unit of the item in 'end'. // We leave it to the frame code to check that values are finite. s = start[i].GetValueInSpecifiedUnit(end[i].GetUnit(), end.Element(), end.Axis()); } float e = end[i].GetValueInCurrentUnits(); result[i].SetValueAndUnit(s + (e - s) * aUnitDistance, end[i].GetUnit()); } // In the case that start.Length() != end.Length(), one of the following // loops will run. (Okay, since CanZeroPadList()==true for the other list.) for (; i < start.Length(); ++i) { result[i].SetValueAndUnit(start[i].GetValueInCurrentUnits() - start[i].GetValueInCurrentUnits() * aUnitDistance, start[i].GetUnit()); } for (; i < end.Length(); ++i) { result[i].SetValueAndUnit(end[i].GetValueInCurrentUnits() * aUnitDistance, end[i].GetUnit()); } // propagate target element info! result.SetInfo(end.Element(), end.Axis(), start.CanZeroPadList() && end.CanZeroPadList()); return NS_OK; }
int main(int argc, char **argv) { nsresult rv; char *lastSlash; char iniPath[MAXPATHLEN]; char tmpPath[MAXPATHLEN]; char greDir[MAXPATHLEN]; bool greFound = false; #if defined(XP_MACOSX) CFBundleRef appBundle = CFBundleGetMainBundle(); if (!appBundle) return 1; CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(appBundle); if (!resourcesURL) return 1; CFURLRef absResourcesURL = CFURLCopyAbsoluteURL(resourcesURL); CFRelease(resourcesURL); if (!absResourcesURL) return 1; CFURLRef iniFileURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorDefault, absResourcesURL, CFSTR("application.ini"), false); CFRelease(absResourcesURL); if (!iniFileURL) return 1; CFStringRef iniPathStr = CFURLCopyFileSystemPath(iniFileURL, kCFURLPOSIXPathStyle); CFRelease(iniFileURL); if (!iniPathStr) return 1; CFStringGetCString(iniPathStr, iniPath, sizeof(iniPath), kCFStringEncodingUTF8); CFRelease(iniPathStr); #else #ifdef XP_WIN wchar_t wide_path[MAX_PATH]; if (!::GetModuleFileNameW(NULL, wide_path, MAX_PATH)) return 1; WideCharToMultiByte(CP_UTF8, 0, wide_path,-1, iniPath, MAX_PATH, NULL, NULL); #elif defined(XP_OS2) PPIB ppib; PTIB ptib; DosGetInfoBlocks(&ptib, &ppib); DosQueryModuleName(ppib->pib_hmte, sizeof(iniPath), iniPath); #else // on unix, there is no official way to get the path of the current binary. // instead of using the MOZILLA_FIVE_HOME hack, which doesn't scale to // multiple applications, we will try a series of techniques: // // 1) use realpath() on argv[0], which works unless we're loaded from the // PATH // 2) manually walk through the PATH and look for ourself // 3) give up struct stat fileStat; strncpy(tmpPath, argv[0], sizeof(tmpPath)); lastSlash = strrchr(tmpPath, '/'); if (lastSlash) { *lastSlash = 0; realpath(tmpPath, iniPath); } else { const char *path = getenv("PATH"); if (!path) return 1; char *pathdup = strdup(path); if (!pathdup) return 1; bool found = false; char *token = strtok(pathdup, ":"); while (token) { sprintf(tmpPath, "%s/%s", token, argv[0]); if (stat(tmpPath, &fileStat) == 0) { found = true; lastSlash = strrchr(tmpPath, '/'); *lastSlash = 0; realpath(tmpPath, iniPath); break; } token = strtok(NULL, ":"); } free (pathdup); if (!found) return 1; } lastSlash = iniPath + strlen(iniPath); *lastSlash = '/'; #endif #ifndef XP_UNIX lastSlash = strrchr(iniPath, PATH_SEPARATOR_CHAR); if (!lastSlash) return 1; #endif *(++lastSlash) = '\0'; // On Linux/Win, look for XULRunner in appdir/xulrunner snprintf(greDir, sizeof(greDir), "%sxulrunner" XPCOM_FILE_PATH_SEPARATOR XPCOM_DLL, iniPath); greFound = FolderExists(greDir); #ifdef XP_UNIX if (greFound) { char resolved_greDir[MAXPATHLEN] = ""; if (realpath(greDir, resolved_greDir) && *resolved_greDir) { strncpy(greDir, resolved_greDir, MAXPATHLEN); } } #endif strncpy(lastSlash, "application.ini", sizeof(iniPath) - (lastSlash - iniPath)); #endif // If -app parameter was passed in, it is now time to take it under // consideration. const char *appDataFile; appDataFile = getenv("XUL_APP_FILE"); if (!appDataFile || !*appDataFile) if (argc > 1 && IsArg(argv[1], "app")) { if (argc == 2) { Output(false, "specify APP-FILE (optional)\n"); return 1; } argv[1] = argv[0]; ++argv; --argc; appDataFile = argv[1]; argv[1] = argv[0]; ++argv; --argc; char kAppEnv[MAXPATHLEN]; snprintf(kAppEnv, MAXPATHLEN, "XUL_APP_FILE=%s", appDataFile); if (putenv(kAppEnv)) Output(false, "Couldn't set %s.\n", kAppEnv); char *result = (char*) calloc(sizeof(char), MAXPATHLEN); if (NS_FAILED(GetRealPath(appDataFile, &result))) { Output(true, "Invalid application.ini path.\n"); return 1; } // We have a valid application.ini path passed in to the -app parameter // but not yet a valid greDir, so lets look for it also on the same folder // as the stub. if (!greFound) { lastSlash = strrchr(iniPath, PATH_SEPARATOR_CHAR); if (!lastSlash) return 1; *(++lastSlash) = '\0'; snprintf(greDir, sizeof(greDir), "%s" XPCOM_DLL, iniPath); greFound = FolderExists(greDir); } // copy it back. strcpy(iniPath, result); } nsINIParser parser; rv = parser.Init(iniPath); if (NS_FAILED(rv)) { fprintf(stderr, "Could not read application.ini\n"); return 1; } if (!greFound) { #ifdef XP_MACOSX // Check for <bundle>/Contents/Frameworks/XUL.framework/libxpcom.dylib CFURLRef fwurl = CFBundleCopyPrivateFrameworksURL(appBundle); CFURLRef absfwurl = nullptr; if (fwurl) { absfwurl = CFURLCopyAbsoluteURL(fwurl); CFRelease(fwurl); } if (absfwurl) { CFURLRef xulurl = CFURLCreateCopyAppendingPathComponent(NULL, absfwurl, CFSTR("XUL.framework"), true); if (xulurl) { CFURLRef xpcomurl = CFURLCreateCopyAppendingPathComponent(NULL, xulurl, CFSTR("libxpcom.dylib"), false); if (xpcomurl) { char tbuffer[MAXPATHLEN]; if (CFURLGetFileSystemRepresentation(xpcomurl, true, (UInt8*) tbuffer, sizeof(tbuffer)) && access(tbuffer, R_OK | X_OK) == 0) { if (realpath(tbuffer, greDir)) { greFound = true; } else { greDir[0] = '\0'; } } CFRelease(xpcomurl); } CFRelease(xulurl); } CFRelease(absfwurl); } #endif if (!greFound) { Output(false, "Could not find the Mozilla runtime.\n"); return 1; } } #ifdef XP_OS2 // On OS/2 we need to set BEGINLIBPATH to be able to find XULRunner DLLs strcpy(tmpPath, greDir); lastSlash = strrchr(tmpPath, PATH_SEPARATOR_CHAR); if (lastSlash) { *lastSlash = '\0'; } DosSetExtLIBPATH(tmpPath, BEGIN_LIBPATH); #endif rv = XPCOMGlueStartup(greDir); if (NS_FAILED(rv)) { if (rv == NS_ERROR_OUT_OF_MEMORY) { char applicationName[2000] = "this application"; parser.GetString("App", "Name", applicationName, sizeof(applicationName)); Output(true, "Not enough memory available to start %s.\n", applicationName); } else { Output(true, "Couldn't load XPCOM.\n"); } return 1; } static const nsDynamicFunctionLoad kXULFuncs[] = { { "XRE_CreateAppData", (NSFuncPtr*) &XRE_CreateAppData }, { "XRE_FreeAppData", (NSFuncPtr*) &XRE_FreeAppData }, { "XRE_main", (NSFuncPtr*) &XRE_main }, { nullptr, nullptr } }; rv = XPCOMGlueLoadXULFunctions(kXULFuncs); if (NS_FAILED(rv)) { Output(true, "Couldn't load XRE functions.\n"); return 1; } NS_LogInit(); int retval; { // Scope COMPtr and AutoAppData nsCOMPtr<nsIFile> iniFile; #ifdef XP_WIN // On Windows iniPath is UTF-8 encoded so we need to convert it. rv = NS_NewLocalFile(NS_ConvertUTF8toUTF16(iniPath), false, getter_AddRefs(iniFile)); #else rv = NS_NewNativeLocalFile(nsDependentCString(iniPath), false, getter_AddRefs(iniFile)); #endif if (NS_FAILED(rv)) { Output(true, "Couldn't find application.ini file.\n"); return 1; } AutoAppData appData(iniFile); if (!appData) { Output(true, "Error: couldn't parse application.ini.\n"); return 1; } NS_ASSERTION(appData->directory, "Failed to get app directory."); if (!appData->xreDirectory) { // chop "libxul.so" off the GRE path lastSlash = strrchr(greDir, PATH_SEPARATOR_CHAR); if (lastSlash) { *lastSlash = '\0'; } #ifdef XP_WIN // same as iniPath. NS_NewLocalFile(NS_ConvertUTF8toUTF16(greDir), false, &appData->xreDirectory); #else NS_NewNativeLocalFile(nsDependentCString(greDir), false, &appData->xreDirectory); #endif } retval = XRE_main(argc, argv, appData, 0); } NS_LogTerm(); return retval; }
NS_IMETHODIMP AsyncEncodeAndWriteIcon::Run() { NS_PRECONDITION(!NS_IsMainThread(), "Should not be called on the main thread."); // Get the recommended icon width and height, or if failure to obtain // these settings, fall back to 16x16 ICOs. These values can be different // if the user has a different DPI setting other than 100%. // Windows would scale the 16x16 icon themselves, but it's better // we let our ICO encoder do it. nsCOMPtr<nsIInputStream> iconStream; nsRefPtr<imgIEncoder> encoder = do_CreateInstance("@mozilla.org/image/encoder;2?" "type=image/vnd.microsoft.icon"); NS_ENSURE_TRUE(encoder, NS_ERROR_FAILURE); nsresult rv = encoder->InitFromData(mBuffer, mBufferLength, mWidth, mHeight, mStride, imgIEncoder::INPUT_FORMAT_HOSTARGB, EmptyString()); NS_ENSURE_SUCCESS(rv, rv); CallQueryInterface(encoder.get(), getter_AddRefs(iconStream)); if (!iconStream) { return NS_ERROR_FAILURE; } NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIFile> icoFile = do_CreateInstance("@mozilla.org/file/local;1"); NS_ENSURE_TRUE(icoFile, NS_ERROR_FAILURE); rv = icoFile->InitWithPath(mIconPath); // Setup the output stream for the ICO file on disk nsCOMPtr<nsIOutputStream> outputStream; rv = NS_NewLocalFileOutputStream(getter_AddRefs(outputStream), icoFile); NS_ENSURE_SUCCESS(rv, rv); // Obtain the ICO buffer size from the re-encoded ICO stream uint64_t bufSize64; rv = iconStream->Available(&bufSize64); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(bufSize64 <= UINT32_MAX, NS_ERROR_FILE_TOO_BIG); uint32_t bufSize = (uint32_t)bufSize64; // Setup a buffered output stream from the stream object // so that we can simply use WriteFrom with the stream object nsCOMPtr<nsIOutputStream> bufferedOutputStream; rv = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), outputStream, bufSize); NS_ENSURE_SUCCESS(rv, rv); // Write out the icon stream to disk and make sure we wrote everything uint32_t wrote; rv = bufferedOutputStream->WriteFrom(iconStream, bufSize, &wrote); NS_ASSERTION(bufSize == wrote, "Icon wrote size should be equal to requested write size"); // Cleanup bufferedOutputStream->Close(); outputStream->Close(); if (mURLShortcut) { SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0); } return rv; }
/** * See sbIMediaList */ NS_IMETHODIMP sbLocalDatabaseMediaListBase::EnumerateItemsByProperties(sbIPropertyArray* aProperties, sbIMediaListEnumerationListener* aEnumerationListener, PRUint16 aEnumerationType) { NS_ENSURE_ARG_POINTER(aProperties); NS_ENSURE_ARG_POINTER(aEnumerationListener); PRUint32 propertyCount; nsresult rv = aProperties->GetLength(&propertyCount); NS_ENSURE_SUCCESS(rv, rv); // It doesn't make sense to call this method without specifying any properties // so it is probably a caller error if we have none. NS_ENSURE_STATE(propertyCount); // The guidArray needs AddFilter called only once per property with an // enumerator that contains all the values. We were given an array of // id/value pairs, so this is a little tricky. We make a hash table that // uses the property id for a key and an array of values as its data. Then // we load the arrays in a loop and finally call AddFilter as an enumeration // function. sbStringArrayHash propertyHash; // Init with the propertyCount as the number of buckets to create. This will // probably be too many, but it's likely less than the default of 16. propertyHash.Init(propertyCount); nsCOMPtr<sbIPropertyManager> propMan = do_GetService(SB_PROPERTYMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); // Load the hash table with properties from the array. for (PRUint32 index = 0; index < propertyCount; index++) { // Get the property. nsCOMPtr<sbIProperty> property; rv = aProperties->GetPropertyAt(index, getter_AddRefs(property)); SB_CONTINUE_IF_FAILED(rv); // Get the id of the property. This will be the key for the hash table. nsString propertyID; rv = property->GetId(propertyID); SB_CONTINUE_IF_FAILED(rv); // Get the string array associated with the key. If it doesn't yet exist // then we need to create it. sbStringArray* stringArray; bool arrayExists = propertyHash.Get(propertyID, &stringArray); if (!arrayExists) { NS_NEWXPCOM(stringArray, sbStringArray); SB_CONTINUE_IF_FALSE(stringArray); // Try to add the array to the hash table. bool success = propertyHash.Put(propertyID, stringArray); if (!success) { NS_WARNING("Failed to add string array to property hash!"); // Make sure to delete the new array, otherwise it will leak. NS_DELETEXPCOM(stringArray); continue; } } NS_ASSERTION(stringArray, "Must have a valid pointer here!"); // Now we need a slot for the property value. nsString* valueString = stringArray->AppendElement(); SB_CONTINUE_IF_FALSE(valueString); // Make the value sortable and assign it nsCOMPtr<sbIPropertyInfo> info; rv = propMan->GetPropertyInfo(propertyID, getter_AddRefs(info)); SB_CONTINUE_IF_FAILED(rv); nsAutoString value; rv = property->GetValue(value); SB_CONTINUE_IF_FAILED(rv); nsAutoString sortableValue; rv = info->MakeSortable(value, *valueString); SB_CONTINUE_IF_FAILED(rv); } switch (aEnumerationType) { case sbIMediaList::ENUMERATIONTYPE_LOCKING: { NS_ENSURE_TRUE(mFullArrayMonitor, NS_ERROR_FAILURE); nsAutoMonitor mon(mFullArrayMonitor); // Don't reenter! NS_ENSURE_FALSE(mLockedEnumerationActive, NS_ERROR_FAILURE); mLockedEnumerationActive = PR_TRUE; PRUint16 stepResult; rv = aEnumerationListener->OnEnumerationBegin(this, &stepResult); if (NS_SUCCEEDED(rv)) { if (stepResult == sbIMediaListEnumerationListener::CONTINUE) { rv = EnumerateItemsByPropertiesInternal(&propertyHash, aEnumerationListener); } else { // The user cancelled the enumeration. rv = NS_ERROR_ABORT; } } mLockedEnumerationActive = PR_FALSE; } break; // ENUMERATIONTYPE_LOCKING case sbIMediaList::ENUMERATIONTYPE_SNAPSHOT: { PRUint16 stepResult; rv = aEnumerationListener->OnEnumerationBegin(this, &stepResult); if (NS_SUCCEEDED(rv)) { if (stepResult == sbIMediaListEnumerationListener::CONTINUE) { rv = EnumerateItemsByPropertiesInternal(&propertyHash, aEnumerationListener); } else { // The user cancelled the enumeration. rv = NS_ERROR_ABORT; } } } break; // ENUMERATIONTYPE_SNAPSHOT default: { NS_NOTREACHED("Invalid enumeration type"); rv = NS_ERROR_INVALID_ARG; } break; } aEnumerationListener->OnEnumerationEnd(this, rv); return NS_OK; }
bool GStreamerFormatHelper::CanHandleCodecCaps(GstCaps* aCaps) { NS_ASSERTION(sLoadOK, "GStreamer library not linked"); return gst_caps_can_intersect(aCaps, mSupportedCodecCaps); }