示例#1
0
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);
}
示例#2
0
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;
}
示例#3
0
bool ff::SaveBytes(IDataWriter *pWriter, IData *pData)
{
	assertRetVal(pData, false);

	return SaveBytes(pWriter, pData->GetMem(), pData->GetSize());
}