int copyBundle (TCHAR *parent_dir, TCHAR *file, TCHAR *app_dir) { HANDLE fileHandle; WIN32_FIND_DATAW findData; //DWORD dwError; TCHAR new_app_item[MAX_PATH]; TCHAR host_file[MAX_PATH]; HANDLE hFind; CE_FIND_DATA wceFindData; USES_CONVERSION; TCHAR wildcard[MAX_PATH + 16]; TCHAR fullpath[MAX_PATH]; _tcscpy(fullpath, parent_dir); _tcscat(fullpath, _T("\\")); _tcscat(fullpath, file); //TODO: check for fullpath is a dir _tcscpy(wildcard, fullpath); _tcscat(wildcard, _T("\\*.*")); //wceConnect (); fileHandle = FindFirstFile(wildcard, &findData); if (fileHandle == INVALID_HANDLE_VALUE) { printf ("Failed to open file\n"); wceDisconnect(); return EXIT_FAILURE; } /* if (_tcscmp (_T("."), findData.cFileName) != 0 && _tcscmp (_T(".."), findData.cFileName) != 0) { printf("-- %s\n", T2A(findData.cFileName)); if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { copyBundle (fullpath, findData.cFileName, NULL); } } */ HANDLE hDest, hSrc; BYTE buffer[5120]; DWORD dwNumRead, dwNumWritten; while (FindNextFile(fileHandle, &findData)) { if (_tcscmp (_T("."), findData.cFileName) == 0 || _tcscmp (_T(".."), findData.cFileName) == 0) continue; _tcscpy(new_app_item, app_dir); _tcscat(new_app_item, _T("\\")); _tcscat(new_app_item, findData.cFileName); if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { //Check and create dir on device hFind = CeFindFirstFile(new_app_item, &wceFindData); if (INVALID_HANDLE_VALUE == hFind) { if (!CeCreateDirectory(new_app_item, NULL)) { _tprintf( TEXT("Create directory \"%s\" on device\n"), new_app_item); printf ("Failed to create new directory on device\n"); return EXIT_FAILURE; } } FindClose( hFind); copyBundle (fullpath, findData.cFileName, new_app_item); } else { _tcscpy(host_file, fullpath); _tcscat(host_file, _T("\\")); _tcscat(host_file, findData.cFileName); _tprintf( TEXT("Copy file \"%s\" to device"), new_app_item); hSrc = CreateFile(host_file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hSrc) { _tprintf( TEXT("Unable to open host file\n")); return false; } hDest = CeCreateFile(new_app_item, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hDest ) { _tprintf( TEXT("Unable to open target WinCE file\n")); return false; } do { if(ReadFile(hSrc, &buffer, sizeof(buffer), &dwNumRead, NULL)) { if (!CeWriteFile(hDest, &buffer, dwNumRead, &dwNumWritten, NULL)) { _tprintf( TEXT("Error !!! Writing WinCE file\n")); goto copyBundleFailure; } } else { _tprintf( TEXT("Error !!! Reading host file\n")); goto copyBundleFailure; } _tprintf( TEXT(".")); } while (dwNumRead); _tprintf( TEXT("\n")); CeCloseHandle( hDest); CloseHandle (hSrc); /* if(!wcePutFile (T2A(host_file), T2A(new_app_item))) { printf("Failed to copy file."); return EXIT_FAILURE; } */ } } return EXIT_SUCCESS; copyBundleFailure: CeCloseHandle( hDest); CloseHandle (hSrc); return EXIT_FAILURE; }
int _tmain(int argc, _TCHAR* argv[]) { TCHAR *emu_name = NULL; TCHAR *cab_file = NULL; TCHAR *bundle_path = NULL; TCHAR *app_exe = NULL; TCHAR *log_file = NULL; TCHAR *log_port = NULL; TCHAR params_buf[MAX_PATH + 16]; //WIN32_FIND_DATAW findData; int new_copy = 0; int deploy_type; USES_CONVERSION; if (argc >= 5) { //assuming that need to start emulator if (strcmp(T2A(argv[1]), "emu") == 0) { emu_name = argv[2]; app_name = argv[3]; bundle_path = argv[4]; app_exe = argv[5]; log_port = argv[6]; deploy_type = DEPLOY_EMU; } if (strcmp(T2A(argv[1]), "emucab") == 0) { emu_name = argv[2]; cab_file = argv[3]; app_name = argv[4]; log_port = argv[5]; deploy_type = DEPLOY_EMUCAB; } if (strcmp(T2A(argv[1]), "dev") == 0) { app_name = argv[2]; bundle_path = argv[3]; app_exe = argv[4]; log_port = argv[5]; deploy_type = DEPLOY_DEV; } } else if (argc == 5) { //assuming that need to deploy and start on device cab_file = argv[2]; app_name = argv[3]; log_port = argv[4]; deploy_type = DEPLOY_DEVCAB; } else if (argc == 4) { // log if (strcmp(T2A(argv[1]), "log") == 0) { log_file = argv[2]; log_port = argv[3]; app_name = _T(""); deploy_type = DEPLOY_LOG; } } else { usage(); return EXIT_FAILURE; } TCHAR app_dir[MAX_PATH]; _tcscpy(app_dir, TEXT("\\Program Files\\")); _tcscat(app_dir, app_name); _tprintf( TEXT("%s\n"), app_dir); if (deploy_type == DEPLOY_EMU) { if (SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) { HANDLE hFind; CE_FIND_DATA findData; CreateThread(NULL, 0, startDEM, NULL, 0, NULL); _tprintf( TEXT("Starting emulator... ")); if (!emuConnect (emu_name)) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Cradle emulator... ")); if(!emuCradle (emu_name)) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); if (!wceConnect ()) { printf ("Failed to connect to remote device.\n"); goto stop_emu_deploy; } else { hFind = CeFindFirstFile(app_dir, &findData); if (INVALID_HANDLE_VALUE == hFind) { _tprintf( TEXT("Application directory on device was no found\n")); new_copy = 1; if (!CeCreateDirectory(app_dir, NULL)) { printf ("Failed to create app directory\n"); goto stop_emu_deploy; } } FindClose( hFind); if (!findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { _tprintf( TEXT("Error: target directory is file\n")); goto stop_emu_deploy; } TCHAR remote_bundle_path[MAX_PATH]; _tcscpy(remote_bundle_path, app_dir); _tcscat(remote_bundle_path, _T("\\rho")); hFind = CeFindFirstFile(remote_bundle_path, &findData); if (INVALID_HANDLE_VALUE == hFind) { _tprintf( TEXT("Bundle directory on device was no found\n")); if (!CeCreateDirectory(remote_bundle_path, NULL)) { printf ("Failed to create bundle directory\n"); goto stop_emu_deploy; } } FindClose( hFind); int retval = copyExecutable (app_exe, app_dir); if (retval != EXIT_SUCCESS) { printf ("Failed to copy application executable\n"); if (retval == 32) { printf ("Please, stop application on device and try again.\n"); } goto stop_emu_deploy; } if (copyBundle(bundle_path, _T("/"), remote_bundle_path) == EXIT_FAILURE) { printf ("Failed to copy bundle\n"); goto stop_emu_deploy; } emuBringToFront(emu_name); _tprintf( TEXT("Starting application...")); _tcscpy(params_buf, TEXT("\\Program Files\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T("\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T(".exe")); TCHAR params[128]; _tcscpy(params, _T("-log=")); _tcscat(params, log_port); if(!wceRunProcess(T2A(params_buf), T2A(params))) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); wceDisconnect(); } CoUninitialize(); ExitProcess(EXIT_SUCCESS); } // emu "Windows Mobile 6 Professional Emulator" RhodesApplication1 c:/android/runtime-rhostudio.product/RhodesApplication1/bin/RhoBundle "C:/Android/rhodes/platform/wm/bin/Windows Mobile 6 Professional SDK (ARMV4I)/rhodes/Release/RhodesApplication1.exe" 11000 } if (deploy_type == DEPLOY_EMUCAB) { if (SUCCEEDED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) { CreateThread(NULL, 0, startDEM, NULL, 0, NULL); _tprintf( TEXT("Starting emulator... ")); if (!emuConnect (emu_name)) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Cradle emulator... ")); if(!emuCradle (emu_name)) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Loading cab file...")); if (!wcePutFile (T2A(cab_file), "")) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Loading utility dll...")); if (!wcePutFile (RHOSETUP_DLL, "")) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Setup application...")); //FIXME: rake gives pathname with unix-like '/' file separators, //so if we want to use this tool outside of rake, we should remember this //or check and convert cab_file TCHAR *p = _tcsrchr (cab_file, '/'); if (p) p++; _tcscpy(params_buf, TEXT("/noui ")); _tcscat(params_buf, p != NULL ? p : cab_file); if(!wceInvokeCabSetup(T2A(params_buf))) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); emuBringToFront(emu_name); _tprintf( TEXT("Starting application...")); _tcscpy(params_buf, TEXT("\\Program Files\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T("\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T(".exe")); TCHAR params[128]; _tcscpy(params, _T("-log=")); _tcscpy(params, log_port); if(!wceRunProcess(T2A(params_buf), T2A(params))) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); CoUninitialize(); ExitProcess(EXIT_SUCCESS); stop_emu_deploy: CoUninitialize(); ExitProcess(EXIT_FAILURE); } } if (deploy_type == DEPLOY_DEV) { HANDLE hFind; CE_FIND_DATA findData; _tprintf( TEXT("Searching for Windows CE device...")); HRESULT hRapiResult; hRapiResult = CeRapiInit(); if (FAILED(hRapiResult)) { _tprintf( TEXT("FAILED\n")); return false; } _tprintf( TEXT("DONE\n")); hFind = CeFindFirstFile(app_dir, &findData); if (INVALID_HANDLE_VALUE == hFind) { _tprintf( TEXT("Application directory on device was no found\n")); new_copy = 1; if (!CeCreateDirectory(app_dir, NULL)) { printf ("Failed to create app directory\n"); goto stop_emu_deploy; } } FindClose( hFind); if (!findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { _tprintf( TEXT("Error: target directory is file\n")); goto stop_emu_deploy; } TCHAR remote_bundle_path[MAX_PATH]; _tcscpy(remote_bundle_path, app_dir); _tcscat(remote_bundle_path, _T("\\rho")); hFind = CeFindFirstFile(remote_bundle_path, &findData); if (INVALID_HANDLE_VALUE == hFind) { _tprintf( TEXT("Bundle directory on device was no found\n")); if (!CeCreateDirectory(remote_bundle_path, NULL)) { printf ("Failed to create bundle directory\n"); goto stop_emu_deploy; } } FindClose( hFind); int retval = copyExecutable (app_exe, app_dir); if (retval != EXIT_SUCCESS) { printf ("Failed to copy application executable\n"); if (retval == 32) { printf ("Please, stop application on device and try again.\n"); } goto stop_emu_deploy; } if (copyBundle(bundle_path, _T("/"), remote_bundle_path) == EXIT_FAILURE) { printf ("Failed to copy bundle\n"); goto stop_emu_deploy; } Sleep(2 * 1000); _tprintf( TEXT("Starting application...")); _tcscpy(params_buf, TEXT("\\Program Files\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T("\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T(".exe")); _tprintf( TEXT("%s\n"), params_buf); TCHAR params[128]; _tcscpy(params, _T("-log=")); _tcscpy(params, log_port); if(!wceRunProcess(T2A(params_buf), T2A(params))) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); ExitProcess(EXIT_SUCCESS); } if (deploy_type == DEPLOY_DEVCAB) { _tprintf( TEXT("Searching for Windows CE device...")); HRESULT hRapiResult; hRapiResult = CeRapiInit(); if (FAILED(hRapiResult)) { _tprintf( TEXT("FAILED\n")); return false; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Loading cab file to device...")); USES_CONVERSION; if (!wcePutFile (T2A(cab_file), "")) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Loading utility dll...")); if (!wcePutFile (RHOSETUP_DLL, "")) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Setup application...")); //FIXME: rake gives pathname with unix-like '/' file separators, //so if we want to use this tool outside of rake, we should remember this //or check and convert cab_file TCHAR *p = _tcsrchr (cab_file, '/'); if (p) p++; _tcscpy(params_buf, p != NULL ? p : cab_file); //_tcscat(params_buf, p != NULL ? p : cab_file); if(!wceInvokeCabSetup(T2A(params_buf))) { _tprintf( TEXT("FAILED\n")); _tprintf( TEXT("Starting installator GUI ...")); if(!wceRunProcess ("\\windows\\wceload.exe", T2A(p != NULL ? p : cab_file))) { _tprintf( TEXT("FAILED\n")); ExitProcess(EXIT_FAILURE); } else { _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Please continue manually...\n")); ExitProcess(EXIT_SUCCESS); } goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); _tprintf( TEXT("Starting application...")); _tcscpy(params_buf, TEXT("\\Program Files\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T("\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T(".exe")); TCHAR params[128]; _tcscpy(params, _T("-log=")); _tcscpy(params, log_port); if(!wceRunProcess (T2A(params_buf), T2A(params))) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); } if (deploy_type == DEPLOY_LOG) { if (log_file != NULL) { startLogServer(log_file, log_port); } } return EXIT_SUCCESS; }
void DeployDevCommand::runObject() { USES_CONVERSION; EAppType app_type = getAppTypeFromCmdLine(); TCHAR params_buf[MAX_PATH + 16]; int new_copy = 0; TCHAR *app_dir = new TCHAR[MAX_PATH]; getAppDir(&app_dir); HANDLE hFind; CE_FIND_DATA findData; hFind = CeFindFirstFile(app_dir, &findData); if (INVALID_HANDLE_VALUE == hFind) { _tprintf( TEXT("Application directory on device was not found\n")); new_copy = 1; if (!CeCreateDirectory(app_dir, NULL)) { printf ("Failed to create app directory\n"); goto stop_emu_deploy; } } FindClose( hFind); if ((!new_copy) && (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))) { _tprintf( TEXT("Error: target directory is file\n")); goto stop_emu_deploy; } TCHAR remote_bundle_path[MAX_PATH]; _tcscpy(remote_bundle_path, app_dir); _tcscat(remote_bundle_path, _T("\\rho")); hFind = CeFindFirstFile(remote_bundle_path, &findData); if (INVALID_HANDLE_VALUE == hFind) { _tprintf( TEXT("Bundle directory on device was not found\n")); if (!CeCreateDirectory(remote_bundle_path, NULL)) { printf ("Failed to create bundle directory\n"); goto stop_emu_deploy; } } FindClose( hFind); int retval = EXIT_SUCCESS; if (exe_change) { retval = file::copyExecutable (app_exe, app_dir, use_shared_runtime); if (retval != EXIT_SUCCESS) { printf ("Failed to copy application executable\n"); if (retval == 32) { printf ("Please, stop application on device and try again.\n"); } releaseDeploy(); } } else { printf ("%s executable POSTPONE.\n", app_exe); } if(!use_shared_runtime) retval = file::copyLicenseDll(lcdll_path, app_dir); if (retval != EXIT_SUCCESS) { printf ("Failed to copy license dll\n"); if (retval == 32) { printf ("Please, stop application on device and try again.\n"); } goto stop_emu_deploy; } if (file::copyBundle(bundle_path, _T("/"), remote_bundle_path) == EXIT_FAILURE) { printf ("Failed to copy bundle\n"); goto stop_emu_deploy; } // establish network connectivity of the device from Windows Mobile Device Center (if applicable) wmdc::connectWMDC(); Sleep(2 * 1000); _tprintf( TEXT("Starting application...")); TCHAR params[MAX_PATH]; params[0] = 0; if (use_shared_runtime) { _tcscpy(params_buf, RE2_RUNTIME); if (app_type == eRuby) { _tcscpy(params, _T("-approot='\\Program Files\\")); } else { _tcscpy(params, _T("-jsapproot='\\Program Files\\")); } _tcscat(params, app_name); _tcscat(params, _T("'")); } else { _tcscpy(params_buf, TEXT("\\Program Files\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T("\\")); _tcscat(params_buf, app_name); _tcscat(params_buf, _T(".exe")); } //_tcscat(params, _T("-log=")); //_tcscat(params, log_port); _tprintf( TEXT("%s %s\n"), params_buf, params); if(!rapi::wceRunProcess(T2A(params_buf), T2A(params))) { _tprintf( TEXT("FAILED\n")); goto stop_emu_deploy; } _tprintf( TEXT("DONE\n")); ExitProcess(EXIT_SUCCESS); return; stop_emu_deploy: releaseDeploy(); }