From a2795725f5afc756a405a85c192bdd53b967999d Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Fri, 29 Jun 2012 06:56:07 +0000 Subject: Added my Miranda API pascal version Changed ShlExt to my API compilation (32 bit FPC now only) git-svn-id: http://svn.miranda-ng.org/main/trunk@679 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Pascal_Headers/m_xml.inc | 220 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 plugins/Pascal_Headers/m_xml.inc (limited to 'plugins/Pascal_Headers/m_xml.inc') diff --git a/plugins/Pascal_Headers/m_xml.inc b/plugins/Pascal_Headers/m_xml.inc new file mode 100644 index 0000000000..a085193eaf --- /dev/null +++ b/plugins/Pascal_Headers/m_xml.inc @@ -0,0 +1,220 @@ +{ +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2008 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program 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 2 +of the License, or (at your option) any later version. + +This program 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 this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} + +{$IFNDEF M_XML} +{$DEFINE M_XML} + +type + HXML = THANDLE; + +type + XML_ELEMENT_POS = int; // XML_ELEMENT_POS is not interchangeable with simple indexes + +type + XML_ELEMENT_TYPE = ( + XML_ELEM_TYPE_CHILD,XML_ELEM_TYPE_ATTRIBUTE, + XML_ELEM_TYPE_TEXT ,XML_ELEM_TYPE_CLEAR); + +const + XML_API_SIZEOF_V1 = SizeOf(size_t)+26*sizeof(dword); + +type + XML_API_A = record + cbSize :size_t; + + createNode :function(const name, text:PAnsiChar; IsDeclaration:boolean):HXML;cdecl; + destroyNode :procedure(node:HXML);cdecl; + + parseString :function(const str:PAnsiChar; datalen:pint; const tag:PAnsiChar):HXML;cdecl; + toString :function(node:HXML;datalen:pint):PAnsiChar;cdecl; + + addChild :function(parent:HXML; const name,text:PAnsiChar):HXML;cdecl; + addChild2 :procedure(child,parent:HXML);cdecl; + copyNode :function(parent:HXML):HXML;cdecl; + getChild :function(parent:HXML;number:int):HXML;cdecl; + getChildCount :function(h:HXML):int;cdecl; + getChildByAttrValue:function(parent:HXML; const name,attrName,attrValue:PAnsiChar):HXML;cdecl; + getFirstChild :function(parent:HXML):HXML;cdecl; + getNthChild :function(parent:HXML; const name:PAnsiChar; i:int):HXML;cdecl; + getNextChild :function(parent:HXML; const name:PAnsiChar; i:pint):HXML;cdecl; + getChildByPath :function(parent:HXML; const path:PAnsiChar;createNodeIfMissing:boolean):HXML;cdecl; + getNextNode :function(node:HXML):HXML;cdecl; + getName :function(h:HXML):PAnsiChar;cdecl; + getParent :function(h:HXML):HXML;cdecl; + getText :function(h:HXML):PAnsiChar;cdecl; // = getTextByIndex(HXML, 0) + setText :procedure(h:HXML;value:PAnsiChar);cdecl; // = setTextByIndex(HXML, LPCTSTR, 0) + + getAttr :function(h:HXML;i:int):PAnsiChar;cdecl; + getAttrName :function(h:HXML;i:int):PAnsiChar;cdecl; + getAttrValue :function(h:HXML;const attrName:PAnsiChar):PAnsiChar;cdecl; + getAttrCount :function(h:HXML):int;cdecl; + addAttr :procedure(h:HXML;const attrName,attrValue:PAnsiChar);cdecl; + addAttrInt :procedure(h:HXML; const attrName:PAnsiChar;attrValue:int);cdecl; + + freeMem :procedure(arg:pointer);cdecl; + + // #if MIRANDA_VER >= 0x0900, methods added in XML API v2 + isDeclaration :function(node:HXML):boolean;cdecl; + toStringWithFormatting:function(node:HXML; var datalen:int):PAnsiChar;cdecl; + deepCopy :function(node:HXML):HXML;cdecl; + setAttrByIndex :procedure(node:HXML; i:int; value:PAnsiChar);cdecl; + setAttrByName :procedure(node:HXML; name:PAnsiChar; value:PAnsiChar);cdecl; + addChildEx :function(parent:HXML; name:PAnsiChar; isDeclaration:boolean; + n:XML_ELEMENT_POS):HXML;cdecl; + addChildEx2 :procedure(child:HXML; parent:HXML; n:XML_ELEMENT_POS);cdecl; + getTextCount :function(node:HXML):int;cdecl; + getTextByIndex :function(node:HXML; i:int):PAnsiChar;cdecl; + addText :procedure(node:HXML; txt:PAnsiChar; n:XML_ELEMENT_POS);cdecl; + setTextByIndex :procedure(node:HXML; i:int; txt:PAnsiChar);cdecl; + getClearCount :function(node:HXML):int;cdecl; + getClear :function(node:HXML; i:int; var openTag:PAnsiChar; + var closeTag:PAnsiChar):PAnsiChar;cdecl; + addClear :procedure(node:HXML; lpszValue:PAnsiChar; openTag:PAnsiChar; + closeTag:PAnsiChar; n:XML_ELEMENT_POS);cdecl; + setClear :procedure(node:HXML; i:int; lpszValue:PAnsiChar);cdecl; + getElementCount :function(node:HXML):int;cdecl; + getElement :function(node:HXML; n:XML_ELEMENT_POS; var _type:XML_ELEMENT_TYPE; + var child:HXML;var value:PAnsiChar; var name:PAnsiChar; + var openTag:PAnsiChar; var closeTag:PAnsiChar):int;cdecl; + // With getElement() it's possible to enumerate all the different contents + // (attribute,child,text, clear) of the current node. The order is reflecting the order + // of the original file/string. NOTE: 0 <= i < getElementCount(). + // type, child, value, name, openTag, closeTag will be filled on return, depending on type: + // for XML_ELEM_TYPE_CHILD , child is valid; + // for XML_ELEM_TYPE_ATTRIBUTE, name and value are valid; + // for XML_ELEM_TYPE_TEXT , value is valid; + // for XML_ELEM_TYPE_CLEAR , value, openTag and closeTag are valid. + + deleteNodeContent:procedure(node:HXML);cdecl; // forces the deletion of the content of this node and the subtree + deleteAttrByIndex:procedure(node:HXML; i:int);cdecl; + deleteAttrByName :procedure(node:HXML; name:PAnsiChar);cdecl; + deleteText :procedure(node:HXML; i:int);cdecl; + deleteClear :procedure(node:HXML; i:int);cdecl; + + positionOfChildByIndex:function(node:HXML; i:int):XML_ELEMENT_POS;cdecl; + positionOfChildByNode :function(node:HXML; node1:HXML):XML_ELEMENT_POS;cdecl; + positionOfChildByName :function(node:HXML; name:PAnsiChar; i:int):XML_ELEMENT_POS;cdecl; + positionOfText :function(node:HXML; i:int):XML_ELEMENT_POS;cdecl; + positionOfClear :function(node:HXML; i:int):XML_ELEMENT_POS;cdecl; + end; + + XML_API_W = record + cbSize :size_t; + + createNode :function(const name, text:PWideChar; IsDeclaration:boolean):HXML;cdecl; + destroyNode :procedure(node:HXML);cdecl; + + parseString :function(const str:PWideChar; datalen:pint; const tag:PWideChar):HXML;cdecl; + toString :function(node:HXML;datalen:pint):PWideChar;cdecl; + + addChild :function(parent:HXML; const name,text:PWideChar):HXML;cdecl; + addChild2 :procedure(child,parent:HXML);cdecl; + copyNode :function(parent:HXML):HXML;cdecl; + getChild :function(parent:HXML;number:int):HXML;cdecl; + getChildCount :function(h:HXML):int;cdecl; + getChildByAttrValue:function(parent:HXML; const name,attrName,attrValue:PWideChar):HXML;cdecl; + getFirstChild :function(parent:HXML):HXML;cdecl; + getNthChild :function(parent:HXML; const name:PWideChar; i:int):HXML;cdecl; + getNextChild :function(parent:HXML; const name:PWideChar; i:pint):HXML;cdecl; + getChildByPath :function(parent:HXML; const path:PWideChar;createNodeIfMissing:boolean):HXML;cdecl; + getNextNode :function(node:HXML):HXML;cdecl; + getName :function(h:HXML):PWideChar;cdecl; + getParent :function(h:HXML):HXML;cdecl; + getText :function(h:HXML):PWideChar;cdecl; // = getTextByIndex(HXML, 0) + setText :procedure(h:HXML;value:PWideChar);cdecl; // = setTextByIndex(HXML, LPCTSTR, 0) + + getAttr :function(h:HXML;i:int):PWideChar;cdecl; + getAttrName :function(h:HXML;i:int):PWideChar;cdecl; + getAttrValue :function(h:HXML;const attrName:PWideChar):PWideChar;cdecl; + getAttrCount :function(h:HXML):int;cdecl; + addAttr :procedure(h:HXML;const attrName,attrValue:PWideChar);cdecl; + addAttrInt :procedure(h:HXML; const attrName:PWideChar;attrValue:int);cdecl; + + freeMem :procedure(arg:pointer);cdecl; + + // #if MIRANDA_VER >= 0x0900, methods added in XML API v2 + isDeclaration :function(node:HXML):boolean;cdecl; + toStringWithFormatting:function(node:HXML; var datalen:int):PWideChar;cdecl; + deepCopy :function(node:HXML):HXML;cdecl; + setAttrByIndex :procedure(node:HXML; i:int; value:PWideChar);cdecl; + setAttrByName :procedure(node:HXML; name:PWideChar; value:PWideChar);cdecl; + addChildEx :function(parent:HXML; name:PWideChar; isDeclaration:boolean; + n:XML_ELEMENT_POS):HXML;cdecl; + addChildEx2 :procedure(child:HXML; parent:HXML; n:XML_ELEMENT_POS);cdecl; + getTextCount :function(node:HXML):int;cdecl; + getTextByIndex :function(node:HXML; i:int):PWideChar;cdecl; + addText :procedure(node:HXML; txt:PWideChar; n:XML_ELEMENT_POS);cdecl; + setTextByIndex :procedure(node:HXML; i:int; txt:PWideChar);cdecl; + getClearCount :function(node:HXML):int;cdecl; + getClear :function(node:HXML; i:int; var openTag:PWideChar; + var closeTag:PWideChar):PWideChar;cdecl; + addClear :procedure(node:HXML; lpszValue:PWideChar; openTag:PWideChar; + closeTag:PWideChar; n:XML_ELEMENT_POS);cdecl; + setClear :procedure(node:HXML; i:int; lpszValue:PWideChar);cdecl; + getElementCount :function(node:HXML):int;cdecl; + getElement :function(node:HXML; n:XML_ELEMENT_POS; var _type:XML_ELEMENT_TYPE; + var child:HXML;var value:PWideChar; var name:PWideChar; + var openTag:PWideChar; var closeTag:PWideChar):int;cdecl; + // With getElement() it's possible to enumerate all the different contents + // (attribute,child,text, clear) of the current node. The order is reflecting the order + // of the original file/string. NOTE: 0 <= i < getElementCount(). + // type, child, value, name, openTag, closeTag will be filled on return, depending on type: + // for XML_ELEM_TYPE_CHILD , child is valid; + // for XML_ELEM_TYPE_ATTRIBUTE, name and value are valid; + // for XML_ELEM_TYPE_TEXT , value is valid; + // for XML_ELEM_TYPE_CLEAR , value, openTag and closeTag are valid. + + deleteNodeContent:procedure(node:HXML);cdecl; // forces the deletion of the content of this node and the subtree + deleteAttrByIndex:procedure(node:HXML; i:int);cdecl; + deleteAttrByName :procedure(node:HXML; name:PWideChar);cdecl; + deleteText :procedure(node:HXML; i:int);cdecl; + deleteClear :procedure(node:HXML; i:int);cdecl; + + positionOfChildByIndex:function(node:HXML; i:int):XML_ELEMENT_POS;cdecl; + positionOfChildByNode :function(node:HXML; node1:HXML):XML_ELEMENT_POS;cdecl; + positionOfChildByName :function(node:HXML; name:PWideChar; i:int):XML_ELEMENT_POS;cdecl; + positionOfText :function(node:HXML; i:int):XML_ELEMENT_POS;cdecl; + positionOfClear :function(node:HXML; i:int):XML_ELEMENT_POS;cdecl; + end; + +// every protocol should declare this variable to use the XML API +//const +// extern XML_API xi; + +const +{ +a service to obtain the XML API + +wParam = 0; +lParam = (LPARAM)(XML_API*). + +returns TRUE if all is Ok, and FALSE otherwise +} + MS_SYSTEM_GET_XI:PAnsiChar = 'Miranda/System/GetXmlApi'; +(* +__forceinline int mir_getXI( XML_API* dest ) +{ + dest->cbSize = sizeof(*dest); + return CallService( MS_SYSTEM_GET_XI, 0, (LPARAM)dest ); +} +*) +{$ENDIF} -- cgit v1.2.3