1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
   | int i_ReadResponse( _di_IXMLDocument &l_o_ResponseDocXML)
{
  // Function return value
  int l_i_Reply;
 
  //Response
  _di_IXMLDocument l_o_DocXML;
  TWinSocketStream *l_o_ResponseStream;
  char l_c_ResponseBuffer[BUFFERSIZE];
  bool l_b_ResponseWaited;
  long l_l_ResponseLength;
  AnsiString  l_str_XMLResponse; 
  long l_ul_XmlLength;
  int l_i_XmlErrorCode;
  int l_i_XmlErrorLineNumber; 
  int l_i_XmlErrorLinePos;
  DOMString l_o_XmlErrorReason;
  DOMString l_o_XmlErrorSrcTex;
  AnsiString l_str_ResponseCode;
  AnsiString l_str_ReponseMsg;
  AnsiString  l_str_Response;
 
  // Response recieving
  g_str_Message = g_str_Message + "---  channels Read Response ---" + AnsiString("\n");
 
  //Read Response 
  l_o_ResponseStream = new TWinSocketStream(g_ClientSocket_Dest->Socket,CLIENTWAITTIME);     
  memset(l_c_ResponseBuffer, 0, BUFFERSIZE); // initialize the buffer 
 
  //Give the server 60 seconds to start writing
  l_b_ResponseWaited = l_o_ResponseStream->WaitForData(CLIENTWAITTIME);      
 
  // Store Response
  if (l_b_ResponseWaited)
	{
	  if ((l_l_ResponseLength =l_o_ResponseStream->Read(l_c_ResponseBuffer,BUFFERSIZE))== 0) // if can't read in 60 seconds
	    {
	      g_ClientSocket_Dest->Socket->Close();           // close the connection
	      l_i_Reply = -1;
	    }
	}
  else
    {
      g_ClientSocket_Dest->Socket->Close();      // if client doesn't start, close the socket and send error messgage(TimeOPut)
      g_str_Message = g_str_Message + "*** ! TimeOut, no response from MuxConfig Agent " + AnsiString("\n");
      l_i_Reply = -1;
    }
 
  // Response analysis
  l_str_XMLResponse = AnsiString(l_c_ResponseBuffer+4); 
 
  // Response length   
  l_ul_XmlLength = ((u_long)(((u_char *)l_c_ResponseBuffer)[0]))*0x1000000
    + ((u_long)(((u_char *)l_c_ResponseBuffer)[1]))*0x10000
    + ((u_long)(((u_char *)l_c_ResponseBuffer)[2]))*0x100
    + ((u_long)(((u_char *)l_c_ResponseBuffer)[3]));    
 
  //message length check
  l_l_ResponseLength =l_l_ResponseLength-4;
 
  if(l_l_ResponseLength < l_ul_XmlLength) 
    {
      g_str_Message = g_str_Message + "MuxConfig response is short, only "+ l_l_ResponseLength+ " bytes "
	+  "are recieved, wait "+l_ul_XmlLength+ " bytes " + AnsiString("\n");
    }
  else if(l_l_ResponseLength > l_ul_XmlLength)
    {
      g_str_Message = g_str_Message + "MuxConfig response is long, "+  l_l_ResponseLength+ " bytes "
	+  "are recieved, wait only "+l_ul_XmlLength + " bytes " + AnsiString("\n");
	}
  else
    {     
      g_str_Message = g_str_Message+ "*** Recieve " +AnsiString(l_l_ResponseLength)+ " Bytes" +" (leng correct)" +AnsiString("\n");
    }  
 
 
 
  // Check if there is any error in XML format
  try
    {
      // response is stored in XMLDocument for parsing 
      l_o_DocXML = LoadXMLData(l_str_XMLResponse);
      l_o_DocXML->Active = true;
      l_o_DocXML->SaveToFile("server_to_client");
 
    }
  catch (EDOMParseError &e)
    {
	  l_i_XmlErrorCode = e.EDOMParseError::ErrorCode;
	  l_i_XmlErrorLineNumber = e.EDOMParseError::Line; 
	  l_i_XmlErrorLinePos = e.EDOMParseError::LinePos;
	  l_o_XmlErrorReason = e.EDOMParseError::Reason;
	  l_o_XmlErrorSrcTex =e.EDOMParseError::SrcText;
	  g_str_Message = g_str_Message + "*** ! "+ +e.Message.c_str()+ AnsiString("\n");     
	  g_str_Message = g_str_Message + "*** ! EDOMParseError: An invalid charachter was found in XML file . Line:"
	    + "[ " +AnsiString(l_i_XmlErrorLineNumber) + " ]" + " Position: "
	    + "[ " +AnsiString(l_i_XmlErrorLinePos) +    " ]" + " at Text: " 
	    + "[ " +AnsiString(l_o_XmlErrorSrcTex) +     " ]" + " The reason is: "
	    + "[ " +AnsiString(l_o_XmlErrorReason) +     " ]" + " Error Code : "  
	    + "[ " +AnsiString(l_i_XmlErrorCode ) +      " ]" +  AnsiString("\n");   
	  l_i_Reply = -1;
    }
 
 
  // Out 
  l_o_ResponseDocXML =l_o_DocXML;
 
  // return
  return(l_i_Reply);
} | 
Partager