CCCoreData.m 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543
  1. //
  2. // CCCoreData.m
  3. // Crypto Cloud Technology Nextcloud
  4. //
  5. // Created by Marino Faggiana on 02/02/16.
  6. // Copyright (c) 2017 TWS. All rights reserved.
  7. //
  8. // Author Marino Faggiana <m.faggiana@twsweb.it>
  9. //
  10. // This program is free software: you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation, either version 3 of the License, or
  13. // (at your option) any later version.
  14. //
  15. // This program is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. // GNU General Public License for more details.
  19. //
  20. // You should have received a copy of the GNU General Public License
  21. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. //
  23. #import "CCCoreData.h"
  24. #import "CCNetworking.h"
  25. #import "NCBridgeSwift.h"
  26. @implementation CCCoreData
  27. #pragma --------------------------------------------------------------------------------------------
  28. #pragma mark ===== Account =====
  29. #pragma --------------------------------------------------------------------------------------------
  30. + (NSArray *)getAllAccount
  31. {
  32. NSMutableArray *accounts = [NSMutableArray new];
  33. NSArray *records;
  34. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  35. records = [TableAccount MR_findAllInContext:context];
  36. for (TableAccount *tableAccount in records)
  37. [accounts addObject:tableAccount];
  38. return accounts;
  39. }
  40. #pragma --------------------------------------------------------------------------------------------
  41. #pragma mark ===== Metadata =====
  42. #pragma --------------------------------------------------------------------------------------------
  43. + (void)addMetadata:(tableMetadata *)metadata activeAccount:(NSString *)activeAccount activeUrl:(NSString *)activeUrl context:(NSManagedObjectContext *)context
  44. {
  45. if (context == nil)
  46. context = [NSManagedObjectContext MR_context];
  47. // remove all fileID (BUG 2.10)
  48. [TableMetadata MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (fileID == %@)", activeAccount, metadata.fileID] inContext:context];
  49. [context MR_saveToPersistentStoreAndWait];
  50. // remove record if exists
  51. [TableMetadata MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (fileName == %@) AND (directoryID == %@)", activeAccount, metadata.fileName, metadata.directoryID] inContext:context];
  52. [context MR_saveToPersistentStoreAndWait];
  53. // create new record Metadata
  54. TableMetadata *record = [TableMetadata MR_createEntityInContext:context];
  55. // set default value
  56. metadata.sessionTaskIdentifier = k_taskIdentifierDone;
  57. metadata.sessionTaskIdentifierPlist = k_taskIdentifierDone;
  58. // Insert metdata -> entity
  59. [self insertMetadataInEntity:metadata recordMetadata:record activeAccount:activeAccount activeUrl:activeUrl];
  60. // Aggiorniamo la data nella directory (ottimizzazione v 2.10)
  61. [self setDateReadDirectoryID:metadata.directoryID activeAccount:activeAccount];
  62. [context MR_saveToPersistentStoreAndWait];
  63. }
  64. + (void)deleteMetadataWithPredicate:(NSPredicate *)predicate
  65. {
  66. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  67. NSString *directoryID;
  68. NSArray *records = [TableMetadata MR_findAllWithPredicate:predicate inContext:localContext];
  69. for(TableMetadata *record in records) {
  70. // Aggiorniamo la data nella directory (ottimizzazione v 2.10)
  71. if ([directoryID isEqualToString:record.directoryID] == NO)
  72. [self setDateReadDirectoryID:record.directoryID activeAccount:record.account];
  73. directoryID = record.directoryID;
  74. [record MR_deleteEntityInContext:localContext];
  75. }
  76. }];
  77. }
  78. + (void)moveMetadata:(NSString *)fileName directoryID:(NSString *)directoryID directoryIDTo:(NSString *)directoryIDTo activeAccount:(NSString *)activeAccount
  79. {
  80. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  81. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (fileName == %@) AND (directoryID == %@)", activeAccount, fileName, directoryID];
  82. TableMetadata *record = [TableMetadata MR_findFirstWithPredicate:predicate inContext:localContext];
  83. if (record) {
  84. record.directoryID = directoryIDTo;
  85. // Aggiorniamo la data nella directory (ottimizzazione v 2.10)
  86. [self setDateReadDirectoryID:directoryID activeAccount:activeAccount];
  87. [self setDateReadDirectoryID:directoryIDTo activeAccount:activeAccount];
  88. }
  89. }];
  90. }
  91. + (void)updateMetadata:(tableMetadata *)metadata predicate:(NSPredicate *)predicate activeAccount:(NSString *)activeAccount activeUrl:(NSString *)activeUrl context:(NSManagedObjectContext *)context
  92. {
  93. TableMetadata *record;
  94. if (context == nil)
  95. context = [NSManagedObjectContext MR_defaultContext];
  96. record = [TableMetadata MR_findFirstWithPredicate:predicate inContext:context];
  97. if (record) {
  98. [self insertMetadataInEntity:metadata recordMetadata:record activeAccount:activeAccount activeUrl:activeUrl];
  99. // Aggiorniamo la data nella directory (ottimizzazione v 2.10)
  100. [self setDateReadDirectoryID:metadata.directoryID activeAccount:activeAccount];
  101. [context MR_saveToPersistentStoreAndWait];
  102. }
  103. }
  104. + (void)setMetadataSession:(NSString *)session sessionError:(NSString *)sessionError sessionSelector:(NSString *)sessionSelector sessionSelectorPost:(NSString *)sessionSelectorPost sessionTaskIdentifier:(NSInteger)sessionTaskIdentifier sessionTaskIdentifierPlist:(NSInteger)sessionTaskIdentifierPlist predicate:(NSPredicate *)predicate context:(NSManagedObjectContext *)context
  105. {
  106. if (context == nil)
  107. context = [NSManagedObjectContext MR_defaultContext];
  108. NSArray *records = [TableMetadata MR_findAllWithPredicate:predicate inContext:context];
  109. NSMutableSet *directoryIDs = [[NSMutableSet alloc] init];
  110. NSString *directoryID;
  111. for(TableMetadata *record in records) {
  112. if (session) record.session = session;
  113. if (sessionError) record.sessionError = sessionError;
  114. if (sessionSelector) record.sessionSelector = sessionSelector;
  115. if (sessionSelectorPost) record.sessionSelectorPost = sessionSelectorPost;
  116. if (sessionTaskIdentifier != k_taskIdentifierNULL) record.sessionTaskIdentifier = [NSNumber numberWithInteger:sessionTaskIdentifier];
  117. if (sessionTaskIdentifierPlist != k_taskIdentifierNULL) record.sessionTaskIdentifierPlist = [NSNumber numberWithInteger:sessionTaskIdentifierPlist];
  118. [directoryIDs addObject:record.directoryID];
  119. // Aggiorniamo la data nella directory (ottimizzazione v 2.10)
  120. if ([directoryID isEqualToString:record.directoryID] == NO)
  121. [self setDateReadDirectoryID:record.directoryID activeAccount:record.account];
  122. directoryID = record.directoryID;
  123. }
  124. [context MR_saveToPersistentStoreAndWait];
  125. }
  126. + (void)setMetadataFavoriteFileID:(NSString *)fileID favorite:(BOOL)favorite activeAccount:(NSString *)activeAccount context:(NSManagedObjectContext *)context
  127. {
  128. if (context == nil)
  129. context = [NSManagedObjectContext MR_defaultContext];
  130. TableMetadata *tableMetadata = [TableMetadata MR_findFirstWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (fileID == %@)", activeAccount, fileID] inContext:context];
  131. if (tableMetadata) {
  132. tableMetadata.favorite = [NSNumber numberWithBool:favorite];
  133. // Aggiorniamo la data nella directory (ottimizzazione v 2.10)
  134. [self setDateReadDirectoryID:tableMetadata.directoryID activeAccount:activeAccount];
  135. [context MR_saveToPersistentStoreAndWait];
  136. }
  137. }
  138. + (tableMetadata *)getMetadataWithPreficate:(NSPredicate *)predicate context:(NSManagedObjectContext *)context
  139. {
  140. if (context == nil)
  141. context = [NSManagedObjectContext MR_defaultContext];
  142. TableMetadata *record;
  143. record = [TableMetadata MR_findFirstWithPredicate:predicate inContext:context];
  144. if (record) {
  145. return [self insertEntityInMetadata:record];
  146. } else return nil;
  147. }
  148. + (TableMetadata *)getTableMetadataWithPreficate:(NSPredicate *)predicate
  149. {
  150. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  151. return [TableMetadata MR_findFirstWithPredicate:predicate inContext:context];
  152. }
  153. + (NSArray *)getTableMetadataWithPredicate:(NSPredicate *)predicate context:(NSManagedObjectContext *)context
  154. {
  155. if (context == nil)
  156. context = [NSManagedObjectContext MR_defaultContext];
  157. return [TableMetadata MR_findAllWithPredicate:predicate inContext:context];
  158. }
  159. + (NSArray *)getTableMetadataWithPredicate:(NSPredicate *)predicate fieldOrder:(NSString *)fieldOrder ascending:(BOOL)ascending
  160. {
  161. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  162. NSArray *records = [[NSArray alloc] init];
  163. NSSortDescriptor *descriptor;
  164. records = [TableMetadata MR_findAllWithPredicate:predicate inContext:context];
  165. if ([records count] == 0) return nil;
  166. if ([fieldOrder isEqualToString:@"fileName"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"fileNamePrint" ascending:ascending selector:@selector(localizedCaseInsensitiveCompare:)];
  167. else if ([fieldOrder isEqualToString:@"fileDate"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:ascending selector:nil];
  168. else if ([fieldOrder isEqualToString:@"sessionTaskIdentifier"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"sessionTaskIdentifier" ascending:ascending selector:nil];
  169. else descriptor = [[NSSortDescriptor alloc] initWithKey:fieldOrder ascending:ascending selector:@selector(localizedCaseInsensitiveCompare:)];
  170. return [records sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]];
  171. }
  172. + (tableMetadata *)getMetadataAtIndex:(NSPredicate *)predicate fieldOrder:(NSString *)fieldOrder ascending:(BOOL)ascending objectAtIndex:(NSUInteger)index
  173. {
  174. NSArray *records = [self getTableMetadataWithPredicate:predicate fieldOrder:fieldOrder ascending:ascending];
  175. TableMetadata *record = [records objectAtIndex:index];
  176. return [self insertEntityInMetadata:record];
  177. }
  178. + (tableMetadata *)getMetadataFromFileName:(NSString *)fileName directoryID:(NSString *)directoryID activeAccount:(NSString *)activeAccount context:(NSManagedObjectContext *)context
  179. {
  180. if (fileName == nil || directoryID == nil || activeAccount == nil)
  181. return nil;
  182. if (context == nil)
  183. context = [NSManagedObjectContext MR_defaultContext];
  184. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (directoryID == %@) AND ((fileName == %@) OR (fileNameData == %@))", activeAccount, directoryID, fileName, fileName];
  185. TableMetadata *record = [TableMetadata MR_findFirstWithPredicate:predicate inContext:context];
  186. if (record) return [self insertEntityInMetadata:record];
  187. else return nil;
  188. }
  189. + (NSArray *)getTableMetadataDownloadAccount:(NSString *)activeAccount
  190. {
  191. return [self getTableMetadataWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND ((session == %@) || (session == %@)) AND ((sessionTaskIdentifier != %i) OR (sessionTaskIdentifierPlist != %i))", activeAccount, k_download_session, k_download_session_foreground, k_taskIdentifierDone, k_taskIdentifierDone] context:nil];
  192. }
  193. + (NSArray *)getTableMetadataDownloadWWanAccount:(NSString *)activeAccount
  194. {
  195. return [self getTableMetadataWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (session == %@) AND ((sessionTaskIdentifier != %i) OR (sessionTaskIdentifierPlist != %i))", activeAccount, k_download_session_wwan, k_taskIdentifierDone, k_taskIdentifierDone] context:nil];
  196. }
  197. + (NSArray *)getTableMetadataUploadAccount:(NSString *)activeAccount
  198. {
  199. return [self getTableMetadataWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND ((session == %@) || (session == %@)) AND ((sessionTaskIdentifier != %i) OR (sessionTaskIdentifierPlist != %i))", activeAccount, k_upload_session, k_upload_session_foreground, k_taskIdentifierDone, k_taskIdentifierDone] context:nil];
  200. }
  201. + (NSArray *)getTableMetadataUploadWWanAccount:(NSString *)activeAccount
  202. {
  203. return [self getTableMetadataWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (session == %@) AND ((sessionTaskIdentifier != %i) OR (sessionTaskIdentifierPlist != %i))", activeAccount, k_upload_session_wwan, k_taskIdentifierDone, k_taskIdentifierDone] context:nil];
  204. }
  205. + (NSArray *)getRecordsTableMetadataPhotosCameraUpload:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  206. {
  207. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  208. NSMutableArray *recordsPhotosCameraUpload = [[NSMutableArray alloc] init];
  209. NSArray *tableDirectoryes = [self getDirectoryIDsFromBeginsWithServerUrl:serverUrl activeAccount:activeAccount];
  210. for (TableDirectory *record in tableDirectoryes) {
  211. NSArray *records = [TableMetadata MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (directoryID == %@) AND ((session == NULL) OR (session == '')) AND (type == 'file') AND ((typeFile == %@) OR (typeFile == %@))", activeAccount, record.directoryID, k_metadataTypeFile_image, k_metadataTypeFile_video] inContext:context];
  212. if ([records count] > 0)
  213. [recordsPhotosCameraUpload addObjectsFromArray:records];
  214. }
  215. // test
  216. if ([recordsPhotosCameraUpload count] == 0) return nil;
  217. // Order
  218. NSString *fieldOrder = [CCUtility getOrderSettings];
  219. BOOL ascending = [CCUtility getAscendingSettings];
  220. NSSortDescriptor *descriptor;
  221. if ([fieldOrder isEqualToString:@"fileName"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"fileNamePrint" ascending:ascending selector:@selector(localizedCaseInsensitiveCompare:)];
  222. else if ([fieldOrder isEqualToString:@"fileDate"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:ascending selector:nil];
  223. else if ([fieldOrder isEqualToString:@"sessionTaskIdentifier"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"sessionTaskIdentifier" ascending:ascending selector:nil];
  224. else descriptor = [[NSSortDescriptor alloc] initWithKey:fieldOrder ascending:ascending selector:@selector(localizedCaseInsensitiveCompare:)];
  225. return [recordsPhotosCameraUpload sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]];
  226. }
  227. + (void)removeOfflineAllFileFromServerUrl:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  228. {
  229. NSString *directoryID = [self getDirectoryIDFromServerUrl:serverUrl activeAccount:activeAccount];
  230. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  231. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (directoryID == %@)", activeAccount, directoryID];
  232. NSArray *records = [TableMetadata MR_findAllWithPredicate:predicate];
  233. for (TableMetadata *record in records)
  234. [self setOfflineLocalFileID:record.fileID offline:NO activeAccount:activeAccount];
  235. }];
  236. }
  237. #pragma --------------------------------------------------------------------------------------------
  238. #pragma mark ===== Directory =====
  239. #pragma --------------------------------------------------------------------------------------------
  240. + (NSString *)addDirectory:(NSString *)serverUrl permissions:(NSString *)permissions activeAccount:(NSString *)activeAccount
  241. {
  242. NSString *directoryID;
  243. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  244. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:[NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (account == %@)", serverUrl, activeAccount] inContext:context];
  245. if (record) {
  246. directoryID = record.directoryID;
  247. if (permissions) record.permissions = permissions;
  248. } else {
  249. TableDirectory *record = [TableDirectory MR_createEntityInContext:context];
  250. record.account = activeAccount;
  251. record.directoryID = [CCUtility createRandomString:16];
  252. directoryID = record.directoryID;
  253. if (permissions) record.permissions = permissions;
  254. record.serverUrl = serverUrl;
  255. }
  256. [context MR_saveToPersistentStoreAndWait];
  257. return directoryID;
  258. }
  259. + (void)updateDirectoryEtagServerUrl:(NSString *)serverUrl etag:(NSString *)etag activeAccount:(NSString *)activeAccount
  260. {
  261. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  262. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (account == %@)", serverUrl, activeAccount];
  263. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:localContext];
  264. if (record)
  265. record.rev = etag;
  266. }];
  267. }
  268. + (void)deleteDirectoryFromPredicate:(NSPredicate *)predicate
  269. {
  270. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  271. [TableDirectory MR_deleteAllMatchingPredicate:predicate inContext:localContext];
  272. }];
  273. }
  274. + (NSArray *)deleteDirectoryAndSubDirectory:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  275. {
  276. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  277. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@)", activeAccount];
  278. NSMutableArray *directoryIDs = [[NSMutableArray alloc] init];
  279. NSArray *tableDirectorys = [TableDirectory MR_findAllWithPredicate:predicate inContext:context];
  280. for(TableDirectory *recordDirectory in tableDirectorys) {
  281. NSLog(@"[LOG] %@", recordDirectory.serverUrl);
  282. if ([recordDirectory.serverUrl hasPrefix:serverUrl]) {
  283. // List directoryIDs removed
  284. [directoryIDs addObject:recordDirectory.directoryID];
  285. // remove all TableMetadata
  286. NSLog(@"[LOG] %@", recordDirectory.directoryID);
  287. // remove directory in Metadata come cazzo si fa a saperlo
  288. //[TableMetadata MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (directoryID == %@)", activeAccount, recordDirectory.directoryID] inContext:context];
  289. NSArray *tableMetadatas = [TableMetadata MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (directoryID == %@)", activeAccount, recordDirectory.directoryID] inContext:context];
  290. for(TableMetadata *recordMetadata in tableMetadatas) {
  291. // remove if in session
  292. if ([recordMetadata.session length] >0) {
  293. if (recordMetadata.sessionTaskIdentifier >= 0)
  294. [[CCNetworking sharedNetworking] settingSession:recordMetadata.session sessionTaskIdentifier:[recordMetadata.sessionTaskIdentifier integerValue] taskStatus: k_taskStatusCancel];
  295. if (recordMetadata.sessionTaskIdentifierPlist >= 0)
  296. [[CCNetworking sharedNetworking] settingSession:recordMetadata.session sessionTaskIdentifier:[recordMetadata.sessionTaskIdentifierPlist integerValue] taskStatus: k_taskStatusCancel];
  297. }
  298. // remove file local
  299. NSLog(@"[LOG] %@", recordMetadata.fileID);
  300. [self deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (fileID == %@)", activeAccount, recordMetadata.fileID]];
  301. [recordMetadata MR_deleteEntityInContext:context];
  302. }
  303. [recordDirectory MR_deleteEntityInContext:context];
  304. }
  305. }
  306. [context MR_saveToPersistentStoreAndWait];
  307. return directoryIDs;
  308. }
  309. + (void)renameDirectory:(NSString *)serverUrl serverUrlTo:(NSString *)serverUrlTo activeAccount:(NSString *)activeAccount
  310. {
  311. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  312. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (account == %@)", serverUrl, activeAccount];
  313. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:localContext];
  314. if (record)
  315. record.serverUrl = serverUrlTo;
  316. }];
  317. }
  318. + (void)setDateReadDirectoryID:(NSString *)directoryID activeAccount:(NSString *)activeAccount
  319. {
  320. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  321. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (account == %@)", directoryID, activeAccount];
  322. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:context];
  323. if (record) {
  324. record.dateReadDirectory = [NSDate date];
  325. [context MR_saveToPersistentStoreAndWait];
  326. }
  327. }
  328. + (TableDirectory *)getTableDirectoryWithPreficate:(NSPredicate *)predicate
  329. {
  330. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  331. return [TableDirectory MR_findFirstWithPredicate:predicate inContext:context];
  332. }
  333. + (NSDate *)getDateReadDirectoryID:(NSString *)directoryID activeAccount:(NSString *)activeAccount
  334. {
  335. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  336. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (account == %@)", directoryID, activeAccount];
  337. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:context];
  338. if (record) return record.dateReadDirectory;
  339. else return nil;
  340. }
  341. + (void)setDirectoryRev:(NSString *)rev serverUrl:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  342. {
  343. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  344. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (account == %@)", serverUrl, activeAccount];
  345. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:context];
  346. if (record) {
  347. record.rev = rev;
  348. [context MR_saveToPersistentStoreAndWait];
  349. }
  350. }
  351. + (NSString *)getDirectoryRevFromServerUrl:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  352. {
  353. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (account == %@)", serverUrl, activeAccount];
  354. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate];
  355. if (record) return record.rev;
  356. else return nil;
  357. }
  358. + (NSArray *)getDirectoryIDsFromBeginsWithServerUrl:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  359. {
  360. NSString *serverUrlBeginWith = serverUrl;
  361. if (![serverUrl hasSuffix:@"/"])
  362. serverUrlBeginWith = [serverUrl stringByAppendingString:@"/"];
  363. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"((serverUrl == %@) OR (serverUrl BEGINSWITH %@)) AND (account == %@)", serverUrl, serverUrlBeginWith, activeAccount];
  364. return [TableDirectory MR_findAllWithPredicate:predicate];
  365. }
  366. + (NSString *)getDirectoryIDFromServerUrl:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  367. {
  368. if (serverUrl == nil) return nil;
  369. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (account == %@)", serverUrl, activeAccount];
  370. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate];
  371. if (record) return record.directoryID;
  372. else {
  373. return [self addDirectory:serverUrl permissions:nil activeAccount:activeAccount];
  374. }
  375. return nil;
  376. }
  377. + (NSString *)getServerUrlFromDirectoryID:(NSString *)directoryID activeAccount:(NSString *)activeAccount
  378. {
  379. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (account == %@)", directoryID, activeAccount];
  380. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate];
  381. if (record) return record.serverUrl;
  382. else return nil;
  383. }
  384. + (void)clearDateReadAccount:(NSString *)activeAccount serverUrl:(NSString *)serverUrl directoryID:(NSString *)directoryID
  385. {
  386. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  387. NSPredicate *predicate;
  388. if ([serverUrl length] > 0)
  389. predicate = [NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (account == %@)", serverUrl, activeAccount];
  390. if ([directoryID length] > 0)
  391. predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (account == %@)", directoryID, activeAccount];
  392. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:localContext];
  393. if (record) {
  394. record.dateReadDirectory = NULL;
  395. record.rev = @"";
  396. }
  397. }];
  398. }
  399. + (void)clearAllDateReadDirectory
  400. {
  401. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  402. NSArray *records = [TableDirectory MR_findAllInContext:localContext];
  403. for (TableDirectory *record in records) {
  404. record.dateReadDirectory = NULL;
  405. record.rev = @"";
  406. }
  407. }];
  408. }
  409. + (BOOL)isDirectoryOutOfDate:(int)numAddDay directoryID:(NSString *)directoryID activeAccount:(NSString *)activeAccount
  410. {
  411. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (directoryID == %@)", activeAccount, directoryID];
  412. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate];
  413. if (record == nil || record.dateReadDirectory == nil) {
  414. return YES;
  415. }
  416. NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
  417. [dateComponents setWeekday:numAddDay];
  418. NSCalendar *calendar = [NSCalendar currentCalendar];
  419. NSDate *datePlus = [calendar dateByAddingComponents:dateComponents toDate:record.dateReadDirectory options:0];
  420. NSDate *now = [NSDate date];
  421. // usa la Cache se richiesto e se la data è entro X giorni dall'ultima volta che l'hai letta.
  422. if ([now compare:datePlus] == NSOrderedDescending) {
  423. return YES;
  424. }
  425. return NO;
  426. }
  427. #pragma --------------------------------------------------------------------------------------------
  428. #pragma mark ===== Offline Directory =====
  429. #pragma --------------------------------------------------------------------------------------------
  430. + (void)removeOfflineDirectoryID:(NSString *)directoryID activeAccount:(NSString *)activeAccount
  431. {
  432. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  433. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (account == %@) AND (offline == 1)", directoryID, activeAccount];
  434. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:localContext];
  435. if (record)
  436. record.offline = [NSNumber numberWithBool:FALSE];
  437. }];
  438. }
  439. + (NSArray *)getOfflineDirectoryActiveAccount:(NSString *)activeAccount
  440. {
  441. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (offline == 1)", activeAccount];
  442. NSArray *recordsTable = [TableDirectory MR_findAllWithPredicate:predicate];
  443. // Order by serverUrl
  444. NSArray *sortedRecordsTable = [recordsTable sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
  445. TableDirectory *record1 = obj1, *record2 = obj2;
  446. return [record1.serverUrl compare:record2.serverUrl];
  447. }];
  448. return sortedRecordsTable;
  449. }
  450. + (void)setOfflineDirectoryServerUrl:(NSString *)serverUrl offline:(BOOL)offline activeAccount:(NSString *)activeAccount
  451. {
  452. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  453. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (account == %@)", serverUrl, activeAccount];
  454. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:localContext];
  455. if (record)
  456. record.offline = [NSNumber numberWithBool:offline];
  457. }];
  458. }
  459. + (BOOL)isOfflineDirectoryServerUrl:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  460. {
  461. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(serverUrl == %@) AND (offline == 1) AND (account == %@)", serverUrl, activeAccount];
  462. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate];
  463. if (record) return YES;
  464. else return NO;
  465. }
  466. #pragma --------------------------------------------------------------------------------------------
  467. #pragma mark ===== Directory Lock =====
  468. #pragma --------------------------------------------------------------------------------------------
  469. + (BOOL)setDirectoryLock:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  470. {
  471. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  472. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (account == %@)", [self getDirectoryIDFromServerUrl:serverUrl activeAccount:activeAccount], activeAccount];
  473. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:context];
  474. if (record) {
  475. record.lock = [NSNumber numberWithBool:YES];
  476. [context MR_saveToPersistentStoreAndWait];
  477. return YES;
  478. }
  479. else return NO;
  480. }
  481. + (BOOL)setDirectoryUnLock:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  482. {
  483. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  484. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (account == %@)", [self getDirectoryIDFromServerUrl:serverUrl activeAccount:activeAccount], activeAccount];
  485. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate inContext:context];
  486. if (record) {
  487. record.lock = [NSNumber numberWithBool:NO];
  488. [context MR_saveToPersistentStoreAndWait];
  489. return YES;
  490. }
  491. else return NO;
  492. }
  493. + (void)setAllDirectoryUnLockForAccount:(NSString *)activeAccount
  494. {
  495. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  496. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@)", activeAccount];
  497. NSArray *records = [TableDirectory MR_findAllWithPredicate:predicate inContext:localContext];
  498. for(TableDirectory *record in records)
  499. record.lock = [NSNumber numberWithBool:NO];
  500. }];
  501. }
  502. + (BOOL)isDirectoryLock:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  503. {
  504. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (lock == 1) AND (account == %@)", [self getDirectoryIDFromServerUrl:serverUrl activeAccount:activeAccount], activeAccount];
  505. TableDirectory *record = [TableDirectory MR_findFirstWithPredicate:predicate];
  506. if (record) return YES;
  507. else return NO;
  508. }
  509. + (BOOL)isBlockZone:(NSString *)serverUrl activeAccount:(NSString *)activeAccount
  510. {
  511. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (directory == 1)", activeAccount];
  512. NSArray *records = [TableMetadata MR_findAllWithPredicate:predicate];
  513. if ([records count] > 0) {
  514. NSArray *pathComponents = [serverUrl pathComponents];
  515. for (NSString *fileName in pathComponents) {
  516. for(TableMetadata *record in records){
  517. NSString *fileNameEntity = [CCUtility trasformedFileNamePlistInCrypto:record.fileName];
  518. NSString *directoryID = record.directoryID;
  519. NSString *serverUrlEntity = [self getServerUrlFromDirectoryID:directoryID activeAccount:activeAccount];
  520. if([fileName isEqualToString:fileNameEntity]) {
  521. NSString *lockServerUrl = [CCUtility stringAppendServerUrl:serverUrlEntity addFileName:fileNameEntity];
  522. BOOL risultato = [self isDirectoryLock:lockServerUrl activeAccount:activeAccount];
  523. if (risultato) return YES;
  524. }
  525. }
  526. }
  527. }
  528. return NO;
  529. }
  530. #pragma --------------------------------------------------------------------------------------------
  531. #pragma mark ===== LocalFile =====
  532. #pragma --------------------------------------------------------------------------------------------
  533. + (void)addLocalFile:(tableMetadata *)metadata activeAccount:(NSString *)activeAccount
  534. {
  535. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  536. BOOL offline = NO;
  537. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (fileID == %@)", activeAccount, metadata.fileID];
  538. TableLocalFile *record = [TableLocalFile MR_findFirstWithPredicate:predicate inContext:localContext];
  539. if (record) {
  540. offline = [[record valueForKey:@"offline"] boolValue];
  541. [record MR_deleteEntityInContext:localContext];
  542. }
  543. record = [TableLocalFile MR_createEntityInContext:localContext];
  544. record.account = activeAccount;
  545. record.date = metadata.date;
  546. record.fileID = metadata.fileID;
  547. record.exifDate = [NSDate date];
  548. record.exifLatitude = @"-1";
  549. record.exifLongitude = @"-1";
  550. record.offline = [NSNumber numberWithBool:offline];
  551. record.fileName = metadata.fileName;
  552. record.fileNamePrint = metadata.fileNamePrint;
  553. record.rev = metadata.rev;
  554. record.size = [NSNumber numberWithLong:metadata.size];
  555. }];
  556. }
  557. + (void)deleteLocalFileWithPredicate:(NSPredicate *)predicate
  558. {
  559. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  560. [TableLocalFile MR_deleteAllMatchingPredicate:predicate inContext:localContext];
  561. }];
  562. }
  563. + (void)renameLocalFileWithFileID:(NSString *)fileID fileNameTo:(NSString *)fileNameTo fileNamePrintTo:(NSString *)fileNamePrintTo activeAccount:(NSString *)activeAccount
  564. {
  565. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  566. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", fileID, activeAccount];
  567. TableLocalFile *record = [TableLocalFile MR_findFirstWithPredicate:predicate inContext:localContext];
  568. if (record) {
  569. if (fileNameTo)record.fileName = fileNameTo;
  570. if (fileNamePrintTo)record.fileNamePrint = fileNamePrintTo;
  571. }
  572. }];
  573. }
  574. + (void)updateLocalFileModel:(tableMetadata *)metadata activeAccount:(NSString *)activeAccount
  575. {
  576. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  577. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (fileName == %@)", activeAccount, metadata.fileName];
  578. TableLocalFile *record = [TableLocalFile MR_findFirstWithPredicate:predicate inContext:localContext];
  579. if (record) {
  580. record.fileID = metadata.fileID;
  581. record.date = metadata.date;
  582. record.fileNamePrint = metadata.fileNamePrint;
  583. } else {
  584. [self addLocalFile:metadata activeAccount:activeAccount];
  585. }
  586. }];
  587. }
  588. + (TableLocalFile *)getLocalFileWithFileID:(NSString *)fileID activeAccount:(NSString *)activeAccount
  589. {
  590. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", fileID, activeAccount];
  591. TableLocalFile *record = [TableLocalFile MR_findFirstWithPredicate:predicate];
  592. if (record) {
  593. return record;
  594. } else return nil;
  595. }
  596. + (NSMutableArray *)getTableLocalFileWithPredicate:(NSPredicate *)predicate controlZombie:(BOOL)controlZombie activeAccount:(NSString *)activeAccount directoryUser:(NSString *)directoryUser
  597. {
  598. NSMutableArray *ritorno = [[NSMutableArray alloc] init];
  599. NSArray *records = [TableLocalFile MR_findAllWithPredicate:predicate];
  600. if ([records count] > 0) {
  601. // verifichiamo esistano tutti i file altrimenti rimuoviamo il record
  602. for(TableLocalFile *record in records){
  603. if (controlZombie) {
  604. NSString *fileID = record.fileID;
  605. NSString *FilePathFileID = [NSString stringWithFormat:@"%@/%@", directoryUser, fileID];
  606. NSString *FilePathFileName = [NSString stringWithFormat:@"%@/%@", directoryUser, record.fileName];
  607. if (![[NSFileManager defaultManager] fileExistsAtPath:FilePathFileID] && ![[NSFileManager defaultManager] fileExistsAtPath:FilePathFileName] && controlZombie) {
  608. // non esiste nè il file fileID e nemmeno il plist, eliminiamolo.
  609. [self deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", fileID, activeAccount]];
  610. } else [ritorno addObject:record];
  611. } else [ritorno addObject:record];
  612. }
  613. } else return nil;
  614. if ([ritorno count] == 0) return nil;
  615. else return ritorno;
  616. }
  617. + (NSArray *)getTableLocalFileWithPredicate:(NSPredicate *)predicate
  618. {
  619. return [TableLocalFile MR_findAllWithPredicate:predicate];
  620. }
  621. #pragma --------------------------------------------------------------------------------------------
  622. #pragma mark ===== Offline LocalFile =====
  623. #pragma --------------------------------------------------------------------------------------------
  624. + (void)setOfflineLocalFileID:(NSString *)fileID offline:(BOOL)offline activeAccount:(NSString *)activeAccount
  625. {
  626. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  627. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", fileID, activeAccount];
  628. TableLocalFile *record = [TableLocalFile MR_findFirstWithPredicate:predicate inContext:localContext];
  629. if (record)
  630. record.offline = [NSNumber numberWithBool:offline];
  631. }];
  632. }
  633. + (BOOL)isOfflineLocalFileID:(NSString *)fileID activeAccount:(NSString *)activeAccount
  634. {
  635. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(fileID == %@) AND (offline == 1) AND (account == %@)", fileID, activeAccount];
  636. TableLocalFile *record = [TableLocalFile MR_findFirstWithPredicate:predicate];
  637. if (record) return YES;
  638. else return NO;
  639. }
  640. + (NSArray *)getOfflineLocalFileActiveAccount:(NSString *)activeAccount directoryUser:(NSString *)directoryUser
  641. {
  642. NSMutableArray *metadatas = [NSMutableArray new];
  643. NSArray *files = [self getTableLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@) AND (offline == 1)", activeAccount] controlZombie:YES activeAccount:activeAccount directoryUser:directoryUser];
  644. for (TableLocalFile *file in files) {
  645. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", file.fileID, activeAccount];
  646. tableMetadata *metadata = [self getMetadataWithPreficate:predicate context:nil];
  647. if (metadata) {
  648. // verify if is not on directory offline
  649. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (offline == 1) AND (account == %@)", metadata.directoryID, activeAccount];
  650. TableDirectory *directory = [TableDirectory MR_findFirstWithPredicate:predicate];
  651. if (!directory)
  652. [metadatas addObject:metadata];
  653. }
  654. }
  655. return metadatas;
  656. }
  657. #pragma --------------------------------------------------------------------------------------------
  658. #pragma mark ===== GeoInformation =====
  659. #pragma --------------------------------------------------------------------------------------------
  660. + (NSArray *)getGeoInformationLocalFromFileID:(NSString *)fileID activeAccount:(NSString *)activeAccount
  661. {
  662. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", fileID, activeAccount];
  663. TableLocalFile *record = [TableLocalFile MR_findFirstWithPredicate:predicate];
  664. if (record) return [[NSArray alloc] initWithObjects:record.exifDate, record.exifLatitude, record.exifLongitude, nil];
  665. else return nil;
  666. }
  667. + (void)setGeoInformationLocalFromFileID:(NSString *)fileID exifDate:(NSDate *)exifDate exifLatitude:(NSString *)exifLatitude exifLongitude:(NSString *)exifLongitude activeAccount:(NSString *)activeAccount
  668. {
  669. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  670. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (fileID == %@)", activeAccount, fileID];
  671. TableLocalFile *record = [TableLocalFile MR_findFirstWithPredicate:predicate inContext:localContext];
  672. if (record) {
  673. record.exifDate = exifDate;
  674. record.exifLatitude = exifLatitude;
  675. record.exifLongitude = exifLongitude;
  676. }
  677. }];
  678. }
  679. + (void)setGeoInformationLocalNull
  680. {
  681. [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  682. NSArray *records = [TableLocalFile MR_findAllInContext:localContext];
  683. for (TableLocalFile *record in records) {
  684. if ([record.exifLatitude doubleValue] != 0 || [record.exifLongitude doubleValue] != 0) {
  685. record.exifLatitude = @"9999";
  686. record.exifLongitude = @"9999";
  687. }
  688. }
  689. }];
  690. }
  691. #pragma --------------------------------------------------------------------------------------------
  692. #pragma mark ===== Certificates =====
  693. #pragma --------------------------------------------------------------------------------------------
  694. + (NSMutableArray *)getAllCertificatesLocationOldDB
  695. {
  696. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  697. NSMutableArray *output = [NSMutableArray new];
  698. NSArray *records = [TableCertificates MR_findAllInContext:context];
  699. for (TableCertificates *record in records) {
  700. if (record.certificateLocation && record.certificateLocation.length > 0)
  701. [output addObject:record.certificateLocation];
  702. }
  703. return output;
  704. }
  705. #pragma --------------------------------------------------------------------------------------------
  706. #pragma mark ===== Share =====
  707. #pragma --------------------------------------------------------------------------------------------
  708. /*
  709. + (void)setShareLink:(NSString *)share fileName:(NSString *)fileName serverUrl:(NSString *)serverUrl sharesLink:(NSMutableDictionary *)sharesLink activeAccount:(NSString *)activeAccount
  710. {
  711. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  712. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (fileName == %@) AND (serverUrl == %@)", activeAccount, fileName, serverUrl];
  713. TableShare *record = [TableShare MR_findFirstWithPredicate:predicate inContext:context];
  714. if (record) {
  715. record.shareLink = share;
  716. } else {
  717. TableShare *record = [TableShare MR_createEntityInContext:context];
  718. record.account = activeAccount;
  719. record.fileName = fileName;
  720. record.serverUrl = serverUrl;
  721. record.shareLink = share;
  722. }
  723. [context MR_saveToPersistentStoreAndWait];
  724. if (share && serverUrl && fileName)
  725. [sharesLink setObject:share forKey:[serverUrl stringByAppendingString:fileName]];
  726. }
  727. + (void)setShareUserAndGroup:(NSString *)share fileName:(NSString *)fileName serverUrl:(NSString *)serverUrl sharesUserAndGroup:(NSMutableDictionary *)sharesUserAndGroup activeAccount:(NSString *)activeAccount
  728. {
  729. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  730. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (fileName == %@) AND (serverUrl == %@)", activeAccount, fileName, serverUrl];
  731. TableShare *record = [TableShare MR_findFirstWithPredicate:predicate inContext:context];
  732. if (record) {
  733. record.shareUserAndGroup = share;
  734. } else {
  735. TableShare *record = [TableShare MR_createEntityInContext:context];
  736. record.account = activeAccount;
  737. record.fileName = fileName;
  738. record.serverUrl = serverUrl;
  739. record.shareUserAndGroup = share;
  740. }
  741. [context MR_saveToPersistentStoreAndWait];
  742. [sharesUserAndGroup setObject:share forKey:[serverUrl stringByAppendingString:fileName]];
  743. }
  744. + (void)unShare:(NSString *)share fileName:(NSString *)fileName serverUrl:(NSString *)serverUrl sharesLink:(NSMutableDictionary *)sharesLink sharesUserAndGroup:(NSMutableDictionary *)sharesUserAndGroup activeAccount:(NSString *)activeAccount
  745. {
  746. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  747. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND ((shareLink CONTAINS %@) OR (shareUserAndGroup CONTAINS %@))", activeAccount, share, share];
  748. TableShare *record = [TableShare MR_findFirstWithPredicate:predicate inContext:context];
  749. if (record) {
  750. if ([record.shareLink containsString:share]) record.shareLink = @"";
  751. if ([record.shareUserAndGroup containsString:share]) {
  752. NSMutableArray *shares = [[NSMutableArray alloc] initWithArray:[record.shareUserAndGroup componentsSeparatedByString:@","]];
  753. [shares removeObject:share];
  754. record.shareUserAndGroup = [shares componentsJoinedByString:@","];
  755. }
  756. if ([record.shareLink length] == 0 && [record.shareUserAndGroup length] == 0)
  757. [record MR_deleteEntityInContext:context];
  758. [context MR_saveToPersistentStoreAndWait];
  759. if ([record.shareLink length] > 0) [sharesLink setObject:record.shareLink forKey:[serverUrl stringByAppendingString:fileName]];
  760. else [sharesLink removeObjectForKey:[serverUrl stringByAppendingString:fileName]];
  761. if ([record.shareUserAndGroup length] > 0) [sharesUserAndGroup setObject:record.shareUserAndGroup forKey:[serverUrl stringByAppendingString:fileName]];
  762. else [sharesUserAndGroup removeObjectForKey:[serverUrl stringByAppendingString:fileName]];
  763. }
  764. }
  765. + (void)removeAllShareActiveAccount:(NSString *)activeAccount sharesLink:(NSMutableDictionary *)sharesLink sharesUserAndGroup:(NSMutableDictionary *)sharesUserAndGroup
  766. {
  767. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  768. [TableShare MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"account == %@", activeAccount] inContext:context];
  769. [context MR_saveToPersistentStoreAndWait];
  770. [sharesLink removeAllObjects];
  771. [sharesUserAndGroup removeAllObjects];
  772. }
  773. + (void)updateShare:(NSDictionary *)items sharesLink:(NSMutableDictionary *)sharesLink sharesUserAndGroup:(NSMutableDictionary *)sharesUserAndGroup activeAccount:(NSString *)activeAccount activeUrl:(NSString *)activeUrl
  774. {
  775. // rimuovi tutte le condivisioni
  776. [self removeAllShareActiveAccount:activeAccount sharesLink:sharesLink sharesUserAndGroup:sharesUserAndGroup];
  777. NSMutableArray *itemsLink = [[NSMutableArray alloc] init];
  778. NSMutableArray *itemsUsersAndGroups = [[NSMutableArray alloc] init];
  779. for (NSString *idRemoteShared in items) {
  780. OCSharedDto *item = [items objectForKey:idRemoteShared];
  781. if (item.shareType == shareTypeLink) [itemsLink addObject:item];
  782. if ([[item shareWith] length] > 0 && (item.shareType == shareTypeUser || item.shareType == shareTypeGroup || item.shareType == shareTypeRemote)) [itemsUsersAndGroups addObject:item];
  783. }
  784. // Link
  785. for (OCSharedDto *item in itemsLink) {
  786. NSString *fullPath = [[CCUtility getHomeServerUrlActiveUrl:activeUrl] stringByAppendingString:item.path];
  787. NSString *fileName = [fullPath lastPathComponent];
  788. NSString *serverUrl = [fullPath substringToIndex:([fullPath length]-[fileName length]-1)];
  789. if ([serverUrl hasSuffix:@"/"]) serverUrl = [serverUrl substringToIndex:[serverUrl length] - 1];
  790. if ([@(item.idRemoteShared) stringValue])
  791. [self setShareLink:[@(item.idRemoteShared) stringValue] fileName:fileName serverUrl:serverUrl sharesLink:sharesLink activeAccount:activeAccount];
  792. }
  793. // Condivisioni
  794. NSMutableDictionary *paths = [[NSMutableDictionary alloc] init];
  795. // Creazione dizionario
  796. for (OCSharedDto *item in itemsUsersAndGroups) {
  797. if ([paths objectForKey:item.path]) {
  798. NSMutableArray *share = [paths objectForKey:item.path];
  799. [share addObject:[@(item.idRemoteShared) stringValue]];
  800. [paths setObject:share forKey:item.path];
  801. } else {
  802. NSMutableArray *share = [[NSMutableArray alloc] initWithObjects:[@(item.idRemoteShared) stringValue], nil];
  803. [paths setObject:share forKey:item.path];
  804. }
  805. }
  806. // Scrittura su DB
  807. for (NSString *path in paths) {
  808. NSArray *items = [paths objectForKey:path];
  809. NSString *share = [items componentsJoinedByString:@","];
  810. NSLog(@"[LOG] share %@", share);
  811. NSString *fullPath = [[CCUtility getHomeServerUrlActiveUrl:activeUrl] stringByAppendingString:path];
  812. NSString *fileName = [fullPath lastPathComponent];
  813. NSString *serverUrl = [fullPath substringToIndex:([fullPath length]-[fileName length]-1)];
  814. if ([serverUrl hasSuffix:@"/"]) serverUrl = [serverUrl substringToIndex:[serverUrl length] - 1];
  815. if (share)
  816. [self setShareUserAndGroup:share fileName:fileName serverUrl:serverUrl sharesUserAndGroup:sharesUserAndGroup activeAccount:activeAccount];
  817. }
  818. }
  819. + (void)populateSharesVariableFromDBActiveAccount:(NSString *)activeAccount sharesLink:(NSMutableDictionary *)sharesLink sharesUserAndGroup:(NSMutableDictionary *)sharesUserAndGroup
  820. {
  821. [sharesLink removeAllObjects];
  822. [sharesUserAndGroup removeAllObjects];
  823. NSArray *records = [TableShare MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"(account == %@)", activeAccount]];
  824. for (TableShare *record in records) {
  825. if ([record.shareLink length] > 0 && record.serverUrl && record.fileName)
  826. [sharesLink setObject:record.shareLink forKey:[record.serverUrl stringByAppendingString:record.fileName]];
  827. if ([record.shareUserAndGroup length] > 0 && record.serverUrl && record.fileName)
  828. [sharesUserAndGroup setObject:record.shareUserAndGroup forKey:[record.serverUrl stringByAppendingString:record.fileName]];
  829. }
  830. return;
  831. }
  832. */
  833. #pragma --------------------------------------------------------------------------------------------
  834. #pragma mark ===== Offline =====
  835. #pragma --------------------------------------------------------------------------------------------
  836. + (NSArray *)getHomeOfflineActiveAccount:(NSString *)activeAccount directoryUser:(NSString *)directoryUser fieldOrder:(NSString *)fieldOrder ascending:(BOOL)ascending
  837. {
  838. NSMutableArray *tableMetadatas = [NSMutableArray new];
  839. NSArray *directoriesOffline = [self getOfflineDirectoryActiveAccount:activeAccount];
  840. NSString *father = @"";
  841. NSSortDescriptor *descriptor;
  842. // Add directory
  843. for (TableDirectory *directory in directoriesOffline) {
  844. if (![directory.serverUrl containsString:father]) {
  845. father = directory.serverUrl;
  846. NSString *upDir = [CCUtility deletingLastPathComponentFromServerUrl:father];
  847. NSString *directoryID = [self getDirectoryIDFromServerUrl:upDir activeAccount:activeAccount];
  848. NSString *fileName = [father lastPathComponent];
  849. if (upDir && directoryID && fileName) {
  850. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(directoryID == %@) AND (account == %@) AND (directory == 1) AND (fileNameData == %@)", directoryID, activeAccount, fileName];
  851. TableMetadata *tableMetadata = [self getTableMetadataWithPreficate:predicate];
  852. if (tableMetadata)
  853. [tableMetadatas addObject:tableMetadata];
  854. }
  855. }
  856. }
  857. // Add files
  858. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (offline == 1)", activeAccount];
  859. NSArray *localFiles = [CCCoreData getTableLocalFileWithPredicate:predicate];
  860. for (TableLocalFile *localFile in localFiles) {
  861. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(account == %@) AND (fileID == %@)", activeAccount, localFile.fileID];
  862. TableMetadata *tableMetadata = [self getTableMetadataWithPreficate:predicate];
  863. if (tableMetadata)
  864. [tableMetadatas addObject:tableMetadata];
  865. }
  866. // Order
  867. if ([fieldOrder isEqualToString:@"fileName"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"fileNamePrint" ascending:ascending selector:@selector(localizedCaseInsensitiveCompare:)];
  868. else if ([fieldOrder isEqualToString:@"fileDate"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:ascending selector:nil];
  869. else if ([fieldOrder isEqualToString:@"sessionTaskIdentifier"]) descriptor = [[NSSortDescriptor alloc] initWithKey:@"sessionTaskIdentifier" ascending:ascending selector:nil];
  870. else descriptor = [[NSSortDescriptor alloc] initWithKey:fieldOrder ascending:ascending selector:@selector(localizedCaseInsensitiveCompare:)];
  871. return [tableMetadatas sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]];//[NSArray arrayWithArray:tableMetadatas];
  872. }
  873. #pragma --------------------------------------------------------------------------------------------
  874. #pragma mark ===== File System =====
  875. #pragma --------------------------------------------------------------------------------------------
  876. + (BOOL)downloadFile:(tableMetadata *)metadata directoryUser:(NSString *)directoryUser activeAccount:(NSString *)activeAccount
  877. {
  878. // ----------------------------------------- FILESYSTEM ------------------------------------------
  879. // if encrypted, rewrite
  880. if (metadata.cryptated == YES)
  881. if ([[CCCrypto sharedManager] decrypt:metadata.fileID fileNameDecrypted:metadata.fileID fileNamePrint:metadata.fileNamePrint password:[[CCCrypto sharedManager] getKeyPasscode:metadata.uuid] directoryUser:directoryUser] == 0) return NO;
  882. // ------------------------------------------ COREDATA -------------------------------------------
  883. // add/update Table Local File
  884. [self addLocalFile:metadata activeAccount:activeAccount];
  885. // EXIF
  886. if ([metadata.typeFile isEqualToString: k_metadataTypeFile_image])
  887. [CCExifGeo setExifLocalTableFileID:metadata directoryUser:directoryUser activeAccount:activeAccount];
  888. // Icon
  889. [CCGraphics createNewImageFrom:metadata.fileID directoryUser:directoryUser fileNameTo:metadata.fileID fileNamePrint:metadata.fileNamePrint size:@"m" imageForUpload:NO typeFile:metadata.typeFile writePreview:YES optimizedFileName:[CCUtility getOptimizedPhoto]];
  890. return YES;
  891. }
  892. + (void)downloadFilePlist:(tableMetadata *)metadata activeAccount:(NSString *)activeAccount activeUrl:(NSString *)activeUrl directoryUser:(NSString *)directoryUser
  893. {
  894. // inseriamo le info nel plist
  895. [CCUtility insertInformationPlist:metadata directoryUser:directoryUser];
  896. // aggiorniamo il CCMetadata
  897. [self updateMetadata:metadata predicate:[NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", metadata.fileID, activeAccount] activeAccount:activeAccount activeUrl:activeUrl context:nil];
  898. // se è un template aggiorniamo anche nel FileSystem
  899. if ([metadata.type isEqualToString: k_metadataType_template]){
  900. [self updateLocalFileModel:metadata activeAccount:activeAccount];
  901. }
  902. }
  903. + (void)deleteFile:(tableMetadata *)metadata serverUrl:(NSString *)serverUrl directoryUser:(NSString *)directoryUser activeAccount:(NSString *)activeAccount
  904. {
  905. // ----------------------------------------- FILESYSTEM ------------------------------------------
  906. [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@", directoryUser, metadata.fileID] error:nil];
  907. [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@.ico", directoryUser, metadata.fileID] error:nil];
  908. // ------------------------------------------ COREDATA -------------------------------------------
  909. [self deleteMetadataWithPredicate:[NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", metadata.fileID, activeAccount]];
  910. [self deleteLocalFileWithPredicate:[NSPredicate predicateWithFormat:@"(fileID == %@) AND (account == %@)", metadata.fileID, activeAccount]];
  911. // se è una directory cancelliamo tutto quello che è della directory
  912. if (metadata.directory && serverUrl) {
  913. NSString *dirForDelete = [CCUtility stringAppendServerUrl:serverUrl addFileName:metadata.fileNameData];
  914. [self deleteDirectoryAndSubDirectory:dirForDelete activeAccount:activeAccount];
  915. }
  916. }
  917. #pragma --------------------------------------------------------------------------------------------
  918. #pragma mark ===== Metadata <> Entity =====
  919. #pragma --------------------------------------------------------------------------------------------
  920. + (void)insertMetadataInEntity:(tableMetadata *)metadata recordMetadata:(TableMetadata *)recordMetadata activeAccount:(NSString *)activeAccount activeUrl:(NSString *)activeUrl
  921. {
  922. if ([activeAccount length]) recordMetadata.account = activeAccount;
  923. recordMetadata.cryptated = [NSNumber numberWithBool:metadata.cryptated];
  924. if (metadata.date) recordMetadata.date = metadata.date;
  925. recordMetadata.directory = [NSNumber numberWithBool:metadata.directory];
  926. recordMetadata.errorPasscode = [NSNumber numberWithBool:metadata.errorPasscode];
  927. recordMetadata.favorite = [NSNumber numberWithBool:metadata.favorite];
  928. if ([metadata.fileID length]) recordMetadata.fileID = metadata.fileID;
  929. if ([metadata.directoryID length]) recordMetadata.directoryID = metadata.directoryID;
  930. if ([metadata.fileName length]) recordMetadata.fileName = metadata.fileName;
  931. if ([metadata.fileName length]) recordMetadata.fileNameData = [CCUtility trasformedFileNamePlistInCrypto:metadata.fileName];
  932. if ([metadata.fileNamePrint length]) recordMetadata.fileNamePrint = metadata.fileNamePrint;
  933. if ([metadata.assetLocalIdentifier length]) recordMetadata.assetLocalIdentifier = metadata.assetLocalIdentifier;
  934. if ([metadata.model length]) recordMetadata.model = metadata.model;
  935. if ([metadata.nameCurrentDevice length]) recordMetadata.nameCurrentDevice = metadata.nameCurrentDevice;
  936. if ([metadata.permissions length]) recordMetadata.permissions = metadata.permissions;
  937. if ([metadata.protocolCrypto length]) recordMetadata.protocol = metadata.protocolCrypto;
  938. if ([metadata.rev length]) recordMetadata.rev = metadata.rev;
  939. if (metadata.session) recordMetadata.session = metadata.session;
  940. else metadata.session = @"";
  941. recordMetadata.sessionError = metadata.sessionError;
  942. recordMetadata.sessionID = metadata.sessionID;
  943. recordMetadata.sessionSelector = metadata.sessionSelector;
  944. recordMetadata.sessionSelectorPost = metadata.sessionSelectorPost;
  945. recordMetadata.sessionTaskIdentifier = [NSNumber numberWithLong:metadata.sessionTaskIdentifier];
  946. recordMetadata.sessionTaskIdentifierPlist = [NSNumber numberWithLong:metadata.sessionTaskIdentifierPlist];
  947. if (metadata.size) recordMetadata.size = [NSNumber numberWithLong:metadata.size];
  948. if ([metadata.title length]) recordMetadata.title = metadata.title;
  949. recordMetadata.thumbnailExists = [NSNumber numberWithBool:metadata.thumbnailExists];
  950. if ([metadata.type length]) recordMetadata.type = metadata.type;
  951. if ([metadata.uuid length]) recordMetadata.uuid = metadata.uuid;
  952. // inseriamo il typeFile e icona di default.
  953. NSString *cameraFolderName = [[NCManageDatabase sharedInstance] getAccountCameraUploadFolderName];
  954. NSString *cameraFolderPath = [[NCManageDatabase sharedInstance] getAccountCameraUploadFolderPath:activeUrl];
  955. [CCUtility insertTypeFileIconName:metadata directory:[self getServerUrlFromDirectoryID:metadata.directoryID activeAccount:activeAccount] cameraFolderName:cameraFolderName cameraFolderPath:cameraFolderPath];
  956. recordMetadata.typeFile = metadata.typeFile;
  957. recordMetadata.iconName = metadata.iconName;
  958. }
  959. + (tableMetadata *)insertEntityInMetadata:(TableMetadata *)recordMetadata
  960. {
  961. tableMetadata *metadata = [[tableMetadata alloc] init];
  962. metadata.account = recordMetadata.account;
  963. metadata.cryptated = [recordMetadata.cryptated boolValue];
  964. metadata.date = recordMetadata.date;
  965. metadata.directory = [recordMetadata.directory boolValue];
  966. metadata.errorPasscode = [recordMetadata.errorPasscode boolValue];
  967. metadata.favorite = [recordMetadata.favorite boolValue];
  968. metadata.fileID = recordMetadata.fileID;
  969. metadata.directoryID = recordMetadata.directoryID;
  970. metadata.fileName = recordMetadata.fileName;
  971. metadata.fileNameData = recordMetadata.fileNameData;
  972. metadata.fileNamePrint = recordMetadata.fileNamePrint;
  973. metadata.iconName = recordMetadata.iconName;
  974. metadata.assetLocalIdentifier = recordMetadata.assetLocalIdentifier;
  975. metadata.model = recordMetadata.model;
  976. metadata.nameCurrentDevice = recordMetadata.nameCurrentDevice;
  977. metadata.permissions = recordMetadata.permissions;
  978. metadata.protocolCrypto = recordMetadata.protocol;
  979. metadata.rev = recordMetadata.rev;
  980. metadata.session = recordMetadata.session;
  981. metadata.sessionError = recordMetadata.sessionError;
  982. metadata.sessionID = recordMetadata.sessionID;
  983. metadata.sessionSelector = recordMetadata.sessionSelector;
  984. metadata.sessionSelectorPost = recordMetadata.sessionSelectorPost;
  985. metadata.sessionTaskIdentifier = [recordMetadata.sessionTaskIdentifier intValue];
  986. metadata.sessionTaskIdentifierPlist = [recordMetadata.sessionTaskIdentifierPlist intValue];
  987. metadata.size = [recordMetadata.size longValue];
  988. metadata.thumbnailExists = [recordMetadata.thumbnailExists boolValue];
  989. metadata.title = recordMetadata.title;
  990. metadata.type = recordMetadata.type;
  991. metadata.typeFile = recordMetadata.typeFile;
  992. metadata.uuid = recordMetadata.uuid;
  993. return metadata;
  994. }
  995. #pragma --------------------------------------------------------------------------------------------
  996. #pragma mark ===== Utility Database =====
  997. #pragma --------------------------------------------------------------------------------------------
  998. + (void)moveCoreDataToGroup
  999. {
  1000. NSString *applicationName = [[[NSBundle mainBundle] infoDictionary] valueForKey:(NSString *)kCFBundleNameKey];
  1001. NSURL *dirGroup = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:[NCBrandOptions sharedInstance].capabilitiesGroups];
  1002. NSString *dirToPath = [[dirGroup URLByAppendingPathComponent:appDatabase] path];
  1003. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
  1004. NSString *dirFromPath = [[paths lastObject] stringByAppendingPathComponent:applicationName];
  1005. NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirFromPath error:nil];
  1006. NSError *error;
  1007. for(NSString *filename in files)
  1008. [[NSFileManager defaultManager] moveItemAtPath:[dirFromPath stringByAppendingPathComponent:filename] toPath:[dirToPath stringByAppendingPathComponent:filename] error:&error];
  1009. }
  1010. + (void)moveAllUserToGroup
  1011. {
  1012. NSArray *records = [TableAccount MR_findAll];
  1013. for (TableAccount *record in records) {
  1014. NSString *dirFromPath = [CCUtility getOLDDirectoryActiveUser:record.user activeUrl:record.url];
  1015. NSString *dirToPath = [CCUtility getDirectoryActiveUser:record.user activeUrl:record.url];
  1016. NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirFromPath error:nil];
  1017. NSError *error;
  1018. for(NSString *filename in files)
  1019. [[NSFileManager defaultManager] moveItemAtPath:[dirFromPath stringByAppendingPathComponent:filename] toPath:[dirToPath stringByAppendingPathComponent:filename] error:&error];
  1020. }
  1021. }
  1022. + (void)verifyVersionCoreData:(UIViewController *)vc
  1023. {
  1024. NSString *applicationName = [[[NSBundle mainBundle] infoDictionary] valueForKey:(NSString *)kCFBundleNameKey];
  1025. // Get the path for our model (in this case it's named 'cache')
  1026. NSURL *url = [[NSBundle mainBundle] URLForResource:@"cryptocloud" withExtension:@"momd"];
  1027. NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[[NSManagedObjectModel alloc] initWithContentsOfURL:url]]; /* get a coordinator */
  1028. NSString *sourceStoreType = nil;/* type for the source store, or nil if not known */ ;
  1029. NSString *path = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) firstObject];
  1030. // Figure out the full path where our store is located
  1031. path = [path stringByAppendingFormat:@"/%@/cryptocloud", applicationName];
  1032. NSURL *sourceStoreURL = [NSURL fileURLWithPath:path]; /* URL for the source store */ ;
  1033. NSError *error = nil;
  1034. NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:sourceStoreType URL:sourceStoreURL error:&error];
  1035. if (sourceMetadata == nil) {
  1036. NSLog(@"[LOG] Error checking migration validity");
  1037. } else {
  1038. if (![[psc managedObjectModel] isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata]) {
  1039. UIAlertController * alert= [UIAlertController alertControllerWithTitle:nil message:NSLocalizedString(@"_required_new_database_", nil) preferredStyle:UIAlertControllerStyleAlert];
  1040. UIAlertAction* ok = [UIAlertAction actionWithTitle:NSLocalizedString(@"_ok_", nil) style:UIAlertActionStyleDefault
  1041. handler:^(UIAlertAction * action) {
  1042. [alert dismissViewControllerAnimated:YES completion:nil];
  1043. }];
  1044. [alert addAction:ok];
  1045. [vc presentViewController:alert animated:YES completion:nil];
  1046. // Delete CoreData store
  1047. NSFileManager *manager = [NSFileManager defaultManager];
  1048. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
  1049. NSString *directory = [[paths lastObject] stringByAppendingPathComponent:applicationName];
  1050. NSArray *files = [manager contentsOfDirectoryAtPath:directory error:nil];
  1051. NSError *error;
  1052. for(NSString *filename in files) {
  1053. [manager removeItemAtPath:[directory stringByAppendingPathComponent:filename] error:&error];
  1054. }
  1055. }
  1056. }
  1057. }
  1058. #pragma --------------------------------------------------------------------------------------------
  1059. #pragma mark ===== Flush Database =====
  1060. #pragma --------------------------------------------------------------------------------------------
  1061. + (void)flushTableDirectoryAccount:(NSString *)account
  1062. {
  1063. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  1064. if (account) {
  1065. [TableDirectory MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"(account == %@)", account] inContext:context];
  1066. } else {
  1067. [TableDirectory MR_truncateAllInContext:context];
  1068. }
  1069. [context MR_saveToPersistentStoreAndWait];
  1070. }
  1071. + (void)flushTableLocalFileAccount:(NSString *)account
  1072. {
  1073. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  1074. if (account) {
  1075. [TableLocalFile MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"(account == %@)", account] inContext:context];
  1076. } else {
  1077. [TableLocalFile MR_truncateAllInContext:context];
  1078. }
  1079. [context MR_saveToPersistentStoreAndWait];
  1080. }
  1081. + (void)flushTableMetadataAccount:(NSString *)account
  1082. {
  1083. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  1084. if (account) {
  1085. [TableMetadata MR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"(account == %@)", account] inContext:context];
  1086. } else {
  1087. [TableMetadata MR_truncateAllInContext:context];
  1088. }
  1089. [context MR_saveToPersistentStoreAndWait];
  1090. }
  1091. + (void)flushAllDatabase
  1092. {
  1093. NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
  1094. [TableAccount MR_truncateAllInContext:context];
  1095. [TableDirectory MR_truncateAllInContext:context];
  1096. [TableLocalFile MR_truncateAllInContext:context];
  1097. [TableMetadata MR_truncateAllInContext:context];
  1098. [context MR_saveToPersistentStoreAndWait];
  1099. }
  1100. @end