1059e2335SDeepak Kodihalli #pragma once
2059e2335SDeepak Kodihalli 
3059e2335SDeepak Kodihalli #include <systemd/sd-event.h>
4059e2335SDeepak Kodihalli 
5b0ce996aSGunnar Mills #include <functional>
6*9155b713SAndrew Geissler #include <string>
7b0ce996aSGunnar Mills 
8059e2335SDeepak Kodihalli namespace phosphor
9059e2335SDeepak Kodihalli {
10059e2335SDeepak Kodihalli namespace software
11059e2335SDeepak Kodihalli {
12059e2335SDeepak Kodihalli namespace manager
13059e2335SDeepak Kodihalli {
14059e2335SDeepak Kodihalli 
15059e2335SDeepak Kodihalli /** @class Watch
16059e2335SDeepak Kodihalli  *
17059e2335SDeepak Kodihalli  *  @brief Adds inotify watch on software image upload directory
18059e2335SDeepak Kodihalli  *
19059e2335SDeepak Kodihalli  *  The inotify watch is hooked up with sd-event, so that on call back,
20059e2335SDeepak Kodihalli  *  appropriate actions related to a software image upload can be taken.
21059e2335SDeepak Kodihalli  */
22059e2335SDeepak Kodihalli class Watch
23059e2335SDeepak Kodihalli {
24059e2335SDeepak Kodihalli   public:
25059e2335SDeepak Kodihalli     /** @brief ctor - hook inotify watch with sd-event
26059e2335SDeepak Kodihalli      *
27059e2335SDeepak Kodihalli      *  @param[in] loop - sd-event object
283027bba9SGunnar Mills      *  @param[in] imageCallback - The callback function for processing
293027bba9SGunnar Mills      *                             the image
30059e2335SDeepak Kodihalli      */
312285fe0fSAdriana Kobylak     Watch(sd_event* loop, std::function<int(std::string&)> imageCallback);
32059e2335SDeepak Kodihalli 
33059e2335SDeepak Kodihalli     Watch(const Watch&) = delete;
34059e2335SDeepak Kodihalli     Watch& operator=(const Watch&) = delete;
359953e69bSGunnar Mills     Watch(Watch&&) = delete;
369953e69bSGunnar Mills     Watch& operator=(Watch&&) = delete;
37059e2335SDeepak Kodihalli 
38059e2335SDeepak Kodihalli     /** @brief dtor - remove inotify watch and close fd's
39059e2335SDeepak Kodihalli      */
40059e2335SDeepak Kodihalli     ~Watch();
41059e2335SDeepak Kodihalli 
42059e2335SDeepak Kodihalli   private:
43059e2335SDeepak Kodihalli     /** @brief sd-event callback
44059e2335SDeepak Kodihalli      *
45059e2335SDeepak Kodihalli      *  @param[in] s - event source, floating (unused) in our case
46059e2335SDeepak Kodihalli      *  @param[in] fd - inotify fd
47059e2335SDeepak Kodihalli      *  @param[in] revents - events that matched for fd
48059e2335SDeepak Kodihalli      *  @param[in] userdata - pointer to Watch object
49059e2335SDeepak Kodihalli      *  @returns 0 on success, -1 on fail
50059e2335SDeepak Kodihalli      */
512285fe0fSAdriana Kobylak     static int callback(sd_event_source* s, int fd, uint32_t revents,
52059e2335SDeepak Kodihalli                         void* userdata);
53059e2335SDeepak Kodihalli 
54059e2335SDeepak Kodihalli     /** @brief image upload directory watch descriptor */
55059e2335SDeepak Kodihalli     int wd = -1;
56059e2335SDeepak Kodihalli 
57059e2335SDeepak Kodihalli     /** @brief inotify file descriptor */
58059e2335SDeepak Kodihalli     int fd = -1;
593027bba9SGunnar Mills 
603027bba9SGunnar Mills     /** @brief The callback function for processing the image. */
613027bba9SGunnar Mills     std::function<int(std::string&)> imageCallback;
62059e2335SDeepak Kodihalli };
63059e2335SDeepak Kodihalli 
64059e2335SDeepak Kodihalli } // namespace manager
65059e2335SDeepak Kodihalli } // namespace software
66059e2335SDeepak Kodihalli } // namespace phosphor
67