//-------------------------------------------------------------------------------------------------
// <copyright file="atomutil.h" company="Outercurve Foundation">
//   Copyright (c) 2004, Outercurve Foundation.
//   This software is released under Microsoft Reciprocal License (MS-RL).
//   The license and further copyright text can be found in the file
//   LICENSE.TXT at the root directory of the distribution.
// </copyright>
// 
// <summary>
//    ATOM helper functions.
// </summary>
//-------------------------------------------------------------------------------------------------

#pragma once


#ifdef __cplusplus
extern "C" {
#endif

#define ReleaseAtomFeed(p) if (p) { AtomFreeFeed(p); }
#define ReleaseNullAtomFeed(p) if (p) { AtomFreeFeed(p); p = NULL; }


struct ATOM_UNKNOWN_ATTRIBUTE
{
    LPWSTR wzNamespace;
    LPWSTR wzAttribute;
    LPWSTR wzValue;

    ATOM_UNKNOWN_ATTRIBUTE* pNext;
};

struct ATOM_UNKNOWN_ELEMENT
{
    LPWSTR wzNamespace;
    LPWSTR wzElement;
    LPWSTR wzValue;

    ATOM_UNKNOWN_ATTRIBUTE* pAttributes;
    ATOM_UNKNOWN_ELEMENT* pNext;
};

struct ATOM_LINK
{
    LPWSTR wzRel;
    LPWSTR wzTitle;
    LPWSTR wzType;
    LPWSTR wzUrl;
    LPWSTR wzValue;
    DWORD64 dw64Length;

    ATOM_UNKNOWN_ATTRIBUTE* pUnknownAttributes;
    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
};

struct ATOM_CONTENT
{
    LPWSTR wzType;
    LPWSTR wzUrl;
    LPWSTR wzValue;

    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
};

struct ATOM_AUTHOR
{
    LPWSTR wzName;
    LPWSTR wzEmail;
    LPWSTR wzUrl;
};

struct ATOM_CATEGORY
{
    LPWSTR wzLabel;
    LPWSTR wzScheme;
    LPWSTR wzTerm;

    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
};

struct ATOM_ENTRY
{
    LPWSTR wzId;
    LPWSTR wzSummary;
    LPWSTR wzTitle;
    FILETIME ftPublished;
    FILETIME ftUpdated;

    ATOM_CONTENT* pContent;

    DWORD cAuthors;
    ATOM_AUTHOR* rgAuthors;

    DWORD cCategories;
    ATOM_CATEGORY* rgCategories;

    DWORD cLinks;
    ATOM_LINK* rgLinks;

    IXMLDOMNode* pixn;
    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
};

struct ATOM_FEED
{
    LPWSTR wzGenerator;
    LPWSTR wzIcon;
    LPWSTR wzId;
    LPWSTR wzLogo;
    LPWSTR wzSubtitle;
    LPWSTR wzTitle;
    FILETIME ftUpdated;

    DWORD cAuthors;
    ATOM_AUTHOR* rgAuthors;

    DWORD cCategories;
    ATOM_CATEGORY* rgCategories;

    DWORD cEntries;
    ATOM_ENTRY* rgEntries;

    DWORD cLinks;
    ATOM_LINK* rgLinks;

    IXMLDOMNode* pixn;
    ATOM_UNKNOWN_ELEMENT* pUnknownElements;
};

HRESULT DAPI AtomInitialize(
    );

void DAPI AtomUninitialize(
    );

HRESULT DAPI AtomParseFromString(
    __in_z LPCWSTR wzAtomString,
    __out ATOM_FEED **ppFeed
    );

HRESULT DAPI AtomParseFromFile(
    __in_z LPCWSTR wzAtomFile,
    __out ATOM_FEED **ppFeed
    );

HRESULT DAPI AtomParseFromDocument(
    __in IXMLDOMDocument* pixdDocument,
    __out ATOM_FEED **ppFeed
    );

void DAPI AtomFreeFeed(
    __in_xcount(pFeed->cItems) ATOM_FEED *pFEED
    );

#ifdef __cplusplus
}
#endif
