Checkin for Gabe Yoder
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1590 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,153 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>BClipboard Use Cases and Implementation Details</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY BGCOLOR="white" LINK="#000067" VLINK="#000067" ALINK="#0000FF">
|
||||||
|
|
||||||
|
<FONT FACE="Verdana,Arial,Helvetica,sans-serif" SIZE="-1">
|
||||||
|
|
||||||
|
<H1>BClipboard Use Cases and Implementation Details:</H1>
|
||||||
|
|
||||||
|
<P>This document describes the BClipboard interface and some basics of how it is implemented.
|
||||||
|
The document has the following sections:</P>
|
||||||
|
|
||||||
|
<OL>
|
||||||
|
<LI><A HREF="#interface">BClipboard Interface</A></LI>
|
||||||
|
<LI><A HREF="#usecases">BClipboard Use Cases</A></LI>
|
||||||
|
<LI><A HREF="#implement">BClipboard Implementation</A></LI>
|
||||||
|
</OL>
|
||||||
|
|
||||||
|
<A NAME="interface"></A><H2>BClipboard Interface:</H2>
|
||||||
|
|
||||||
|
<P>The BClipboard class provides an interface to a named, system-wide, temporary storage resource.
|
||||||
|
Access to the system clipboard is provided by the be_clipboard variable provided by a BApplication object (or by constructing a clipboard with the name "system").
|
||||||
|
The best source of information for the BClipboard interface can be found
|
||||||
|
<A HREF="file:///boot/beos/documentation/Be%20Book/The%20Application%20Kit/Clipboard.html">here in the Be Book</A>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<A NAME="usecases"></A><H2>BClipboard Use Cases:</H2>
|
||||||
|
|
||||||
|
<P>The following use cases cover the BClipboard functionality:</P>
|
||||||
|
|
||||||
|
<OL>
|
||||||
|
<LI><P><B>Construction:</B> A BClipboard will accept one or two arguments to construction.
|
||||||
|
A name is required for identifying the clipboard. The discard argument indicates whether the
|
||||||
|
clipboard data should be discarded between boots. Te discard argument defaults to false, however
|
||||||
|
this is meaningless since functionality has not been implemented to maintain clipboard data
|
||||||
|
between boots.
|
||||||
|
After construction, the queue is empty.</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Destruction:</B> The destructor destroys the BClipboard object, however the system-wide clipboard itself is unaffected.</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Writing to clipboard 1:</B>
|
||||||
|
The normal procedure for writing data consists of the following: locking the clipboard via Lock(), clearing the
|
||||||
|
data via Clear(), adding data to the clipboard message, committing the data via Commit(), and unlocking the
|
||||||
|
clipboard via Unlock().
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Writing to clipboard 2:</B>
|
||||||
|
The data which is to be written is not added directly to the BClipboard object, but is added to the data
|
||||||
|
message for the BClipboard. The message is obtained by calling BClipboard::Data(). Data is added in fields
|
||||||
|
of type B_MIME_TYPE. The name of the field corresponds to the MIME type of the data. If multiple fields are
|
||||||
|
added, they should contain the same data, but formatted for different MIME types.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Writing to clipboard 3:</B>
|
||||||
|
In the event that one wishes to back out of writing process before calling Commit(), Revert() must be called.
|
||||||
|
Otherwise, the changes to the clipboard remain in the BClipboard object.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Reading from clipboard 1:</B>
|
||||||
|
The normal procedure for reading data consists of the following: locking the clipboard via Lock(), obtaining
|
||||||
|
the data from the clipboards data message, and unlocking the clipboard via Unlock().
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Reading from clipboard 2:</B>
|
||||||
|
The data message is obtained from a call to BClipboard::Data(). Data is obtained from the message by using
|
||||||
|
BMessage::FindData for a specified MIME type.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Reading from clipboard 3:</B>
|
||||||
|
The data is uploaded from the system when Lock() is called, therefore any data which is written to the clipboard
|
||||||
|
between the calls to Lock() and Data() will not be included in the data message.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Reading from clipboard 4:</B>
|
||||||
|
It is permissible to Unlock() the clipboard before calling FindData on the data message.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Clearing:</B>
|
||||||
|
The Clear() function is used to remove all data from the clipboard and is used before adding new data which is
|
||||||
|
to be written to the clipboard. Clear() returns B_ERROR if the BClipboard is not locked, and returns B_OK if
|
||||||
|
it is locked.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Committing:</B>
|
||||||
|
The Commit() function is used to upload data from the BClipboard to the system. The data is immediately
|
||||||
|
available to other applications once Commit() has been called. Commit() returns B_ERROR if the BClipboard
|
||||||
|
is not locked, and returns B_OK if it is locked.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Revert:</B>
|
||||||
|
The Revert() function is used to synchronize the data in the BClipboard to the system. This is only needed in
|
||||||
|
case one begins to modify the data message and wishes to back out of the changes. Revert() returns B_ERROR if
|
||||||
|
the BClipboard is not locked, and returns B_OK if it is locked.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Accessing data:</B>
|
||||||
|
Data() is used to obtain a pointer to the BClipboard's data message. One is expected to read and write data
|
||||||
|
directly to the message, but the message must not be freed or dispatched. Data() returns NULL if the
|
||||||
|
BClipboard is not locked.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Accessing a data source:</B>
|
||||||
|
DataSource() is used to obtain a BMessenger pointed at the BApplication which last committed data to the
|
||||||
|
clipboard. There is no requirement for the the BClipboard to be locked when calling DataSource().
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Obtaining a count:</B>
|
||||||
|
The count refers to the number of times that data has been uploaded to the clipboard.
|
||||||
|
There are two count functions. SystemCount() returns an up to date count which is obtained from the system.
|
||||||
|
Count() returns a cached count. The cached count is set to zero upon creation
|
||||||
|
of the BClipboard, and is updated when Lock() or Commit() is called.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Locking:</B>
|
||||||
|
Lock() is used to upload data from the system into the BClipboard object and prevent other threads in the
|
||||||
|
application from using it. It must be called before reading or writing data to the BClipboard. It blocks
|
||||||
|
if the BClipboard is already locked. The return value is true if the BClipboard is successfully locked, or
|
||||||
|
false if the BClipboard was deleted while Lock() was blocked.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Unlocking:</B>
|
||||||
|
Unlock() is used to unlock the BClipboard and allow other threads in the application to use it.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Checking lock status:</B>
|
||||||
|
IsLocked() returns true if the BClipboard is locked, and false if it is not locked.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Checking clipboard name:</B>
|
||||||
|
Name() returns a string containing the name of the clipboard. It is not necessary for the BClipboard to be
|
||||||
|
locked when calling Name().
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Watching a clipboard:</B>
|
||||||
|
StartWatching and StopWatching are used to enable and disable watching of a clipboard. When the clipboard is
|
||||||
|
changed, a B_CLIPBOARD_CHANGED message is sent to the target specified in the call to StartWatching.
|
||||||
|
</P></LI>
|
||||||
|
|
||||||
|
</OL>
|
||||||
|
|
||||||
|
<A NAME="implement"></A><H2>BClipboard Implementation:</H2>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The BClipboard class is implemented via a message passing system between the BClipboard, the Roster, and
|
||||||
|
the Clipboard Handler associated with the Roster. Details of the message passing protocol are listed in the
|
||||||
|
Roster documentation.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
||||||
|
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>BCursor Use Cases and Implementation Details</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY BGCOLOR="white" LINK="#000067" VLINK="#000067" ALINK="#0000FF">
|
||||||
|
|
||||||
|
<FONT FACE="Verdana,Arial,Helvetica,sans-serif" SIZE="-1">
|
||||||
|
|
||||||
|
<H1>BCursor Use Cases and Implementation Details:</H1>
|
||||||
|
|
||||||
|
<P>This document describes the BCursor interface and some basics of how it is implemented.
|
||||||
|
The document has the following sections:</P>
|
||||||
|
|
||||||
|
<OL>
|
||||||
|
<LI><A HREF="#interface">BCursor Interface</A></LI>
|
||||||
|
<LI><A HREF="#usecases">BCursor Use Cases</A></LI>
|
||||||
|
<LI><A HREF="#implement">BCursor Implementation</A></LI>
|
||||||
|
</OL>
|
||||||
|
|
||||||
|
<A NAME="interface"></A><H2>BCursor Interface:</H2>
|
||||||
|
|
||||||
|
<P>The BCursor class is a simple class used to represent a mouse cursor as an object instead of an array of pixel data. The best source of information for the BCursor interface can be found
|
||||||
|
<A HREF="file:///boot/beos/documentation/Be%20Book/The%20Application%20Kit/Cursor.html">here in the Be Book</A>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<A NAME="usecases"></A><H2>BCursor Use Cases:</H2>
|
||||||
|
|
||||||
|
<P>The following use cases cover the BCursor functionality:</P>
|
||||||
|
|
||||||
|
<OL>
|
||||||
|
<LI><P><B>Construction 1:</B> The first BCursor constructor requires a pointer to the pixel data. The format for the pixel data is described
|
||||||
|
<A HREF="file:///boot/beos/documentation/Be%20Book/The%20Application%20Kit/Cursor.html#Cursor_Data_Format">here in the Be Book</A>.
|
||||||
|
This pixel data is used to initialize the BCursor, but BCursor does not take ownership of the data, therefore you are responsible for freeing the memory after construction.</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Construction 2:</B> The second BCursor constructor requires a BMessage as an archive, however BCursor does not currently support archiving. Do not use this constructor.</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Destruction:</B> This releases all resources used by the BCursor.</P></LI>
|
||||||
|
|
||||||
|
<LI><P><B>Instantiate:</B> This always returns NULL since it relies on the second constructor (which is not currently supported). If it were implemented, this would return a new BArchivable consisting of a BCursor created from the archive passed in as an argument. </P></LI>
|
||||||
|
|
||||||
|
</OL>
|
||||||
|
|
||||||
|
<A NAME="implement"></A><H2>BCursor Implementation:</H2>
|
||||||
|
|
||||||
|
<P>All meaningful work of the BCursor is implemented in the first constructor. The constructor establishes a link with the app_server and sends it the pixel data. The app_server provides the BCursor with a token which identifies the pixel data. When BApplication::SetCursor(BCursor) is called, it must get the needed cursor data by obtaining the BCursor's token (BApplication is a friend of BCursor) and using the token to request the data from the app_server. Note that BCursor does not internally store the pixel data.</P>
|
||||||
|
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
||||||
|
|
||||||
@@ -81,6 +81,13 @@ enum {
|
|||||||
B_REG_GET_MESSAGE_RUNNER_INFO = 'rgri',
|
B_REG_GET_MESSAGE_RUNNER_INFO = 'rgri',
|
||||||
// internal registrar messages
|
// internal registrar messages
|
||||||
B_REG_ROSTER_SANITY_EVENT = 'rgir',
|
B_REG_ROSTER_SANITY_EVENT = 'rgir',
|
||||||
|
// clipboard handler requests
|
||||||
|
B_REG_ADD_CLIPBOARD = 'rgca',
|
||||||
|
B_REG_GET_CLIPBOARD_COUNT = 'rgcc',
|
||||||
|
B_REG_CLIPBOARD_START_WATCHING = 'rgcw',
|
||||||
|
B_REG_CLIPBOARD_STOP_WATCHING = 'rgcx',
|
||||||
|
B_REG_DOWNLOAD_CLIPBOARD = 'rgcd',
|
||||||
|
B_REG_UPLOAD_CLIPBOARD = 'rgcu',
|
||||||
};
|
};
|
||||||
|
|
||||||
// B_REG_MIME_SET_PARAM "which" constants
|
// B_REG_MIME_SET_PARAM "which" constants
|
||||||
@@ -127,3 +134,4 @@ struct flat_app_info {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#endif // REGISTRAR_DEFS_H
|
#endif // REGISTRAR_DEFS_H
|
||||||
|
|
||||||
|
|||||||
+240
-159
@@ -1,159 +1,240 @@
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Copyright (c) 2001-2002, OpenBeOS
|
// Copyright (c) 2001-2002, OpenBeOS
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
// copy of this software and associated documentation files (the "Software"),
|
// copy of this software and associated documentation files (the "Software"),
|
||||||
// to deal in the Software without restriction, including without limitation
|
// to deal in the Software without restriction, including without limitation
|
||||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
// and/or sell copies of the Software, and to permit persons to whom the
|
// and/or sell copies of the Software, and to permit persons to whom the
|
||||||
// Software is furnished to do so, subject to the following conditions:
|
// Software is furnished to do so, subject to the following conditions:
|
||||||
//
|
//
|
||||||
// The above copyright notice and this permission notice shall be included in
|
// The above copyright notice and this permission notice shall be included in
|
||||||
// all copies or substantial portions of the Software.
|
// all copies or substantial portions of the Software.
|
||||||
//
|
//
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
// DEALINGS IN THE SOFTWARE.
|
// DEALINGS IN THE SOFTWARE.
|
||||||
//
|
//
|
||||||
// File Name: Clipboard.cpp
|
// File Name: Clipboard.cpp
|
||||||
// Author: Gabe Yoder ([email protected])
|
// Author: Gabe Yoder ([email protected])
|
||||||
// Description: BClipboard provides an interface to a system-wide clipboard
|
// Description: BClipboard provides an interface to a system-wide clipboard
|
||||||
// storage area.
|
// storage area.
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Standard Includes -----------------------------------------------------------
|
// Standard Includes -----------------------------------------------------------
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
// System Includes -------------------------------------------------------------
|
|
||||||
#include <Clipboard.h>
|
// System Includes -------------------------------------------------------------
|
||||||
|
#include <Clipboard.h>
|
||||||
// Project Includes ------------------------------------------------------------
|
#include <RegistrarDefs.h>
|
||||||
|
#include <Application.h>
|
||||||
// Local Includes --------------------------------------------------------------
|
|
||||||
|
// Project Includes ------------------------------------------------------------
|
||||||
// Local Defines ---------------------------------------------------------------
|
|
||||||
|
// Local Includes --------------------------------------------------------------
|
||||||
// Globals ---------------------------------------------------------------------
|
|
||||||
|
// Local Defines ---------------------------------------------------------------
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
// Globals ---------------------------------------------------------------------
|
||||||
BClipboard::BClipboard(const char *name, bool transient = false)
|
|
||||||
{
|
|
||||||
/* Not complete yet */
|
//------------------------------------------------------------------------------
|
||||||
fName = strdup(name);
|
BClipboard::BClipboard(const char *name, bool transient = false)
|
||||||
fData = new BMessage();
|
{
|
||||||
}
|
fName = strdup(name);
|
||||||
//------------------------------------------------------------------------------
|
fData = new BMessage();
|
||||||
BClipboard::~BClipboard()
|
fCount = 0;
|
||||||
{
|
fSystemCount = 0;
|
||||||
/* Not complete yet? */
|
|
||||||
free(fName);
|
BMessage message(B_REG_GET_CLIPBOARD_MESSENGER), reply;
|
||||||
delete fData;
|
if ( (_send_to_roster_(&message, &reply, false) == B_OK) &&
|
||||||
}
|
(reply.what == B_REG_SUCCESS) &&
|
||||||
//------------------------------------------------------------------------------
|
(reply.FindMessenger("messenger",&fClipHandler) == B_OK) )
|
||||||
const char* BClipboard::Name() const
|
{
|
||||||
{
|
BMessage handlerMessage(B_REG_ADD_CLIPBOARD), handlerReply;
|
||||||
return (const char*)fName;
|
int32 result;
|
||||||
}
|
if ( (handlerMessage.AddString("name",fName) == B_OK) &&
|
||||||
//------------------------------------------------------------------------------
|
(fClipHandler.SendMessage(&message, &reply) == B_OK) )
|
||||||
uint32 BClipboard::LocalCount() const
|
reply.FindInt32("result",&result);
|
||||||
{
|
}
|
||||||
return fCount;
|
}
|
||||||
}
|
//------------------------------------------------------------------------------
|
||||||
//------------------------------------------------------------------------------
|
BClipboard::~BClipboard()
|
||||||
uint32 BClipboard::SystemCount() const
|
{
|
||||||
{
|
free(fName);
|
||||||
/* Need to upload count data from app server, and update fCount */
|
delete fData;
|
||||||
|
}
|
||||||
return fCount;
|
//------------------------------------------------------------------------------
|
||||||
}
|
const char* BClipboard::Name() const
|
||||||
//------------------------------------------------------------------------------
|
{
|
||||||
status_t BClipboard::StartWatching(BMessenger target)
|
return (const char*)fName;
|
||||||
{
|
}
|
||||||
}
|
//------------------------------------------------------------------------------
|
||||||
//------------------------------------------------------------------------------
|
uint32 BClipboard::LocalCount() const
|
||||||
status_t BClipboard::StopWatching(BMessenger target)
|
{
|
||||||
{
|
/* fSystemCount contains the total number of writes to the clipboard.
|
||||||
}
|
fCount contains the number of writes to the clipboard done by this
|
||||||
//------------------------------------------------------------------------------
|
BClipboard.
|
||||||
bool BClipboard::Lock()
|
*/
|
||||||
{
|
return fSystemCount;
|
||||||
bool retVal;
|
}
|
||||||
retVal = fLock.Lock();
|
//------------------------------------------------------------------------------
|
||||||
/* Still need to upload clipboard data to fData */
|
uint32 BClipboard::SystemCount() const
|
||||||
/* Involves something with DownloadFromSystem */
|
{
|
||||||
|
int32 val;
|
||||||
return retVal;
|
BMessage message(B_REG_GET_CLIPBOARD_COUNT), reply;
|
||||||
}
|
if ( (message.AddString("name",fName) == B_OK) &&
|
||||||
//------------------------------------------------------------------------------
|
(fClipHandler.SendMessage(&message, &reply) == B_OK) &&
|
||||||
void BClipboard::Unlock()
|
(reply.FindInt32("count",&val) == B_OK) )
|
||||||
{
|
return (uint32)val;
|
||||||
fLock.Unlock();
|
|
||||||
}
|
return 0;
|
||||||
//------------------------------------------------------------------------------
|
}
|
||||||
bool BClipboard::IsLocked() const
|
//------------------------------------------------------------------------------
|
||||||
{
|
status_t BClipboard::StartWatching(BMessenger target)
|
||||||
return fLock.IsLocked();
|
{
|
||||||
}
|
BMessage message(B_REG_CLIPBOARD_START_WATCHING), reply;
|
||||||
//------------------------------------------------------------------------------
|
if ( (message.AddString("name",fName) == B_OK) &&
|
||||||
status_t BClipboard::Clear()
|
(message.AddMessenger("target", target ) == B_OK) &&
|
||||||
{
|
(fClipHandler.SendMessage(&message, &reply) == B_OK) )
|
||||||
}
|
return B_OK;
|
||||||
//------------------------------------------------------------------------------
|
return B_ERROR;
|
||||||
status_t BClipboard::Commit()
|
}
|
||||||
{
|
//------------------------------------------------------------------------------
|
||||||
}
|
status_t BClipboard::StopWatching(BMessenger target)
|
||||||
//------------------------------------------------------------------------------
|
{
|
||||||
status_t BClipboard::Revert()
|
BMessage message(B_REG_CLIPBOARD_STOP_WATCHING), reply;
|
||||||
{
|
if ( (message.AddString("name",fName) == B_OK) &&
|
||||||
}
|
(message.AddMessenger("target", target ) == B_OK) &&
|
||||||
//------------------------------------------------------------------------------
|
(fClipHandler.SendMessage(&message, &reply) == B_OK) )
|
||||||
BMessenger BClipboard::DataSource() const
|
return B_OK;
|
||||||
{
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
BMessage* BClipboard::Data() const
|
bool BClipboard::Lock()
|
||||||
{
|
{
|
||||||
if ( IsLocked() )
|
/* Will this work correctly if clipboard is deleted while still waiting on
|
||||||
return fData;
|
fLock.Lock() ? */
|
||||||
return NULL;
|
bool retVal;
|
||||||
}
|
retVal = fLock.Lock();
|
||||||
//------------------------------------------------------------------------------
|
if ( retVal &&
|
||||||
BClipboard::BClipboard(const BClipboard &)
|
(DownloadFromSystem() != B_OK) )
|
||||||
{
|
{
|
||||||
}
|
retVal = false;
|
||||||
//------------------------------------------------------------------------------
|
fLock.Unlock();
|
||||||
BClipboard & BClipboard::operator=(const BClipboard &)
|
}
|
||||||
{
|
|
||||||
}
|
return retVal;
|
||||||
//------------------------------------------------------------------------------
|
}
|
||||||
void BClipboard::_ReservedClipboard1()
|
//------------------------------------------------------------------------------
|
||||||
{
|
void BClipboard::Unlock()
|
||||||
}
|
{
|
||||||
//------------------------------------------------------------------------------
|
fLock.Unlock();
|
||||||
void BClipboard::_ReservedClipboard2()
|
}
|
||||||
{
|
//------------------------------------------------------------------------------
|
||||||
}
|
bool BClipboard::IsLocked() const
|
||||||
//------------------------------------------------------------------------------
|
{
|
||||||
void BClipboard::_ReservedClipboard3()
|
return fLock.IsLocked();
|
||||||
{
|
}
|
||||||
}
|
//------------------------------------------------------------------------------
|
||||||
//------------------------------------------------------------------------------
|
status_t BClipboard::Clear()
|
||||||
bool BClipboard::AssertLocked() const
|
{
|
||||||
{
|
if ( AssertLocked() &&
|
||||||
}
|
(fData->MakeEmpty() == B_OK) )
|
||||||
//------------------------------------------------------------------------------
|
return B_OK;
|
||||||
status_t BClipboard::DownloadFromSystem(bool force=false)
|
return B_ERROR;
|
||||||
{
|
}
|
||||||
}
|
//------------------------------------------------------------------------------
|
||||||
//------------------------------------------------------------------------------
|
status_t BClipboard::Commit()
|
||||||
status_t BClipboard::UploadToSystem()
|
{
|
||||||
{
|
if ( AssertLocked() &&
|
||||||
}
|
(UploadToSystem() == B_OK) )
|
||||||
//------------------------------------------------------------------------------
|
return B_OK;
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
status_t BClipboard::Revert()
|
||||||
|
{
|
||||||
|
if ( AssertLocked() &&
|
||||||
|
(fData->MakeEmpty() == B_OK) &&
|
||||||
|
(DownloadFromSystem() == B_OK) )
|
||||||
|
return B_OK;
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
BMessenger BClipboard::DataSource() const
|
||||||
|
{
|
||||||
|
return fDataSource;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
BMessage* BClipboard::Data() const
|
||||||
|
{
|
||||||
|
if ( IsLocked() )
|
||||||
|
return fData;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
BClipboard::BClipboard(const BClipboard &)
|
||||||
|
{
|
||||||
|
/* This is private, and I don't use it, so I'm not going to implement it */
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
BClipboard & BClipboard::operator=(const BClipboard &)
|
||||||
|
{
|
||||||
|
/* This is private, and I don't use it, so I'm not going to implement it */
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void BClipboard::_ReservedClipboard1()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void BClipboard::_ReservedClipboard2()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void BClipboard::_ReservedClipboard3()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
bool BClipboard::AssertLocked() const
|
||||||
|
{
|
||||||
|
/* How should this be different from IsLocked() */
|
||||||
|
return fLock.IsLocked();
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
status_t BClipboard::DownloadFromSystem(bool force=false)
|
||||||
|
{
|
||||||
|
/* What does force mean? */
|
||||||
|
BMessage message(B_REG_DOWNLOAD_CLIPBOARD), reply;
|
||||||
|
if ( (message.AddString("name",fName) == B_OK) &&
|
||||||
|
(fClipHandler.SendMessage(&message, &reply) == B_OK) &&
|
||||||
|
(reply.FindMessage("data",fData) == B_OK) &&
|
||||||
|
(reply.FindMessenger("data source",&fDataSource) == B_OK) &&
|
||||||
|
(reply.FindInt32("count",(int32 *)(&fSystemCount)) == B_OK) )
|
||||||
|
return B_OK;
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
status_t BClipboard::UploadToSystem()
|
||||||
|
{
|
||||||
|
BMessage message(B_REG_UPLOAD_CLIPBOARD), reply;
|
||||||
|
if ( (message.AddString("name",fName) == B_OK) &&
|
||||||
|
(message.AddMessage("data",fData) == B_OK) &&
|
||||||
|
(message.AddMessenger("data source", be_app_messenger ) == B_OK) &&
|
||||||
|
(fClipHandler.SendMessage(&message, &reply) == B_OK) &&
|
||||||
|
(reply.FindInt32("count",(int32 *)(&fSystemCount)) == B_OK) )
|
||||||
|
{
|
||||||
|
fCount++;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// ClipboardHandler.cpp
|
// ClipboardHandler.cpp
|
||||||
|
|
||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
|
#include <RegistrarDefs.h>
|
||||||
|
|
||||||
#include "ClipboardHandler.h"
|
#include "ClipboardHandler.h"
|
||||||
|
|
||||||
@@ -32,10 +33,142 @@ ClipboardHandler::~ClipboardHandler()
|
|||||||
void
|
void
|
||||||
ClipboardHandler::MessageReceived(BMessage *message)
|
ClipboardHandler::MessageReceived(BMessage *message)
|
||||||
{
|
{
|
||||||
|
BString name;
|
||||||
|
BMessage reply;
|
||||||
switch (message->what) {
|
switch (message->what) {
|
||||||
|
B_REG_ADD_CLIPBOARD:
|
||||||
|
{
|
||||||
|
if ( message->FindString("name",&name) != B_OK )
|
||||||
|
{
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fClipboardTree.AddNode(name);
|
||||||
|
reply.AddInt32("result",1);
|
||||||
|
}
|
||||||
|
reply.what = B_REG_RESULT;
|
||||||
|
message->SendReply(&reply);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
B_REG_GET_CLIPBOARD_COUNT:
|
||||||
|
{
|
||||||
|
if ( message->FindString("name",&name) != B_OK )
|
||||||
|
{
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClipboardTree *node = fClipboardTree.GetNode(name);
|
||||||
|
if ( node )
|
||||||
|
{
|
||||||
|
reply.AddInt32("count",(uint32)(node->GetCount()));
|
||||||
|
reply.AddInt32("result",1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
reply.what = B_REG_RESULT;
|
||||||
|
message->SendReply(&reply);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
B_REG_CLIPBOARD_START_WATCHING:
|
||||||
|
{
|
||||||
|
BMessenger target;
|
||||||
|
if ( (message->FindString("name",&name) != B_OK) ||
|
||||||
|
(message->FindMessenger("target",&target) != B_OK) )
|
||||||
|
{
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClipboardTree *node = fClipboardTree.GetNode(name);
|
||||||
|
if ( node && node->AddWatcher(&target) )
|
||||||
|
reply.AddInt32("result",1);
|
||||||
|
else
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
reply.what = B_REG_RESULT;
|
||||||
|
message->SendReply(&reply);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
B_REG_CLIPBOARD_STOP_WATCHING:
|
||||||
|
{
|
||||||
|
BMessenger target;
|
||||||
|
if ( (message->FindString("name",&name) != B_OK) ||
|
||||||
|
(message->FindMessenger("target",&target) != B_OK) )
|
||||||
|
{
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClipboardTree *node = fClipboardTree.GetNode(name);
|
||||||
|
if ( node && node->RemoveWatcher(&target) )
|
||||||
|
reply.AddInt32("result",1);
|
||||||
|
else
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
reply.what = B_REG_RESULT;
|
||||||
|
message->SendReply(&reply);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
B_REG_DOWNLOAD_CLIPBOARD:
|
||||||
|
{
|
||||||
|
if ( message->FindString("name",&name) != B_OK )
|
||||||
|
{
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ClipboardTree *node = fClipboardTree.GetNode(name);
|
||||||
|
if ( node )
|
||||||
|
{
|
||||||
|
reply.AddMessage("data",node->GetData());
|
||||||
|
reply.AddMessenger("data source",*node->GetDataSource());
|
||||||
|
reply.AddInt32("count",(uint32)(node->GetCount()));
|
||||||
|
reply.AddInt32("result",1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
reply.what = B_REG_RESULT;
|
||||||
|
message->SendReply(&reply);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
B_REG_UPLOAD_CLIPBOARD:
|
||||||
|
{
|
||||||
|
BMessage data;
|
||||||
|
BMessenger dataSource;
|
||||||
|
ClipboardTree *node = NULL;
|
||||||
|
if ( (message->FindString("name",&name) != B_OK) ||
|
||||||
|
(message->FindMessage("data",&data) != B_OK) ||
|
||||||
|
(message->FindMessenger("data source",&dataSource) != B_OK) )
|
||||||
|
{
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
node = fClipboardTree.GetNode(name);
|
||||||
|
if ( node )
|
||||||
|
{
|
||||||
|
node->SetData(&data);
|
||||||
|
node->SetDataSource(&dataSource);
|
||||||
|
reply.AddInt32("count",(uint32)(node->IncrementCount()));
|
||||||
|
reply.AddInt32("result",1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
reply.AddInt32("result",0);
|
||||||
|
}
|
||||||
|
reply.what = B_REG_RESULT;
|
||||||
|
message->SendReply(&reply);
|
||||||
|
if ( node )
|
||||||
|
node->NotifyWatchers();
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
BHandler::MessageReceived(message);
|
BHandler::MessageReceived(message);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
#define CLIPBOARD_HANDLER_H
|
#define CLIPBOARD_HANDLER_H
|
||||||
|
|
||||||
#include <Handler.h>
|
#include <Handler.h>
|
||||||
|
#include <Message.h>
|
||||||
|
#include "ClipboardTree.h"
|
||||||
|
|
||||||
class ClipboardHandler : public BHandler {
|
class ClipboardHandler : public BHandler {
|
||||||
public:
|
public:
|
||||||
@@ -11,6 +13,9 @@ public:
|
|||||||
virtual ~ClipboardHandler();
|
virtual ~ClipboardHandler();
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage *message);
|
virtual void MessageReceived(BMessage *message);
|
||||||
|
private:
|
||||||
|
ClipboardTree fClipboardTree;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CLIPBOARD_HANDLER_H
|
#endif // CLIPBOARD_HANDLER_H
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,119 @@
|
|||||||
|
// ClipboardTree.cpp
|
||||||
|
|
||||||
|
#include <Message.h>
|
||||||
|
#include <Clipboard.h>
|
||||||
|
|
||||||
|
#include "ClipboardTree.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\class ClipboardTree
|
||||||
|
\brief Implements a tree containing clipboards and their data
|
||||||
|
*/
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
/*! \brief Creates and initializes a ClipboardTree.
|
||||||
|
*/
|
||||||
|
ClipboardTree::ClipboardTree()
|
||||||
|
{
|
||||||
|
fName = "";
|
||||||
|
fCount = 0;
|
||||||
|
fLeftChild = NULL;
|
||||||
|
fRightChild = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// destructor
|
||||||
|
/*! \brief Frees all resources associate with this object.
|
||||||
|
*/
|
||||||
|
ClipboardTree::~ClipboardTree()
|
||||||
|
{
|
||||||
|
if ( fLeftChild )
|
||||||
|
delete fLeftChild;
|
||||||
|
if ( fRightChild )
|
||||||
|
delete fRightChild;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClipboardTree::AddNode(BString name)
|
||||||
|
{
|
||||||
|
if ( fName == "" )
|
||||||
|
{
|
||||||
|
fName = name;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( fName == name )
|
||||||
|
return;
|
||||||
|
if ( name < fName )
|
||||||
|
{
|
||||||
|
if ( !fLeftChild )
|
||||||
|
fLeftChild = new ClipboardTree;
|
||||||
|
fLeftChild->AddNode(name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( !fRightChild )
|
||||||
|
fRightChild = new ClipboardTree;
|
||||||
|
fRightChild->AddNode(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClipboardTree* ClipboardTree::GetNode(BString name)
|
||||||
|
{
|
||||||
|
if ( fName == "" )
|
||||||
|
return NULL;
|
||||||
|
if ( fName == name )
|
||||||
|
return this;
|
||||||
|
if ( name < fName )
|
||||||
|
{
|
||||||
|
if ( !fLeftChild )
|
||||||
|
return NULL;
|
||||||
|
return fLeftChild->GetNode(name);
|
||||||
|
}
|
||||||
|
if ( !fRightChild )
|
||||||
|
return NULL;
|
||||||
|
return fRightChild->GetNode(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 ClipboardTree::GetCount()
|
||||||
|
{
|
||||||
|
return fCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 ClipboardTree::IncrementCount()
|
||||||
|
{
|
||||||
|
fCount++;
|
||||||
|
return fCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
BMessage* ClipboardTree::GetData()
|
||||||
|
{
|
||||||
|
return &fData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClipboardTree::SetData(BMessage *data)
|
||||||
|
{
|
||||||
|
fData = *data;
|
||||||
|
}
|
||||||
|
|
||||||
|
BMessenger* ClipboardTree::GetDataSource()
|
||||||
|
{
|
||||||
|
return &fDataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClipboardTree::SetDataSource(BMessenger *dataSource)
|
||||||
|
{
|
||||||
|
fDataSource = *dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClipboardTree::AddWatcher(BMessenger *watcher)
|
||||||
|
{
|
||||||
|
return fWatchingService.AddWatcher(*watcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClipboardTree::RemoveWatcher(BMessenger *watcher)
|
||||||
|
{
|
||||||
|
return fWatchingService.RemoveWatcher(*watcher,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClipboardTree::NotifyWatchers()
|
||||||
|
{
|
||||||
|
BMessage message(B_CLIPBOARD_CHANGED);
|
||||||
|
fWatchingService.NotifyWatchers(&message,NULL);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
// ClipboardTree.h
|
||||||
|
|
||||||
|
#ifndef CLIPBOARD_TREE_H
|
||||||
|
#define CLIPBOARD_TREE_H
|
||||||
|
|
||||||
|
#include <String.h>
|
||||||
|
#include <Message.h>
|
||||||
|
#include <Messenger.h>
|
||||||
|
#include "WatchingService.h"
|
||||||
|
|
||||||
|
class ClipboardTree {
|
||||||
|
public:
|
||||||
|
ClipboardTree();
|
||||||
|
~ClipboardTree();
|
||||||
|
void AddNode(BString name);
|
||||||
|
ClipboardTree* GetNode(BString name);
|
||||||
|
uint32 GetCount();
|
||||||
|
uint32 IncrementCount();
|
||||||
|
BMessage *GetData();
|
||||||
|
void SetData(BMessage *data);
|
||||||
|
BMessenger *GetDataSource();
|
||||||
|
void SetDataSource(BMessenger *dataSource);
|
||||||
|
bool AddWatcher(BMessenger *watcher);
|
||||||
|
bool RemoveWatcher(BMessenger *watcher);
|
||||||
|
void NotifyWatchers();
|
||||||
|
private:
|
||||||
|
BString fName;
|
||||||
|
BMessage fData;
|
||||||
|
BMessenger fDataSource;
|
||||||
|
ClipboardTree *fLeftChild;
|
||||||
|
ClipboardTree *fRightChild;
|
||||||
|
uint32 fCount;
|
||||||
|
WatchingService fWatchingService;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CLIPBOARD_TREE_H
|
||||||
|
|
||||||
@@ -7,6 +7,7 @@ UsePrivateHeaders storage ;
|
|||||||
Server obos_registrar :
|
Server obos_registrar :
|
||||||
AppInfoList.cpp
|
AppInfoList.cpp
|
||||||
ClipboardHandler.cpp
|
ClipboardHandler.cpp
|
||||||
|
ClipboardTree.cpp
|
||||||
Event.cpp
|
Event.cpp
|
||||||
EventMaskWatcher.cpp
|
EventMaskWatcher.cpp
|
||||||
EventQueue.cpp
|
EventQueue.cpp
|
||||||
|
|||||||
Reference in New Issue
Block a user