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

📄 debugmsgreceiver.cpp

📁 用bcg库编写的java IDE 源码
💻 CPP
字号:
// DebugMsgReceiver.cpp : implementation file
//

#include "stdafx.h"
#include "VisualJava.h"
#include "DebugMsgReceiver.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//static genStack<int> outstandingIDs;
static idgen = 0;

#define FIELD_ID_SIZE   0
#define METHOD_ID_SIZE  1
#define OBJECT_ID_SIZE  2
#define REFTYPE_ID_SIZE 3
#define FRAME_ID_SIZE   4
/////////////////////////////////////////////////////////////////////////////
// CDebugMsgReceiver

CDebugMsgReceiver::CDebugMsgReceiver()
{
  m_nAmountRead = 0;
  m_pPacket     = NULL;
  m_bLengthRead = FALSE;
  m_nMsgLength  = 0;
  m_bHandShaken = FALSE;
  memset(m_cHandShake,0,14);
  m_iIDSizes[0] =4;
  m_iIDSizes[1] =4;
  m_iIDSizes[2] =8;
  m_iIDSizes[2] =8;
  m_iIDSizes[2] =4;
}

CDebugMsgReceiver::~CDebugMsgReceiver()
{
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CDebugMsgReceiver, CSocket)
	//{{AFX_MSG_MAP(CDebugMsgReceiver)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CDebugMsgReceiver member functions





void CDebugMsgReceiver::OnReceive(int nErrorCode) 
{
  CSocket::OnReceive(nErrorCode);
  if(!m_bHandShaken)
  {
	CSocketFile f(this,FALSE);
	f.Read(m_cHandShake,14);
	m_bHandShaken = TRUE;
  }
  else
  {	
	{
      CSocketFile socf(this,FALSE);
      socf.Read(&m_nMsgLength,sizeof(int));
      
	  m_nMsgLength = ntohl(m_nMsgLength);
 	  
	  m_nMsgLength -= sizeof(int);

	  //allocate packet buffer
	  m_pPacket = new BYTE[m_nMsgLength];

      int id =0;
	  socf.Read(&id,sizeof(int));
	  id = ntohl(id);

	  if(id == 0)
	  {
		socf.Read(m_pPacket,m_nMsgLength-(sizeof(int)));
		free(m_pPacket);
		SetBreakPoint();
		return;
	  }
	  else
	  {
        memcpy(m_pPacket,&id,sizeof(int));
        socf.Read(m_pPacket+sizeof(int),m_nMsgLength-(sizeof(int)));

		//process packet
        ProcessPacket();
	  }
	}
  }
}

void CDebugMsgReceiver::RunToCursor()
{

}

 #define DB_COMMANDSET_VM          1

 #define DB_COMMAND_GETCLASSREF    2
 #define DB_CMDID_GETCLASSREF      27

 #define DB_COMMAND_GETSIZES       7
 #define DB_CMDID_GETSIZES         17



 #define DB_CMDSET_EVENTREQUEST    15


 #define CMDSET_EVENTREQUEST_SET   1                 

 #define DB_COMMAND_GETALLCLASSREF 3

 #define DB_CMNDID_BREAKPOINT      28

 #define DB_CMNDID_SETEVENT        29

 #define HEADER_SIZE               11
 #define EVENT_THREAD              1

void CDebugMsgReceiver::SetBreakPoint()
{
	
	{
  int nSize = HEADER_SIZE;
  m_pPacket = new BYTE[nSize];

  //packet header
  packetheader header(11,DB_CMDID_GETCLASSREF,0,1,3);
  header.create(m_pPacket);

  send(m_hSocket,(char*)m_pPacket,nSize,0);
  
  //request loaded class references
  /*
  int id = DB_CMDID_GETCLASSREF;
  memcpy(m_pPacket+sizeof(int),&id,sizeof(int));
  m_pPacket[11] = 3;
  send(m_hSocket,(char*)m_pPacket,nSize,0);
  */
  free(m_pPacket);
  m_pPacket = NULL;
	}
	
	/*
	{
  int nSize = HEADER_SIZE+(sizeof(BYTE)*3)+(sizeof(int)*2);
  m_pPacket = new BYTE[nSize];

  //packet header
  packetheader header(11,DB_CMNDID_SETEVENT,0,DB_CMDSET_EVENTREQUEST,1);
  header.create(m_pPacket);

  //event request packet header size:
  EventRequestPacket evPacket(8,EVENT_THREAD,1);
  evPacket.create(m_pPacket+HEADER_SIZE);
  
  //kind of event
  int offset   = HEADER_SIZE+(sizeof(BYTE)*2)+sizeof(int);
  BYTE modKind = 1;
  int  count   = 1;
  memcpy(m_pPacket+offset,&modKind,sizeof(BYTE));
  memcpy(m_pPacket+offset+sizeof(BYTE),&count,sizeof(int));

  send(m_hSocket,(char*)m_pPacket,nSize,0);
 
  free(m_pPacket);
  m_pPacket = NULL;
	}*/
}

static CDebugMsgReceiver soc;

void CDebugMsgReceiver::OnAccept(int nErrorCode) 
{
  CSocket::OnAccept(nErrorCode);     
	
  if(Accept(soc))
  {      
    TRACE("NEW CONNECTION\n");
	char handshake[] = _T("JDWP-Handshake");

	::send(soc.m_hSocket,handshake,14,0);
  }
}


void CDebugMsgReceiver::ProcessPacket()
{
  char* ptrSave = (char*)m_pPacket;

  int id =0;
  memcpy(&id,m_pPacket,sizeof(int));  
  m_pPacket += sizeof(int);//skip id

  ++m_pPacket;//skip flag

  WORD error = 0;
  memcpy(&error,m_pPacket,sizeof(WORD));
  error = ntohs(error);
  
  m_pPacket +=sizeof(WORD);//skip errercode

  if(id == DB_CMDID_GETCLASSREF)
  {
    struct refInfo
	{
      BYTE  refTypeTag;
	  BYTE* typeID;
	  char* pclassSig;
	  int   stat;
	};
	CList<BYTE*,BYTE*>list;

    int classCount = 0;
	memcpy(&classCount,m_pPacket,sizeof(int));
	classCount = ntohl(classCount);
	m_pPacket += sizeof(int);
	for(int I=0; I<classCount; I++)
	{
      refInfo* info = new refInfo;

      info->typeID  = new BYTE[m_iIDSizes[REFTYPE_ID_SIZE]];
	  memcpy(&info->refTypeTag,m_pPacket,sizeof(BYTE));++m_pPacket;

	  memcpy(info->typeID,m_pPacket,sizeof(BYTE)*m_iIDSizes[REFTYPE_ID_SIZE]);
      
	  m_pPacket += m_iIDSizes[REFTYPE_ID_SIZE];
	  
	  int len = 0;
	  memcpy(&len,m_pPacket,sizeof(int));m_pPacket += sizeof(int);len = ntohl(len);
	  if(len>0)
	  {
	  info->pclassSig = new char[len];
      memcpy(info->pclassSig,m_pPacket,len); m_pPacket += len;
	  }
      memcpy(&info->stat,m_pPacket,sizeof(int));
      info->stat = ntohl(info->stat);
	  list.AddTail((BYTE*)info);
	}

	for(POSITION p = list.GetHeadPosition(); p != NULL;)
	{
       refInfo *ref = (refInfo*)list.GetNext(p);
	   free(ref->pclassSig);
	   free(ref->typeID);
	   delete ref;
	}
  }
  else
  if(id == DB_CMDID_GETSIZES)
  {	
    memcpy(m_iIDSizes,m_pPacket,5*sizeof(int));
	for(int i=0; i<5;i++)
		m_iIDSizes[i] = ntohl(m_iIDSizes[i]);
  }
  else
  if(id == DB_CMNDID_SETEVENT)
  {
    ++m_pPacket;
	WORD error = 0;
	memcpy(&error,m_pPacket,sizeof(WORD));
    error = ntohs(error);
	int x = error;
  }
  else
  if(id == DB_CMNDID_BREAKPOINT)
  {

  }
  free(ptrSave);//this guys has had enough:)
}


/*
  if(!m_bHandShaken)
  {
     int nLength = strlen(m_cHandShake);	 
	 nLength += Receive(m_cHandShake+nLength,14-nLength);
     
	 m_cHandShake[nLength] = '\0';
     nLength = strlen(m_cHandShake);

     if(nLength == 14)
	 m_bHandShaken = TRUE;
  }
  else
  {	
    if(!m_bLengthRead)
	{
      CSocketFile socf(this,FALSE);
	  CArchive ar(&soc,CArchive::load);
	  ar>>m_nMsgLength;

	  m_nMsgLength = ntohl(m_nMsgLength);
	  m_bLengthRead = TRUE;

	  //allocate packet buffer
	  
	  m_pPacket = new BYTE[m_nMsgLength];

	  m_nMsgLength = htonl(m_nMsgLength);
	  memcpy(m_pPacket,&m_nMsgLength,sizeof(int));
      m_nMsgLength = ntohl(m_nMsgLength);

	  m_nAmountRead = sizeof(int);
	}
    else
	if(m_nAmountRead<m_nMsgLength)
	{
      int r = Receive(m_pPacket+m_nAmountRead,m_nMsgLength-m_nAmountRead);
	  m_nAmountRead += r;
	}
	else
	{
      m_bLengthRead = FALSE;//finished retrieving packet
	}
  }


  int nLength = strlen(m_cHandShake);	 
  nLength += Receive(m_cHandShake+nLength,14-nLength);
     
  m_cHandShake[nLength] = '\0';
  nLength = strlen(m_cHandShake);

  if(nLength == 14)
  m_bHandShaken = TRUE;
*/

⌨️ 快捷键说明

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