atom0s
8 years ago
commit
c9edbcf99a
12 changed files with 4477 additions and 0 deletions
@ -0,0 +1,221 @@ |
|||||||
|
# ---> VisualStudio |
||||||
|
## Ignore Visual Studio temporary files, build results, and |
||||||
|
## files generated by popular Visual Studio add-ons. |
||||||
|
|
||||||
|
# User-specific files |
||||||
|
*.suo |
||||||
|
*.user |
||||||
|
*.userosscache |
||||||
|
*.sln.docstates |
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio) |
||||||
|
*.userprefs |
||||||
|
|
||||||
|
# Build results |
||||||
|
[Dd]ebug/ |
||||||
|
[Dd]ebugPublic/ |
||||||
|
[Rr]elease/ |
||||||
|
[Rr]eleases/ |
||||||
|
x64/ |
||||||
|
x86/ |
||||||
|
build/ |
||||||
|
bld/ |
||||||
|
[Bb]in/ |
||||||
|
[Oo]bj/ |
||||||
|
|
||||||
|
# Visual Studio 2015 cache/options directory |
||||||
|
.vs/ |
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot |
||||||
|
#wwwroot/ |
||||||
|
|
||||||
|
# MSTest test Results |
||||||
|
[Tt]est[Rr]esult*/ |
||||||
|
[Bb]uild[Ll]og.* |
||||||
|
|
||||||
|
# NUNIT |
||||||
|
*.VisualState.xml |
||||||
|
TestResult.xml |
||||||
|
|
||||||
|
# Build Results of an ATL Project |
||||||
|
[Dd]ebugPS/ |
||||||
|
[Rr]eleasePS/ |
||||||
|
dlldata.c |
||||||
|
|
||||||
|
# DNX |
||||||
|
project.lock.json |
||||||
|
artifacts/ |
||||||
|
|
||||||
|
*_i.c |
||||||
|
*_p.c |
||||||
|
*_i.h |
||||||
|
*.ilk |
||||||
|
*.meta |
||||||
|
*.obj |
||||||
|
*.pch |
||||||
|
*.pdb |
||||||
|
*.pgc |
||||||
|
*.pgd |
||||||
|
*.rsp |
||||||
|
*.sbr |
||||||
|
*.tlb |
||||||
|
*.tli |
||||||
|
*.tlh |
||||||
|
*.tmp |
||||||
|
*.tmp_proj |
||||||
|
*.log |
||||||
|
*.vspscc |
||||||
|
*.vssscc |
||||||
|
.builds |
||||||
|
*.pidb |
||||||
|
*.svclog |
||||||
|
*.scc |
||||||
|
|
||||||
|
# Chutzpah Test files |
||||||
|
_Chutzpah* |
||||||
|
|
||||||
|
# Visual C++ cache files |
||||||
|
ipch/ |
||||||
|
*.aps |
||||||
|
*.ncb |
||||||
|
*.opensdf |
||||||
|
*.sdf |
||||||
|
*.cachefile |
||||||
|
|
||||||
|
# Visual Studio profiler |
||||||
|
*.psess |
||||||
|
*.vsp |
||||||
|
*.vspx |
||||||
|
*.sap |
||||||
|
|
||||||
|
# TFS 2012 Local Workspace |
||||||
|
$tf/ |
||||||
|
|
||||||
|
# Guidance Automation Toolkit |
||||||
|
*.gpState |
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in |
||||||
|
_ReSharper*/ |
||||||
|
*.[Rr]e[Ss]harper |
||||||
|
*.DotSettings.user |
||||||
|
|
||||||
|
# JustCode is a .NET coding add-in |
||||||
|
.JustCode |
||||||
|
|
||||||
|
# TeamCity is a build add-in |
||||||
|
_TeamCity* |
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool |
||||||
|
*.dotCover |
||||||
|
|
||||||
|
# NCrunch |
||||||
|
_NCrunch_* |
||||||
|
.*crunch*.local.xml |
||||||
|
nCrunchTemp_* |
||||||
|
|
||||||
|
# MightyMoose |
||||||
|
*.mm.* |
||||||
|
AutoTest.Net/ |
||||||
|
|
||||||
|
# Web workbench (sass) |
||||||
|
.sass-cache/ |
||||||
|
|
||||||
|
# Installshield output folder |
||||||
|
[Ee]xpress/ |
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in |
||||||
|
DocProject/buildhelp/ |
||||||
|
DocProject/Help/*.HxT |
||||||
|
DocProject/Help/*.HxC |
||||||
|
DocProject/Help/*.hhc |
||||||
|
DocProject/Help/*.hhk |
||||||
|
DocProject/Help/*.hhp |
||||||
|
DocProject/Help/Html2 |
||||||
|
DocProject/Help/html |
||||||
|
|
||||||
|
# Click-Once directory |
||||||
|
publish/ |
||||||
|
|
||||||
|
# Publish Web Output |
||||||
|
*.[Pp]ublish.xml |
||||||
|
*.azurePubxml |
||||||
|
# TODO: Comment the next line if you want to checkin your web deploy settings |
||||||
|
# but database connection strings (with potential passwords) will be unencrypted |
||||||
|
*.pubxml |
||||||
|
*.publishproj |
||||||
|
|
||||||
|
# NuGet Packages |
||||||
|
*.nupkg |
||||||
|
# The packages folder can be ignored because of Package Restore |
||||||
|
**/packages/* |
||||||
|
# except build/, which is used as an MSBuild target. |
||||||
|
!**/packages/build/ |
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed |
||||||
|
#!**/packages/repositories.config |
||||||
|
|
||||||
|
# Windows Azure Build Output |
||||||
|
csx/ |
||||||
|
*.build.csdef |
||||||
|
|
||||||
|
# Windows Store app package directory |
||||||
|
AppPackages/ |
||||||
|
|
||||||
|
# Visual Studio cache files |
||||||
|
# files ending in .cache can be ignored |
||||||
|
*.[Cc]ache |
||||||
|
# but keep track of directories ending in .cache |
||||||
|
!*.[Cc]ache/ |
||||||
|
|
||||||
|
# Others |
||||||
|
ClientBin/ |
||||||
|
[Ss]tyle[Cc]op.* |
||||||
|
~$* |
||||||
|
*~ |
||||||
|
*.dbmdl |
||||||
|
*.dbproj.schemaview |
||||||
|
*.pfx |
||||||
|
*.publishsettings |
||||||
|
node_modules/ |
||||||
|
orleans.codegen.cs |
||||||
|
|
||||||
|
# RIA/Silverlight projects |
||||||
|
Generated_Code/ |
||||||
|
|
||||||
|
# Backup & report files from converting an old project file |
||||||
|
# to a newer Visual Studio version. Backup files are not needed, |
||||||
|
# because we have git ;-) |
||||||
|
_UpgradeReport_Files/ |
||||||
|
Backup*/ |
||||||
|
UpgradeLog*.XML |
||||||
|
UpgradeLog*.htm |
||||||
|
|
||||||
|
# SQL Server files |
||||||
|
*.mdf |
||||||
|
*.ldf |
||||||
|
|
||||||
|
# Business Intelligence projects |
||||||
|
*.rdl.data |
||||||
|
*.bim.layout |
||||||
|
*.bim_*.settings |
||||||
|
|
||||||
|
# Microsoft Fakes |
||||||
|
FakesAssemblies/ |
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio |
||||||
|
.ntvs_analysis.dat |
||||||
|
|
||||||
|
# Visual Studio 6 build log |
||||||
|
*.plg |
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file |
||||||
|
*.opt |
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output |
||||||
|
**/*.HTMLClient/GeneratedArtifacts |
||||||
|
**/*.DesktopClient/GeneratedArtifacts |
||||||
|
**/*.DesktopClient/ModelManifest.xml |
||||||
|
**/*.Server/GeneratedArtifacts |
||||||
|
**/*.Server/ModelManifest.xml |
||||||
|
_Pvt_Extensions |
||||||
|
|
||||||
|
/Ashita.exp |
||||||
|
/Ashita.lib |
@ -0,0 +1,5 @@ |
|||||||
|
LIBRARY "Greed" |
||||||
|
EXPORTS |
||||||
|
GetInterfaceVersion |
||||||
|
CreatePluginInfo |
||||||
|
CreatePlugin |
@ -0,0 +1,144 @@ |
|||||||
|
/**
|
||||||
|
* Copyright (c) 2011-2014 - Ashita Development Team |
||||||
|
* |
||||||
|
* Ashita is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* Ashita is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with Ashita. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef __ASHITA_Greed_H_INCLUDED__ |
||||||
|
#define __ASHITA_Greed_H_INCLUDED__ |
||||||
|
|
||||||
|
#if defined (_MSC_VER) && (_MSC_VER >= 1020) |
||||||
|
#pragma once |
||||||
|
#endif |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Required includes for an extension. |
||||||
|
*/ |
||||||
|
#include "C:\Ashita 3\plugins\ADK\Ashita.h" |
||||||
|
#include "rapidxml\rapidxml.hpp" |
||||||
|
#include "rapidxml\rapidxml_utils.hpp" |
||||||
|
#include <map> |
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
#define SPACING 3 |
||||||
|
#define PADDING 3 |
||||||
|
#define GreedSIZE 36 |
||||||
|
#define FONTSIZE 10 |
||||||
|
#define FADERANGE 400 |
||||||
|
|
||||||
|
// buffer I/O macros
|
||||||
|
#define RBUFP(p,pos) (((uint8_t*)(p)) + (pos)) |
||||||
|
#define RBUFB(p,pos) (*(uint8_t*)RBUFP((p),(pos))) |
||||||
|
#define RBUFW(p,pos) (*(uint16_t*)RBUFP((p),(pos))) |
||||||
|
#define RBUFL(p,pos) (*(uint32_t*)RBUFP((p),(pos))) |
||||||
|
#define RBUFF(p,pos) (*(float*)RBUFP((p),(pos))) |
||||||
|
|
||||||
|
#define WBUFP(p,pos) (((uint8_t*)(p)) + (pos)) |
||||||
|
#define WBUFB(p,pos) (*(uint8_t*)WBUFP((p),(pos))) |
||||||
|
#define WBUFW(p,pos) (*(uint16_t*)WBUFP((p),(pos))) |
||||||
|
#define WBUFL(p,pos) (*(uint32_t*)WBUFP((p),(pos))) |
||||||
|
#define WBUFU(p,pos) (*(uint64_t*)WBUFP((p),(pos))) |
||||||
|
#define WBUFF(p,pos) (*(float*)WBUFP((p),(pos))) |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Global copy of our plugin data. |
||||||
|
*/ |
||||||
|
plugininfo_t* g_PluginInfo = NULL; |
||||||
|
|
||||||
|
static std::vector<std::string> jobs = { "", "WAR", "MNK", "WHM", "BLM", "RDM", "THF", "PLD", "DRK", |
||||||
|
"BST", "BRD", "RNG", "SAM", "NIN", "DRG", "SMN", "BLU", "COR", "PUP", "DNC", "SCH", "GEO", "RUN" }; |
||||||
|
|
||||||
|
static const std::vector<D3DCOLOR> jobColors = { D3DCOLOR_ARGB(255, 120, 120, 120), D3DCOLOR_ARGB(255, 140, 0, 0), D3DCOLOR_ARGB(255, 255, 177, 32), |
||||||
|
D3DCOLOR_ARGB(255, 255, 255, 255), D3DCOLOR_ARGB(255, 68, 68, 68), D3DCOLOR_ARGB(255, 255, 0, 0), D3DCOLOR_ARGB(255, 0, 164, 49), |
||||||
|
D3DCOLOR_ARGB(255, 198, 198, 0), D3DCOLOR_ARGB(255, 116, 0, 145), D3DCOLOR_ARGB(255, 165, 153, 10), D3DCOLOR_ARGB(255, 184, 128, 10), |
||||||
|
D3DCOLOR_ARGB(255, 224, 0, 230), D3DCOLOR_ARGB(255, 234, 100, 0), D3DCOLOR_ARGB(255, 119, 0, 0), D3DCOLOR_ARGB(255, 130, 17, 255), |
||||||
|
D3DCOLOR_ARGB(255, 79, 196, 0), D3DCOLOR_ARGB(255, 50, 66, 217), D3DCOLOR_ARGB(255, 136, 68, 0), D3DCOLOR_ARGB(255, 244, 98, 98), |
||||||
|
D3DCOLOR_ARGB(255, 15, 190, 220), D3DCOLOR_ARGB(255, 0, 123, 145), D3DCOLOR_ARGB(255, 255, 70, 255), D3DCOLOR_ARGB(255, 255, 255, 255) }; |
||||||
|
|
||||||
|
struct config_t |
||||||
|
{ |
||||||
|
uint8_t spacing; |
||||||
|
uint8_t padding; |
||||||
|
uint8_t Greedsize; |
||||||
|
uint8_t fontsize; |
||||||
|
float faderange; |
||||||
|
Ashita::FrameAnchor anchor; |
||||||
|
float x; |
||||||
|
float y; |
||||||
|
uint8_t rf; |
||||||
|
uint8_t gf; |
||||||
|
uint8_t bf; |
||||||
|
uint8_t rb; |
||||||
|
uint8_t gb; |
||||||
|
uint8_t bb; |
||||||
|
bool jobColored; |
||||||
|
}; |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Our Main Plugin Class |
||||||
|
* |
||||||
|
* @note The main class of your plugin MUST use PluginBase as a base class. This is the |
||||||
|
* internal base class that Ashita uses to communicate with your plugin! |
||||||
|
*/ |
||||||
|
class Greed : IPlugin |
||||||
|
{ |
||||||
|
/**
|
||||||
|
* @brief Internal class variables. |
||||||
|
*/ |
||||||
|
IAshitaCore* m_AshitaCore; |
||||||
|
ILogManager* m_LogManager; |
||||||
|
DWORD m_PluginId; |
||||||
|
IDirect3DDevice8* m_Direct3DDevice; |
||||||
|
|
||||||
|
private: |
||||||
|
rapidxml::xml_document<> settings; |
||||||
|
rapidxml::file<>* xmlFile; |
||||||
|
std::map<IFontObject*, uint32_t> targIdMap; |
||||||
|
void LoadSettings(); |
||||||
|
config_t config; |
||||||
|
|
||||||
|
public: |
||||||
|
/**
|
||||||
|
* @brief Constructor and deconstructor. |
||||||
|
*/ |
||||||
|
Greed(void); |
||||||
|
virtual ~Greed(void); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief GetPluginData implementation. |
||||||
|
*/ |
||||||
|
plugininfo_t GetPluginInfo(void); |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief PluginBase virtual overrides. |
||||||
|
*/ |
||||||
|
bool Initialize(IAshitaCore* core, ILogManager* log, uint32_t id); |
||||||
|
void Release(void); |
||||||
|
bool Direct3DInitialize(IDirect3DDevice8* device); |
||||||
|
void Direct3DRelease(void); |
||||||
|
void Direct3DPreRender(void); |
||||||
|
void Direct3DRender(void); |
||||||
|
void onClick(int, IFontObject*, float, float); |
||||||
|
}; |
||||||
|
|
||||||
|
Greed* g_Greed = NULL; |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Required Plugin Exports |
||||||
|
*/ |
||||||
|
__declspec(dllexport) double __stdcall GetInterfaceVersion(void); |
||||||
|
__declspec(dllexport) void __stdcall CreatePluginInfo(plugininfo_t* lpBuffer); |
||||||
|
__declspec(dllexport) IPlugin* __stdcall CreatePlugin(void); |
||||||
|
|
||||||
|
#endif // __ASHITA_Greed_H_INCLUDED__
|
@ -0,0 +1,565 @@ |
|||||||
|
/**
|
||||||
|
* Copyright (c) 2011-2014 - Ashita Development Team |
||||||
|
* |
||||||
|
* Ashita is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* Ashita is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with Ashita. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "Greed.h" |
||||||
|
#include <algorithm> |
||||||
|
|
||||||
|
#undef max |
||||||
|
#undef min |
||||||
|
|
||||||
|
D3DCOLOR darken(D3DCOLOR color) |
||||||
|
{ |
||||||
|
return D3DCOLOR_ARGB(((color & 0xFF000000) >> 24), ((color & 0xFF0000) >> 16) / 3, ((color & 0xFF00) >> 8) / 3, (color & 0xFF) / 3); |
||||||
|
} |
||||||
|
|
||||||
|
D3DCOLOR brighten(D3DCOLOR color) |
||||||
|
{ |
||||||
|
uint8_t alpha = (color & 0xFF000000) >> 24; |
||||||
|
uint8_t r = (color & 0xFF0000) >> 16; |
||||||
|
uint8_t g = (color & 0xFF00) >> 8; |
||||||
|
uint8_t b = (color & 0xFF); |
||||||
|
return D3DCOLOR_ARGB(alpha, r > 225 ? 255 : r + 30, g > 225 ? 255 : g + 30, b > 225 ? 255 : b + 30); |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor and Deconstructor |
||||||
|
*/ |
||||||
|
Greed::Greed(void) |
||||||
|
: m_AshitaCore(NULL) |
||||||
|
, m_PluginId(0) |
||||||
|
, m_Direct3DDevice(NULL) |
||||||
|
{ } |
||||||
|
Greed::~Greed(void) |
||||||
|
{ } |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Obtains the plugin data for this plugin. |
||||||
|
* |
||||||
|
* @return The PluginData structure for this plugin. |
||||||
|
*/ |
||||||
|
plugininfo_t Greed::GetPluginInfo(void) |
||||||
|
{ |
||||||
|
return (*g_PluginInfo); |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes our plugin. This is the main call that happens when your plugin is loaded. |
||||||
|
* |
||||||
|
* @param ashitaCore The main Ashita Core object interface to interact with Ashita. |
||||||
|
* @param scriptEngine The main script engine object interface to interact with the script engine. |
||||||
|
* @param dwPluginId The base address of your plugin. This is used as the ID. |
||||||
|
* |
||||||
|
* @return True on success, false otherwise. |
||||||
|
* |
||||||
|
* @note If your plugin returns false here, it will be unloaded immediately! |
||||||
|
*/ |
||||||
|
bool Greed::Initialize(IAshitaCore* core, ILogManager* log, uint32_t id) |
||||||
|
{ |
||||||
|
// Store the variables we are passed..
|
||||||
|
this->m_AshitaCore = core; |
||||||
|
this->m_PluginId = id; |
||||||
|
this->m_LogManager = log; |
||||||
|
|
||||||
|
g_Greed = this; |
||||||
|
|
||||||
|
LoadSettings(); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Releases this plugin. This is called when your plugin is unloaded. |
||||||
|
* |
||||||
|
* @note Your plugin should cleanup all its data here before it unloads. Anything such as: |
||||||
|
* - Font objects. |
||||||
|
* - Gui objects. |
||||||
|
* - Bindings to the script engine (if you extended it any). |
||||||
|
*/ |
||||||
|
void Greed::Release(void) |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Direct3D initialize call to prepare this plugin for Direct3D calls. |
||||||
|
* |
||||||
|
* @param lpDevice The Direct3D device currently wrapped by Ashita. |
||||||
|
* |
||||||
|
* @return True on success, false otherwise. |
||||||
|
* |
||||||
|
* @note Plugins that do not return true on this call will not receive any other |
||||||
|
* Direct3D calls listed below! |
||||||
|
*/ |
||||||
|
bool Greed::Direct3DInitialize(IDirect3DDevice8* device) |
||||||
|
{ |
||||||
|
this->m_Direct3DDevice = device; |
||||||
|
|
||||||
|
IFontObject* base = m_AshitaCore->GetFontManager()->Create("GreedBase"); |
||||||
|
base->SetFontFamily("Consolas"); |
||||||
|
base->SetFontHeight(10); |
||||||
|
base->SetAutoResize(false); |
||||||
|
base->GetBackground()->SetColor(D3DCOLOR_ARGB(0x60, 0x00, 0x00, 0x00)); |
||||||
|
base->GetBackground()->SetVisibility(true); |
||||||
|
base->GetBackground()->SetWidth(308); |
||||||
|
base->GetBackground()->SetHeight(config.Greedsize + config.spacing * 2); |
||||||
|
base->SetAnchor((uint32_t)config.anchor); |
||||||
|
base->SetAnchorParent((uint32_t)config.anchor); |
||||||
|
base->SetText(""); |
||||||
|
base->SetPositionX(config.x); |
||||||
|
base->SetPositionY(config.y); |
||||||
|
base->SetVisibility(true); |
||||||
|
|
||||||
|
IFontObject* prev = base; |
||||||
|
IFontObject* rowBase = NULL; |
||||||
|
|
||||||
|
for (int i = 0; i < 18; i++) |
||||||
|
{ |
||||||
|
std::string texPath = m_AshitaCore->GetAshitaInstallPathA(); |
||||||
|
texPath.append("\\Resources\\Greed\\gradient.tga"); |
||||||
|
|
||||||
|
char alias[32]; |
||||||
|
sprintf_s(alias, sizeof alias, "GreedBG%d", i); |
||||||
|
IFontObject* bg = m_AshitaCore->GetFontManager()->Create(alias); |
||||||
|
|
||||||
|
bg->SetAutoResize(false); |
||||||
|
bg->GetBackground()->SetColor(D3DCOLOR_ARGB(0xFF, config.rb, config.gb, config.bb)); |
||||||
|
bg->GetBackground()->SetWidth(config.Greedsize); |
||||||
|
bg->GetBackground()->SetHeight(config.Greedsize); |
||||||
|
bg->GetBackground()->SetVisibility(true); |
||||||
|
bg->SetParent(prev); |
||||||
|
bg->SetAnchor((uint32_t)config.anchor); |
||||||
|
|
||||||
|
auto right = config.anchor & Ashita::FrameAnchor::Right; |
||||||
|
auto bottom = config.anchor & Ashita::FrameAnchor::Bottom; |
||||||
|
|
||||||
|
if (prev == base) |
||||||
|
{ |
||||||
|
bg->SetAnchorParent((uint32_t)config.anchor); |
||||||
|
bg->SetPositionX(right ? -config.spacing : config.spacing); |
||||||
|
bg->SetPositionY(bottom ? |
||||||
|
-config.spacing - (config.Greedsize + config.padding) * (i / 6) : |
||||||
|
config.spacing + (config.Greedsize + config.padding) * (i / 6)); |
||||||
|
rowBase = bg; |
||||||
|
} |
||||||
|
else if (i == 6 || i == 12) |
||||||
|
{ |
||||||
|
bg->SetParent(rowBase); |
||||||
|
bg->SetAnchorParent(((int32_t)config.anchor ^ (int32_t)Ashita::FrameAnchor::Bottom)); |
||||||
|
bg->SetPositionX(0); |
||||||
|
bg->SetPositionY(bottom ? -config.padding : config.padding); |
||||||
|
rowBase = bg; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
bg->SetAnchorParent(((int32_t)config.anchor ^ (int32_t)Ashita::FrameAnchor::Right)); |
||||||
|
bg->SetPositionX(right ? -config.padding : config.padding); |
||||||
|
bg->SetPositionY(0); |
||||||
|
} |
||||||
|
bg->SetVisibility(true); |
||||||
|
bg->SetMouseEventFunction([](int type, void* font, float xPos, float yPos){g_Greed->onClick(type, (IFontObject*)font, xPos, yPos); }); |
||||||
|
bg->GetBackground()->SetTextureFromFile(texPath.c_str()); |
||||||
|
|
||||||
|
sprintf_s(alias, sizeof alias, "GreedFG%d", i); |
||||||
|
IFontObject* fg = m_AshitaCore->GetFontManager()->Create(alias); |
||||||
|
|
||||||
|
fg->SetAutoResize(false); |
||||||
|
fg->GetBackground()->SetColor(D3DCOLOR_ARGB(0xFF, config.rf, config.gf, config.bf)); |
||||||
|
fg->GetBackground()->SetWidth(config.Greedsize); |
||||||
|
fg->GetBackground()->SetHeight(config.Greedsize); |
||||||
|
fg->GetBackground()->SetVisibility(true); |
||||||
|
fg->SetParent(bg); |
||||||
|
fg->SetAnchor((uint32_t)Ashita::FrameAnchor::BottomLeft); |
||||||
|
fg->SetAnchorParent((uint32_t)Ashita::FrameAnchor::BottomLeft); |
||||||
|
fg->SetPositionX(0); |
||||||
|
fg->SetPositionY(0); |
||||||
|
fg->SetVisibility(true); |
||||||
|
fg->GetBackground()->SetTextureFromFile(texPath.c_str()); |
||||||
|
|
||||||
|
sprintf_s(alias, sizeof alias, "GreedTX%d", i); |
||||||
|
IFontObject* tx = m_AshitaCore->GetFontManager()->Create(alias); |
||||||
|
|
||||||
|
tx->SetAutoResize(false); |
||||||
|
tx->SetFontFamily("Consolas"); |
||||||
|
tx->SetFontHeight(config.fontsize); |
||||||
|
tx->SetText(""); |
||||||
|
tx->SetColor(D3DCOLOR_ARGB(0xFF, config.rb, config.gb, config.bb)); |
||||||
|
tx->GetBackground()->SetVisibility(false); |
||||||
|
tx->SetParent(bg); |
||||||
|
tx->SetAnchor((uint32_t)Ashita::FrameAnchor::BottomLeft); |
||||||
|
tx->SetAnchorParent((uint32_t)Ashita::FrameAnchor::BottomLeft); |
||||||
|
tx->SetPositionX(config.padding); |
||||||
|
tx->SetPositionY(-config.Greedsize / 2 - (5 * config.fontsize) / 6); |
||||||
|
tx->SetVisibility(true); |
||||||
|
|
||||||
|
sprintf_s(alias, sizeof alias, "GreedIndicatorTopLeft%d", i); |
||||||
|
IFontObject* br = m_AshitaCore->GetFontManager()->Create(alias); |
||||||
|
|
||||||
|
br->SetAutoResize(false); |
||||||
|
br->GetBackground()->SetColor(D3DCOLOR_ARGB(0xFF, 0x80, 0x80, 0x00)); |
||||||
|
br->GetBackground()->SetWidth(config.Greedsize / 6); |
||||||
|
br->GetBackground()->SetHeight(config.Greedsize / 6); |
||||||
|
br->GetBackground()->SetVisibility(true); |
||||||
|
br->SetParent(bg); |
||||||
|
br->SetAnchor((uint32_t)Ashita::FrameAnchor::TopLeft); |
||||||
|
br->SetAnchorParent((uint32_t)Ashita::FrameAnchor::TopLeft); |
||||||
|
br->SetPositionX(0); |
||||||
|
br->SetPositionY(0); |
||||||
|
br->SetVisibility(false); |
||||||
|
|
||||||
|
prev = bg; |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Direct3D release call to allow this plugin to cleanup any Direct3D objects. |
||||||
|
*/ |
||||||
|
void Greed::Direct3DRelease(void) |
||||||
|
{ |
||||||
|
m_AshitaCore->GetFontManager()->Delete("GreedBase"); |
||||||
|
|
||||||
|
for (int i = 0; i < 18; i++) |
||||||
|
{ |
||||||
|
char alias[32]; |
||||||
|
sprintf_s(alias, sizeof alias, "GreedBG%d", i); |
||||||
|
m_AshitaCore->GetFontManager()->Delete(alias); |
||||||
|
|
||||||
|
sprintf_s(alias, sizeof alias, "GreedFG%d", i); |
||||||
|
m_AshitaCore->GetFontManager()->Delete(alias); |
||||||
|
|
||||||
|
sprintf_s(alias, sizeof alias, "GreedTX%d", i); |
||||||
|
m_AshitaCore->GetFontManager()->Delete(alias); |
||||||
|
|
||||||
|
sprintf_s(alias, sizeof alias, "GreedIndicatorTopLeft%d", i); |
||||||
|
m_AshitaCore->GetFontManager()->Delete(alias); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Direct3D prerender call to allow this plugin to prepare for rendering. |
||||||
|
* |
||||||
|
* @note This will only be called if you returned true in Direct3DInitialize! |
||||||
|
*/ |
||||||
|
void Greed::Direct3DPreRender(void) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Direct3D render call to allow this plugin to render any custom things. |
||||||
|
* |
||||||
|
* @note This will only be called if you returned true in Direct3DInitialize! |
||||||
|
*/ |
||||||
|
void Greed::Direct3DRender(void) |
||||||
|
{ |
||||||
|
int party = 0; |
||||||
|
for (int i = 0; i < 18; i++) |
||||||
|
{ |
||||||
|
char alias[32]; |
||||||
|
sprintf_s(alias, sizeof alias, "GreedBG%d", i); |
||||||
|
IFontObject* bg = m_AshitaCore->GetFontManager()->Get(alias); |
||||||
|
sprintf_s(alias, sizeof alias, "GreedFG%d", i); |
||||||
|
IFontObject* fg = m_AshitaCore->GetFontManager()->Get(alias); |
||||||
|
sprintf_s(alias, sizeof alias, "GreedTX%d", i); |
||||||
|
IFontObject* tx = m_AshitaCore->GetFontManager()->Get(alias); |
||||||
|
sprintf_s(alias, sizeof alias, "GreedIndicatorTopLeft%d", i); |
||||||
|
IFontObject* br = m_AshitaCore->GetFontManager()->Get(alias); |
||||||
|
|
||||||
|
if (!m_AshitaCore->GetDataManager()->GetParty()->GetMemberActive(i)) |
||||||
|
{ |
||||||
|
bg->SetVisibility(false); |
||||||
|
fg->SetVisibility(false); |
||||||
|
tx->SetVisibility(false); |
||||||
|
br->SetVisibility(false); |
||||||
|
targIdMap[bg] = 0; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
bg->SetVisibility(true); |
||||||
|
fg->SetVisibility(true); |
||||||
|
tx->SetVisibility(true); |
||||||
|
uint8_t hpp = m_AshitaCore->GetDataManager()->GetParty()->GetMemberCurrentHPP(i); |
||||||
|
uint8_t job = m_AshitaCore->GetDataManager()->GetParty()->GetMemberMainJob(i); |
||||||
|
uint16_t index = m_AshitaCore->GetDataManager()->GetParty()->GetMemberTargetIndex(i); |
||||||
|
if (config.jobColored && job <= (uint8_t)Ashita::FFXI::Enums::Jobs::RuneFencer) |
||||||
|
{ |
||||||
|
bg->GetBackground()->SetColor(jobColors[job]); |
||||||
|
fg->GetBackground()->SetColor(darken(jobColors[job])); |
||||||
|
tx->SetColor(brighten(jobColors[job])); |
||||||
|
} |
||||||
|
fg->GetBackground()->SetHeight(bg->GetBackground()->GetHeight() * ((float)hpp / 100)); |
||||||
|
fg->SetAnchor((uint32_t)Ashita::FrameAnchor::BottomLeft); |
||||||
|
std::string txString; |
||||||
|
char rawString[16]; |
||||||
|
if (hpp > 90 || m_AshitaCore->GetDataManager()->GetParty()->GetMemberZone(i) != m_AshitaCore->GetDataManager()->GetParty()->GetMemberZone(0)) |
||||||
|
{ |
||||||
|
sprintf_s(rawString, sizeof rawString, "%.*s", (config.Greedsize / config.fontsize) + 1, m_AshitaCore->GetDataManager()->GetParty()->GetMemberName(i)); |
||||||
|
txString.append(rawString); |
||||||
|
} |
||||||
|
else if (hpp == 0) |
||||||
|
{ |
||||||
|
txString.append("DEAD"); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
uint32_t hp = m_AshitaCore->GetDataManager()->GetParty()->GetMemberCurrentHP(i); |
||||||
|
float hpguess = (int)(hp / ((float)hpp / 100)) - hp; |
||||||
|
sprintf_s(rawString, sizeof rawString, "-%.*f", hpguess > 1000 ? 1 : 0, hpguess > 1000 ? hpguess / 1000 : hpguess); |
||||||
|
txString.append(rawString); |
||||||
|
} |
||||||
|
tx->SetText(txString.c_str()); |
||||||
|
if (m_AshitaCore->GetDataManager()->GetParty()->GetMemberZone(i) != m_AshitaCore->GetDataManager()->GetParty()->GetMemberZone(0) || |
||||||
|
!(m_AshitaCore->GetDataManager()->GetEntity()->GetRenderFlags0(index) & 0x200) || |
||||||
|
m_AshitaCore->GetDataManager()->GetEntity()->GetDistance(index) > config.faderange) |
||||||
|
{ |
||||||
|
bg->GetBackground()->SetColor((bg->GetBackground()->GetColor() & 0x00FFFFFF) | (0x10 << 24)); |
||||||
|
fg->GetBackground()->SetColor((fg->GetBackground()->GetColor() & 0x00FFFFFF) | (0x40 << 24)); |
||||||
|
tx->SetColor((tx->GetColor() & 0x00FFFFFF) | (0x40 << 24)); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
bg->GetBackground()->SetColor((bg->GetBackground()->GetColor() & 0x00FFFFFF) | (0xFF << 24)); |
||||||
|
fg->GetBackground()->SetColor((fg->GetBackground()->GetColor() & 0x00FFFFFF) | (0xFF << 24)); |
||||||
|
tx->SetColor((tx->GetColor() & 0x00FFFFFF) | (0xFF << 24)); |
||||||
|
} |
||||||
|
if (m_AshitaCore->GetDataManager()->GetTarget()->GetTargetIndex() == index && |
||||||
|
m_AshitaCore->GetDataManager()->GetParty()->GetMemberZone(i) == m_AshitaCore->GetDataManager()->GetParty()->GetMemberZone(0)) |
||||||
|
{ |
||||||
|
br->SetVisibility(true); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
br->SetVisibility(false); |
||||||
|
} |
||||||
|
targIdMap[bg] = m_AshitaCore->GetDataManager()->GetEntity()->GetServerId(index); |
||||||
|
party |= (i / 6); |
||||||
|
} |
||||||
|
} |
||||||
|
IFontObject* base = m_AshitaCore->GetFontManager()->Get("GreedBase"); |
||||||
|
int maxmem = std::max(m_AshitaCore->GetDataManager()->GetParty()->GetAllianceParty0MemberCount(), std::max(m_AshitaCore->GetDataManager()->GetParty()->GetAllianceParty1MemberCount(), |
||||||
|
m_AshitaCore->GetDataManager()->GetParty()->GetAllianceParty2MemberCount())); |
||||||
|
base->GetBackground()->SetWidth(config.spacing * 2 + maxmem * config.Greedsize + (maxmem - 1) * config.padding); |
||||||
|
base->GetBackground()->SetHeight(config.Greedsize + config.spacing * 2 + (party & 1 ? config.Greedsize + config.padding : 0) + |
||||||
|
(party & 2 ? config.Greedsize + config.padding : 0)); |
||||||
|
base->SetAnchor((uint32_t)config.anchor); |
||||||
|
} |
||||||
|
|
||||||
|
void Greed::LoadSettings() |
||||||
|
{ |
||||||
|
config.faderange = FADERANGE; |
||||||
|
config.fontsize = FONTSIZE; |
||||||
|
config.Greedsize = GreedSIZE; |
||||||
|
config.padding = PADDING; |
||||||
|
config.spacing = SPACING; |
||||||
|
config.anchor = Ashita::FrameAnchor::BottomRight; |
||||||
|
config.x = -132; |
||||||
|
config.y = -16; |
||||||
|
config.rf = 0x50; |
||||||
|
config.gf = 0x28; |
||||||
|
config.bf = 0x00; |
||||||
|
config.rb = 0xFF; |
||||||
|
config.gb = 0x80; |
||||||
|
config.bb = 0x00; |
||||||
|
config.jobColored = true; |
||||||
|
|
||||||
|
char szConfigPath[MAX_PATH] = { 0 }; |
||||||
|
sprintf_s(szConfigPath, MAX_PATH, "%sConfig\\%s.xml", m_AshitaCore->GetAshitaInstallPathA(), g_PluginInfo->Name); |
||||||
|
try |
||||||
|
{ |
||||||
|
xmlFile = new rapidxml::file<>(szConfigPath); |
||||||
|
settings.parse<0>(xmlFile->data()); |
||||||
|
} |
||||||
|
catch (std::exception& e) |
||||||
|
{ |
||||||
|
m_AshitaCore->GetChatManager()->Writef("Greed: Could not load settings: %s", e.what()); |
||||||
|
m_AshitaCore->GetChatManager()->Write("Greed: If this is your first time running Greed, you'll need to make a profile in Config/Greed.xml (use the profile in Docs for reference)"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
auto node = settings.first_node("settings"); |
||||||
|
|
||||||
|
if (node) |
||||||
|
{ |
||||||
|
auto setNode = node->first_node("faderange"); |
||||||
|
if (setNode) |
||||||
|
config.faderange = pow(atof(setNode->value()),2); |
||||||
|
|
||||||
|
setNode = node->first_node("fontsize"); |
||||||
|
if (setNode) |
||||||
|
config.fontsize = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("Greedsize"); |
||||||
|
if (setNode) |
||||||
|
config.Greedsize = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("padding"); |
||||||
|
if (setNode) |
||||||
|
config.padding = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("spacing"); |
||||||
|
if (setNode) |
||||||
|
config.spacing = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("anchor"); |
||||||
|
if (setNode) |
||||||
|
config.anchor = static_cast<Ashita::FrameAnchor>(atoi(setNode->value())); |
||||||
|
|
||||||
|
setNode = node->first_node("xpos"); |
||||||
|
if (setNode) |
||||||
|
config.x = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("ypos"); |
||||||
|
if (setNode) |
||||||
|
config.y = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("fgred"); |
||||||
|
if (setNode) |
||||||
|
config.rf = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("fggreen"); |
||||||
|
if (setNode) |
||||||
|
config.gf = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("fgblue"); |
||||||
|
if (setNode) |
||||||
|
config.bf = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("bgred"); |
||||||
|
if (setNode) |
||||||
|
config.rb = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("bggreen"); |
||||||
|
if (setNode) |
||||||
|
config.gb = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("bgblue"); |
||||||
|
if (setNode) |
||||||
|
config.bb = atoi(setNode->value()); |
||||||
|
|
||||||
|
setNode = node->first_node("jobcolored"); |
||||||
|
if (setNode) |
||||||
|
config.jobColored = strncmp(setNode->value(),"true",setNode->value_size()) ? false : true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the interface version this plugin was compiled with. |
||||||
|
* |
||||||
|
* @note This is a required export, your plugin must implement this! |
||||||
|
*/ |
||||||
|
__declspec(dllexport) double __stdcall GetInterfaceVersion(void) |
||||||
|
{ |
||||||
|
return ASHITA_INTERFACE_VERSION; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the plugin data for this plugin. |
||||||
|
* |
||||||
|
* @note This is a required export, your plugin must implement this! |
||||||
|
*/ |
||||||
|
__declspec(dllexport) void __stdcall CreatePluginInfo(plugininfo_t* lpBuffer) |
||||||
|
{ |
||||||
|
g_PluginInfo = lpBuffer; |
||||||
|
|
||||||
|
strcpy_s(g_PluginInfo->Name, sizeof(g_PluginInfo->Name), "Greed"); |
||||||
|
strcpy_s(g_PluginInfo->Author, sizeof(g_PluginInfo->Author), "kjLotus"); |
||||||
|
|
||||||
|
g_PluginInfo->InterfaceVersion = ASHITA_INTERFACE_VERSION; |
||||||
|
g_PluginInfo->PluginVersion = 1.00f; |
||||||
|
g_PluginInfo->Priority = 0; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates an instance of this plugin object. |
||||||
|
* |
||||||
|
* @note This is a required export, your plugin must implement this! |
||||||
|
*/ |
||||||
|
__declspec(dllexport) IPlugin* __stdcall CreatePlugin(void) |
||||||
|
{ |
||||||
|
return (IPlugin*)new Greed(); |
||||||
|
} |
||||||
|
|
||||||
|
void Greed::onClick(int type, IFontObject* font, float xPos, float yPos) |
||||||
|
{ |
||||||
|
if (xmlFile) |
||||||
|
{ |
||||||
|
std::string job = jobs[m_AshitaCore->GetDataManager()->GetPlayer()->GetMainJob()]; |
||||||
|
std::transform(job.begin(), job.end(), job.begin(), ::tolower); |
||||||
|
auto node = settings.first_node(job.c_str()); |
||||||
|
uint32_t targid; |
||||||
|
try |
||||||
|
{ |
||||||
|
targid = targIdMap.at(font); |
||||||
|
} |
||||||
|
catch (const std::out_of_range& e) |
||||||
|
{ |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (node) |
||||||
|
{ |
||||||
|
std::string click; |
||||||
|
if (type == (int)Ashita::MouseInput::LeftClick) |
||||||
|
click.append("lclick"); |
||||||
|
else if (type == (int)Ashita::MouseInput::RightClick) |
||||||
|
click.append("rclick"); |
||||||
|
else if (type == (int)Ashita::MouseInput::MiddleClick) |
||||||
|
click.append("mclick"); |
||||||
|
else if (type == (int)Ashita::MouseInput::X1Click) |
||||||
|
click.append("button4"); |
||||||
|
else if (type == (int)Ashita::MouseInput::X2Click) |
||||||
|
click.append("button5"); |
||||||
|
else |
||||||
|
return; |
||||||
|
|
||||||
|
for (auto clickNode = node->first_node(click.c_str()); clickNode; clickNode = clickNode->next_sibling(click.c_str())) |
||||||
|
{ |
||||||
|
uint8_t modifiers = (GetAsyncKeyState(VK_CONTROL) & 0x8000 ? 1 : 0); |
||||||
|
modifiers |= (GetAsyncKeyState(VK_MENU) & 0x8000 ? 2 : 0); |
||||||
|
|
||||||
|
uint8_t foundModifiers = 0; |
||||||
|
auto attr = clickNode->first_attribute("modifier"); |
||||||
|
for (auto attr = clickNode->first_attribute("modifier"); attr; attr = attr->next_attribute("modifier")) |
||||||
|
{ |
||||||
|
if (strcmp(attr->value(), "ctrl") == 0) |
||||||
|
foundModifiers |= 1; |
||||||
|
else if (strcmp(attr->value(), "alt") == 0) |
||||||
|
foundModifiers |= 2; |
||||||
|
} |
||||||
|
if (modifiers == foundModifiers) |
||||||
|
{ |
||||||
|
std::string action = clickNode->value(); |
||||||
|
|
||||||
|
char cmd[64]; |
||||||
|
sprintf_s(cmd, sizeof cmd, "%s %d", action.c_str(), targid); |
||||||
|
m_AshitaCore->GetChatManager()->QueueCommand(cmd, (int32_t)Ashita::CommandInputType::Menu); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
//no config for this job, default left click: target
|
||||||
|
if (type == 0 && !(GetKeyState(VK_CONTROL) & 0x8000) && !(GetKeyState(VK_MENU) & 0x8000)) |
||||||
|
{ |
||||||
|
char cmd[64]; |
||||||
|
sprintf_s(cmd, sizeof cmd, "/target %d", targid); |
||||||
|
m_AshitaCore->GetChatManager()->QueueCommand(cmd, (int32_t)Ashita::CommandInputType::Menu); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,174 @@ |
|||||||
|
#ifndef RAPIDXML_ITERATORS_HPP_INCLUDED |
||||||
|
#define RAPIDXML_ITERATORS_HPP_INCLUDED |
||||||
|
|
||||||
|
// Copyright (C) 2006, 2009 Marcin Kalicinski
|
||||||
|
// Version 1.13
|
||||||
|
// Revision $DateTime: 2009/05/13 01:46:17 $
|
||||||
|
//! \file rapidxml_iterators.hpp This file contains rapidxml iterators
|
||||||
|
|
||||||
|
#include "rapidxml.hpp" |
||||||
|
|
||||||
|
namespace rapidxml |
||||||
|
{ |
||||||
|
|
||||||
|
//! Iterator of child nodes of xml_node
|
||||||
|
template<class Ch> |
||||||
|
class node_iterator |
||||||
|
{ |
||||||
|
|
||||||
|
public: |
||||||
|
|
||||||
|
typedef typename xml_node<Ch> value_type; |
||||||
|
typedef typename xml_node<Ch> &reference; |
||||||
|
typedef typename xml_node<Ch> *pointer; |
||||||
|
typedef std::ptrdiff_t difference_type; |
||||||
|
typedef std::bidirectional_iterator_tag iterator_category; |
||||||
|
|
||||||
|
node_iterator() |
||||||
|
: m_node(0) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
node_iterator(xml_node<Ch> *node) |
||||||
|
: m_node(node->first_node()) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
reference operator *() const |
||||||
|
{ |
||||||
|
assert(m_node); |
||||||
|
return *m_node; |
||||||
|
} |
||||||
|
|
||||||
|
pointer operator->() const |
||||||
|
{ |
||||||
|
assert(m_node); |
||||||
|
return m_node; |
||||||
|
} |
||||||
|
|
||||||
|
node_iterator& operator++() |
||||||
|
{ |
||||||
|
assert(m_node); |
||||||
|
m_node = m_node->next_sibling(); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
node_iterator operator++(int) |
||||||
|
{ |
||||||
|
node_iterator tmp = *this; |
||||||
|
++this; |
||||||
|
return tmp; |
||||||
|
} |
||||||
|
|
||||||
|
node_iterator& operator--() |
||||||
|
{ |
||||||
|
assert(m_node && m_node->previous_sibling()); |
||||||
|
m_node = m_node->previous_sibling(); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
node_iterator operator--(int) |
||||||
|
{ |
||||||
|
node_iterator tmp = *this; |
||||||
|
++this; |
||||||
|
return tmp; |
||||||
|
} |
||||||
|
|
||||||
|
bool operator ==(const node_iterator<Ch> &rhs) |
||||||
|
{ |
||||||
|
return m_node == rhs.m_node; |
||||||
|
} |
||||||
|
|
||||||
|
bool operator !=(const node_iterator<Ch> &rhs) |
||||||
|
{ |
||||||
|
return m_node != rhs.m_node; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
|
||||||
|
xml_node<Ch> *m_node; |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
//! Iterator of child attributes of xml_node
|
||||||
|
template<class Ch> |
||||||
|
class attribute_iterator |
||||||
|
{ |
||||||
|
|
||||||
|
public: |
||||||
|
|
||||||
|
typedef typename xml_attribute<Ch> value_type; |
||||||
|
typedef typename xml_attribute<Ch> &reference; |
||||||
|
typedef typename xml_attribute<Ch> *pointer; |
||||||
|
typedef std::ptrdiff_t difference_type; |
||||||
|
typedef std::bidirectional_iterator_tag iterator_category; |
||||||
|
|
||||||
|
attribute_iterator() |
||||||
|
: m_attribute(0) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
attribute_iterator(xml_node<Ch> *node) |
||||||
|
: m_attribute(node->first_attribute()) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
reference operator *() const |
||||||
|
{ |
||||||
|
assert(m_attribute); |
||||||
|
return *m_attribute; |
||||||
|
} |
||||||
|
|
||||||
|
pointer operator->() const |
||||||
|
{ |
||||||
|
assert(m_attribute); |
||||||
|
return m_attribute; |
||||||
|
} |
||||||
|
|
||||||
|
attribute_iterator& operator++() |
||||||
|
{ |
||||||
|
assert(m_attribute); |
||||||
|
m_attribute = m_attribute->next_attribute(); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
attribute_iterator operator++(int) |
||||||
|
{ |
||||||
|
attribute_iterator tmp = *this; |
||||||
|
++this; |
||||||
|
return tmp; |
||||||
|
} |
||||||
|
|
||||||
|
attribute_iterator& operator--() |
||||||
|
{ |
||||||
|
assert(m_attribute && m_attribute->previous_attribute()); |
||||||
|
m_attribute = m_attribute->previous_attribute(); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
attribute_iterator operator--(int) |
||||||
|
{ |
||||||
|
attribute_iterator tmp = *this; |
||||||
|
++this; |
||||||
|
return tmp; |
||||||
|
} |
||||||
|
|
||||||
|
bool operator ==(const attribute_iterator<Ch> &rhs) |
||||||
|
{ |
||||||
|
return m_attribute == rhs.m_attribute; |
||||||
|
} |
||||||
|
|
||||||
|
bool operator !=(const attribute_iterator<Ch> &rhs) |
||||||
|
{ |
||||||
|
return m_attribute != rhs.m_attribute; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
|
||||||
|
xml_attribute<Ch> *m_attribute; |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,421 @@ |
|||||||
|
#ifndef RAPIDXML_PRINT_HPP_INCLUDED |
||||||
|
#define RAPIDXML_PRINT_HPP_INCLUDED |
||||||
|
|
||||||
|
// Copyright (C) 2006, 2009 Marcin Kalicinski
|
||||||
|
// Version 1.13
|
||||||
|
// Revision $DateTime: 2009/05/13 01:46:17 $
|
||||||
|
//! \file rapidxml_print.hpp This file contains rapidxml printer implementation
|
||||||
|
|
||||||
|
#include "rapidxml.hpp" |
||||||
|
|
||||||
|
// Only include streams if not disabled
|
||||||
|
#ifndef RAPIDXML_NO_STREAMS |
||||||
|
#include <ostream> |
||||||
|
#include <iterator> |
||||||
|
#endif |
||||||
|
|
||||||
|
namespace rapidxml |
||||||
|
{ |
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
// Printing flags
|
||||||
|
|
||||||
|
const int print_no_indenting = 0x1; //!< Printer flag instructing the printer to suppress indenting of XML. See print() function.
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal
|
||||||
|
|
||||||
|
//! \cond internal
|
||||||
|
namespace internal |
||||||
|
{ |
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal character operations
|
||||||
|
|
||||||
|
// Copy characters from given range to given output iterator
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out) |
||||||
|
{ |
||||||
|
while (begin != end) |
||||||
|
*out++ = *begin++; |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Copy characters from given range to given output iterator and expand
|
||||||
|
// characters into references (< > ' " &)
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out) |
||||||
|
{ |
||||||
|
while (begin != end) |
||||||
|
{ |
||||||
|
if (*begin == noexpand) |
||||||
|
{ |
||||||
|
*out++ = *begin; // No expansion, copy character
|
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
switch (*begin) |
||||||
|
{ |
||||||
|
case Ch('<'): |
||||||
|
*out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';'); |
||||||
|
break; |
||||||
|
case Ch('>'): |
||||||
|
*out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';'); |
||||||
|
break; |
||||||
|
case Ch('\''): |
||||||
|
*out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';'); |
||||||
|
break; |
||||||
|
case Ch('"'): |
||||||
|
*out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';'); |
||||||
|
break; |
||||||
|
case Ch('&'): |
||||||
|
*out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';'); |
||||||
|
break; |
||||||
|
default: |
||||||
|
*out++ = *begin; // No expansion, copy character
|
||||||
|
} |
||||||
|
} |
||||||
|
++begin; // Step to next character
|
||||||
|
} |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Fill given output iterator with repetitions of the same character
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt fill_chars(OutIt out, int n, Ch ch) |
||||||
|
{ |
||||||
|
for (int i = 0; i < n; ++i) |
||||||
|
*out++ = ch; |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Find character
|
||||||
|
template<class Ch, Ch ch> |
||||||
|
inline bool find_char(const Ch *begin, const Ch *end) |
||||||
|
{ |
||||||
|
while (begin != end) |
||||||
|
if (*begin++ == ch) |
||||||
|
return true; |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// Internal printing operations
|
||||||
|
|
||||||
|
// Print node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
// Print proper node type
|
||||||
|
switch (node->type()) |
||||||
|
{ |
||||||
|
|
||||||
|
// Document
|
||||||
|
case node_document: |
||||||
|
out = print_children(out, node, flags, indent); |
||||||
|
break; |
||||||
|
|
||||||
|
// Element
|
||||||
|
case node_element: |
||||||
|
out = print_element_node(out, node, flags, indent); |
||||||
|
break; |
||||||
|
|
||||||
|
// Data
|
||||||
|
case node_data: |
||||||
|
out = print_data_node(out, node, flags, indent); |
||||||
|
break; |
||||||
|
|
||||||
|
// CDATA
|
||||||
|
case node_cdata: |
||||||
|
out = print_cdata_node(out, node, flags, indent); |
||||||
|
break; |
||||||
|
|
||||||
|
// Declaration
|
||||||
|
case node_declaration: |
||||||
|
out = print_declaration_node(out, node, flags, indent); |
||||||
|
break; |
||||||
|
|
||||||
|
// Comment
|
||||||
|
case node_comment: |
||||||
|
out = print_comment_node(out, node, flags, indent); |
||||||
|
break; |
||||||
|
|
||||||
|
// Doctype
|
||||||
|
case node_doctype: |
||||||
|
out = print_doctype_node(out, node, flags, indent); |
||||||
|
break; |
||||||
|
|
||||||
|
// Pi
|
||||||
|
case node_pi: |
||||||
|
out = print_pi_node(out, node, flags, indent); |
||||||
|
break; |
||||||
|
|
||||||
|
// Unknown
|
||||||
|
default: |
||||||
|
assert(0); |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
// If indenting not disabled, add line break after node
|
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
*out = Ch('\n'), ++out; |
||||||
|
|
||||||
|
// Return modified iterator
|
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print children of the node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
for (xml_node<Ch> *child = node->first_node(); child; child = child->next_sibling()) |
||||||
|
out = print_node(out, child, flags, indent); |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print attributes of the node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int flags) |
||||||
|
{ |
||||||
|
for (xml_attribute<Ch> *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute()) |
||||||
|
{ |
||||||
|
if (attribute->name() && attribute->value()) |
||||||
|
{ |
||||||
|
// Print attribute name
|
||||||
|
*out = Ch(' '), ++out; |
||||||
|
out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out); |
||||||
|
*out = Ch('='), ++out; |
||||||
|
// Print attribute value using appropriate quote type
|
||||||
|
if (find_char<Ch, Ch('"')>(attribute->value(), attribute->value() + attribute->value_size())) |
||||||
|
{ |
||||||
|
*out = Ch('\''), ++out; |
||||||
|
out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('"'), out); |
||||||
|
*out = Ch('\''), ++out; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
*out = Ch('"'), ++out; |
||||||
|
out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\''), out); |
||||||
|
*out = Ch('"'), ++out; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print data node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_data_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
assert(node->type() == node_data); |
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
out = fill_chars(out, indent, Ch('\t')); |
||||||
|
out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print data node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_cdata_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
assert(node->type() == node_cdata); |
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
out = fill_chars(out, indent, Ch('\t')); |
||||||
|
*out = Ch('<'); ++out; |
||||||
|
*out = Ch('!'); ++out; |
||||||
|
*out = Ch('['); ++out; |
||||||
|
*out = Ch('C'); ++out; |
||||||
|
*out = Ch('D'); ++out; |
||||||
|
*out = Ch('A'); ++out; |
||||||
|
*out = Ch('T'); ++out; |
||||||
|
*out = Ch('A'); ++out; |
||||||
|
*out = Ch('['); ++out; |
||||||
|
out = copy_chars(node->value(), node->value() + node->value_size(), out); |
||||||
|
*out = Ch(']'); ++out; |
||||||
|
*out = Ch(']'); ++out; |
||||||
|
*out = Ch('>'); ++out; |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print element node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_element_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
assert(node->type() == node_element); |
||||||
|
|
||||||
|
// Print element name and attributes, if any
|
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
out = fill_chars(out, indent, Ch('\t')); |
||||||
|
*out = Ch('<'), ++out; |
||||||
|
out = copy_chars(node->name(), node->name() + node->name_size(), out); |
||||||
|
out = print_attributes(out, node, flags); |
||||||
|
|
||||||
|
// If node is childless
|
||||||
|
if (node->value_size() == 0 && !node->first_node()) |
||||||
|
{ |
||||||
|
// Print childless node tag ending
|
||||||
|
*out = Ch('/'), ++out; |
||||||
|
*out = Ch('>'), ++out; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
// Print normal node tag ending
|
||||||
|
*out = Ch('>'), ++out; |
||||||
|
|
||||||
|
// Test if node contains a single data node only (and no other nodes)
|
||||||
|
xml_node<Ch> *child = node->first_node(); |
||||||
|
if (!child) |
||||||
|
{ |
||||||
|
// If node has no children, only print its value without indenting
|
||||||
|
out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); |
||||||
|
} |
||||||
|
else if (child->next_sibling() == 0 && child->type() == node_data) |
||||||
|
{ |
||||||
|
// If node has a sole data child, only print its value without indenting
|
||||||
|
out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
// Print all children with full indenting
|
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
*out = Ch('\n'), ++out; |
||||||
|
out = print_children(out, node, flags, indent + 1); |
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
out = fill_chars(out, indent, Ch('\t')); |
||||||
|
} |
||||||
|
|
||||||
|
// Print node end
|
||||||
|
*out = Ch('<'), ++out; |
||||||
|
*out = Ch('/'), ++out; |
||||||
|
out = copy_chars(node->name(), node->name() + node->name_size(), out); |
||||||
|
*out = Ch('>'), ++out; |
||||||
|
} |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print declaration node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_declaration_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
// Print declaration start
|
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
out = fill_chars(out, indent, Ch('\t')); |
||||||
|
*out = Ch('<'), ++out; |
||||||
|
*out = Ch('?'), ++out; |
||||||
|
*out = Ch('x'), ++out; |
||||||
|
*out = Ch('m'), ++out; |
||||||
|
*out = Ch('l'), ++out; |
||||||
|
|
||||||
|
// Print attributes
|
||||||
|
out = print_attributes(out, node, flags); |
||||||
|
|
||||||
|
// Print declaration end
|
||||||
|
*out = Ch('?'), ++out; |
||||||
|
*out = Ch('>'), ++out; |
||||||
|
|
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print comment node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_comment_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
assert(node->type() == node_comment); |
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
out = fill_chars(out, indent, Ch('\t')); |
||||||
|
*out = Ch('<'), ++out; |
||||||
|
*out = Ch('!'), ++out; |
||||||
|
*out = Ch('-'), ++out; |
||||||
|
*out = Ch('-'), ++out; |
||||||
|
out = copy_chars(node->value(), node->value() + node->value_size(), out); |
||||||
|
*out = Ch('-'), ++out; |
||||||
|
*out = Ch('-'), ++out; |
||||||
|
*out = Ch('>'), ++out; |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print doctype node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_doctype_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
assert(node->type() == node_doctype); |
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
out = fill_chars(out, indent, Ch('\t')); |
||||||
|
*out = Ch('<'), ++out; |
||||||
|
*out = Ch('!'), ++out; |
||||||
|
*out = Ch('D'), ++out; |
||||||
|
*out = Ch('O'), ++out; |
||||||
|
*out = Ch('C'), ++out; |
||||||
|
*out = Ch('T'), ++out; |
||||||
|
*out = Ch('Y'), ++out; |
||||||
|
*out = Ch('P'), ++out; |
||||||
|
*out = Ch('E'), ++out; |
||||||
|
*out = Ch(' '), ++out; |
||||||
|
out = copy_chars(node->value(), node->value() + node->value_size(), out); |
||||||
|
*out = Ch('>'), ++out; |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
// Print pi node
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print_pi_node(OutIt out, const xml_node<Ch> *node, int flags, int indent) |
||||||
|
{ |
||||||
|
assert(node->type() == node_pi); |
||||||
|
if (!(flags & print_no_indenting)) |
||||||
|
out = fill_chars(out, indent, Ch('\t')); |
||||||
|
*out = Ch('<'), ++out; |
||||||
|
*out = Ch('?'), ++out; |
||||||
|
out = copy_chars(node->name(), node->name() + node->name_size(), out); |
||||||
|
*out = Ch(' '), ++out; |
||||||
|
out = copy_chars(node->value(), node->value() + node->value_size(), out); |
||||||
|
*out = Ch('?'), ++out; |
||||||
|
*out = Ch('>'), ++out; |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
//! \endcond
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// Printing
|
||||||
|
|
||||||
|
//! Prints XML to given output iterator.
|
||||||
|
//! \param out Output iterator to print to.
|
||||||
|
//! \param node Node to be printed. Pass xml_document to print entire document.
|
||||||
|
//! \param flags Flags controlling how XML is printed.
|
||||||
|
//! \return Output iterator pointing to position immediately after last character of printed text.
|
||||||
|
template<class OutIt, class Ch> |
||||||
|
inline OutIt print(OutIt out, const xml_node<Ch> &node, int flags = 0) |
||||||
|
{ |
||||||
|
return internal::print_node(out, &node, flags, 0); |
||||||
|
} |
||||||
|
|
||||||
|
#ifndef RAPIDXML_NO_STREAMS |
||||||
|
|
||||||
|
//! Prints XML to given output stream.
|
||||||
|
//! \param out Output stream to print to.
|
||||||
|
//! \param node Node to be printed. Pass xml_document to print entire document.
|
||||||
|
//! \param flags Flags controlling how XML is printed.
|
||||||
|
//! \return Output stream.
|
||||||
|
template<class Ch> |
||||||
|
inline std::basic_ostream<Ch> &print(std::basic_ostream<Ch> &out, const xml_node<Ch> &node, int flags = 0) |
||||||
|
{ |
||||||
|
print(std::ostream_iterator<Ch>(out), node, flags); |
||||||
|
return out; |
||||||
|
} |
||||||
|
|
||||||
|
//! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process.
|
||||||
|
//! \param out Output stream to print to.
|
||||||
|
//! \param node Node to be printed.
|
||||||
|
//! \return Output stream.
|
||||||
|
template<class Ch> |
||||||
|
inline std::basic_ostream<Ch> &operator <<(std::basic_ostream<Ch> &out, const xml_node<Ch> &node) |
||||||
|
{ |
||||||
|
return print(out, node); |
||||||
|
} |
||||||
|
|
||||||
|
#endif |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,122 @@ |
|||||||
|
#ifndef RAPIDXML_UTILS_HPP_INCLUDED |
||||||
|
#define RAPIDXML_UTILS_HPP_INCLUDED |
||||||
|
|
||||||
|
// Copyright (C) 2006, 2009 Marcin Kalicinski
|
||||||
|
// Version 1.13
|
||||||
|
// Revision $DateTime: 2009/05/13 01:46:17 $
|
||||||
|
//! \file rapidxml_utils.hpp This file contains high-level rapidxml utilities that can be useful
|
||||||
|
//! in certain simple scenarios. They should probably not be used if maximizing performance is the main objective.
|
||||||
|
|
||||||
|
#include "rapidxml.hpp" |
||||||
|
#include <vector> |
||||||
|
#include <string> |
||||||
|
#include <fstream> |
||||||
|
#include <stdexcept> |
||||||
|
|
||||||
|
namespace rapidxml |
||||||
|
{ |
||||||
|
|
||||||
|
//! Represents data loaded from a file
|
||||||
|
template<class Ch = char> |
||||||
|
class file |
||||||
|
{ |
||||||
|
|
||||||
|
public: |
||||||
|
|
||||||
|
//! Loads file into the memory. Data will be automatically destroyed by the destructor.
|
||||||
|
//! \param filename Filename to load.
|
||||||
|
file(const char *filename) |
||||||
|
{ |
||||||
|
using namespace std; |
||||||
|
|
||||||
|
// Open stream
|
||||||
|
basic_ifstream<Ch> stream(filename, ios::binary); |
||||||
|
if (!stream) |
||||||
|
throw runtime_error(string("cannot open file ") + filename); |
||||||
|
stream.unsetf(ios::skipws); |
||||||
|
|
||||||
|
// Determine stream size
|
||||||
|
stream.seekg(0, ios::end); |
||||||
|
size_t size = stream.tellg(); |
||||||
|
stream.seekg(0); |
||||||
|
|
||||||
|
// Load data and add terminating 0
|
||||||
|
m_data.resize(size + 1); |
||||||
|
stream.read(&m_data.front(), static_cast<streamsize>(size)); |
||||||
|
m_data[size] = 0; |
||||||
|
} |
||||||
|
|
||||||
|
//! Loads file into the memory. Data will be automatically destroyed by the destructor
|
||||||
|
//! \param stream Stream to load from
|
||||||
|
file(std::basic_istream<Ch> &stream) |
||||||
|
{ |
||||||
|
using namespace std; |
||||||
|
|
||||||
|
// Load data and add terminating 0
|
||||||
|
stream.unsetf(ios::skipws); |
||||||
|
m_data.assign(istreambuf_iterator<Ch>(stream), istreambuf_iterator<Ch>()); |
||||||
|
if (stream.fail() || stream.bad()) |
||||||
|
throw runtime_error("error reading stream"); |
||||||
|
m_data.push_back(0); |
||||||
|
} |
||||||
|
|
||||||
|
//! Gets file data.
|
||||||
|
//! \return Pointer to data of file.
|
||||||
|
Ch *data() |
||||||
|
{ |
||||||
|
return &m_data.front(); |
||||||
|
} |
||||||
|
|
||||||
|
//! Gets file data.
|
||||||
|
//! \return Pointer to data of file.
|
||||||
|
const Ch *data() const |
||||||
|
{ |
||||||
|
return &m_data.front(); |
||||||
|
} |
||||||
|
|
||||||
|
//! Gets file data size.
|
||||||
|
//! \return Size of file data, in characters.
|
||||||
|
std::size_t size() const |
||||||
|
{ |
||||||
|
return m_data.size(); |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
|
||||||
|
std::vector<Ch> m_data; // File data
|
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
//! Counts children of node. Time complexity is O(n).
|
||||||
|
//! \return Number of children of node
|
||||||
|
template<class Ch> |
||||||
|
inline std::size_t count_children(xml_node<Ch> *node) |
||||||
|
{ |
||||||
|
xml_node<Ch> *child = node->first_node(); |
||||||
|
std::size_t count = 0; |
||||||
|
while (child) |
||||||
|
{ |
||||||
|
++count; |
||||||
|
child = child->next_sibling(); |
||||||
|
} |
||||||
|
return count; |
||||||
|
} |
||||||
|
|
||||||
|
//! Counts attributes of node. Time complexity is O(n).
|
||||||
|
//! \return Number of attributes of node
|
||||||
|
template<class Ch> |
||||||
|
inline std::size_t count_attributes(xml_node<Ch> *node) |
||||||
|
{ |
||||||
|
xml_attribute<Ch> *attr = node->first_attribute(); |
||||||
|
std::size_t count = 0; |
||||||
|
while (attr) |
||||||
|
{ |
||||||
|
++count; |
||||||
|
attr = attr->next_attribute(); |
||||||
|
} |
||||||
|
return count; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue