diff options
| author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2008-08-27 23:07:08 +0000 |
|---|---|---|
| committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2008-08-27 23:07:08 +0000 |
| commit | 79177edfb2bb5e934c1630d723a0032c995942d7 (patch) | |
| tree | 608f77faf1b21a5cddb1d6eb4b8b6d2f1a061262 /utils/MTP/MTP_DLL/sendfirm_win.cpp | |
| parent | e320446f0e74fcc6c5a216e20d3cd499a70658b3 (diff) | |
| download | rockbox-79177edfb2bb5e934c1630d723a0032c995942d7.zip rockbox-79177edfb2bb5e934c1630d723a0032c995942d7.tar.gz rockbox-79177edfb2bb5e934c1630d723a0032c995942d7.tar.bz2 rockbox-79177edfb2bb5e934c1630d723a0032c995942d7.tar.xz | |
MTP:
* Add Win32 progress callback reporting support
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18355 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/MTP/MTP_DLL/sendfirm_win.cpp')
| -rw-r--r-- | utils/MTP/MTP_DLL/sendfirm_win.cpp | 244 |
1 files changed, 159 insertions, 85 deletions
diff --git a/utils/MTP/MTP_DLL/sendfirm_win.cpp b/utils/MTP/MTP_DLL/sendfirm_win.cpp index e895c02..0861b34 100644 --- a/utils/MTP/MTP_DLL/sendfirm_win.cpp +++ b/utils/MTP/MTP_DLL/sendfirm_win.cpp @@ -11,6 +11,26 @@ #include "sac.h" #include "scclient.h" +class CProgressHelper : + public IWMDMProgress +{ + void (*m_callback)(unsigned int progress, unsigned int max); + DWORD m_max_ticks; + DWORD m_cur_ticks; + DWORD m_counter; + +public: + CProgressHelper( void (*callback)(unsigned int progress, unsigned int max) ); + ~CProgressHelper(); + STDMETHOD(Begin)( DWORD dwEstimatedTicks ); + STDMETHOD(Progress)( DWORD dwTranspiredTicks ); + STDMETHOD(End)(); + + STDMETHOD(QueryInterface) ( REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject ); + STDMETHOD_(ULONG, AddRef)( void ); + STDMETHOD_(ULONG, Release)( void ); +}; + /* * Compilation requirements: * @@ -21,74 +41,66 @@ * */ extern "C" { -__declspec(dllexport) bool send_fw(LPWSTR file, int filesize) +__declspec(dllexport) bool send_fw(LPWSTR file, int filesize, void (*callback)(unsigned int progress, unsigned int max)) { bool return_value = false; - HRESULT hr; - IComponentAuthenticate* pICompAuth; - CSecureChannelClient *m_pSacClient = new CSecureChannelClient; - IWMDeviceManager3* m_pIdvMgr = NULL; - - /* these are generic keys */ - BYTE abPVK[] = {0x00}; - BYTE abCert[] = {0x00}; - - CoInitialize(NULL); - - /* get an authentication interface */ - hr = CoCreateInstance(CLSID_MediaDevMgr, NULL, CLSCTX_ALL ,IID_IComponentAuthenticate, (void **)&pICompAuth); - if SUCCEEDED(hr) - { - /* create a secure channel client certificate */ - hr = m_pSacClient->SetCertificate(SAC_CERT_V1, (BYTE*) abCert, sizeof(abCert), (BYTE*) abPVK, sizeof(abPVK)); - if SUCCEEDED(hr) - { - /* bind the authentication interface to the secure channel client */ - m_pSacClient->SetInterface(pICompAuth); - - /* trigger communication */ - hr = m_pSacClient->Authenticate(SAC_PROTOCOL_V1); - if SUCCEEDED(hr) - { - /* get main interface to media device manager */ - hr = pICompAuth->QueryInterface(IID_IWMDeviceManager2, (void**)&m_pIdvMgr); - if SUCCEEDED(hr) - { - /* enumerate devices... */ - IWMDMEnumDevice *pIEnumDev; - hr = m_pIdvMgr->EnumDevices2(&pIEnumDev); - if SUCCEEDED(hr) + HRESULT hr; + IComponentAuthenticate* pICompAuth; + CSecureChannelClient *m_pSacClient = new CSecureChannelClient; + IWMDeviceManager3* m_pIdvMgr = NULL; + + /* these are generic keys */ + BYTE abPVK[] = {0x00}; + BYTE abCert[] = {0x00}; + + CoInitialize(NULL); + + /* get an authentication interface */ + hr = CoCreateInstance(CLSID_MediaDevMgr, NULL, CLSCTX_ALL ,IID_IComponentAuthenticate, (void **)&pICompAuth); + if SUCCEEDED(hr) + { + /* create a secure channel client certificate */ + hr = m_pSacClient->SetCertificate(SAC_CERT_V1, (BYTE*) abCert, sizeof(abCert), (BYTE*) abPVK, sizeof(abPVK)); + if SUCCEEDED(hr) + { + /* bind the authentication interface to the secure channel client */ + m_pSacClient->SetInterface(pICompAuth); + + /* trigger communication */ + hr = m_pSacClient->Authenticate(SAC_PROTOCOL_V1); + if SUCCEEDED(hr) + { + /* get main interface to media device manager */ + hr = pICompAuth->QueryInterface(IID_IWMDeviceManager2, (void**)&m_pIdvMgr); + if SUCCEEDED(hr) + { + /* enumerate devices... */ + IWMDMEnumDevice *pIEnumDev; + hr = m_pIdvMgr->EnumDevices2(&pIEnumDev); + if SUCCEEDED(hr) { - hr = pIEnumDev->Reset(); /* Next will now return the first device */ - if SUCCEEDED(hr) + hr = pIEnumDev->Reset(); /* Next will now return the first device */ + if SUCCEEDED(hr) { - IWMDMDevice3* pIDevice; - unsigned long ulNumFetched; - hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); - while (SUCCEEDED(hr) && (hr != S_FALSE)) + IWMDMDevice3* pIDevice; + unsigned long ulNumFetched; + hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); + while (SUCCEEDED(hr) && (hr != S_FALSE)) { -#if 0 - /* output device name */ - wchar_t pwsString[256]; - hr = pIDevice->GetName(pwsString, 256); - if SUCCEEDED(hr) - wprintf(L"Found device %s\n", pwsString); -#endif - - /* get storage info */ - DWORD tempDW; - pIDevice->GetType(&tempDW); - if (tempDW & WMDM_DEVICE_TYPE_STORAGE) + /* get storage info */ + DWORD tempDW; + pIDevice->GetType(&tempDW); + if (tempDW & WMDM_DEVICE_TYPE_STORAGE) { - IWMDMEnumStorage *pIEnumStorage = NULL; - IWMDMStorage *pIStorage = NULL; - IWMDMStorage3 *pIFileStorage = NULL; - hr = pIDevice->EnumStorage(&pIEnumStorage); - if SUCCEEDED(hr) + IWMDMEnumStorage *pIEnumStorage = NULL; + IWMDMStorage *pIStorage = NULL; + IWMDMStorage3 *pIFileStorage = NULL; + hr = pIDevice->EnumStorage(&pIEnumStorage); + if SUCCEEDED(hr) { - pIEnumStorage->Reset(); - hr = pIEnumStorage->Next(1, (IWMDMStorage **)&pIStorage, &ulNumFetched); - while (SUCCEEDED(hr) && (hr != S_FALSE)) + pIEnumStorage->Reset(); + hr = pIEnumStorage->Next(1, (IWMDMStorage **)&pIStorage, &ulNumFetched); + while (SUCCEEDED(hr) && (hr != S_FALSE)) { IWMDMStorage3 *pNewStorage; hr = pIStorage->QueryInterface(IID_IWMDMStorage3, (void **)&pNewStorage); @@ -113,14 +125,15 @@ __declspec(dllexport) bool send_fw(LPWSTR file, int filesize) if (SUCCEEDED(hr)) { IWMDMStorage *pNewObject = NULL; + CProgressHelper *progress = new CProgressHelper(callback); hr = pIWMDMStorageControl->Insert3( - WMDM_MODE_BLOCK | WMDM_CONTENT_FILE, + WMDM_MODE_BLOCK | WMDM_CONTENT_FILE | WMDM_MODE_PROGRESS, 0, file, NULL, NULL, - NULL, + (callback == NULL ? NULL : (IWMDMProgress*)progress), pIWMDMMetaData, NULL, (IWMDMStorage **)&pNewObject); @@ -135,27 +148,88 @@ __declspec(dllexport) bool send_fw(LPWSTR file, int filesize) } } } - } - } - pIEnumStorage->Release(); - } - - /* move to next device */ - if(!return_value) - hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); - } - pIEnumDev->Release(); - } - m_pIdvMgr->Release(); - } - pICompAuth->Release(); - } - } - } - } - - CoUninitialize(); - - return return_value; + } + } + pIEnumStorage->Release(); + } + + /* move to next device */ + if(!return_value) + hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); + } + pIEnumDev->Release(); + } + m_pIdvMgr->Release(); + } + pICompAuth->Release(); + } + } + } + } + + CoUninitialize(); + + return return_value; +} +} + + +CProgressHelper::CProgressHelper( void (*callback)(unsigned int progress, unsigned int max) ) +{ + m_cur_ticks = 0; + m_max_ticks = 0; + m_counter = 0; + + m_callback = callback; +} + +CProgressHelper::~CProgressHelper() +{ } + +HRESULT CProgressHelper::Begin( DWORD dwEstimatedTicks ) +{ + m_max_ticks = dwEstimatedTicks; + + return S_OK; +} + +HRESULT CProgressHelper::Progress( DWORD dwTranspiredTicks ) +{ + m_cur_ticks = dwTranspiredTicks; + + if(m_callback != NULL) + m_callback(m_cur_ticks, max(m_max_ticks, m_cur_ticks)); + + return S_OK; +} + +HRESULT CProgressHelper::End() +{ + m_cur_ticks = m_max_ticks; + + return S_OK; +} + +HRESULT CProgressHelper::QueryInterface( REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject ) +{ + if(riid == IID_IWMDMProgress || riid == IID_IUnknown) + { + *ppvObject = this; + return S_OK; + } + else + { + *ppvObject = NULL; + return E_NOINTERFACE; + } +} + +ULONG CProgressHelper::AddRef() +{ + return m_counter++; +} +ULONG CProgressHelper::Release() +{ + return m_counter--; } |