jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

768 lines
17KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14. */
  15. #ifndef __JackRequest__
  16. #define __JackRequest__
  17. #include "JackPort.h"
  18. #include "JackChannelTransaction.h"
  19. #include "JackError.h"
  20. #include <stdio.h>
  21. namespace Jack
  22. {
  23. #define CheckRes(res) {if (res < 0) return res;}
  24. /*!
  25. \brief Request from client to server.
  26. */
  27. struct JackRequest
  28. {
  29. enum RequestType {
  30. kRegisterPort = 1,
  31. kUnRegisterPort = 2,
  32. kConnectPorts = 3,
  33. kDisconnectPorts = 4,
  34. kSetTimeBaseClient = 5,
  35. kActivateClient = 6,
  36. kDeactivateClient = 7,
  37. kDisconnectPort = 8,
  38. kSetClientCapabilities = 9,
  39. kGetPortConnections = 10,
  40. kGetPortNConnections = 11,
  41. kReleaseTimebase = 12,
  42. kSetTimebaseCallback = 13,
  43. kSetBufferSize = 20,
  44. kSetFreeWheel = 21,
  45. kClientCheck = 22,
  46. kClientOpen = 23,
  47. kClientClose = 24,
  48. kConnectNamePorts = 25,
  49. kDisconnectNamePorts = 26,
  50. kNotification = 27
  51. };
  52. RequestType fType;
  53. JackRequest()
  54. {}
  55. JackRequest(RequestType type): fType(type)
  56. {}
  57. virtual ~JackRequest()
  58. {}
  59. virtual int Read(JackChannelTransaction* trans)
  60. {
  61. return trans->Read(&fType, sizeof(RequestType));
  62. }
  63. virtual int Write(JackChannelTransaction* trans)
  64. {
  65. return trans->Write(&fType, sizeof(RequestType));
  66. }
  67. };
  68. /*!
  69. \brief Result from the server.
  70. */
  71. struct JackResult
  72. {
  73. int fResult;
  74. JackResult(): fResult( -1)
  75. {}
  76. JackResult(int result): fResult(result)
  77. {}
  78. virtual ~JackResult()
  79. {}
  80. virtual int Read(JackChannelTransaction* trans)
  81. {
  82. return trans->Read(&fResult, sizeof(int));
  83. }
  84. virtual int Write(JackChannelTransaction* trans)
  85. {
  86. return trans->Write(&fResult, sizeof(int));
  87. }
  88. };
  89. /*!
  90. \brief CheckClient request.
  91. */
  92. struct JackClientCheckRequest : public JackRequest
  93. {
  94. char fName[JACK_CLIENT_NAME_SIZE + 1];
  95. int fOptions;
  96. JackClientCheckRequest()
  97. {}
  98. JackClientCheckRequest(const char* name, int options): JackRequest(JackRequest::kClientCheck),fOptions(options)
  99. {
  100. snprintf(fName, sizeof(fName), "%s", name);
  101. }
  102. int Read(JackChannelTransaction* trans)
  103. {
  104. CheckRes(trans->Read(&fName, JACK_PORT_NAME_SIZE + 1));
  105. return trans->Read(&fOptions, sizeof(int));
  106. }
  107. int Write(JackChannelTransaction* trans)
  108. {
  109. CheckRes(JackRequest::Write(trans));
  110. CheckRes(trans->Write(&fName, JACK_PORT_NAME_SIZE + 1));
  111. return trans->Write(&fOptions, sizeof(int));
  112. }
  113. };
  114. /*!
  115. \brief CheckClient result.
  116. */
  117. struct JackClientCheckResult : public JackResult
  118. {
  119. char fName[JACK_CLIENT_NAME_SIZE + 1];
  120. int fStatus;
  121. JackClientCheckResult():fStatus(0)
  122. {}
  123. JackClientCheckResult(int32_t result, const char* name, int status)
  124. : JackResult(result), fStatus(status)
  125. {
  126. snprintf(fName, sizeof(fName), "%s", name);
  127. }
  128. int Read(JackChannelTransaction* trans)
  129. {
  130. CheckRes(JackResult::Read(trans));
  131. CheckRes(trans->Read(&fName, JACK_PORT_NAME_SIZE + 1));
  132. CheckRes(trans->Read(&fStatus, sizeof(int)));
  133. return 0;
  134. }
  135. int Write(JackChannelTransaction* trans)
  136. {
  137. CheckRes(JackResult::Write(trans));
  138. CheckRes(trans->Write(&fName, JACK_PORT_NAME_SIZE + 1));
  139. CheckRes(trans->Write(&fStatus, sizeof(int)));
  140. return 0;
  141. }
  142. };
  143. /*!
  144. \brief NewClient request.
  145. */
  146. struct JackClientOpenRequest : public JackRequest
  147. {
  148. char fName[JACK_CLIENT_NAME_SIZE + 1];
  149. JackClientOpenRequest()
  150. {}
  151. JackClientOpenRequest(const char* name): JackRequest(JackRequest::kClientOpen)
  152. {
  153. snprintf(fName, sizeof(fName), "%s", name);
  154. }
  155. int Read(JackChannelTransaction* trans)
  156. {
  157. return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1);
  158. }
  159. int Write(JackChannelTransaction* trans)
  160. {
  161. CheckRes(JackRequest::Write(trans));
  162. return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1);
  163. }
  164. };
  165. /*!
  166. \brief NewClient result.
  167. */
  168. struct JackClientOpenResult : public JackResult
  169. {
  170. int fSharedEngine;
  171. int fSharedClient;
  172. int fSharedGraph;
  173. uint32_t fProtocolVersion;
  174. JackClientOpenResult()
  175. :fSharedEngine(-1), fSharedClient(-1), fSharedGraph(-1), fProtocolVersion(0)
  176. {}
  177. JackClientOpenResult(int32_t result, int index1, int index2, int index3)
  178. : JackResult(result), fSharedEngine(index1), fSharedClient(index2), fSharedGraph(index3), fProtocolVersion(0)
  179. {}
  180. int Read(JackChannelTransaction* trans)
  181. {
  182. CheckRes(JackResult::Read(trans));
  183. CheckRes(trans->Read(&fSharedEngine, sizeof(int)));
  184. CheckRes(trans->Read(&fSharedClient, sizeof(int)));
  185. CheckRes(trans->Read(&fSharedGraph, sizeof(int)));
  186. CheckRes(trans->Read(&fProtocolVersion, sizeof(uint32_t)));
  187. return 0;
  188. }
  189. int Write(JackChannelTransaction* trans)
  190. {
  191. CheckRes(JackResult::Write(trans));
  192. CheckRes(trans->Write(&fSharedEngine, sizeof(int)));
  193. CheckRes(trans->Write(&fSharedClient, sizeof(int)));
  194. CheckRes(trans->Write(&fSharedGraph, sizeof(int)));
  195. CheckRes(trans->Write(&fProtocolVersion, sizeof(uint32_t)));
  196. return 0;
  197. }
  198. };
  199. /*!
  200. \brief CloseClient request.
  201. */
  202. struct JackClientCloseRequest : public JackRequest
  203. {
  204. int fRefNum;
  205. JackClientCloseRequest()
  206. {}
  207. JackClientCloseRequest(int refnum): JackRequest(JackRequest::kClientClose), fRefNum(refnum)
  208. {}
  209. int Read(JackChannelTransaction* trans)
  210. {
  211. return trans->Read(&fRefNum, sizeof(int));
  212. }
  213. int Write(JackChannelTransaction* trans)
  214. {
  215. CheckRes(JackRequest::Write(trans));
  216. return trans->Write(&fRefNum, sizeof(int));
  217. }
  218. };
  219. /*!
  220. \brief Activate request.
  221. */
  222. struct JackActivateRequest : public JackRequest
  223. {
  224. int fRefNum;
  225. JackActivateRequest()
  226. {}
  227. JackActivateRequest(int refnum): JackRequest(JackRequest::kActivateClient), fRefNum(refnum)
  228. {}
  229. int Read(JackChannelTransaction* trans)
  230. {
  231. return trans->Read(&fRefNum, sizeof(int));
  232. }
  233. int Write(JackChannelTransaction* trans)
  234. {
  235. CheckRes(JackRequest::Write(trans));
  236. return trans->Write(&fRefNum, sizeof(int));
  237. }
  238. };
  239. /*!
  240. \brief Deactivate request.
  241. */
  242. struct JackDeactivateRequest : public JackRequest
  243. {
  244. int fRefNum;
  245. JackDeactivateRequest()
  246. {}
  247. JackDeactivateRequest(int refnum): JackRequest(JackRequest::kDeactivateClient), fRefNum(refnum)
  248. {}
  249. int Read(JackChannelTransaction* trans)
  250. {
  251. return trans->Read(&fRefNum, sizeof(int));
  252. }
  253. int Write(JackChannelTransaction* trans)
  254. {
  255. CheckRes(JackRequest::Write(trans));
  256. return trans->Write(&fRefNum, sizeof(int));
  257. }
  258. };
  259. /*!
  260. \brief PortRegister request.
  261. */
  262. struct JackPortRegisterRequest : public JackRequest
  263. {
  264. int fRefNum;
  265. char fName[JACK_PORT_NAME_SIZE + 1];
  266. char fPortType[JACK_PORT_TYPE_SIZE + 1];
  267. unsigned int fFlags;
  268. unsigned int fBufferSize;
  269. JackPortRegisterRequest()
  270. {}
  271. JackPortRegisterRequest(int refnum, const char* name, const char* port_type, unsigned int flags, unsigned int buffer_size)
  272. : JackRequest(JackRequest::kRegisterPort), fRefNum(refnum), fFlags(flags), fBufferSize(buffer_size)
  273. {
  274. strcpy(fName, name);
  275. strcpy(fPortType, port_type);
  276. }
  277. int Read(JackChannelTransaction* trans)
  278. {
  279. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  280. CheckRes(trans->Read(&fName, JACK_PORT_NAME_SIZE + 1));
  281. CheckRes(trans->Read(&fPortType, JACK_PORT_TYPE_SIZE + 1));
  282. CheckRes(trans->Read(&fFlags, sizeof(unsigned int)));
  283. CheckRes(trans->Read(&fBufferSize, sizeof(unsigned int)));
  284. return 0;
  285. }
  286. int Write(JackChannelTransaction* trans)
  287. {
  288. CheckRes(JackRequest::Write(trans));
  289. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  290. CheckRes(trans->Write(&fName, JACK_PORT_NAME_SIZE + 1));
  291. CheckRes(trans->Write(&fPortType, JACK_PORT_TYPE_SIZE + 1));
  292. CheckRes(trans->Write(&fFlags, sizeof(unsigned int)));
  293. CheckRes(trans->Write(&fBufferSize, sizeof(unsigned int)));
  294. return 0;
  295. }
  296. };
  297. /*!
  298. \brief PortRegister result.
  299. */
  300. struct JackPortRegisterResult : public JackResult
  301. {
  302. jack_port_id_t fPortIndex;
  303. JackPortRegisterResult(): fPortIndex(NO_PORT)
  304. {}
  305. int Read(JackChannelTransaction* trans)
  306. {
  307. CheckRes(JackResult::Read(trans));
  308. return trans->Read(&fPortIndex, sizeof(jack_port_id_t));
  309. }
  310. int Write(JackChannelTransaction* trans)
  311. {
  312. CheckRes(JackResult::Write(trans));
  313. return trans->Write(&fPortIndex, sizeof(jack_port_id_t));
  314. }
  315. };
  316. /*!
  317. \brief PortUnregister request.
  318. */
  319. struct JackPortUnRegisterRequest : public JackRequest
  320. {
  321. int fRefNum;
  322. int fPortIndex;
  323. JackPortUnRegisterRequest()
  324. {}
  325. JackPortUnRegisterRequest(int refnum, int index): JackRequest(JackRequest::kUnRegisterPort), fRefNum(refnum), fPortIndex(index)
  326. {}
  327. int Read(JackChannelTransaction* trans)
  328. {
  329. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  330. CheckRes(trans->Read(&fPortIndex, sizeof(int)));
  331. return 0;
  332. }
  333. int Write(JackChannelTransaction* trans)
  334. {
  335. CheckRes(JackRequest::Write(trans));
  336. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  337. CheckRes(trans->Write(&fPortIndex, sizeof(int)));
  338. return 0;
  339. }
  340. };
  341. /*!
  342. \brief PortConnectName request.
  343. */
  344. struct JackPortConnectNameRequest : public JackRequest
  345. {
  346. int fRefNum;
  347. char fSrc[JACK_PORT_NAME_SIZE + 1];
  348. char fDst[JACK_PORT_NAME_SIZE + 1];
  349. JackPortConnectNameRequest()
  350. {}
  351. JackPortConnectNameRequest(int refnum, const char* src_name, const char* dst_name): JackRequest(JackRequest::kConnectNamePorts), fRefNum(refnum)
  352. {
  353. strcpy(fSrc, src_name);
  354. strcpy(fDst, dst_name);
  355. }
  356. int Read(JackChannelTransaction* trans)
  357. {
  358. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  359. CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1));
  360. CheckRes(trans->Read(&fDst,JACK_PORT_NAME_SIZE + 1));
  361. return 0;
  362. }
  363. int Write(JackChannelTransaction* trans)
  364. {
  365. CheckRes(JackRequest::Write(trans));
  366. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  367. CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1));
  368. CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1));
  369. return 0;
  370. }
  371. };
  372. /*!
  373. \brief PortDisconnectName request.
  374. */
  375. struct JackPortDisconnectNameRequest : public JackRequest
  376. {
  377. int fRefNum;
  378. char fSrc[JACK_PORT_NAME_SIZE + 1];
  379. char fDst[JACK_PORT_NAME_SIZE + 1];
  380. JackPortDisconnectNameRequest()
  381. {}
  382. JackPortDisconnectNameRequest(int refnum, const char* src_name, const char* dst_name): JackRequest(JackRequest::kDisconnectNamePorts), fRefNum(refnum)
  383. {
  384. strcpy(fSrc, src_name);
  385. strcpy(fDst, dst_name);
  386. }
  387. int Read(JackChannelTransaction* trans)
  388. {
  389. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  390. CheckRes(trans->Read(&fSrc, JACK_PORT_NAME_SIZE + 1));
  391. CheckRes(trans->Read(&fDst, JACK_PORT_NAME_SIZE + 1));
  392. return 0;
  393. }
  394. int Write(JackChannelTransaction* trans)
  395. {
  396. CheckRes(JackRequest::Write(trans));
  397. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  398. CheckRes(trans->Write(&fSrc, JACK_PORT_NAME_SIZE + 1));
  399. CheckRes(trans->Write(&fDst, JACK_PORT_NAME_SIZE + 1));
  400. return 0;
  401. }
  402. };
  403. /*!
  404. \brief PortConnect request.
  405. */
  406. struct JackPortConnectRequest : public JackRequest
  407. {
  408. int fRefNum;
  409. jack_port_id_t fSrc;
  410. jack_port_id_t fDst;
  411. JackPortConnectRequest()
  412. {}
  413. JackPortConnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst): JackRequest(JackRequest::kConnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
  414. {}
  415. int Read(JackChannelTransaction* trans)
  416. {
  417. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  418. CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
  419. CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
  420. return 0;
  421. }
  422. int Write(JackChannelTransaction* trans)
  423. {
  424. CheckRes(JackRequest::Write(trans));
  425. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  426. CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
  427. CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
  428. return 0;
  429. }
  430. };
  431. /*!
  432. \brief PortDisconnect request.
  433. */
  434. struct JackPortDisconnectRequest : public JackRequest
  435. {
  436. int fRefNum;
  437. jack_port_id_t fSrc;
  438. jack_port_id_t fDst;
  439. JackPortDisconnectRequest()
  440. {}
  441. JackPortDisconnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst): JackRequest(JackRequest::kDisconnectPorts), fRefNum(refnum), fSrc(src), fDst(dst)
  442. {}
  443. int Read(JackChannelTransaction* trans)
  444. {
  445. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  446. CheckRes(trans->Read(&fSrc, sizeof(jack_port_id_t)));
  447. CheckRes(trans->Read(&fDst, sizeof(jack_port_id_t)));
  448. return 0;
  449. }
  450. int Write(JackChannelTransaction* trans)
  451. {
  452. CheckRes(JackRequest::Write(trans));
  453. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  454. CheckRes(trans->Write(&fSrc, sizeof(jack_port_id_t)));
  455. CheckRes(trans->Write(&fDst, sizeof(jack_port_id_t)));
  456. return 0;
  457. }
  458. };
  459. /*!
  460. \brief SetBufferSize request.
  461. */
  462. struct JackSetBufferSizeRequest : public JackRequest
  463. {
  464. jack_nframes_t fBufferSize;
  465. JackSetBufferSizeRequest()
  466. {}
  467. JackSetBufferSizeRequest(jack_nframes_t buffer_size): JackRequest(JackRequest::kSetBufferSize), fBufferSize(buffer_size)
  468. {}
  469. int Read(JackChannelTransaction* trans)
  470. {
  471. return trans->Read(&fBufferSize, sizeof(jack_nframes_t));
  472. }
  473. int Write(JackChannelTransaction* trans)
  474. {
  475. CheckRes(JackRequest::Write(trans));
  476. return trans->Write(&fBufferSize, sizeof(jack_nframes_t));
  477. }
  478. };
  479. /*!
  480. \brief SetFreeWheel request.
  481. */
  482. struct JackSetFreeWheelRequest : public JackRequest
  483. {
  484. int fOnOff;
  485. JackSetFreeWheelRequest()
  486. {}
  487. JackSetFreeWheelRequest(int onoff): JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff)
  488. {}
  489. int Read(JackChannelTransaction* trans)
  490. {
  491. return trans->Read(&fOnOff, sizeof(int));
  492. }
  493. int Write(JackChannelTransaction* trans)
  494. {
  495. CheckRes(JackRequest::Write(trans));
  496. return trans->Write(&fOnOff, sizeof(int));
  497. }
  498. };
  499. /*!
  500. \brief ReleaseTimebase request.
  501. */
  502. struct JackReleaseTimebaseRequest : public JackRequest
  503. {
  504. int fRefNum;
  505. JackReleaseTimebaseRequest()
  506. {}
  507. JackReleaseTimebaseRequest(int refnum): JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum)
  508. {}
  509. int Read(JackChannelTransaction* trans)
  510. {
  511. return trans->Read(&fRefNum, sizeof(int));
  512. }
  513. int Write(JackChannelTransaction* trans)
  514. {
  515. CheckRes(JackRequest::Write(trans));
  516. return trans->Write(&fRefNum, sizeof(int));
  517. }
  518. };
  519. /*!
  520. \brief SetTimebaseCallback request.
  521. */
  522. struct JackSetTimebaseCallbackRequest : public JackRequest
  523. {
  524. int fRefNum;
  525. int fConditionnal;
  526. JackSetTimebaseCallbackRequest()
  527. {}
  528. JackSetTimebaseCallbackRequest(int refnum, int conditional): JackRequest(JackRequest::kSetTimebaseCallback), fRefNum(refnum), fConditionnal(conditional)
  529. {}
  530. int Read(JackChannelTransaction* trans)
  531. {
  532. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  533. return trans->Read(&fConditionnal, sizeof(int));
  534. }
  535. int Write(JackChannelTransaction* trans)
  536. {
  537. CheckRes(JackRequest::Write(trans));
  538. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  539. return trans->Write(&fConditionnal, sizeof(int));
  540. }
  541. };
  542. /*!
  543. \brief ClientNotification request.
  544. */
  545. struct JackClientNotificationRequest : public JackRequest
  546. {
  547. int fRefNum;
  548. int fNotify;
  549. int fValue;
  550. JackClientNotificationRequest()
  551. {}
  552. JackClientNotificationRequest(int refnum, int notify, int value)
  553. : JackRequest(JackRequest::kNotification), fRefNum(refnum), fNotify(notify), fValue(value)
  554. {}
  555. int Read(JackChannelTransaction* trans)
  556. {
  557. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  558. CheckRes(trans->Read(&fNotify, sizeof(int)));
  559. CheckRes(trans->Read(&fValue, sizeof(int)));
  560. return 0;
  561. }
  562. int Write(JackChannelTransaction* trans)
  563. {
  564. CheckRes(JackRequest::Write(trans));
  565. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  566. CheckRes(trans->Write(&fNotify, sizeof(int)));
  567. CheckRes(trans->Write(&fValue, sizeof(int)));
  568. return 0;
  569. }
  570. };
  571. /*!
  572. \brief ClientNotification.
  573. */
  574. struct JackClientNotification
  575. {
  576. char fName[JACK_CLIENT_NAME_SIZE + 1];
  577. int fRefNum;
  578. int fNotify;
  579. int fValue;
  580. int fSync;
  581. JackClientNotification(): fNotify( -1), fValue( -1)
  582. {}
  583. JackClientNotification(const char* name, int refnum, int notify, int sync, int value)
  584. : fRefNum(refnum), fNotify(notify), fValue(value), fSync(sync)
  585. {
  586. snprintf(fName, sizeof(fName), "%s", name);
  587. }
  588. int Read(JackChannelTransaction* trans)
  589. {
  590. CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1));
  591. CheckRes(trans->Read(&fRefNum, sizeof(int)));
  592. CheckRes(trans->Read(&fNotify, sizeof(int)));
  593. CheckRes(trans->Read(&fValue, sizeof(int)));
  594. CheckRes(trans->Read(&fSync, sizeof(int)));
  595. return 0;
  596. }
  597. int Write(JackChannelTransaction* trans)
  598. {
  599. CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1));
  600. CheckRes(trans->Write(&fRefNum, sizeof(int)));
  601. CheckRes(trans->Write(&fNotify, sizeof(int)));
  602. CheckRes(trans->Write(&fValue, sizeof(int)));
  603. CheckRes(trans->Write(&fSync, sizeof(int)));
  604. return 0;
  605. }
  606. };
  607. } // end of namespace
  608. #endif