/*************************************************************************** * __________ __ ___. * 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 #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; }