Initial original import from: fuse-2.4.2-2.fc4
[captive.git] / src / libcaptive / cc / copy.c
1 /* $Id$
2  * reactos Cache Manager (Cc*) CcCopy*() handling of libcaptive
3  * Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
4  * 
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; exactly version 2 of June 1991 is required
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19
20 #include "config.h"
21
22 #include "privatebcbpin.h"
23 #include "reactos/ddk/status.h"
24 #include "captive/macros.h"
25
26
27 /**
28  * CcCopyRead:
29  * @FileObject: Initialized open #FileObject to map.
30  * %NULL value is forbidden.
31  * @FileOffset: The @FileObject file offset from where to map the region from.
32  * Negative value is forbidden.
33  * @Length: Requested length of the region to map from @FileObject.
34  * Value %0 is permitted (no effect of this function call).
35  * @Wait: Whether disk waiting is permitted for this function.
36  * Value %FALSE is currently forbidden by libcaptive as we have no on-demand loading implemented.
37  * @Buffer: Address of memory region with already allocated memory of size @Length.
38  * This address may not be %PAGE_SIZE aligned.
39  * %NULL pointer is forbidden.
40  * @IoStatus: #PIO_STATUS_BLOCK to return status of this operation.
41  * %NULL pointer is forbidden.
42  *
43  * Reads the specified region of @FileObject to the given @Buffer.
44  * No on-demand loading is in effect.
45  *
46  * Returns: %TRUE if the region was successfuly filled with @Length bytes.
47  * @IoStatus.Status initialized by %STATUS_SUCCESS if successful.
48  * @IoStatus.Information initialized by @Length if successful.
49  */
50 BOOLEAN CcCopyRead(IN PFILE_OBJECT FileObject,
51                 IN PLARGE_INTEGER FileOffset,IN ULONG Length,IN BOOLEAN Wait,OUT PVOID Buffer,OUT PIO_STATUS_BLOCK IoStatus)
52 {
53 CaptiveSharedCacheMapObject *SharedCacheMap;
54 BOOLEAN r;
55
56         g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcCopyRead: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Wait=%d,Buffer=0x%lX",
57                         (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Wait,(long)Buffer);
58
59         g_return_val_if_fail(FileObject!=NULL,FALSE);
60         g_return_val_if_fail(FileOffset!=NULL,FALSE);
61         g_return_val_if_fail(Wait==TRUE,FALSE);
62         g_return_val_if_fail(Buffer!=NULL,FALSE);
63         g_return_val_if_fail(IoStatus!=NULL,FALSE);
64
65         SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
66
67         captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,FileOffset->QuadPart,FileOffset->QuadPart+Length);
68         memcpy(Buffer,captive_shared_cache_map_get_buffer(SharedCacheMap)+FileOffset->QuadPart,Length);
69
70         IoStatus->Status=STATUS_SUCCESS;
71         IoStatus->Information=Length;
72         r=TRUE;
73
74         g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcCopyRead: r=%d,IoStatus->Status=0x%lX,IoStatus->Information=0x%lX",
75                         r,(!IoStatus ? -1 : (long)IoStatus->Status),(!IoStatus ? -1 : (long)IoStatus->Information));
76
77         return r;
78 }
79
80
81 /**
82  * CcCopyWrite:
83  * @FileObject: Initialized open #FileObject to map.
84  * %NULL value is forbidden.
85  * @FileOffset: The @FileObject file offset from where to map the region from.
86  * Negative value is forbidden.
87  * @Length: Requested length of the region to map from @FileObject.
88  * Value %0 is permitted (no effect of this function call).
89  * @Wait: Whether disk waiting is permitted for this function.
90  * Value %FALSE is currently forbidden by libcaptive as we have no on-demand loading implemented.
91  * @Buffer: Address of memory region with already allocated memory of size @Length.
92  * This address may not be %PAGE_SIZE aligned.
93  * %NULL pointer is forbidden.
94  *
95  * Writes the specified region of the given @Buffer to @FileObject.
96  *
97  * Returns: %TRUE if the region was successfuly written with @Length bytes.
98  */
99 BOOLEAN CcCopyWrite(IN PFILE_OBJECT FileObject,
100                 IN PLARGE_INTEGER FileOffset,IN ULONG Length,IN BOOLEAN Wait,IN PVOID Buffer)
101 {
102 CaptiveSharedCacheMapObject *SharedCacheMap;
103 BOOLEAN r;
104
105         g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcCopyWrite: FileObject=0x%lX,FileOffset=0x%lX,Length=0x%lX,Wait=%d,Buffer=0x%lX",
106                         (long)FileObject,(!FileOffset ? -1 : (long)FileOffset->QuadPart),Length,Wait,(long)Buffer);
107
108         g_return_val_if_fail(FileObject!=NULL,FALSE);
109         g_return_val_if_fail(FileOffset!=NULL,FALSE);
110         g_return_val_if_fail(Wait==TRUE,FALSE);
111         g_return_val_if_fail(Buffer!=NULL,FALSE);
112
113         /* 'FileOffset' may not be PAGE_SIZE aligned */
114         /* 'Length' may not be PAGE_SIZE aligned */
115
116         SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
117
118         captive_shared_cache_map_set_data_valid(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length);
119         captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,FileOffset->QuadPart,FileOffset->QuadPart+Length);
120         memcpy(captive_shared_cache_map_get_buffer(SharedCacheMap)+FileOffset->QuadPart,Buffer,Length);
121         captive_shared_cache_map_set_dirty(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length);
122         r=TRUE;
123
124         g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcCopyWrite: r=%d",r);
125
126         return r;
127 }
128
129
130 BOOLEAN CcZeroData(IN PFILE_OBJECT FileObject,IN PLARGE_INTEGER StartOffset,IN PLARGE_INTEGER EndOffset,IN BOOLEAN Wait)
131 {
132 CaptiveSharedCacheMapObject *SharedCacheMap,*SharedCacheMap_orig;
133 BOOLEAN r;
134
135         g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcZeroData: FileObject=0x%lX,StartOffset=0x%lX,EndOffset=0x%lX,Wait=%d",
136                         (long)FileObject,
137                         (!StartOffset ? -1 : (long)StartOffset->QuadPart),
138                         (!EndOffset ? -1 : (long)EndOffset->QuadPart),
139                         Wait);
140
141         g_return_val_if_fail(FileObject!=NULL,FALSE);
142         g_return_val_if_fail(StartOffset!=NULL,FALSE);
143         g_return_val_if_fail(EndOffset!=NULL,FALSE);
144         g_return_val_if_fail(StartOffset->QuadPart<=EndOffset->QuadPart,FALSE);
145         g_return_val_if_fail((EndOffset->QuadPart-StartOffset->QuadPart)
146                     ==(size_t)(EndOffset->QuadPart-StartOffset->QuadPart),FALSE);
147         /* 'Wait' may be FALSE; used by ext2fsd.sys-v0.10a. */
148
149         /* 'StartOffset' may not be PAGE_SIZE aligned */
150         /* 'EndOffset' may not be PAGE_SIZE aligned */
151
152         g_assert(FileObject->SectionObjectPointer);
153         if ((SharedCacheMap_orig=FileObject->SectionObjectPointer->SharedCacheMap))
154                 SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
155         else {
156 CC_FILE_SIZES FileSizes;
157 static const CACHE_MANAGER_CALLBACKS CallBacks;
158
159                 /* ext2fsd.sys-v0.10a calls us on non-SharedCacheMapped object: */
160                 FileSizes.AllocationSize=*EndOffset;
161                 FileSizes.FileSize=*EndOffset;
162                 FileSizes.ValidDataLength=*EndOffset;
163                 SharedCacheMap=captive_shared_cache_map_get_ref(
164                                 FileObject,     /* FileObject */
165                                 &FileSizes,     /* FileSizes */
166                                 FALSE,  /* PinAccess */
167                                 &CallBacks,     /* CallBacks */
168                                 NULL);  /* LazyWriterContext */
169                 }
170
171         captive_shared_cache_map_set_data_valid(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
172         if (Wait)
173                 captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,StartOffset->QuadPart,EndOffset->QuadPart);
174         else {
175                 captive_shared_cache_map_data_validate_noread(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
176                 }
177         memset(captive_shared_cache_map_get_buffer(SharedCacheMap)+StartOffset->QuadPart,0,EndOffset->QuadPart-StartOffset->QuadPart);
178         captive_shared_cache_map_set_dirty(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
179         r=TRUE;
180
181         if (!SharedCacheMap_orig) {
182                 captive_shared_cache_map_flush(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
183                 g_object_unref(SharedCacheMap);
184                 /* FIXME: Undo captive_shared_cache_map_get_ref:'Currently we never close it.' */
185                 g_object_unref(SharedCacheMap);
186                 }
187
188         g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcZeroData: r=%d",r);
189
190         return r;
191 }