MimeTypeItem::MimeTypeItem(BMimeType& type, bool showIcon, bool flat) : BStringItem(type.Type(), !flat && !type.IsSupertypeOnly() ? 1 : 0, false), fType(type.Type()), fFlat(flat), fShowIcon(showIcon) { _SetTo(type); }
status_t icon_for_type(const BMimeType& type, uint8** _data, size_t* _size, icon_source* _source) { if (_data == NULL || _size == NULL) return B_BAD_VALUE; icon_source source = kNoIcon; uint8* data; size_t size; if (type.GetIcon(&data, &size) == B_OK) source = kOwnIcon; if (source == kNoIcon) { // check for icon from preferred app char preferred[B_MIME_TYPE_LENGTH]; if (type.GetPreferredApp(preferred) == B_OK) { BMimeType preferredApp(preferred); if (preferredApp.GetIconForType(type.Type(), &data, &size) == B_OK) source = kApplicationIcon; } } if (source == kNoIcon) { // check super type for an icon BMimeType superType; if (type.GetSupertype(&superType) == B_OK) { if (superType.GetIcon(&data, &size) == B_OK) source = kSupertypeIcon; else { // check the super type's preferred app char preferred[B_MIME_TYPE_LENGTH]; if (superType.GetPreferredApp(preferred) == B_OK) { BMimeType preferredApp(preferred); if (preferredApp.GetIconForType(superType.Type(), &data, &size) == B_OK) source = kSupertypeIcon; } } } } if (source != kNoIcon) { *_data = data; *_size = size; } // NOTE: else there is no data, so nothing is leaked. if (_source) *_source = source; return source != kNoIcon ? B_OK : B_ERROR; }
void IconView::SetTo(const BMimeType& type) { Unset(); if (type.Type() == NULL) return; fHasType = true; fType.SetTo(type.Type()); _StartWatching(); Update(); }
/*static*/ BString Playlist::_MIMEString(const entry_ref* ref) { BFile file(ref, B_READ_ONLY); BNodeInfo nodeInfo(&file); char mimeString[B_MIME_TYPE_LENGTH]; if (nodeInfo.GetType(mimeString) != B_OK) { BMimeType type; if (BMimeType::GuessMimeType(ref, &type) != B_OK) return BString(); strlcpy(mimeString, type.Type(), B_MIME_TYPE_LENGTH); nodeInfo.SetType(type.Type()); } return BString(mimeString); }
void CMimeItem::DrawItem(BView *owner, BRect bounds, bool) { BBitmap bm(BRect(0, 0, 15, 15), B_COLOR_8_BIT); if (IsSelected()) { bm.SetBits(fIconSelected, 256, 0, B_COLOR_8_BIT); owner->SetLowColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DARKEN_1_TINT)); } else { bm.SetBits(fIcon, 256, 0, B_COLOR_8_BIT); owner->SetLowColor(kWhite); } BRect r(bounds); owner->FillRect(r, B_SOLID_LOW); r.InsetBy(1, 1); font_height fh; be_plain_font->GetHeight(&fh); owner->SetDrawingMode(B_OP_OVER); owner->DrawBitmap(&bm, BPoint(r.left + 2, r.top)); owner->SetDrawingMode(B_OP_COPY); owner->DrawString(fMime.Type(), BPoint(r.left + 22, r.bottom - fh.descent)); owner->SetLowColor(kWhite); } /* CMimeItem::DrawItem */
status_t icon_for_type(const BMimeType& type, BBitmap& bitmap, icon_size size, icon_source* _source) { icon_source source = kNoIcon; if (type.GetIcon(&bitmap, size) == B_OK) source = kOwnIcon; if (source == kNoIcon) { // check for icon from preferred app char preferred[B_MIME_TYPE_LENGTH]; if (type.GetPreferredApp(preferred) == B_OK) { BMimeType preferredApp(preferred); if (preferredApp.GetIconForType(type.Type(), &bitmap, size) == B_OK) source = kApplicationIcon; } } if (source == kNoIcon) { // check super type for an icon BMimeType superType; if (type.GetSupertype(&superType) == B_OK) { if (superType.GetIcon(&bitmap, size) == B_OK) source = kSupertypeIcon; else { // check the super type's preferred app char preferred[B_MIME_TYPE_LENGTH]; if (superType.GetPreferredApp(preferred) == B_OK) { BMimeType preferredApp(preferred); if (preferredApp.GetIconForType(superType.Type(), &bitmap, size) == B_OK) source = kSupertypeIcon; } } } } if (_source) *_source = source; return source != kNoIcon ? B_OK : B_ERROR; }
void MimeTypeItem::_SetTo(BMimeType& type) { fIsSupertype = type.IsSupertypeOnly(); if (IsSupertypeOnly()) { // this is a super type fSupertype = type.Type(); fDescription = type.Type(); return; } const char* subType = strchr(type.Type(), '/'); fSupertype.SetTo(type.Type(), subType - type.Type()); fSubtype.SetTo(subType + 1); // omit the slash UpdateText(); }
// Returns whether this and the supplied MIME type are equal bool BMimeType::operator==(const BMimeType &type) const { if (InitCheck() == B_NO_INIT && type.InitCheck() == B_NO_INIT) return true; else if (InitCheck() == B_OK && type.InitCheck() == B_OK) return strcasecmp(Type(), type.Type()) == 0; return false; }
bool mimetype_is_application_signature(BMimeType& type) { char preferredApp[B_MIME_TYPE_LENGTH]; // The preferred application of an application is the same // as its signature. return type.GetPreferredApp(preferredApp) == B_OK && !strcasecmp(type.Type(), preferredApp); }
static status_t GetTrackerIcon(BMimeType &type, BBitmap *icon, icon_size iconSize) { // set some icon size related variables status_t error = B_OK; BRect bounds; switch (iconSize) { case B_MINI_ICON: bounds.Set(0, 0, 15, 15); break; case B_LARGE_ICON: bounds.Set(0, 0, 31, 31); break; default: error = B_BAD_VALUE; break; } // check parameters and initialization if (error == B_OK && (!icon || icon->InitCheck() != B_OK || icon->Bounds() != bounds)) return B_BAD_VALUE; bool success = false; // Ask the MIME database for the preferred application for the file type // and whether this application has a special icon for the type. char signature[B_MIME_TYPE_LENGTH]; if (type.GetPreferredApp(signature) == B_OK) { BMimeType type(signature); success = (type.GetIconForType(type.Type(), icon, iconSize) == B_OK); } // Ask the MIME database whether there is an icon for the node's file type. if (error == B_OK && !success) success = (type.GetIcon(icon, iconSize) == B_OK); // Ask the MIME database for the super type and start all over if (error == B_OK && !success) { BMimeType super; if (type.GetSupertype(&super) == B_OK) return GetTrackerIcon(super, icon, iconSize); } // Return the icon for "application/octet-stream" from the MIME database. if (error == B_OK && !success) { // get the "application/octet-stream" icon BMimeType type("application/octet-stream"); error = type.GetIcon(icon, iconSize); } return error; }
bool FileIterator::_ExamineFile(BEntry& entry, char* buffer, bool textFilesOnly) { BPath path; if (entry.GetPath(&path) != B_OK) return false; strcpy(buffer, path.Path()); if (!textFilesOnly) return true; BMimeType mimeType; BNode node(&entry); BNodeInfo nodeInfo(&node); char mimeTypeString[B_MIME_TYPE_LENGTH]; if (nodeInfo.GetType(mimeTypeString) != B_OK) { // try to get a MIME type before failing if (BMimeType::GuessMimeType(path.Path(), &mimeType) != B_OK) return false; nodeInfo.SetType(mimeType.Type()); } else mimeType.SetTo(mimeTypeString); BMimeType superType; if (mimeType.GetSupertype(&superType) == B_OK) { if (strcmp("text", superType.Type()) == 0 || strcmp("message", superType.Type()) == 0) { return true; } } return false; }
void PieView::_Launch(FileInfo* info, const entry_ref* appRef) { BMessage msg(B_REFS_RECEIVED); msg.AddRef("refs", &info->ref); if (appRef == NULL) { // Let the registrar pick an app based on the file's MIME type. BMimeType* type = info->Type(); be_roster->Launch(type->Type(), &msg); delete type; } else { // Launch a designated app to handle this file. be_roster->Launch(appRef, &msg); } }
bool ExtensionListView::AcceptsDrag(const BMessage* message) { if (fType.Type() == NULL) return false; int32 count = 0; entry_ref ref; for (int32 index = 0; message->FindRef("refs", index++, &ref) == B_OK; ) { const char* point = strchr(ref.name, '.'); if (point != NULL && point[1]) count++; } return count > 0; }
void MimeTypeListView::_AddNewType(const char* type) { MimeTypeItem* item = FindItem(type); BMimeType mimeType(type); bool isApp = mimetype_is_application_signature(mimeType); if (fApplicationMode ^ isApp || !mimeType.IsInstalled()) { if (item != NULL) { // type doesn't belong here RemoveItem(item); delete item; } return; } if (item != NULL) { // for some reason, the type already exists return; } BMimeType superType; MimeTypeItem* superItem = NULL; if (mimeType.GetSupertype(&superType) == B_OK) superItem = FindItem(superType.Type()); item = new MimeTypeItem(mimeType, fShowIcons, fSupertype.Type() != NULL); if (item->IsSupertypeOnly()) item->ShowIcon(false); item->SetApplicationMode(isApp); if (superItem != NULL) { AddUnder(item, superItem); InvalidateItem(IndexOf(superItem)); // the super item is not picked up from the class (ie. bug) } else AddItem(item); UpdateItem(item); if (!fSelectNewType.ICompare(mimeType.Type())) { SelectItem(item); fSelectNewType = ""; } }
ShortMimeInfo::ShortMimeInfo(const BMimeType& mimeType) : fCommonMimeType(true) { fPrivateName = mimeType.Type(); char buffer[B_MIME_TYPE_LENGTH]; // weed out apps - their preferred handler is themselves if (mimeType.GetPreferredApp(buffer) == B_OK && fPrivateName.ICompare(buffer) == 0) { fCommonMimeType = false; } // weed out metamimes without a short description if (mimeType.GetShortDescription(buffer) != B_OK || buffer[0] == 0) fCommonMimeType = false; else fShortDescription = buffer; }
String MIMETypeRegistry::getMIMETypeForExtension(const String& ext) { String str = ext.lower(); // Try WebCore built-in types. const ExtensionMap* extMap = extensionMap; while (extMap->extension) { if (str == extMap->extension) return extMap->mimeType; ++extMap; } // Try system mime database. String fakeFileName("filename."); fakeFileName.append(str); BMimeType type; if (BMimeType::GuessMimeType(fakeFileName.utf8().data(), &type) == B_OK) return type.Type(); // unknown return String(); }
AttributeWindow::AttributeWindow(FileTypesWindow* target, BMimeType& mimeType, AttributeItem* attributeItem) : BWindow(BRect(100, 100, 350, 200), "Attribute", B_MODAL_WINDOW_LOOK, B_MODAL_SUBSET_WINDOW_FEEL, B_NOT_ZOOMABLE | B_NOT_V_RESIZABLE | B_ASYNCHRONOUS_CONTROLS), fTarget(target), fMimeType(mimeType.Type()) { if (attributeItem != NULL) fAttribute = *attributeItem; BRect rect = Bounds(); BView* topView = new BView(rect, NULL, B_FOLLOW_ALL, B_WILL_DRAW); topView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); AddChild(topView); rect.InsetBy(8.0f, 8.0f); fPublicNameControl = new BTextControl(rect, "public", "Attribute name:", fAttribute.PublicName(), NULL, B_FOLLOW_LEFT_RIGHT); fPublicNameControl->SetModificationMessage(new BMessage(kMsgAttributeUpdated)); float labelWidth = fPublicNameControl->StringWidth(fPublicNameControl->Label()) + 2.0f; fPublicNameControl->SetDivider(labelWidth); fPublicNameControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); float width, height; fPublicNameControl->GetPreferredSize(&width, &height); fPublicNameControl->ResizeTo(rect.Width(), height); topView->AddChild(fPublicNameControl); rect = fPublicNameControl->Frame(); rect.OffsetBy(0.0f, rect.Height() + 5.0f); fAttributeControl = new BTextControl(rect, "internal", "Internal name:", fAttribute.Name(), NULL, B_FOLLOW_LEFT_RIGHT); fAttributeControl->SetModificationMessage(new BMessage(kMsgAttributeUpdated)); fAttributeControl->SetDivider(labelWidth); fAttributeControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); // filter out invalid characters that can't be part of an attribute BTextView* textView = fAttributeControl->TextView(); const char* disallowedCharacters = "/"; for (int32 i = 0; disallowedCharacters[i]; i++) { textView->DisallowChar(disallowedCharacters[i]); } topView->AddChild(fAttributeControl); fTypeMenu = new BPopUpMenu("type"); BMenuItem* item = NULL; for (int32 i = 0; kTypeMap[i].name != NULL; i++) { BMessage* message = new BMessage(kMsgTypeChosen); message->AddInt32("type", kTypeMap[i].type); item = new BMenuItem(kTypeMap[i].name, message); fTypeMenu->AddItem(item); if (kTypeMap[i].type == fAttribute.Type()) item->SetMarked(true); } rect.OffsetBy(0.0f, rect.Height() + 4.0f); BMenuField* menuField = new BMenuField(rect, "types", "Type:", fTypeMenu); menuField->SetDivider(labelWidth); menuField->SetAlignment(B_ALIGN_RIGHT); menuField->GetPreferredSize(&width, &height); menuField->ResizeTo(rect.Width(), height); topView->AddChild(menuField); rect.OffsetBy(0.0f, rect.Height() + 4.0f); rect.bottom = rect.top + fAttributeControl->Bounds().Height() * 2.0f + 18.0f; BBox* box = new BBox(rect, "", B_FOLLOW_LEFT_RIGHT); topView->AddChild(box); fVisibleCheckBox = new BCheckBox(rect, "visible", "Visible", new BMessage(kMsgVisibilityChanged)); fVisibleCheckBox->SetValue(fAttribute.Visible()); fVisibleCheckBox->ResizeToPreferred(); box->SetLabel(fVisibleCheckBox); labelWidth -= 8.0f; BMenu* menu = new BPopUpMenu("display as"); for (int32 i = 0; kDisplayAsMap[i].name != NULL; i++) { BMessage* message = new BMessage(kMsgDisplayAsChosen); if (kDisplayAsMap[i].identifier != NULL) { message->AddString("identifier", kDisplayAsMap[i].identifier); for (int32 j = 0; kDisplayAsMap[i].supported[j]; j++) { message->AddInt32("supports", kDisplayAsMap[i].supported[j]); } } item = new BMenuItem(kDisplayAsMap[i].name, message); menu->AddItem(item); if (compare_display_as(kDisplayAsMap[i].identifier, fAttribute.DisplayAs())) item->SetMarked(true); } rect.OffsetTo(8.0f, fVisibleCheckBox->Bounds().Height()); rect.right -= 18.0f; fDisplayAsMenuField = new BMenuField(rect, "display as", "Display as:", menu); fDisplayAsMenuField->SetDivider(labelWidth); fDisplayAsMenuField->SetAlignment(B_ALIGN_RIGHT); fDisplayAsMenuField->ResizeTo(rect.Width(), height); box->AddChild(fDisplayAsMenuField); fEditableCheckBox = new BCheckBox(rect, "editable", "Editable", new BMessage(kMsgAttributeUpdated), B_FOLLOW_RIGHT); fEditableCheckBox->SetValue(fAttribute.Editable()); fEditableCheckBox->ResizeToPreferred(); fEditableCheckBox->MoveTo(rect.right - fEditableCheckBox->Bounds().Width(), rect.top + (fDisplayAsMenuField->Bounds().Height() - fEditableCheckBox->Bounds().Height()) / 2.0f); box->AddChild(fEditableCheckBox); rect.OffsetBy(0.0f, menuField->Bounds().Height() + 4.0f); rect.bottom = rect.top + fPublicNameControl->Bounds().Height(); fSpecialControl = new BTextControl(rect, "special", "Special:", display_as_parameter(fAttribute.DisplayAs()), NULL, B_FOLLOW_LEFT_RIGHT); fSpecialControl->SetModificationMessage(new BMessage(kMsgAttributeUpdated)); fSpecialControl->SetDivider(labelWidth); fSpecialControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); fSpecialControl->SetEnabled(false); box->AddChild(fSpecialControl); char text[64]; snprintf(text, sizeof(text), "%ld", fAttribute.Width()); rect.OffsetBy(0.0f, fSpecialControl->Bounds().Height() + 4.0f); fWidthControl = new BTextControl(rect, "width", "Width:", text, NULL, B_FOLLOW_LEFT_RIGHT); fWidthControl->SetModificationMessage(new BMessage(kMsgAttributeUpdated)); fWidthControl->SetDivider(labelWidth); fWidthControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); // filter out invalid characters that can't be part of a width textView = fWidthControl->TextView(); for (int32 i = 0; i < 256; i++) { if (!isdigit(i)) textView->DisallowChar(i); } textView->SetMaxBytes(4); box->AddChild(fWidthControl); const struct alignment_map { int32 alignment; const char* name; } kAlignmentMap[] = { {B_ALIGN_LEFT, "Left"}, {B_ALIGN_RIGHT, "Right"}, {B_ALIGN_CENTER, "Center"}, {0, NULL} }; menu = new BPopUpMenu("alignment"); for (int32 i = 0; kAlignmentMap[i].name != NULL; i++) { BMessage* message = new BMessage(kMsgAlignmentChosen); message->AddInt32("alignment", kAlignmentMap[i].alignment); item = new BMenuItem(kAlignmentMap[i].name, message); menu->AddItem(item); if (kAlignmentMap[i].alignment == fAttribute.Alignment()) item->SetMarked(true); } rect.OffsetBy(0.0f, menuField->Bounds().Height() + 1.0f); fAlignmentMenuField = new BMenuField(rect, "alignment", "Alignment:", menu); fAlignmentMenuField->SetDivider(labelWidth); fAlignmentMenuField->SetAlignment(B_ALIGN_RIGHT); fAlignmentMenuField->ResizeTo(rect.Width(), height); box->AddChild(fAlignmentMenuField); box->ResizeBy(0.0f, fAlignmentMenuField->Bounds().Height() * 2.0f + fVisibleCheckBox->Bounds().Height()); fAcceptButton = new BButton(rect, "add", item ? "Done" : "Add", new BMessage(kMsgAccept), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); fAcceptButton->ResizeToPreferred(); fAcceptButton->MoveTo(Bounds().Width() - 8.0f - fAcceptButton->Bounds().Width(), Bounds().Height() - 8.0f - fAcceptButton->Bounds().Height()); fAcceptButton->SetEnabled(false); topView->AddChild(fAcceptButton); BButton* button = new BButton(rect, "cancel", "Cancel", new BMessage(B_QUIT_REQUESTED), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); button->ResizeToPreferred(); button->MoveTo(fAcceptButton->Frame().left - 10.0f - button->Bounds().Width(), fAcceptButton->Frame().top); topView->AddChild(button); ResizeTo(labelWidth * 4.0f + 24.0f, box->Frame().bottom + button->Bounds().Height() + 20.0f); SetSizeLimits(fEditableCheckBox->Bounds().Width() + button->Bounds().Width() + fAcceptButton->Bounds().Width() + labelWidth + 24.0f, 32767.0f, Frame().Height(), Frame().Height()); fAcceptButton->MakeDefault(true); fPublicNameControl->MakeFocus(true); target->PlaceSubWindow(this); AddToSubset(target); }
void SearchForSignatureEntryList::RelationDescription(const BMessage* entriesToOpen, const Model* applicationModel, BString* description, const entry_ref* preferredApp, const entry_ref* preferredAppForFile) { for (int32 index = 0; ;index++) { entry_ref ref; if (entriesToOpen->FindRef("refs", index, &ref) != B_OK) break; if (preferredAppForFile && ref == *preferredAppForFile) { description->SetTo(B_TRANSLATE("Preferred for file")); return; } Model model(&ref, true, true); if (model.InitCheck()) continue; BMimeType mimeType; int32 result = Relation(&model, applicationModel); switch (result) { case kDoesNotSupportType: continue; case kSuperhandler: description->SetTo(B_TRANSLATE("Handles any file")); return; case kSupportsSupertype: { mimeType.SetTo(model.MimeType()); // status_t result = mimeType.GetSupertype(&mimeType); char* type = (char*)mimeType.Type(); char* tmp = strchr(type, '/'); if (tmp != NULL) *tmp = '\0'; //PRINT(("getting supertype for %s, result %s, got %s\n", // model.MimeType(), strerror(result), mimeType.Type())); description->SetTo(B_TRANSLATE("Handles any %type")); //*description += mimeType.Type(); description->ReplaceFirst("%type", type); return; } case kSupportsType: { mimeType.SetTo(model.MimeType()); if (preferredApp != NULL && *applicationModel->EntryRef() == *preferredApp) { // application matches cached preferred app, we are done description->SetTo(B_TRANSLATE("Preferred for %type")); } else description->SetTo(B_TRANSLATE("Handles %type")); char shortDescription[256]; if (mimeType.GetShortDescription(shortDescription) == B_OK) description->ReplaceFirst("%type", shortDescription); else description->ReplaceFirst("%type", mimeType.Type()); return; } } } description->SetTo(B_TRANSLATE("Does not handle file")); }
void HWindow::MessageReceived(BMessage* message) { switch (message->what) { case M_OTHER_MESSAGE: { BMenuField* menufield = dynamic_cast<BMenuField*>(FindView("filemenu")); if (menufield == NULL) return; BMenu* menu = menufield->Menu(); HEventRow* row = (HEventRow*)fEventList->CurrentSelection(); if (row != NULL) { BPath path(row->Path()); if (path.InitCheck() != B_OK) { BMenuItem* item = menu->FindItem(B_TRANSLATE("<none>")); if (item != NULL) item->SetMarked(true); } else { BMenuItem* item = menu->FindItem(path.Leaf()); if (item != NULL) item->SetMarked(true); } } fFilePanel->Show(); break; } case B_SIMPLE_DATA: case B_REFS_RECEIVED: { entry_ref ref; HEventRow* row = (HEventRow*)fEventList->CurrentSelection(); if (message->FindRef("refs", &ref) == B_OK && row != NULL) { BMenuField* menufield = dynamic_cast<BMenuField*>(FindView("filemenu")); if (menufield == NULL) return; BMenu* menu = menufield->Menu(); // check audio file BNode node(&ref); BNodeInfo ninfo(&node); char type[B_MIME_TYPE_LENGTH + 1]; ninfo.GetType(type); BMimeType mtype(type); BMimeType superType; mtype.GetSupertype(&superType); if (superType.Type() == NULL || strcmp(superType.Type(), "audio") != 0) { beep(); BAlert* alert = new BAlert("", B_TRANSLATE("This is not an audio file."), B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_AS_USUAL, B_STOP_ALERT); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); break; } // add file item BMessage* msg = new BMessage(M_ITEM_MESSAGE); BPath path(&ref); msg->AddRef("refs", &ref); BMenuItem* menuitem = menu->FindItem(path.Leaf()); if (menuitem == NULL) menu->AddItem(menuitem = new BMenuItem(path.Leaf(), msg), 0); // refresh item fEventList->SetPath(BPath(&ref).Path()); // check file menu if (menuitem != NULL) menuitem->SetMarked(true); } break; } case M_PLAY_MESSAGE: { HEventRow* row = (HEventRow*)fEventList->CurrentSelection(); if (row != NULL) { const char* path = row->Path(); if (path != NULL) { entry_ref ref; ::get_ref_for_path(path, &ref); delete fPlayer; fPlayer = new BFileGameSound(&ref, false); fPlayer->StartPlaying(); } } break; } case M_STOP_MESSAGE: { if (fPlayer == NULL) break; if (fPlayer->IsPlaying()) { fPlayer->StopPlaying(); delete fPlayer; fPlayer = NULL; } break; } case M_EVENT_CHANGED: { const char* path; BMenuField* menufield = dynamic_cast<BMenuField*>(FindView("filemenu")); if (menufield == NULL) return; BMenu* menu = menufield->Menu(); if (message->FindString("path", &path) == B_OK) { BPath path(path); if (path.InitCheck() != B_OK) { BMenuItem* item = menu->FindItem(B_TRANSLATE("<none>")); if (item != NULL) item->SetMarked(true); } else { BMenuItem* item = menu->FindItem(path.Leaf()); if (item != NULL) item->SetMarked(true); } } break; } case M_ITEM_MESSAGE: { entry_ref ref; if (message->FindRef("refs", &ref) == B_OK) fEventList->SetPath(BPath(&ref).Path()); break; } case M_NONE_MESSAGE: { fEventList->SetPath(NULL); break; } default: BWindow::MessageReceived(message); } }
void TListItem::DrawItem(BView *owner, BRect r, bool /* complete */) { if (IsSelected()) { owner->SetHighColor(180, 180, 180); owner->SetLowColor(180, 180, 180); } else { owner->SetHighColor(255, 255, 255); owner->SetLowColor(255, 255, 255); } owner->FillRect(r); owner->SetHighColor(0, 0, 0); BFont font = *be_plain_font; font.SetSize(font.Size() * kPlainFontSizeScale); owner->SetFont(&font); owner->MovePenTo(r.left + 24, r.bottom - 4); if (fComponent) { // if it's already a mail component, we don't have an icon to // draw, and the entry_ref is invalid BMailAttachment *attachment = dynamic_cast<BMailAttachment *>(fComponent); char name[B_FILE_NAME_LENGTH * 2]; if ((attachment == NULL) || (attachment->FileName(name) < B_OK)) strcpy(name, "unnamed"); BMimeType type; if (fComponent->MIMEType(&type) == B_OK) sprintf(name + strlen(name), ", Type: %s", type.Type()); owner->DrawString(name); BRect iconRect(0, 0, B_MINI_ICON - 1, B_MINI_ICON - 1); BBitmap bitmap(iconRect, B_COLOR_8_BIT); if (GetTrackerIcon(type, &bitmap, B_MINI_ICON) == B_NO_ERROR) { BRect rect(r.left + 4, r.top + 1, r.left + 4 + 15, r.top + 1 + 15); owner->SetDrawingMode(B_OP_OVER); owner->DrawBitmap(&bitmap, iconRect, rect); owner->SetDrawingMode(B_OP_COPY); } else { // ToDo: find some nicer image for this :-) owner->SetHighColor(150, 150, 150); owner->FillEllipse(BRect(r.left + 8, r.top + 4, r.left + 16, r.top + 13)); } return; } BFile file(&fRef, O_RDONLY); BEntry entry(&fRef); BPath path; if (entry.GetPath(&path) == B_OK && file.InitCheck() == B_OK) { owner->DrawString(path.Path()); BNodeInfo info(&file); BRect sr(0, 0, B_MINI_ICON - 1, B_MINI_ICON - 1); BBitmap bitmap(sr, B_COLOR_8_BIT); if (info.GetTrackerIcon(&bitmap, B_MINI_ICON) == B_NO_ERROR) { BRect dr(r.left + 4, r.top + 1, r.left + 4 + 15, r.top + 1 + 15); owner->SetDrawingMode(B_OP_OVER); owner->DrawBitmap(&bitmap, sr, dr); owner->SetDrawingMode(B_OP_COPY); } } else owner->DrawString("<missing attachment>"); }
ExtensionWindow::ExtensionWindow(FileTypesWindow* target, BMimeType& type, const char* extension) : BWindow(BRect(100, 100, 350, 200), "Extension", B_MODAL_WINDOW_LOOK, B_MODAL_SUBSET_WINDOW_FEEL, B_NOT_ZOOMABLE | B_NOT_V_RESIZABLE | B_ASYNCHRONOUS_CONTROLS), fTarget(target), fMimeType(type.Type()), fExtension(extension) { BRect rect = Bounds(); BView* topView = new BView(rect, NULL, B_FOLLOW_ALL, B_WILL_DRAW); topView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); AddChild(topView); rect.InsetBy(8.0f, 8.0f); fExtensionControl = new BTextControl(rect, "extension", "Extension:", extension, NULL, B_FOLLOW_LEFT_RIGHT); float labelWidth = fExtensionControl->StringWidth(fExtensionControl->Label()) + 2.0f; fExtensionControl->SetModificationMessage(new BMessage(kMsgExtensionUpdated)); fExtensionControl->SetDivider(labelWidth); fExtensionControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); // filter out invalid characters that can't be part of an extension BTextView* textView = fExtensionControl->TextView(); const char* disallowedCharacters = "/:"; for (int32 i = 0; disallowedCharacters[i]; i++) { textView->DisallowChar(disallowedCharacters[i]); } float width, height; fExtensionControl->GetPreferredSize(&width, &height); fExtensionControl->ResizeTo(rect.Width(), height); topView->AddChild(fExtensionControl); fAcceptButton = new BButton(rect, "add", extension ? "Done" : "Add", new BMessage(kMsgAccept), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); fAcceptButton->ResizeToPreferred(); fAcceptButton->MoveTo(Bounds().Width() - 8.0f - fAcceptButton->Bounds().Width(), Bounds().Height() - 8.0f - fAcceptButton->Bounds().Height()); fAcceptButton->SetEnabled(false); topView->AddChild(fAcceptButton); BButton* button = new BButton(rect, "cancel", "Cancel", new BMessage(B_QUIT_REQUESTED), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); button->ResizeToPreferred(); button->MoveTo(fAcceptButton->Frame().left - 10.0f - button->Bounds().Width(), fAcceptButton->Frame().top); topView->AddChild(button); ResizeTo(labelWidth * 4.0f + 24.0f, fExtensionControl->Bounds().Height() + fAcceptButton->Bounds().Height() + 28.0f); SetSizeLimits(button->Bounds().Width() + fAcceptButton->Bounds().Width() + 26.0f, 32767.0f, Frame().Height(), Frame().Height()); // omit the leading dot if (fExtension.ByteAt(0) == '.') fExtension.Remove(0, 1); fAcceptButton->MakeDefault(true); fExtensionControl->MakeFocus(true); target->PlaceSubWindow(this); AddToSubset(target); }
AttributeWindow::AttributeWindow(FileTypesWindow* target, BMimeType& mimeType, AttributeItem* attributeItem) : BWindow(BRect(100, 100, 350, 200), B_TRANSLATE("Attribute"), B_MODAL_WINDOW_LOOK, B_MODAL_SUBSET_WINDOW_FEEL, B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_ASYNCHRONOUS_CONTROLS), fTarget(target), fMimeType(mimeType.Type()) { float padding = be_control_look->DefaultItemSpacing(); if (attributeItem != NULL) fAttribute = *attributeItem; fPublicNameControl = new BTextControl(B_TRANSLATE("Attribute name:"), fAttribute.PublicName(), NULL); fPublicNameControl->SetModificationMessage( new BMessage(kMsgAttributeUpdated)); fPublicNameControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); fAttributeControl = new BTextControl(B_TRANSLATE("Internal name:"), fAttribute.Name(), NULL); fAttributeControl->SetModificationMessage( new BMessage(kMsgAttributeUpdated)); fAttributeControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); // filter out invalid characters that can't be part of an attribute BTextView* textView = fAttributeControl->TextView(); const char* disallowedCharacters = "/"; for (int32 i = 0; disallowedCharacters[i]; i++) { textView->DisallowChar(disallowedCharacters[i]); } fTypeMenu = new BPopUpMenu("type"); BMenuItem* item = NULL; for (int32 i = 0; kTypeMap[i].name != NULL; i++) { BMessage* message = new BMessage(kMsgTypeChosen); message->AddInt32("type", kTypeMap[i].type); item = new BMenuItem(kTypeMap[i].name, message); fTypeMenu->AddItem(item); if (kTypeMap[i].type == fAttribute.Type()) item->SetMarked(true); } BMenuField* typeMenuField = new BMenuField("types" , B_TRANSLATE("Type:"), fTypeMenu); typeMenuField->SetAlignment(B_ALIGN_RIGHT); // we must set the color manually when adding a menuField directly // into a window. typeMenuField->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); typeMenuField->SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR)); fVisibleCheckBox = new BCheckBox("visible", B_TRANSLATE("Visible"), new BMessage(kMsgVisibilityChanged)); fVisibleCheckBox->SetValue(fAttribute.Visible()); BMenu* menu = new BPopUpMenu("display as"); for (int32 i = 0; kDisplayAsMap[i].name != NULL; i++) { BMessage* message = new BMessage(kMsgDisplayAsChosen); if (kDisplayAsMap[i].identifier != NULL) { message->AddString("identifier", kDisplayAsMap[i].identifier); for (int32 j = 0; kDisplayAsMap[i].supported[j]; j++) { message->AddInt32("supports", kDisplayAsMap[i].supported[j]); } } item = new BMenuItem(kDisplayAsMap[i].name, message); menu->AddItem(item); if (compare_display_as(kDisplayAsMap[i].identifier, fAttribute.DisplayAs())) item->SetMarked(true); } fDisplayAsMenuField = new BMenuField("display as", B_TRANSLATE_COMMENT("Display as:", "Tracker offers different display modes for attributes."), menu); fDisplayAsMenuField->SetAlignment(B_ALIGN_RIGHT); fEditableCheckBox = new BCheckBox("editable", B_TRANSLATE_COMMENT("Editable", "If Tracker allows to edit this attribute."), new BMessage(kMsgAttributeUpdated)); fEditableCheckBox->SetValue(fAttribute.Editable()); fSpecialControl = new BTextControl(B_TRANSLATE("Special:"), display_as_parameter(fAttribute.DisplayAs()), NULL); fSpecialControl->SetModificationMessage( new BMessage(kMsgAttributeUpdated)); fSpecialControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); fSpecialControl->SetEnabled(false); char text[64]; snprintf(text, sizeof(text), "%ld", fAttribute.Width()); fWidthControl = new BTextControl(B_TRANSLATE_COMMENT("Width:", "Default column width in Tracker for this attribute."), text, NULL); fWidthControl->SetModificationMessage( new BMessage(kMsgAttributeUpdated)); fWidthControl->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); // filter out invalid characters that can't be part of a width textView = fWidthControl->TextView(); for (int32 i = 0; i < 256; i++) { if (!isdigit(i)) textView->DisallowChar(i); } textView->SetMaxBytes(4); const struct alignment_map { int32 alignment; const char* name; } kAlignmentMap[] = { {B_ALIGN_LEFT, B_TRANSLATE_COMMENT("Left", "Attribute column alignment in Tracker")}, {B_ALIGN_RIGHT, B_TRANSLATE_COMMENT("Right", "Attribute column alignment in Tracker")}, {B_ALIGN_CENTER, B_TRANSLATE_COMMENT("Center", "Attribute column alignment in Tracker")}, {0, NULL} }; menu = new BPopUpMenu("alignment"); for (int32 i = 0; kAlignmentMap[i].name != NULL; i++) { BMessage* message = new BMessage(kMsgAlignmentChosen); message->AddInt32("alignment", kAlignmentMap[i].alignment); item = new BMenuItem(kAlignmentMap[i].name, message); menu->AddItem(item); if (kAlignmentMap[i].alignment == fAttribute.Alignment()) item->SetMarked(true); } fAlignmentMenuField = new BMenuField("alignment", B_TRANSLATE("Alignment:"), menu); fAlignmentMenuField->SetAlignment(B_ALIGN_RIGHT); fAcceptButton = new BButton("add", item ? B_TRANSLATE("Done") : B_TRANSLATE("Add"), new BMessage(kMsgAccept)); fAcceptButton->SetEnabled(false); BButton* cancelButton = new BButton("cancel", B_TRANSLATE("Cancel"), new BMessage(B_QUIT_REQUESTED)); BBox* visibleBox; BLayoutBuilder::Group<>(this, B_VERTICAL, padding) .SetInsets(padding, padding, padding, padding) .AddGrid(padding, padding / 2) .Add(fPublicNameControl->CreateLabelLayoutItem(), 0, 0) .Add(fPublicNameControl->CreateTextViewLayoutItem(), 1, 0) .Add(fAttributeControl->CreateLabelLayoutItem(), 0, 1) .Add(fAttributeControl->CreateTextViewLayoutItem(), 1, 1) .Add(typeMenuField->CreateLabelLayoutItem(), 0, 2) .Add(typeMenuField->CreateMenuBarLayoutItem(), 1, 2) .End() .Add(visibleBox = new BBox(B_FANCY_BORDER, BLayoutBuilder::Grid<>(padding, padding / 2) .Add(fDisplayAsMenuField->CreateLabelLayoutItem(), 0, 0) .Add(fDisplayAsMenuField->CreateMenuBarLayoutItem(), 1, 0) .Add(fEditableCheckBox, 2, 0) .Add(fSpecialControl->CreateLabelLayoutItem(), 0, 1) .Add(fSpecialControl->CreateTextViewLayoutItem(), 1, 1, 2) .Add(fWidthControl->CreateLabelLayoutItem(), 0, 2) .Add(fWidthControl->CreateTextViewLayoutItem(), 1, 2, 2) .Add(fAlignmentMenuField->CreateLabelLayoutItem(), 0, 3) .Add(fAlignmentMenuField->CreateMenuBarLayoutItem(), 1, 3, 2) .SetInsets(padding, padding, padding, padding) .View()) ) .AddGroup(B_HORIZONTAL, padding) .Add(BSpaceLayoutItem::CreateGlue()) .Add(cancelButton) .Add(fAcceptButton); visibleBox->SetLabel(fVisibleCheckBox); fAcceptButton->MakeDefault(true); fPublicNameControl->MakeFocus(true); target->PlaceSubWindow(this); AddToSubset(target); _CheckDisplayAs(); _CheckAcceptable(); }
void MyApplication::RefsReceived(BMessage *message) { // be_app->Lock(); uint32 ref_num; entry_ref ref; BMediaTrack *audTrack(NULL); media_format format; memset(&format, 0, sizeof(format)); // media_raw_audio_format *raf(NULL); // short audioFrameSize(1); // char *audioData(NULL); int32 frame_size, channels = 1; Pool.sample_type = NONE; // for frame moving / resize bool temp_pause = play_cookie.pause;; ref_num=0; if (message->FindRef("refs",ref_num, &ref) == B_OK){ BMediaFile inFile(&ref); if (inFile.InitCheck() == B_OK){ char s[B_FILE_NAME_LENGTH +20]; sprintf(s, "BeAE - %s", ref.name); mainWindow->SetTitle(s); Pool.sample_view_dirty = true; // update the sample-view Pool.update_index = true; Pool.RedrawWindow(); play_cookie.pause = true; // gather the necessary format information int32 tracks = inFile.CountTracks(); for (int32 i = 0; i < tracks; i++) { BMediaTrack *inTrack = inFile.TrackAt(i); inTrack->EncodedFormat(&format); if (format.IsAudio()) { audTrack = inTrack; inTrack->DecodedFormat(&format); // Pool.m_format = format; memcpy(&Pool.m_format, &format, sizeof(Pool.m_format)); Pool.sample_bits = (format.u.raw_audio.format & 0xf)*8; Pool.selection = NONE; Pool.frequency = format.u.raw_audio.frame_rate; // printf("format : %x\n", format.u.raw_audio.format); Pool.size = audTrack->CountFrames()-1; channels = format.u.raw_audio.channel_count; Pool.StartProgress(Language.get("LOADING_FILE"), Pool.size); frame_size = (format.u.raw_audio.format & 0xf)*channels; #ifndef __VM_SYSTEM //RAM if (Pool.sample_memory) // create buffer for sample memory, add an extra frame to be able to do free(Pool.sample_memory); // 32bit to 16 bit conversions Pool.sample_memory = (float*)malloc(Pool.size * channels *4 +1024); #endif }else{ inFile.ReleaseAllTracks(); } } int64 frameCount, framesRead; status_t err; media_header mh; int32 lastPercent, currPercent; float completePercent; BString status; char *buffer = (char*)malloc(format.u.raw_audio.buffer_size); // temp memory #ifndef __VM_SYSTEM //RAM float *mem = Pool.sample_memory; // dest memory // read audio from source and write to destination, if necessary if (mem) { #else VM.Reset(); float *convert_buffer = (float*)malloc(format.u.raw_audio.buffer_size*4); // make sure there can be floats in it // read audio from source and write to destination, if necessary if (convert_buffer) { float *mem = NULL; #endif frameCount = audTrack->CountFrames(); int64 count =0; lastPercent = -1; for (int64 i = 0; i < frameCount; i += framesRead) { #ifdef __VM_SYSTEM //RAM mem = convert_buffer; #endif // clear buffer first memset( buffer, 0, format.u.raw_audio.buffer_size); if ((err = audTrack->ReadFrames(buffer, &framesRead, &mh)) != B_OK) { printf("Error reading audio frames: %s\n", strerror(err)); break; } count += framesRead; // now correct for crashes if bigger than file if (count > frameCount) framesRead -= (count - frameCount); switch(format.u.raw_audio.format){ case 0x24: // 0 == mid, -1.0 == bottom, 1.0 == top (the preferred format for non-game audio) { float *tmp = (float*)buffer; float x; for (int32 count = 0; count<framesRead*channels; count++){ x = *tmp++; if (x<-1.0) x = -1.0; else if (x>1.0) x = 1.0; *mem++ = x; } } break; case 0x4: // 0 == mid, 0x80000001 == bottom, 0x7fffffff == top (all >16-bit formats, left-adjusted) { int32 *tmp = (int32*)buffer; float x; for (int32 count = 0; count<framesRead*channels; count++){ x = *tmp++/0x80000000; if (x<-1.0) x = -1.0; else if (x>1.0) x = 1.0; *mem++ = x; } } break; case 0x2: // 0 == mid, -32767 == bottom, +32767 == top { int16 *tmp = (int16*)buffer; float x; for (int32 count = 0; count<framesRead*channels; count++){ x = *tmp++/32767.0; if (x<-1.0) x = -1.0; else if (x>1.0) x = 1.0; *mem++ = x; } } break; case 0x11: // 128 == mid, 1 == bottom, 255 == top (discouraged but supported format) { uint8 *tmp = (uint8*)buffer; float x; for (int32 count = 0; count<framesRead*channels; count++){ x = *tmp++/127.0 -1.0; if (x<-1.0) x = -1.0; else if (x>1.0) x = 1.0; *mem++ = x; } } break; case 0x1: // 0 == mid, -127 == bottom, +127 == top (not officially supported format) { int8 *tmp = (int8*)buffer; float x; for (int32 count = 0; count<framesRead*channels; count++){ x = *tmp++/127.0; // xor 128 to invert sign bit if (x<-1.0) x = -1.0; else if (x>1.0) x = 1.0; *mem++ = x; } } break; } #ifdef __VM_SYSTEM //RAM VM.WriteBlock( convert_buffer, framesRead*channels ); #endif Pool.ProgressUpdate( framesRead ); completePercent = ((float)i) / ((float)frameCount) * 100; currPercent = (int16)floor(completePercent); if (currPercent > lastPercent) { lastPercent = currPercent; } } inFile.ReleaseAllTracks(); #ifdef __VM_SYSTEM //RAM free(convert_buffer); #endif }else{ Pool.play_mode = NONE; Pool.pointer = 0; Pool.play_pointer = 0; Pool.l_pointer = 0; Pool.r_pointer = 0; Pool.r_sel_pointer = 0; Pool.size = 0; Pool.selection = NONE; Pool.sample_type = NONE; Pool.sample_bits = 16; Pool.frequency = 41400.0; (new BAlert(NULL,Language.get("MEM_ERROR"),Language.get("OK")))->Go(); } if (channels == 1) Pool.sample_type = MONO; else Pool.sample_type = STEREO; Pool.r_pointer = Pool.size; Pool.pointer = 0; Pool.r_sel_pointer = Pool.pointer; Pool.l_pointer = 0; #ifndef __VM_SYSTEM //RAM play_cookie.mem = Pool.sample_memory; play_cookie.start_mem = Pool.sample_memory; play_cookie.end_mem = Pool.sample_memory + Pool.size*Pool.sample_type; play_cookie.frequency = Pool.frequency; play_cookie.add = 0; #else play_cookie.mem = 0; play_cookie.start_mem = 0; // play_cookie.end_mem = Pool.size*Pool.sample_type; play_cookie.frequency = Pool.frequency; play_cookie.add = 0; #endif Pool.changed = false; Pool.HideProgress(); // create the PeakFile Pool.ResetIndexView(); Hist.Reset(); // reset undo class if (IsLaunching() && Prefs.play_when_loaded) Pool.mainWindow->PostMessage(TRANSPORT_PLAYS); }else{ (new BAlert(NULL,Language.get("LOADING_NO_AUDIO"),Language.get("OK")))->Go(); } } Pool.sample_view_dirty = true; // update the sample-view Pool.update_draw_cache = true; // update the draw cache Pool.update_index = true; // update the draw cache Pool.update_peak = true; Pool.RedrawWindow(); Pool.InitBufferPlayer( Pool.frequency ); play_cookie.pause = temp_pause; Pool.UpdateMenu(); mainWindow->UpdateRecent(); // be_app->Unlock(); } //------------------------------------------------------------------ Save void MyApplication::Save(BMessage *message){ // Grab the stuff we know is there .. or should be :P entry_ref dir_ref, file_ref; const char *name; BFile newFile; BDirectory dir; float t; if ((message->FindRef("directory", &dir_ref) == B_OK) && (message->FindString("name", &name) == B_OK)) { dir.SetTo(&dir_ref); if (dir.InitCheck() != B_OK) return; dir.CreateFile(name, &newFile); BEntry entry(&dir, name); if (entry.InitCheck() != B_OK) { (new BAlert(NULL, Language.get("CANT_OVERWRITE_FILE"), Language.get("OK")))->Go(); return; } entry.GetRef(&file_ref); media_codec_info *audioCodec; media_file_format *fileFormat; media_raw_audio_format *raf(NULL), *raf_in(NULL); media_format format; memset(&format, 0, sizeof(format)); char *buffer(NULL); int32 frame_size(1); fSavePanel->GetSelectedFormatInfo(&fileFormat, &audioCodec); if (audioCodec != NULL){ // format = Pool.m_format; memcpy(&format, &Pool.m_format, sizeof(format)); raf_in = &(format.u.raw_audio); format.type = B_MEDIA_RAW_AUDIO; if (raf_in->format == 1) raf_in->format = 0x11; // create media file BMediaFile file(&file_ref, fileFormat, B_MEDIA_FILE_REPLACE_MODE); if (file.InitCheck() != B_OK){ (new BAlert(NULL, Language.get("CANT_OVERWRITE_FILE"), Language.get("OK")))->Go(); return; } BMediaTrack *outTrack = file.CreateTrack(&format, audioCodec); if (outTrack){ file.CommitHeader(); if (save_start == 0){ // save as char s[B_FILE_NAME_LENGTH +20]; sprintf(s, "BeAE - %s", file_ref.name); mainWindow->SetTitle(s); } raf = &(format.u.raw_audio); buffer = (char*)malloc(raf->buffer_size); int32 channels = raf->channel_count; frame_size = (raf->format & 0xf) * raf->channel_count; int32 buffer_step = raf->buffer_size / frame_size; #ifndef __VM_SYSTEM //RAM float *mem = Pool.sample_memory + save_start*Pool.sample_type; // src memory #else float *convert_buffer = (float*)malloc(buffer_step*channels*4); // make sure there can be floats in it // read audio from source and write to destination, if necessary if (convert_buffer) { VM.ReadBlockAt(save_start, convert_buffer, buffer_step*channels ); float *mem = convert_buffer; #endif Pool.StartProgress(Language.get("SAVING_FILE"), save_end-save_start); for (int64 i=save_start; i<save_end; i+=buffer_step){ // fill up the buffer int32 block = MIN( (save_end-i) , buffer_step); switch(format.u.raw_audio.format){ case 0x24: // 0 == mid, -1.0 == bottom, 1.0 == top (the preferred format for non-game audio) { float *tmp = (float*)buffer; for (int32 count = 0; count<block*channels; count++){ *tmp++ = *mem++; } } break; case 0x4: // 0 == mid, 0x80000001 == bottom, 0x7fffffff == top (all >16-bit formats, left-adjusted) { int32 *tmp = (int32*)buffer; for (int32 count = 0; count<block*channels; count++){ t = *mem++; *tmp++ = ROUND(t*0x7fffffff); } } break; case 0x2: // 0 == mid, -32767 == bottom, +32767 == top { int16 *tmp = (int16*)buffer; for (int32 count = 0; count<block*channels; count++){ t = *mem++; *tmp++ = ROUND(t*32767.0); } } break; case 0x11: // 128 == mid, 1 == bottom, 255 == top (discouraged but supported format) { uint8 *tmp = (uint8*)buffer; for (int32 count = 0; count<block*channels; count++){ t = *mem++; *tmp = ROUND(t*127.0); tmp++; *tmp = *tmp ^ 0x80; } } break; case 0x1: // 0 == mid, -127 == bottom, +127 == top (not officially supported format) { int8 *tmp = (int8*)buffer; for (int32 count = 0; count<block*channels; count++){ t = *mem++; *tmp++ = ROUND(t*127.0); // xor 128 to invert sign bit } } break; } Pool.ProgressUpdate( block ); outTrack->WriteFrames(buffer, block); #ifdef __VM_SYSTEM //RAM VM.ReadBlock(convert_buffer, block*channels ); mem = convert_buffer; #endif } #ifdef __VM_SYSTEM //RAM free(convert_buffer); } #endif Pool.changed = false; outTrack->Flush(); BMimeType result; BEntry ent(&dir,name); entry_ref fref; ent.GetRef(&fref); BMimeType::GuessMimeType(&fref,&result); BNodeInfo ninfo(&newFile); ninfo.SetType(result.Type()); }else{ (new BAlert(NULL, Language.get("CODEC_FORMAT_ERROR"), Language.get("OK")))->Go(); } file.CloseFile(); free(buffer); Pool.HideProgress(); } }else{ (new BAlert(NULL, Language.get("SAVE_ERROR"), Language.get("OK")))->Go(); } if (Pool.save_mode == 2) PostMessage(B_QUIT_REQUESTED); if (Pool.save_mode == 1) mainWindow->PostMessage(OPEN); Pool.save_mode = 0; }
/*! \brief Guesses a MIME type for the supplied chunk of data. This is accomplished by searching through the currently installed list of sniffer rules for a rule that matches on the given data buffer. Rules are searched in order of priority (higher priority first). Rules of equal priority are searched in reverse-alphabetical order (that way "supertype/subtype" form rules are checked before "supertype-only" form rules if their priorities happen to be identical). \param file The file to sniff. May be \c NULL. \a buffer is always given. \param buffer Pointer to a data buffer to sniff \param length The length of the data buffer pointed to by \a buffer \param type Pointer to a pre-allocated BString which is set to the resulting MIME type. \return - \c B_OK: success - \c Mime::kMimeGuessFailure: no match found (\a type is left unmodified) - error code: failure */ status_t SnifferRules::GuessMimeType(BFile* file, const void *buffer, int32 length, BString *type) { status_t err = buffer && type ? B_OK : B_BAD_VALUE; if (err) return err; // wrap the buffer by a BMemoryIO BMemoryIO data(buffer, length); if (!fHaveDoneFullBuild) err = BuildRuleList(); // first ask the MIME sniffer for a suitable type float addonPriority = -1; BMimeType mimeType; if (!err && fMimeSniffer != NULL) { addonPriority = fMimeSniffer->GuessMimeType(file, buffer, length, &mimeType); } if (!err) { // Run through our rule list, which is sorted in order of // descreasing priority, and see if one of the rules sniffs // out a match for (std::list<sniffer_rule>::const_iterator i = fRuleList.begin(); i != fRuleList.end(); i++) { if (i->rule) { // If an add-on identified the type with a priority at least // as great as the remaining rules, we can stop further // processing and return the type found by the add-on. if (i->rule->Priority() <= addonPriority) { *type = mimeType.Type(); return B_OK; } if (i->rule->Sniff(&data)) { type->SetTo(i->type.c_str()); return B_OK; } } else { DBG(OUT("WARNING: Mime::SnifferRules::GuessMimeType(BPositionIO*,BString*): " "NULL sniffer_rule::rule member found in rule list for type == '%s', " "rule_string == '%s'\n", i->type.c_str(), i->rule_string.c_str())); } } // The sniffer add-on manager might have returned a low priority // (lower than any of a rule). if (addonPriority >= 0) { *type = mimeType.Type(); return B_OK; } // If we get here, we didn't find a damn thing err = kMimeGuessFailureError; } return err; }