summaryrefslogtreecommitdiffstats
path: root/utils/MTP
diff options
context:
space:
mode:
authorMaurus Cuelenaere <mcuelenaere@gmail.com>2008-08-27 23:07:08 +0000
committerMaurus Cuelenaere <mcuelenaere@gmail.com>2008-08-27 23:07:08 +0000
commit79177edfb2bb5e934c1630d723a0032c995942d7 (patch)
tree608f77faf1b21a5cddb1d6eb4b8b6d2f1a061262 /utils/MTP
parente320446f0e74fcc6c5a216e20d3cd499a70658b3 (diff)
downloadrockbox-79177edfb2bb5e934c1630d723a0032c995942d7.tar.gz
rockbox-79177edfb2bb5e934c1630d723a0032c995942d7.zip
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')
-rwxr-xr-xutils/MTP/MTP_DLL.dllbin90112 -> 90112 bytes
-rw-r--r--utils/MTP/MTP_DLL/MTP_DLL.cpp2
-rw-r--r--utils/MTP/MTP_DLL/MTP_DLL.h6
-rw-r--r--utils/MTP/MTP_DLL/sendfirm_win.cpp244
-rw-r--r--utils/MTP/MTP_DLL/stdafx.h18
-rw-r--r--utils/MTP/sendfirm_win.c17
6 files changed, 185 insertions, 102 deletions
diff --git a/utils/MTP/MTP_DLL.dll b/utils/MTP/MTP_DLL.dll
index 3f9b6c7a50..448dff430a 100755
--- a/utils/MTP/MTP_DLL.dll
+++ b/utils/MTP/MTP_DLL.dll
Binary files differ
diff --git a/utils/MTP/MTP_DLL/MTP_DLL.cpp b/utils/MTP/MTP_DLL/MTP_DLL.cpp
index 8d8e2502c9..ffd314a697 100644
--- a/utils/MTP/MTP_DLL/MTP_DLL.cpp
+++ b/utils/MTP/MTP_DLL/MTP_DLL.cpp
@@ -12,7 +12,7 @@
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
- )
+ )
{
return TRUE;
}
diff --git a/utils/MTP/MTP_DLL/MTP_DLL.h b/utils/MTP/MTP_DLL/MTP_DLL.h
index 45352830a3..ad99014bc2 100644
--- a/utils/MTP/MTP_DLL/MTP_DLL.h
+++ b/utils/MTP/MTP_DLL/MTP_DLL.h
@@ -10,6 +10,8 @@
#define MTP_DLL_API __declspec(dllimport)
#endif
-extern "C" {
-__declspec(dllexport) bool send_fw(LPWSTR file, int filesize);
+extern "C"
+{
+__declspec(dllexport) bool send_fw(LPWSTR file, int filesize, void (*callback)(unsigned int progress, unsigned int max));
}
+
diff --git a/utils/MTP/MTP_DLL/sendfirm_win.cpp b/utils/MTP/MTP_DLL/sendfirm_win.cpp
index e895c024fd..0861b345b0 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--;
}
diff --git a/utils/MTP/MTP_DLL/stdafx.h b/utils/MTP/MTP_DLL/stdafx.h
index a13982c634..1734058361 100644
--- a/utils/MTP/MTP_DLL/stdafx.h
+++ b/utils/MTP/MTP_DLL/stdafx.h
@@ -7,23 +7,23 @@
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
-#ifndef WINVER // Allow use of features specific to Windows XP or later.
-#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
+#ifndef WINVER // Allow use of features specific to Windows XP or later.
+#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
-#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
-#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
-#endif
+#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
+#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
+#endif
-#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
+#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
-#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
-#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
+#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
+#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
#endif
-#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
diff --git a/utils/MTP/sendfirm_win.c b/utils/MTP/sendfirm_win.c
index e605d47d0c..c16a7ab68b 100644
--- a/utils/MTP/sendfirm_win.c
+++ b/utils/MTP/sendfirm_win.c
@@ -28,7 +28,7 @@
#include <wchar.h>
#include <stdbool.h>
-extern __declspec(dllimport) bool send_fw(LPWSTR file, int filesize);
+extern __declspec(dllimport) bool send_fw(LPWSTR file, int filesize, void (*callback)(unsigned int progress, unsigned int max));
void usage(void)
{
@@ -37,9 +37,9 @@ void usage(void)
int filesize(char* filename)
{
- FILE* fd;
+ FILE* fd;
int tmp;
- fd = fopen(filename, "r");
+ fd = fopen(filename, "r");
if(fd == NULL)
{
fprintf(stderr, "Error while opening %s!\n", filename);
@@ -47,10 +47,17 @@ int filesize(char* filename)
}
fseek(fd, 0, SEEK_END);
tmp = ftell(fd);
- fclose(fd);
+ fclose(fd);
return tmp;
}
+void callback(unsigned int progress, unsigned int max)
+{
+ unsigned int normalized = progress*1000/max;
+ printf("Progress: %d.%d%%\r", normalized/10, normalized%10);
+ fflush(stdout);
+}
+
int main(int argc, char **argv)
{
if (argc < 2)
@@ -69,7 +76,7 @@ int main(int argc, char **argv)
fprintf(stdout, "Sending firmware...\n");
- if(send_fw(tmp, filesize(argv[1])))
+ if(send_fw(tmp, filesize(argv[1]), &callback))
fprintf(stdout, "Firmware sent successfully!\n");
else
fprintf(stdout, "Error occured during sending!\n");