#include "ocstack.h"
+#define VERIFY_NON_EMPTY(arg, log_message, ret) \
+ if ((arg).empty()) \
+ { \
+ oclog() << log_message << std::flush; \
+ return result_guard(ret); \
+ } \
+
namespace OC {
using OC::result_guard;
OCAccountManager::OCAccountManager(std::weak_ptr<IClientWrapper> clientWrapper,
const std::string& host,
OCConnectivityType connectivityType)
- : m_clientWrapper(clientWrapper), m_host(host), m_connType(connectivityType),
- m_invitationObserveHandle(nullptr)
+ : m_clientWrapper(clientWrapper), m_host(host), m_userUuid(""),
+ m_invitationObserveHandle(nullptr), m_groupObserveHandle(nullptr), m_connType(connectivityType)
{
if (m_host.empty() || m_clientWrapper.expired())
{
}
m_deviceID.append(di);
- m_groupObserveHandles = {};
checked_guard(m_clientWrapper.lock(), &IClientWrapper::GetDefaultQos, m_defaultQos);
}
const QueryParamsMap& options,
PostCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(authProvider, "authProvider cannot be empty.", OC_STACK_INVALID_PARAM);
+ VERIFY_NON_EMPTY(authCode, "authCode cannot be empty.", OC_STACK_INVALID_PARAM);
+
std::string uri = m_host + OC_RSRVD_ACCOUNT_URI;
OCRepresentation rep;
- rep.setValue(OC_RSRVD_DEVICE_ID, m_deviceID);
- rep.setValue(OC_RSRVD_AUTHPROVIDER, authProvider);
- rep.setValue(OC_RSRVD_AUTHCODE, authCode);
+ rep.setValue<std::string>(OC_RSRVD_DEVICE_ID, m_deviceID);
+ rep.setValue<std::string>(OC_RSRVD_AUTHPROVIDER, authProvider);
+ rep.setValue<std::string>(OC_RSRVD_AUTHCODE, authCode);
if (!options.empty())
{
- OCRepresentation optionsRep;
for (auto iter : options)
{
- optionsRep[iter.first] = iter.second;
+ rep.setValue(iter.first, iter.second);
}
- rep.setValue(OC_RSRVD_OPTIONS, optionsRep);
}
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
const std::string& accessToken,
PostCallback cloudConnectHandler)
{
- return result_guard(signInOut(userUuid, accessToken, true, cloudConnectHandler));
+ VERIFY_NON_EMPTY(userUuid, "userUuid cannot be empty.", OC_STACK_INVALID_PARAM);
+ VERIFY_NON_EMPTY(accessToken, "accessToken cannot be empty.", OC_STACK_INVALID_PARAM);
+
+ OCStackResult result = result_guard(signInOut(userUuid, accessToken, true,
+ cloudConnectHandler));
+ if (OC_STACK_OK == result)
+ {
+ m_userUuid = userUuid;
+ }
+
+ return result;
}
-OCStackResult OCAccountManager::signOut(PostCallback cloudConnectHandler)
+OCStackResult OCAccountManager::signOut(const std::string& accessToken,
+ PostCallback cloudConnectHandler)
{
- return result_guard(signInOut("", "", false, cloudConnectHandler));
+ VERIFY_NON_EMPTY(m_userUuid, "Need to sign-in first.", OC_STACK_ERROR);
+ VERIFY_NON_EMPTY(accessToken, "accessToken cannot be empty.", OC_STACK_INVALID_PARAM);
+
+ OCStackResult result = result_guard(signInOut(m_userUuid, accessToken, false,
+ cloudConnectHandler));
+ if (OC_STACK_OK == result)
+ {
+ m_userUuid = "";
+ }
+
+ return result;
}
OCStackResult OCAccountManager::signInOut(const std::string& userUuid,
std::string uri = m_host + OC_RSRVD_ACCOUNT_SESSION_URI;
OCRepresentation rep;
+
if (isSignIn)
{
- rep.setValue(OC_RSRVD_USER_UUID, userUuid);
- rep.setValue(OC_RSRVD_DEVICE_ID, m_deviceID);
- rep.setValue(OC_RSRVD_ACCESS_TOKEN, accessToken);
+ rep.setValue<std::string>(OC_RSRVD_USER_UUID, userUuid);
}
- rep.setValue(OC_RSRVD_LOGIN, isSignIn);
+ rep.setValue<std::string>(OC_RSRVD_DEVICE_ID, m_deviceID);
+ rep.setValue<std::string>(OC_RSRVD_ACCESS_TOKEN, accessToken);
+ rep.setValue<bool>(OC_RSRVD_LOGIN, isSignIn);
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
OCDevAddr(), uri, rep, QueryParamsMap(), HeaderOptions(),
const std::string& refreshToken,
PostCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(userUuid, "userUuid cannot be empty.", OC_STACK_INVALID_PARAM);
+ VERIFY_NON_EMPTY(refreshToken, "refreshToken cannot be empty.", OC_STACK_INVALID_PARAM);
+
std::string uri = m_host + OC_RSRVD_ACCOUNT_TOKEN_REFRESH_URI;
OCRepresentation rep;
- rep.setValue(OC_RSRVD_USER_UUID, userUuid);
- rep.setValue(OC_RSRVD_DEVICE_ID, m_deviceID);
- rep.setValue(OC_RSRVD_GRANT_TYPE, std::string(OC_RSRVD_GRANT_TYPE_REFRESH_TOKEN));
- rep.setValue(OC_RSRVD_REFRESH_TOKEN, refreshToken);
+ rep.setValue<std::string>(OC_RSRVD_USER_UUID, userUuid);
+ rep.setValue<std::string>(OC_RSRVD_DEVICE_ID, m_deviceID);
+ rep.setValue<std::string>(OC_RSRVD_GRANT_TYPE, std::string(OC_RSRVD_GRANT_TYPE_REFRESH_TOKEN));
+ rep.setValue<std::string>(OC_RSRVD_REFRESH_TOKEN, refreshToken);
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
OCDevAddr(), uri, rep, QueryParamsMap(), HeaderOptions(),
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::searchUser(const std::string& userUuid,
- GetCallback cloudConnectHandler)
-{
- return result_guard(searchUser(userUuid, QueryParamsMap(), cloudConnectHandler));
-}
-
OCStackResult OCAccountManager::searchUser(const QueryParamsMap& queryParams,
GetCallback cloudConnectHandler)
{
- return result_guard(searchUser("", queryParams, cloudConnectHandler));
-}
-
-OCStackResult OCAccountManager::searchUser(const std::string& userUuid,
- const QueryParamsMap& queryParams,
- GetCallback cloudConnectHandler)
-{
- std::string uri = m_host + OC_RSRVD_ACCOUNT_URI;
-
- QueryParamsMap fullQuery = {};
-
- if (!userUuid.empty())
- {
- fullQuery.insert(std::make_pair(OC_RSRVD_USER_UUID, userUuid));
- }
+ VERIFY_NON_EMPTY(queryParams, "queryParams cannot be empty.", OC_STACK_INVALID_PARAM);
- if (!queryParams.empty())
- {
- std::string searchQuery;
- for (auto iter : queryParams)
- {
- searchQuery.append(iter.first + ":" + iter.second + ",");
- }
- searchQuery.resize(searchQuery.size() - 1);
- fullQuery.insert(std::make_pair(OC_RSRVD_SEARCH, searchQuery));
- }
+ std::string uri = m_host + OC_RSRVD_ACCOUNT_SEARCH_URI;
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::GetResourceRepresentation,
- OCDevAddr(), uri, fullQuery, HeaderOptions(),
+ OCDevAddr(), uri, queryParams, HeaderOptions(),
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::deleteDevice(const std::string& deviceId,
+OCStackResult OCAccountManager::deleteDevice(const std::string& accessToken,
+ const std::string& deviceId,
DeleteCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(accessToken, "accessToken cannot be empty.", OC_STACK_INVALID_PARAM);
+ VERIFY_NON_EMPTY(deviceId, "deviceId cannot be empty.", OC_STACK_INVALID_PARAM);
+
std::string uri = m_host + OC_RSRVD_ACCOUNT_URI
- + "?" + OC_RSRVD_DEVICE_ID + "=" + deviceId;
+ + "?" + OC_RSRVD_ACCESS_TOKEN + "=" + accessToken
+ + ";" + OC_RSRVD_DEVICE_ID + "=" + deviceId;
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::DeleteResource,
OCDevAddr(), uri, HeaderOptions(),
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::createGroup(AclGroupType groupType,
+OCStackResult OCAccountManager::createGroup(PostCallback cloudConnectHandler)
+{
+ return result_guard(createGroup(QueryParamsMap(), cloudConnectHandler));
+}
+
+OCStackResult OCAccountManager::createGroup(const QueryParamsMap& queryParams,
PostCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(m_userUuid, "Need to sign-in first.", OC_STACK_ERROR);
+
std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI;
- std::string gtype;
- switch (groupType)
+ std::vector<std::string> members{m_userUuid};
+
+ OCRepresentation rep;
+ rep.setValue<std::string>(OC_RSRVD_OWNER, m_userUuid);
+ rep.setValue<std::vector<std::string>>(OC_RSRVD_MEMBERS, members);
+
+ if (!queryParams.empty())
{
- case AclGroupType::PUBLIC:
- gtype = OC_RSRVD_PUBLIC;
- break;
- case AclGroupType::PRIVATE:
- gtype = OC_RSRVD_PRIVATE;
- break;
- default:
- return result_guard(OC_STACK_INVALID_PARAM);
+ for (auto iter : queryParams)
+ {
+ rep.setValue(iter.first, iter.second);
+ }
}
- OCRepresentation rep;
- rep.setValue(OC_RSRVD_GROUP_TYPE, gtype);
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
OCDevAddr(), uri, rep, QueryParamsMap(), HeaderOptions(),
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::getGroupList(GetCallback cloudConnectHandler)
-{
- std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI;
-
- return checked_guard(m_clientWrapper.lock(), &IClientWrapper::GetResourceRepresentation,
- OCDevAddr(), uri, QueryParamsMap(), HeaderOptions(),
- m_connType, cloudConnectHandler, m_defaultQos);
-}
-
OCStackResult OCAccountManager::deleteGroup(const std::string& groupId,
DeleteCallback cloudConnectHandler)
{
- std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI
- + "?" + OC_RSRVD_GROUP_ID + "=" + groupId;
+ VERIFY_NON_EMPTY(m_userUuid, "Need to sign-in first.", OC_STACK_ERROR);
+ VERIFY_NON_EMPTY(groupId, "groupId cannot be empty.", OC_STACK_INVALID_PARAM);
+
+ std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI + "/" + groupId
+ + "?" + OC_RSRVD_OWNER + "=" + m_userUuid;
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::DeleteResource,
OCDevAddr(), uri, HeaderOptions(),
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::joinGroup(const std::string& groupId,
- PostCallback cloudConnectHandler)
-{
- std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI + "/" + groupId;
-
- return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
- OCDevAddr(), uri, OCRepresentation(), QueryParamsMap(), HeaderOptions(),
- m_connType, cloudConnectHandler, m_defaultQos);
-}
-
-OCStackResult OCAccountManager::addDeviceToGroup(const std::string& groupId,
- const std::vector<std::string>& deviceId,
- PostCallback cloudConnectHandler)
+OCStackResult OCAccountManager::getGroupInfoAll(GetCallback cloudConnectHandler)
{
- if (deviceId.empty())
- {
- return result_guard(OC_STACK_INVALID_PARAM);
- }
+ VERIFY_NON_EMPTY(m_userUuid, "Need to sign-in first.", OC_STACK_ERROR);
- std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI + "/" + groupId;
+ std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI;
- OCRepresentation rep;
- rep.setValue<std::vector<std::string>>(std::string(OC_RSRVD_DEVICE_ID_LIST), deviceId);
+ QueryParamsMap query = {};
+ query.insert(std::make_pair(OC_RSRVD_MEMBERS, m_userUuid));
- return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
- OCDevAddr(), uri, rep, QueryParamsMap(), HeaderOptions(),
- m_connType, cloudConnectHandler, m_defaultQos);
+ return checked_guard(m_clientWrapper.lock(), &IClientWrapper::GetResourceRepresentation,
+ OCDevAddr(), uri, query, HeaderOptions(), m_connType,
+ cloudConnectHandler, m_defaultQos);
}
OCStackResult OCAccountManager::getGroupInfo(const std::string& groupId,
GetCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(m_userUuid, "Need to sign-in first.", OC_STACK_ERROR);
+ VERIFY_NON_EMPTY(groupId, "groupId cannot be empty.", OC_STACK_INVALID_PARAM);
+
std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI + "/" + groupId;
+ QueryParamsMap query = {};
+ query.insert(std::make_pair(OC_RSRVD_MEMBERS, m_userUuid));
+
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::GetResourceRepresentation,
- OCDevAddr(), uri, QueryParamsMap(), HeaderOptions(),
+ OCDevAddr(), uri, query, HeaderOptions(),
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::leaveGroup(const std::string& groupId,
- DeleteCallback cloudConnectHandler)
+OCStackResult OCAccountManager::addPropertyValueToGroup(const std::string& groupId,
+ const OCRepresentation propertyValue,
+ PostCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(groupId, "groupId cannot be empty.", OC_STACK_INVALID_PARAM);
+
std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI + "/" + groupId;
- return checked_guard(m_clientWrapper.lock(), &IClientWrapper::DeleteResource,
- OCDevAddr(), uri, HeaderOptions(),
+ QueryParamsMap query = {};
+ query.insert(std::make_pair(OC_RSRVD_OPERATION, OC_RSRVD_ADD));
+
+ return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
+ OCDevAddr(), uri, propertyValue, query, HeaderOptions(),
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::deleteDeviceFromGroup(const std::string& groupId,
- const std::vector<std::string>& deviceId,
- DeleteCallback cloudConnectHandler)
+OCStackResult OCAccountManager::deletePropertyValueFromGroup(const std::string& groupId,
+ const OCRepresentation propertyValue,
+ PostCallback cloudConnectHandler)
{
- if (deviceId.empty())
- {
- return result_guard(OC_STACK_INVALID_PARAM);
- }
+ VERIFY_NON_EMPTY(groupId, "groupId cannot be empty.", OC_STACK_INVALID_PARAM);
std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI + "/" + groupId;
+ QueryParamsMap query = {};
+ query.insert(std::make_pair(OC_RSRVD_OPERATION, OC_RSRVD_DELETE));
- uri.append("?");
- for (auto iter : deviceId)
- {
- uri.append((std::string)OC_RSRVD_DEVICE_ID_LIST + "=" + iter + ";");
- }
- uri.resize(uri.size() - 1);
-
- return checked_guard(m_clientWrapper.lock(), &IClientWrapper::DeleteResource,
- OCDevAddr(), uri, HeaderOptions(),
+ return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
+ OCDevAddr(), uri, propertyValue, query, HeaderOptions(),
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::observeGroup(const std::string& groupId,
- ObserveCallback cloudConnectHandler)
+OCStackResult OCAccountManager::updatePropertyValueOnGroup(const std::string& groupId,
+ const OCRepresentation propertyValue,
+ PostCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(groupId, "groupId cannot be empty.", OC_STACK_INVALID_PARAM);
+
std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI + "/" + groupId;
- OCDoHandle handle = nullptr;
+ return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
+ OCDevAddr(), uri, propertyValue, QueryParamsMap(), HeaderOptions(),
+ m_connType, cloudConnectHandler, m_defaultQos);
+}
- OCStackResult result = checked_guard(m_clientWrapper.lock(), &IClientWrapper::ObserveResource,
- ObserveType::Observe, &handle, OCDevAddr(), uri,
- QueryParamsMap(), HeaderOptions(), cloudConnectHandler,
- m_defaultQos);
+OCStackResult OCAccountManager::observeGroup(ObserveCallback cloudConnectHandler)
+{
+ VERIFY_NON_EMPTY(m_userUuid, "Need to sign-in first.", OC_STACK_ERROR);
- if (OC_STACK_OK == result)
- {
- m_groupObserveHandles.insert(std::pair<std::string, OCDoHandle>(groupId, handle));
- }
+ std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI;
- return result;
+ QueryParamsMap query = {};
+ query.insert(std::make_pair(OC_RSRVD_MEMBERS, m_userUuid));
+ return checked_guard(m_clientWrapper.lock(), &IClientWrapper::ObserveResource,
+ ObserveType::Observe, &m_groupObserveHandle, OCDevAddr(), uri,
+ query, HeaderOptions(), cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::cancelObserveGroup(const std::string& groupId)
+OCStackResult OCAccountManager::cancelObserveGroup()
{
- auto found = m_groupObserveHandles.find(groupId);
- if (m_groupObserveHandles.end() == found)
+ VERIFY_NON_EMPTY(m_userUuid, "Need to sign-in first.", OC_STACK_ERROR);
+
+ if (nullptr == m_groupObserveHandle)
{
+ oclog() << "observeGroup() has not been done." << std::flush;
return result_guard(OC_STACK_INVALID_PARAM);
}
- OCDoHandle handle = found->second;
-
- std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI + "/" + groupId;
+ std::string uri = m_host + OC_RSRVD_ACL_GROUP_URI
+ + "?" + OC_RSRVD_MEMBERS + "=" + m_userUuid;
OCStackResult result = checked_guard(m_clientWrapper.lock(),
- &IClientWrapper::CancelObserveResource, handle,
- (const char*)"", uri, HeaderOptions(), m_defaultQos);
-
+ &IClientWrapper::CancelObserveResource,
+ m_groupObserveHandle, (const char*)"", uri,
+ HeaderOptions(), m_defaultQos);
if (OC_STACK_OK == result)
{
- m_groupObserveHandles.erase(groupId);
- handle = nullptr;
+ m_groupObserveHandle = nullptr;
}
return result;
{
if (nullptr == m_invitationObserveHandle)
{
+ oclog() << "observeInvitation() has not been done." << std::flush;
return result_guard(OC_STACK_INVALID_PARAM);
}
&IClientWrapper::CancelObserveResource,
m_invitationObserveHandle,
(const char*)"", uri, HeaderOptions(), m_defaultQos);
-
if (OC_STACK_OK == result)
{
m_invitationObserveHandle = nullptr;
const std::string& userUuid,
PostCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(m_userUuid, "Need to sign-in first.", OC_STACK_ERROR);
+ VERIFY_NON_EMPTY(groupId, "groupId cannot be empty.", OC_STACK_INVALID_PARAM);
+ VERIFY_NON_EMPTY(userUuid, "userUuid cannot be empty.", OC_STACK_INVALID_PARAM);
+
std::string uri = m_host + OC_RSRVD_ACL_INVITE_URI;
OCRepresentation invitation;
- invitation.setValue(OC_RSRVD_GROUP_ID, groupId);
- invitation.setValue(OC_RSRVD_MEMBER_ID, userUuid);
+ invitation.setValue<std::string>(OC_RSRVD_GROUP_ID, groupId);
+ invitation.setValue<std::string>(OC_RSRVD_MEMBER_ID, userUuid);
std::vector<OCRepresentation> invite{invitation};
OCRepresentation rep;
- rep.setValue(OC_RSRVD_INVITE, invite);
+ rep.setValue<std::string>(OC_RSRVD_USER_UUID, m_userUuid);
+ rep.setValue<std::vector<OCRepresentation>>(OC_RSRVD_INVITE, invite);
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::PostResourceRepresentation,
OCDevAddr(), uri, rep, QueryParamsMap(), HeaderOptions(),
const std::string& userUuid,
DeleteCallback cloudConnectHandler)
{
+ VERIFY_NON_EMPTY(groupId, "groupId cannot be empty.", OC_STACK_INVALID_PARAM);
+ VERIFY_NON_EMPTY(userUuid, "userUuid cannot be empty.", OC_STACK_INVALID_PARAM);
+
std::string uri = m_host + OC_RSRVD_ACL_INVITE_URI + "?" + OC_RSRVD_GROUP_ID + "=" + groupId
+ ";" + OC_RSRVD_MEMBER_ID + "=" + userUuid;
m_connType, cloudConnectHandler, m_defaultQos);
}
-OCStackResult OCAccountManager::deleteInvitation(const std::string& groupId,
- DeleteCallback cloudConnectHandler)
+OCStackResult OCAccountManager::replyToInvitation(const std::string& groupId,
+ const bool accept,
+ DeleteCallback cloudConnectHandler)
{
- std::string uri = m_host + OC_RSRVD_ACL_INVITE_URI + "?" + OC_RSRVD_GROUP_ID + "=" + groupId;
+ VERIFY_NON_EMPTY(groupId, "groupId cannot be empty.", OC_STACK_INVALID_PARAM);
+
+ std::string isAccept = accept ? "1" : "0";
+
+ std::string uri = m_host + OC_RSRVD_ACL_INVITE_URI + "?" + OC_RSRVD_GROUP_ID + "=" + groupId
+ + ";" + OC_RSRVD_ACCEPT + "=" + isAccept;
return checked_guard(m_clientWrapper.lock(), &IClientWrapper::DeleteResource,
OCDevAddr(), uri, HeaderOptions(),