platform/wm/tools/detool/detool.cpp in rhodes-2.0.0.beta1 vs platform/wm/tools/detool/detool.cpp in rhodes-2.0.0.beta2
- old
+ new
@@ -210,10 +210,11 @@
//_tprintf( TEXT("Done\n"));
}
#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
+
bool wcePutFile(const char *host_file, const char *wce_file)
{
TCHAR tszSrcFile[MAX_PATH];
WCHAR wszDestFile[MAX_PATH];
BYTE buffer[5120];
@@ -297,10 +298,11 @@
goto FatalError;
}
_tprintf( TEXT("."));
} while (dwNumRead);
//_tprintf( TEXT("\n"));
+
CeCloseHandle( hDest);
CloseHandle (hSrc);
}
wceDisconnect();
return true;
@@ -336,11 +338,10 @@
if (wceConnect()) {
if (!CeCreateProcess(wszProgram, wszArgs, NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi)) {
_tprintf( TEXT("CreateProcess failed with Errorcode = %ld\n"), CeGetLastError());
return false;
}
- WaitForSingleObject(pi.hProcess, INFINITE);
CeCloseHandle( pi.hProcess);
CeCloseHandle( pi.hThread);
}
wceDisconnect();
return true;
@@ -379,70 +380,378 @@
#define EMU "Windows Mobile 6 Professional Emulator"
//#define EMU "USA Windows Mobile 6.5 Professional Portrait QVGA Emulator"
/**
- * detool emu "<emu_name|vmid>" app.cab "app-name"
+ * detool emu "<emu_name|vmid>" "app-name" rhobundle_path exe_name
* or
- * detool dev app.cab "app-name"
+ * detool emucab "<emu_name|vmid>" app.cab "app-name"
+ * or
+ detool dev "app-name" rhobundle_path exe_name
+ or
+ * detool devcab app.cab "app-name"
*/
void usage(void)
{
printf
- ("Rhodes deployment tool for Windows Mobile: \n \
+ ("Rhodes deployment tool for Windows Mobile: \n \
detool emu \"<emu_name|vmid>\" app.cab \"app-name\" \n \
- or \n \
- detool dev app.cab \"app-name\" \n"
+ or \n \
+ detool dev app.cab \"app-name\" \n"
);
}
enum {
+ DEPLOY_EMUCAB,
+ DEPLOY_DEVCAB,
DEPLOY_EMU,
DEPLOY_DEV
};
+int copyExecutable (TCHAR *file_name, TCHAR *app_dir)
+{
+ TCHAR exe_fullpath[MAX_PATH];
+ int retval = 0;
+ HANDLE hDest, hSrc;
+ BYTE buffer[5120];
+ DWORD dwNumRead, dwNumWritten;
+
+ USES_CONVERSION;
+
+ _tcscpy(exe_fullpath, app_dir);
+ _tcscat(exe_fullpath, _T("\\"));
+ _tcscat(exe_fullpath, _T("rhodes.exe"));
+
+
+ hSrc = CreateFile(file_name, 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 EXIT_FAILURE;
+ }
+
+ hDest = CeCreateFile(exe_fullpath, 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 CeGetLastError();
+ }
+
+ do {
+ if(ReadFile(hSrc, &buffer, sizeof(buffer), &dwNumRead, NULL)) {
+ if (!CeWriteFile(hDest, &buffer, dwNumRead, &dwNumWritten, NULL)) {
+ _tprintf( TEXT("Error !!! Writing WinCE file\n"));
+ goto copyFailure;
+ }
+ } else {
+ _tprintf( TEXT("Error !!! Reading host file\n"));
+ goto copyFailure;
+ }
+ _tprintf( TEXT("."));
+ } while (dwNumRead);
+ _tprintf( TEXT("\n"));
+
+ CeCloseHandle( hDest);
+ CloseHandle (hSrc);
+
+ return EXIT_SUCCESS;
+
+copyFailure:
+ CeCloseHandle( hDest);
+ CloseHandle (hSrc);
+/*
+
+ if (wcePutFile (T2A(file_name), T2A(exe_fullpath)))
+ return EXIT_SUCCESS;
+*/
+ return EXIT_FAILURE;
+}
+
+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 *app_name = NULL;
+ TCHAR *bundle_path = NULL;
+ TCHAR *app_exe = NULL;
TCHAR params_buf[MAX_PATH + 16];
+ WIN32_FIND_DATAW findData;
+ int new_copy = 0;
int deploy_type;
- if (argc == 5) { //assuming that need to start emulator
- emu_name = argv[2];
- cab_file = argv[3];
- app_name = argv[4];
- deploy_type = DEPLOY_EMU;
+ 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];
+ deploy_type = DEPLOY_EMU;
+ }
+ if (strcmp(T2A(argv[1]), "emucab") == 0) {
+ emu_name = argv[2];
+ cab_file = argv[3];
+ app_name = argv[4];
+ deploy_type = DEPLOY_EMUCAB;
+ }
+
+ if (strcmp(T2A(argv[1]), "dev") == 0) {
+ app_name = argv[2];
+ bundle_path = argv[3];
+ app_exe = argv[4];
+ deploy_type = DEPLOY_DEV;
+ }
} else if (argc == 4) { //assuming that need to deploy and start on device
cab_file = argv[2];
app_name = argv[3];
- deploy_type = DEPLOY_DEV;
+ deploy_type = DEPLOY_DEVCAB;
} 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, TEXT("\\rhodes.exe"));
+ if(!wceRunProcess(T2A(params_buf), NULL)) {
+ _tprintf( TEXT("FAILED\n"));
+ goto stop_emu_deploy;
+ }
+ _tprintf( TEXT("DONE\n"));
+
+ wceDisconnect();
+ }
+
+ CoUninitialize();
+
+ ExitProcess(EXIT_SUCCESS);
+ }
+ }
+ 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..."));
- USES_CONVERSION;
if (!wcePutFile (T2A(cab_file), "")) {
_tprintf( TEXT("FAILED\n"));
goto stop_emu_deploy;
}
_tprintf( TEXT("DONE\n"));
@@ -482,17 +791,99 @@
}
_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, TEXT("\\rhodes.exe"));
+ _tprintf( TEXT("%s\n"), params_buf);
+
+
+ if(!wceRunProcess(T2A(params_buf), NULL)) {
+ _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)) {