//---------------------------------------------------------------------- // IDP Async //---------------------------------------------------------------------- // An async request from the client code // It is translated into an async request into child paginator private object _GetPageAsyncDelegate(object arg) { DocumentsTrace.FixedDocumentSequence.IDF.Trace(string.Format("_GetPageAsyncDelegate")); GetPageAsyncRequest asyncRequest = (GetPageAsyncRequest)arg; int pageNumber = asyncRequest.Page.PageNumber; if (asyncRequest.Cancelled || !TranslatePageNumber(pageNumber, out asyncRequest.Page.ChildPaginator, out asyncRequest.Page.ChildPageNumber) || asyncRequest.Cancelled // Check again for cancellation, as previous line may have loaded FixedDocument and taken a while ) { _NotifyGetPageAsyncCompleted(DocumentPage.Missing, pageNumber, null, true, asyncRequest.UserState); _asyncOps.Remove(asyncRequest.UserState); return(null); } if (!_pendingPages.Contains(asyncRequest.Page)) { // Initiate an async request to child paginator only if this page has not been requested. _pendingPages.Add(asyncRequest.Page); asyncRequest.Page.ChildPaginator.GetPageCompleted += new GetPageCompletedEventHandler(_OnGetPageCompleted); // use this asyncRequest as UserState asyncRequest.Page.ChildPaginator.GetPageAsync(asyncRequest.Page.ChildPageNumber, asyncRequest); } return(null); }
/// <summary> /// <see cref="System.Windows.Documents.DocumentPaginator.GetPageAsync(int,object)"/> /// </summary> internal void GetPageAsync(int pageNumber, object userState) { DocumentsTrace.FixedFormat.IDF.Trace(string.Format("IDP.GetPageAsync({0}, {1})", pageNumber, userState)); // Make sure that the call is in the right context. // Dispatcher.VerifyAccess(); // Page number cannot be negative. if (pageNumber < 0) { throw new ArgumentOutOfRangeException("pageNumber", SR.Get(SRID.IDPNegativePageNumber)); } if (userState == null) { throw new ArgumentNullException("userState"); } // Add to outstanding AsyncOp list GetPageAsyncRequest asyncRequest = new GetPageAsyncRequest(new RequestedPage(pageNumber /*childPaginator, childPageNumber*/), userState); _asyncOps[userState] = asyncRequest; DispatcherOperationCallback queueTask = new DispatcherOperationCallback(_GetPageAsyncDelegate); Dispatcher.BeginInvoke(DispatcherPriority.Background, queueTask, asyncRequest); }
// Callback from inner IDP.GetPageAsync private void _OnGetPageCompleted(object sender, GetPageCompletedEventArgs args) { DocumentsTrace.FixedDocumentSequence.IDF.Trace(string.Format("_OnGetPageCompleted")); // this job is complete GetPageAsyncRequest completedRequest = (GetPageAsyncRequest)args.UserState; _pendingPages.Remove(completedRequest.Page); // wrap the returned result into FixedDocumentSequenceDocumentPage DocumentPage sdp = DocumentPage.Missing; int pageNumber = completedRequest.Page.PageNumber; if (!args.Cancelled && (args.Error == null) && (args.DocumentPage != DocumentPage.Missing)) { sdp = new FixedDocumentSequenceDocumentPage(this, (DynamicDocumentPaginator)sender, args.DocumentPage); _SynthesizeGlobalPageNumber((DynamicDocumentPaginator)sender, args.PageNumber, out pageNumber); } if (!args.Cancelled) { // Notify all outstanding request for this particular page ArrayList notificationList = new ArrayList(); IEnumerator <KeyValuePair <Object, GetPageAsyncRequest> > ienum = _asyncOps.GetEnumerator(); try { while (ienum.MoveNext()) { GetPageAsyncRequest asyncRequest = ienum.Current.Value; // Process any outstanding request for this PageContent if (completedRequest.Page.Equals(asyncRequest.Page)) { notificationList.Add(ienum.Current.Key); // this could throw depending on event handlers that are added _NotifyGetPageAsyncCompleted(sdp, pageNumber, args.Error, asyncRequest.Cancelled, asyncRequest.UserState); } } } finally { // Remove completed requests from current async ops list foreach (Object userState in notificationList) { _asyncOps.Remove(userState); } } } }
/// <summary> /// <see cref="System.Windows.Documents.DocumentPaginator.CancelAsync"/> /// </summary> internal void CancelAsync(object userState) { DocumentsTrace.FixedFormat.IDF.Trace(string.Format("IDP.GetPageAsyncCancel([{0}])", userState)); if (userState == null) { throw new ArgumentNullException("userState"); } if (_asyncOps.ContainsKey(userState)) { GetPageAsyncRequest asyncRequest = _asyncOps[userState]; if (asyncRequest != null) { asyncRequest.Cancelled = true; if (asyncRequest.Page.ChildPaginator != null) { asyncRequest.Page.ChildPaginator.CancelAsync(asyncRequest); } } } }
/// <summary> /// <see cref="System.Windows.Documents.DocumentPaginator.GetPageAsync(int,object)"/> /// </summary> internal void GetPageAsync(int pageNumber, object userState) { DocumentsTrace.FixedFormat.IDF.Trace(string.Format("IDP.GetPageAsync({0}, {1})", pageNumber, userState)); // Make sure that the call is in the right context. // Dispatcher.VerifyAccess(); // Page number cannot be negative. if (pageNumber < 0) { throw new ArgumentOutOfRangeException("pageNumber", SR.Get(SRID.IDPNegativePageNumber)); } if (userState == null) { throw new ArgumentNullException("userState"); } // Add to outstanding AsyncOp list GetPageAsyncRequest asyncRequest = new GetPageAsyncRequest(new RequestedPage(pageNumber/*childPaginator, childPageNumber*/), userState); _asyncOps[userState] = asyncRequest; DispatcherOperationCallback queueTask = new DispatcherOperationCallback(_GetPageAsyncDelegate); Dispatcher.BeginInvoke(DispatcherPriority.Background, queueTask, asyncRequest); }
/// <summary> /// <see cref="System.Windows.Documents.DocumentPaginator.GetPageAsync(int,object)"/> /// </summary> /// <exception cref="ArgumentOutOfRangeException">pageNumber is less than zero.</exception> /// <exception cref="ArgumentNullException">userState is NULL.</exception> internal void GetPageAsync(int pageNumber, object userState) { DocumentsTrace.FixedFormat.IDF.Trace(string.Format("IDP.GetPageAsync({0}, {1})", pageNumber, userState)); // Make sure that the call is in the right context. // Dispatcher.VerifyAccess(); // Page number cannot be negative. if (pageNumber < 0) { throw new ArgumentOutOfRangeException("pageNumber", SR.Get(SRID.IDPNegativePageNumber)); } if (userState == null) { throw new ArgumentNullException("userState"); } if (pageNumber < Pages.Count) { PageContent pc = Pages[pageNumber]; // Add to outstanding AsyncOp list GetPageAsyncRequest asyncRequest = new GetPageAsyncRequest(pc, pageNumber, userState); _asyncOps[userState] = asyncRequest; DispatcherOperationCallback queueTask = new DispatcherOperationCallback(GetPageAsyncDelegate); Dispatcher.BeginInvoke(DispatcherPriority.Background, queueTask, asyncRequest); } else { _NotifyGetPageAsyncCompleted(DocumentPage.Missing, pageNumber, null, false, userState); } }