file_bookmark_mac.mm 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "platform/mac/file_bookmark_mac.h"
  8. #include "base/platform/mac/base_utilities_mac.h"
  9. #include "logs.h"
  10. #include <QtCore/QMutex>
  11. #include <Cocoa/Cocoa.h>
  12. #include <CoreFoundation/CFURL.h>
  13. namespace Platform {
  14. namespace {
  15. #ifdef OS_MAC_STORE
  16. QMutex BookmarksMutex;
  17. #endif // OS_MAC_STORE
  18. } // namespace
  19. #ifdef OS_MAC_STORE
  20. struct FileBookmark::Data {
  21. ~Data() {
  22. if (url) [url release];
  23. }
  24. NSURL *url = nil;
  25. QString name;
  26. QByteArray bookmark;
  27. int counter = 0;
  28. };
  29. #endif // OS_MAC_STORE
  30. FileBookmark::FileBookmark(const QByteArray &bookmark) {
  31. #ifdef OS_MAC_STORE
  32. if (bookmark.isEmpty()) return;
  33. BOOL isStale = NO;
  34. NSError *error = nil;
  35. NSURL *url = [NSURL URLByResolvingBookmarkData:bookmark.toNSData() options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:&isStale error:&error];
  36. if (!url) return;
  37. if ([url startAccessingSecurityScopedResource]) {
  38. data = new Data();
  39. data->url = [url retain];
  40. data->name = NS2QString([url path]);
  41. data->bookmark = bookmark;
  42. [url stopAccessingSecurityScopedResource];
  43. }
  44. #endif // OS_MAC_STORE
  45. }
  46. bool FileBookmark::check() const {
  47. if (enable()) {
  48. disable();
  49. return true;
  50. }
  51. return false;
  52. }
  53. bool FileBookmark::enable() const {
  54. #ifndef OS_MAC_STORE
  55. return true;
  56. #else // OS_MAC_STORE
  57. if (!data) return false;
  58. QMutexLocker lock(&BookmarksMutex);
  59. if (data->counter > 0 || [data->url startAccessingSecurityScopedResource] == YES) {
  60. ++data->counter;
  61. return true;
  62. }
  63. return false;
  64. #endif // OS_MAC_STORE
  65. }
  66. void FileBookmark::disable() const {
  67. #ifdef OS_MAC_STORE
  68. if (!data) return;
  69. QMutexLocker lock(&BookmarksMutex);
  70. if (data->counter > 0) {
  71. --data->counter;
  72. if (!data->counter) {
  73. [data->url stopAccessingSecurityScopedResource];
  74. }
  75. }
  76. #endif // OS_MAC_STORE
  77. }
  78. const QString &FileBookmark::name(const QString &original) const {
  79. #ifndef OS_MAC_STORE
  80. return original;
  81. #else // OS_MAC_STORE
  82. return (data && !data->name.isEmpty()) ? data->name : original;
  83. #endif // OS_MAC_STORE
  84. }
  85. QByteArray FileBookmark::bookmark() const {
  86. #ifndef OS_MAC_STORE
  87. return QByteArray();
  88. #else // OS_MAC_STORE
  89. return data ? data->bookmark : QByteArray();
  90. #endif // OS_MAC_STORE
  91. }
  92. FileBookmark::~FileBookmark() {
  93. #ifdef OS_MAC_STORE
  94. if (data && data->counter > 0) {
  95. LOG(("Did not disable() bookmark, counter: %1").arg(data->counter));
  96. [data->url stopAccessingSecurityScopedResource];
  97. }
  98. #endif // OS_MAC_STORE
  99. }
  100. QByteArray PathBookmark(const QString &path) {
  101. #ifndef OS_MAC_STORE
  102. return QByteArray();
  103. #else // OS_MAC_STORE
  104. NSURL *url = [NSURL fileURLWithPath:[NSString stringWithUTF8String:path.toUtf8().constData()]];
  105. if (!url) return QByteArray();
  106. NSError *error = nil;
  107. NSData *data = [url bookmarkDataWithOptions:(NSURLBookmarkCreationWithSecurityScope | NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess) includingResourceValuesForKeys:nil relativeToURL:nil error:&error];
  108. return data ? QByteArray::fromNSData(data) : QByteArray();
  109. #endif // OS_MAC_STORE
  110. }
  111. } // namespace Platform