/*++

Copyright (c) 1997-1999 Microsoft Corporation

Revision History:

--*/

#include "stdafx.h"
#include "wmihlp.h"

void PrintHeader(WNODE_HEADER Header, CString & output)
{
    SYSTEMTIME   sysTime;
    FILETIME     fileTime;
    FILETIME     localFileTime;
    CString      tmp;

    //  Convert the file time
    //
    fileTime.dwLowDateTime = Header.TimeStamp.LowPart;
    fileTime.dwHighDateTime = Header.TimeStamp.HighPart;

    FileTimeToLocalFileTime(&fileTime,
                            &localFileTime );

    FileTimeToSystemTime(&localFileTime,
                         &sysTime);


    //  Print the info
    //
    tmp.Format(_T("Buffer Size:  0x%x\r\n")
          _T("Provider Id:  0x%x\r\n")
          _T("Version    :  %u\r\n")
          _T("Linkage    :  0x%x\r\n")
          _T("Time Stamp :  %u:%02u %u\\%u\\%u\r\n")
          _T("Guid       :  0x%x 0x%x 0x%x  0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\r\n")
          _T("Flags      :  0x%02x\r\n"),
          Header.BufferSize,
          Header.ProviderId,
          Header.Version,
          Header.Linkage,
          sysTime.wHour,
          sysTime.wMinute,
          sysTime.wMonth,
          sysTime.wDay,
          sysTime.wYear,
          Header.Guid.Data1,
          Header.Guid.Data2,
          Header.Guid.Data3,
          Header.Guid.Data4[0],
          Header.Guid.Data4[1],
          Header.Guid.Data4[2],
          Header.Guid.Data4[3],
          Header.Guid.Data4[4],
          Header.Guid.Data4[5],
          Header.Guid.Data4[6],
          Header.Guid.Data4[7],
          Header.Flags );

    //  Print readable flags
    //
    if (Header.Flags & WNODE_FLAG_ALL_DATA)
    {
       output += _T("WNODE_FLAG_ALL_DATA\r\n");
    }

    if (Header.Flags & WNODE_FLAG_SINGLE_INSTANCE)
    {
       output += _T("WNODE_FLAG_SINGLE_INSTANCE\r\n");
    }

    if (Header.Flags & WNODE_FLAG_SINGLE_ITEM)
    {
       output += _T("WNODE_FLAG_SINGLE_ITEM\r\n");
    }

    if (Header.Flags & WNODE_FLAG_EVENT_ITEM)
    {
       output += _T("WNODE_FLAG_EVENT_ITEM\r\n");
    }

    if (Header.Flags & WNODE_FLAG_FIXED_INSTANCE_SIZE)
    {
       output += _T("WNODE_FLAG_FIXED_INSTANCE_SIZE\r\n");
    }

    if (Header.Flags & WNODE_FLAG_TOO_SMALL)
    {
       output += _T("WNODE_FLAG_TOO_SMALL\r\n");
    }

    if (Header.Flags & WNODE_FLAG_INSTANCES_SAME)
    {
       output += _T("WNODE_FLAG_INSTANCES_SAME\r\n");
    }

    if (Header.Flags & WNODE_FLAG_INTERNAL)
    {
       output += _T("WNODE_FLAG_INTERNAL\r\n");
    }

    if (Header.Flags & WNODE_FLAG_USE_TIMESTAMP)
    {
       output += _T("WNODE_FLAG_USE_TIMESTAMP\r\n");
    }

    if (Header.Flags & WNODE_FLAG_TRACED_GUID)
    {
       output += _T("WNODE_FLAG_TRACED_GUID\r\n");
    }

    if (Header.Flags & WNODE_FLAG_EVENT_REFERENCE)
    {
       output += _T("WNODE_FLAG_EVENT_REFERENCE\r\n");
    }

    if (Header.Flags & WNODE_FLAG_ANSI_INSTANCENAMES)
    {
       output += _T("WNODE_FLAG_ANSI_INSTANCENAMES\r\n");
    }

    if (Header.Flags & WNODE_FLAG_METHOD_ITEM)
    {
       output += _T("WNODE_FLAG_METHOD_ITEM\r\n");
    }

    if (Header.Flags & WNODE_FLAG_PDO_INSTANCE_NAMES)
    {
       output += _T("WNODE_FLAG_PDO_INSTANCE_NAMES\r\n");
    }

    output += _T("\r\n");
}

VOID
PrintCountedString(
   LPTSTR   lpString,
   CString & output
   )
{
   SHORT    usNameLength;
   LPTSTR   lpStringPlusNull;

   usNameLength = * (USHORT *) lpString;

   lpStringPlusNull = (LPTSTR) new TCHAR[usNameLength + sizeof(TCHAR)];

   if (lpStringPlusNull != NULL) {
      lpString = (LPTSTR) ((PBYTE)lpString + sizeof(USHORT));
      if (MyIsTextUnicode(lpString)) {
         usNameLength /= 2;
      }

      _tcsncpy( lpStringPlusNull, lpString, usNameLength );

      _tcscpy( lpStringPlusNull + usNameLength, __T("") );

      output += lpStringPlusNull;
      // _tprintf(__T("%s\n"), lpStringPlusNull);

      delete[] lpStringPlusNull;
   }
}

BOOL MyIsTextUnicode(PVOID string)
{
   if (*((USHORT*)string) <= 0xff)
   {
      return TRUE;
   }
   else
   {
      return FALSE;
   }
}

BOOL ValidHexText(CWnd *parent, const CString &txt, LPDWORD lpData, UINT line)
{
    int i, len;
    TCHAR *stop;
    CString msg;

    if ((len = txt.GetLength()) > 8) {
        parent->MessageBox(_T("Must enter a value of 8 or less characters!"));
        return FALSE;
    }

    for (i = 0; i < len; i++) {
        if (!_istxdigit(txt[i])) {
            if (line == -1) 
                msg.Format(_T("All digits must be hex! (digit #%d isn't)"), i+1);
            else
                msg.Format(_T("All digits must be hex!\n(digit #%d on line #%d isn't)"), i+1, line);
            parent->MessageBox(msg);
            return FALSE;
        }
    }

    *lpData = (DWORD) _tcstol(txt, &stop, 16);
    return TRUE;
}