People: open files in READ_WRITE mode only when necessary. (#5791)
This commit is contained in:
parent
b1975a590f
commit
a09c983cc6
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue