netinterfaces.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. // netinterfaces.h :
  2. //
  3. #if !defined(AGD_NETINTERFACES_H__54DE87BE_1F3C_4914_A062_9CCFCB496122__INCLUDED_)
  4. #define AGD_NETINTERFACES_H__54DE87BE_1F3C_4914_A062_9CCFCB496122__INCLUDED_
  5. #include <vector>
  6. #include <QObject>
  7. #include <QList>
  8. #include <QQmlListProperty>
  9. #include <qqmlparserstatus.h>
  10. #include <gfa/mutex.h>
  11. #include <gfa/gfanet.h>
  12. /////////////////////////////////////////////////////////////////////////////
  13. // netinterfaces.h - Declarations:
  14. class Interface;
  15. class NotificationSink
  16. {
  17. public:
  18. virtual void reportError(const char *pszFormatStr, ...) = 0;
  19. virtual void filterPropertyChanged(void) const = 0;
  20. virtual void selConfigChanged(Interface* pi, unsigned int cfgOld, unsigned int cfgNew) = 0;
  21. virtual int getInterfaceSelConfig(Interface &ri) = 0;
  22. };
  23. /////////////////////////////////////////////////////////////////////////////
  24. typedef bool (*PFN_ADDRESS_VALIDATOR)(const struct in_addr &addr);
  25. class IPv4Address : public QObject
  26. {
  27. Q_OBJECT
  28. Q_PROPERTY(QString address READ address WRITE setAddress NOTIFY addressChanged)
  29. Q_PROPERTY(int b0 READ b0 WRITE setB0 NOTIFY b0Changed)
  30. Q_PROPERTY(int b1 READ b1 WRITE setB1 NOTIFY b1Changed)
  31. Q_PROPERTY(int b2 READ b2 WRITE setB2 NOTIFY b2Changed)
  32. Q_PROPERTY(int b3 READ b3 WRITE setB3 NOTIFY b3Changed)
  33. public:
  34. explicit IPv4Address(struct in_addr &addr, NotificationSink &notifyer, QObject *pParent = 0, PFN_ADDRESS_VALIDATOR pfnAddrValidator = NULL);
  35. virtual ~IPv4Address(void);
  36. private:
  37. QString address(void) const;
  38. int b0(void) const;
  39. int b1(void) const;
  40. int b2(void) const;
  41. int b3(void) const;
  42. void setAddress(const QString &addr);
  43. void setB0(int b);
  44. void setB1(int b);
  45. void setB2(int b);
  46. void setB3(int b);
  47. signals:
  48. void addressChanged(const QString&);
  49. void b0Changed(int);
  50. void b1Changed(int);
  51. void b2Changed(int);
  52. void b3Changed(int);
  53. private:
  54. struct in_addr &m_addr;
  55. PFN_ADDRESS_VALIDATOR m_pfnAddrValidator;
  56. NotificationSink &m_rNotifyer;
  57. };
  58. /////////////////////////////////////////////////////////////////////////////
  59. class Static : public QObject
  60. {
  61. Q_OBJECT
  62. Q_PROPERTY(IPv4Address* ipAddress READ ipAddress CONSTANT)
  63. Q_PROPERTY(IPv4Address* netMask READ netMask CONSTANT)
  64. Q_PROPERTY(IPv4Address* gateway READ gateway CONSTANT)
  65. Q_PROPERTY(IPv4Address* bcastAddress READ bcastAddress CONSTANT)
  66. Q_PROPERTY(IPv4Address* ptpAddress READ ptpAddress CONSTANT)
  67. Q_PROPERTY(QQmlListProperty<IPv4Address> dnsServer READ dnsServer CONSTANT)
  68. Q_PROPERTY(int metric READ metric WRITE setMetric NOTIFY metricChanged)
  69. Q_PROPERTY(int mtu READ mtu WRITE setMtu NOTIFY mtuChanged)
  70. Q_PROPERTY(int netPrefix READ netPrefix WRITE setNetPrefix NOTIFY netPrefixChanged)
  71. public:
  72. explicit Static(IFACE_INET_STATIC &itfs, NotificationSink &notifyer, QObject *pParent = 0);
  73. virtual ~Static(void);
  74. private:
  75. IPv4Address* ipAddress(void);
  76. IPv4Address* netMask(void);
  77. IPv4Address* gateway(void);
  78. IPv4Address* bcastAddress(void);
  79. IPv4Address* ptpAddress(void);
  80. QQmlListProperty<IPv4Address> dnsServer(void);
  81. int metric(void) const;
  82. void setMetric(int metric);
  83. int mtu(void) const;
  84. void setMtu(int mtu);
  85. int netPrefix(void) const;
  86. void setNetPrefix(int netprefix);
  87. private slots:
  88. void netmaskChanged(const QString&);
  89. signals:
  90. void metricChanged(int metric);
  91. void mtuChanged(int mtu);
  92. void netPrefixChanged(unsigned int netprefix);
  93. private:
  94. IFACE_INET_STATIC &m_itfs;
  95. NotificationSink &m_rNotifyer;
  96. IPv4Address m_ipAddr;
  97. IPv4Address m_netmask;
  98. IPv4Address m_gateway;
  99. IPv4Address m_bcastAddr;
  100. IPv4Address m_ptpAddr;
  101. QList<IPv4Address*> m_dnsList;
  102. };
  103. /////////////////////////////////////////////////////////////////////////////
  104. class Dhcp : public QObject
  105. {
  106. Q_OBJECT
  107. public:
  108. explicit Dhcp(IFACE_INET_DHCP &itfd, NotificationSink &notifyer, QObject *pParent = 0);
  109. virtual ~Dhcp(void);
  110. private:
  111. IFACE_INET_DHCP &m_itfd;
  112. NotificationSink &m_rNotifyer;
  113. };
  114. /////////////////////////////////////////////////////////////////////////////
  115. class Inet : public QObject
  116. {
  117. Q_OBJECT
  118. Q_PROPERTY(Static* stat READ stat CONSTANT)
  119. Q_PROPERTY(Dhcp* dhcp READ dhcp CONSTANT)
  120. public:
  121. explicit Inet(ITF_IFACE_BLOCK &ifb, NotificationSink &notifyer, QObject *pParent = 0);
  122. virtual ~Inet(void);
  123. private:
  124. Static* stat(void);
  125. Dhcp* dhcp(void);
  126. private:
  127. Static m_static;
  128. Dhcp m_dhcp;
  129. NotificationSink &m_rNotifyer;
  130. };
  131. /////////////////////////////////////////////////////////////////////////////
  132. class Interface : public QObject
  133. {
  134. Q_OBJECT
  135. Q_PROPERTY(QString name READ name CONSTANT)
  136. Q_PROPERTY(QString afName READ afName NOTIFY afNameChanged)
  137. Q_PROPERTY(int af READ af WRITE setAf NOTIFY afChanged)
  138. Q_PROPERTY(QString methodName READ methodName NOTIFY methodNameChanged)
  139. Q_PROPERTY(int method READ method WRITE setMethod NOTIFY methodChanged)
  140. Q_PROPERTY(int selCfg READ selCfg WRITE setSelCfg NOTIFY selCfgChanged)
  141. Q_PROPERTY(Inet* inet READ inet CONSTANT)
  142. public:
  143. explicit Interface(ITF_IFACE_BLOCK &ifb, NotificationSink &notifyer, QObject *pParent = 0);
  144. virtual ~Interface(void);
  145. inline const ITF_IFACE_BLOCK & getIface(void) const {
  146. return m_ifb;}
  147. inline ITF_IFACE_BLOCK & getIface(void){
  148. return m_ifb;}
  149. inline unsigned long getID(void) const {
  150. return m_ifb.id;}
  151. inline int getSelCfg(void) const {
  152. return m_selCfg;}
  153. inline const char * getName(void) const {
  154. return m_ifb.cfgName.c_str();}
  155. enum AddressFamily
  156. {
  157. AF_Unknown = 0,
  158. AF_Inet = 0x0001,
  159. AF_Inet6 = 0x0002,
  160. AF_Ipx = 0x0004,
  161. AF_Can = 0x0008,
  162. AF_Invalid = 0x0010
  163. };
  164. Q_ENUMS(AddressFamily)
  165. enum ItfMethod
  166. {
  167. IM_Unknown = 0,
  168. IM_Static = 0x0001,
  169. IM_Dhcp = 0x0002,
  170. IM_Manual = 0x0004,
  171. IM_BootP = 0x0008,
  172. IM_Tunnel = 0x0010,
  173. IM_Ppp = 0x0020,
  174. IM_WvDial = 0x0040,
  175. IM_IpV4ll = 0x0080,
  176. IM_Loopback = 0x0100,
  177. IM_Auto = 0x0200,
  178. IM_Invalid = 0x0400
  179. };
  180. Q_ENUMS(ItfMethod)
  181. enum SelConfig
  182. {
  183. SC_None = 0,
  184. SC_Auto = 0x0001,
  185. SC_AllowAuto = 0x0002,
  186. SC_AllowHotplug = 0x0004,
  187. SC_NoAutoDown = 0x0008,
  188. SC_NoScripts = 0x0010,
  189. SC_Invalid = 0x0020
  190. };
  191. Q_ENUMS(SelConfig)
  192. private:
  193. QString name(void) const;
  194. QString afName(void) const;
  195. int af(void) const;
  196. void setAf(int af);
  197. QString methodName(void) const;
  198. int method(void) const;
  199. void setMethod(int method);
  200. int selCfg(void) const;
  201. void setSelCfg(int cfg);
  202. Inet* inet(void);
  203. signals:
  204. void afNameChanged(void);
  205. void afChanged(int af);
  206. void methodNameChanged(void);
  207. void methodChanged(int method);
  208. void selCfgChanged(int cfg);
  209. private:
  210. ITF_IFACE_BLOCK &m_ifb;
  211. Inet m_inet;
  212. NotificationSink &m_rNotifyer;
  213. int m_selCfg;
  214. };
  215. /////////////////////////////////////////////////////////////////////////////
  216. class NetInterfaces;
  217. typedef struct _IF_UPDOWN_CONTEXT
  218. {
  219. NetInterfaces *pThis;
  220. Interface *pi;
  221. int ctx;
  222. }IF_UPDOWN_CONTEXT, *LPIF_UPDOWN_CONTEXT;
  223. typedef const IF_UPDOWN_CONTEXT *LPCIF_UPDOWN_CONTEXT;
  224. class NetInterfaces : public QObject, public QQmlParserStatus, public NotificationSink
  225. {
  226. Q_OBJECT
  227. Q_INTERFACES(QQmlParserStatus)
  228. Q_PROPERTY(QQmlListProperty<Interface> interfaces READ interfaces NOTIFY interfacesChanged)
  229. Q_PROPERTY(QQmlListProperty<Interface> filteredInterfaces READ filteredInterfaces NOTIFY filteredInterfacesChanged)
  230. Q_PROPERTY(QString itfFilterName READ itfFilterName WRITE setItfFilterName NOTIFY itfFilterNameChanged)
  231. Q_PROPERTY(int itfFilterAF READ itfFilterAF WRITE setItfFilterAF NOTIFY itfFilterAFChanged)
  232. Q_PROPERTY(int itfFilterMethod READ itfFilterMethod WRITE setItfFilterMethod NOTIFY itfFilterMethodChanged)
  233. Q_PROPERTY(bool ifUpDownInProgress READ ifUpDownInProgress CONSTANT)
  234. public:
  235. explicit NetInterfaces(QObject *pParent = 0);
  236. virtual ~NetInterfaces(void);
  237. enum IfUpDownCtx
  238. {
  239. UDC_Start,
  240. UDC_Stop,
  241. UDC_Restart
  242. };
  243. Q_ENUMS(IfUpDownCtx)
  244. public:
  245. Q_INVOKABLE void reset(void);
  246. Q_INVOKABLE bool initialize(void);
  247. Q_INVOKABLE bool save(void);
  248. Q_INVOKABLE bool saveAs(const QString &path);
  249. Q_INVOKABLE Interface* newInterface(QString name, int af, int method);
  250. Q_INVOKABLE void removeInterface(Interface *pi);
  251. Q_INVOKABLE bool startInterface(Interface *pi);
  252. Q_INVOKABLE bool stopInterface(Interface *pi);
  253. Q_INVOKABLE bool restartInterface(Interface *pi);
  254. Q_INVOKABLE bool cancelStartStopInterface(void);
  255. virtual void classBegin();
  256. virtual void componentComplete();
  257. virtual void reportError(const char *pszFormatStr, ...);
  258. virtual void filterPropertyChanged(void) const;
  259. virtual void selConfigChanged(Interface* pi, unsigned int cfgOld, unsigned int cfgNew);
  260. virtual int getInterfaceSelConfig(Interface &ri);
  261. inline pid_t GetIfUpDownPid(void) const {
  262. return m_ifUpDownPid;}
  263. inline void SetIfUpDownPid(pid_t pid){
  264. m_ifUpDownPid = pid;}
  265. inline bool GetIfUpDownInProgress(void) const {
  266. return m_bIfUpDownInProgress;}
  267. inline void SetIfUpDownInProgress(bool bVal){
  268. m_bIfUpDownInProgress = bVal;}
  269. bool SetInterlockedIfUpDownInProgress(void);
  270. signals:
  271. void interfacesChanged(void) const;
  272. void filteredInterfacesChanged(void) const;
  273. void itfFilterNameChanged(const QString &val) const;
  274. void itfFilterAFChanged(int af) const;
  275. void itfFilterMethodChanged(int method) const;
  276. void error(QString msg) const;
  277. void ifUpDown(QString msg) const;
  278. void ifUpDownCompleted(int ctx, int code) const;
  279. private:
  280. QQmlListProperty<Interface> interfaces(void);
  281. QQmlListProperty<Interface> filteredInterfaces(void);
  282. const QString& itfFilterName(void) const;
  283. void setItfFilterName(const QString &val);
  284. int itfFilterAF(void) const;
  285. void setItfFilterAF(int nval);
  286. int itfFilterMethod(void) const;
  287. void setItfFilterMethod(int method);
  288. bool ifUpDownInProgress(void) const;
  289. static void onIfUpDown(const char *pszMsg, void *pCtx);
  290. static void onIfUpCompleted(int nExitCode, void *pCtx);
  291. static void onIfDownCompleted(int nExitCode, void *pCtx);
  292. static void onIfRestartCompleted(int nExitCode, void *pCtx);
  293. private:
  294. ETC_NETWORK_INTERFACES m_eni;
  295. QList<Interface*> m_interfaces;
  296. QList<Interface*> m_filteredInterfaces;
  297. QString m_itfFilterName;
  298. int m_itfFilterAF;
  299. int m_itfFilterMethod;
  300. bool m_bIfUpDownInProgress;
  301. pid_t m_ifUpDownPid;
  302. CLocalMutex m_mutex;
  303. };
  304. /////////////////////////////////////////////////////////////////////////////
  305. #endif // !defined(AGD_NETINTERFACES_H__54DE87BE_1F3C_4914_A062_9CCFCB496122__INCLUDED_)