OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
411 | 411 |
412 protected: | 412 protected: |
413 virtual void DoClose(); | 413 virtual void DoClose(); |
414 | 414 |
415 FILE* file_; | 415 FILE* file_; |
416 | 416 |
417 private: | 417 private: |
418 DISALLOW_COPY_AND_ASSIGN(FileStream); | 418 DISALLOW_COPY_AND_ASSIGN(FileStream); |
419 }; | 419 }; |
420 | 420 |
421 // FileRotatingStream writes to a file in the directory specified in the | |
jiayl2
2015/07/20 23:27:06
I think the declaration and impl are big enough to
tkchin_webrtc
2015/07/21 20:39:13
Done.
| |
422 // constructor. It rotates the files once the current file is full. The | |
423 // individual file size and the number of files used is configurable in the | |
424 // constructor. Open must be called before using this stream. | |
425 class FileRotatingStream : public StreamInterface { | |
426 public: | |
427 // Use this constructor for reading a directory previously written to with | |
428 // this stream. | |
429 FileRotatingStream(const std::string& dir_path, | |
430 const std::string& file_prefix); | |
431 | |
432 // Use this constructor for writing to a directory. Files in the directory | |
433 // matching the prefix will be deleted on open. | |
434 FileRotatingStream(const std::string& dir_path, | |
435 const std::string& file_prefix, | |
436 size_t max_file_size, | |
437 size_t num_files); | |
438 | |
439 ~FileRotatingStream() override; | |
440 | |
441 // StreamInterface methods. | |
442 StreamState GetState() const override; | |
443 StreamResult Read(void* buffer, | |
444 size_t buffer_len, | |
445 size_t* read, | |
446 int* error) override; | |
447 StreamResult Write(const void* data, | |
448 size_t data_len, | |
449 size_t* written, | |
450 int* error) override; | |
451 bool Flush() override; | |
452 void Close() override; | |
453 | |
454 // Opens the appropriate file(s). Call this before using the stream. | |
455 bool Open(); | |
456 | |
457 // Disabling buffering causes writes to block until disk is updated. This is | |
458 // enabled by default for performance. | |
459 bool DisableBuffering(); | |
460 | |
461 // Returns the path used for the file at the i-th index. The file may or may | |
462 // not exist, this is just used for formatting. Index must be less than | |
463 // GetNumFiles(). | |
464 std::string GetFilePath(size_t index) const; | |
465 | |
466 // Returns the number of files that will used by this stream. | |
467 size_t GetNumFiles() { return file_names_.size(); } | |
468 | |
469 protected: | |
470 size_t GetMaxFileSize() const { return max_file_size_; } | |
471 | |
472 void SetMaxFileSize(size_t size) { max_file_size_ = size; } | |
473 | |
474 size_t GetLastFileIndex() const { return last_file_index_; } | |
475 | |
476 void SetLastFileIndex(size_t index) { last_file_index_ = index; } | |
477 | |
478 virtual void OnRotation() {} | |
479 | |
480 private: | |
481 enum Mode { kRead, kWrite }; | |
482 | |
483 FileRotatingStream(const std::string& dir_path, | |
484 const std::string& file_prefix, | |
485 size_t max_file_size, | |
486 size_t num_files, | |
487 Mode mode); | |
488 | |
489 // Opens the file at the current file index. Set |delete_existing| to true | |
490 // to also delete files that begin with the prefix. | |
491 bool Open(bool delete_existing); | |
492 | |
493 // Rotates the files by creating a new current file, renaming the | |
494 // existing files, and deleting the oldest one. e.g. | |
495 // file_0 -> file_1 | |
496 // file_1 -> file_2 | |
497 // file_2 -> delete | |
498 // create new file_0 | |
499 void RotateFiles(); | |
500 | |
501 // Returns a list of file names in the directory beginning with the prefix. | |
502 std::vector<std::string> GetFilesWithPrefix() const; | |
503 // Private version of GetFilePath. | |
504 std::string GetFilePath(size_t index, size_t num_files) const; | |
505 | |
506 const std::string dir_path_; | |
507 const std::string file_prefix_; | |
508 const Mode mode_; | |
509 | |
510 // FileStream is used to write to the current file. | |
511 scoped_ptr<FileStream> file_stream_; | |
512 // Convenience storage for file names so we don't generate them over and over. | |
513 std::vector<std::string> file_names_; | |
514 size_t max_file_size_; | |
515 size_t current_file_index_; | |
516 // The last file index indicates the index of the file that will be deleted | |
517 // first on rotation. | |
518 size_t last_file_index_; | |
519 // Number of bytes written to current file. We need this because with | |
520 // buffering the file size read from disk might not be accurate. | |
521 size_t current_bytes_written_; | |
522 bool disable_buffering_; | |
523 | |
524 DISALLOW_COPY_AND_ASSIGN(FileRotatingStream); | |
525 }; | |
526 | |
527 // MobileDeviceLogStream is meant to be used on mobile devices where we will | |
528 // have limited disk space. Its purpose is to read and write logs up to a | |
529 // maximum size. Once the maximum size is exceeded, logs from the middle are | |
530 // deleted whereas logs from the beginning and end are preserved. The reason for | |
531 // this is because we anticipate that in WebRTC the beginning and end of the | |
532 // logs are most useful for call diagnostics. | |
533 // | |
534 // This implementation simply writes to a single file until | |
535 // |max_total_log_size| / 2 bytes are written to it, and subsequently writes to | |
536 // a set of rotating files. We do this by inheriting FileRotatingStream and | |
537 // setting the appropriate internal variables so that we don't delete the last | |
538 // (earliest) file on rotate, and that that file's size is bigger. | |
539 // | |
540 // Open() must be called before using this stream. | |
541 class MobileDeviceLogStream : public FileRotatingStream { | |
jiayl2
2015/07/20 23:27:06
nit: this is useful not only for mobile devices, b
tkchin_webrtc
2015/07/21 20:39:13
Done.
| |
542 public: | |
543 // Use this constructor for reading a directory previously written to with | |
544 // this stream. | |
545 MobileDeviceLogStream(const std::string& dir_path); | |
546 // Use this constructor for writing to a directory. Files in the directory | |
547 // matching what's used by the stream will be deleted. | |
548 MobileDeviceLogStream(const std::string& dir_path, size_t max_total_log_size); | |
549 ~MobileDeviceLogStream() override {} | |
550 | |
551 protected: | |
552 void OnRotation() override; | |
553 | |
554 private: | |
555 static size_t GetRotatingLogSize(size_t max_total_log_size); | |
556 static size_t GetNumRotatingLogFiles(size_t max_total_log_size); | |
557 static const char* kLogPrefix; | |
558 static const size_t kRotatingLogFileDefaultSize; | |
559 | |
560 const size_t max_total_log_size_; | |
561 size_t num_rotations_; | |
562 | |
563 DISALLOW_COPY_AND_ASSIGN(MobileDeviceLogStream); | |
564 }; | |
565 | |
421 // A stream that caps the output at a certain size, dropping content from the | 566 // A stream that caps the output at a certain size, dropping content from the |
422 // middle of the logical stream and maintaining equal parts of the start/end of | 567 // middle of the logical stream and maintaining equal parts of the start/end of |
423 // the logical stream. | 568 // the logical stream. |
424 class CircularFileStream : public FileStream { | 569 class CircularFileStream : public FileStream { |
425 public: | 570 public: |
426 explicit CircularFileStream(size_t max_size); | 571 explicit CircularFileStream(size_t max_size); |
427 | 572 |
428 bool Open(const std::string& filename, const char* mode, int* error) override; | 573 bool Open(const std::string& filename, const char* mode, int* error) override; |
429 StreamResult Read(void* buffer, | 574 StreamResult Read(void* buffer, |
430 size_t buffer_len, | 575 size_t buffer_len, |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
727 // as a pass in parameter, it indicates data in buffer that should move to sink | 872 // as a pass in parameter, it indicates data in buffer that should move to sink |
728 StreamResult Flow(StreamInterface* source, | 873 StreamResult Flow(StreamInterface* source, |
729 char* buffer, size_t buffer_len, | 874 char* buffer, size_t buffer_len, |
730 StreamInterface* sink, size_t* data_len = NULL); | 875 StreamInterface* sink, size_t* data_len = NULL); |
731 | 876 |
732 /////////////////////////////////////////////////////////////////////////////// | 877 /////////////////////////////////////////////////////////////////////////////// |
733 | 878 |
734 } // namespace rtc | 879 } // namespace rtc |
735 | 880 |
736 #endif // WEBRTC_BASE_STREAM_H_ | 881 #endif // WEBRTC_BASE_STREAM_H_ |
OLD | NEW |