Receive client's request at each thread
[platform/core/appfw/pkgmgr-info.git] / src / server / pkg_request.cc
index e88788a..e018219 100644 (file)
 
 #include "pkg_request.hh"
 
+#include "utils/logging.hh"
+
+#include "pkgmgrinfo_debug.h"
+
 namespace pkgmgr_server {
 
+PkgRequest::PkgRequest()
+    : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1),
+        privilege_checked_(false) {}
+
 PkgRequest::PkgRequest(int fd)
-    : fd_(fd) {}
+    : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1),
+        privilege_checked_(false) {
+  socket_ = std::unique_ptr<pkgmgr_common::socket::DataSocket>(
+      new (std::nothrow) pkgmgr_common::socket::DataSocket(fd));
+  if (socket_ == nullptr)
+    LOG(ERROR) << "Out of memory";
+}
+
+PkgRequest::~PkgRequest() {
+  if (data_ != nullptr)
+    delete[] data_;
+}
+
+const unsigned char* PkgRequest::GetData() {
+  return data_;
+}
+
+int PkgRequest::GetSize() {
+  return data_size_;
+}
+
+int PkgRequest::GetFd() {
+  return socket_->GetFd();
+}
+
+pid_t PkgRequest::GetSenderPID() {
+  return socket_->GetPID();
+}
+
+uid_t PkgRequest::GetSenderUID() {
+  return socket_->GetUID();
+}
+
+pkgmgr_common::ReqType PkgRequest::GetRequestType() {
+  return request_type_;
+}
+
+bool PkgRequest::ReceiveData() {
+  int ret = socket_->ReceiveData(&request_type_, sizeof(request_type_));
+  if (ret < 0 || request_type_ == pkgmgr_common::REQ_TYPE_NONE) {
+    LOG(ERROR) << "Failed to ReceiveData";
+    return false;
+  }
+  ret = socket_->ReceiveData(&data_size_, sizeof(data_size_));
+  if (ret < 0) {
+    LOG(ERROR) << "Failed to ReceiveData";
+    request_type_ = pkgmgr_common::REQ_TYPE_NONE;
+    return false;
+  }
+  if (data_size_ <= 0) {
+    LOG(ERROR) << "Invalid data";
+    request_type_ = pkgmgr_common::REQ_TYPE_NONE;
+    return false;
+  }
+
+  data_ = new (std::nothrow) unsigned char[data_size_];
+  if (data_ == nullptr) {
+    LOG(ERROR) << "Out of memory";
+    request_type_ = pkgmgr_common::REQ_TYPE_NONE;
+    return false;
+  }
+  ret = socket_->ReceiveData(reinterpret_cast<void*>(data_), data_size_);
+  if (ret < 0) {
+    LOG(ERROR) << "Failed to ReceiveData";
+    delete[] data_;
+    data_ = nullptr;
+    request_type_ = pkgmgr_common::REQ_TYPE_NONE;
+    return false;
+  }
+
+  return true;
+}
+
+bool PkgRequest::SendData(unsigned char* data, int size) {
+  if (socket_->SendData(&size, sizeof(size)) < 0)
+    return false;
 
-char* PkgRequest::GetData() { return nullptr; }
+  return (socket_->SendData(data, size) == 0);
+}
 
-bool PkgRequest::ReceiveData() { return true; }
+bool PkgRequest::GetPrivilegeChecked() {
+  return privilege_checked_;
+}
 
-bool PkgRequest::SendData(char* data) { return true; }
+void PkgRequest::SetPrivilegeChecked(bool checked) {
+  privilege_checked_ = checked;
+}
 
 }  // namespace pkgmgr_server