String FromWin32CF(int cf) { GuiLock __; if(cf == CF_TEXT) return "text"; if(cf == CF_UNICODETEXT) return "wtext"; if(cf == CF_DIB) return "dib"; #ifndef PLATFORM_WINCE if(cf == CF_HDROP) return "files"; #endif char h[256]; GetClipboardFormatNameA(cf, h, 255); return h; }
/************************************************************************** * IDataObject_fnGetData */ HRESULT WINAPI CIDLDataObj::GetData(LPFORMATETC pformatetcIn, STGMEDIUM *pmedium) { char szTemp[256]; szTemp[0] = 0; GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256); TRACE("(%p)->(%p %p format=%s)\n", this, pformatetcIn, pmedium, szTemp); if (pformatetcIn->cfFormat == cfShellIDList) { if (cidl < 1) return(E_UNEXPECTED); pmedium->hGlobal = RenderSHELLIDLIST(pidl, apidl, cidl); } else if (pformatetcIn->cfFormat == CF_HDROP) { if (cidl < 1) return(E_UNEXPECTED); pmedium->hGlobal = RenderHDROP(pidl, apidl, cidl); } else if (pformatetcIn->cfFormat == cfFileNameA) { if (cidl < 1) return(E_UNEXPECTED); pmedium->hGlobal = RenderFILENAMEA(pidl, apidl, cidl); } else if (pformatetcIn->cfFormat == cfFileNameW) { if (cidl < 1) return(E_UNEXPECTED); pmedium->hGlobal = RenderFILENAMEW(pidl, apidl, cidl); } else if (pformatetcIn->cfFormat == cfPreferredDropEffect) { pmedium->hGlobal = RenderPREFEREDDROPEFFECT(dropeffect); } else { FIXME("-- expected clipformat not implemented\n"); return (E_INVALIDARG); } if (pmedium->hGlobal) { pmedium->tymed = TYMED_HGLOBAL; pmedium->pUnkForRelease = NULL; return S_OK; } return E_OUTOFMEMORY; }
/************************************************************************** * IDataObject_fnGetData */ static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium) { IDataObjectImpl *This = (IDataObjectImpl *)iface; char szTemp[256]; szTemp[0]=0; GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256); TRACE("(%p)->(%p %p format=%s)\n", This, pformatetcIn, pmedium, szTemp); if (pformatetcIn->cfFormat == This->cfShellIDList) { if (This->cidl < 1) return(E_UNEXPECTED); pmedium->u.hGlobal = RenderSHELLIDLIST(This->pidl, This->apidl, This->cidl); } else if (pformatetcIn->cfFormat == CF_HDROP) { if (This->cidl < 1) return(E_UNEXPECTED); pmedium->u.hGlobal = RenderHDROP(This->pidl, This->apidl, This->cidl); } else if (pformatetcIn->cfFormat == This->cfFileNameA) { if (This->cidl < 1) return(E_UNEXPECTED); pmedium->u.hGlobal = RenderFILENAMEA(This->pidl, This->apidl, This->cidl); } else if (pformatetcIn->cfFormat == This->cfFileNameW) { if (This->cidl < 1) return(E_UNEXPECTED); pmedium->u.hGlobal = RenderFILENAMEW(This->pidl, This->apidl, This->cidl); } else { FIXME("-- expected clipformat not implemented\n"); return (E_INVALIDARG); } if (pmedium->u.hGlobal) { pmedium->tymed = TYMED_HGLOBAL; pmedium->pUnkForRelease = NULL; return S_OK; } return E_OUTOFMEMORY; }
/* MAKE_EXPORT GetClipboardFormatNameW_new=GetClipboardFormatNameW */ BOOL WINAPI GetClipboardFormatNameW_new(UINT format, LPWSTR lpszFormatName, int cchMaxCount) { LPSTR lpBuffer = (LPSTR)malloc(cchMaxCount); BOOL result; if(lpBuffer == NULL) return FALSE; result = GetClipboardFormatNameA(format, lpBuffer, cchMaxCount); if(!result) { free(lpBuffer); return FALSE; } STACK_AtoW(lpBuffer, lpszFormatName); free(lpBuffer); return TRUE; }
bool ClipboardUtil::getAvailableClipboardFormats(std::vector<std::string> *formatsArray) { //KITDIAG_ASSERT(formatsArray); ClipboardGuard clipboardGuard(GetClipboardOwner()); if (!clipboardGuard.isOpen()) { return false; } formatsArray->clear(); char formatName[100]; std::string formatNameString; UINT uFormat = EnumClipboardFormats(0); while (uFormat) { if (getStandardClipboardFormatName(&formatNameString, uFormat)) { formatsArray->push_back(formatNameString); } else if (GetClipboardFormatNameA(uFormat, formatName, sizeof(formatName))) { formatNameString = formatName; formatsArray->push_back(formatNameString); } uFormat = EnumClipboardFormats(uFormat); } return true; }
static int cliprdr_send_format_list(wfClipboard* clipboard) { int count; int length; UINT32 index; UINT32 numFormats; UINT32 formatId = 0; char formatName[1024]; CLIPRDR_FORMAT* format; CLIPRDR_FORMAT* formats; CLIPRDR_FORMAT_LIST formatList; ZeroMemory(&formatList, sizeof(CLIPRDR_FORMAT_LIST)); if (!OpenClipboard(clipboard->hwnd)) return -1; count = CountClipboardFormats(); numFormats = (UINT32) count; formats = (CLIPRDR_FORMAT*) calloc(numFormats, sizeof(CLIPRDR_FORMAT)); index = 0; while (formatId = EnumClipboardFormats(formatId)) { format = &formats[index++]; format->formatId = formatId; length = 0; format->formatName = NULL; if (formatId >= CF_MAX) { length = GetClipboardFormatNameA(formatId, formatName, sizeof(formatName) - 1); } if (length > 0) { format->formatName = _strdup(formatName); } } CloseClipboard(); formatList.msgFlags = 0; formatList.numFormats = numFormats; formatList.formats = formats; clipboard->context->ClientFormatList(clipboard->context, &formatList); for (index = 0; index < numFormats; index++) { format = &formats[index]; free(format->formatName); } free(formats); return 1; }
static void test_RegisterClipboardFormatA(void) { ATOM atom_id; UINT format_id, format_id2; char buf[256]; int len; BOOL ret; HANDLE handle; format_id = RegisterClipboardFormatA("my_cool_clipboard_format"); ok(format_id > 0xc000 && format_id < 0xffff, "invalid clipboard format id %04x\n", format_id); format_id2 = RegisterClipboardFormatA("MY_COOL_CLIPBOARD_FORMAT"); ok(format_id2 == format_id, "invalid clipboard format id %04x\n", format_id2); len = GetClipboardFormatNameA(format_id, buf, 256); ok(len == lstrlenA("my_cool_clipboard_format"), "wrong format name length %d\n", len); ok(!lstrcmpA(buf, "my_cool_clipboard_format"), "wrong format name \"%s\"\n", buf); lstrcpyA(buf, "foo"); SetLastError(0xdeadbeef); len = GetAtomNameA((ATOM)format_id, buf, 256); ok(len == 0, "GetAtomNameA should fail\n"); ok(GetLastError() == ERROR_INVALID_HANDLE, "err %d\n", GetLastError()); todo_wine { lstrcpyA(buf, "foo"); SetLastError(0xdeadbeef); len = GlobalGetAtomNameA((ATOM)format_id, buf, 256); ok(len == 0, "GlobalGetAtomNameA should fail\n"); ok(GetLastError() == ERROR_INVALID_HANDLE, "err %d\n", GetLastError()); } SetLastError(0xdeadbeef); atom_id = FindAtomA("my_cool_clipboard_format"); ok(atom_id == 0, "FindAtomA should fail\n"); ok(GetLastError() == ERROR_FILE_NOT_FOUND, "err %d\n", GetLastError()); if (0) { /* this relies on the clipboard and global atom table being different */ SetLastError(0xdeadbeef); atom_id = GlobalFindAtomA("my_cool_clipboard_format"); ok(atom_id == 0, "GlobalFindAtomA should fail\n"); ok(GetLastError() == ERROR_FILE_NOT_FOUND, "err %d\n", GetLastError()); } for (format_id = 0; format_id < 0xffff; format_id++) { SetLastError(0xdeadbeef); len = GetClipboardFormatNameA(format_id, buf, 256); if (format_id < 0xc000) ok(!len, "GetClipboardFormatNameA should fail, but it returned %d (%s)\n", len, buf); else if (len && winetest_debug > 1) trace("%04x: %s\n", format_id, len ? buf : ""); } ret = OpenClipboard(0); ok( ret, "OpenClipboard error %d\n", GetLastError()); /* try some invalid/unregistered formats */ SetLastError( 0xdeadbeef ); handle = SetClipboardData( 0, GlobalAlloc( GMEM_DDESHARE | GMEM_MOVEABLE, 1 )); ok( !handle, "SetClipboardData succeeded\n" ); ok( GetLastError() == ERROR_CLIPBOARD_NOT_OPEN, "wrong error %u\n", GetLastError()); handle = SetClipboardData( 0x1234, GlobalAlloc( GMEM_DDESHARE | GMEM_MOVEABLE, 1 )); ok( handle != 0, "SetClipboardData failed err %d\n", GetLastError()); handle = SetClipboardData( 0x123456, GlobalAlloc( GMEM_DDESHARE | GMEM_MOVEABLE, 1 )); ok( handle != 0, "SetClipboardData failed err %d\n", GetLastError()); handle = SetClipboardData( 0xffff8765, GlobalAlloc( GMEM_DDESHARE | GMEM_MOVEABLE, 1 )); ok( handle != 0, "SetClipboardData failed err %d\n", GetLastError()); ok( IsClipboardFormatAvailable( 0x1234 ), "format missing\n" ); ok( IsClipboardFormatAvailable( 0x123456 ), "format missing\n" ); ok( IsClipboardFormatAvailable( 0xffff8765 ), "format missing\n" ); ok( !IsClipboardFormatAvailable( 0 ), "format available\n" ); ok( !IsClipboardFormatAvailable( 0x3456 ), "format available\n" ); ok( !IsClipboardFormatAvailable( 0x8765 ), "format available\n" ); trace("# of formats available: %d\n", CountClipboardFormats()); format_id = 0; while ((format_id = EnumClipboardFormats(format_id))) { ok(IsClipboardFormatAvailable(format_id), "format %04x was listed as available\n", format_id); len = GetClipboardFormatNameA(format_id, buf, 256); trace("%04x: %s\n", format_id, len ? buf : ""); } ret = EmptyClipboard(); ok( ret, "EmptyClipboard error %d\n", GetLastError()); ret =CloseClipboard(); ok( ret, "CloseClipboard error %d\n", GetLastError()); if (CountClipboardFormats()) { SetLastError(0xdeadbeef); ok(!EnumClipboardFormats(0), "EnumClipboardFormats should fail if clipboard wasn't open\n"); ok(GetLastError() == ERROR_CLIPBOARD_NOT_OPEN, "Last error should be set to ERROR_CLIPBOARD_NOT_OPEN, not %d\n", GetLastError()); } SetLastError(0xdeadbeef); ok(!EmptyClipboard(), "EmptyClipboard should fail if clipboard wasn't open\n"); ok(GetLastError() == ERROR_CLIPBOARD_NOT_OPEN || broken(GetLastError() == 0xdeadbeef), /* wow64 */ "Wrong error %u\n", GetLastError()); format_id = RegisterClipboardFormatA("#1234"); ok(format_id == 1234, "invalid clipboard format id %04x\n", format_id); }
static void test_RegisterClipboardFormatA(void) { ATOM atom_id; UINT format_id, format_id2; char buf[256]; int len; BOOL ret; format_id = RegisterClipboardFormatA("my_cool_clipboard_format"); ok(format_id > 0xc000 && format_id < 0xffff, "invalid clipboard format id %04x\n", format_id); format_id2 = RegisterClipboardFormatA("MY_COOL_CLIPBOARD_FORMAT"); ok(format_id2 == format_id, "invalid clipboard format id %04x\n", format_id2); len = GetClipboardFormatNameA(format_id, buf, 256); ok(len == lstrlenA("my_cool_clipboard_format"), "wrong format name length %d\n", len); ok(!lstrcmpA(buf, "my_cool_clipboard_format"), "wrong format name \"%s\"\n", buf); lstrcpyA(buf, "foo"); SetLastError(0xdeadbeef); len = GetAtomNameA((ATOM)format_id, buf, 256); ok(len == 0, "GetAtomNameA should fail\n"); test_last_error(ERROR_INVALID_HANDLE); todo_wine { lstrcpyA(buf, "foo"); SetLastError(0xdeadbeef); len = GlobalGetAtomNameA((ATOM)format_id, buf, 256); ok(len == 0, "GlobalGetAtomNameA should fail\n"); test_last_error(ERROR_INVALID_HANDLE); } SetLastError(0xdeadbeef); atom_id = FindAtomA("my_cool_clipboard_format"); ok(atom_id == 0, "FindAtomA should fail\n"); test_last_error(ERROR_FILE_NOT_FOUND); if (0) { /* this relies on the clipboard and global atom table being different */ SetLastError(0xdeadbeef); atom_id = GlobalFindAtomA("my_cool_clipboard_format"); ok(atom_id == 0, "GlobalFindAtomA should fail\n"); test_last_error(ERROR_FILE_NOT_FOUND); for (format_id = 0; format_id < 0xffff; format_id++) { SetLastError(0xdeadbeef); len = GetClipboardFormatNameA(format_id, buf, 256); if (format_id < 0xc000) { ok(!len, "GetClipboardFormatNameA should fail, but it returned %d (%s)\n", len, buf); test_last_error(ERROR_INVALID_PARAMETER); } else { if (len) trace("%04x: %s\n", format_id, len ? buf : ""); else test_last_error(ERROR_INVALID_HANDLE); } } } ret = OpenClipboard(0); ok( ret, "OpenClipboard error %d\n", GetLastError()); trace("# of formats available: %d\n", CountClipboardFormats()); format_id = 0; while ((format_id = EnumClipboardFormats(format_id))) { ok(IsClipboardFormatAvailable(format_id), "format %04x was listed as available\n", format_id); len = GetClipboardFormatNameA(format_id, buf, 256); trace("%04x: %s\n", format_id, len ? buf : ""); } ret = EmptyClipboard(); ok( ret, "EmptyClipboard error %d\n", GetLastError()); ret =CloseClipboard(); ok( ret, "CloseClipboard error %d\n", GetLastError()); if (CountClipboardFormats()) { SetLastError(0xdeadbeef); ok(!EnumClipboardFormats(0), "EnumClipboardFormats should fail if clipboard wasn't open\n"); ok(GetLastError() == ERROR_CLIPBOARD_NOT_OPEN, "Last error should be set to ERROR_CLIPBOARD_NOT_OPEN, not %d\n", GetLastError()); } SetLastError(0xdeadbeef); ok(!EmptyClipboard(), "EmptyClipboard should fail if clipboard wasn't open\n"); ok(GetLastError() == ERROR_CLIPBOARD_NOT_OPEN || broken(GetLastError() == 0xdeadbeef), /* wow64 */ "Wrong error %u\n", GetLastError()); }