/*++

Copyright (c) Microsoft Corporation

Module Name:

    FxString.hpp

Abstract:

    This module implements a simple string class to operate on
    unicode strings.

Author:




Environment:

    Both kernel and user mode

Revision History:


--*/
#ifndef _FXSTRING_H_
#define _FXSTRING_H_

class FxString : public FxObject {
public:
    //
    // Length describes the length of the string in bytes (not WCHARs)
    // MaximumLength describes the size of the buffer in bytes
    //
    UNICODE_STRING m_UnicodeString;

public:
    FxString(
        __in PFX_DRIVER_GLOBALS FxDriverGlobals
        );

    ~FxString();

    VOID
    __inline
    ReleaseString(
        __out PUNICODE_STRING ReleaseTo
        )
    {
        RtlCopyMemory(ReleaseTo, &m_UnicodeString, sizeof(UNICODE_STRING));
        RtlZeroMemory(&m_UnicodeString, sizeof(m_UnicodeString));
    }

    __inline
    operator PUNICODE_STRING(
        )
    {
        return &m_UnicodeString;
    }

    PUNICODE_STRING
    __inline
    GetUnicodeString(
        VOID
        )
    {
        return &m_UnicodeString;
    }

    _Must_inspect_result_
    NTSTATUS
    Assign(
        __in PCWSTR SourceString
        );

    _Must_inspect_result_
    NTSTATUS
    Assign(
        __in const UNICODE_STRING* UnicodeString
        );

    __inline
    USHORT
    Length(
        VOID
        )
    {
        return m_UnicodeString.Length;
    }

    __inline
    USHORT
    ByteLength(
        __in BOOLEAN IncludeNull
        )
    {
        if (IncludeNull) {
            return m_UnicodeString.Length + sizeof(UNICODE_NULL);
        }
        else {
            return m_UnicodeString.Length;
        }
    }

    __inline
    USHORT
    CharacterLength(
        VOID
        )
    {
        return m_UnicodeString.Length / sizeof(WCHAR);
    }

    __inline
    USHORT
    MaximumLength(
        VOID
        )
    {
        return m_UnicodeString.MaximumLength;
    }

    __inline
    USHORT
    MaximumByteLength(
        VOID
        )
    {
        return m_UnicodeString.MaximumLength;
    }

    __inline
    USHORT
    MaximumCharacterLength(
        VOID
        )
    {
        return m_UnicodeString.MaximumLength / sizeof(WCHAR);
    }

    __inline
    PWCHAR
    Buffer(
        VOID
        )
    {
        return m_UnicodeString.Buffer;
    }
};

#endif // _FXSTRING_H_