+SmackManager::SetupPath(const PackageId& packageId, const String& dirPath, SmackDirType type, const String& label)
+{
+ int res = 0;
+ String realPath;
+
+ std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
+ TryReturn(pPackageId, false, "pPackageId is null.");
+
+ std::unique_ptr<char[]> pPath(_StringConverter::CopyToCharArrayN(dirPath));
+ TryReturn(pPath, false, "pPath is null.");
+
+ if (InstallerUtil::IsSymlink(dirPath) == true)
+ {
+ res = SetupPath(pPackageId.get(), pPath.get(), (int) SMACK_DIR_TYPE_ANY_LABEL, "_");
+ InstallerUtil::GetRealPath(dirPath, realPath);
+ }
+ else
+ {
+ realPath = dirPath;
+ }
+
+ std::unique_ptr<char[]> pRealPath(_StringConverter::CopyToCharArrayN(realPath));
+ TryReturn(pRealPath, false, "pRealPath is null.");
+
+ if (type == SMACK_DIR_TYPE_GROUP_RW)
+ {
+ TryReturn(__pContext, false, "__pContext is null.");
+
+ String groupId;
+
+ if (__pContext->__isVerificationMode == true)
+ {
+ Sha1Hash hash;
+ String base64Value;
+ result r = E_SUCCESS;
+
+ IListT<String *>* pAuthorCertList = __pContext->__pAuthorCertList;
+ TryReturn(pAuthorCertList, false, "pAuthorCertList is null.");
+
+ String* pEntity = null;
+ r = pAuthorCertList->GetAt(0, pEntity);
+ TryReturn(!IsFailed(r), false, "pAuthorCertList->GetAt() is failed.");
+ TryReturn(pEntity, false, "pEntity is null.");
+
+ std::unique_ptr<ByteBuffer> pEncodedData(StringUtil::DecodeBase64StringN(*pEntity));
+ TryReturn(pEncodedData, false, "pEncodedData is null.");
+
+ std::unique_ptr<ByteBuffer> pHashValue(hash.GetHashN(*pEncodedData.get()));
+ TryReturn(pHashValue, false, "pHashValue is null.");
+
+ r = StringUtil::EncodeToBase64String(*pHashValue, base64Value);
+ TryReturn(!IsFailed(r), false, "EncodeToBase64String() is failed.");
+
+ // in smack, '/' is not allowed for label.
+ r = base64Value.Replace(L"/", L"#");
+ TryReturn(!IsFailed(r), false, "base64Value.Replace() is failed.");
+
+ std::unique_ptr<char[]> pHashEncodedValue(_StringConverter::CopyToCharArrayN(base64Value));
+ TryReturn(pHashEncodedValue, false, "pHashEncodedValue is null.");
+
+ groupId = pHashEncodedValue.get();
+ AppLog("pHashEncodedValue = [%s]", pHashEncodedValue.get());
+ }
+ else
+ {
+ groupId = __pContext->__packageId;
+ }
+
+ std::unique_ptr<char[]> pGroupId(_StringConverter::CopyToCharArrayN(groupId));
+ TryReturn(pGroupId, false, "pGroupId is null.");
+
+ res = SetupPath(pPackageId.get(), pRealPath.get(), (int) type, pGroupId.get());
+ }
+ else if (type == SMACK_DIR_TYPE_ANY_LABEL)
+ {
+ TryReturn(label.IsEmpty() == false, false, "label is empty.");
+
+ std::unique_ptr<char[]> pAnyLabel(_StringConverter::CopyToCharArrayN(label));
+ TryReturn(pAnyLabel, false, "pAnyLabel is null.");
+
+ res = SetupPath(pPackageId.get(), pRealPath.get(), (int) type, pAnyLabel.get());
+ }
+ else
+ {
+ res = SetupPath(pPackageId.get(), pRealPath.get(), (int) type);
+ }
+
+ return true;
+}
+
+bool