ParseResult IEbmlElement::ParseFromFile()
	{
		//std::cout << "On parsing IEbmlElement from file\n";
		PreClean();
		if (this->m_pReader == nullptr) return FAILED;
		long long total, available;
		m_pReader->Length(&total, &available);
		if (total > available) return E_FILE_FORMAT_INVALID;
		BytePostion cur_pos = this->GetDataStart();
		BytePostion stop_pos = this->GetDataSize() + cur_pos;
		if (stop_pos > total) return E_FILE_FORMAT_INVALID;
		if (cur_pos > stop_pos) return E_FILE_FORMAT_INVALID;
		while (cur_pos < stop_pos)
		{

			//std::cout << "e_start: " << cur_pos << std::endl;

			Uint64 status;
			long length = -1;
			BytePostion e_start = cur_pos;
			// Read ID
			status = ReadID(this->m_pReader, cur_pos, length);
			if (status < 0) return E_FILE_FORMAT_INVALID;
			if (!CheckIDLength(length)) return E_FILE_FORMAT_INVALID;
			cur_pos += length; // Consumes ID
			EbmlID id = (EbmlID)status;

			//std::cout << "ID: " << id << std::endl;

			// Read DataSize
			status = ReadUInt(this->m_pReader, cur_pos, length);
			if (status < 0) return E_FILE_FORMAT_INVALID;
			if (!CheckElementSize(length)) return E_FILE_FORMAT_INVALID;

			//std::cout << "d_size: " << status << std::endl;

			cur_pos += length; // Consumes Size
			Uint64 d_size = status;
			// Read Data

			//std::cout << "d_start: " << cur_pos << std::endl;
			//std::cout << std::endl;

			status = ParseChild(e_start, cur_pos + d_size - e_start, cur_pos, d_size, id);
			if (status != SUCCESS) return status;
			if (cur_pos > stop_pos) return E_FILE_FORMAT_INVALID;
			cur_pos += d_size;
		}
		if (cur_pos != stop_pos) return E_FILE_FORMAT_INVALID;
		AFewMoreActions();
		return SUCCESS;
	}
Beispiel #2
0
bool TemplateParser::ParseMacro()
{
	Ident ident;

	ident = ParseIdent();
	switch (ident)
	{
	case ID_WXPARENT:
		return ParseWxParent();
		break;
	case ID_PARENT:
		return ParseParent();
		break;
	case ID_FORM:
		return ParseForm();
		break;
	case ID_IFNOTNULL:
		return ParseIfNotNull();
		break;
	case ID_IFNULL:
		return ParseIfNull();
		break;
	case ID_FOREACH:
		return ParseForEach();
		break;
	case ID_PREDEFINED:
		return ParsePred();
		break;
	case ID_PREDEFINED_INDEX:
		return ParseNPred();
		break;
	case ID_CHILD:
		return ParseChild();
		break;
	case ID_NEWLINE:
		return ParseNewLine();
		break;
	case ID_IFEQUAL:
		ParseIfEqual();
		break;
	case ID_IFNOTEQUAL:
		ParseIfNotEqual();
		break;
	case ID_IFPARENTTYPEEQUAL:
		ParseIfParentTypeEqual();
		break;
	case ID_IFPARENTCLASSEQUAL:
		ParseIfParentClassEqual();
		break;
	case ID_IFPARENTTYPENOTEQUAL:
		ParseIfParentTypeNotEqual();
		break;
	case ID_IFPARENTCLASSNOTEQUAL:
		ParseIfParentClassNotEqual();
		break;
	case ID_APPEND:
		ParseAppend();
		break;
	case ID_CLASS:
		ParseClass();
		break;
	case ID_INDENT:
		ParseIndent();
		break;
	case ID_UNINDENT:
		ParseUnindent();
		break;
	case ID_IFTYPEEQUAL:
		ParseIfTypeEqual();
		break;
	case ID_IFTYPENOTEQUAL:
		ParseIfTypeNotEqual();
		break;
	case ID_UTBL:
		ParseLuaTable();
		break;
	default:
		THROW_WXFBEX( wxT("Invalid Macro Type") );
		break;
	}

	return true;
}