People: open files in READ_WRITE mode only when necessary. (#5791)

This commit is contained in:
Philippe Saint-Pierre 2013-06-22 19:46:40 -04:00
parent b1975a590f
commit a09c983cc6
2 changed files with 29 additions and 17 deletions

View File

@ -55,10 +55,10 @@ PersonView::PersonView(const char* name, const char* categoryAttribute,
SetName(name); SetName(name);
SetFlags(Flags() | B_WILL_DRAW); SetFlags(Flags() | B_WILL_DRAW);
if (ref) fRef = ref;
fFile = new BFile(ref, O_RDWR); BFile* file = NULL;
else if (fRef != NULL)
fFile = NULL; file = new BFile(fRef, B_READ_ONLY);
float spacing = be_control_look->DefaultItemSpacing(); float spacing = be_control_look->DefaultItemSpacing();
BGridLayout* layout = GridLayout(); BGridLayout* layout = GridLayout();
@ -71,14 +71,14 @@ PersonView::PersonView(const char* name, const char* categoryAttribute,
layout->ItemAt(0, 0)->SetExplicitAlignment( layout->ItemAt(0, 0)->SetExplicitAlignment(
BAlignment(B_ALIGN_CENTER, B_ALIGN_TOP)); BAlignment(B_ALIGN_CENTER, B_ALIGN_TOP));
if (fFile) if (file != NULL)
fFile->GetModificationTime(&fLastModificationTime); file->GetModificationTime(&fLastModificationTime);
delete file;
} }
PersonView::~PersonView() PersonView::~PersonView()
{ {
delete fFile;
} }
@ -269,8 +269,7 @@ PersonView::BuildGroupMenu()
void void
PersonView::CreateFile(const entry_ref* ref) PersonView::CreateFile(const entry_ref* ref)
{ {
delete fFile; fRef = ref;
fFile = new BFile(ref, B_READ_WRITE);
Save(); Save();
} }
@ -293,13 +292,19 @@ PersonView::IsSaved() const
void void
PersonView::Save() PersonView::Save()
{ {
BFile* file = new(std::nothrow) BFile(fRef, B_READ_WRITE);
if (file == NULL || file->InitCheck() != B_NO_ERROR) {
delete file;
return;
}
fSaving = true; fSaving = true;
int32 count = fControls.CountItems(); int32 count = fControls.CountItems();
for (int32 i = 0; i < count; i++) { for (int32 i = 0; i < count; i++) {
AttributeTextControl* control = fControls.ItemAt(i); AttributeTextControl* control = fControls.ItemAt(i);
const char* value = control->Text(); const char* value = control->Text();
fFile->WriteAttr(control->Attribute().String(), B_STRING_TYPE, 0, file->WriteAttr(control->Attribute().String(), B_STRING_TYPE, 0,
value, strlen(value) + 1); value, strlen(value) + 1);
control->Update(); control->Update();
} }
@ -307,8 +312,8 @@ PersonView::Save()
// Write the picture, if any, in the person file content // Write the picture, if any, in the person file content
if (fPictureView) { if (fPictureView) {
// Trim any previous content // Trim any previous content
fFile->Seek(0, SEEK_SET); file->Seek(0, SEEK_SET);
fFile->SetSize(0); file->SetSize(0);
BBitmap* picture = fPictureView->Bitmap(); BBitmap* picture = fPictureView->Bitmap();
if (picture) { if (picture) {
@ -318,7 +323,7 @@ PersonView::Save()
stream.DetachBitmap(&picture); stream.DetachBitmap(&picture);
BTranslatorRoster* roster = BTranslatorRoster::Default(); BTranslatorRoster* roster = BTranslatorRoster::Default();
roster->Translate(&stream, NULL, NULL, fFile, roster->Translate(&stream, NULL, NULL, file,
fPictureView->SuggestedType(), B_TRANSLATOR_BITMAP, fPictureView->SuggestedType(), B_TRANSLATOR_BITMAP,
fPictureView->SuggestedMIMEType()); fPictureView->SuggestedMIMEType());
@ -327,9 +332,10 @@ PersonView::Save()
fPictureView->Update(); fPictureView->Update();
} }
fFile->GetModificationTime(&fLastModificationTime); file->GetModificationTime(&fLastModificationTime);
fSaving = false; fSaving = false;
delete file;
} }
@ -350,14 +356,20 @@ PersonView::SetAttribute(const char* attribute, bool update)
{ {
char* value = NULL; char* value = NULL;
attr_info info; attr_info info;
if (fFile != NULL && fFile->GetAttrInfo(attribute, &info) == B_OK) { BFile* file = NULL;
if (fRef != NULL)
file = new(std::nothrow) BFile(fRef, B_READ_ONLY);
if (file != NULL && file->GetAttrInfo(attribute, &info) == B_OK) {
value = (char*)calloc(info.size, 1); value = (char*)calloc(info.size, 1);
fFile->ReadAttr(attribute, B_STRING_TYPE, 0, value, info.size); file->ReadAttr(attribute, B_STRING_TYPE, 0, value, info.size);
} }
SetAttribute(attribute, value, update); SetAttribute(attribute, value, update);
free(value); free(value);
delete file;
} }

View File

@ -62,7 +62,7 @@ public:
bool IsTextSelected() const; bool IsTextSelected() const;
private: private:
BFile* fFile; const entry_ref* fRef;
time_t fLastModificationTime; time_t fLastModificationTime;
BPopUpMenu* fGroups; BPopUpMenu* fGroups;
typedef BObjectList<AttributeTextControl> AttributeList; typedef BObjectList<AttributeTextControl> AttributeList;