15743868e15c88d2886915163652a1571a218bf39Igor Murashkin/* 25743868e15c88d2886915163652a1571a218bf39Igor Murashkin * Copyright (C) 2014 The Android Open Source Project 35743868e15c88d2886915163652a1571a218bf39Igor Murashkin * 45743868e15c88d2886915163652a1571a218bf39Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 55743868e15c88d2886915163652a1571a218bf39Igor Murashkin * you may not use this file except in compliance with the License. 65743868e15c88d2886915163652a1571a218bf39Igor Murashkin * You may obtain a copy of the License at 75743868e15c88d2886915163652a1571a218bf39Igor Murashkin * 85743868e15c88d2886915163652a1571a218bf39Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 95743868e15c88d2886915163652a1571a218bf39Igor Murashkin * 105743868e15c88d2886915163652a1571a218bf39Igor Murashkin * Unless required by applicable law or agreed to in writing, software 115743868e15c88d2886915163652a1571a218bf39Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 125743868e15c88d2886915163652a1571a218bf39Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135743868e15c88d2886915163652a1571a218bf39Igor Murashkin * See the License for the specific language governing permissions and 145743868e15c88d2886915163652a1571a218bf39Igor Murashkin * limitations under the License. 155743868e15c88d2886915163652a1571a218bf39Igor Murashkin */ 165743868e15c88d2886915163652a1571a218bf39Igor Murashkinpackage android.hardware.camera2.marshal.impl; 175743868e15c88d2886915163652a1571a218bf39Igor Murashkin 185743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport android.hardware.camera2.marshal.Marshaler; 195743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport android.hardware.camera2.marshal.MarshalQueryable; 205743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport android.hardware.camera2.marshal.MarshalRegistry; 215743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport android.hardware.camera2.utils.TypeReference; 225743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport android.util.Pair; 235743868e15c88d2886915163652a1571a218bf39Igor Murashkin 245743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport java.lang.reflect.Constructor; 255743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport java.lang.reflect.InvocationTargetException; 265743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport java.lang.reflect.ParameterizedType; 275743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport java.lang.reflect.Type; 285743868e15c88d2886915163652a1571a218bf39Igor Murashkinimport java.nio.ByteBuffer; 295743868e15c88d2886915163652a1571a218bf39Igor Murashkin 305743868e15c88d2886915163652a1571a218bf39Igor Murashkin/** 315743868e15c88d2886915163652a1571a218bf39Igor Murashkin * Marshal {@link Pair} to/from any native type 325743868e15c88d2886915163652a1571a218bf39Igor Murashkin */ 335743868e15c88d2886915163652a1571a218bf39Igor Murashkinpublic class MarshalQueryablePair<T1, T2> 345743868e15c88d2886915163652a1571a218bf39Igor Murashkin implements MarshalQueryable<Pair<T1, T2>> { 355743868e15c88d2886915163652a1571a218bf39Igor Murashkin 365743868e15c88d2886915163652a1571a218bf39Igor Murashkin private class MarshalerPair extends Marshaler<Pair<T1, T2>> { 375743868e15c88d2886915163652a1571a218bf39Igor Murashkin private final Class<? super Pair<T1, T2>> mClass; 385743868e15c88d2886915163652a1571a218bf39Igor Murashkin private final Constructor<Pair<T1, T2>> mConstructor; 395743868e15c88d2886915163652a1571a218bf39Igor Murashkin /** Marshal the {@code T1} inside of {@code Pair<T1, T2>} */ 405743868e15c88d2886915163652a1571a218bf39Igor Murashkin private final Marshaler<T1> mNestedTypeMarshalerFirst; 415743868e15c88d2886915163652a1571a218bf39Igor Murashkin /** Marshal the {@code T1} inside of {@code Pair<T1, T2>} */ 425743868e15c88d2886915163652a1571a218bf39Igor Murashkin private final Marshaler<T2> mNestedTypeMarshalerSecond; 435743868e15c88d2886915163652a1571a218bf39Igor Murashkin 445743868e15c88d2886915163652a1571a218bf39Igor Murashkin @SuppressWarnings("unchecked") 455743868e15c88d2886915163652a1571a218bf39Igor Murashkin protected MarshalerPair(TypeReference<Pair<T1, T2>> typeReference, 465743868e15c88d2886915163652a1571a218bf39Igor Murashkin int nativeType) { 475743868e15c88d2886915163652a1571a218bf39Igor Murashkin super(MarshalQueryablePair.this, typeReference, nativeType); 485743868e15c88d2886915163652a1571a218bf39Igor Murashkin 495743868e15c88d2886915163652a1571a218bf39Igor Murashkin mClass = typeReference.getRawType(); 505743868e15c88d2886915163652a1571a218bf39Igor Murashkin 515743868e15c88d2886915163652a1571a218bf39Igor Murashkin /* 525743868e15c88d2886915163652a1571a218bf39Igor Murashkin * Lookup the actual type arguments, e.g. Pair<Integer, Float> --> [Integer, Float] 535743868e15c88d2886915163652a1571a218bf39Igor Murashkin * and then get the marshalers for that managed type. 545743868e15c88d2886915163652a1571a218bf39Igor Murashkin */ 555743868e15c88d2886915163652a1571a218bf39Igor Murashkin ParameterizedType paramType; 565743868e15c88d2886915163652a1571a218bf39Igor Murashkin try { 575743868e15c88d2886915163652a1571a218bf39Igor Murashkin paramType = (ParameterizedType) typeReference.getType(); 585743868e15c88d2886915163652a1571a218bf39Igor Murashkin } catch (ClassCastException e) { 595743868e15c88d2886915163652a1571a218bf39Igor Murashkin throw new AssertionError("Raw use of Pair is not supported", e); 605743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 615743868e15c88d2886915163652a1571a218bf39Igor Murashkin 625743868e15c88d2886915163652a1571a218bf39Igor Murashkin // Get type marshaler for T1 635743868e15c88d2886915163652a1571a218bf39Igor Murashkin { 645743868e15c88d2886915163652a1571a218bf39Igor Murashkin Type actualTypeArgument = paramType.getActualTypeArguments()[0]; 655743868e15c88d2886915163652a1571a218bf39Igor Murashkin 665743868e15c88d2886915163652a1571a218bf39Igor Murashkin TypeReference<?> actualTypeArgToken = 675743868e15c88d2886915163652a1571a218bf39Igor Murashkin TypeReference.createSpecializedTypeReference(actualTypeArgument); 685743868e15c88d2886915163652a1571a218bf39Igor Murashkin 695743868e15c88d2886915163652a1571a218bf39Igor Murashkin mNestedTypeMarshalerFirst = (Marshaler<T1>)MarshalRegistry.getMarshaler( 705743868e15c88d2886915163652a1571a218bf39Igor Murashkin actualTypeArgToken, mNativeType); 715743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 725743868e15c88d2886915163652a1571a218bf39Igor Murashkin // Get type marshaler for T2 735743868e15c88d2886915163652a1571a218bf39Igor Murashkin { 745743868e15c88d2886915163652a1571a218bf39Igor Murashkin Type actualTypeArgument = paramType.getActualTypeArguments()[1]; 755743868e15c88d2886915163652a1571a218bf39Igor Murashkin 765743868e15c88d2886915163652a1571a218bf39Igor Murashkin TypeReference<?> actualTypeArgToken = 775743868e15c88d2886915163652a1571a218bf39Igor Murashkin TypeReference.createSpecializedTypeReference(actualTypeArgument); 785743868e15c88d2886915163652a1571a218bf39Igor Murashkin 795743868e15c88d2886915163652a1571a218bf39Igor Murashkin mNestedTypeMarshalerSecond = (Marshaler<T2>)MarshalRegistry.getMarshaler( 805743868e15c88d2886915163652a1571a218bf39Igor Murashkin actualTypeArgToken, mNativeType); 815743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 825743868e15c88d2886915163652a1571a218bf39Igor Murashkin try { 835743868e15c88d2886915163652a1571a218bf39Igor Murashkin mConstructor = (Constructor<Pair<T1, T2>>)mClass.getConstructor( 845743868e15c88d2886915163652a1571a218bf39Igor Murashkin Object.class, Object.class); 855743868e15c88d2886915163652a1571a218bf39Igor Murashkin } catch (NoSuchMethodException e) { 865743868e15c88d2886915163652a1571a218bf39Igor Murashkin throw new AssertionError(e); 875743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 885743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 895743868e15c88d2886915163652a1571a218bf39Igor Murashkin 905743868e15c88d2886915163652a1571a218bf39Igor Murashkin @Override 915743868e15c88d2886915163652a1571a218bf39Igor Murashkin public void marshal(Pair<T1, T2> value, ByteBuffer buffer) { 925743868e15c88d2886915163652a1571a218bf39Igor Murashkin if (value.first == null) { 935743868e15c88d2886915163652a1571a218bf39Igor Murashkin throw new UnsupportedOperationException("Pair#first must not be null"); 945743868e15c88d2886915163652a1571a218bf39Igor Murashkin } else if (value.second == null) { 955743868e15c88d2886915163652a1571a218bf39Igor Murashkin throw new UnsupportedOperationException("Pair#second must not be null"); 965743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 975743868e15c88d2886915163652a1571a218bf39Igor Murashkin 985743868e15c88d2886915163652a1571a218bf39Igor Murashkin mNestedTypeMarshalerFirst.marshal(value.first, buffer); 995743868e15c88d2886915163652a1571a218bf39Igor Murashkin mNestedTypeMarshalerSecond.marshal(value.second, buffer); 1005743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1015743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1025743868e15c88d2886915163652a1571a218bf39Igor Murashkin @Override 1035743868e15c88d2886915163652a1571a218bf39Igor Murashkin public Pair<T1, T2> unmarshal(ByteBuffer buffer) { 1045743868e15c88d2886915163652a1571a218bf39Igor Murashkin T1 first = mNestedTypeMarshalerFirst.unmarshal(buffer); 1055743868e15c88d2886915163652a1571a218bf39Igor Murashkin T2 second = mNestedTypeMarshalerSecond.unmarshal(buffer); 1065743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1075743868e15c88d2886915163652a1571a218bf39Igor Murashkin try { 1085743868e15c88d2886915163652a1571a218bf39Igor Murashkin return mConstructor.newInstance(first, second); 1095743868e15c88d2886915163652a1571a218bf39Igor Murashkin } catch (InstantiationException e) { 1105743868e15c88d2886915163652a1571a218bf39Igor Murashkin throw new AssertionError(e); 1115743868e15c88d2886915163652a1571a218bf39Igor Murashkin } catch (IllegalAccessException e) { 1125743868e15c88d2886915163652a1571a218bf39Igor Murashkin throw new AssertionError(e); 1135743868e15c88d2886915163652a1571a218bf39Igor Murashkin } catch (IllegalArgumentException e) { 1145743868e15c88d2886915163652a1571a218bf39Igor Murashkin throw new AssertionError(e); 1155743868e15c88d2886915163652a1571a218bf39Igor Murashkin } catch (InvocationTargetException e) { 1165743868e15c88d2886915163652a1571a218bf39Igor Murashkin throw new AssertionError(e); 1175743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1185743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1195743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1205743868e15c88d2886915163652a1571a218bf39Igor Murashkin @Override 1215743868e15c88d2886915163652a1571a218bf39Igor Murashkin public int getNativeSize() { 1225743868e15c88d2886915163652a1571a218bf39Igor Murashkin int firstSize = mNestedTypeMarshalerFirst.getNativeSize(); 1235743868e15c88d2886915163652a1571a218bf39Igor Murashkin int secondSize = mNestedTypeMarshalerSecond.getNativeSize(); 1245743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1255743868e15c88d2886915163652a1571a218bf39Igor Murashkin if (firstSize != NATIVE_SIZE_DYNAMIC && secondSize != NATIVE_SIZE_DYNAMIC) { 1265743868e15c88d2886915163652a1571a218bf39Igor Murashkin return firstSize + secondSize; 1275743868e15c88d2886915163652a1571a218bf39Igor Murashkin } else { 1285743868e15c88d2886915163652a1571a218bf39Igor Murashkin return NATIVE_SIZE_DYNAMIC; 1295743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1305743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1315743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1325743868e15c88d2886915163652a1571a218bf39Igor Murashkin @Override 1335743868e15c88d2886915163652a1571a218bf39Igor Murashkin public int calculateMarshalSize(Pair<T1, T2> value) { 1345743868e15c88d2886915163652a1571a218bf39Igor Murashkin int nativeSize = getNativeSize(); 1355743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1365743868e15c88d2886915163652a1571a218bf39Igor Murashkin if (nativeSize != NATIVE_SIZE_DYNAMIC) { 1375743868e15c88d2886915163652a1571a218bf39Igor Murashkin return nativeSize; 1385743868e15c88d2886915163652a1571a218bf39Igor Murashkin } else { 1395743868e15c88d2886915163652a1571a218bf39Igor Murashkin int firstSize = mNestedTypeMarshalerFirst.calculateMarshalSize(value.first); 1405743868e15c88d2886915163652a1571a218bf39Igor Murashkin int secondSize = mNestedTypeMarshalerSecond.calculateMarshalSize(value.second); 1415743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1425743868e15c88d2886915163652a1571a218bf39Igor Murashkin return firstSize + secondSize; 1435743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1445743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1455743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1465743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1475743868e15c88d2886915163652a1571a218bf39Igor Murashkin @Override 1485743868e15c88d2886915163652a1571a218bf39Igor Murashkin public Marshaler<Pair<T1, T2>> createMarshaler(TypeReference<Pair<T1, T2>> managedType, 1495743868e15c88d2886915163652a1571a218bf39Igor Murashkin int nativeType) { 1505743868e15c88d2886915163652a1571a218bf39Igor Murashkin return new MarshalerPair(managedType, nativeType); 1515743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1525743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1535743868e15c88d2886915163652a1571a218bf39Igor Murashkin @Override 1545743868e15c88d2886915163652a1571a218bf39Igor Murashkin public boolean isTypeMappingSupported(TypeReference<Pair<T1, T2>> managedType, int nativeType) { 1555743868e15c88d2886915163652a1571a218bf39Igor Murashkin return (Pair.class.equals(managedType.getRawType())); 1565743868e15c88d2886915163652a1571a218bf39Igor Murashkin } 1575743868e15c88d2886915163652a1571a218bf39Igor Murashkin 1585743868e15c88d2886915163652a1571a218bf39Igor Murashkin} 159