blob: 1302d9add4e88207ecd6f41d9496010348ce6a1a [file] [log] [blame]
// Copyright 2004-2009 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================
#include "omaha/common/clipboard.h"
#include "base/basictypes.h"
#include "omaha/common/debug.h"
namespace omaha {
// Put the given string on the system clipboard
void SetClipboard(const TCHAR *string_to_set) {
ASSERT(string_to_set, (L""));
int len = lstrlen(string_to_set);
//
// Note to developer: It is not always possible to step through this code
// since the debugger will possibly steal the clipboard. E.g. OpenClipboard
// might succeed and EmptyClipboard might fail with "Thread does not have
// clipboard open".
//
// Actual clipboard processing
if (::OpenClipboard(NULL)) {
BOOL b = ::EmptyClipboard();
ASSERT(b, (L"EmptyClipboard failed"));
// Include the terminating null
len++;
HANDLE copy_handle = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
len * sizeof(TCHAR));
ASSERT(copy_handle, (L""));
byte* copy_data = reinterpret_cast<byte*>(::GlobalLock(copy_handle));
memcpy(copy_data, string_to_set, len * sizeof(TCHAR));
::GlobalUnlock(copy_handle);
#ifdef _UNICODE
HANDLE h = ::SetClipboardData(CF_UNICODETEXT, copy_handle);
#else
HANDLE h = ::SetClipboardData(CF_TEXT, copy_handle);
#endif
ASSERT(h != NULL, (L"SetClipboardData failed"));
if (!h) {
::GlobalFree(copy_handle);
}
VERIFY(::CloseClipboard(), (L""));
} else {
ASSERT(false, (L"OpenClipboard failed - %i", ::GetLastError()));
}
}
} // namespace omaha