ReportCommand.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. /*
  2. * Copyright (c) 2020 Project CHIP Authors
  3. * All rights reserved.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. #pragma once
  19. #include <app/tests/suites/commands/interaction_model/InteractionModel.h>
  20. #include "DataModelLogger.h"
  21. #include "ModelCommand.h"
  22. class ReportCommand : public InteractionModelReports, public ModelCommand, public chip::app::ReadClient::Callback
  23. {
  24. public:
  25. ReportCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) :
  26. InteractionModelReports(this), ModelCommand(commandName, credsIssuerConfig, /* supportsMultipleEndpoints = */ true)
  27. {}
  28. /////////// ReadClient Callback Interface /////////
  29. void OnAttributeData(const chip::app::ConcreteDataAttributePath & path, chip::TLV::TLVReader * data,
  30. const chip::app::StatusIB & status) override
  31. {
  32. CHIP_ERROR error = status.ToChipError();
  33. if (CHIP_NO_ERROR != error)
  34. {
  35. LogErrorOnFailure(RemoteDataModelLogger::LogErrorAsJSON(path, status));
  36. ChipLogError(chipTool, "Response Failure: %s", chip::ErrorStr(error));
  37. mError = error;
  38. return;
  39. }
  40. if (data == nullptr)
  41. {
  42. ChipLogError(chipTool, "Response Failure: No Data");
  43. mError = CHIP_ERROR_INTERNAL;
  44. return;
  45. }
  46. LogErrorOnFailure(RemoteDataModelLogger::LogAttributeAsJSON(path, data));
  47. error = DataModelLogger::LogAttribute(path, data);
  48. if (CHIP_NO_ERROR != error)
  49. {
  50. ChipLogError(chipTool, "Response Failure: Can not decode Data");
  51. mError = error;
  52. return;
  53. }
  54. }
  55. void OnEventData(const chip::app::EventHeader & eventHeader, chip::TLV::TLVReader * data,
  56. const chip::app::StatusIB * status) override
  57. {
  58. if (status != nullptr)
  59. {
  60. CHIP_ERROR error = status->ToChipError();
  61. if (CHIP_NO_ERROR != error)
  62. {
  63. LogErrorOnFailure(RemoteDataModelLogger::LogErrorAsJSON(eventHeader, *status));
  64. ChipLogError(chipTool, "Response Failure: %s", chip::ErrorStr(error));
  65. mError = error;
  66. return;
  67. }
  68. }
  69. if (data == nullptr)
  70. {
  71. ChipLogError(chipTool, "Response Failure: No Data");
  72. mError = CHIP_ERROR_INTERNAL;
  73. return;
  74. }
  75. LogErrorOnFailure(RemoteDataModelLogger::LogEventAsJSON(eventHeader, data));
  76. CHIP_ERROR error = DataModelLogger::LogEvent(eventHeader, data);
  77. if (CHIP_NO_ERROR != error)
  78. {
  79. ChipLogError(chipTool, "Response Failure: Can not decode Data");
  80. mError = error;
  81. return;
  82. }
  83. }
  84. void OnError(CHIP_ERROR error) override
  85. {
  86. LogErrorOnFailure(RemoteDataModelLogger::LogErrorAsJSON(error));
  87. ChipLogProgress(chipTool, "Error: %s", chip::ErrorStr(error));
  88. mError = error;
  89. }
  90. void OnDeallocatePaths(chip::app::ReadPrepareParams && aReadPrepareParams) override
  91. {
  92. InteractionModelReports::OnDeallocatePaths(std::move(aReadPrepareParams));
  93. }
  94. void Shutdown() override
  95. {
  96. // We don't shut down InteractionModelReports here; we leave it for
  97. // Cleanup to handle.
  98. mError = CHIP_NO_ERROR;
  99. ModelCommand::Shutdown();
  100. }
  101. void Cleanup() override { InteractionModelReports::Shutdown(); }
  102. protected:
  103. // Use a 3x-longer-than-default timeout because wildcard reads can take a
  104. // while.
  105. chip::System::Clock::Timeout GetWaitDuration() const override
  106. {
  107. return mTimeout.HasValue() ? chip::System::Clock::Seconds16(mTimeout.Value()) : (ModelCommand::GetWaitDuration() * 3);
  108. }
  109. CHIP_ERROR mError = CHIP_NO_ERROR;
  110. };
  111. class ReadCommand : public ReportCommand
  112. {
  113. protected:
  114. ReadCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) :
  115. ReportCommand(commandName, credsIssuerConfig)
  116. {}
  117. void OnDone(chip::app::ReadClient * aReadClient) override
  118. {
  119. InteractionModelReports::CleanupReadClient(aReadClient);
  120. SetCommandExitStatus(mError);
  121. }
  122. };
  123. class SubscribeCommand : public ReportCommand
  124. {
  125. protected:
  126. SubscribeCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) :
  127. ReportCommand(commandName, credsIssuerConfig)
  128. {}
  129. void OnSubscriptionEstablished(chip::SubscriptionId subscriptionId) override
  130. {
  131. mSubscriptionEstablished = true;
  132. SetCommandExitStatus(CHIP_NO_ERROR);
  133. }
  134. void OnDone(chip::app::ReadClient * aReadClient) override
  135. {
  136. InteractionModelReports::CleanupReadClient(aReadClient);
  137. if (!mSubscriptionEstablished)
  138. {
  139. SetCommandExitStatus(mError);
  140. }
  141. // else we must be getting here from Cleanup(), which means we have
  142. // already done our exit status thing.
  143. }
  144. void Shutdown() override
  145. {
  146. mSubscriptionEstablished = false;
  147. ReportCommand::Shutdown();
  148. }
  149. // For subscriptions we always defer interactive cleanup. Either our
  150. // ReadClients will terminate themselves (in which case they will be removed
  151. // from our list anyway), or they should hang around until shutdown.
  152. bool DeferInteractiveCleanup() override { return true; }
  153. private:
  154. bool mSubscriptionEstablished = false;
  155. };
  156. class ReadAttribute : public ReadCommand
  157. {
  158. public:
  159. ReadAttribute(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-by-id", credsIssuerConfig)
  160. {
  161. AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds,
  162. "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to "
  163. "indicate a wildcard cluster.");
  164. AddAttributeIdArgument();
  165. AddCommonArguments();
  166. ReadCommand::AddArguments();
  167. }
  168. ReadAttribute(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) :
  169. ReadCommand("read-by-id", credsIssuerConfig), mClusterIds(1, clusterId)
  170. {
  171. AddAttributeIdArgument();
  172. AddCommonArguments();
  173. ReadCommand::AddArguments();
  174. }
  175. ReadAttribute(chip::ClusterId clusterId, const char * attributeName, chip::AttributeId attributeId,
  176. CredentialIssuerCommands * credsIssuerConfig) :
  177. ReadCommand("read", credsIssuerConfig),
  178. mClusterIds(1, clusterId), mAttributeIds(1, attributeId)
  179. {
  180. AddArgument("attr-name", attributeName);
  181. AddCommonArguments();
  182. ReadCommand::AddArguments();
  183. }
  184. ~ReadAttribute() {}
  185. CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector<chip::EndpointId> endpointIds) override
  186. {
  187. return ReadCommand::ReadAttribute(device, endpointIds, mClusterIds, mAttributeIds);
  188. }
  189. private:
  190. void AddAttributeIdArgument()
  191. {
  192. AddArgument("attribute-ids", 0, UINT32_MAX, &mAttributeIds,
  193. "Comma-separated list of attribute ids to read (e.g. \"0\" or \"1,0xFFFC,0xFFFD\").\n Allowed to be "
  194. "0xFFFFFFFF to indicate a wildcard attribute.");
  195. }
  196. void AddCommonArguments()
  197. {
  198. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered,
  199. "Boolean indicating whether to do a fabric-filtered read. Defaults to true.");
  200. AddArgument("data-version", 0, UINT32_MAX, &mDataVersions,
  201. "Comma-separated list of data versions for the clusters being read.");
  202. }
  203. std::vector<chip::ClusterId> mClusterIds;
  204. std::vector<chip::AttributeId> mAttributeIds;
  205. };
  206. class SubscribeAttribute : public SubscribeCommand
  207. {
  208. public:
  209. SubscribeAttribute(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-by-id", credsIssuerConfig)
  210. {
  211. AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds,
  212. "Comma-separated list of cluster ids to subscribe to (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF "
  213. "to indicate a wildcard cluster.");
  214. AddAttributeIdArgument();
  215. AddCommonArguments();
  216. SubscribeCommand::AddArguments();
  217. }
  218. SubscribeAttribute(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) :
  219. SubscribeCommand("subscribe-by-id", credsIssuerConfig), mClusterIds(1, clusterId)
  220. {
  221. AddAttributeIdArgument();
  222. AddCommonArguments();
  223. SubscribeCommand::AddArguments();
  224. }
  225. SubscribeAttribute(chip::ClusterId clusterId, const char * attributeName, chip::AttributeId attributeId,
  226. CredentialIssuerCommands * credsIssuerConfig) :
  227. SubscribeCommand("subscribe", credsIssuerConfig),
  228. mClusterIds(1, clusterId), mAttributeIds(1, attributeId)
  229. {
  230. AddArgument("attr-name", attributeName);
  231. AddCommonArguments();
  232. SubscribeCommand::AddArguments();
  233. }
  234. ~SubscribeAttribute() {}
  235. CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector<chip::EndpointId> endpointIds) override
  236. {
  237. return SubscribeCommand::SubscribeAttribute(device, endpointIds, mClusterIds, mAttributeIds);
  238. }
  239. private:
  240. void AddAttributeIdArgument()
  241. {
  242. AddArgument("attribute-ids", 0, UINT32_MAX, &mAttributeIds,
  243. "Comma-separated list of attribute ids to subscribe to (e.g. \"0\" or \"1,0xFFFC,0xFFFD\").\n Allowed to be "
  244. "0xFFFFFFFF to indicate a wildcard attribute.");
  245. }
  246. void AddCommonArguments()
  247. {
  248. AddArgument("min-interval", 0, UINT16_MAX, &mMinInterval,
  249. "Server should not send a new report if less than this number of seconds has elapsed since the last report.");
  250. AddArgument("max-interval", 0, UINT16_MAX, &mMaxInterval,
  251. "Server must send a report if this number of seconds has elapsed since the last report.");
  252. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered,
  253. "Boolean indicating whether to do a fabric-filtered subscription. Defaults to true.");
  254. AddArgument("data-version", 0, UINT32_MAX, &mDataVersions,
  255. "Comma-separated list of data versions for the clusters being subscribed to.");
  256. AddArgument("keepSubscriptions", 0, 1, &mKeepSubscriptions,
  257. "Boolean indicating whether to keep existing subscriptions when creating the new one. Defaults to false.");
  258. AddArgument("auto-resubscribe", 0, 1, &mAutoResubscribe,
  259. "Boolean indicating whether the subscription should auto-resubscribe. Defaults to false.");
  260. }
  261. std::vector<chip::ClusterId> mClusterIds;
  262. std::vector<chip::AttributeId> mAttributeIds;
  263. };
  264. class ReadEvent : public ReadCommand
  265. {
  266. public:
  267. ReadEvent(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-event-by-id", credsIssuerConfig)
  268. {
  269. AddArgument("cluster-id", 0, UINT32_MAX, &mClusterIds);
  270. AddArgument("event-id", 0, UINT32_MAX, &mEventIds);
  271. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered);
  272. AddArgument("event-min", 0, UINT64_MAX, &mEventNumber);
  273. ReadCommand::AddArguments();
  274. }
  275. ReadEvent(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) :
  276. ReadCommand("read-event-by-id", credsIssuerConfig), mClusterIds(1, clusterId)
  277. {
  278. AddArgument("event-id", 0, UINT32_MAX, &mEventIds);
  279. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered);
  280. AddArgument("event-min", 0, UINT64_MAX, &mEventNumber);
  281. ReadCommand::AddArguments();
  282. }
  283. ReadEvent(chip::ClusterId clusterId, const char * eventName, chip::EventId eventId,
  284. CredentialIssuerCommands * credsIssuerConfig) :
  285. ReadCommand("read-event", credsIssuerConfig),
  286. mClusterIds(1, clusterId), mEventIds(1, eventId)
  287. {
  288. AddArgument("event-name", eventName);
  289. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered);
  290. AddArgument("event-min", 0, UINT64_MAX, &mEventNumber);
  291. ReadCommand::AddArguments();
  292. }
  293. ~ReadEvent() {}
  294. CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector<chip::EndpointId> endpointIds) override
  295. {
  296. return ReadCommand::ReadEvent(device, endpointIds, mClusterIds, mEventIds);
  297. }
  298. private:
  299. std::vector<chip::ClusterId> mClusterIds;
  300. std::vector<chip::EventId> mEventIds;
  301. };
  302. class SubscribeEvent : public SubscribeCommand
  303. {
  304. public:
  305. SubscribeEvent(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-event-by-id", credsIssuerConfig)
  306. {
  307. AddArgument("cluster-id", 0, UINT32_MAX, &mClusterIds);
  308. AddArgument("event-id", 0, UINT32_MAX, &mEventIds);
  309. AddCommonArguments();
  310. SubscribeCommand::AddArguments();
  311. }
  312. SubscribeEvent(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) :
  313. SubscribeCommand("subscribe-event-by-id", credsIssuerConfig), mClusterIds(1, clusterId)
  314. {
  315. AddArgument("event-id", 0, UINT32_MAX, &mEventIds);
  316. AddCommonArguments();
  317. SubscribeCommand::AddArguments();
  318. }
  319. SubscribeEvent(chip::ClusterId clusterId, const char * eventName, chip::EventId eventId,
  320. CredentialIssuerCommands * credsIssuerConfig) :
  321. SubscribeCommand("subscribe-event", credsIssuerConfig),
  322. mClusterIds(1, clusterId), mEventIds(1, eventId)
  323. {
  324. AddArgument("event-name", eventName, "Event name.");
  325. AddCommonArguments();
  326. SubscribeCommand::AddArguments();
  327. }
  328. void AddCommonArguments()
  329. {
  330. AddArgument("min-interval", 0, UINT16_MAX, &mMinInterval,
  331. "The requested minimum interval between reports. Sets MinIntervalFloor in the Subscribe Request.");
  332. AddArgument("max-interval", 0, UINT16_MAX, &mMaxInterval,
  333. "The requested maximum interval between reports. Sets MaxIntervalCeiling in the Subscribe Request.");
  334. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered);
  335. AddArgument("event-min", 0, UINT64_MAX, &mEventNumber);
  336. AddArgument("keepSubscriptions", 0, 1, &mKeepSubscriptions,
  337. "false - Terminate existing subscriptions from initiator.\n true - Leave existing subscriptions in place.");
  338. AddArgument(
  339. "is-urgent", 0, 1, &mIsUrgents,
  340. "Sets isUrgent in the Subscribe Request.\n"
  341. " The queueing of any urgent event SHALL force an immediate generation of reports containing all events queued "
  342. "leading up to (and including) the urgent event in question.\n"
  343. " This argument takes a comma separated list of true/false values.\n"
  344. " If the number of paths exceeds the number of entries provided to is-urgent, then isUrgent will be false for the "
  345. "extra paths.");
  346. AddArgument("auto-resubscribe", 0, 1, &mAutoResubscribe,
  347. "Boolean indicating whether the subscription should auto-resubscribe. Defaults to false.");
  348. }
  349. ~SubscribeEvent() {}
  350. CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector<chip::EndpointId> endpointIds) override
  351. {
  352. return SubscribeCommand::SubscribeEvent(device, endpointIds, mClusterIds, mEventIds);
  353. }
  354. private:
  355. std::vector<chip::ClusterId> mClusterIds;
  356. std::vector<chip::EventId> mEventIds;
  357. };
  358. class ReadNone : public ReadCommand
  359. {
  360. public:
  361. ReadNone(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-none", credsIssuerConfig)
  362. {
  363. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered,
  364. "Boolean indicating whether to do a fabric-filtered read. Defaults to true.");
  365. AddArgument("data-versions", 0, UINT32_MAX, &mDataVersions,
  366. "Comma-separated list of data versions for the clusters being read.");
  367. AddArgument("event-min", 0, UINT64_MAX, &mEventNumber);
  368. ReadCommand::AddArguments(true /* skipEndpoints */);
  369. }
  370. ~ReadNone() {}
  371. void OnDone(chip::app::ReadClient * aReadClient) override
  372. {
  373. InteractionModelReports::CleanupReadClient(aReadClient);
  374. SetCommandExitStatus(mError);
  375. }
  376. CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector<chip::EndpointId> endpointIds) override
  377. {
  378. return ReadCommand::ReadNone(device);
  379. }
  380. };
  381. class ReadAll : public ReadCommand
  382. {
  383. public:
  384. ReadAll(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-all", credsIssuerConfig)
  385. {
  386. AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds,
  387. "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to "
  388. "indicate a wildcard cluster.");
  389. AddArgument("attribute-ids", 0, UINT32_MAX, &mAttributeIds,
  390. "Comma-separated list of attribute ids to read (e.g. \"0\" or \"1,0xFFFC,0xFFFD\").\n Allowed to be "
  391. "0xFFFFFFFF to indicate a wildcard attribute.");
  392. AddArgument("event-ids", 0, UINT32_MAX, &mEventIds,
  393. "Comma-separated list of event ids to read (e.g. \"0\" or \"1,2,3\").\n Allowed to be "
  394. "0xFFFFFFFF to indicate a wildcard event.");
  395. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered,
  396. "Boolean indicating whether to do a fabric-filtered read. Defaults to true.");
  397. AddArgument("data-versions", 0, UINT32_MAX, &mDataVersions,
  398. "Comma-separated list of data versions for the clusters being read.");
  399. AddArgument("event-min", 0, UINT64_MAX, &mEventNumber);
  400. ReadCommand::AddArguments();
  401. }
  402. ~ReadAll() {}
  403. void OnDone(chip::app::ReadClient * aReadClient) override
  404. {
  405. InteractionModelReports::CleanupReadClient(aReadClient);
  406. SetCommandExitStatus(mError);
  407. }
  408. CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector<chip::EndpointId> endpointIds) override
  409. {
  410. return ReadCommand::ReadAll(device, endpointIds, mClusterIds, mAttributeIds, mEventIds);
  411. }
  412. private:
  413. std::vector<chip::ClusterId> mClusterIds;
  414. std::vector<chip::AttributeId> mAttributeIds;
  415. std::vector<chip::EventId> mEventIds;
  416. };
  417. class SubscribeNone : public SubscribeCommand
  418. {
  419. public:
  420. SubscribeNone(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-none", credsIssuerConfig)
  421. {
  422. AddArgument("min-interval", 0, UINT16_MAX, &mMinInterval,
  423. "The requested minimum interval between reports. Sets MinIntervalFloor in the Subscribe Request.");
  424. AddArgument("max-interval", 0, UINT16_MAX, &mMaxInterval,
  425. "The requested maximum interval between reports. Sets MaxIntervalCeiling in the Subscribe Request.");
  426. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered,
  427. "Boolean indicating whether to do a fabric-filtered read. Defaults to true.");
  428. AddArgument("event-min", 0, UINT64_MAX, &mEventNumber);
  429. AddArgument("keepSubscriptions", 0, 1, &mKeepSubscriptions,
  430. "false - Terminate existing subscriptions from initiator.\n true - Leave existing subscriptions in place.");
  431. SubscribeCommand::AddArguments(true /* skipEndpoints */);
  432. }
  433. ~SubscribeNone() {}
  434. CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector<chip::EndpointId> endpointIds) override
  435. {
  436. return SubscribeCommand::SubscribeNone(device);
  437. }
  438. };
  439. class SubscribeAll : public SubscribeCommand
  440. {
  441. public:
  442. SubscribeAll(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-all", credsIssuerConfig)
  443. {
  444. AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds,
  445. "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to "
  446. "indicate a wildcard cluster.");
  447. AddArgument("attribute-ids", 0, UINT32_MAX, &mAttributeIds,
  448. "Comma-separated list of attribute ids to read (e.g. \"0\" or \"1,0xFFFC,0xFFFD\").\n Allowed to be "
  449. "0xFFFFFFFF to indicate a wildcard attribute.");
  450. AddArgument("event-ids", 0, UINT32_MAX, &mEventIds,
  451. "Comma-separated list of event ids to read (e.g. \"0\" or \"1,2,3\").\n Allowed to be "
  452. "0xFFFFFFFF to indicate a wildcard event.");
  453. AddArgument("min-interval", 0, UINT16_MAX, &mMinInterval,
  454. "The requested minimum interval between reports. Sets MinIntervalFloor in the Subscribe Request.");
  455. AddArgument("max-interval", 0, UINT16_MAX, &mMaxInterval,
  456. "The requested maximum interval between reports. Sets MaxIntervalCeiling in the Subscribe Request.");
  457. AddArgument("fabric-filtered", 0, 1, &mFabricFiltered,
  458. "Boolean indicating whether to do a fabric-filtered read. Defaults to true.");
  459. AddArgument("event-min", 0, UINT64_MAX, &mEventNumber);
  460. AddArgument("keepSubscriptions", 0, 1, &mKeepSubscriptions,
  461. "false - Terminate existing subscriptions from initiator.\n true - Leave existing subscriptions in place.");
  462. SubscribeCommand::AddArguments();
  463. }
  464. ~SubscribeAll() {}
  465. CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector<chip::EndpointId> endpointIds) override
  466. {
  467. return SubscribeCommand::SubscribeAll(device, endpointIds, mClusterIds, mAttributeIds, mEventIds);
  468. }
  469. private:
  470. std::vector<chip::ClusterId> mClusterIds;
  471. std::vector<chip::AttributeId> mAttributeIds;
  472. std::vector<chip::EventId> mEventIds;
  473. };