mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-06 07:45:50 +02:00
[225553][wince] Apply patch for creating processes on the device
This commit is contained in:
parent
f765df3187
commit
8f33401046
7 changed files with 131 additions and 1 deletions
|
@ -15,6 +15,7 @@ import org.eclipse.tm.rapi.IRapiDevice;
|
||||||
import org.eclipse.tm.rapi.IRapiEnumDevices;
|
import org.eclipse.tm.rapi.IRapiEnumDevices;
|
||||||
import org.eclipse.tm.rapi.IRapiSession;
|
import org.eclipse.tm.rapi.IRapiSession;
|
||||||
import org.eclipse.tm.rapi.OS;
|
import org.eclipse.tm.rapi.OS;
|
||||||
|
import org.eclipse.tm.rapi.ProcessInformation;
|
||||||
import org.eclipse.tm.rapi.RapiConnectionInfo;
|
import org.eclipse.tm.rapi.RapiConnectionInfo;
|
||||||
import org.eclipse.tm.rapi.RapiDeviceInfo;
|
import org.eclipse.tm.rapi.RapiDeviceInfo;
|
||||||
import org.eclipse.tm.rapi.RapiException;
|
import org.eclipse.tm.rapi.RapiException;
|
||||||
|
@ -194,6 +195,22 @@ public class RapiExamples {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the specified URL in a browser. The browser is started with
|
||||||
|
* {@link IRapiSession#createProcess(String, String, int)} and the URL
|
||||||
|
* is passed as command line argument.
|
||||||
|
*/
|
||||||
|
void openUrl(String url) throws RapiException {
|
||||||
|
System.out.println(">>> openUrl() url: " + url);
|
||||||
|
ProcessInformation pi = session.createProcess("\\Windows\\iexplore.exe", url, 0);
|
||||||
|
System.out.println("hProcess: " + Integer.toHexString(pi.hProcess));
|
||||||
|
System.out.println("hThread: " + Integer.toHexString(pi.hThread));
|
||||||
|
System.out.println("dwProcessId: " + Integer.toHexString(pi.dwProcessId));
|
||||||
|
System.out.println("dwThreadId: " + Integer.toHexString(pi.dwThreadId));
|
||||||
|
session.closeHandle(pi.hProcess);
|
||||||
|
session.closeHandle(pi.hThread);
|
||||||
|
}
|
||||||
|
|
||||||
void runExamples() {
|
void runExamples() {
|
||||||
try {
|
try {
|
||||||
initRapi();
|
initRapi();
|
||||||
|
@ -216,6 +233,7 @@ public class RapiExamples {
|
||||||
statFile("\\foo.txt");
|
statFile("\\foo.txt");
|
||||||
System.out.println(">>> printDeviceTree()");
|
System.out.println(">>> printDeviceTree()");
|
||||||
printDeviceTree("\\", 0);
|
printDeviceTree("\\", 0);
|
||||||
|
openUrl("www.eclipse.org/dsdp/tm");
|
||||||
session.uninit();
|
session.uninit();
|
||||||
} catch (RapiException e) {
|
} catch (RapiException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
Binary file not shown.
|
@ -435,4 +435,62 @@ fail:
|
||||||
if (arg3 && lparg3) env->ReleaseLongArrayElements(arg3, lparg3, 0);
|
if (arg3 && lparg3) env->ReleaseLongArrayElements(arg3, lparg3, 0);
|
||||||
if (arg4 && lparg4) env->ReleaseLongArrayElements(arg4, lparg4, 0);
|
if (arg4 && lparg4) env->ReleaseLongArrayElements(arg4, lparg4, 0);
|
||||||
return rc;
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct PROCESS_INFORMATION_FID_CACHE
|
||||||
|
{
|
||||||
|
int cached;
|
||||||
|
jclass clazz;
|
||||||
|
jfieldID hProcess, hThread;
|
||||||
|
jfieldID dwProcessId, dwThreadId;
|
||||||
|
};
|
||||||
|
|
||||||
|
PROCESS_INFORMATION_FID_CACHE PROCESS_INFORMATIONFc;
|
||||||
|
|
||||||
|
void cachePROCESS_INFORMATIONFields(JNIEnv *env, jobject lpObject)
|
||||||
|
{
|
||||||
|
if (PROCESS_INFORMATIONFc.cached) return;
|
||||||
|
PROCESS_INFORMATIONFc.clazz = env->GetObjectClass(lpObject);
|
||||||
|
PROCESS_INFORMATIONFc.hProcess = env->GetFieldID(PROCESS_INFORMATIONFc.clazz, "hProcess", "I");
|
||||||
|
PROCESS_INFORMATIONFc.hThread = env->GetFieldID(PROCESS_INFORMATIONFc.clazz, "hThread", "I");
|
||||||
|
PROCESS_INFORMATIONFc.dwProcessId = env->GetFieldID(PROCESS_INFORMATIONFc.clazz, "dwProcessId", "I");
|
||||||
|
PROCESS_INFORMATIONFc.dwThreadId = env->GetFieldID(PROCESS_INFORMATIONFc.clazz, "dwThreadId", "I");
|
||||||
|
PROCESS_INFORMATIONFc.cached = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPROCESS_INFORMATIONFields(JNIEnv *env, jobject lpObject, PROCESS_INFORMATION *pi)
|
||||||
|
{
|
||||||
|
if (!PROCESS_INFORMATIONFc.cached) cachePROCESS_INFORMATIONFields(env, lpObject);
|
||||||
|
env->SetIntField(lpObject, PROCESS_INFORMATIONFc.hProcess, (jint)pi->hProcess);
|
||||||
|
env->SetIntField(lpObject, PROCESS_INFORMATIONFc.hThread, (jint)pi->hThread);
|
||||||
|
env->SetIntField(lpObject, PROCESS_INFORMATIONFc.dwProcessId, (jint)pi->dwProcessId);
|
||||||
|
env->SetIntField(lpObject, PROCESS_INFORMATIONFc.dwThreadId, (jint)pi->dwThreadId);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL RAPI_NATIVE(CeCreateProcess)
|
||||||
|
(JNIEnv *env, jobject that, jint arg0, jstring arg1, jstring arg2, jint arg3, jobject arg4)
|
||||||
|
{
|
||||||
|
jboolean rc = 0;
|
||||||
|
const jchar *lparg1 = NULL;
|
||||||
|
const jchar *lparg2 = NULL;
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
|
||||||
|
if (arg0 == 0) return 0;
|
||||||
|
if (arg1) {
|
||||||
|
lparg1 = env->GetStringChars(arg1, NULL);
|
||||||
|
if (lparg1 == NULL) goto fail;
|
||||||
|
}
|
||||||
|
if (arg2) {
|
||||||
|
lparg2 = env->GetStringChars(arg2, NULL);
|
||||||
|
if (lparg2 == NULL) goto fail;
|
||||||
|
}
|
||||||
|
IRAPISession *pSession = (IRAPISession*) arg0;
|
||||||
|
rc = pSession->CeCreateProcess((LPCWSTR)lparg1, (LPCWSTR)lparg2, NULL, NULL, FALSE, arg3, NULL, NULL, NULL, &pi);
|
||||||
|
if (!rc) goto fail;
|
||||||
|
if (arg4) setPROCESS_INFORMATIONFields(env, arg4, &pi);
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (arg1 && lparg1) env->ReleaseStringChars(arg1, lparg1);
|
||||||
|
if (arg2 && lparg2) env->ReleaseStringChars(arg2, lparg2);
|
||||||
|
return rc;
|
||||||
}
|
}
|
|
@ -175,6 +175,14 @@ JNIEXPORT jint JNICALL Java_org_eclipse_tm_internal_rapi_RapiSession_CeGetFileSi
|
||||||
JNIEXPORT jboolean JNICALL Java_org_eclipse_tm_internal_rapi_RapiSession_CeGetFileTime
|
JNIEXPORT jboolean JNICALL Java_org_eclipse_tm_internal_rapi_RapiSession_CeGetFileTime
|
||||||
(JNIEnv *, jobject, jint, jint, jlongArray, jlongArray, jlongArray);
|
(JNIEnv *, jobject, jint, jint, jlongArray, jlongArray, jlongArray);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_eclipse_tm_internal_rapi_RapiSession
|
||||||
|
* Method: CeCreateProcess
|
||||||
|
* Signature: (ILjava/lang/String;Ljava/lang/String;ILorg/eclipse/tm/rapi/ProcessInformation;)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_org_eclipse_tm_internal_rapi_RapiSession_CeCreateProcess
|
||||||
|
(JNIEnv *, jobject, jint, jstring, jstring, jint, jobject);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -14,6 +14,7 @@ import java.util.Date;
|
||||||
|
|
||||||
import org.eclipse.tm.rapi.IRapiSession;
|
import org.eclipse.tm.rapi.IRapiSession;
|
||||||
import org.eclipse.tm.rapi.OS;
|
import org.eclipse.tm.rapi.OS;
|
||||||
|
import org.eclipse.tm.rapi.ProcessInformation;
|
||||||
import org.eclipse.tm.rapi.RapiException;
|
import org.eclipse.tm.rapi.RapiException;
|
||||||
import org.eclipse.tm.rapi.RapiFindData;
|
import org.eclipse.tm.rapi.RapiFindData;
|
||||||
|
|
||||||
|
@ -249,7 +250,15 @@ public class RapiSession extends IRapiSession {
|
||||||
throw new RapiException("CeGetFileTime failed", getError()); //$NON-NLS-1$
|
throw new RapiException("CeGetFileTime failed", getError()); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
return new Date((lwTime[0] / 10000) - OS.TIME_DIFF);
|
return new Date((lwTime[0] / 10000) - OS.TIME_DIFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ProcessInformation createProcess(String appName, String commandLine, int creationFlags) throws RapiException {
|
||||||
|
ProcessInformation pi = new ProcessInformation();
|
||||||
|
if (!CeCreateProcess(addr, appName, commandLine, creationFlags, pi)) {
|
||||||
|
throw new RapiException("CeCreateProcess failed", getError()); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return pi;
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "[RapiSession] addr: " + Integer.toHexString(addr); //$NON-NLS-1$
|
return "[RapiSession] addr: " + Integer.toHexString(addr); //$NON-NLS-1$
|
||||||
|
@ -307,4 +316,7 @@ public class RapiSession extends IRapiSession {
|
||||||
|
|
||||||
private final native boolean CeGetFileTime(int addr, int hFile,
|
private final native boolean CeGetFileTime(int addr, int hFile,
|
||||||
long[] lpCreationTime, long[] lpLastAccessTime, long[] lpLastWriteTime);
|
long[] lpCreationTime, long[] lpLastAccessTime, long[] lpLastWriteTime);
|
||||||
|
|
||||||
|
private final native boolean CeCreateProcess(int addr, String lpApplicationName,
|
||||||
|
String lpCommandLine, int dwCreationFlags, ProcessInformation lpProcessInformation);
|
||||||
}
|
}
|
||||||
|
|
|
@ -234,4 +234,14 @@ public abstract class IRapiSession extends IUnknown {
|
||||||
*/
|
*/
|
||||||
public abstract Date getFileLastWriteTime(int handle) throws RapiException;
|
public abstract Date getFileLastWriteTime(int handle) throws RapiException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new process on the remote device.
|
||||||
|
* @param appName module to execute
|
||||||
|
* @param commandLine command line arguments
|
||||||
|
* @param creationFlags additional flags controlling the creation
|
||||||
|
* @return <code>ProcessInformaion</code> containing information about the new process
|
||||||
|
* @throws RapiException if an error occurs.
|
||||||
|
*/
|
||||||
|
public abstract ProcessInformation createProcess(String appName, String commandLine,
|
||||||
|
int creationFlags) throws RapiException;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 Radoslav Gerganov
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Radoslav Gerganov - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tm.rapi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class contains information for a new process
|
||||||
|
* created with {@link IRapiSession#createProcess(String, String, int)}
|
||||||
|
*
|
||||||
|
* @author Radoslav Gerganov
|
||||||
|
*/
|
||||||
|
public class ProcessInformation {
|
||||||
|
public int hProcess;
|
||||||
|
public int hThread;
|
||||||
|
public int dwProcessId;
|
||||||
|
public int dwThreadId;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue