CXML structure

From PS4 Developer wiki
Revision as of 23:47, 22 June 2017 by Cfwprophet (talk | contribs) (→‎XML implicit structure Overview)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

XML implicit structure Overview

 namespace cxml {
     class cxml : public Base {
         struct Header { /*header of a cxml document*/
             char magic[4];
             int version;
             int tree_offset;
             int tree_size;
             int idstrtable_offset;
             int idstrtable_size;
             int idinttable_offset;
             int idinttable_size;
             int stringtable_offset;
             int stringtable_size;
             int chartable_offset;
             int chartable_size;
             int styleidtable_offset;
             int styleidtable_size;
             int intarraytable_offset;
             int intarraytable_size;
             int floatarraytable_offset;
             int floatarraytable_size;
             int filetable_offset;
             int filetable_size;
         };
        
         struct ChildElementBin {
             int name;
             int attr_num;
             int parent_node;
             int prev_sibling;
             int next_sibling;
             int first_child;
             int last_child;
             AttributeBin attribute;
         };
        
         struct SiblingElementBin {
             int name;
             int attr_num;
             int parent_node;
             int prev_sibling;
             int next_sibling;
             AttributeBin attribute;
         };
        
         struct AttributeBin {
             typedef enum {
                 NONE,
                 INTEGER,
                 FLOAT,
                 STRING,
                 CHAR,
                 STYLE_ID,
                 INTEGER_ARRAY,
                 FLOAT_ARRAY,
                 DATA,
                 ID_STR_LPB,
                 ID_STR,
                 ID_INT_LPB,
                 ID_INT,
             } TYPE;
 
             int name;
             TYPE type;
 
             struct SingleValue {
                 int intValue;
                 float floatValue;       
             };
 
             struct StringData {
                 int offset;
                 int len;
             };
 
             struct CharData {
                 int offset;
                 int len;
             };
                
             struct IntArrayData {
                 int offset;
                 int num;
             };
                
             struct FloatArrayData {
                 int offset;
                 int num;
             };
               
             struct FileData {
                 int offset;
                 int size;
             };
 
             struct IdStringTableData {
                 int offset;
                 bool loopback;
             };
 
             struct IdIntegerTableData {
                 int offset;
                 bool loopback;
             };
                
             union {
                 int i;
                 float f;
                 StringData s;
                 CharData c;
                 IntArrayData ia;
                 FloatArrayData fa;
                 FileData file;
                 int id;
                 int idref;
             };
         };
        
         struct IDBin {
             int entity_offset;
             char id[0];
         };
        
         enum AllocationType {
             AllocationType_Alloc_Tree,
             AllocationType_Alloc_IDSTRTable,
             AllocationType_Alloc_IDINTTable,
             AllocationType_Alloc_StringTable,
             AllocationType_Alloc_CharTable,
             AllocationType_Alloc_IntArrayTable,
             AllocationType_Alloc_FloatArrayTable,
             AllocationType_Alloc_FileTable,
             AllocationType_Alloc_StyleIDTable,
  
             AllocationType_Free_Tree,
             AllocationType_Free_IDSTRTable,
             AllocationType_Free_IDINTTable,
             AllocationType_Free_StringTable,
             AllocationType_Free_CharTable,
             AllocationType_Free_IntArrayTable,
             AllocationType_Free_FloatArrayTable,
             AllocationType_Free_FileTable,
             AllocationType_AFree_StyleIDTable,
         };
       
         enum AccessMode {
             AccessMode_ReadWrite,
             AccessMode_ReadOnly_File,
             AccessMode_ReadOnly_Memory,
         };
        
         class Document {
         public:
             typedef void (*Allocator)( AllocationType type, void * userdata, void * old_addr, unsigned int required_size, void ** addr, unsigned int * size );
        
         private:
             AccessMode access_mode;
             Header header;
             char *tree;
             unsigned int tree_capacity;
             char *idstrtable;
             unsigned int idstrtable_capacity;
             char *idinttable;
             unsigned int idinttable_capacity;
             char *stringtable;
             unsigned int stringtable_capacity;
             char *chartable;
             unsigned int chartable_capacity;
             int *intarraytable;
             unsigned int intarraytable_capacity;
             float *floatarraytable;
             unsigned int floatarraytable_capacity;
             char *filetable;
             unsigned int filetable_capacity;
             char *styleidtable;
             unsigned int styleidtable_capacity;
             Allocator allocator;
             void *allocator_userdata;
         };
        
         class Element {
         private:
             Document *doc;
             int offset;
         };
       
         class Attribute {
         private:
             Document *doc;
             int element_offset;
             int offset;
         };
 
         /// <summary>
         /// Initializes this class. Some times also called Constructore.
         /// </summary>
         void Initialize() {
             // All stuff that need to be set before running any function call...
             // goes into here.
         };
     };
 };

Element

CXML Child Element definition
Offset Length usage
0x00 0x04 Element name relative offset in TAGS Table
0x04 0x04 Number of attributes in TOC
0x08 0x04 Parent relative offset in TOC
0x0C 0x04 Previous Sibling relative offset in TOC
0x10 0x04 Next Sibling relative offset in TOC
0x14 0x04 First child relative offset in TOC
0x18 0x04 Last child relative offset in TOC

Length is 7 x 4 bytes == 28 bytes (0x1C).


CXML Sibling Element definition
Offset Length usage
0x00 0x04 Element name relative offset in TAGS Table
0x04 0x04 Number of attributes in TOC
0x08 0x04 Parent relative offset in TOC
0x0C 0x04 Previous Sibling relative offset in TOC
0x10 0x04 Next Sibling relative offset in TOC

Length is 5 x 4 bytes == 20 bytes (0x14).

NOTE:

  • The Child Element defination describe the Child Element without his Attributes where the Sibling Element describe the Sibling Element also without his Attributes.
  • So the full order to read will be Child Element >>> Attributes, Sibling Element >>> Attributes. The Root (so offset 0x00) of any SonyPlaystation Resource file always start's with a Child element to read.


Attribute

CXML Attribute definitions
Attribute name
(offset 0x0, length 0x4)
Attribute name relative offset in TAGS Table
Attribute type
(offset 0x4, length 0x4)
1
(Single Integer Val)
2
(Single Float Val)
3
(String)
4
(Char)
5
(ID STYLE)
6
(Integer Array)
7
(Float Array)
8
(File)
9
(ID STR wh lpb Ref)
A
(ID STR wo lpb Ref)
B
(ID INT wh lpb Ref)
C
(ID INT wo lpb Ref)
variable 1
(offset 0x8, length 0x4)
Integer value Float value Strings Table offset Char Table offset ID STYLE Table offset Integer Arrays Table offset Float Arrays Table offset Files Table offset ID STR Table offset ID STR Table offset ID INT Table offset ID INT Table offset
variable 2
(offset 0xC, length 0x4)
No use always 0 No use always 0 String length Chars length int to read always 4 Nr. of int's to read Nr. of float's to read File size No use always 0 No use always 0 No use always 0 No use always 0
* w = with || wo = without || lpb = loopback


XML Output

This is the Output, saved as xml, from the notification_settings_plugin.rco

download notification_settings_plugin.xml from FW??

*Note: That xml below isn't perfect right now. Especially the values from <styletable> need to be corrected. I'll change the xml here as soon i finished the CXML Tool and got a nice correct xml written out.
 <?xml version="1.0" encoding="UTF-16"?>
 <resource version="0.1" type="normal">
  <stringtable>
     <local origsize="1040" src="xmls/ja.xml"    compress="on" id="ja"/>
     <local origsize="1248" src="xmls/en-gb.xml" compress="on" id="en-gb"/>
     <local origsize="1248" src="xmls/en.cml"    compress="on" id="en"/>
     <local origsize="1328" src="xmls/fr.xml"    compress="on" id="fr"/>
     <local origsize="1392" src="xmls/es.xml"    compress="on" id="es"/>
     <local origsize="1312" src="xmls/de.xml"    compress="on" id="de"/>
     <local origsize="1280" src="xmls/it.xml"    compress="on" id="it"/>
     <local origsize="1296" src="xmls/nl.xml"    compress="on" id="nl"/>
     <local origsize="1312" src="xmls/pt-br.xml" compress="on" id="pt-br"/>
     <local origsize="1296" src="xmls/pt.xml"    compress="on" id="pt"/>
     <local origsize="1312" src="xmls/ru.xml"    compress="on" id="ru"/>
     <local origsize="1040" src="xmls/ko.xml"    compress="on" id="ko"/>
     <local origsize="992"  src="xmls/zh-t.xml"  compress="on" id="zh-t"/>
     <local origsize="992"  src="xmls/zh-s.xml"  compress="on" id="zh-s"/>
     <local origsize="1264" src="xmls/fi.xml"    compress="on" id="fi"/>
     <local origsize="1232" src="xmls/sv.xml"    compress="on" id="sv"/>
     <local origsize="1232" src="xmls/da.xml"    compress="on" id="da"/>
     <local origsize="1232" src="xmls/no.xml"    compress="on" id="no"/>
     <local origsize="1296" src="xmls/pl.xml"    compress="on" id="pl"/>
     <local origsize="1296" src="xmls/tr.xml"    compress="on" id="tr"/>
  </stringtable>
  <texturetable>
     <texture origsize="5328" src="texture/1DDD0E08.gim"  compress="on" id="1DDD0E08"  type="texture/gim"/>
     <texture origsize="7632" src="texture/2133CEEB.gim"  compress="on" id="2133CEEB"  type="texture/gim"/>
     <texture origsize="7632" src="texture/F7988312.gim" compress="on" id="F7988312" type="texture/gim"/>
     <texture origsize="5328" src="texture/6F57E251.gim" compress="on" id="6F57E251" type="texture/gim"/>
     <texture origsize="7632" src="texture/86645D41.gim" compress="on" id="86645D41" type="texture/gim"/>
     <texture src="texture/29B91F26.gim"  origsize="57648" div_ratio_h="0.49" compress="on" margin_v="1" id="29B91F26"  margin_h="1" type="texture/gim" div_mode="3x1"/>
     <texture src="texture/D0A272A1.gim" origsize="57648" div_ratio_h="0.49" compress="on" margin_v="1" id="D0A272A1" margin_h="1" type="texture/gim" div_mode="3x1"/>
  </texturetable>
  <styletable>
     <style_button id="86009135" bg_obj="1, 0, 0, 0" glow_obj="0, 0, 0, 0">
        <planeobj texture0="261FB929" id="01000000"/>
        <planeobj texture0="A172A2D0" blend="2" id="00000000" />
        <style_text textobj="00000000" id="E98E283C"/>
            <textobj font_size="28" bold="1" color="0.49, 1, 1, 1" max_line_count="1" line_pitch="28" word_wrap="1" ellipsis="1" id="00000000"/>
        </style_text>
     </style_button>
     <style_plane id="D7F12CC7" planeobj="0, 0, 0, 0">
        <planeobj texture0="0DD14518" id="01000000"/>
     </style_plane>
     <pagetable>
        <templatetable>
            <template id="9174183F">
                <file_list style="4B363870" id="04000000"/>
                <layout_hint align="0, 0" size="960, 448" id="00000000" pos="0, 0"/>
            </template>
            <template fast_open="1" id="60FB37AF">
                <list_item style="998F48F3" id="02000000">
                    <layout_hint align="0, 0" size="840, 80" id="00000000" pos="448, 0"/>
                    <text style="E98E283C" id="01000000">
                        <layout_hint size="462, 0" align="1, 0" adjust="0, 0" id="05000000" pos="-272, 0"/>
                        <plane style="2B337B5F" id="02000000">
                            <layout_hint pos="-30, 0" id="05000000" adjust="0, 0" alpha="0" anchor="1, 0" size="60, 60"/>
                        </plane>
                        <check_box style="98F8209F" id="00000000">
                            <layout_hint align="2, 0" size="46, 46" pos="602, 0" anchor="1, 0" id="05000000"/>
                            <focus_hint focus_shape="0" focus_size="47, 47"/>
                        </check_box>
                    </text>
                </list_item>
            </template>
            <template fast_open="1" id="23860CE8">
                <list_item style="998F48F3" id="02000000">
                    <layout_hint align="0, 0" size="840, 80" id="00000000" pos="0, 0"/>
                    <button sound="74324120" style="0520652F" id="00000000">
                        <layout_hint size="840, 80" adjust="1, 0" id="01000000" pos="0, 0"/>
                        <focus_hint focus_shape="3" focus_hint="960, 80"/>
                        <text style="E98E283C" id="02000000">
                            <layout_hint size="-206, 0" align="0, 0" adjust="4, 0" id="01000000" pos="0, 330"/>
                            <file_list style="2B337B5F" id="05000000">
                                <layout_hint pos="0, -40" id="01000000" adjust="1, 0" alpha="0" anchor="2, 0" size="60, 60"/>
                            </file_list>
                        </text>
                        <plane style="D7F12CC7" id="D9904322">
                            <layout_hint size="46, 46" align="5, 2" adjust="1, 0" id="EEA339DA" pos="330, 0"/>
                        </plane>
                    </button>
                </list_item>
            </template>
        </templatetable>
     </pagetable>
  </styletable>
 </resource>
 </xml>