@@ -675,11 +675,11 @@ pub enum BalloonLayout {
675675pub struct Balloon {
676676 pub url : String ,
677677 pub session : Option < String > , // UUID
678- pub layout : BalloonLayout ,
678+ pub layout : Option < BalloonLayout > ,
679679 pub ld_text : Option < String > ,
680680 pub is_live : bool ,
681681
682- pub icon : Vec < u8 > ,
682+ pub icon : Option < Vec < u8 > > ,
683683}
684684
685685impl Balloon {
@@ -701,7 +701,7 @@ impl Balloon {
701701 layout : unpacked. layout ,
702702 ld_text : unpacked. ldtext ,
703703 is_live : unpacked. live_layout_info . is_some ( ) ,
704- icon : ungzip ( & * unpacked . app_icon ) ? ,
704+ icon : unpacked . app_icon . map ( |a| ungzip ( & a ) . unwrap ( ) ) ,
705705 } )
706706 }
707707
@@ -710,10 +710,10 @@ impl Balloon {
710710 item : RawBalloonData {
711711 ldtext : self . ld_text . clone ( ) ,
712712 layout : self . layout . clone ( ) ,
713- app_icon : NSData {
714- data : gzip ( & self . icon ) ? . into ( ) ,
713+ app_icon : self . icon . as_ref ( ) . map ( |icon| NSData {
714+ data : gzip ( & icon) . unwrap ( ) . into ( ) ,
715715 class : NSDataClass :: NSMutableData
716- } ,
716+ } ) ,
717717 app_name : app. name . clone ( ) ,
718718 session_identifier : self . session . as_ref ( ) . map ( |session| Uuid :: from_str ( & session) . unwrap ( ) . into ( ) ) ,
719719 live_layout_info : if self . is_live {
@@ -912,7 +912,8 @@ pub enum ReactMessageType {
912912 } ,
913913 Extension {
914914 spec : ExtensionApp ,
915- body : MessageParts
915+ body : MessageParts ,
916+ is_meta : bool ,
916917 } ,
917918}
918919
@@ -950,11 +951,11 @@ impl ReactMessageType {
950951 )
951952 }
952953 } ,
953- Self :: Extension { spec : ExtensionApp { balloon : None , .. } , body } => {
954+ Self :: Extension { spec : ExtensionApp { balloon : None , .. } , body, .. } => {
954955 body. raw_text ( )
955956 }
956957 ,
957- Self :: Extension { spec : ExtensionApp { balloon : Some ( _) , .. } , body } => {
958+ Self :: Extension { spec : ExtensionApp { balloon : Some ( _) , .. } , body, .. } => {
958959 "\u{fffd} " . to_string ( ) // replacement character
959960 }
960961 }
@@ -967,8 +968,9 @@ impl ReactMessageType {
967968 } else {
968969 reaction. get_idx ( ) + 3000
969970 } ,
970- Self :: Extension { spec : ExtensionApp { balloon : None , .. } , body : _ } => 1000 ,
971- Self :: Extension { spec : ExtensionApp { balloon : Some ( _) , .. } , body : _ } => 2 ,
971+ Self :: Extension { spec : ExtensionApp { balloon : None , .. } , body : _, .. } => 1000 ,
972+ Self :: Extension { spec : ExtensionApp { balloon : Some ( _) , .. } , body : _, is_meta : false } => 2 ,
973+ Self :: Extension { spec : ExtensionApp { balloon : Some ( _) , .. } , body : _, is_meta : true } => 4000 ,
972974 }
973975 }
974976
@@ -979,29 +981,29 @@ impl ReactMessageType {
979981
980982 fn notification ( & self ) -> bool {
981983 match self {
982- Self :: React { reaction : _ , enable : _ } => true ,
983- Self :: Extension { spec : _ , body : _ } => false ,
984+ Self :: React { .. } => true ,
985+ Self :: Extension { is_meta , .. } => * is_meta ,
984986 }
985987 }
986988
987989 fn prid ( & self ) -> Option < String > {
988990 match self {
989- Self :: Extension { spec : ExtensionApp { balloon : None , .. } , body : _ } => Some ( "3cN" . to_string ( ) ) ,
991+ Self :: Extension { spec : ExtensionApp { balloon : None , .. } , body : _, .. } => Some ( "3cN" . to_string ( ) ) ,
990992 _ => None ,
991993 }
992994 }
993995
994996 fn get_xml ( & self ) -> Option < String > {
995997 match self {
996998 Self :: React { reaction : _, enable : _ } => None ,
997- Self :: Extension { spec : _, body } => {
999+ Self :: Extension { spec : _, body, .. } => {
9981000 Some ( body. to_xml ( None ) )
9991001 } ,
10001002 }
10011003 }
10021004
10031005 fn is_balloon ( & self ) -> bool {
1004- matches ! ( self , Self :: Extension { spec: ExtensionApp { balloon: Some ( _) , .. } , body: _ } )
1006+ matches ! ( self , Self :: Extension { spec: ExtensionApp { balloon: Some ( _) , .. } , body: _, .. } )
10051007 }
10061008}
10071009
@@ -2157,13 +2159,15 @@ impl MessageInst {
21572159 let text = react. get_text ( ) ;
21582160
21592161 let mut balloon_id: Option < String > = None ;
2162+ let mut balloon_name: Option < String > = None ;
21602163 let mut balloon_part: Option < Vec < u8 > > = None ;
21612164 let mut app_info: Option < Data > = None ;
2162- if let ReactMessageType :: Extension { spec : app_obj, body : _ } = & react. reaction {
2165+ if let ReactMessageType :: Extension { spec : app_obj, body : _, .. } = & react. reaction {
21632166 let ( app, balloon) = app_obj. to_raw ( ) ?;
21642167 app_info = if balloon. is_none ( ) { Some ( app. into ( ) ) } else { None } ;
21652168 balloon_part = balloon;
21662169 balloon_id = Some ( app_obj. bundle_id . clone ( ) ) ;
2170+ balloon_name = Some ( app_obj. name . clone ( ) ) ;
21672171 }
21682172
21692173 let ( balloon_part, balloon_part_mmcs) = if let Some ( balloon_part) = balloon_part {
@@ -2187,7 +2191,9 @@ impl MessageInst {
21872191 cv_name : conversation. cv_name . clone ( ) ,
21882192 notification : if react. reaction . notification ( ) { Some ( plist_to_bin ( & NotificationData {
21892193 ams : react. to_text . clone ( ) ,
2190- amc : 1
2194+ amc : if balloon_name. is_some ( ) { 9 } else { 1 } ,
2195+ amd : balloon_name,
2196+ amb : balloon_id. clone ( ) ,
21912197 } ) . unwrap ( ) . into ( ) ) } else { None } ,
21922198 amk : if let Some ( part) = react. to_part { format ! ( "p:{}/{}" , part, react. to_uuid) } else { react. to_uuid . clone ( ) } ,
21932199 type_spec : app_info,
@@ -2637,7 +2643,7 @@ impl MessageInst {
26372643 } ) , Message :: RenameMessage ( RenameMessage { new_name : loaded. new_name . clone ( ) } ) ) ;
26382644 }
26392645 if let Ok ( loaded) = plist:: from_value :: < RawReactMessage > ( & value) {
2640- let ( to_uuid, to_part) = if loaded. amt == 2 {
2646+ let ( to_uuid, to_part) = if loaded. amt == 2 || loaded . amt == 4000 {
26412647 ( loaded. amk , None )
26422648 } else {
26432649 let target_msg_data = Regex :: new ( r"p:([0-9]+)/([0-9A-F\-]+)" ) . unwrap ( )
@@ -2646,16 +2652,17 @@ impl MessageInst {
26462652 } ;
26472653
26482654 let msg = match loaded. amt {
2649- 2 => {
2655+ 2 | 4000 => {
26502656 let balloon_part = Self :: get_balloon ( loaded. balloon_part , loaded. balloon_part_mmcs , apns) . await ;
2651- let ( Some ( xml ) , Some ( balloon) , Some ( balloon_id) ) = ( & loaded . xml , & balloon_part, & loaded. balloon_id ) else {
2657+ let ( Some ( balloon) , Some ( balloon_id) ) = ( & balloon_part, & loaded. balloon_id ) else {
26522658 return Err ( PushError :: BadMsg )
26532659 } ;
26542660
26552661 let data = ExtensionApp :: from_bp ( balloon, balloon_id) ?;
26562662 ReactMessageType :: Extension {
26572663 spec : data,
2658- body : MessageParts :: parse_parts ( xml, None ) ,
2664+ body : loaded. xml . as_ref ( ) . map ( |xml| MessageParts :: parse_parts ( xml, None ) ) . unwrap_or ( MessageParts ( vec ! [ ] ) ) ,
2665+ is_meta : loaded. amt == 4000 ,
26592666 }
26602667 } ,
26612668 1000 => {
@@ -2666,6 +2673,7 @@ impl MessageInst {
26662673 ReactMessageType :: Extension {
26672674 spec : data,
26682675 body : MessageParts :: parse_parts ( xml, None ) ,
2676+ is_meta : false ,
26692677 }
26702678 } ,
26712679 2007 | 3007 => {
0 commit comments