Rewritten Cache Manager to better match its W32 original behaviour
[captive.git] / src / libcaptive / cc / copy.c
diff --git a/src/libcaptive/cc/copy.c b/src/libcaptive/cc/copy.c
new file mode 100644 (file)
index 0000000..1e17f2e
--- /dev/null
@@ -0,0 +1,142 @@
+/* $Id$
+ * reactos Cache Manager (Cc*) CcCopy*() handling of libcaptive
+ * Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; exactly version 2 of June 1991 is required
+ * 
+ * This program 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 General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include "config.h"
+
+#include "privatebcbpin.h"
+#include "reactos/ddk/status.h"
+#include "captive/macros.h"
+
+
+/**
+ * CcCopyRead:
+ * @FileObject: Initialized open #FileObject to map.
+ * %NULL value is forbidden.
+ * @FileOffset: The @FileObject file offset from where to map the region from.
+ * Negative value is forbidden.
+ * @Length: Requested length of the region to map from @FileObject.
+ * Value %0 is permitted (no effect of this function call).
+ * @Wait: Whether disk waiting is permitted for this function.
+ * Value %FALSE is currently forbidden by libcaptive as we have no on-demand loading implemented.
+ * @Buffer: Address of memory region with already allocated memory of size @Length.
+ * This address may not be %PAGE_SIZE aligned.
+ * %NULL pointer is forbidden.
+ * @IoStatus: #PIO_STATUS_BLOCK to return status of this operation.
+ * %NULL pointer is forbidden.
+ *
+ * Reads the specified region of @FileObject to the given @Buffer.
+ * No on-demand loading is in effect.
+ *
+ * Returns: %TRUE if the region was successfuly filled with @Length bytes.
+ * @IoStatus.Status initialized by %STATUS_SUCCESS if successful.
+ * @IoStatus.Information initialized by @Length if successful.
+ */
+BOOLEAN CcCopyRead(IN PFILE_OBJECT FileObject,
+               IN PLARGE_INTEGER FileOffset,IN ULONG Length,IN BOOLEAN Wait,OUT PVOID Buffer,OUT PIO_STATUS_BLOCK IoStatus)
+{
+CaptiveSharedCacheMapObject *SharedCacheMap;
+
+       g_return_val_if_fail(FileObject!=NULL,FALSE);
+       g_return_val_if_fail(FileOffset!=NULL,FALSE);
+       g_return_val_if_fail(Wait==TRUE,FALSE);
+       g_return_val_if_fail(Buffer!=NULL,FALSE);
+       g_return_val_if_fail(IoStatus!=NULL,FALSE);
+
+       g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: FileObject=%p,FileOffset=0x%llX,Length=0x%lX,Wait=%d",G_STRLOC,
+                       FileObject,(guint64)FileOffset->QuadPart,(gulong)Length,(gint)Wait);
+
+       SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
+
+       captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,FileOffset->QuadPart,FileOffset->QuadPart+Length);
+       memcpy(Buffer,captive_shared_cache_map_get_buffer(SharedCacheMap)+FileOffset->QuadPart,Length);
+
+       IoStatus->Status=STATUS_SUCCESS;
+       IoStatus->Information=Length;
+
+       return TRUE;
+}
+
+
+/**
+ * CcCopyWrite:
+ * @FileObject: Initialized open #FileObject to map.
+ * %NULL value is forbidden.
+ * @FileOffset: The @FileObject file offset from where to map the region from.
+ * Negative value is forbidden.
+ * @Length: Requested length of the region to map from @FileObject.
+ * Value %0 is permitted (no effect of this function call).
+ * @Wait: Whether disk waiting is permitted for this function.
+ * Value %FALSE is currently forbidden by libcaptive as we have no on-demand loading implemented.
+ * @Buffer: Address of memory region with already allocated memory of size @Length.
+ * This address may not be %PAGE_SIZE aligned.
+ * %NULL pointer is forbidden.
+ *
+ * Writes the specified region of the given @Buffer to @FileObject.
+ *
+ * Returns: %TRUE if the region was successfuly written with @Length bytes.
+ */
+BOOLEAN CcCopyWrite(IN PFILE_OBJECT FileObject,
+               IN PLARGE_INTEGER FileOffset,IN ULONG Length,IN BOOLEAN Wait,IN PVOID Buffer)
+{
+CaptiveSharedCacheMapObject *SharedCacheMap;
+
+       g_return_val_if_fail(FileObject!=NULL,FALSE);
+       g_return_val_if_fail(FileOffset!=NULL,FALSE);
+       g_return_val_if_fail(Wait==TRUE,FALSE);
+       g_return_val_if_fail(Buffer!=NULL,FALSE);
+
+       g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: FileObject=%p,FileOffset=0x%llX,Length=0x%lX,Wait=%d",G_STRLOC,
+                       FileObject,(guint64)FileOffset->QuadPart,(gulong)Length,(gint)Wait);
+
+       g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(FileOffset->QuadPart,PAGE_SIZE));    /* NOT YET IMPLEMENTED */
+       g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING(Length,PAGE_SIZE));    /* NOT YET IMPLEMENTED */
+
+       SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
+
+       captive_shared_cache_map_set_data_valid(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length);
+       memcpy(captive_shared_cache_map_get_buffer(SharedCacheMap)+FileOffset->QuadPart,Buffer,Length);
+       captive_shared_cache_map_set_dirty(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length);
+
+       return TRUE;
+}
+
+
+BOOLEAN CcZeroData(IN PFILE_OBJECT FileObject,IN PLARGE_INTEGER StartOffset,IN PLARGE_INTEGER EndOffset,IN BOOLEAN Wait)
+{
+CaptiveSharedCacheMapObject *SharedCacheMap;
+
+       g_return_val_if_fail(FileObject!=NULL,FALSE);
+       g_return_val_if_fail(StartOffset!=NULL,FALSE);
+       g_return_val_if_fail(EndOffset!=NULL,FALSE);
+       g_return_val_if_fail(StartOffset->QuadPart<=EndOffset->QuadPart,FALSE);
+       g_return_val_if_fail((EndOffset->QuadPart-StartOffset->QuadPart)
+                   ==(size_t)(EndOffset->QuadPart-StartOffset->QuadPart),FALSE);
+       g_return_val_if_fail(Wait==TRUE,FALSE);
+
+       g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(StartOffset->QuadPart,PAGE_SIZE));   /* NOT YET IMPLEMENTED */
+       g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(EndOffset->QuadPart,PAGE_SIZE));     /* NOT YET IMPLEMENTED */
+
+       SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
+
+       captive_shared_cache_map_set_data_valid(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
+       memset(captive_shared_cache_map_get_buffer(SharedCacheMap)+StartOffset->QuadPart,0,EndOffset->QuadPart-StartOffset->QuadPart);
+       captive_shared_cache_map_set_dirty(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
+
+       return TRUE;
+}