(out_ptr: *mut *mut u8, out_len: *mut usize)
| 140 | |
| 141 | #[no_mangle] |
| 142 | pub extern "system" fn getCoverArt(out_ptr: *mut *mut u8, out_len: *mut usize) -> i32 { |
| 143 | if out_ptr.is_null() || out_len.is_null() { |
| 144 | return 0; // false |
| 145 | } |
| 146 | let result = std::panic::catch_unwind(|| { |
| 147 | block_on(async { |
| 148 | match get_spotify_session()? { |
| 149 | Some(session) => { |
| 150 | let props = session.TryGetMediaPropertiesAsync()?.get()?; |
| 151 | let thumbnail = props.Thumbnail()?; |
| 152 | let stream = thumbnail.OpenReadAsync()?.get()?; |
| 153 | let size = stream.Size()?; |
| 154 | |
| 155 | if size == 0 { |
| 156 | return Err(Error::new(E_FAIL, "Cover art size is zero")); |
| 157 | } |
| 158 | |
| 159 | use windows::Storage::Streams::DataReader; |
| 160 | let reader = DataReader::CreateDataReader(&stream)?; |
| 161 | reader.LoadAsync(size as u32)?.get()?; |
| 162 | |
| 163 | let mut buffer = vec![0u8; size as usize]; |
| 164 | reader.ReadBytes(&mut buffer)?; |
| 165 | Ok(buffer) |
| 166 | } |
| 167 | _ => Err(Error::empty()), |
| 168 | } |
| 169 | }) |
| 170 | }); |
| 171 | |
| 172 | match result { |
| 173 | Ok(Ok(buffer)) => unsafe { |
| 174 | let len = buffer.len(); |
| 175 | let ptr = libc::malloc(len); |
| 176 | if ptr.is_null() { |
| 177 | return 0; // false |
| 178 | } |
| 179 | std::ptr::copy_nonoverlapping(buffer.as_ptr(), ptr as *mut u8, len); |
| 180 | *out_ptr = ptr as *mut u8; |
| 181 | *out_len = len; |
| 182 | 1 // true |
| 183 | }, |
| 184 | _ => { |
| 185 | 0 // false |
| 186 | } |
| 187 | } |
| 188 | } |
| 189 | |
| 190 | #[no_mangle] |
| 191 | pub extern "system" fn freeString(s: *mut c_char) { |
nothing calls this directly
no test coverage detected