Bool CPClipboard_Unserialize(CPClipboard *clip, // OUT: the clipboard const void *buf, // IN: input buffer size_t len) // IN: buffer length { DND_CPFORMAT fmt; BufRead r; uint32 maxFmt; ASSERT(clip); ASSERT(buf); CPClipboard_Init(clip); r.pos = buf; r.unreadLen = len; /* First get number of formats in the buf. */ if (!DnDReadBuffer(&r, &maxFmt, sizeof maxFmt)) { goto error; } /* This version only supports number of formats up to CPFORMAT_MAX. */ maxFmt = MIN(CPFORMAT_MAX, maxFmt); for (fmt = CPFORMAT_MIN; fmt < maxFmt; ++fmt) { Bool exists; uint32 size; if (!DnDReadBuffer(&r, &exists, sizeof exists) || !DnDReadBuffer(&r, &size, sizeof size)) { goto error; } if (exists && size) { if (size > r.unreadLen) { goto error; } if (!CPClipboard_SetItem(clip, fmt, r.pos, size)) { goto error; } if (!DnDSlideBuffer(&r, size)) { goto error; } } } /* It is possible that clip->changed is missing in some beta products. */ if (r.unreadLen == sizeof clip->changed && !DnDReadBuffer(&r, &clip->changed, sizeof clip->changed)) { goto error; } return TRUE; error: CPClipboard_Destroy(clip); return FALSE; }
Bool DnD_CPNameListToDynBufArray(char *fileList, // IN: CPName format size_t listSize, // IN DynBufArray *dynBufArray) // OUT { DynBuf buf; BufRead r; int32 pathLen; size_t count; size_t i; ASSERT(fileList); r.pos = fileList; r.unreadLen = listSize; DynBufArray_Init(dynBufArray, 0); while (r.unreadLen > 0) { DynBuf_Init(&buf); if (!DnDReadBuffer(&r, &pathLen, sizeof pathLen) || (pathLen > r.unreadLen) || !DynBuf_Append(&buf, r.pos, pathLen)) { goto error; } if (!DnDSlideBuffer(&r, pathLen)) { goto error; } if (!DynBufArray_Push(dynBufArray, buf)) { goto error; } } return TRUE; error: DynBuf_Destroy(&buf); count = DynBufArray_Count(dynBufArray); for (i = 0; i < count; i++) { DynBuf *b = DynArray_AddressOf(dynBufArray, i); DynBuf_Destroy(b); } DynBufArray_SetCount(dynBufArray, 0); DynBufArray_Destroy(dynBufArray); return FALSE; }