#include <cstring>
-#include <iostream>
-
namespace pkgmgr_common {
namespace parcel {
parcel->WriteCString(str);
}
+void AbstractParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+ WriteInt(parcel, type_);
+ WriteInt(parcel, uid_);
+}
+
+void AbstractParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
+ int uid, type;
+ ReadInt(parcel, &type);
+ ReadInt(parcel, &uid);
+
+ uid_ = uid;
+ type_ = static_cast<ParcelableType>(type);
+}
+
uid_t AbstractParcelable::GetUid() { return uid_; }
void AbstractParcelable::SetUid(uid_t uid) { uid_ = uid; }
enum ParcelableType {
Unknown = -1,
- AppCtrlPrivInfo,
AppInfo,
CertInfo,
- DataCtrlInfo,
Filter,
PkgInfo,
Query,
+ Result,
};
class EXPORT_API AbstractParcelable : public tizen_base::Parcelable {
void SetUid(uid_t uid);
ParcelableType GetType();
+ void WriteToParcel(tizen_base::Parcel* parcel) const override;
+ void ReadFromParcel(tizen_base::Parcel* parcel) override;
+
protected:
bool ReadString(tizen_base::Parcel* parcel, char **val);
bool ReadInt(tizen_base::Parcel* parcel, int *val);
}
}
+AppInfoParcelable::AppInfoParcelable()
+ : AbstractParcelable(0, ParcelableType::AppInfo) {}
+
AppInfoParcelable::AppInfoParcelable(std::vector<application_x *>&& app_list)
: app_list_(std::move(app_list)) {}
}
void AppInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+ AbstractParcelable::WriteToParcel(parcel);
WriteInt(parcel, app_list_.size());
for (const auto app : app_list_) {
}
void AppInfoParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
+ AbstractParcelable::ReadFromParcel(parcel);
int len = 0;
+
ReadInt(parcel, &len);
for (int i = 0; i < len ; ++i) {
std::unique_ptr<AbstractParcelable> CreateParcel();
};
- AppInfoParcelable() = default;
+ AppInfoParcelable();
AppInfoParcelable(std::vector<application_x *>&& app_list);
~AppInfoParcelable();
const std::vector<application_x *>& GetAppInfo();
namespace pkgmgr_common {
namespace parcel {
+CertInfoParcelable::CertInfoParcelable()
+ : AbstractParcelable(0, ParcelableType::CertInfo), cert_info_(nullptr) {}
+
CertInfoParcelable::CertInfoParcelable(uid_t uid, pkgmgr_certinfo_x *cert_info)
: AbstractParcelable(uid, ParcelableType::CertInfo),
cert_info_(cert_info) {}
}
void CertInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+ AbstractParcelable::WriteToParcel(parcel);
WriteCertInfo(parcel, cert_info_);
}
void CertInfoParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
+ AbstractParcelable::ReadFromParcel(parcel);
ReadCertInfo(parcel);
}
bool CertInfoParcelable::WriteCertInfo(tizen_base::Parcel* parcel, pkgmgr_certinfo_x *cert_info) const {
+ if (cert_info == nullptr) {
+ parcel->WriteBool(true);
+ return true;
+ }
+ parcel->WriteBool(false);
WriteInt(parcel, cert_info->for_all_users);
WriteString(parcel, cert_info->pkgid);
WriteString(parcel, cert_info->cert_value);
}
void CertInfoParcelable::ReadCertInfo(tizen_base::Parcel* parcel) {
+ bool is_null = false;
+ if (parcel->ReadBool(&is_null) != TIZEN_ERROR_NONE)
+ return;
+
+ if (is_null)
+ return;
+
cert_info_ = reinterpret_cast<pkgmgr_certinfo_x *>(calloc(1, sizeof(pkgmgr_certinfo_x)));
ReadInt(parcel, &cert_info_->for_all_users);
ReadString(parcel, &cert_info_->pkgid);
std::unique_ptr<AbstractParcelable> CreateParcel();
};
- CertInfoParcelable() : cert_info_(nullptr) {}
+ CertInfoParcelable();
CertInfoParcelable(uid_t uid, pkgmgr_certinfo_x *cert_info);
~CertInfoParcelable();
const pkgmgr_certinfo_x *GetCertInfo();
namespace pkgmgr_common {
namespace parcel {
+FilterParcelable::FilterParcelable() :
+ AbstractParcelable(0, ParcelableType::Filter),
+ uid_(0), filter_(nullptr), flag_(0) {}
+
FilterParcelable::FilterParcelable(uid_t uid, pkgmgrinfo_filter_x *filter,
int flag) : AbstractParcelable(uid, ParcelableType::Filter),
filter_(filter), flag_(flag) {}
}
void FilterParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+ AbstractParcelable::WriteToParcel(parcel);
WriteInt(parcel, flag_);
WriteFilter(parcel, filter_);
}
void FilterParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
+ AbstractParcelable::ReadFromParcel(parcel);
ReadInt(parcel, &flag_);
ReadFilter(parcel);
}
bool FilterParcelable::WriteFilter(
tizen_base::Parcel* parcel, pkgmgrinfo_filter_x *filter) const {
+ if (filter == nullptr) {
+ parcel->WriteBool(true);
+ return true;
+ }
+ parcel->WriteBool(false);
WriteInt(parcel, filter->uid);
WriteInt(parcel, g_slist_length(filter->list));
}
void FilterParcelable::ReadFilter(tizen_base::Parcel* parcel) {
+ bool is_null = false;
int val = 0;
+ if (parcel->ReadBool(&is_null) != TIZEN_ERROR_NONE)
+ return;
+
+ if (is_null)
+ return;
+
filter_ = reinterpret_cast<pkgmgrinfo_filter_x *>(
calloc(1, sizeof(pkgmgrinfo_filter_x)));
ReadInt(parcel, &val);
std::unique_ptr<AbstractParcelable> CreateParcel();
};
- FilterParcelable() : uid_(0), filter_(nullptr), flag_(0) {}
+ FilterParcelable();
FilterParcelable(uid_t uid, pkgmgrinfo_filter_x *filter, int flag);
~FilterParcelable();
const pkgmgrinfo_filter_x* GetFilter();
*/
#include "parcelable_factory.hh"
-#include "pkgmgrinfo_debug.h"
+
+#include <parcel.hh>
#include "abstract_parcelable.hh"
#include "appinfo_parcelable.hh"
#include "pkginfo_parcelable.hh"
#include "query_parcelable.hh"
+#include <iostream>
+
namespace pkgmgr_common {
namespace parcel {
return instance;
}
-std::unique_ptr<AbstractParcelable> ParcelableFactory::CreateParcel(unsigned char* data,
- int size) {
- return nullptr;
+std::unique_ptr<AbstractParcelable> ParcelableFactory::CreateParcel(
+ const unsigned char* data, int size) {
+ int tmp;
+ std::unique_ptr<AbstractParcelable> res = nullptr;
+ tizen_base::Parcel parcel(data, size);
+
+ parcel.ReadInt32(&tmp);
+ if (tmp != 1)
+ return nullptr;
+ parcel.ReadInt32(&tmp);
+ parcel.ResetReader();
+ ParcelableType type = static_cast<ParcelableType>(tmp);
+
+ switch (type) {
+ case ParcelableType::AppInfo:
+ res = std::make_unique<AppInfoParcelable>();
+ parcel.ReadParcelable(res.get());
+ break;
+ case ParcelableType::CertInfo:
+ std::cout << "make certinfo parcelable" << std::endl;
+ res = std::make_unique<CertInfoParcelable>();
+ parcel.ReadParcelable(res.get());
+ break;
+ case ParcelableType::Filter:
+ res = std::make_unique<FilterParcelable>();
+ parcel.ReadParcelable(res.get());
+ break;
+ case ParcelableType::PkgInfo:
+ res = std::make_unique<PkgInfoParcelable>();
+ parcel.ReadParcelable(res.get());
+ break;
+ case ParcelableType::Query:
+ res = std::make_unique<QueryParcelable>();
+ parcel.ReadParcelable(res.get());
+ break;
+ case ParcelableType::Unknown:
+ break;
+ default:
+ break;
+ }
+ return res;
}
} // namespace parcel
class EXPORT_API ParcelableFactory {
public:
static ParcelableFactory& GetInst();
- std::unique_ptr<AbstractParcelable> CreateParcel(unsigned char* data, int size);
+ std::unique_ptr<AbstractParcelable> CreateParcel(const unsigned char* data, int size);
private:
ParcelableFactory();
return package;
}
+PkgInfoParcelable::PkgInfoParcelable()
+ : AbstractParcelable(0, ParcelableType::PkgInfo) {}
+
PkgInfoParcelable::PkgInfoParcelable(std::vector<package_x *>&& pkg_list)
: pkg_list_(std::move(pkg_list)) {}
}
void PkgInfoParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+ AbstractParcelable::WriteToParcel(parcel);
WriteInt(parcel, pkg_list_.size());
for (auto pkg : pkg_list_) {
void PkgInfoParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
int len = 0;
+
+ AbstractParcelable::ReadFromParcel(parcel);
ReadInt(parcel, &len);
for (int i = 0; i < len ; ++i) {
std::unique_ptr<AbstractParcelable> CreateParcel();
};
- PkgInfoParcelable() = default;
+ PkgInfoParcelable();
PkgInfoParcelable(std::vector<package_x *>&& pkg_list);
~PkgInfoParcelable();
const std::vector<package_x *>& GetPkgInfo();
namespace pkgmgr_common {
namespace parcel {
+QueryParcelable::QueryParcelable()
+ : AbstractParcelable(0, ParcelableType::Query) {}
+
QueryParcelable::QueryParcelable(uid_t uid, std::string query)
: AbstractParcelable(uid, ParcelableType::Query), query_(query) {}
void QueryParcelable::WriteToParcel(tizen_base::Parcel* parcel) const {
+ AbstractParcelable::WriteToParcel(parcel);
WriteString(parcel, query_.c_str());
}
void QueryParcelable::ReadFromParcel(tizen_base::Parcel* parcel) {
char *query = nullptr;
+
+ AbstractParcelable::ReadFromParcel(parcel);
ReadString(parcel, &query);
query_ = query;
free(query);
std::unique_ptr<AbstractParcelable> CreateParcel();
};
- QueryParcelable() = default;
+ QueryParcelable();
QueryParcelable(uid_t uid, std::string query);
const std::string& GetQuery();
#include "common/parcel/appinfo_parcelable.hh"
#include "common/parcel/certinfo_parcelable.hh"
#include "common/parcel/filter_parcelable.hh"
+#include "common/parcel/parcelable_factory.hh"
#include "common/parcel/pkginfo_parcelable.hh"
#include "common/parcel/query_parcelable.hh"
EXPECT_EQ(origin_parcelable.GetQuery(), new_parcelable.GetQuery());
}
+
+TEST_F(ParcelTest, ParcelableFactory) {
+ tizen_base::Parcel parcel;
+ std::unique_ptr<pp::AbstractParcelable> ptr;
+ pp::AppInfoParcelable appinfo_parcelable;
+ pp::CertInfoParcelable certinfo_parcelable;
+ pp::FilterParcelable filter_parcelable;
+ pp::PkgInfoParcelable pkginfo_parcelable;
+ pp::QueryParcelable query_parcelable;
+
+ parcel.WriteParcelable(appinfo_parcelable);
+ ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+ EXPECT_NE(ptr, nullptr);
+ EXPECT_EQ(ptr->GetType(), pp::ParcelableType::AppInfo);
+ parcel.Clear();
+
+ parcel.WriteParcelable(certinfo_parcelable);
+ ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+ EXPECT_NE(ptr, nullptr);
+ EXPECT_EQ(ptr->GetType(), pp::ParcelableType::CertInfo);
+ parcel.Clear();
+
+ parcel.WriteParcelable(filter_parcelable);
+ ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+ EXPECT_NE(ptr, nullptr);
+ EXPECT_EQ(ptr->GetType(), pp::ParcelableType::Filter);
+ parcel.Clear();
+
+ parcel.WriteParcelable(pkginfo_parcelable);
+ ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+ EXPECT_NE(ptr, nullptr);
+ EXPECT_EQ(ptr->GetType(), pp::ParcelableType::PkgInfo);
+ parcel.Clear();
+
+ parcel.WriteParcelable(query_parcelable);
+ ptr = pp::ParcelableFactory::GetInst().CreateParcel(&parcel.GetRaw()[0], parcel.GetRaw().size());
+ EXPECT_NE(ptr, nullptr);
+ EXPECT_EQ(ptr->GetType(), pp::ParcelableType::Query);
+ parcel.Clear();
+}