Geeks With Blogs

News Disclaimer
The views expressed on this weblog are mine and do not necessarily reflect the views of my employer.

All postings are provided "AS IS" with no warranties, and confer no rights.

 Subscribe in a reader

I'm test-driven!
Locations of visitors to this page

Post Categories

Blog Moved to Blog Moved to
Update:  Put a comment in if you want the C# version of this code and I will get it to you

Well, I was having troubles connecting to CVS on my Managed BITS Sourceforge Project over my VPC, so while I figure it out, I decided to upload the source code plus binaries to SaveFile for the time being.  Let me know if you have any questions or problems regarding this.
Now that I got that out of the way, let's get back to where we left off.  In the previous lesson, we talked about implementing the IBackgroundCopyCallback interface.  Since this interface also implements IUnknown, we must also address that as well.  I implemented the interface in a class called UnmanagedEventManager.
Let's take a look at the IUnknown interface implementation first.
// Query interface method
HRESULT Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::UnmanagedEventManager::QueryInterface(REFIID riid, LPVOID *ppvObj)
     // Check if IUnknown and IBackgroundCopyCallback
     if (riid == __uuidof(IUnknown) || riid == __uuidof(IBackgroundCopyCallback))
         *ppvObj = this;
    } // if - riid
        *ppvObj = NULL;
        return E_NOINTERFACE;
   } // else - riid
   // Add reference
   return NOERROR;
} // method - UnmanagedEventManager::QueryInterface
// Add reference
ULONG Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::UnmanagedEventManager::AddRef()
      return InterlockedIncrement(&m_lRefCount);
} // method - UnmanagedEventManager::AddRef
// Release
ULONG Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::UnmanagedEventManager::Release()
     // Decrement count
     ULONG  ulCount = InterlockedDecrement(&m_lRefCount);
     // Delete if 0
     if(0 == ulCount)
          delete this;
     return ulCount;
} // method - UnmanagedEventManager::Release
As you can see, we really did nothing special here.  Just a standard plain-vanilla implementation of IUnknown.  Now let's take a look at some of the methods that we must implement with the IBackgroundCopyCallback interface.  We will note that the pCopyJobEventManager is of type gcroot<BackgroundCopyJobEventManager*>.
// Job error callback
HRESULT Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::UnmanagedEventManager::JobError(IBackgroundCopyJob __nogc* pJob, IBackgroundCopyError __nogc* pError)
     // Call error event
     pCopyJobEventManager->ErrorEvent(new BackgroundCopyJob(pJob), new BackgroundCopyError(pError));
     return S_OK;
} // method - UnmanagedEventManager::JobError
// Job modification callback
HRESULT Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::UnmanagedEventManager::JobModification(IBackgroundCopyJob __nogc* pJob, DWORD dwReserved)
     // Call modification event
     pCopyJobEventManager->ModificationEvent(new BackgroundCopyJob(pJob));
     return S_OK;
} // method - UnmanagedEventManager::JobModification
// Job transferred callback
HRESULT Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::UnmanagedEventManager::JobTransferred(IBackgroundCopyJob __nogc* pJob)
     // Call transferred event
     pCopyJobEventManager->TransferredEvent(new BackgroundCopyJob(pJob));
    return S_OK;
} // method - UnmanagedEventManager::JobTransferred
Basically what these methods do is invoke the events when the IBackgroundCopyCallback is invoked from the IBackgroundCopyJob interface.  You have the ability to set the IBackgroundCopyCallback interface implementation through the SetNotifyInterface and SetNotifyFlags methods.  The event implementations are quite simple as well and that code follows:
// The error event
void Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::ErrorEvent(Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJob* pErroredJob, Podwysocki::Services::BackgroundTransferServices::BackgroundCopyError* pCopyError)
     if(this->pJobModificationEvent != NULL)
          this->pJobModificationEvent->Invoke(this, new BackgroundCopyErrorEventArgs(pCopyError, pErroredJob));
} // method - BackgroundCopyJobEventManager::ErrorEvent
// The modified event
void Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::ModificationEvent(Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJob* pModifiedJob)
     if(this->pJobModificationEvent != 0)
          this->pJobModificationEvent->Invoke(this, new BackgroundCopyJobEventArgs(pModifiedJob));
} // method - BackgroundCopyJobEventManager::ModificationEvent
// The transferred event
void Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJobEventManager::TransferredEvent(Podwysocki::Services::BackgroundTransferServices::BackgroundCopyJob* pTransferredJob)
     if (this->pJobTransferredEvent != 0)
          this->pJobTransferredEvent->Invoke(this, new BackgroundCopyJobEventArgs(pTransferredJob));
} // method - BackgroundCopyJobEventManager::TransferredEvent
It's important that we implement this class because we want a way to fire events upon completion of a job.  As you can see, it's not entirely complex to translate the unmanaged code to managed, it just takes time and lines of code.  Once again, the files are available from the link above, so let me know if you have any questions.
Posted on Thursday, June 8, 2006 3:34 PM Microsoft , Background Intelligent Transfer Service , .NET , Windows | Back to top

Comments on this post: Day 9 of the Background Intelligent Transfer Service (BITS) Managed Wrapper

# re: Day 9 of the Background Intelligent Transfer Service (BITS) Managed Wrapper
Requesting Gravatar...
I need C# code version of this code.Can u help me please..
Left by Alfy John on Aug 23, 2008 12:42 AM

# re: Day 9 of the Background Intelligent Transfer Service (BITS) Managed Wrapper
Requesting Gravatar...
i need the c# code for BITS can you please email it??
Left by Shilpa on Jan 16, 2009 5:24 AM

# re: Day 9 of the Background Intelligent Transfer Service (BITS) Managed Wrapper
Requesting Gravatar...
Please provide if u have
Left by sree on Feb 23, 2009 3:49 PM

# re: Day 9 of the Background Intelligent Transfer Service (BITS) Managed Wrapper
Requesting Gravatar...
Any chance I could also have a copy of the C# code?

Left by Simon on Aug 13, 2010 6:39 AM

# re: Day 9 of the Background Intelligent Transfer Service (BITS) Managed Wrapper
Requesting Gravatar...
Please send a copy of the c# sharp code

Left by Andrew on Aug 13, 2010 7:24 AM

Your comment:
 (will show your gravatar)

Copyright © Matthew Podwysocki | Powered by: