3
lj0                 @   s   d dl mZ d dlmZ d dlZd dlZd dlZyd dlmZ W n  ek
r`   d dl	mZ Y nX d dl
Z
e
jd  dkrdd Zej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   n/mnt/data/dev_pub/qqyu/docker_elf/application/opensource/open62541/tools/nodeset_compiler/backend_open62541.pyunicode   s    r	   )NodeId)*)generateNodeCode_begingenerateNodeCode_finishgenerateReferenceCodec                s2  t d}x6| jj D ](}x"|jD ]}|j|kr |j |_q W qW | j }dd | jj D }dd | jj D }dd |j D  xV|j D ]J}xD|jD ]:}|j|krq| j|j j	rq|jrq |j
  d7  < qW qW  fdd|j D }x|r|j }|j| ||j
= x~t|jd	d
 dD ]h}|j|kr:q&| j|j j	rNq&|jsZq& |j  d8  <  |j dkr&|j||j  q&W qW  fdd|j D }x|rR|j }|j| ||j
= x~t|jdd
 dD ]h}|j|krq| j|j j	r
q|jsq |j  d8  <  |j dkr|j||j  qW qW x<| jj D ].}x&|jD ]}|j|krl|j |_qlW q`W t|t| jj kr.tt| d}xf D ]^}	 |	 dkr֐q| j|	 }
||
jjd t|
j
 d t |	  d t|
j d 7 }qW td| |S )Nz	ns=0;i=40c             S   s   g | ]}|j r|qS r   )hidden).0noder   r   r   
<listcomp>2   s    zsortNodes.<locals>.<listcomp>c             S   s   i | ]}|j s||jqS r   )r   id)r   r   r   r   r   
<dictcomp>3   s    zsortNodes.<locals>.<dictcomp>c             S   s   i | ]
}d |qS )r   r   )r   r   r   r   r   r   4   s       c                s2   g | ]*} |j  d krt|ts*t|tr|qS )r   )r   
isinstanceReferenceTypeNodeDataTypeNode)r   r   )	in_degreer   r   r   D   s    c             S   s
   t | jS )N)strtarget)rr   r   r   <lambda>K   s    zsortNodes.<locals>.<lambda>)keyr   c                s   g | ]} |j  d kr|qS )r   )r   )r   r   )r   r   r   r   W   s    c             S   s
   t | jS )N)r   r   )r   r   r   r   r   ]   s     /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~    





@r7   Fc                s  t |}tj|d dddt  fdd} fdd}d	}t|d
krxHt|D ]<}|dkrbqT|j }	|	|	jdo|tdd  }	|d|	 7 }qTW |d|j |j f  |r|d|  n|d|  |d||j f  |d|  t	j
d t| }
t	j
d d
}t }t }xT|
D ]J}|j|j |js|dt|j d t|j d  g }t|| |}|d kr|d | j|j qnjt|d
kr|dj| |d |d| d t| d  t|tst|jtr|d || xx|jD ]n}|j|krq|jr2| j|j jr2q|jd k	rb|j|jjkrb|j|jjkrbq|t| qW |jrq|d t|tst|jtr|d |d  |d! |d" |d| d t| d#  t|tst|jtr |d |d$t|  t|ts*t|jtrB|d |d  |d! |d" t|tr`|j| |d% }qW xXt|D ]L}|dkrqx|d&| d'  |d( |d)| d*  |d)| d+  qxW |d,|  |d- |d.tt| j d/  x@t | jD ]2\}}|j!d0d1}|d2t| d3 | d4  qW |d5 xXt|D ]L}|dkr\qJ|d6| d7  |d8| d9  |d:| d;  |d" qJW |d
kr.xJt"d
|D ]<}|d<j#|t|d= ||kr|d>j#|t|d= qW x<t$t"d
|D ]*}||krq |d>j#|t|d= q W |d? j%  t&j' j(   j) } j(  tj|d@ ddd  j*|  j%  t&j'   j(  d S )ANz.hzw+zutf-8)encodingc                s   t t| d d d S )N
)endfile)r-   r	   )line)outfilehr   r   writeh   s    z%generateOpen62541Code.<locals>.writehc                s   t t| d d d S )Nr9   )r:   r;   )r-   r	   )r<   )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 */r9   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
};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");z7
/* 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   r,   setlower
startswithupperloggerinfor7   addr   r   r   displayNamer   	hide_nodejoinr   
MethodNodeparentr$   r   r"   r%   parentReferencer   r   r   
namespaces	enumeratereplacerangeformatreversedflushosfsyncclosegetvaluewrite)r1   Zoutfilenameinternal_headers
typesArrayrF   r>   r@   ZadditionalHeadersZarrZtypeFileZsorted_nodesZfunctionNumberZprinted_idsZreftypes_functionNumbersr   Zcode_globalcoder3   iZnsidZfullCoder   )r?   r=   r   generateOpen62541Code~   s    #



$



"






rg   )
__future__r   Zos.pathr   loggingrH   r^   r   ImportErroriosysversion_infor	   	getLogger__name__rN   	datatypesr
   r"   r1   Zbackend_open62541_nodesr   r   r   r7   rg   r   r   r   r   <module>   s$   
X