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