News:

We really need your input in this questionnaire

Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - szll2010

#16
General / Server Module development
December 09, 2010, 06:37:16 PM
Hi Victor,

Is there any sample code  for the server module development like the agent's skeleton for reference.
#17
I patched the message.c file for the two functions, but still need you check the release of pStr:
void *CSCPMessage::Set(DWORD dwVarId, BYTE bType, const void *pValue, DWORD dwSize)
{
   DWORD dwIndex, dwLength, dwLenWC;
   CSCP_DF *pVar;
#if !defined(UNICODE_UCS2) || !defined(UNICODE)
   UCS2CHAR *pBuffer;
#endif

   // Create CSCP_DF structure
   switch(bType)
   {
      case CSCP_DT_INTEGER:
         pVar = (CSCP_DF *)malloc(12);
         pVar->df_int32 = *((const DWORD *)pValue);
         break;
      case CSCP_DT_INT16:
         pVar = (CSCP_DF *)malloc(8);
         pVar->df_int16 = *((const WORD *)pValue);
         break;
      case CSCP_DT_INT64:
         pVar = (CSCP_DF *)malloc(16);
         pVar->df_int64 = *((const QWORD *)pValue);
         break;
      case CSCP_DT_FLOAT:
         pVar = (CSCP_DF *)malloc(16);
         pVar->df_real = *((const double *)pValue);
         break;
      case CSCP_DT_STRING:
         dwLength = (DWORD)_tcslen((const TCHAR *)pValue);
         //pVar = (CSCP_DF *)malloc(12 + dwLength * 2);
         //pVar->df_string.dwLen = dwLength * 2;
#ifdef UNICODE         
#ifdef UNICODE_UCS2
       pVar = (CSCP_DF *)malloc(12 + dwLength * 2);
         pVar->df_string.dwLen = dwLength * 2;
         memcpy(pVar->df_string.szValue, pValue, pVar->df_string.dwLen);
#else      /* assume UNICODE_UCS4 */
       pVar = (CSCP_DF *)malloc(12 + dwLength * 2);
         pVar->df_string.dwLen = dwLength * 2;
         pBuffer = (UCS2CHAR *)malloc(dwLength * 2 + 2);
         ucs4_to_ucs2((WCHAR *)pValue, dwLength, pBuffer, dwLength + 1);
         memcpy(pVar->df_string.szValue, pBuffer, pVar->df_string.dwLen);
         free(pBuffer);
#endif         
#else      /* not UNICODE */
       dwLenWC = mb_to_ucs2((const char *)pValue, dwLength, NULL, 0);
         pBuffer = (UCS2CHAR *)malloc(dwLenWC * 2 + 2);
         mb_to_ucs2((const char *)pValue, dwLength, pBuffer, dwLenWC + 1);
       pVar = (CSCP_DF *)malloc(12 + dwLenWC * 2);
       pVar->df_string.dwLen = dwLenWC* 2;
         memcpy(pVar->df_string.szValue, pBuffer, pVar->df_string.dwLen);
         free(pBuffer);
#endif
         break;
      case CSCP_DT_BINARY:
         pVar = (CSCP_DF *)malloc(12 + dwSize);
         pVar->df_string.dwLen = dwSize;
         if ((pVar->df_string.dwLen > 0) && (pValue != NULL))
            memcpy(pVar->df_string.szValue, pValue, pVar->df_string.dwLen);
         break;
      default:
         return NULL;  // Invalid data type, unable to handle
   }
   pVar->dwVarId = dwVarId;
   pVar->bType = bType;

   // Check if variable exists
   dwIndex = FindVariable(pVar->dwVarId);
   if (dwIndex == INVALID_INDEX) // Add new variable to list
   {
      m_ppVarList = (CSCP_DF **)realloc(m_ppVarList, sizeof(CSCP_DF *) * (m_dwNumVar + 1));
      m_ppVarList[m_dwNumVar] = pVar;
      m_dwNumVar++;
   }
   else  // Replace existing variable
   {
      free(m_ppVarList[dwIndex]);
      m_ppVarList[dwIndex] = pVar;
   }

   return (bType == CSCP_DT_INT16) ? ((void *)((BYTE *)pVar + 6)) : ((void *)((BYTE *)pVar + 8));
}

TCHAR *CSCPMessage::GetVariableStr(DWORD dwVarId, TCHAR *pszBuffer, DWORD dwBufSize)
{
   void *pValue;
   TCHAR *pStr = NULL;
   DWORD dwLen, dwLenMB;

   if ((pszBuffer != NULL) && (dwBufSize == 0))
      return NULL;   // non-sense combination

   pValue = Get(dwVarId, CSCP_DT_STRING);
   if (pValue != NULL)
   {
      if (pszBuffer == NULL)
      {
#if defined(UNICODE) && defined(UNICODE_UCS4)
         pStr = (TCHAR *)malloc(*((DWORD *)pValue) * 2 + 4);
       dwLen = (pszBuffer == NULL) ? (*((DWORD *)pValue) / 2) : min(*((DWORD *)pValue) / 2, dwBufSize - 1);
        ucs2_to_ucs4((UCS2CHAR *)((BYTE *)pValue + 4), dwLen, pStr, dwLen + 1);
        pStr[dwLen] = 0;
#elif defined(UNICODE) && defined(UNICODE_UCS2)
         pStr = (TCHAR *)malloc(*((DWORD *)pValue) + 2);
       dwLen = (pszBuffer == NULL) ? (*((DWORD *)pValue) / 2) : min(*((DWORD *)pValue) / 2, dwBufSize - 1);
         memcpy(pStr, (BYTE *)pValue + 4, dwLen * 2);
        pStr[dwLen] = 0;
#else
         
       dwLenMB = ucs2_to_mb((UCS2CHAR *)((BYTE *)pValue + 4), *((DWORD *)pValue) / 2, NULL, 0);
       pStr = (TCHAR *)malloc(dwLenMB   + 1);
       dwLen = (pszBuffer == NULL) ? dwLenMB : min(dwLenMB, dwBufSize - 1);
        ucs2_to_mb((UCS2CHAR *)((BYTE *)pValue + 4), *((DWORD *)pValue) / 2, pStr, dwLen + 1);
        pStr[dwLen] = 0;
#endif
     
    
     }
      else
      {
         pStr = pszBuffer;
#if defined(UNICODE) && defined(UNICODE_UCS4)
        dwLen = (pszBuffer == NULL) ? (*((DWORD *)pValue) / 2) : min(*((DWORD *)pValue) / 2, dwBufSize - 1);
       ucs2_to_ucs4((UCS2CHAR *)((BYTE *)pValue + 4), dwLen, pStr, dwLen + 1);
        pStr[dwLen] = 0;
#elif defined(UNICODE) && defined(UNICODE_UCS2)
        dwLen = (pszBuffer == NULL) ? (*((DWORD *)pValue) / 2) : min(*((DWORD *)pValue) / 2, dwBufSize - 1);
         memcpy(pStr, (BYTE *)pValue + 4, dwLen * 2);
        pStr[dwLen] = 0;
#else
        
       dwLenMB = ucs2_to_mb((UCS2CHAR *)((BYTE *)pValue + 4), *((DWORD *)pValue) / 2, NULL, 0);
       dwLen = (pszBuffer == NULL) ? dwLenMB : min(dwLenMB, dwBufSize - 1);
        ucs2_to_mb((UCS2CHAR *)((BYTE *)pValue + 4), *((DWORD *)pValue) / 2, pStr, dwLen + 1);
        pStr[dwLen] = 0;
#endif

      }
   }
   else
   {
      if (pszBuffer != NULL)
      {
         pStr = pszBuffer;
         pStr[0] = 0;
      }
   }
   return pStr;
}
#18
I found problems with displaying east asian characters in NETxms console, the following is the environment:
1. Server on Windows (build with MBCS)
2. Console on Windows (Build with Unicode)

In this scenario, east asian character can be input, but after transfering to server, then the these characters was wrong in server's database. I read the source code, found that:
1. In message.c file, GetVariableStr and SetVariable function's allocating memory is assume the MBCS is Single byte for one character, so it allocates double or half buffer for the converting, but the fact is not.
2. In GetVariable Str, allocating memory for the pStr, but not found where to release the memory,  chance to leak ?

Could you help to check the source file.