/*************************************************************************** * __________ __ ___. * 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 #include #include #include #include #include #include #include #include "mtp_common.h" extern __declspec(dllimport) bool send_fw(LPWSTR file, int filesize, void (*callback)(unsigned int progress, unsigned int max)); 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) { strcpy(mtp_info->manufacturer,""); strcpy(mtp_info->modelname,""); strcpy(mtp_info->version,""); return 0; } 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(strlen(szTempName)*2+1); mbstowcs(tmp, szTempName, strlen(szTempName)*2+1); fprintf(stderr, "[INFO] Sending firmware...\n"); if (send_fw(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; }