Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (Flatly)
  • No Skin
Collapse
Brand Logo

NetXMS Forum

S

szll2010

@szll2010
Unfollow Follow
About
Posts
18
Topics
3
Shares
0
Groups
0
Followers
0
Following
0

Posts

Recent Best Controversial

  • SetPassword in Trunk Code
    S szll2010
    Development

    Dear Victor,

    There is a bug in the userdb_objects.cpp in trunk. The setpassword function does not consider the Unicode and MBCS. However, I changed the code to this:
    void User::setPassword(const TCHAR *password, bool clearChangePasswdFlag)
    {
    #ifdef UNICODE
        char *mb = MBStringFromWideString(password);
        CalculateSHA1Hash((BYTE *)mb, strlen(mb), m_passwordHash);
        free(mb);
    #else
        CalculateSHA1Hash((BYTE *)password, _tcslen(password), m_passwordHash);
    #endif
        //CalculateSHA1Hash((BYTE *)password, _tcslen(password), m_passwordHash);
        m_graceLogins = MAX_GRACE_LOGINS;
        m_flags |= UF_MODIFIED;
        if (clearChangePasswdFlag)
            m_flags &= ~UF_CHANGE_PASSWORD;
    }
    Still has the problem with setting or changing the password.

    Could you check?

    best regards,

    szll2010


  • Server Module development
    S szll2010
    Development

    I've got it.

    Thanks very much.

    Best regards,

    Szll2010


  • Server Module development
    S szll2010
    Development

    Hi Victor,

    The thread process code of server module need to delete the message object, but in main thread  the message object will be deleted too. So could you consider a solution:
    1 copy the the message pointer(msg) to another pointer
    2 set the pointer (msg) to NULL
    3 main thread delete msg(NULL)
    4 server module is responsible to delete the msg (delete data->msg) in the pfHandler

    Best regards,


  • Server Module development
    S szll2010
    Development

    Hi Victor,

    The DBAsyncSelect is no problem without using the StartCommandHandler to start new thread to process the command. It's very strange. The code is very simple, just a dbgprintf() and use your skeleton of module, crash with thread and ok with normal process.

    BTW, the server code is the trunk's snapshot.

    Best regards,


  • Server Module development
    S szll2010
    Development

    Hi Victor

    Can I use DBAsyncSelect function in module?  I use it in my server module, it makes server crash.

    Pls advise.

    Thanks.


  • Server Module development
    S szll2010
    Development

    Hi Victor,

    Another question, how to use the db function in the module? I mean there are globals, like g_nDBSyntax and
    g_hCoreDB . I want to add an audit log module the system using the module?

    BTW, the new feature is not previewed in windows console, is the windows console deprecated?


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    Hi Victor,

    I do send this port to the community.  For the reason of windows port, I erased some unix codes in the source and I trim the nxagentd.cpp to a simpler version. Two subagents were ported , WINNT and WINPERF.

    How to send the files to you?

    best regards,


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    Hi Victor,

    Sorry for mistake in the Config::print test using the setvbuf function to output. It should be OK.

    Best regards,


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    Hi Victor,

    I tested the new config API again but it does not work well with east asian characters.

    The program is Unicode version, and the config's coding is UTF-8 and ANSI, in the config file there is some east asian characters. In  both scenarios,    the east asian characters became ?? under Config::print , the others are right.

    Thanks


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    Hi Victor,

    Thanks for your port. Now the file system function works well.  I port the all the core agent and WINNT and winperf subagent to WINDOWS  UNICODE except the hddinfo has a bug.  Not really understand the  StrStrip function.

    I also test the new config relative function, it can read ANSI and UNICODE content in the config file, but using the config->print function, it has problem with MBCS, like east asian characters. Could you check?


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    Hi Victor,

    Almost port the nxagentd to UNICODE for windows based the trunk version. Whether it is possible to port the dir relative structure members to TCHAR and dir.c to support TCHAR?


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    Hi Victor

    Thanks. I noticed that some header files had been modified and I will try after the 1.1.0 is released.

    And I want to know how to deal with the IP address changing problem. For example, some devices are  in remote site and connected through carrier network. The node's IP address is not the same as last time connected. Does the agent register and server recognizes the agent then change the node's ip address, or there is other solution?


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    Hi Victor,

    I try to manage some WIN CE devices. Not sure that MBCS is no problem. Could you advise?


  • Server Module development
    S szll2010
    Development

    Hi Victor,

    How to construct the method in the server module to process the Agent's originated CMD(if custom define)? I read the source code and not found in the AgentConnection Class. Has it been put in the m_pMsgWaitQueue for processing by Session, for example CMD_GET_MY CONFIG.


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    Hi Victor,

    Thanks for your quick action.

    Is there any chance to port Agent to Unicode?


  • Server Module development
    S szll2010
    Development

    Hi Victor,

    Is there any sample code  for the server module development like the agent's skeleton for reference.


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    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;
    }


  • message.c in libnetxms is right for east asian characters
    S szll2010
    Development

    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.

  • Login

  • Don't have an account? Register

  • Login or register to search.
Powered by NodeBB Contributors
  • First post
    Last post
0
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups