Initial plugin "Nest Plugin" for bridging project.
[iotivity.git] / bridging / plugins / nest_plugin / nest_objects / nest.h
1 //******************************************************************
2 //
3 // Copyright 2017 Intel Mobile Communications GmbH All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #ifndef __NEST_H__
22 #define __NEST_H__
23
24 #include <time.h>
25 #include <stdio.h>
26 #include <vector>
27 #include <stdint.h>
28 #include "oic_malloc.h"
29 #include "oic_string.h"
30 #include "nest_defs.h"
31 #include "nest_thermostat.h"
32 #include <string.h>
33
34 using namespace std;
35
36 ///
37 /// @brief This class encapsulates basic Nest functionality and
38 /// the ability to enumerate and retrieve instances of Nest
39 /// devices.
40 ///
41 class Nest
42 {
43 public:
44
45     ///
46     /// @brief Holds an access token.
47     ///
48 #pragma pack(push, 1)
49     typedef struct _ACCESS_TOKEN
50     {
51         char accessToken[NEST_ACCESS_TOKEN_LEN]; // the access token used
52         // in all REST calls
53         char expires[NEST_ACCESS_TOKEN_EXPIRY];  // UTC time when token expires
54         time_t acquiredTime;     // the time the token was aquired
55         // (epoc time-January,1,1970)
56         uint32_t grantTime;        // the time the token is valid for
57         // (seconds)
58
59         _ACCESS_TOKEN()
60          {
61                 bzero(accessToken,sizeof(accessToken));
62                 bzero(expires,sizeof(expires));
63                 acquiredTime=0;
64                 grantTime=0;
65          }
66         _ACCESS_TOKEN(const char * a_token)
67         {
68             OICStrcpy(accessToken, NEST_ACCESS_TOKEN_LEN-1, a_token);
69             memset(expires, 0, NEST_ACCESS_TOKEN_EXPIRY);
70             acquiredTime = 0;
71             grantTime = 0;
72         }
73     } ACCESS_TOKEN;
74 #pragma pack(pop)
75
76     typedef enum
77     {
78         eAWUndefined = 0,                   // undefined
79         eAWHome,                            // home
80         eAWAway,                            // away
81         eAWMax                              // max
82     } AWAY_MODE;
83
84     typedef struct _META_INFO
85     {
86         std::string homeName;           // describes the name/address
87         std::string countryCode;        // country
88         std::string timeZone;           // time zone (e.g. America/Los Angeles
89         std::string structId;           // structure id
90         AWAY_MODE awayMode;           // home / away
91     } META_INFO;
92
93     Nest(const ACCESS_TOKEN &accessToken);
94
95     Nest();
96
97     virtual ~Nest()
98     { }
99
100     ///
101     /// Returns a previously acquired access token value to the Nest client.
102     ///
103     /// @param none.
104     ///
105     std::string getTok();
106
107     ///
108     /// Attempts to obtain an access token given the authorization code. The application
109     /// should have retrieved the authorization code OOB by following the OAuth flow
110     /// after loading the URI returned from getAuthoriizationUrl() method.
111     ///
112     /// @param authorizationCode is a reference to a code retrieved from
113     ///
114     /// @param accessCode is a reference to an ACCESS_TOKEN structure returned
115     /// upon success.
116     ///
117     /// OAuth 2.0 authorization with the Nest API backend.
118     ///
119     int getAccessToken(std::string &authorizationCode, ACCESS_TOKEN &accessToken,
120                            std::string &nest_client_id, std::string &nest_client_secret);
121
122     ///
123     /// Sets a previously acquired access token structure to the Nest client.
124     ///
125     /// @param token is a reference to a valid access token.
126     ///
127     void setAccessToken(const ACCESS_TOKEN &token);
128
129     ///
130     /// Returns the authorization state of the client.
131     ///
132     /// @returns true if the client is authorized to use the devices, otherwise false.
133     ///
134     /// @note use the getAuthorizationUrl to get the required authorizationURL to get
135     /// user approval and an authorizationCode that can be used to exchange for a long
136     /// term access token.
137     ///
138     bool isAuthorized();
139
140     ///
141     /// Returns the device list of thermostats.
142     ///
143     /// @return a SMART_DEV_OK on success, or another SMART_DEV_ on error. On
144     /// success the devices vector will contain the authorized/found thermostats.
145     ///
146     int getThermostats(std::vector<std::shared_ptr<NestThermostat> > &devices);
147
148     ///
149     /// Sets the home/away mode.
150     ///
151     /// @param AWAY_MODE is a reference to the desired away/home mode.
152     ///
153     /// @return SMART_DEV_RESULT_OK on success, or another SMART_DEV_RESULT on
154     /// error.
155     ///
156     int setAwayMode(const AWAY_MODE &awayMode);
157
158 private:
159
160     int parseDevJsonResponse(std::string &json, std::vector<std::shared_ptr<NestThermostat> > &device);
161
162     int parseStructureJsonResponse(std::string &json, META_INFO &meta);
163
164     AWAY_MODE getAwayMode(const char *value) const;
165
166     ACCESS_TOKEN m_accessToken;
167     META_INFO m_metaInfo;
168     bool m_isAuthorized;
169 };
170
171 #endif /* __NEST_H__ */