void ResView::AddResource(const entry_ref &ref) { BFile file(&ref, B_READ_ONLY); if (file.InitCheck() != B_OK) return; BString mime; file.ReadAttrString("BEOS:TYPE", &mime); if (mime == "application/x-be-resource") { BMessage msg(B_REFS_RECEIVED); msg.AddRef("refs", &ref); be_app->PostMessage(&msg); return; } type_code fileType = 0; BTranslatorRoster *roster = BTranslatorRoster::Default(); translator_info info; if (roster->Identify(&file, NULL, &info, 0, mime.String()) == B_OK) fileType = info.type; else fileType = B_RAW_TYPE; int32 lastID = -1; for (int32 i = 0; i < fDataList.CountItems(); i++) { ResourceData *resData = (ResourceData*)fDataList.ItemAt(i); if (resData->GetType() == fileType && resData->GetID() > lastID) lastID = resData->GetID(); } off_t fileSize; file.GetSize(&fileSize); if (fileSize < 1) return; char *fileData = (char *)malloc(fileSize); file.Read(fileData, fileSize); ResourceData *resData = new ResourceData(fileType, lastID + 1, ref.name, fileData, fileSize); fDataList.AddItem(resData); ResDataRow *row = new ResDataRow(resData); fListView->AddRow(row); SetSaveStatus(FILE_DIRTY); }
void ResView::SaveFile(void) { if (fSaveStatus == FILE_CLEAN || !fRef) return; BFile file(fRef,B_READ_WRITE); BResources res(&file,true); file.Unset(); for (int32 i = 0; i < fListView->CountRows(); i++) { ResDataRow *row = (ResDataRow*)fListView->RowAt(i); ResourceData *data = row->GetData(); res.AddResource(data->GetType(), data->GetID(), data->GetData(), data->GetLength(), data->GetName()); } res.Sync(); if (fSaveStatus == FILE_QUIT_AFTER_SAVE && Window()) Window()->PostMessage(B_QUIT_REQUESTED); SetSaveStatus(FILE_CLEAN); }