char* PayloadRaw::Content(Size_t pos) { unsigned int bufnum; Size_t bufpos; if(!BufferAtPos(buf_,pos-offset_,bufnum,bufpos)) { failure_ = MCC_Status(GENERIC_ERROR,"RAW","Position is out of range"); return NULL; }; return buf_[bufnum].data+bufpos; }
char* PayloadRaw::Insert(const char* s,Size_t pos,Size_t size) { if(size < 0) size=strlen(s); char* s_ = Insert(pos,size); if(s_) { memcpy(s_,s,size); } else { failure_ = MCC_Status(GENERIC_ERROR,"RAW","Failed to allocate new buffer"); }; return s_; }
Arc::MCC_Status Service_JavaWrapper::process(Arc::Message& inmsg, Arc::Message& outmsg) { JNIEnv *jenv = NULL; /* Attach to the current Java engine thread */ jvm->AttachCurrentThread((void **)&jenv, NULL); /* Get the process function of service */ jmethodID processID = jenv->GetMethodID(serviceClass, "process", "(Lnordugrid/arc/SOAPMessage;Lnordugrid/arc/SOAPMessage;)Lnordugrid/arc/MCC_Status;"); if (processID == NULL) { return java_error(jenv, "Cannot find process method of Java class"); } /* convert inmsg and outmsg to Java objects */ Arc::SOAPMessage *inmsg_ptr = NULL; Arc::SOAPMessage *outmsg_ptr = NULL; try { inmsg_ptr = new Arc::SOAPMessage(inmsg); outmsg_ptr = new Arc::SOAPMessage(outmsg); } catch(std::exception& e) { }; if(!inmsg_ptr) { logger.msg(Arc::ERROR, "input is not SOAP"); return make_fault(outmsg); }; if(!outmsg_ptr) { logger.msg(Arc::ERROR, "output is not SOAP"); return make_fault(outmsg); }; jclass JSOAPMessageClass = jenv->FindClass("nordugrid/arc/SOAPMessage"); if (JSOAPMessageClass == NULL) { return java_error(jenv, "Cannot find SOAPMessage object"); } /* Get the constructor of Java object */ jmethodID constructorID = jenv->GetMethodID(JSOAPMessageClass, "<init>", "(I)V"); if (constructorID == NULL) { return java_error(jenv, "Cannot find constructor function of message"); } /* Convert C++ object to Java objects */ jobject jinmsg = jenv->NewObject(JSOAPMessageClass, constructorID, (jlong)((long int)inmsg_ptr)); if (jinmsg == NULL) { return java_error(jenv, "Cannot convert input message to Java object"); } jobject joutmsg = jenv->NewObject(JSOAPMessageClass, constructorID, (jlong)((long int)outmsg_ptr)); if (jinmsg == NULL) { return java_error(jenv, "Cannot convert output message to Java object"); } /* Create arguments for Java process function */ jvalue args[2]; args[0].l = jinmsg; args[1].l = joutmsg; /* Call the process method of Java object */ jobject jmcc_status = jenv->CallObjectMethodA(serviceObj, processID, args); if (jmcc_status == NULL) { return java_error(jenv, "Error in call process function of Java object"); } /* Get SWIG specific getCPtr function of Message class */ jmethodID msg_getCPtrID = jenv->GetStaticMethodID(JSOAPMessageClass, "getCPtr", "(Lnordugrid/arc/SOAPMessage;)J"); if (msg_getCPtrID == NULL) { return java_error(jenv, "Cannot find getCPtr method of Java Message class"); } /* Get Java MCC_Status class */ jclass JMCC_StatusClass = jenv->FindClass("nordugrid/arc/MCC_Status"); if (JMCC_StatusClass == NULL) { logger.msg(Arc::ERROR, "Cannot find MCC_Status object"); /* Cleanup */ jvm->DetachCurrentThread(); return Arc::MCC_Status(Arc::GENERIC_ERROR); } /* Get SWIG specific getCPtr function of MCC_Status class */ jmethodID mcc_status_getCPtrID = jenv->GetStaticMethodID(JMCC_StatusClass, "getCPtr", "(Lnordugrid/arc/MCC_Status;)J"); if (mcc_status_getCPtrID == NULL) { return java_error(jenv, "Cannot find getCPtr method of Java MCC_Status class"); } /* Convert Java status object to C++ class */ jlong mcc_status_addr = jenv->CallStaticLongMethod(JMCC_StatusClass, mcc_status_getCPtrID, jmcc_status); if (!mcc_status_addr) { logger.msg(ERROR, "Java object returned NULL status"); return MCC_Status(GENERIC_ERROR); } Arc::MCC_Status status(*((Arc::MCC_Status *)(long)mcc_status_addr)); /* Convert Java output message object to C++ class */ jlong outmsg_addr = jenv->CallStaticLongMethod(JSOAPMessageClass, msg_getCPtrID, joutmsg); Arc::SOAPMessage *outmsg_ptr2 = (Arc::SOAPMessage *)(long)outmsg_addr; /* std::string xml; outmsg_ptr2->Payload()->GetXML(xml); std::cout << xml << std::endl; */ Arc::PayloadSOAP *pl = new Arc::PayloadSOAP(*(outmsg_ptr2->Payload())); outmsg.Payload((MessagePayload *)pl); // XXX: how to handle error? /* Detach from the Java engine */ jvm->DetachCurrentThread(); return status; }