OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
C4Reloc.cpp
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 2011-2016, The OpenClonk Team and contributors
5  *
6  * Distributed under the terms of the ISC license; see accompanying file
7  * "COPYING" for details.
8  *
9  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
10  * See accompanying file "TRADEMARK" for details.
11  *
12  * To redistribute this file separately, substitute the full license texts
13  * for the above references.
14  */
15 
16 #include "C4Include.h"
17 #include "config/C4Reloc.h"
18 
19 #include "config/C4Config.h"
20 #include "game/C4Application.h"
21 
22 C4Reloc Reloc; // singleton
23 
25 {
26  Paths.clear();
27 
28  // The system folder (i.e. installation path) has higher priority than the user path
29  // Although this is counter-intuitive (the user may want to overload system files in the user path),
30  // people had trouble when they downloaded e.g. an Objects.ocd file in a network lobby and that copy permanently
31  // ruined their OpenClonk installation with no obvious way to fix it.
32  // Not even reinstalling would fix the problem because reinstallation does not overwrite user data.
33  // We currently don't have any valid case where overloading system files would make sense so just give higher priority to the system path for now.
34 #ifndef __APPLE__
35  // Add planet subfolder with highest priority because it's used when starting directly from the repository with binaries in the root folder
37  planet.AppendBackslash();
38  planet.Append("planet");
39  AddPath(planet.getData());
40 #endif
41  // Add main system path
43  // Add user path for additional data (player files, user scenarios, etc.)
45 }
46 
47 bool C4Reloc::AddPath(const char* path, PathType pathType)
48 {
49  if(!IsGlobalPath(path))
50  return false;
51 
52  if(std::find(Paths.begin(), Paths.end(), path) != Paths.end())
53  return false;
54 
55  Paths.push_back(PathInfo(StdCopyStrBuf(path), pathType));
56  return true;
57 }
58 
60 {
61  return Paths.begin();
62 }
63 
65 {
66  return Paths.end();
67 }
68 
69 bool C4Reloc::Open(C4Group& hGroup, const char* filename) const
70 {
71  if(IsGlobalPath(filename)) return hGroup.Open(filename);
72 
73  for(iterator iter = begin(); iter != end(); ++iter)
74  if(hGroup.Open(((*iter).strBuf + DirSep + filename).getData()))
75  return true;
76 
77  return false;
78 }
79 
80 bool C4Reloc::LocateItem(const char* filename, StdStrBuf& str) const
81 {
82  if(IsGlobalPath(filename))
83  {
84  str.Copy(filename);
85  return true;
86  }
87 
88  for(iterator iter = begin(); iter != end(); ++iter)
89  {
90  str.Copy((*iter).strBuf + DirSep + filename);
91  if(ItemExists(str.getData()))
92  return true;
93  }
94 
95  return false;
96 }
const char * getData() const
Definition: StdBuf.h:450
C4Config Config
Definition: C4Config.cpp:837
bool IsGlobalPath(const char *szPath)
Definition: StdFile.cpp:237
C4ConfigGeneral General
Definition: C4Config.h:252
PathList::const_iterator iterator
Definition: C4Reloc.h:38
void AppendBackslash()
Definition: StdBuf.cpp:255
char UserDataPath[CFG_MaxString+1]
Definition: C4Config.h:55
bool Open(const char *szGroupName, bool fCreate=false)
Definition: C4Group.cpp:514
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:527
char SystemDataPath[CFG_MaxString+1]
Definition: C4Config.h:56
bool Open(C4Group &hGroup, const char *filename) const
Definition: C4Reloc.cpp:69
iterator begin() const
Definition: C4Reloc.cpp:59
C4Reloc Reloc
Definition: C4Reloc.cpp:22
void Init()
Definition: C4Reloc.cpp:24
bool AddPath(const char *path, PathType pathType=PATH_Regular)
Definition: C4Reloc.cpp:47
iterator end() const
Definition: C4Reloc.cpp:64
StdCopyStrBuf ExePath
Definition: C4Config.h:53
#define DirSep
bool ItemExists(const char *szItemName)
Definition: StdFile.h:75
void Copy()
Definition: StdBuf.h:475
PathType
Definition: C4Reloc.h:24
bool LocateItem(const char *filename, StdStrBuf &str) const
Definition: C4Reloc.cpp:80