Skip to content

Commit

Permalink
all old uint functions are now gone, + fixed bug in ptp_parse_prop_va…
Browse files Browse the repository at this point in the history
…lue, added to unit test
  • Loading branch information
petabyt committed Mar 29, 2024
1 parent f19d46a commit 25c27d8
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 64 deletions.
15 changes: 10 additions & 5 deletions src/data.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,22 @@ int ptp_parse_data_u32(void *d, int type, int *out) {
}

int ptp_parse_prop_value(struct PtpRuntime *r) {
uint8_t *d = ptp_get_payload(r);
int type;
switch (ptp_get_payload_length(r)) {
case 1:
return (int)(d[0]);
type = PTP_TC_UINT8; break;
case 2:
return (int)(d[0]);
type = PTP_TC_UINT16; break;
case 4:
return (int)(d[0]);
type = PTP_TC_UINT32; break;
default:
ptp_panic("ptp_parse_prop_value: unknown data type");
}

return -1;
int out;
ptp_parse_data_u32(ptp_get_payload(r), type, &out);

return out;
}

int parse_data_data_or_u32(uint8_t *d, int type, uint32_t *u32, void **data) {
Expand Down
78 changes: 19 additions & 59 deletions src/packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,41 +9,6 @@
#include <ptp.h>
#include <camlib.h>

static uint8_t ptp_read_uint8(void *dat) {
uint8_t **p = (uint8_t **)dat;
uint8_t x = (**p);
(*p)++;
return x;
}

static uint16_t ptp_read_uint16(void *dat) {
uint16_t **p = (uint16_t **)dat;
uint16_t x = (**p);
(*p)++;
return x;
}

static uint32_t ptp_read_uint32(void *dat) {
uint32_t **p = (uint32_t **)dat;
uint32_t x = (**p);
(*p)++;
return x;
}

static void ptp_write_uint8(void *dat, uint8_t b) {
uint8_t **ptr = (uint8_t **)dat;
(**ptr) = b;
(*ptr)++;
}

static int ptp_write_uint32(void *dat, uint32_t b) {
uint32_t **ptr = (uint32_t **)dat;
(**ptr) = b;
(*ptr)++;

return 4;
}

// Read standard UTF16 string
int ptp_read_string(uint8_t *d, char *string, int max) {
int of = 0;
Expand All @@ -66,44 +31,39 @@ int ptp_read_string(uint8_t *d, char *string, int max) {
return of;
}

static int ptp_read_uint16_array_(void *dat, uint16_t *buf, int max) {
int n = ptp_read_uint32(dat);
int ptp_read_uint16_array(uint8_t *dat, uint16_t *buf, int max, int *length) {
int of = 0;

for (int i = 0; i < n; i++) {
uint32_t n;
of += ptp_read_u32(dat + of, &n);

for (uint32_t i = 0; i < n; i++) {
if (i >= max) {
(void)ptp_read_uint16(dat);
ptp_panic("ptp_read_uint16_array overflow\n");
} else {
buf[i] = ptp_read_uint16(dat);
of += ptp_read_u16(buf + of, &buf[i]);
}
}

return n;
return of;
}

int ptp_read_uint16_array(uint8_t *dat, uint16_t *buf, int max, int *length) {
uint8_t *two = dat;
(*length) = ptp_read_uint16_array_(&two, buf, max);
return two - dat;
}
// Write standard PTP wchar string
int ptp_write_string(uint8_t *dat, char *string) {
int of = 0;

static int ptp_write_string_(void *dat, char *string) {
int length = strlen(string);
ptp_write_uint8(dat, length);
uint32_t length = strlen(string);
of += ptp_write_u8(dat + of, length);

for (int i = 0; i < length; i++) {
ptp_write_uint8(dat, string[i]);
ptp_write_uint8(dat, '\0');
of += ptp_write_u8(dat + of, string[i]);
of += ptp_write_u8(dat + of, '\0');
}

ptp_write_uint8(dat, '\0');

return (length * 2) + 2;
}

int ptp_write_string(uint8_t *dat, char *string) {
return ptp_write_string_(&dat, string);
return of;
}

// Write normal UTF-8 string
int ptp_write_utf8_string(void *dat, char *string) {
char *o = (char *)dat;
int x = 0;
Expand All @@ -128,7 +88,7 @@ int ptp_write_unicode_string(char *dat, char *string) {
return i;
}

// Reaed null-terminated UTF16 string
// Read null-terminated UTF16 string
int ptp_read_unicode_string(char *buffer, char *dat, int max) {
int i;
for (i = 0; dat[i] != '\0'; i += 2) {
Expand Down
5 changes: 5 additions & 0 deletions test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,11 @@ int test_props() {
int rc = test_setup_usb(&r);
if (rc) return rc;

rc = ptp_get_prop_value(&r, PTP_PC_BatteryLevel);
if (rc) return rc;
printf("Test parse: %d\n", ptp_parse_prop_value(&r));
assert(ptp_parse_prop_value(&r) == 50);

struct PtpPropDesc pd;
rc = ptp_get_prop_desc(&r, PTP_PC_BatteryLevel, &pd);
if (rc) return rc;
Expand Down

0 comments on commit 25c27d8

Please sign in to comment.