0032564: Foundation Classes, OSD_CachedFileSystem - allow referring to non-default...
[occt.git] / src / OSD / OSD_CachedFileSystem.cxx
1 // Copyright (c) 2021 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <OSD_CachedFileSystem.hxx>
15 #include <OSD_OpenFile.hxx>
16
17 IMPLEMENT_STANDARD_RTTIEXT(OSD_CachedFileSystem, OSD_FileSystem)
18
19 //=======================================================================
20 // function : OSD_CachedFileSystem
21 // purpose :
22 //=======================================================================
23 OSD_CachedFileSystem::OSD_CachedFileSystem (const Handle(OSD_FileSystem)& theLinkedFileSystem)
24 : myLinkedFS (!theLinkedFileSystem.IsNull() ? theLinkedFileSystem : OSD_FileSystem::DefaultFileSystem())
25 {
26   //
27 }
28
29 //=======================================================================
30 // function : IsSupportedPath
31 // purpose :
32 //=======================================================================
33 Standard_Boolean OSD_CachedFileSystem::IsSupportedPath (const TCollection_AsciiString& theUrl) const
34 {
35   return myLinkedFS->IsSupportedPath (theUrl);
36 }
37
38 //=======================================================================
39 // function : IsOpenIStream
40 // purpose :
41 //=======================================================================
42 Standard_Boolean OSD_CachedFileSystem::IsOpenIStream (const opencascade::std::shared_ptr<std::istream>& theStream) const
43 {
44   return myLinkedFS->IsOpenIStream (theStream);
45 }
46
47 //=======================================================================
48 // function : IsOpenOStream
49 // purpose :
50 //=======================================================================
51 Standard_Boolean OSD_CachedFileSystem::IsOpenOStream (const opencascade::std::shared_ptr<std::ostream>& theStream) const
52 {
53   return myLinkedFS->IsOpenOStream (theStream);
54 }
55
56 //=======================================================================
57 // function : OpenIStream
58 // purpose :
59 //=======================================================================
60 opencascade::std::shared_ptr<std::istream> OSD_CachedFileSystem::OpenIStream (const TCollection_AsciiString& theUrl,
61                                                                               const std::ios_base::openmode theParams,
62                                                                               const int64_t theOffset,
63                                                                               const opencascade::std::shared_ptr<std::istream>& /*theOldStream*/)
64 {
65   if (myStream.Url != theUrl)
66   {
67     myStream.Url = theUrl;
68     myStream.Reset();
69   }
70   myStream.Stream = myLinkedFS->OpenIStream (theUrl, theParams, theOffset, myStream.Stream);
71   return myStream.Stream;
72 }
73
74 //=======================================================================
75 // function : OpenOStream
76 // purpose :
77 //=======================================================================
78 opencascade::std::shared_ptr<std::ostream> OSD_CachedFileSystem::OpenOStream (const TCollection_AsciiString& theUrl,
79                                                                               const std::ios_base::openmode theMode)
80 {
81   return myLinkedFS->OpenOStream (theUrl, theMode);
82 }
83
84 //=======================================================================
85 // function : OpenStreamBuffer
86 // purpose :
87 //=======================================================================
88 opencascade::std::shared_ptr<std::streambuf> OSD_CachedFileSystem::OpenStreamBuffer (const TCollection_AsciiString& theUrl,
89                                                                                      const std::ios_base::openmode theMode,
90                                                                                      const int64_t theOffset,
91                                                                                      int64_t* theOutBufSize)
92 {
93   if ((theMode & std::ios::out) == std::ios::out)
94   {
95     return myLinkedFS->OpenStreamBuffer (theUrl, theMode, theOffset, theOutBufSize);
96   }
97   if (myStream.Url != theUrl)
98   {
99     myStream.Url = theUrl;
100     myStream.Reset();
101   }
102   myStream.StreamBuf = myLinkedFS->OpenStreamBuffer (theUrl, theMode, theOffset, theOutBufSize);
103   return myStream.StreamBuf;
104 }