
    hx                         d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	m
Z
  ej                  e      Z G d d      Zy)    N)DictTypeAny)DriverPluginCountermeasurePluginc                   r    e Zd ZdZdefdZd ZdedefdZdede	fd	Z
dede	fd
ZdedefdZdedefdZy)PluginManageruU   
    插件管理器，负责加载和管理驱动插件与反制动作插件。
    plugin_dirsc                 .    || _         i | _        i | _        y )N)r
   driverscountermeasures)selfr
   s     'D:\code\IVE2\IVE\core\plugin_manager.py__init__zPluginManager.__init__   s    &68FH    c                 0   | j                   D ]T  }t        j                  j                  |      st        j                  d| d       =t        j                  j                  |d      }t        j                  j                  |      r| j                  ||       	 t        j                  |      D ]  }t        j                  j                  ||      }t        j                  j                  |      sCt        j                  j                  |d      }t        j                  j                  |      r| j                  ||       t        j                  d| d        W y# t        $ r&}t        j                  d| d|        Y d}~d}~ww xY w)	u   扫描并加载所有插件zPlugin directory z does not exist.zplugin.jsonzPlugin config z not found.zError scanning directory : N)r
   ospathisdirloggerwarningjoinexists_load_plugin_from_configlistdirdebugOSErrorerror)r   
plugin_dirplugin_config_pathitem	item_pathsub_plugin_config_pathes          r   load_pluginszPluginManager.load_plugins   s5   **J77==,!2:,>NOP "$j-!Hww~~01--j:LM
LJJz2D "Z >Iww}}Y/13i1W.77>>*@A 99)E[\"LL>:P9QQ\)]^ 3 +*  L8BqcJKKLs    AE&5A-E&&	F/FFr    r!   c                    	 t        |dd      5 }t        j                  |      }ddd       j                  d      }|d	k(  r| j                  ||       y|d
k(  r| j                  ||       yt        j                  d| d|        y# 1 sw Y   fxY w# t        j                  $ r%}t        j                  d| d|        Y d}~yd}~wt        $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)u!   从配置文件加载单个插件rzutf-8)encodingNzError decoding JSON from r   zError reading typedrivercountermeasurezUnknown plugin type 'z' in )openjsonloadJSONDecodeErrorr   r   	Exceptionget_load_driver_plugin_load_countermeasure_pluginr   )r   r    r!   fconfigr%   plugin_types          r   r   z&PluginManager._load_plugin_from_config.   s    	(#@A1 A jj(("$$Z8,,,,Z@NN2;-uEWDXYZ A@## 	LL45G4H1#NO 	LL>*<)=RsCD	s9   B BB BB C;*C

C;C66C;r6   c                 `   |j                  d      }|j                  d      }|r|st        j                  d|        y	 |j                  dd      \  }}t        j
                  j                  |t        j                  j                  || d            }|t        j                  d| d	|        yt        j
                  j                  |      }|j                  j                  |       t        ||      }	t        |	t              r(|	| j                   |<   t        j#                  d
|        yt        j                  d| d       y# t$        t&        f$ r%}
t        j                  d| d|
        Y d}
~
yd}
~
wt(        $ r%}
t        j                  d| d|
        Y d}
~
yd}
~
ww xY w)u   加载驱动插件nameentry_pointz Invalid driver plugin config in N.   .pyz(Failed to create spec for driver plugin  from zLoaded driver plugin: Plugin z+ does not implement DriverPlugin interface.zFailed to load driver plugin r   z'Unexpected error loading driver plugin )r2   r   r   rsplit	importlibutilspec_from_file_locationr   r   r   module_from_specloaderexec_modulegetattr
issubclassr   r   infoImportErrorAttributeErrorr1   )r   r    r6   r9   r:   module_name
class_namespecmoduledriver_classr%   s              r   r3   z!PluginManager._load_driver_pluginB   sz   zz&!jj/;LL;J<HI	P&1&8&8a&@#K>>99+rww||T^cnboor`sGtuD|GvVT^S_`a^^44T:FKK##F+"6:6L,5%1T"4TF;<wtf,WXY^, 	FLL8bDEE 	PLLB4&1#NOO	P2   A3E 5A=E 3E F-E<<F-F((F-c                 `   |j                  d      }|j                  d      }|r|st        j                  d|        y	 |j                  dd      \  }}t        j
                  j                  |t        j                  j                  || d            }|t        j                  d| d	|        yt        j
                  j                  |      }|j                  j                  |       t        ||      }	t        |	t              r(|	| j                   |<   t        j#                  d
|        yt        j                  d| d       y# t$        t&        f$ r%}
t        j                  d| d|
        Y d}
~
yd}
~
wt(        $ r%}
t        j                  d| d|
        Y d}
~
yd}
~
ww xY w)u   加载反制动作插件r9   r:   z(Invalid countermeasure plugin config in Nr;   r<   r=   z0Failed to create spec for countermeasure plugin r>   zLoaded countermeasure plugin: r?   z3 does not implement CountermeasurePlugin interface.z%Failed to load countermeasure plugin r   z/Unexpected error loading countermeasure plugin )r2   r   r   r@   rA   rB   rC   r   r   r   rD   rE   rF   rG   rH   r   r   rI   rJ   rK   r1   )r   r    r6   r9   r:   rL   rM   rN   rO   cm_classr%   s              r   r4   z)PluginManager._load_countermeasure_plugin_   s   zz&!jj/;LLCJ<PQ	X&1&8&8a&@#K>>99+rww||T^cnboor`sGtuD|OPTvU[\f[ghi^^44T:FKK##F+vz2H($89-5$$T*<TFCDwtf,_`a^, 	NLL@bLMM 	XLLJ4&PRSTRUVWW	XrQ   r9   returnc                 L    | j                   j                  |      }|r |       S y)u   获取驱动实例N)r   r2   )r   r9   rP   s      r   
get_driverzPluginManager.get_driver|   s$    ||''->!r   c                 L    | j                   j                  |      }|r |       S y)u   获取反制动作实例N)r   r2   )r   r9   rS   s      r   get_countermeasurez PluginManager.get_countermeasure   s&    ''++D1:r   N)__name__
__module____qualname____doc__listr   r&   strr   dictr3   r4   r   rV   r   rX    r   r   r	   r	      s    ID I
L4[3 [C [(Pc P4 P:Xc X4 X:s | s /C r   r	   )r   r.   rA   loggingtypingr   r   r   pluginsr   r   	getLoggerrY   r   r	   r`   r   r   <module>re      s:    	    " " 6 
		8	$} }r   