예제 #1
0
MMatrix ropeGenerator::getMatrixFromParamCurve( MFnNurbsCurve &curveFn, float param, float twist, MAngle divTwist )
{
	MPoint pDivPos;
	//Here we control the tangent of the rope
	curveFn.getPointAtParam( param, pDivPos, MSpace::kWorld );
	MVector vTangent( curveFn.tangent( param, MSpace::kWorld ).normal() );
	MVector vNormal( curveFn.normal( param, MSpace::kWorld ).normal() );
	if ( MAngle( PrevNormal.angle( vNormal ) ).asDegrees() > 90 )
		//fprintf(stderr, "Angle = %g\n",MAngle( PrevNormal.angle( vNormal )).asDegrees());
		vNormal = vNormal * -1;
	PrevNormal = vNormal;
	//if ( vNormal.angle(  ) )
	MQuaternion qTwist( twist * divTwist.asRadians(), vTangent );
	vNormal = vNormal.rotateBy( qTwist );
	MVector vExtra( vNormal ^ vTangent );
	vNormal.normalize();
	vTangent.normalize();
	vExtra.normalize();
	double dTrans[4][4] ={
						{vNormal.x, vNormal.y, vNormal.z, 0.0f},
						{vTangent.x, vTangent.y, vTangent.z, 0.0f},
						{vExtra.x, vExtra.y, vExtra.z, 0.0f},
						{pDivPos.x,pDivPos.y,pDivPos.z, 1.0f}};
	MMatrix mTrans( dTrans );
	return mTrans;
}
int TSecurityChannelStream::receive(
  void* apBuffer,
  size_t aszBufferSize,
  size_t& aszReceivedBytes,
  unsigned int aunTimeout)
{
  if(!isAttached())
  {
    __L_BAD(m_pLog, "Stream is not attached");
    return -4;
  }

  if(!m_pSecurityChannel->isEstablished())
  {
    __L_BAD(m_pLog, "Security session is not established!");
    return -5;
  }

  size_t szBufferOffset = 0;
  SECURITY_STATUS ssResult = SEC_E_INCOMPLETE_MESSAGE;
  while(true)
  {
    if(!szBufferOffset || ssResult == SEC_E_INCOMPLETE_MESSAGE)
    {
      size_t szRead = 0;
      int nResult = m_pSocketStream->receive(
        &m_vInBuffer[0] + szBufferOffset,
        m_vInBuffer.size() - szBufferOffset,
        szRead,
        aunTimeout);
      if(nResult)
      {
        __L_BADH(m_pLog, "Cannot receive message during handshake loop", nResult);
        return nResult;
      }
      if(!szRead)
      {
        __L_TRK(m_pLog, "Receive time out!");
        return -31;
      }
      szBufferOffset += szRead;
    }

    m_inSecBuff[0].BufferType = SECBUFFER_DATA;
    m_inSecBuff[0].cbBuffer = szBufferOffset;
    m_inSecBuff[0].pvBuffer = &m_vInBuffer[0];
    
    m_inSecBuff[1].BufferType = SECBUFFER_EMPTY;
    m_inSecBuff[1].cbBuffer = 0;
    m_inSecBuff[1].pvBuffer = NULL;

    m_inSecBuff[2].BufferType = SECBUFFER_EMPTY;
    m_inSecBuff[2].cbBuffer = 0;
    m_inSecBuff[2].pvBuffer = NULL;

    m_inSecBuff[3].BufferType = SECBUFFER_EMPTY;
    m_inSecBuff[3].cbBuffer = 0;
    m_inSecBuff[3].pvBuffer = NULL;

    ssResult = ::DecryptMessage(
      &m_pSecurityChannel->getContext(),
      &m_inBuffDesc,
      0,
      NULL);
    if(ssResult < 0 && 
       ssResult != SEC_I_RENEGOTIATE &&
       ssResult != SEC_I_CONTEXT_EXPIRED &&
       ssResult != SEC_E_INCOMPLETE_MESSAGE)
    {
      __L_BADH(m_pLog, "Error in ::DecryptMessage", ssResult);
      return ssResult;
    }

    // need more data
    if(ssResult == SEC_E_INCOMPLETE_MESSAGE)
      continue;

    if(ssResult == SEC_I_CONTEXT_EXPIRED)
    {
      __L_TRK(m_pLog, "> Context expired. Shutting down channel...");
      int nResult = m_pSecurityChannel->shutdown(false);
      if(nResult)
      {
        __L_BADH(m_pLog, "Error shutdown Security Channel", nResult);
        return nResult;
      }
      return 0;
    }

    SecBuffer *pData = NULL;
    SecBuffer *pExtra = NULL;
    for(short i=0; i<4; ++i)
    {
      if(m_inSecBuff[i].BufferType == SECBUFFER_DATA)
        pData = &m_inSecBuff[i];
      if(m_inSecBuff[i].BufferType == SECBUFFER_EXTRA )
        pExtra = &m_inSecBuff[i];
    }

    if(ssResult == SEC_E_OK && pData)
    {
      // TODO: may be only when pExtra == NULL
      aszReceivedBytes = min(m_vInBuffer.size(), pData->cbBuffer);
      memcpy(apBuffer, pData->pvBuffer, aszReceivedBytes);
      return 0;
    }

    if(pExtra)
    {
      memcpy(
        &m_vInBuffer[0],
        &m_vInBuffer[0] + (szBufferOffset - pExtra->cbBuffer),
        pExtra->cbBuffer);
      szBufferOffset = pExtra->cbBuffer;
    }
    else
    {
      szBufferOffset = 0;
    }

    if(ssResult == SEC_I_RENEGOTIATE)
    {
      int nResult = m_pSecurityChannel->renegotiate();
      if(nResult)
      {
        __L_BADH(m_pLog, "Error while renegotiate channel", nResult);
        return nResult;
      }
      size_t szAuthExtraSize = m_pSecurityChannel->getExtraDataSize();
      if(szAuthExtraSize)
      {
        TBlob vExtra(szAuthExtraSize);
        m_pSecurityChannel->getExtraData(&vExtra[0]);
        memcpy(
          &m_vInBuffer[0],
          &vExtra[0],
          szAuthExtraSize);
        szBufferOffset = szAuthExtraSize;
      }
    }
  }

  return 0;
}