bool ff::SaveData<ff::String>(ff::IDataWriter *pWriter, ff::StringRef data) { DWORD nBytes = (DWORD)((data.length() + 1) * sizeof(wchar_t)); assertRetVal(SaveData(pWriter, nBytes), false); return SaveBytes(pWriter, data.c_str(), nBytes); }
static bool InternalSaveValue(ff::Value *value, ff::IDataWriter *writer, bool nameHashOnly) { assertRetVal(value && writer, false); DWORD type = (DWORD)value->GetType(); if (!CanSaveValue(value)) { type = (DWORD)ff::Value::Type::Null; } assertRetVal(ff::SaveData(writer, type), false); switch (value->GetType()) { default: assertRetVal(false, false); case ff::Value::Type::Null: break; case ff::Value::Type::Bool: assertRetVal(ff::SaveData(writer, value->AsBool()), false); break; case ff::Value::Type::Double: assertRetVal(ff::SaveData(writer, value->AsDouble()), false); break; case ff::Value::Type::Float: assertRetVal(ff::SaveData(writer, value->AsFloat()), false); break; case ff::Value::Type::Int: assertRetVal(ff::SaveData(writer, value->AsInt()), false); break; case ff::Value::Type::Data: { ff::IData *valueData = value->AsData(); DWORD valueDataSize = valueData ? (DWORD)valueData->GetSize() : 0; assertRetVal(ff::SaveData(writer, valueDataSize), false); if (valueDataSize) { assertRetVal(ff::SaveBytes(writer, valueData), false); } } break; case ff::Value::Type::Dict: { ff::ComPtr<ff::IData> nestedData; assertRetVal(InternalSaveDict(value->AsDict(), true, nameHashOnly, &nestedData), false); DWORD dataSize = (DWORD)nestedData->GetSize(); assertRetVal(ff::SaveData(writer, dataSize), false); if (dataSize) { assertRetVal(SaveBytes(writer, nestedData), false); } } break; case ff::Value::Type::String: assertRetVal(ff::SaveData(writer, value->AsString()), false); break; case ff::Value::Type::Guid: assertRetVal(ff::SaveData(writer, value->AsGuid()), false); break; case ff::Value::Type::Point: assertRetVal(ff::SaveData(writer, value->AsPoint()), false); break; case ff::Value::Type::Rect: assertRetVal(ff::SaveData(writer, value->AsRect()), false); break; case ff::Value::Type::PointF: assertRetVal(ff::SaveData(writer, value->AsPointF()), false); break; case ff::Value::Type::RectF: assertRetVal(ff::SaveData(writer, value->AsRectF()), false); break; case ff::Value::Type::DoubleVector: { DWORD doubleCount = (DWORD)value->AsDoubleVector().Size(); assertRetVal(ff::SaveData(writer, doubleCount), false); for (size_t h = 0; h < value->AsDoubleVector().Size(); h++) { assertRetVal(ff::SaveData(writer, value->AsDoubleVector().GetAt(h)), false); } } break; case ff::Value::Type::FloatVector: { DWORD floatCount = (DWORD)value->AsFloatVector().Size(); assertRetVal(ff::SaveData(writer, floatCount), false); for (size_t h = 0; h < value->AsFloatVector().Size(); h++) { assertRetVal(ff::SaveData(writer, value->AsFloatVector().GetAt(h)), false); } } break; case ff::Value::Type::IntVector: { DWORD intCount = (DWORD)value->AsIntVector().Size(); assertRetVal(ff::SaveData(writer, intCount), false); for (size_t h = 0; h < value->AsIntVector().Size(); h++) { assertRetVal(ff::SaveData(writer, value->AsIntVector().GetAt(h)), false); } } break; case ff::Value::Type::DataVector: { DWORD valueSize = (DWORD)value->AsDataVector().Size(); assertRetVal(ff::SaveData(writer, valueSize), false); for (size_t h = 0; h < value->AsDataVector().Size(); h++) { ff::IData *valueData = value->AsDataVector().GetAt(h); valueSize = (DWORD)valueData->GetSize(); assertRetVal(ff::SaveData(writer, valueSize), false); if (valueSize) { assertRetVal(SaveBytes(writer, valueData), false); } } } break; case ff::Value::Type::StringVector: { DWORD stringCount = (DWORD)value->AsStringVector().Size(); assertRetVal(ff::SaveData(writer, stringCount), false); for (size_t h = 0; h < value->AsStringVector().Size(); h++) { assertRetVal(ff::SaveData(writer, value->AsStringVector().GetAt(h)), false); } } break; case ff::Value::Type::ValueVector: { DWORD valueCount = (DWORD)value->AsValueVector().Size(); assertRetVal(ff::SaveData(writer, valueCount), false); for (const ff::ValuePtr &nestedValue: value->AsValueVector()) { assertRetVal(InternalSaveValue(nestedValue, writer, nameHashOnly), false); } } break; case ff::Value::Type::Object: // TODO break; } return true; }
bool ff::SaveBytes(IDataWriter *pWriter, IData *pData) { assertRetVal(pData, false); return SaveBytes(pWriter, pData->GetMem(), pData->GetSize()); }