a
    û#¢j6  ã                   @   sÒ   d dl mZ d dlmZ d dlZd dlZd dlZzd dlmZ W n ey^   d dl	mZ Y n0 d dl
Z
e
jd  dkr~dd„ Ze e¡Zd dlmZ d d	lT d d	lT d d
lmZmZmZ dd„ Zdg fdd„ZdS )é    )Úprint_function)ÚbasenameN)ÚStringIOé   c                 C   s   | S ©N© )Úsr   r   úk/mnt/data/dev_pub/qqyu/v2.12.x/application/opensource/open62541/tools/nodeset_compiler/backend_open62541.pyÚunicode   s    r
   )ÚNodeId)Ú*)ÚgenerateNodeCode_beginÚgenerateNodeCode_finishÚgenerateReferenceCodec                    s  t dƒ}| j ¡ D ]$}|jD ]}|j|kr|j |_qq|  ¡ }dd„ | j ¡ D ƒ}dd„ | j ¡ D ƒ}dd„ | ¡ D ƒ‰ | ¡ D ]F}|jD ]:}|j|vrœqŒ| j|j j	r¬qŒ|jr´qŒˆ |j
  d7  < qŒq‚‡ fdd„| ¡ D ƒ}|�r~| ¡ }| |¡ ||j
= t|jd	d
„ d�D ]h}|j|v�r&�q| j|j j	�r:�q|j�sF�qˆ |j  d8  < ˆ |j dk�r| ||j ¡ �qqà‡ fdd„| ¡ D ƒ}|�r4| ¡ }| |¡ ||j
= t|jdd
„ d�D ]h}|j|v�rÚ�qÆ| j|j j	�rî�qÆ|j�sú�qÆˆ |j  d8  < ˆ |j dk�rÆ| ||j ¡ �qÆ�q”| j ¡ D ]*}|jD ]}|j|k�rH|j |_�qH�q>t|ƒt| j ¡ ƒk�rtt|ƒƒ d}ˆ D ]^}	ˆ |	 dk�r¬�q–| j|	 }
||
jjd t|
j
ƒ d tˆ |	 ƒ d t|
jƒ d 7 }�q–td| ƒ‚|S )Nz	ns=0;i=40c                 S   s   g | ]}|j r|‘qS r   )Úhidden©Ú.0Únoder   r   r	   Ú
<listcomp>2   ó    zsortNodes.<locals>.<listcomp>c                 S   s   i | ]}|j s|j|“qS r   )r   Úidr   r   r   r	   Ú
<dictcomp>3   r   zsortNodes.<locals>.<dictcomp>c                 S   s   i | ]
}|d “qS ©r   r   )r   r   r   r   r	   r   4   r   é   c                    s2   g | ]*}ˆ |j  d krt|tƒs*t|tƒr|‘qS r   )r   Ú
isinstanceÚReferenceTypeNodeÚDataTypeNoder   ©Z	in_degreer   r	   r   D   s   ÿc                 S   s
   t | jƒS r   ©ÚstrÚtarget©Úrr   r   r	   Ú<lambda>K   r   zsortNodes.<locals>.<lambda>)Úkeyr   c                    s   g | ]}ˆ |j  d kr|‘qS r   )r   r   r   r   r	   r   W   r   c                 S   s
   t | jƒS r   r   r!   r   r   r	   r#   ]   r   Ú ú/z = ú z
zGNode graph is circular on the specified references. Still open nodes:
)r   ÚnodesÚvaluesÚ
referencesÚreferenceTypeÚ	isForwardÚgetRelevantOrderingReferencesÚkeysr    r   r   ÚpopÚappendÚsortedÚlenÚprintÚ
browseNameÚnamer   Ú	Exception)ÚnodesetZ
hasTypeDefÚuÚrefZrelevant_refsÚLÚRÚQZ	stillOpenr   r   r   r   r	   Ú	sortNodes&   sˆ    







&ÿÿÿ
r=   Fc                    sV  t |ƒ}tj|d ddd�‰tƒ ‰ ‡fdd„}‡ fdd„}d	}t|ƒd
krŒ|D ]<}|dkr\qN| ¡ }	|	|	 d¡ovtdƒd … }	|d|	 7 }qN|d| ¡ | ¡ f ƒ |r¶|d| ƒ n|d| ƒ |d|| ¡ f ƒ |d| ƒ t 	d¡ t
| ƒ}
t 	d¡ d
}tƒ }tƒ }|
D �]F}| |j¡ |j�sî|dt|jƒ d t|jƒ d ƒ g }t|| |ƒ}|d u �r„|dƒ |  |j¡ �qnjt|ƒd
k�r¨|d |¡ƒ |dƒ |d| d t|ƒ d ƒ t|tƒ�sÞt|jtƒ�ræ|dƒ ||ƒ |jD ]n}|j|v�r�qô|j�r$| j|j j�r$�qô|jd u�rT|j|jjk�rT|j|jjk�rT�qô|t|ƒƒ �qô|j�rp�q|dƒ t|tƒ�s’t|jtƒ�rª|dƒ |d ƒ |d!ƒ |d"ƒ |d| d t|ƒ d# ƒ t|tƒ�sèt|jtƒ�rð|dƒ |d$t|ƒ ƒ t|tƒ�st|jtƒ�r2|dƒ |d ƒ |d!ƒ |d"ƒ t|tƒ�rP|  |¡ |d% }�q|D ]T}|dk�rr�q`|d&| d' ƒ |d(ƒ |d)| d* ƒ |d)| d+ ƒ |d,ƒ �q`|d-| ƒ |d.ƒ |d/tt| j!ƒƒ d0 ƒ t"| j!ƒD ]2\}}| #d1d2¡}|d3t|ƒ d4 | d5 ƒ �qît|ƒd
k�r|d6 }d | ¡  $d¡d%d6… ¡}|dk�r|d7k�r|d8| k�r|d9ƒ |d:| d; d< ƒ |d=| d; d> ƒ ||d? d@ tt| j!ƒd% ƒ d0 ƒ ||d? dA tt| j!ƒd% ƒ d0 ƒ |d"ƒ |dBƒ |dCƒ |D ]L}|dk�r �q|dD| dE ƒ |dF| dG ƒ |dH| dI ƒ |d"ƒ �q|d
k�rèt%d
|ƒD ]<}|dJj&|t|ƒdK�ƒ ||v �rp|dLj&|t|ƒdK�ƒ �qpt't%d
|ƒƒD ]*}||v �rÎ�q¼|dLj&|t|ƒdK�ƒ �q¼|dMƒ ˆ (¡  t) *ˆ¡ ˆ +¡  ˆ  ,¡ }ˆ  +¡  tj|dN ddd�‰ ˆ  -|¡ ˆ  (¡  t) *ˆ ¡ ˆ  +¡  d S )ONz.hzw+zutf-8)Úencodingc                    s   t t| ƒdˆ d� d S ©NÚ
)ÚendÚfile©r3   r
   ©Úline)Úoutfilehr   r	   Úwriteh„   s    z%generateOpen62541Code.<locals>.writehc                    s   t t| ƒdˆ d� d S r?   rC   rD   )Úoutfilecr   r	   Úwritec‡   s    z%generateOpen62541Code.<locals>.writecr%   r   ÚUA_TYPESÚua_z#include "%s_generated.h"
zq/* WARNING: This is a generated file.
 * Any manual changes will be overwritten. */

#ifndef %s_H_
#define %s_H_
au  
#ifdef UA_ENABLE_AMALGAMATION
# include "open62541.h"

/* The following declarations are in the open62541.c file so here's needed when compiling nodesets externally */

# ifndef UA_INTERNAL //this definition is needed to hide this code in the amalgamated .c file

typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos,
                                                 const UA_Byte **bufEnd);

UA_StatusCode
UA_encodeBinary(const void *src, const UA_DataType *type,
                UA_Byte **bufPos, const UA_Byte **bufEnd,
                UA_exchangeEncodeBuffer exchangeCallback,
                void *exchangeHandle) UA_FUNC_ATTR_WARN_UNUSED_RESULT;

UA_StatusCode
UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst,
                const UA_DataType *type, size_t customTypesSize,
                const UA_DataType *customTypes) UA_FUNC_ATTR_WARN_UNUSED_RESULT;

size_t
UA_calcSizeBinary(void *p, const UA_DataType *type);

const UA_DataType *
UA_findDataTypeByBinary(const UA_NodeId *typeId);

# endif // UA_INTERNAL

#else // UA_ENABLE_AMALGAMATION
# include <open62541/server.h>
#endif

%s
zf
#ifdef UA_ENABLE_AMALGAMATION
# include "open62541.h"
#else
# include <open62541/server.h>
#endif
%s
z`
_UA_BEGIN_DECLS

extern UA_StatusCode %s(UA_Server *server);

_UA_END_DECLS

#endif /* %s_H_ */ze/* WARNING: This is a generated file.
 * Any manual changes will be overwritten. */

#include "%s.h"
z9Reordering nodes for minimal dependencies during printingz%Writing code for nodes and referencesz
/* z - z */z/* Ignored. No parent */r@   z
static UA_StatusCode function_Ú_z*_begin(UA_Server *server, UA_UInt16* ns) {z#ifdef UA_ENABLE_METHODCALLSzreturn retVal;z#elsezreturn UA_STATUSCODE_GOOD;z"#endif /* UA_ENABLE_METHODCALLS */ú}z+_finish(UA_Server *server, UA_UInt16* ns) {zreturn r   z
static UA_DataTypeArray customz = {z	    NULL,z    z_COUNT,ú,z    UA_FALSE
};zQ
UA_StatusCode %s(UA_Server *server) {
UA_StatusCode retVal = UA_STATUSCODE_GOOD;z//* Use namespace ids generated by the server */zUA_UInt16 ns[z];ú"z\"zns[z$] = UA_Server_addNamespace(server, "z");éÿÿÿÿZns0Z	UA_TYPES_z2/* Change namespaceIndex from current namespace */z#if Z_COUNTz > 0zfor(int i = 0; i < z; i++) {z[i]z.typeId.namespaceIndex = ns[z&.binaryEncodingId.namespaceIndex = ns[z#endifz7
/* Load custom datatype definitions into the server */zif(z_COUNT > 0) {Zcustomz5.next = UA_Server_getConfig(server)->customDataTypes;z6UA_Server_getConfig(server)->customDataTypes = &customz;
zbif((retVal = function_{outfilebase}_{idx}_begin(server, ns)) != UA_STATUSCODE_GOOD) return retVal;)ÚoutfilebaseÚidxzcif((retVal = function_{outfilebase}_{idx}_finish(server, ns)) != UA_STATUSCODE_GOOD) return retVal;zreturn retVal;
}z.c).r   ÚcodecsÚopenr   r2   ÚlowerÚ
startswithÚupperÚloggerÚinfor=   ÚsetÚlistÚaddr   r   r   ÚdisplayNamer   Ú	hide_nodeÚjoinr   Ú
MethodNodeÚparentr*   r    r(   r+   ÚparentReferencer   r   r   r0   Ú
namespacesÚ	enumerateÚreplaceÚsplitÚrangeÚformatÚreversedÚflushÚosÚfsyncÚcloseÚgetvalueÚwrite)r7   ZoutfilenameÚinternal_headersÚ
typesArrayrQ   rG   rI   ZadditionalHeadersZarrZtypeFileZsorted_nodesZfunctionNumberZprinted_idsZreftypes_functionNumbersr   Zcode_globalÚcoder9   ÚiZnsidZtypeArrZcurrentTypeArrZfullCoder   )rH   rF   r	   ÚgenerateOpen62541Code~   s   û#Ý%ù
ø
ü


$

ÿ

þ "&&

ÿ
ÿ
ÿ


rt   )Ú
__future__r   Zos.pathr   ÚloggingrS   rk   r   ÚImportErrorÚioÚsysÚversion_infor
   Ú	getLoggerÚ__name__rX   Ú	datatypesr   r(   r7   Zbackend_open62541_nodesr   r   r   r=   rt   r   r   r   r	   Ú<module>   s$   
X