xref: /haiku/src/servers/registrar/ClipboardHandler.cpp (revision 7120e97489acbf17d86d3f33e3b2e68974fd4b23)
1 // ClipboardHandler.cpp
2 
3 #include <Message.h>
4 #include <RegistrarDefs.h>
5 
6 #include "ClipboardHandler.h"
7 
8 /*!
9 	\class ClipboardHandler
10 	\brief Handles all clipboard related requests.
11 */
12 
13 // constructor
14 /*!	\brief Creates and initializes a ClipboardHandler.
15 */
16 ClipboardHandler::ClipboardHandler()
17 				: BHandler()
18 {
19 }
20 
21 // destructor
22 /*!	\brief Frees all resources associate with this object.
23 */
24 ClipboardHandler::~ClipboardHandler()
25 {
26 }
27 
28 // MessageReceived
29 /*!	\brief Overrides the super class version to handle the clipboard specific
30 		   messages.
31 	\param message The message to be handled
32 */
33 void
34 ClipboardHandler::MessageReceived(BMessage *message)
35 {
36 	BString name;
37 	BMessage reply;
38 	switch (message->what) {
39 		case B_REG_ADD_CLIPBOARD:
40 		{
41 	  		if ( message->FindString("name",&name) != B_OK )
42 			{
43 				reply.AddInt32("result",B_BAD_VALUE);
44 			}
45 			else
46 			{
47 				fClipboardTree.AddNode(name);
48 				reply.AddInt32("result",B_OK);
49 			}
50 			reply.what = B_REG_RESULT;
51 			message->SendReply(&reply);
52 		}
53 	  	break;
54 		case B_REG_GET_CLIPBOARD_COUNT:
55 		{
56 	  		if ( message->FindString("name",&name) != B_OK )
57 			{
58 				reply.AddInt32("result",B_BAD_VALUE);
59 			}
60 			else
61 			{
62 				ClipboardTree *node = fClipboardTree.GetNode(name);
63 				if ( node )
64 				{
65 					reply.AddInt32("count",(uint32)(node->GetCount()));
66 					reply.AddInt32("result",B_OK);
67 				}
68 				else
69 					reply.AddInt32("result",B_BAD_VALUE);
70 			}
71 			reply.what = B_REG_RESULT;
72 			message->SendReply(&reply);
73 		}
74 	  	break;
75 		case B_REG_CLIPBOARD_START_WATCHING:
76 		{
77 			BMessenger target;
78 	  		if ( (message->FindString("name",&name) != B_OK) ||
79 			     (message->FindMessenger("target",&target) != B_OK) )
80 			{
81 				reply.AddInt32("result",B_BAD_VALUE);
82 			}
83 			else
84 			{
85 				ClipboardTree *node = fClipboardTree.GetNode(name);
86 				if ( node && node->AddWatcher(&target) )
87 					reply.AddInt32("result",B_OK);
88 				else
89 					reply.AddInt32("result",B_BAD_VALUE);
90 			}
91 			reply.what = B_REG_RESULT;
92 			message->SendReply(&reply);
93 		}
94 	  	break;
95 		case B_REG_CLIPBOARD_STOP_WATCHING:
96 		{
97 			BMessenger target;
98 	  		if ( (message->FindString("name",&name) != B_OK) ||
99 			     (message->FindMessenger("target",&target) != B_OK) )
100 			{
101 				reply.AddInt32("result",B_BAD_VALUE);
102 			}
103 			else
104 			{
105 				ClipboardTree *node = fClipboardTree.GetNode(name);
106 				if ( node && node->RemoveWatcher(&target) )
107 					reply.AddInt32("result",B_OK);
108 				else
109 					reply.AddInt32("result",B_BAD_VALUE);
110 			}
111 			reply.what = B_REG_RESULT;
112 			message->SendReply(&reply);
113 		}
114 	  	break;
115 		case B_REG_DOWNLOAD_CLIPBOARD:
116 		{
117 	  		if ( message->FindString("name",&name) != B_OK )
118 			{
119 				reply.AddInt32("result",B_BAD_VALUE);
120 			}
121 			else
122 			{
123 				ClipboardTree *node = fClipboardTree.GetNode(name);
124 				if ( node )
125 				{
126 					reply.AddMessage("data",node->GetData());
127 					reply.AddMessenger("data source",*node->GetDataSource());
128 					reply.AddInt32("count",(uint32)(node->GetCount()));
129 					reply.AddInt32("result",B_OK);
130 				}
131 				else
132 					reply.AddInt32("result",B_BAD_VALUE);
133 			}
134 			reply.what = B_REG_RESULT;
135 			message->SendReply(&reply);
136 		}
137 	  	break;
138 		case B_REG_UPLOAD_CLIPBOARD:
139 		{
140 			BMessage data;
141 			BMessenger dataSource;
142 			ClipboardTree *node = NULL;
143 	  		if ( (message->FindString("name",&name) != B_OK) ||
144 			     (message->FindMessage("data",&data) != B_OK) ||
145 			     (message->FindMessenger("data source",&dataSource) != B_OK) )
146 			{
147 				reply.AddInt32("result",B_BAD_VALUE);
148 			}
149 			else
150 			{
151 				node = fClipboardTree.GetNode(name);
152 				if ( node )
153 				{
154 					node->SetData(&data);
155 					node->SetDataSource(&dataSource);
156 					reply.AddInt32("count",(uint32)(node->IncrementCount()));
157 					reply.AddInt32("result",B_OK);
158 				}
159 				else
160 					reply.AddInt32("result",B_BAD_VALUE);
161 			}
162 			reply.what = B_REG_RESULT;
163 			message->SendReply(&reply);
164 			if ( node )
165 			  node->NotifyWatchers();
166 		}
167 	  	break;
168 		default:
169 			BHandler::MessageReceived(message);
170 			break;
171 	}
172 }
173 
174 
175 
176