Пример #1
0
void
OpenWindow::MessageReceived(BMessage *message)
{
    switch (message->what) {
    case kMsgProbeDevice:
    {
        BMenuItem *item = fDevicesMenu->FindMarked();
        if (item == NULL)
            break;

        be_app_messenger.SendMessage(item->Message());
        PostMessage(B_QUIT_REQUESTED);
        break;
    }

    case kMsgProbeFile:
        be_app_messenger.SendMessage(kMsgOpenFilePanel);
        PostMessage(B_QUIT_REQUESTED);
        break;

    case B_SIMPLE_DATA:
    {
        // if it's a file drop, open it
        entry_ref ref;
        if (message->FindRef("refs", 0, &ref) == B_OK) {
            BMessage openMessage(*message);
            openMessage.what = B_REFS_RECEIVED;

            be_app_messenger.SendMessage(&openMessage);
            PostMessage(B_QUIT_REQUESTED);
        }
        break;
    }

    default:
        BWindow::MessageReceived(message);
        break;
    }
}
Пример #2
0
void
TFilePanel::MessageReceived(BMessage* message)
{
	entry_ref ref;

	switch (message->what) {
		case B_REFS_RECEIVED:
			// item was double clicked in file panel (PoseView)
			if (message->FindRef("refs", &ref) == B_OK) {
				BEntry entry(&ref, true);
				if (entry.InitCheck() == B_OK) {
					// Double-click on dir or link-to-dir ALWAYS opens the
					// dir. If more than one dir is selected, the first is
					// entered.
					if (entry.IsDirectory()) {
						entry.GetRef(&ref);
						bool isDesktop = SwitchDirToDesktopIfNeeded(ref);

						PoseView()->SetIsDesktop(isDesktop);
						entry.SetTo(&ref);
						PoseView()->SwitchDir(&ref);
						SwitchDirMenuTo(&ref);
					} else {
						// Otherwise, we have a file or a link to a file.
						// AdjustButton has already tested the flavor;
						// all we have to do is see if the button is enabled.
						BButton* button = dynamic_cast<BButton*>(
							FindView("default button"));
						if (button == NULL)
							break;

						if (IsSavePanel()) {
							int32 count = 0;
							type_code type;
							message->GetInfo("refs", &type, &count);

							// Don't allow saves of multiple files
							if (count > 1) {
								ShowCenteredAlert(
									B_TRANSLATE(
										"Sorry, saving more than one "
										"item is not allowed."),
									B_TRANSLATE("Cancel"));
							} else {
								// if we are a savepanel, set up the
								// filepanel correctly then pass control
								// so we follow the same path as if the user
								// clicked the save button

								// set the 'name' fld to the current ref's
								// name notify the panel that the default
								// button should be enabled
								SetSaveText(ref.name);
								SelectionChanged();

								HandleSaveButton();
							}
							break;
						}

					  	// send handler a message and close
						BMessage openMessage(*fMessage);
						for (int32 index = 0; ; index++) {
					  		if (message->FindRef("refs", index, &ref) != B_OK)
								break;
							openMessage.AddRef("refs", &ref);
					  	}
						OpenSelectionCommon(&openMessage);
					}
				}
			}
			break;

		case kSwitchDirectory:
		{
			entry_ref ref;
			// this comes from dir menu or nav menu, so switch directories
			if (message->FindRef("refs", &ref) == B_OK) {
				BEntry entry(&ref, true);
				if (entry.GetRef(&ref) == B_OK)
					SetTo(&ref);
			}
			break;
		}

		case kSwitchToHome:
		{
			BPath homePath;
			entry_ref ref;
			if (find_directory(B_USER_DIRECTORY, &homePath) != B_OK
				|| get_ref_for_path(homePath.Path(), &ref) != B_OK) {
				break;
			}

			SetTo(&ref);
			break;
		}

		case kAddCurrentDir:
		{
			BPath path;
			if (find_directory(B_USER_SETTINGS_DIRECTORY, &path, true)
					!= B_OK) {
				break;
			}

			path.Append(kGoDirectory);
			BDirectory goDirectory(path.Path());

			if (goDirectory.InitCheck() == B_OK) {
				BEntry entry(TargetModel()->EntryRef());
				entry.GetPath(&path);

				BSymLink link;
				goDirectory.CreateSymLink(TargetModel()->Name(), path.Path(),
					&link);
			}
			break;
		}

		case kEditFavorites:
		{
			BPath path;
			if (find_directory (B_USER_SETTINGS_DIRECTORY, &path, true)
					!= B_OK) {
				break;
			}

			path.Append(kGoDirectory);
			BMessenger msgr(kTrackerSignature);
			if (msgr.IsValid()) {
				BMessage message(B_REFS_RECEIVED);
				entry_ref ref;
				if (get_ref_for_path(path.Path(), &ref) == B_OK) {
					message.AddRef("refs", &ref);
					msgr.SendMessage(&message);
				}
			}
			break;
		}

		case kCancelButton:
			PostMessage(B_QUIT_REQUESTED);
			break;

		case kResizeToFit:
			ResizeToFit();
			break;

		case kOpenDir:
			OpenDirectory();
			break;

		case kOpenParentDir:
			OpenParent();
			break;

		case kDefaultButton:
			if (fIsSavePanel) {
				if (PoseView()->IsFocus()
					&& PoseView()->SelectionList()->CountItems() == 1) {
					Model* model = (PoseView()->SelectionList()->
						FirstItem())->TargetModel();
					if (model->ResolveIfLink()->IsDirectory()) {
						PoseView()->CommitActivePose();
						PoseView()->OpenSelection();
						break;
					}
				}

				HandleSaveButton();
			} else
				HandleOpenButton();
			break;

		case B_OBSERVER_NOTICE_CHANGE:
		{
			int32 observerWhat;
			if (message->FindInt32("be:observe_change_what", &observerWhat)
					== B_OK) {
				switch (observerWhat) {
					case kDesktopFilePanelRootChanged:
					{
						bool desktopIsRoot = true;
						if (message->FindBool("DesktopFilePanelRoot",
								&desktopIsRoot) == B_OK) {
							TrackerSettings().
								SetDesktopFilePanelRoot(desktopIsRoot);
						}
						SetTo(TargetModel()->EntryRef());
						break;
					}
				}
			}
			break;
		}

		default:
			_inherited::MessageReceived(message);
			break;
	}
}
Пример #3
0
STDMETHODIMP_(ULONG) CMAPIAdviseSink::OnNotify(ULONG cNotif, LPNOTIFICATION lpNotifications)
{
	(void) cNotif;
	ULONG notification_type = lpNotifications->ulEventType;

	// log only messages created or moved
	if (notification_type != fnevObjectCreated && notification_type != fnevObjectMoved ) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [uninteresting notification] ", 5, FALSE);
		return S_OK;
	}
	
	DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [notification] ", 5, FALSE);
	
	if ( lpNotifications->info.obj.ulObjType != MAPI_MESSAGE ) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [not for a message, ignoring] ", 5, FALSE);
		return S_OK;
	}
	
#if DEBUG
	if (notification_type == fnevObjectCreated) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [new message] ", 5, FALSE);
	} else {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [moved message] ", 5, FALSE);
	}
#endif
	
	OBJECT_NOTIFICATION* obj = &lpNotifications->info.obj;
	HRESULT hRes = E_FAIL;
	
	/* open the message */
	LPMESSAGE lpMsg = openMessage( m_pStore, obj->cbEntryID, obj->lpEntryID);
	if (lpMsg == NULL) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [ERROR cannot open message]", 5, FALSE);
		return S_OK;
	}
	
	std::auto_ptr<MAPIMessage> message;
	message.reset(new MAPIMessage(lpMsg));
	
	/* set folder */
	LPWSTR folderName = getFolderName(m_pStore, obj->cbParentID, obj->lpParentID);
	message->SetFolder( folderName );
	
	/* parse the message*/
	if ( FAILED( message->Parse(REALTIME) ) ) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [ERROR parsing message]", 5, FALSE);
		return S_OK;
	}
	
#if DEBUG
	if (message->isMail()) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [Mail message]", 5, FALSE);
	} else if (message->isSMS()) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [SMS message]", 5, FALSE);
	} else if (message->isMMS()) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [MMS message]", 5, FALSE);
	}
#endif
	
	if ( message->isMail() ) {
		/* if this is a MAIL message, it MUST have a body */	
		if ( ! message->hasBody() ) {
			DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [ERROR does not have a body]", 5, FALSE);
			return S_OK;
		}
		
		/* me get moved mail only if we are in Sent Mail box */
		if ( notification_type == fnevObjectMoved ) {
			if ( ! isSentMailBox(m_pStore, obj->cbParentID, obj->lpParentID) ) {
				DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [ERROR folder is not Sent Mail]", 5, FALSE);
				return S_OK;
			}
		}
	} else if ( message->isSMS() ) {
		/* we get SMSs only upon creation */
		if (notification_type != fnevObjectCreated && notification_type != fnevObjectMoved) {
			DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [ERROR SMS moved, ignoring]", 5, FALSE);
			return S_OK;
		}

		/* check if SMS data is consistent */
		if (message->From() == message->To()) {
			DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [ERROR message from local to local, ignoring]", 5, FALSE);
			return S_OK;
		}
	}
	
	if ( ! LogMessage(*message) ) {
		DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [ERROR message not logged]", 5, FALSE);
		return S_OK;
	}
	
	DBG_TRACE(L"Debug - MAPIAdviseSink.cpp - OnNotify() [message logged!]", 5, FALSE);

	return S_OK;
}
Пример #4
0
void SerialApp::MessageReceived(BMessage* message)
{
	switch (message->what) {
		case kMsgOpenPort:
		{
			if (message->FindString("port name", &fPortPath) == B_OK) {
				fSerialPort.Open(fPortPath);
				release_sem(fSerialLock);
			} else {
				fSerialPort.Close();
			}
			return;
		}
		case kMsgDataRead:
		{
			// forward the message to the window, which will display the
			// incoming data
			fWindow->PostMessage(message);

			if (fLogFile) {
				const char* bytes;
				ssize_t length;
				message->FindData("data", B_RAW_TYPE, (const void**)&bytes,
					&length);
				if (fLogFile->Write(bytes, length) != length) {
					// TODO error handling
				}
			}

			return;
		}
		case kMsgDataWrite:
		{
			const char* bytes;
			ssize_t size;

			if (message->FindData("data", B_RAW_TYPE, (const void**)&bytes,
					&size) == B_OK)
				fSerialPort.Write(bytes, size);
			return;
		}
		case kMsgLogfile:
		{
			entry_ref parent;
			const char* filename;

			if (message->FindRef("directory", &parent) == B_OK
				&& message->FindString("name", &filename) == B_OK) {
				delete fLogFile;
				BDirectory directory(&parent);
				fLogFile = new BFile(&directory, filename,
					B_WRITE_ONLY | B_CREATE_FILE | B_OPEN_AT_END);
				status_t error = fLogFile->InitCheck();
				if (error != B_OK)
					puts(strerror(error));
			} else
				debugger("Invalid BMessage received");
			return;
		}
		case kMsgSettings:
		{
			int32 baudrate;
			stop_bits stopBits;
			data_bits dataBits;
			parity_mode parity;
			uint32 flowcontrol;

			if (message->FindInt32("databits", (int32*)&dataBits) == B_OK)
				fSerialPort.SetDataBits(dataBits);

			if (message->FindInt32("stopbits", (int32*)&stopBits) == B_OK)
				fSerialPort.SetStopBits(stopBits);

			if (message->FindInt32("parity", (int32*)&parity) == B_OK)
				fSerialPort.SetParityMode(parity);

			if (message->FindInt32("flowcontrol", (int32*)&flowcontrol) == B_OK)
				fSerialPort.SetFlowControl(flowcontrol);

			if (message->FindInt32("baudrate", &baudrate) == B_OK) {
				data_rate rate = (data_rate)baudrate;
				fSerialPort.SetDataRate(rate);
			}

			return;
		}
	}

	// Handle scripting messages
	if (message->HasSpecifiers()) {
		BMessage specifier;
		int32 what;
		int32 index;
		const char* property;

		BMessage reply(B_REPLY);
		BMessage settings(kMsgSettings);
		bool settingsChanged = false;

		if (message->GetCurrentSpecifier(&index, &specifier, &what, &property)
			== B_OK) {
			switch (kScriptingProperties.FindMatch(message, index, &specifier,
				what, property)) {
				case 0: // baudrate
					if (message->what == B_GET_PROPERTY) {
						reply.AddInt32("result", fSerialPort.DataRate());
						message->SendReply(&reply);
						return;
					}
					if (message->what == B_SET_PROPERTY) {
						int32 rate = message->FindInt32("data");
						settingsChanged = true;
						settings.AddInt32("baudrate", rate);
					}
					break;
				case 1: // data bits
					if (message->what == B_GET_PROPERTY) {
						reply.AddInt32("result", fSerialPort.DataBits() + 7);
						message->SendReply(&reply);
						return;
					}
					if (message->what == B_SET_PROPERTY) {
						int32 bits = message->FindInt32("data");
						settingsChanged = true;
						settings.AddInt32("databits", bits - 7);
					}
					break;
				case 2: // stop bits
					if (message->what == B_GET_PROPERTY) {
						reply.AddInt32("result", fSerialPort.StopBits() + 1);
						message->SendReply(&reply);
						return;
					}
					if (message->what == B_SET_PROPERTY) {
						int32 bits = message->FindInt32("data");
						settingsChanged = true;
						settings.AddInt32("stopbits", bits - 1);
					}
					break;
				case 3: // parity
				{
					static const char* strings[] = {"none", "odd", "even"};
					if (message->what == B_GET_PROPERTY) {
						reply.AddString("result",
							strings[fSerialPort.ParityMode()]);
						message->SendReply(&reply);
						return;
					}
					if (message->what == B_SET_PROPERTY) {
						BString bits = message->FindString("data");
						int i;
						for (i = 0; i < 3; i++) {
							if (bits == strings[i])
								break;
						}

						if (i < 3) {
							settingsChanged = true;
							settings.AddInt32("parity", i);
						}
					}
					break;
				}
				case 4: // flow control
				{
					static const char* strings[] = {"none", "hardware",
						"software", "both"};
					if (message->what == B_GET_PROPERTY) {
						reply.AddString("result",
							strings[fSerialPort.FlowControl()]);
						message->SendReply(&reply);
						return;
					}
					if (message->what == B_SET_PROPERTY) {
						BString bits = message->FindString("data");
						int i;
						for (i = 0; i < 4; i++) {
							if (bits == strings[i])
								break;
						}

						if (i < 4) {
							settingsChanged = true;
							settings.AddInt32("flowcontrol", i);
						}
					}
					break;
				}
				case 5: // port
					if (message->what == B_GET_PROPERTY) {
						reply.AddString("port", GetPort());
						message->SendReply(&reply);
					} else if (message->what == B_DELETE_PROPERTY
						|| message->what == B_SET_PROPERTY) {
						BString path = message->FindString("data");
						BMessage openMessage(kMsgOpenPort);
						openMessage.AddString("port name", path);
						PostMessage(&openMessage);
						fWindow->PostMessage(&openMessage);
					}
					return;
			}
		}

		if (settingsChanged) {
			PostMessage(&settings);
			fWindow->PostMessage(&settings);
			return;
		}
	}

	BApplication::MessageReceived(message);
}
Пример #5
0
 MRESULT EXPENTRY icqFrameWindow(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
 {
    switch(msg)
    {
    case WM_DDE_INITIATEACK:
       return (MRESULT) icqDDEInitiateAck(hwnd, (HWND)mp1, (PDDEINIT)mp2);

    case WM_DDE_DATA:
       DBGMessage("WM_DDE_DATA");
       icqDDEData(hwnd, (PDDESTRUCT) mp2);
       break;

    case WM_CLOSE:
       DBGMessage("WM_CLOSE");
       close(hwnd);
       break;

    case WM_CREATE:
       icqskin_cfgWindow(hwnd,ICQFRAME,0);
       break;

    case WM_DESTROY:
       destroy(hwnd);
       break;

    case WM_ERASEBACKGROUND:
       erase(hwnd,(HPS) mp1, (PRECTL) mp2);
       break;

    case WM_SIZE:
       resize(hwnd,SHORT1FROMMP(mp2),SHORT2FROMMP(mp2));
       broadcast(hwnd,WMICQ_AUTOSIZE,0,0);
       break;

    case WM_PAINT:
       paint(hwnd);
       break;

    case WM_SETICON:
       WinSendMsg(WinQueryWindow(hwnd,QW_PARENT),msg,mp1,mp2);
       break;

    case WM_COMMAND:
       action(hwnd,SHORT1FROMMP(mp1), SHORT1FROMMP(mp2));
       break;

    case WM_PRESPARAMCHANGED:
       ppchanged(hwnd,LONGFROMMP(mp1));
       break;

    case WM_SETWINDOWPARAMS:
       return setparm(hwnd, PVOIDFROMMP(mp1), mp2);

    case WMICQ_SETNAME:
//       strncpy( ((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->name, (const char *) mp1, 19);
       ((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->name = (const char *) mp1;
       break;

    case WMICQ_SETICQHANDLE:
       DBGTracex(mp1);
       ((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->icq = (HICQ) mp1;
       break;

    case WMICQ_GETICQHANDLE:
       return (MRESULT) ((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->icq;

    case WMICQ_SETBUTTONTBL:
       setbuttons(hwnd,(const struct icqButtonTable *) mp1, (int) mp2);
       break;

    case WMICQ_QUERYPALLETE:
       return (MRESULT) ((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->pal;

    case WMICQ_EVENT:  // MP1 = type,code,user  MP2 = parm
       event(hwnd,CHAR3FROMMP(mp1),CHAR4FROMMP(mp1),SHORT1FROMMP(mp1),(ULONG) mp2);
       break;

    case WMICQ_SELECTPAL:
       icqskin_loadPallete( (HPS) mp1, 0, ((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->pal);
       break;

    case 0x041E:
       return WinDefWindowProc(hwnd, msg, mp1, mp2);

    case 0x041F:
       return WinDefWindowProc(hwnd, msg, mp1, mp2);

    case WM_BEGINDRAG:
       return beginDrag(hwnd, (POINTS *) &mp1);

    case WM_ENDDRAG:
       return endDrag(hwnd);

    case WM_TIMER:
       timer(hwnd);
       break;

#ifdef SKINNED_GUI
    case WMICQ_QUERYBGIMAGE:
       return (MRESULT) ((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->bg;
#else
    case WMICQ_QUERYBGIMAGE:
       return (MRESULT) NO_IMAGE;
#endif

    case WM_OWNERPOSCHANGE:
       DBGMessage("WM_OWNERPOSCHANGE");
       return WinDefWindowProc(hwnd,msg,mp1,mp2);

    case WM_MOUSEMOVE:
       if(WinQueryCapture(HWND_DESKTOP) == hwnd);
          saveMouse(hwnd,SHORT1FROMMP(mp1),SHORT2FROMMP(mp1));
       return WinDefWindowProc(hwnd,msg,mp1,mp2);

    case WMICQ_CLEAR:
       clearSkin( (ICQFRAME *) WinQueryWindowPtr(hwnd,0));
       break;

    case WMICQ_LOADSKIN:
       loadSkin(hwnd,(const char *) mp1, (SKINFILESECTION *) mp2);
       break;

    case WMICQ_SKINCHILDS:
       loadSkin4Childs(hwnd,(const char *) mp1, (SKINFILESECTION *) mp2);
       break;

    case WMICQ_RESTORE:
       restoreWindow(hwnd,(const char *) mp1,SHORT1FROMMP(mp2),SHORT2FROMMP(mp2));
       break;

    case WMICQ_STORE:
       storeWindow(hwnd,(const char *) mp1);
       break;

    case WMICQ_CONFIGURE:
       configure(hwnd,(int) mp1);
       break;

    case WMICQ_SETMSGCHILD:
       createchild(hwnd, (const MSGCHILD *) mp1, SHORT1FROMMP(mp2));
       break;

    case WMICQ_SKINELEMENT:
       skinElement(hwnd,(HWND) mp1, (const char **) mp2);
       break;

    case WMICQ_DRAWCONTENTS:
       break;

    case WMICQ_AUTOSIZE:
       autoSize(hwnd);
       break;

    case WMICQ_SIZEBUTTONS:
       return (MRESULT) sizeButtonBar(hwnd,SHORT1FROMMP(mp1),SHORT2FROMMP(mp1),(const USHORT *) mp2);

    case WMICQ_INVALIDATE:
       DBGMessage("WMICQ_INVALIDATE");
       WinInvalidateRect(hwnd,NULL,TRUE);
       break;

    /*---[ SysTray ]--------------------------------------------*/

    case WM_BUTTON2CLICK | 0x2000:
       icqShowPopupMenu(((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->icq, 0, ICQMNU_MODES, 0, 0);
       return (MRESULT) TRUE;

    case WM_BUTTON1CLICK | 0x2000:
       openMessage(((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->icq);
       return (MRESULT) TRUE;

    case WM_TRAYEXIT:	// When tray exits/crashes, it posts WM_TRAYEXIT (0xCD20) to all tray windows.
       icqDisableSysTray(((ICQFRAME *) WinQueryWindowPtr(hwnd,0))->icq);
       return (MRESULT) TRUE;

    /*---[ Default window processing ]--------------------------*/

    default:
       return WinDefWindowProc(hwnd,msg,mp1,mp2);
    }
    return 0;
 }