1/* 2 * Copyright 2007-2009, Haiku, Inc. 3 * Distributed under the terms of the MIT license. 4 * 5 * Author: 6 * ��ukasz 'Sil2100' Zemczak <sil2100@vexillium.org> 7 */ 8#ifndef PACKAGE_ITEM_H 9#define PACKAGE_ITEM_H 10 11 12#include <stdio.h> 13 14#include <Directory.h> 15#include <Entry.h> 16#include <File.h> 17#include <Path.h> 18#include <String.h> 19 20 21// Local macro for the parser debug output 22//#define DEBUG_PARSER 23#ifdef DEBUG_PARSER 24# define parser_debug(format, args...) fprintf(stderr, format, ##args) 25#else 26# define parser_debug(format, args...) 27#endif 28 29 30enum { 31 P_INSTALL_PATH = 0, 32 P_SYSTEM_PATH, 33 P_USER_PATH 34}; 35 36// Existing item overwriting policy of a single file 37enum { 38 P_EXISTS_ASK = 0, 39 P_EXISTS_OVERWRITE, 40 P_EXISTS_SKIP, 41 P_EXISTS_ABORT, 42 P_EXISTS_NONE 43}; 44 45const uint32 P_NO_KIND = 0; 46const uint32 P_KIND_SCRIPT = 1; 47const uint32 P_KIND_FILE = 2; 48const uint32 P_KIND_DIRECTORY = 3; 49const uint32 P_KIND_SYM_LINK = 4; 50 51extern status_t inflate_data(uint8* in, uint32 inSize, uint8* out, 52 uint32 outSize); 53 54 55struct ItemState { 56 ItemState(uint8 _policy) 57 : 58 policy(_policy), 59 status(B_NO_INIT) 60 { 61 } 62 63 ~ItemState() 64 { 65 } 66 67 BPath destination; 68 BDirectory parent; 69 uint8 policy; 70 status_t status; 71}; 72 73 74class PackageItem { 75public: 76 PackageItem(BFile* parent, const BString& path, 77 uint8 type, uint32 ctime, uint32 mtime, 78 uint64 offset = 0, uint64 size = 0); 79 virtual ~PackageItem(); 80 81 virtual status_t DoInstall(const char* path = NULL, 82 ItemState *state = NULL) = 0; 83 virtual void SetTo(BFile* parent, const BString& path, 84 uint8 type, uint32 ctime, uint32 mtime, 85 uint64 offset = 0, uint64 size = 0); 86 virtual const uint32 ItemKind() {return P_NO_KIND;}; 87 88protected: 89 status_t InitPath(const char* path, BPath* destination); 90 status_t HandleAttributes(BPath* destination, BNode* node, 91 const char* header); 92 93 status_t ParseAttribute(uint8* buffer, BNode* node, 94 char** attrName, uint32* nameSize, 95 uint32* attrType, uint8** attrData, 96 uint64* dataSize, uint8** temp, 97 uint64* tempSize, uint64* attrCSize, 98 uint64* attrOSize, bool* attrStarted, 99 bool* done); 100 status_t SkipAttribute(uint8* buffer, bool* attrStarted, 101 bool* done); 102 status_t ParseData(uint8* buffer, BFile* file, 103 uint64 originalSize, bool* done); 104 105protected: 106 BString fPath; 107 uint64 fOffset; 108 uint64 fSize; 109 uint8 fPathType; 110 uint32 fCreationTime; 111 uint32 fModificationTime; 112 113 BFile* fPackage; 114}; 115 116 117class PackageDirectory : public PackageItem { 118public: 119 PackageDirectory(BFile* parent, const BString& path, 120 uint8 type, uint32 ctime, uint32 mtime, 121 uint64 offset = 0, uint64 size = 0); 122 123 virtual status_t DoInstall(const char* path = NULL, 124 ItemState* state = NULL); 125 virtual const uint32 ItemKind(); 126}; 127 128 129class PackageScript : public PackageItem { 130public: 131 PackageScript(BFile* parent, const BString& path, 132 uint8 type, uint64 offset = 0, uint64 size = 0, 133 uint64 originalSize = 0); 134 135 virtual status_t DoInstall(const char* path = NULL, 136 ItemState *state = NULL); 137 virtual const uint32 ItemKind(); 138 139 thread_id GetThreadId() { return fThreadId; } 140 void SetThreadId(thread_id id) { fThreadId = id; } 141 142private: 143 status_t _ParseScript(uint8* buffer, uint64 originalSize, 144 BString& script, bool* done); 145 status_t _RunScript(const char* workingDirectory, 146 const BString& script); 147 148private: 149 uint64 fOriginalSize; 150 thread_id fThreadId; 151}; 152 153 154class PackageFile : public PackageItem { 155public: 156 PackageFile(BFile* parent, const BString& path, 157 uint8 type, uint32 ctime, uint32 mtime, 158 uint64 offset, uint64 size, uint64 originalSize, 159 uint32 platform, const BString& mime, 160 const BString& signature, uint32 mode); 161 162 virtual status_t DoInstall(const char* path = NULL, 163 ItemState* state = NULL); 164 virtual const uint32 ItemKind(); 165 166private: 167 uint64 fOriginalSize; 168 uint32 fPlatform; 169 uint32 fMode; 170 171 BString fMimeType; 172 BString fSignature; 173}; 174 175 176class PackageLink : public PackageItem { 177public: 178 PackageLink(BFile* parent, const BString& path, 179 const BString& link, uint8 type, uint32 ctime, 180 uint32 mtime, uint32 mode, uint64 offset = 0, 181 uint64 size = 0); 182 183 virtual status_t DoInstall(const char* path = NULL, 184 ItemState *state = NULL); 185 virtual const uint32 ItemKind(); 186 187private: 188 uint32 fMode; 189 BString fLink; 190}; 191 192#endif // PACKAGE_ITEM_H 193