use srum_core::{ole_date_to_datetime, AppUsageRecord};
use crate::SrumError;
const COL_DATA_LEN: usize = 290;
const COL_AUTO_INC_OFF: usize = 4;
const COL_TIMESTAMP_OFF: usize = 8;
const COL_APP_ID_OFF: usize = 16;
const COL_USER_ID_OFF: usize = 20;
pub fn decode_app_record(data: &[u8], page: u32, tag: usize) -> Result<AppUsageRecord, SrumError> {
decode_real_ese(data, page, tag)
}
fn decode_real_ese(data: &[u8], page: u32, tag: usize) -> Result<AppUsageRecord, SrumError> {
let need = COL_DATA_LEN + 2;
if data.len() < need {
return Err(SrumError::DecodeError {
page,
tag,
detail: format!(
"app_usage ESE record too short: len={}, need >= {need}",
data.len()
),
});
}
let col_start = data.len() - COL_DATA_LEN;
let auto_inc_id = u32::from_le_bytes([
data[col_start + COL_AUTO_INC_OFF],
data[col_start + COL_AUTO_INC_OFF + 1],
data[col_start + COL_AUTO_INC_OFF + 2],
data[col_start + COL_AUTO_INC_OFF + 3],
]);
let ts_off = col_start + COL_TIMESTAMP_OFF;
let timestamp_raw = f64::from_le_bytes([
data[ts_off], data[ts_off + 1], data[ts_off + 2], data[ts_off + 3],
data[ts_off + 4], data[ts_off + 5], data[ts_off + 6], data[ts_off + 7],
]);
let timestamp = ole_date_to_datetime(timestamp_raw);
let app_off = col_start + COL_APP_ID_OFF;
let app_id = i32::from_le_bytes([
data[app_off], data[app_off + 1], data[app_off + 2], data[app_off + 3],
]);
let usr_off = col_start + COL_USER_ID_OFF;
let user_id = i32::from_le_bytes([
data[usr_off], data[usr_off + 1], data[usr_off + 2], data[usr_off + 3],
]);
Ok(AppUsageRecord {
timestamp,
app_id,
user_id,
foreground_cycles: 0,
background_cycles: 0,
auto_inc_id,
})
}