// Methods
 private static IAsyncResult _BeginGetDvdInfo(DvdInfoRequestData dvdInfoRequestData, string dvdId, AsyncCallback callback, object callbackData, bool bUseEnhancedMetadata)
 {
     if (dvdInfoRequestData == null)
     {
         //if (WorkOffline)
         //{
         //    return null;
         //}
         if (string.IsNullOrEmpty(dvdId))
         {
             return null;
         }
         dvdInfoRequestData = new DvdInfoRequestData(dvdId);
         if (!bUseEnhancedMetadata)
         {
             s_currentRequests[dvdId] = dvdInfoRequestData;
         }
         //string strUrl = MetadataURLForDisc(dvdId, bUseEnhancedMetadata);
         string strUrl = MetadataURL(bUseEnhancedMetadata)+dvdId;//.Replace("|","");//string.Format(metMetadataURLForDisc(dvdId, bUseEnhancedMetadata);
         uint cbMaxSize = 0x19000;
         AsyncCallback callback2 = bUseEnhancedMetadata ? new AsyncCallback(DvdInfo.InetStreamCallbackEx) : new AsyncCallback(DvdInfo.InetStreamCallback);
         bool flag = false;
         try
         {
             InetStream.BeginRead(strUrl, callback2, dvdInfoRequestData, cbMaxSize);
         }
         catch (WebException exception)
         {
             flag = true;
             if (dvdInfoRequestData != null)
             {
                 dvdInfoRequestData.Exception = exception;
             }
         }
         catch (InvalidOperationException exception2)
         {
             flag = true;
             if (dvdInfoRequestData != null)
             {
                 dvdInfoRequestData.Exception = exception2;
             }
         }
         if (flag)
         {
             CompleteTheRequest(dvdInfoRequestData, true, true);
         }
     }
     DvdInfoCallback dvdInfoCallback = new DvdInfoCallback(callback, callbackData);
     if (dvdInfoRequestData.IsCompleted)
     {
         return IssueCallback(dvdInfoRequestData, dvdInfoCallback, true);
     }
     if (callback != null)
     {
         dvdInfoRequestData.Callbacks.Add(dvdInfoCallback);
     }
     return new DvdInfoAsyncResult(dvdInfoRequestData, dvdInfoCallback.CallbackData, false);
 }
 private static void CompleteTheRequest(DvdInfoRequestData dvdInfoRequestData, bool fRemove, bool synchronous)
 {
     lock (s_lock)
     {
         dvdInfoRequestData.IsCompleted = true;
         dvdInfoRequestData.AsyncEvent.Set();
         for (int i = 0; i < dvdInfoRequestData.Callbacks.Count; i++)
         {
             DvdInfoCallback dvdInfoCallback = (DvdInfoCallback)dvdInfoRequestData.Callbacks[i];
             IssueCallback(dvdInfoRequestData, dvdInfoCallback, synchronous);
         }
         dvdInfoRequestData.Callbacks.Clear();
         if (fRemove && (dvdInfoRequestData.DvdId != null))
         {
             s_currentRequests.Remove(dvdInfoRequestData.DvdId);
         }
     }
 }
 private static DvdInfoAsyncResult IssueCallback(DvdInfoRequestData dvdInfoRequestData, DvdInfoCallback dvdInfoCallback, bool completedSynchronously)
 {
     DvdInfoAsyncResult ar = new DvdInfoAsyncResult(dvdInfoRequestData, dvdInfoCallback.CallbackData, completedSynchronously);
     if (dvdInfoCallback.Callback != null)
     {
         if (completedSynchronously)
         {
             if (dvdInfoCallback != null)
             {
                 dvdInfoCallback.Callback(ar);
             }
             return ar;
         }
         //TODO: rewire callback
         //Application.DeferredInvoke(dvdInfoCallback.Callback, new object[] { ar });
     }
     return ar;
 }
 public static IAsyncResult BeginGetDvdInfo(string dvdId, AsyncCallback callback, object callbackData)
 {
     lock (s_lock)
     {
         DvdInfoRequestData dvdInfoRequestData = (DvdInfoRequestData)s_currentRequests[dvdId];
         if (dvdInfoRequestData == null)
         {
             DvdInfo dvdInfo = LoadFromCache(dvdId);
             if (IsValid(dvdInfo))
             {
                 dvdInfoRequestData = new DvdInfoRequestData(dvdId);
                 s_currentRequests[dvdId] = dvdInfoRequestData;
                 dvdInfoRequestData.DvdInfo = dvdInfo;
                 dvdInfoRequestData.IsCompleted = true;
             }
         }
         return _BeginGetDvdInfo(dvdInfoRequestData, dvdId, callback, callbackData, false);
     }
 }