/* Ċ Ġ* ĠCopyright Ġ 2 0 1 3 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġ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 Ġcom . squareup . wire . internal Ċ Ċ import Ġcom . squareup . wire . Field Encoding Ċ import Ġcom . squareup . wire . Message Ċ import Ġcom . squareup . wire . Message . Builder Ċ import Ġcom . squareup . wire . Proto Adapter Ċ import Ġcom . squareup . wire . Proto Reader Ċ import Ġcom . squareup . wire . Proto Writer Ċ import Ġcom . squareup . wire . Syntax Ċ import Ġcom . squareup . wire . Wire Field Ċ import Ġcom . squareup . wire . Wire Field . Label . OM IT _ IDENTITY Ċ import Ġjava . io . IOException Ċ import Ġjava . util . Collections Ċ import Ġjava . util . Linked HashMap Ċ Ċ class ĠRuntime Message Adapter < M Ġ: ĠMessage < M , ĠB >, ĠB Ġ: ĠBuilder < M , ĠB >>( ĊĠ Ġprivate Ġval Ġmessage Type : ĠClass < M >, ĊĠ Ġprivate Ġval Ġbuilder Type : ĠClass < B >, ĊĠ Ġval Ġfield Bindings : ĠMap < Int , ĠField Binding < M , ĠB >>, ĊĠ Ġtype Url : ĠString ?, ĊĠ Ġsyntax : ĠSyntax Ċ ) Ġ: ĠProto Adapter < M >( Field Encoding . LENGTH _ DE LIMIT ED , Ġmessage Type . kotlin , Ġtype Url , Ġsyntax ) Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠField Ġbindings Ġby Ġindex . ĠThe Ġindexes Ġare Ġconsistent Ġacross Ġall Ġrelated Ġfields Ġincluding ĊĠĠ Ġ* Ġ[ json Names ], Ġ[ json Alternate Names ], Ġand Ġthe Ġresult Ġof Ġ[ json Adapters ]. ĊĠĠ Ġ*/ ĊĠ Ġval Ġfield Bindings Array : ĠArray < Field Binding < M , ĠB >> Ġ= Ġfield Bindings . values . to Typed Array () ĊĊĠ Ġ/** ĠWhen Ġwriting Ġeach Ġfield Ġas ĠJSON Ġthis Ġis Ġthe Ġname Ġto Ġuse . Ġ*/ ĊĠ Ġval Ġjson Names : ĠList < String > Ġ= Ġfield Bindings Array . map Ġ{ Ġit . json Name Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠWhen Ġreading ĠJSON Ġthese Ġare Ġalternate Ġnames Ġfor Ġeach Ġfield . ĠIf Ġnull Ġthe Ġfield Ġhas Ġno Ġalternate ĊĠĠ Ġ* Ġname . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠFor Ġreserved Ġkeywords Ġin ĠKotlin Ġor ĠJava , Ġa Ġfield Ġlike Ġ` public ` Ġare Ġwritten Ġas Ġso Ġalthough Ġthe ĊĠĠ Ġ* Ġgenerated Ġfield Ġname Ġis Ġ` public _ `. ĠWe Ġw anna Ġread Ġin Ġeither Ġform . ĠAs Ġwell , Ġin Ġproto 3 Ġfields ĊĠĠ Ġ* Ġdeclared Ġin Ġsnake _ case Ġlike Ġ` customer _ id ` Ġare Ġwritten Ġin Ġcamel Case Ġlike Ġ` customer Id `, Ġbut Ġcan ĊĠĠ Ġ* Ġbe Ġread Ġin Ġeither Ġform . ĠWe Ġcan Ġuse Ġexclusive Ġlogic Ġbetween Ġthe Ġtwo Ġcases Ġbecause Ġthere 's Ġno ĊĠĠ Ġ* Ġkeyword Ġdefined Ġin Ġsnake _ case . ĠThe Ġalternate Ġname Ġwill Ġbe Ġabsent Ġif Ġthe Ġfield Ġname Ġisn 't Ġa ĊĠĠ Ġ* Ġkeyword Ġor Ġif Ġthe Ġsnake Ġand Ġcamel Ġcases Ġare Ġthe Ġsame , Ġsuch Ġas Ġin Ġsingle - word Ġidentifiers . ĊĠĠ Ġ*/ ĊĠ Ġval Ġjson Alternate Names : ĠList < String ?> Ġ= Ġfield Bindings Array . map Ġ{ ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠ Ġit . json Name Ġ!= Ġit . declared Name Ġ-> Ġit . declared Name ĊĠĠĠĠĠ Ġit . json Name Ġ!= Ġit . name Ġ-> Ġit . name ĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠnewBuilder (): ĠB Ġ= Ġbuilder Type . newInstance () ĊĊĠ Ġoverride Ġfun Ġencoded Size ( value : ĠM ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġcached Serialized Size Ġ= Ġvalue . cached Serialized Size ĊĠĠĠ Ġif Ġ( cached Serialized Size Ġ!= Ġ 0 ) Ġreturn Ġcached Serialized Size ĊĊĠĠĠ Ġvar Ġsize Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( field Binding Ġin Ġfield Bindings . values ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbinding Ġ= Ġfield Binding [ value ] Ġ?: Ġcontinue ĊĠĠĠĠĠ Ġsize Ġ+= Ġfield Binding . adapter (). encoded Size With Tag ( field Binding . tag , Ġbinding ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġsize Ġ+= Ġvalue . unknownFields . size ĊĊĠĠĠ Ġvalue . cached Serialized Size Ġ= Ġsize ĊĠĠĠ Ġreturn Ġsize ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġoverride Ġfun Ġencode ( writer : ĠProto Writer , Ġvalue : ĠM ) Ġ{ ĊĠĠĠ Ġfor Ġ( field Binding Ġin Ġfield Bindings . values ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbinding Ġ= Ġfield Binding [ value ] Ġ?: Ġcontinue ĊĠĠĠĠĠ Ġfield Binding . adapter (). encode With Tag ( writer , Ġfield Binding . tag , Ġbinding ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġwriter . write Bytes ( value . unknownFields ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġred act ( value : ĠM ): ĠM Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= Ġvalue . newBuilder () ĊĠĠĠ Ġfor Ġ( field Binding Ġin Ġfield Bindings . values ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( field Binding . red acted Ġ&& Ġfield Binding . label Ġ== ĠWire Field . Label . REQUIRED ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Field Ġ'${ field Binding . name }' Ġin Ġ${ type ?. java ObjectType ?. name } Ġis Ġrequired Ġand Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cannot Ġbe Ġred acted .") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġis Message Ġ= ĠMessage :: class . java ĊĠĠĠĠĠĠĠĠĠ Ġ. isAssignableFrom ( field Binding . single Adapter (). type ?. java ObjectType ) ĊĠĠĠĠĠ Ġif Ġ( field Binding . red acted Ġ|| Ġis Message Ġ&& Ġ! field Binding . label . is Repeated ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Value Ġ= Ġfield Binding . get From Builder ( builder ) ĊĠĠĠĠĠĠĠ Ġif Ġ( builder Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġred acted Value Ġ= Ġfield Binding . adapter (). red act ( builder Value ) ĊĠĠĠĠĠĠĠĠĠ Ġfield Binding . set ( builder , Ġred acted Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Message Ġ&& Ġfield Binding . label . is Repeated ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġfield Binding . get From Builder ( builder ) Ġas ĠList < Any > ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġfield Binding . single Adapter () Ġas ĠProto Adapter < Any > ĊĠĠĠĠĠĠĠ Ġfield Binding . set ( builder , Ġvalues . red act Elements ( adapter )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuilder . clear UnknownFields () ĊĠĠĠ Ġreturn Ġbuilder . build () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġother Ġis ĠRuntime Message Adapter < *, Ġ*> Ġ&& Ġother . message Type Ġ== Ġmessage Type ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġmessage Type . hashCode () ĊĊĠ Ġoverride Ġfun ĠtoString ( value : ĠM ): ĠString Ġ= Ġbuild String Ġ{ ĊĠĠĠ Ġfor Ġ( field Binding Ġin Ġfield Bindings . values ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbinding Ġ= Ġfield Binding [ value ] ĊĠĠĠĠĠ Ġif Ġ( binding Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġappend (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend ( field Binding . name ) ĊĠĠĠĠĠĠĠ Ġappend (' =') ĊĠĠĠĠĠĠĠ Ġappend ( if Ġ( field Binding . red acted ) ĠRED ACT ED Ġelse Ġbinding ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠReplace Ġleading Ġcomma Ġwith Ġclass Ġname Ġand Ġopening Ġbr ace . ĊĠĠĠ Ġreplace ( 0 , Ġ 2 , Ġmessage Type . simple Name Ġ+ Ġ'{ ') ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġoverride Ġfun Ġdecode ( reader : ĠProto Reader ): ĠM Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠnewBuilder () ĊĠĠĠ Ġval Ġtoken Ġ= Ġreader . begin Message () ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtag Ġ= Ġreader . next Tag () ĊĠĠĠĠĠ Ġif Ġ( tag Ġ== Ġ- 1 ) Ġbreak ĊĠĠĠĠĠ Ġval Ġfield Binding Ġ= Ġfield Bindings [ tag ] ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( field Binding Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġif Ġ( field Binding . is Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Binding . adapter () ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Binding . single Adapter () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġadapter . decode ( reader ) ĊĠĠĠĠĠĠĠĠĠ Ġfield Binding . value ( builder , Ġvalue !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfield Encoding Ġ= Ġreader . peek Field Encoding () !! ĊĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfield Encoding . raw Proto Adapter (). decode ( reader ) ĊĠĠĠĠĠĠĠĠĠ Ġbuilder . add Unknown Field ( tag , Ġfield Encoding , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠEnum Constant NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAn Ġunknown ĠEnum Ġvalue Ġwas Ġencountered , Ġstore Ġit Ġas Ġan Ġunknown Ġfield . ĊĠĠĠĠĠĠĠ Ġbuilder . add Unknown Field ( tag , ĠField Encoding . VAR INT , Ġe . value . to Long ()) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġreader . end Message AndGet UnknownFields ( token ) Ġ// ĠIgnore Ġreturn Ġvalue ĊĊĠĠĠ Ġreturn Ġbuilder . build () ĊĠ Ġ} ĊĊĠ Ġ/** ĠReturns Ġa Ġmessage Ġtype Ġthat Ġsupports Ġencoding Ġand Ġdecoding ĠJSON Ġobjects Ġof Ġtype Ġ[ type ]. Ġ*/ ĊĠ Ġfun Ġ< F , ĠA > Ġjson Adapters ( ĊĠĠĠ Ġjson Integration : ĠJson Integration < F , ĠA >, ĊĠĠĠ Ġframework : ĠF ĊĠ Ġ): ĠList < A > Ġ{ ĊĠĠĠ Ġval Ġfield Bindings Ġ= Ġfield Bindings . values . to Typed Array () ĊĠĠĠ Ġreturn Ġfield Bindings . map Ġ{ Ġjson Integration . json Adapter ( framework , Ġsyntax , Ġit ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠWalk Ġthe Ġfields Ġof Ġ[ message ] Ġand Ġinvoke Ġ[ encode Value ] Ġon Ġeach Ġthat Ġshould Ġbe Ġwritten Ġas ĠJSON . ĊĠĠ Ġ* ĠThis Ġomit s Ġfields Ġthat Ġhave Ġthe Ġidentity Ġvalue Ġwhen Ġthat Ġis Ġrequired . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< A > Ġwrite All Fields ( ĊĠĠĠ Ġmessage : ĠM ?, ĊĠĠĠ Ġjson Adapters : ĠList < A >, ĊĠĠĠ Ġencode Value : Ġ( String , ĠAny ?, ĠA ) Ġ-> ĠUnit ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġfor Ġ( index Ġin Ġfield Bindings Array . indices ) Ġ{ ĊĠĠĠĠĠ Ġval Ġfield Binding Ġ= Ġfield Bindings Array [ index ] ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfield Binding [ message !! ] ĊĠĠĠĠĠ Ġif Ġ( field Binding . omit Identity () Ġ&& Ġvalue Ġ== Ġfield Binding . adapter (). identity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġencode Value ( json Names [ index ], Ġvalue , Ġjson Adapters [ index ]) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠField Binding < M , ĠB >. omit Identity (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( label Ġ== ĠO MIT _ IDENTITY ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( label . is Repeated Ġ&& Ġsyntax Ġ== ĠSyntax . PROTO _ 3 ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( is Map Ġ&& Ġsyntax Ġ== ĠSyntax . PROTO _ 3 ) Ġreturn Ġtrue ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠRED ACT ED Ġ= Ġ"\ u 2 5 8 8 \ u 2 5 8 8 " ĊĊĠĠĠ Ġ@ Jvm Static Ġfun Ġ< M Ġ: ĠMessage < M , ĠB >, ĠB Ġ: ĠBuilder < M , ĠB >> Ġcreate ( ĊĠĠĠĠĠ Ġmessage Type : ĠClass < M >, ĊĠĠĠĠĠ Ġtype Url : ĠString ?, ĊĠĠĠĠĠ Ġsyntax : ĠSyntax ĊĠĠĠ Ġ): ĠRuntime Message Adapter < M , ĠB > Ġ{ ĊĠĠĠĠĠ Ġval Ġbuilder Type Ġ= Ġget Builder Type ( message Type ) ĊĠĠĠĠĠ Ġval Ġfield Bindings Ġ= ĠLinkedHashMap < Int , ĠField Binding < M , ĠB >>() ĊĊĠĠĠĠĠ Ġ// ĠCreate Ġtag Ġbindings Ġfor Ġfields Ġannotated Ġwith Ġ'@ Wire Field ' ĊĠĠĠĠĠ Ġfor Ġ( message Field Ġin Ġmessage Type . declared Fields ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwire Field Ġ= Ġmessage Field . getAnnotation ( Wire Field :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( wire Field Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfield Bindings [ wire Field . tag ] Ġ= ĠField Binding ( wire Field , Ġmessage Field , Ġbuilder Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn ĠRuntime Message Adapter ( message Type , Ġbuilder Type , ĊĠĠĠĠĠĠĠĠĠ ĠCollections . unmodifiable Map ( field Bindings ), Ġtype Url , Ġsyntax ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static Ġfun Ġ< M Ġ: ĠMessage < M , ĠB >, ĠB Ġ: ĠBuilder < M , ĠB >> Ġcreate ( ĊĠĠĠĠĠ Ġmessage Type : ĠClass < M > ĊĠĠĠ Ġ): ĠRuntime Message Adapter < M , ĠB > Ġ{ ĊĠĠĠĠĠ Ġval Ġdefault Adapter Ġ= Ġget ( message Type Ġas ĠClass <* >) ĊĠĠĠĠĠ Ġreturn Ġcreate ( ĊĠĠĠĠĠĠĠĠĠ Ġmessage Type Ġ= Ġmessage Type , ĊĠĠĠĠĠĠĠĠĠ Ġtype Url Ġ= Ġdefault Adapter . type Url , ĊĠĠĠĠĠĠĠĠĠ Ġsyntax Ġ= Ġdefault Adapter . syntax ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< M Ġ: ĠMessage < M , ĠB >, ĠB Ġ: ĠBuilder < M , ĠB >> Ġget Builder Type ( ĊĠĠĠĠĠ Ġmessage Type : ĠClass < M > ĊĠĠĠ Ġ): ĠClass < B > Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠClass . forName ("${ message Type . name }\ $ Builder ") Ġas ĠClass < B > ĊĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġbuilder Ġclass Ġfound Ġfor Ġmessage Ġtype Ġ${ message Type . name }") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ