1*469f13fdSPawel Dziepak /*
2*469f13fdSPawel Dziepak * Copyright 2013 Haiku, Inc. All rights reserved.
3*469f13fdSPawel Dziepak * Distributed under the terms of the MIT License.
4*469f13fdSPawel Dziepak *
5*469f13fdSPawel Dziepak * Authors:
6*469f13fdSPawel Dziepak * Paweł Dziepak, pdziepak@quarnos.org
7*469f13fdSPawel Dziepak */
8*469f13fdSPawel Dziepak
9*469f13fdSPawel Dziepak
10*469f13fdSPawel Dziepak #include "InodeIdMap.h"
11*469f13fdSPawel Dziepak
12*469f13fdSPawel Dziepak
13*469f13fdSPawel Dziepak status_t
AddName(FileInfo & fileInfo,InodeNames * parent,const char * name,ino_t id)14*469f13fdSPawel Dziepak InodeIdMap::AddName(FileInfo& fileInfo, InodeNames* parent,
15*469f13fdSPawel Dziepak const char* name, ino_t id)
16*469f13fdSPawel Dziepak {
17*469f13fdSPawel Dziepak MutexLocker _(fLock);
18*469f13fdSPawel Dziepak AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
19*469f13fdSPawel Dziepak if (iterator.HasCurrent()) {
20*469f13fdSPawel Dziepak if (fileInfo.fHandle == iterator.Current().fHandle) {
21*469f13fdSPawel Dziepak return iterator.CurrentValuePointer()->fNames->AddName(parent,
22*469f13fdSPawel Dziepak name);
23*469f13fdSPawel Dziepak }
24*469f13fdSPawel Dziepak }
25*469f13fdSPawel Dziepak
26*469f13fdSPawel Dziepak fMap.Remove(id);
27*469f13fdSPawel Dziepak fileInfo.fNames = new InodeNames;
28*469f13fdSPawel Dziepak if (fileInfo.fNames == NULL)
29*469f13fdSPawel Dziepak return B_NO_MEMORY;
30*469f13fdSPawel Dziepak
31*469f13fdSPawel Dziepak fileInfo.fNames->fHandle = fileInfo.fHandle;
32*469f13fdSPawel Dziepak status_t result = fileInfo.fNames->AddName(parent, name);
33*469f13fdSPawel Dziepak if (result != B_OK) {
34*469f13fdSPawel Dziepak delete fileInfo.fNames;
35*469f13fdSPawel Dziepak return result;
36*469f13fdSPawel Dziepak }
37*469f13fdSPawel Dziepak
38*469f13fdSPawel Dziepak return fMap.Insert(id, fileInfo);
39*469f13fdSPawel Dziepak }
40*469f13fdSPawel Dziepak
41*469f13fdSPawel Dziepak
42*469f13fdSPawel Dziepak bool
RemoveName(ino_t id,InodeNames * parent,const char * name)43*469f13fdSPawel Dziepak InodeIdMap::RemoveName(ino_t id, InodeNames* parent, const char* name)
44*469f13fdSPawel Dziepak {
45*469f13fdSPawel Dziepak ASSERT(name != NULL);
46*469f13fdSPawel Dziepak
47*469f13fdSPawel Dziepak MutexLocker _(fLock);
48*469f13fdSPawel Dziepak AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
49*469f13fdSPawel Dziepak if (!iterator.HasCurrent())
50*469f13fdSPawel Dziepak return true;
51*469f13fdSPawel Dziepak
52*469f13fdSPawel Dziepak FileInfo* fileInfo = iterator.CurrentValuePointer();
53*469f13fdSPawel Dziepak
54*469f13fdSPawel Dziepak return fileInfo->fNames->RemoveName(parent, name);
55*469f13fdSPawel Dziepak }
56*469f13fdSPawel Dziepak
57*469f13fdSPawel Dziepak
58*469f13fdSPawel Dziepak status_t
RemoveEntry(ino_t id)59*469f13fdSPawel Dziepak InodeIdMap::RemoveEntry(ino_t id)
60*469f13fdSPawel Dziepak {
61*469f13fdSPawel Dziepak MutexLocker _(fLock);
62*469f13fdSPawel Dziepak return fMap.Remove(id);
63*469f13fdSPawel Dziepak }
64*469f13fdSPawel Dziepak
65*469f13fdSPawel Dziepak
66*469f13fdSPawel Dziepak status_t
GetFileInfo(FileInfo * fileInfo,ino_t id)67*469f13fdSPawel Dziepak InodeIdMap::GetFileInfo(FileInfo* fileInfo, ino_t id)
68*469f13fdSPawel Dziepak {
69*469f13fdSPawel Dziepak ASSERT(fileInfo != NULL);
70*469f13fdSPawel Dziepak
71*469f13fdSPawel Dziepak MutexLocker _(fLock);
72*469f13fdSPawel Dziepak AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
73*469f13fdSPawel Dziepak if (!iterator.HasCurrent())
74*469f13fdSPawel Dziepak return B_ENTRY_NOT_FOUND;
75*469f13fdSPawel Dziepak
76*469f13fdSPawel Dziepak *fileInfo = iterator.Current();
77*469f13fdSPawel Dziepak if (fileInfo->fNames->fNames.IsEmpty())
78*469f13fdSPawel Dziepak return B_ENTRY_NOT_FOUND;
79*469f13fdSPawel Dziepak return B_OK;
80*469f13fdSPawel Dziepak }
81*469f13fdSPawel Dziepak
82