1/* 2 * Copyright 2007, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Axel D��rfler, axeld@pinc-software.de 7 */ 8 9 10#include <Directory.h> 11#include <Entry.h> 12#include <File.h> 13#include <Looper.h> 14#include <Path.h> 15#include <PathMonitor.h> 16 17#include <stdio.h> 18#include <string.h> 19 20using BPrivate::BPathMonitor; 21 22 23class Looper : public BLooper { 24 public: 25 Looper(const char* path); 26 virtual ~Looper(); 27 28 virtual void MessageReceived(BMessage* message); 29 30 private: 31 BPath fPath; 32}; 33 34 35Looper::Looper(const char* path) 36 : BLooper("path monitor test"), 37 fPath(path) 38{ 39 status_t status = BPathMonitor::StartWatching(path, B_WATCH_ALL, this); 40 if (status != B_OK) { 41 fprintf(stderr, "Could not watch path \"%s\": %s.\n", path, strerror(status)); 42 PostMessage(B_QUIT_REQUESTED); 43 } 44} 45 46 47Looper::~Looper() 48{ 49 status_t status = BPathMonitor::StopWatching(fPath.Path(), this); 50 if (status != B_OK) 51 fprintf(stderr, "Could not stop watching: %s\n", strerror(status)); 52} 53 54 55void 56Looper::MessageReceived(BMessage* message) 57{ 58 if (message->what == B_PATH_MONITOR) 59 message->PrintToStream(); 60} 61 62 63// #pragma mark - 64 65 66void 67create_file(const char* path) 68{ 69 printf("******* create file %s *******\n", path); 70 BFile file; 71 status_t status = file.SetTo(path, B_CREATE_FILE | B_READ_WRITE); 72 if (status != B_OK) 73 fprintf(stderr, "could not create watch test.\n"); 74 file.Write("test", 4); 75} 76 77 78void 79remove_file(const char* path) 80{ 81 printf("******* remove file %s *******\n", path); 82 remove(path); 83} 84 85 86void 87create_directory(const char* path) 88{ 89 printf("******* create directory %s *******\n", path); 90 create_directory(path, 0755); 91} 92 93 94void 95remove_directory(const char* path) 96{ 97 printf("******* remove directory %s *******\n", path); 98 rmdir(path); 99} 100 101 102// #pragma mark - 103 104 105void 106test_a() 107{ 108 puts("******************* test A ********************"); 109 110 create_directory("/tmp/a"); 111 create_directory("/tmp/ab"); 112 create_directory("/tmp/a/b"); 113 create_directory("/tmp/a/bc"); 114 create_directory("/tmp/a/b/c"); 115 create_directory("/tmp/a/b/cd"); 116 117 create_file("/tmp/a/b/c/d"); 118 snooze(100000); 119 remove_file("/tmp/a/b/c/d"); 120 121 remove_directory("/tmp/a/b/cd"); 122 remove_directory("/tmp/a/bc"); 123 remove_directory("/tmp/ab"); 124 125 snooze(100000); 126} 127 128 129void 130test_b() 131{ 132 puts("******************* test B ********************"); 133 remove_directory("/tmp/a/b/c"); 134 snooze(100000); 135 create_file("/tmp/a/b/c"); 136 snooze(100000); 137 remove_file("/tmp/a/b/c"); 138} 139 140 141void 142test_c() 143{ 144 puts("******************* test C ********************"); 145 create_directory("/tmp/a/b/c"); 146 create_directory("/tmp/a/b/c/d"); 147 snooze(100000); 148 remove_directory("/tmp/a/b/c/d"); 149 remove_directory("/tmp/a/b/c"); 150} 151 152 153void 154test_d() 155{ 156 puts("******************* test D ********************"); 157 remove_directory("/tmp/a/b"); 158 remove_directory("/tmp/a"); 159} 160 161 162int 163main() 164{ 165 // start looper 166 Looper& looper = *new Looper("/tmp/a/b/c"); 167 looper.Run(); 168 169 // run tests 170 test_a(); 171 test_b(); 172 test_c(); 173 test_d(); 174 175#if 0 176 char b[2100]; 177 gets(b); 178#endif 179 180 snooze(500000LL); 181 182 // quit looper 183 looper.PostMessage(B_QUIT_REQUESTED); 184 status_t status; 185 wait_for_thread(looper.Thread(), &status); 186 187 return 0; 188} 189