예제 #1
0
파일: Amf0.cpp 프로젝트: tuyooc/rtmp_relay
    uint32_t Node::encode(std::vector<uint8_t>& buffer) const
    {
        uint32_t size = 0;

        uint32_t ret = 0;

        buffer.push_back(static_cast<uint8_t>(marker));
        size += 1;

        switch (marker)
        {
            case Marker::Number: ret = writeNumber(buffer, doubleValue); break;
            case Marker::Boolean: ret = writeBoolean(buffer, boolValue); break;
            case Marker::String: ret = writeString(buffer, stringValue); break;
            case Marker::Object: ret = writeObject(buffer, mapValue); break;
            case Marker::Null: /* Null */; break;
            case Marker::Undefined: /* Undefined */; break;
            case Marker::ECMAArray: ret = writeECMAArray(buffer, mapValue); break;
            case Marker::ObjectEnd: break; // should not happen
            case Marker::StrictArray: ret = writeStrictArray(buffer, vectorValue); break;
            case Marker::Date: ret = writeDate(buffer, dateValue); break;
            case Marker::LongString: ret = writeLongString(buffer, stringValue); break;
            case Marker::XMLDocument: ret = writeXMLDocument(buffer, stringValue); break;
            case Marker::TypedObject: ret = writeTypedObject(buffer); break;
            case Marker::SwitchToAMF3: ret = writeSwitchToAMF3(buffer); break;
            default: return 0;
        }

        size += ret;

        return size;
    }
예제 #2
0
void MessageEncoder::writeHeader(const Header& msg)
{
    size_t fields(optimise ? optimisable(msg) : 5);
    if (fields) {
        void* token = startList8(&qpid::amqp::message::HEADER);
        writeBoolean(msg.isDurable());
        if (fields > 1) writeUByte(msg.getPriority());

        if (msg.getTtl()) writeUInt(msg.getTtl());
        else if (fields > 2) writeNull();

        if (msg.isFirstAcquirer()) writeBoolean(true);
        else if (fields > 3) writeNull();

        if (msg.getDeliveryCount()) writeUInt(msg.getDeliveryCount());
        else if (fields > 4) writeNull();
        endList8(fields, token);
    }
}
예제 #3
0
		void Writer::write(Appender& appender, const Value& value, Size indent)
		{
			switch (value.getType())
			{
				case Value::Type::Null:
					writeNull(appender);
					break;
				case Value::Type::Boolean:
					writeBoolean(appender, value.asBoolean());
					break;
				case Value::Type::Number:
					writeNumber(appender, value.asDouble());
					break;
				case Value::Type::String:
					writeString(appender, value.asString());
					break;
				case Value::Type::Array:
					writeArray(appender, value, indent);
					break;
				case Value::Type::Object:
					writeObject(appender, value, indent);
					break;
			}
		}
예제 #4
0
void DataWriter::writeBooleanProperty(const string& name,bool value) {
	writePropertyName(name);
	writeBoolean(value);
}
예제 #5
0
void MessageEncoder::writeMap(const qpid::types::Variant::Map& properties, const Descriptor* d, bool large)
{
    void* token = large ? startMap32(d) : startMap8(d);
    for (qpid::types::Variant::Map::const_iterator i = properties.begin(); i != properties.end(); ++i) {
        writeString(i->first);
        switch (i->second.getType()) {
          case qpid::types::VAR_MAP:
          case qpid::types::VAR_LIST:
            //not allowed (TODO: revise, only strictly true for application-properties) whereas this is now a more general method)
            QPID_LOG(warning, "Ignoring nested map/list; not allowed in application-properties for AMQP 1.0");
          case qpid::types::VAR_VOID:
            writeNull();
            break;
          case qpid::types::VAR_BOOL:
            writeBoolean(i->second);
            break;
          case qpid::types::VAR_UINT8:
            writeUByte(i->second);
            break;
          case qpid::types::VAR_UINT16:
            writeUShort(i->second);
            break;
          case qpid::types::VAR_UINT32:
            writeUInt(i->second);
            break;
          case qpid::types::VAR_UINT64:
            writeULong(i->second);
            break;
          case qpid::types::VAR_INT8:
            writeByte(i->second);
            break;
          case qpid::types::VAR_INT16:
            writeShort(i->second);
            break;
          case qpid::types::VAR_INT32:
            writeInt(i->second);
            break;
          case qpid::types::VAR_INT64:
            writeULong(i->second);
            break;
          case qpid::types::VAR_FLOAT:
            writeFloat(i->second);
            break;
          case qpid::types::VAR_DOUBLE:
            writeDouble(i->second);
            break;
          case qpid::types::VAR_STRING:
            if (i->second.getEncoding() == BINARY) {
                writeBinary(i->second);
            } else {
                writeString(i->second);
            }
            break;
          case qpid::types::VAR_UUID:
            writeUuid(i->second);
            break;
        }
    }
    if (large) endMap32(properties.size()*2, token);
    else endMap8(properties.size()*2, token);
}
예제 #6
0
bool Configurator::writeConfiguration (const char *filename)
{
	std::ofstream file(filename == 0 ? Configurator::filename : filename, std::ios_base::out | std::ios_base::trunc);
	if (!file.good())
		return false;

	if (!writeInt(file, 3))
		return false;

	std::vector<VrrpService *> services = Configurator::services();
	if (!writeInt(file, services.size()))
		return false;

	for (std::vector<VrrpService *>::const_iterator it = services.begin(); it != services.end(); ++it)
	{
		const VrrpService *service = *it;

		char ifname[IFNAMSIZ];
		if_indextoname(service->interface(), ifname);

		int flags = 0;
		if (!service->hasAutoPrimaryIpAddress())
			flags |= FLAG_HAS_PRIMARY_IP_ADDRESS;

		if (
				!writeString(file, ifname)
				|| !writeInt(file, service->virtualRouterId())
				|| !writeInt(file, service->family())
				|| !writeInt(file, service->priority())
				|| !writeInt(file, service->advertisementInterval() * 10)
				|| !writeBoolean(file, service->acceptMode())
				|| !writeBoolean(file, service->preemptMode())
				|| !writeBoolean(file, service->enabled())
				|| !writeInt(file, flags))
			return false;

		if (flags & FLAG_HAS_PRIMARY_IP_ADDRESS)
		{
			if (!writeIp(file, service->primaryIpAddress()))
				return false;
		}
	
		if (
				!writeString(file, service->masterCommand())
				|| !writeString(file, service->backupCommand())
				|| !writeInt(file, service->vlanId()))
		{
			return false;
		}

		const IpSubnetSet &subnets = service->subnets();
		if (!writeInt(file, subnets.size()))
			return false;

		for (IpSubnetSet::const_iterator subnet = subnets.begin(); subnet != subnets.end(); ++subnet)
		{
			if (!writeSubnet(file, *subnet))
				return false;
		}
	}

	return true;
}