00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #include "agentpackethandler.h"
00028
00029 using namespace inspectorj::agent::commandset;
00030 using namespace inspectorj::jdwp;
00031
00032 namespace inspectorj {
00033 namespace agent {
00034
00040 AgentPacketHandler::AgentPacketHandler(JavaVM* vm, JNIEnv *env, jvmtiEnv *jvmti, AgentSocket *socket)
00041 : vm(vm), env(env), jvmti(jvmti), socket(socket)
00042 {
00043
00044 createCommandSets();
00045 }
00046
00050 AgentPacketHandler::~AgentPacketHandler()
00051 {
00052 if (vmCmdSet) {
00053 delete vmCmdSet;
00054
00055 }
00056 }
00057
00061 void AgentPacketHandler::createCommandSets()
00062 {
00063 vmCmdSet = new VirtualMachineCmdSet(vm, env, jvmti);
00064 refTypeCmdSet = new ReferenceTypeCmdSet(vm, env, jvmti);
00065 bcCmdSet = new BytecodeCmdSet(vm, env, jvmti);
00066 }
00067
00071 void AgentPacketHandler::attachCurrentThreadToVM()
00072 {
00073 vm->AttachCurrentThread((void**)&env, NULL);
00074 }
00075
00076
00081 void AgentPacketHandler::writeReply(JDWPReply* reply)
00082 {
00083 if (reply) {
00084 socket->writeReply(reply);
00085 }
00086 }
00087
00088
00093 void AgentPacketHandler::processCommand(JDWPCommand *cmd)
00094 {
00095 JDWPCommandSet *cmdSet = getCommandSet(cmd->getCmdSet());
00096
00097
00098 if (!cmdSet) {
00099 jdwpReplyPacket replyPkt;
00100 replyPkt.len = (jint)11;
00101 replyPkt.id = cmd->getId();
00102 replyPkt.flags = (jbyte)JDWPTRANSPORT_FLAGS_REPLY;
00103 replyPkt.errorCode = (jshort)ERR_NOT_IMPLEMENTED;
00104
00105 JDWPReply *reply = new JDWPReply(replyPkt);
00106 writeReply(reply);
00107 } else {
00108 cmdSet->process(cmd, boost::bind(&AgentPacketHandler::writeReply, this, _1));
00109 }
00110
00111 delete cmd;
00112 }
00113
00118 void AgentPacketHandler::setAgentSocket(AgentSocket *& socket)
00119 {
00120 this->socket = socket;
00121 }
00122
00127 JDWPCommandSet* AgentPacketHandler::getCommandSet(jbyte cmd)
00128 {
00129 switch (cmd) {
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 case BYTECODE_COMMAND_SET : return bcCmdSet;
00148 case VM_COMMAND_SET : return vmCmdSet;
00149 case REF_TYPE_COMMAND_SET : return refTypeCmdSet;
00150 default: return (JDWPCommandSet*)0;
00151
00152 }
00153 return vmCmdSet;
00154 }
00155
00156 }
00157 }