/*
  Copyright (C) 2004-2007 SKYRIX Software AG
  Copyright (C) 2007      Helge Hess

  This file is part of OpenGroupware.org.

  OGo is free software; you can redistribute it and/or modify it under
  the terms of the GNU Lesser General Public License as published by the
  Free Software Foundation; either version 2, or (at your option) any
  later version.

  OGo is distributed in the hope that it will be useful, but WITHOUT ANY
  WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with OGo; see the file COPYING.  If not, write to the
  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  02111-1307, USA.
*/

#ifndef __GDLContentStore_GCSFolder_H__
#define __GDLContentStore_GCSFolder_H__


/*
  GCSFolder
  
  TODO: document
  
  Fixed Quick-Table SQL fields:
  - "c_name" (name of the file in the folder)
  
  Fixed BLOB-Table SQL fields:
  - "c_name"    (name of the file in the folder)
  - "c_content" (content of the file in the folder)
  - "c_version" (update revision of the file in the folder)
*/

@class NSArray;
@class NSDictionary;
@class NSException;
@class NSMutableArray;
@class NSMutableString;
@class NSNumber;
@class NSString;
@class NSURL;

@class EOAdaptor;
@class EOAdaptorChannel;
@class EOAttribute;
@class EOFetchSpecification;
@class EOKeyValueQualifier;
@class EOQualifier;
@class GCSChannelManager;
@class GCSFolderManager;
@class GCSFolderType;

@interface GCSFolder : NSObject
{
  GCSFolderManager *folderManager;
  GCSFolderType *folderInfo;
  
  NSNumber *folderId;
  NSString *folderName;
  NSString *path;
  NSURL *location;
  NSURL *quickLocation;
  NSURL *aclLocation;
  NSString *folderTypeName;
  NSMutableArray *quickFieldNames, *contentFieldNames;

  struct {
    int requiresFolderSelect:1;
    int sameTableForQuick:1;
    int reserved:30;
  } ofFlags;
}

- (id) initWithPath: (NSString *) _path
	 primaryKey: (id) _folderId
     folderTypeName: (NSString *) _ftname
	 folderType: (GCSFolderType *) _ftype
	   location: (NSURL *) _loc
      quickLocation: (NSURL *) _qloc
	aclLocation: (NSURL *) _aloc
      folderManager: (GCSFolderManager *) _fm;

/* accessors */

- (NSNumber *) folderId;
- (NSString *) folderName;
- (NSString *) path;
- (NSURL *) location;
- (NSURL *) quickLocation;
- (NSURL *) aclLocation;
- (NSString *) folderTypeName;

- (NSString *) storeTableName;
- (NSString *) quickTableName;
- (NSString *) aclTableName;
- (BOOL) isQuickInfoStoredInContentTable;

/* connection */

- (EOAdaptorChannel *) acquireStoreChannel;
- (EOAdaptorChannel *) acquireQuickChannel;
- (EOAdaptorChannel *) acquireAclChannel;
- (void) releaseChannel: (EOAdaptorChannel *) _channel;
- (void) releaseChannel: (EOAdaptorChannel *) _channel
            immediately: (BOOL) _immediately;


- (BOOL) canConnectStore;
- (BOOL) canConnectQuick;

/* operations */

- (NSArray *) subFolderNames;
- (NSArray *) allSubFolderNames;

- (NSDictionary *) recordOfEntryWithName: (NSString *) name;

- (NSException *) writeContent: (NSString *) _content
                 fromComponent: (id) theComponent
                     container: (id) theContainer
			toName: (NSString *) _name
		   baseVersion: (unsigned int *) _baseVersion;

- (NSException *) deleteContentWithName: (NSString *) _name;
- (NSException *) deleteAllContent;
- (NSException *) purgeDeletedRecordsBefore: (unsigned int) days;
- (NSException *) touchContentWithName: (NSString *) _name;

- (NSException *) deleteFolder;

- (NSException *) updateQuickFields: (NSDictionary *) _fields
                        whereColumn: (NSString *) _colname
                          isEqualTo: (id) _value;

- (NSArray *) fetchFields: (NSArray *) _flds 
       fetchSpecification: (EOFetchSpecification *) _fs;
- (NSArray *) fetchFields: (NSArray *) fields
       fetchSpecification: (EOFetchSpecification *) spec
	    ignoreDeleted: (BOOL) ignoreDeleted;

- (NSArray *) fetchFields: (NSArray *) _flds
	matchingQualifier: (EOQualifier *) _q;
- (NSArray *) fetchAclMatchingQualifier: (EOQualifier *) _q;
- (void) deleteAclMatchingQualifier: (EOQualifier *) _q;
- (void) deleteAclWithSpecification: (EOFetchSpecification *) _fs;

- (unsigned int) recordsCountByExcludingDeleted: (BOOL) includeDeleted;
- (unsigned int) recordsCountDeletedBefore: (unsigned int) days;

- (NSCalendarDate *) lastModificationDate;

/* helpers */

- (EOAttribute *) _attributeForColumn: (NSString *) _field;
@end

#endif /* __GDLContentStore_GCSFolder_H__ */
