📄 stafjavaservicehelper.cpp
字号:
default: { connection->writeUInt(kSTAFInvalidValue); connection->writeString(STAFString("Invalid Java service ") + "request type: " + STAFString(reqType)); break; } } } catch (STAFException &se) { se.trace("JSTAFSH.HandleRequest()"); } catch (...) { STAFTrace::trace( kSTAFTraceError, "Caught unknown exception in JSTAFSH.HandleRequest()"); } return 0;}void HandleServiceConstruct(STAFConnectionPtr &connection){ STAFString serviceName = connection->readString(); STAFString execInfo = connection->readString(); STAFString writeLocation = connection->readString(); STAFServiceType_t serviceType = static_cast<STAFServiceType_t>(connection->readUInt()); // Attach the current thread JNIEnv *env = 0; jint attachRC = gJVM->AttachCurrentThread(reinterpret_cast<void **>(&env), NULL); if (attachRC != 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error attaching Java VM thread, RC: " + STAFString(attachRC)); connection->writeUInt(kSTAFJavaError); connection->writeString("Error attaching Java VM thread, RC: " + STAFString(attachRC) + " in constructService " "for " + serviceName); return; } // Call JVM to load the class jclass helperClass = env->GetObjectClass(gHelperObj); jmethodID loadService = env->GetMethodID(helperClass, sLoadServiceMethod, sLoadServiceMethodSig); if (loadService == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error getting STAFServiceHelper.loadService() method ID"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting " "STAFServiceHelper.loadService() method ID " "in constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } // Convert the execInfo string to UTF-8 for Java execInfo += kUTF8_NULL; serviceName += kUTF8_NULL; writeLocation += kUTF8_NULL; jstring javaExecInfo = env->NewStringUTF(execInfo.buffer()); if (javaExecInfo == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error converting execInfo string to UTF-8"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error converting execInfo string to UTF-8 " "in constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } jstring javaServiceName = env->NewStringUTF(serviceName.buffer()); if (javaServiceName == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error converting service name string to UTF-8"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error converting service name to UTF-8 " "in constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } jstring javaWriteLocation = env->NewStringUTF(writeLocation.buffer()); jint javaServiceType = serviceType; if (javaWriteLocation == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error converting writeLocation string to UTF-8"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error converting writeLocation to UTF-8 " "in constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } // Call the loadService() method jobject javaResult = env->CallObjectMethod(gHelperObj, loadService, javaServiceName, javaExecInfo, javaWriteLocation, // XXX: Pass here? javaServiceType); if (javaResult == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error calling the loadService method"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error calling the loadService method in " "constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } // Get the field IDs of the STAFResult class jclass resultClass = env->FindClass(sSTAFResultClass); if (resultClass == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error finding Java class " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error finding Java class " + *sSTAFResultClassStringPtr + " in constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } jfieldID resultRCID = env->GetFieldID(resultClass, sSTAFResultRCField, sJavaIntFieldType); if (resultRCID == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error getting rc field of Java class " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting rc field of Java class " + *sSTAFResultClassStringPtr + " in constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } jfieldID resultStringID = env->GetFieldID(resultClass, sSTAFResultResultField, sJavaStringFieldType); if (resultStringID == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error getting result field of Java class " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting result field of Java class " + *sSTAFResultClassStringPtr + " in constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } // Get the return code and result string from the STAFResult object jint rc = env->GetIntField(javaResult, resultRCID); jstring javaResultString = (jstring)env->GetObjectField(javaResult, resultStringID); const char *utfResultString = env->GetStringUTFChars(javaResultString, 0); if (utfResultString == 0) { STAFTrace::trace( kSTAFTraceError, "Error constructing service " + serviceName + ": Error getting UTF-8 result string"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting UTF-8 result string in " "constructService for " + serviceName); gJVM->DetachCurrentThread(); return; } STAFString resultString(utfResultString, env->GetStringUTFLength(javaResultString), STAFString::kUTF8); env->ReleaseStringUTFChars(javaResultString, utfResultString); connection->writeUInt(rc); connection->writeString(resultString); // Detach the current thread gJVM->DetachCurrentThread();}void HandleServiceInit(STAFConnectionPtr &connection){ STAFString serviceName = connection->readString(); STAFString parms = connection->readString(); STAFString writeLocation = connection->readString(); // Attach the current thread JNIEnv *env = 0; jint attachRC = gJVM->AttachCurrentThread(reinterpret_cast<void **>(&env), NULL); if (attachRC != 0) { STAFTrace::trace( kSTAFTraceError, "Error initializing service " + serviceName + ": Error attaching Java VM thread, RC: " + STAFString(attachRC)); connection->writeUInt(kSTAFJavaError); connection->writeString("Error attaching Java VM thread, RC: " + STAFString(attachRC) + " in initService " "for " + serviceName); return; } // Call JVM to load the class jclass helperClass = env->GetObjectClass(gHelperObj); jmethodID initService = env->GetMethodID(helperClass, sInitServiceMethod, sInitServiceMethodSig); if (initService == 0) { STAFTrace::trace( kSTAFTraceError, "Error initializing service " + serviceName + ": Error getting STAFServiceHelper.initService() method ID"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting " "STAFServiceHelper.initService() method ID"); gJVM->DetachCurrentThread(); return; } // Convert the service name, parms, and writeLocation strings to UTF-8 // for Java serviceName += kUTF8_NULL; parms = parms.replace(kUTF8_NULL, kUTF8_NULL2); parms += kUTF8_NULL; writeLocation += kUTF8_NULL; jstring javaServiceName = env->NewStringUTF(serviceName.buffer()); if (javaServiceName == 0) { STAFTrace::trace( kSTAFTraceError, "Error initializing service " + serviceName + ": Error converting service name to UTF-8"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error converting service name " + serviceName + " to UTF-8 in initService"); gJVM->DetachCurrentThread(); return; } jstring javaParms = env->NewStringUTF(parms.buffer()); if (javaParms == 0) { STAFTrace::trace( kSTAFTraceError, "Error initializing service " + serviceName + ": Error converting Java parameters to UTF-8"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error converting Java parameters for " + serviceName + " to UTF-8 in initService"); gJVM->DetachCurrentThread(); return; } jstring javaWriteLocation = env->NewStringUTF(writeLocation.buffer()); if (javaWriteLocation == 0) { STAFTrace::trace( kSTAFTraceError, "Error initializing service " + serviceName + ": Error converting writeLocation string to UTF-8"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error converting writeLocation to UTF-8 " "in initService for " + serviceName); gJVM->DetachCurrentThread(); return; } // Load and construct the ServiceInit class jclass serviceInitClass = env->FindClass(sServiceInitClass); if (serviceInitClass == 0) { STAFTrace::trace( kSTAFTraceError, "Error initializing service " + serviceName + ": Error finding Java class " + *sServiceInitClassStringPtr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -