⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stafjavaservicehelper.cpp

📁 Software Testing Automation Framework (STAF)的开发代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    jmethodID constructor = env->GetMethodID(serviceRequestClass,                                             sJavaConstructorMethod,                                             sServiceRequestConstructorSig);    if (constructor == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Service: " + serviceName +            ", Request: " + request +            ", Error loading constructor for Java class: " +            *sServiceRequestClassStringPtr);        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error loading constructor for Java class " +                                *sServiceRequestClassStringPtr);        gJVM->DetachCurrentThread();        return;    }    jobject serviceRequestObject =        env->NewObject(serviceRequestClass, constructor,                       javaSTAFInstanceUUID, javaMachine, javaMachineNickname,                       javaHandleName,                       (jint)handle, (jint)trustLevel,                       (jboolean)isLocalRequest, (jint)diagEnabled,                       javaRequest, (jint)requestNumber,                       javaUser, javaEndpoint, javaPhysicalInterfaceID);    if (serviceRequestObject == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Service: " + serviceName +            ", Request: " + request +            ", Error creating Java object of type " +            *sServiceRequestClassStringPtr);        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error creating Java object of type " +                                *sServiceRequestClassStringPtr);        gJVM->DetachCurrentThread();        return;    }    // Call the callService() method    jobject javaResult = env->CallObjectMethod(gHelperObj, callService,                                               javaServiceName,                                               serviceRequestObject);    if (javaResult == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Service: " + serviceName +            ", Request: " + request +            ", Error calling callService method for ServiceRequest object");        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error calling callService method "                                "for ServiceRequest object");        gJVM->DetachCurrentThread();        return;    }    env->DeleteLocalRef(serviceRequestClass);    env->DeleteLocalRef(javaSTAFInstanceUUID);    env->DeleteLocalRef(javaMachine);    env->DeleteLocalRef(javaMachineNickname);    env->DeleteLocalRef(javaHandleName);    env->DeleteLocalRef(javaRequest);    env->DeleteLocalRef(javaUser);    env->DeleteLocalRef(javaEndpoint);    env->DeleteLocalRef(javaPhysicalInterfaceID);    env->DeleteLocalRef(serviceRequestObject);    env->DeleteLocalRef(javaServiceName);    // Get the field IDs of the STAFResult class    jclass resultClass = env->FindClass(sSTAFResultClass);    if (resultClass == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Service: " + serviceName +            ", Request: " + request +            ", Error finding Java class: " + *sSTAFResultClassStringPtr);        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error finding Java class " +                                *sSTAFResultClassStringPtr);        gJVM->DetachCurrentThread();        return;    }    jfieldID resultRCID = env->GetFieldID(resultClass, sSTAFResultRCField,                                          sJavaIntFieldType);    if (resultRCID == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Service: " + serviceName +            ", Request: " + request +            ", 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);        gJVM->DetachCurrentThread();        return;    }    jfieldID resultStringID = env->GetFieldID(resultClass,                                              sSTAFResultResultField,                                              sJavaStringFieldType);    if (resultStringID == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Service: " + serviceName +            ", Request: " + request +            ", 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);        gJVM->DetachCurrentThread();        return;    }    env->DeleteLocalRef(resultClass);    // Get the return code and result string from the STAFResult object    int rc = env->GetIntField(javaResult, resultRCID);    jstring javaResultString = (jstring)env->GetObjectField(javaResult,                                                            resultStringID);    env->DeleteLocalRef(javaResult);    const char *utfResultString =               env->GetStringUTFChars(javaResultString, 0);    if (utfResultString == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Service: " + serviceName +            ", Request: " + request +            ", Error getting result string from the STAFResult object");        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error getting result string from the "                                "STAFResult object");        gJVM->DetachCurrentThread();        return;    }    STAFString resultString(utfResultString,                            env->GetStringUTFLength(javaResultString),                            STAFString::kUTF8);    env->ReleaseStringUTFChars(javaResultString, utfResultString);    env->DeleteLocalRef(javaResultString);        connection->writeUInt(rc);    connection->writeString(resultString);    // Detach the current thread    gJVM->DetachCurrentThread();}void HandleServiceTerm(STAFConnectionPtr &connection){    STAFString serviceName = connection->readString();    // Attach the current thread    JNIEnv *env = 0;    jint attachRC = gJVM->AttachCurrentThread(reinterpret_cast<void **>(&env),                                              NULL);    if (attachRC != 0)    {        STAFTrace::trace(            kSTAFTraceError, "Terminating service: " + serviceName +            ", Error attaching Java VM thread, RC: " + STAFString(attachRC));        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error attaching Java VM thread, RC: " +                                STAFString(attachRC) + " during termService "                                " for " + serviceName);        return;    }    jclass helperClass = env->GetObjectClass(gHelperObj);    jmethodID termService = env->GetMethodID(helperClass, sTermServiceMethod,                                             sTermServiceMethodSig);    if (termService == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Terminating service: " + serviceName +            ", Error getting STAFServiceHelper.termService() method ID");        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error getting "                                "STAFServiceHelper.termService() method ID "                                "for " + serviceName);        gJVM->DetachCurrentThread();        return;    }    // Convert the service name to UTF-8 for Java    serviceName += kUTF8_NULL;    jstring javaServiceName = env->NewStringUTF(serviceName.buffer());    if (javaServiceName == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Terminating service: " + serviceName +            ", Error converting service name to UTF-8");        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error converting service name to UTF-8 "                                "during termService for " + serviceName);        gJVM->DetachCurrentThread();        return;    }    // Call the termService() method    jobject javaResult = env->CallObjectMethod(gHelperObj, termService,                                               javaServiceName);    if (javaResult == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Terminating service: " + serviceName +            ", Error calling termService method");        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error calling termService method for " +                                serviceName);        gJVM->DetachCurrentThread();        return;    }    // Get the field IDs of the STAFResult class    jclass resultClass = env->FindClass(sSTAFResultClass);    if (resultClass == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Terminating service: " + serviceName +            ", Error finding Java class " + *sSTAFResultClassStringPtr);        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error finding load Java class " +                                *sSTAFResultClassStringPtr +                                " during termService for " + serviceName);        gJVM->DetachCurrentThread();        return;    }    jfieldID resultRCID = env->GetFieldID(resultClass, sSTAFResultRCField,                                          sJavaIntFieldType);    if (resultRCID == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Terminating 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 +                                " during termService for " + serviceName);        gJVM->DetachCurrentThread();        return;    }    jfieldID resultStringID = env->GetFieldID(resultClass,                                              sSTAFResultResultField,                                              sJavaStringFieldType);    if (resultStringID == 0)    {        STAFTrace::trace(            kSTAFTraceError, "Terminating 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 +                                " during termService 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, "Terminating service: " + serviceName +            ", Error getting result string of Java class " +            *sSTAFResultClassStringPtr);        env->ExceptionDescribe();        env->ExceptionClear();        connection->writeUInt(kSTAFJavaError);        connection->writeString("Error getting result string of Java class " +                                *sSTAFResultClassStringPtr +                                " during termService 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();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -