/*
 * Copyright 2012 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package io.netty.handler.codec.http.multipart;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.util.AbstractReferenceCounted;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

This Attribute is only for Encoder use to insert special command between object if needed (like Multipart Mixed mode)
/** * This Attribute is only for Encoder use to insert special command between object if needed * (like Multipart Mixed mode) */
final class InternalAttribute extends AbstractReferenceCounted implements InterfaceHttpData { private final List<ByteBuf> value = new ArrayList<ByteBuf>(); private final Charset charset; private int size; InternalAttribute(Charset charset) { this.charset = charset; } @Override public HttpDataType getHttpDataType() { return HttpDataType.InternalAttribute; } public void addValue(String value) { if (value == null) { throw new NullPointerException("value"); } ByteBuf buf = Unpooled.copiedBuffer(value, charset); this.value.add(buf); size += buf.readableBytes(); } public void addValue(String value, int rank) { if (value == null) { throw new NullPointerException("value"); } ByteBuf buf = Unpooled.copiedBuffer(value, charset); this.value.add(rank, buf); size += buf.readableBytes(); } public void setValue(String value, int rank) { if (value == null) { throw new NullPointerException("value"); } ByteBuf buf = Unpooled.copiedBuffer(value, charset); ByteBuf old = this.value.set(rank, buf); if (old != null) { size -= old.readableBytes(); old.release(); } size += buf.readableBytes(); } @Override public int hashCode() { return getName().hashCode(); } @Override public boolean equals(Object o) { if (!(o instanceof InternalAttribute)) { return false; } InternalAttribute attribute = (InternalAttribute) o; return getName().equalsIgnoreCase(attribute.getName()); } @Override public int compareTo(InterfaceHttpData o) { if (!(o instanceof InternalAttribute)) { throw new ClassCastException("Cannot compare " + getHttpDataType() + " with " + o.getHttpDataType()); } return compareTo((InternalAttribute) o); } public int compareTo(InternalAttribute o) { return getName().compareToIgnoreCase(o.getName()); } @Override public String toString() { StringBuilder result = new StringBuilder(); for (ByteBuf elt : value) { result.append(elt.toString(charset)); } return result.toString(); } public int size() { return size; } public ByteBuf toByteBuf() { return Unpooled.compositeBuffer().addComponents(value).writerIndex(size()).readerIndex(0); } @Override public String getName() { return "InternalAttribute"; } @Override protected void deallocate() { // Do nothing } @Override public InterfaceHttpData retain() { for (ByteBuf buf: value) { buf.retain(); } return this; } @Override public InterfaceHttpData retain(int increment) { for (ByteBuf buf: value) { buf.retain(increment); } return this; } @Override public InterfaceHttpData touch() { for (ByteBuf buf: value) { buf.touch(); } return this; } @Override public InterfaceHttpData touch(Object hint) { for (ByteBuf buf: value) { buf.touch(hint); } return this; } }