summaryrefslogtreecommitdiffstats
path: root/utils/MTP/beastpatcher/mtp_win32.c
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2009-06-12 16:35:34 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2009-06-12 16:35:34 +0000
commit11fa12c366a0d33b198fea657dca18bc9d658b61 (patch)
tree11ea8b241b5c4b962ad3b7f1d6a4fc072aa0c82a /utils/MTP/beastpatcher/mtp_win32.c
parent1240216a7581adf9dd018282e33bd6261934f4c2 (diff)
downloadrockbox-11fa12c366a0d33b198fea657dca18bc9d658b61.tar.gz
rockbox-11fa12c366a0d33b198fea657dca18bc9d658b61.tar.bz2
rockbox-11fa12c366a0d33b198fea657dca18bc9d658b61.zip
Implement sendfirm functionality in beastpatcher. Set svn:eol-style properties.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21260 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/MTP/beastpatcher/mtp_win32.c')
-rw-r--r--utils/MTP/beastpatcher/mtp_win32.c410
1 files changed, 231 insertions, 179 deletions
diff --git a/utils/MTP/beastpatcher/mtp_win32.c b/utils/MTP/beastpatcher/mtp_win32.c
index ced930ab80..1d6105f4fa 100644
--- a/utils/MTP/beastpatcher/mtp_win32.c
+++ b/utils/MTP/beastpatcher/mtp_win32.c
@@ -1,179 +1,231 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- *
- * $Id$
- *
- * Copyright (c) 2009, Dave Chapman
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *
- ****************************************************************************/
-
-#include <stdio.h>
-#include <string.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <windows.h>
-#include <tchar.h>
-
-#include "mtp_common.h"
-
-#include "../MTP_DLL/MTP_DLL.h"
-
-int mtp_init(struct mtp_info_t* mtp_info)
-{
- /* Fill the info struct with zeros - mainly for the strings */
- memset(mtp_info, 0, sizeof(struct mtp_info_t));
-
- return 0;
-
-}
-
-int mtp_finished(struct mtp_info_t* mtp_info)
-{
- (void)mtp_info;
-
- return 0;
-}
-
-int mtp_scan(struct mtp_info_t* mtp_info)
-{
- wchar_t name[256];
- wchar_t manufacturer[256];
- DWORD version;
- int num = 0;
-
- num = mtp_description(name, manufacturer, &version);
-
- wcstombs(mtp_info->manufacturer, manufacturer, 200);
- wcstombs(mtp_info->modelname, name, 200);
-
- sprintf(mtp_info->version, "%x", (unsigned int)version);
- return (num > 0) ? num : -1;
-
-}
-
-static void callback(unsigned int progress, unsigned int max)
-{
- int percent = (progress * 100) / max;
-
- printf("Progress: %u of %u (%d%%)\r", progress, max, percent);
- fflush(stdout);
-}
-
-
-int mtp_send_firmware(struct mtp_info_t* mtp_info, unsigned char* fwbuf,
- int fwsize)
-{
- HANDLE hTempFile;
- DWORD dwRetVal;
- DWORD dwBytesWritten;
- UINT uRetVal;
- TCHAR szTempName[1024];
- TCHAR lpPathBuffer[1024];
- BOOL fSuccess;
- wchar_t *tmp;
- int ret;
-
- (void)mtp_info;
-
- /* Get the path for temporary files */
- dwRetVal = GetTempPath(sizeof(lpPathBuffer), lpPathBuffer);
- if (dwRetVal > sizeof(lpPathBuffer) || (dwRetVal == 0))
- {
- fprintf(stderr, "[ERR] GetTempPath failed (%d)\n", (int)GetLastError());
- return -1;
- }
-
- /* Create the temporary file */
- uRetVal = GetTempFileName(lpPathBuffer, TEXT("NKBIN"), 0, szTempName);
- if (uRetVal == 0)
- {
- fprintf(stderr, "[ERR] GetTempFileName failed (%d)\n", (int)GetLastError());
- return -1;
- }
-
- /* Now create the file */
- hTempFile = CreateFile((LPTSTR) szTempName, // file name
- GENERIC_READ | GENERIC_WRITE, // open r-w
- 0, // do not share
- NULL, // default security
- CREATE_ALWAYS, // overwrite existing
- FILE_ATTRIBUTE_NORMAL,// normal file
- NULL); // no template
- if (hTempFile == INVALID_HANDLE_VALUE)
- {
- fprintf(stderr, "[ERR] Could not create %s\n", szTempName);
- return -1;
- }
-
- fSuccess = WriteFile(hTempFile, fwbuf, fwsize, &dwBytesWritten, NULL);
- if (!fSuccess)
- {
- fprintf(stderr, "[ERR] WriteFile failed (%d)\n", (int)GetLastError());
- return -1;
- }
-
- fSuccess = CloseHandle (hTempFile);
- if (!fSuccess)
- {
- fprintf(stderr, "[ERR] CloseHandle failed (%d)\n", (int)GetLastError());
- return -1;
- }
-
- tmp = (LPWSTR)malloc(_tcslen(szTempName)*2+1);
- mbstowcs(tmp, (char*)szTempName, _tcslen(szTempName)*2+1);
-
- fprintf(stderr, "[INFO] Sending firmware...\n");
- if (mtp_sendnk(tmp, fwsize, &callback))
- {
- fprintf(stderr, "[INFO] Firmware sent successfully\n");
- ret = 0;
- }
- else
- {
- fprintf(stderr, "[ERR] Error occured during sending.\n");
- ret = -1;
- }
-
- /* Keep the progress line onscreen */
- printf("\n");
-
- free(tmp);
-
- if (!DeleteFile(szTempName))
- fprintf(stderr,"[WARN] Could not remove temporary file %s\n",szTempName);
-
- return ret;
-}
-
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * $Id$
+ *
+ * Copyright (c) 2009, Dave Chapman
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <windows.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <tchar.h>
+
+#include "mtp_common.h"
+
+#include "../MTP_DLL/MTP_DLL.h"
+
+
+static int filesize(const char* filename);
+
+
+int mtp_init(struct mtp_info_t* mtp_info)
+{
+ /* Fill the info struct with zeros - mainly for the strings */
+ memset(mtp_info, 0, sizeof(struct mtp_info_t));
+
+ return 0;
+
+}
+
+int mtp_finished(struct mtp_info_t* mtp_info)
+{
+ (void)mtp_info;
+
+ return 0;
+}
+
+int mtp_scan(struct mtp_info_t* mtp_info)
+{
+ wchar_t name[256];
+ wchar_t manufacturer[256];
+ DWORD version;
+ int num = 0;
+
+ num = mtp_description(name, manufacturer, &version);
+
+ wcstombs(mtp_info->manufacturer, manufacturer, 200);
+ wcstombs(mtp_info->modelname, name, 200);
+
+ sprintf(mtp_info->version, "%x", (unsigned int)version);
+ return (num > 0) ? num : -1;
+
+}
+
+static void callback(unsigned int progress, unsigned int max)
+{
+ int percent = (progress * 100) / max;
+
+ printf("[INFO] Progress: %u of %u (%d%%)\r", progress, max, percent);
+ fflush(stdout);
+}
+
+
+int mtp_send_firmware(struct mtp_info_t* mtp_info, unsigned char* fwbuf,
+ int fwsize)
+{
+ HANDLE hTempFile;
+ DWORD dwRetVal;
+ DWORD dwBytesWritten;
+ UINT uRetVal;
+ TCHAR szTempName[1024];
+ TCHAR lpPathBuffer[1024];
+ BOOL fSuccess;
+ wchar_t *tmp;
+ int ret;
+
+ (void)mtp_info;
+
+ /* Get the path for temporary files */
+ dwRetVal = GetTempPath(sizeof(lpPathBuffer), lpPathBuffer);
+ if (dwRetVal > sizeof(lpPathBuffer) || (dwRetVal == 0))
+ {
+ fprintf(stderr, "[ERR] GetTempPath failed (%d)\n", (int)GetLastError());
+ return -1;
+ }
+
+ /* Create the temporary file */
+ uRetVal = GetTempFileName(lpPathBuffer, TEXT("NKBIN"), 0, szTempName);
+ if (uRetVal == 0)
+ {
+ fprintf(stderr, "[ERR] GetTempFileName failed (%d)\n", (int)GetLastError());
+ return -1;
+ }
+
+ /* Now create the file */
+ hTempFile = CreateFile((LPTSTR) szTempName, // file name
+ GENERIC_READ | GENERIC_WRITE, // open r-w
+ 0, // do not share
+ NULL, // default security
+ CREATE_ALWAYS, // overwrite existing
+ FILE_ATTRIBUTE_NORMAL,// normal file
+ NULL); // no template
+ if (hTempFile == INVALID_HANDLE_VALUE)
+ {
+ fprintf(stderr, "[ERR] Could not create %s\n", szTempName);
+ return -1;
+ }
+
+ fSuccess = WriteFile(hTempFile, fwbuf, fwsize, &dwBytesWritten, NULL);
+ if (!fSuccess)
+ {
+ fprintf(stderr, "[ERR] WriteFile failed (%d)\n", (int)GetLastError());
+ return -1;
+ }
+
+ fSuccess = CloseHandle (hTempFile);
+ if (!fSuccess)
+ {
+ fprintf(stderr, "[ERR] CloseHandle failed (%d)\n", (int)GetLastError());
+ return -1;
+ }
+
+ tmp = (LPWSTR)malloc(_tcslen(szTempName)*2+1);
+ mbstowcs(tmp, (char*)szTempName, _tcslen(szTempName)*2+1);
+
+ fprintf(stderr, "[INFO] Sending firmware...\n");
+ if (mtp_sendnk(tmp, fwsize, &callback))
+ {
+ fprintf(stderr, "\n");
+ fprintf(stderr, "[INFO] Firmware sent successfully\n");
+ ret = 0;
+ }
+ else
+ {
+ fprintf(stderr, "\n");
+ fprintf(stderr, "[ERR] Error occured during sending.\n");
+ ret = -1;
+ }
+ free(tmp);
+
+ if (!DeleteFile(szTempName))
+ fprintf(stderr,"[WARN] Could not remove temporary file %s\n",szTempName);
+
+ return ret;
+}
+
+
+int mtp_send_file(struct mtp_info_t* mtp_info, const char* filename)
+{
+ wchar_t *fn;
+
+ fn = (LPWSTR)malloc(strlen(filename)*2+1);
+ mbstowcs(fn, filename, strlen(filename)*2+1);
+
+ if (mtp_init(mtp_info) < 0) {
+ fprintf(stderr,"[ERR] Can not init MTP\n");
+ return 1;
+ }
+ /* Scan for attached MTP devices. */
+ if (mtp_scan(mtp_info) < 0)
+ {
+ fprintf(stderr,"[ERR] No devices found\n");
+ return 1;
+ }
+
+ fprintf(stderr, "[INFO] Sending firmware...\n");
+ if (mtp_sendnk(fn, filesize(filename), &callback))
+ {
+ /* keep progress on screen */
+ printf("\n");
+ fprintf(stderr, "[INFO] Firmware sent successfully\n");
+ return 0;
+ }
+ else
+ {
+ fprintf(stderr, "[ERR] Error occured during sending.\n");
+ return -1;
+ }
+ mtp_finished(mtp_info);
+}
+
+
+static int filesize(const char* filename)
+{
+ struct _stat sb;
+ int res;
+
+ res = _stat(filename, &sb);
+ if(res == -1) {
+ fprintf(stderr, "Error getting filesize!\n");
+ return -1;
+ }
+ return sb.st_size;
+}