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:
DarkWyrm
2002-10-22 00:08:45 +00:00
parent 809cd10db5
commit b010ca6720
9 changed files with 746 additions and 159 deletions
@@ -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>
+8
View File
@@ -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
View File
@@ -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;
}
//------------------------------------------------------------------------------
+133
View File
@@ -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;
} }
} }
+5
View File
@@ -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
+119
View File
@@ -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);
}
+37
View File
@@ -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
+1
View File
@@ -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