Charles Davis : ntdll: Implement DVD_GetRegion() on both Linux and Mac OS.

Alexandre Julliard julliard at winehq.org
Tue Oct 20 10:33:39 CDT 2009


Module: wine
Branch: master
Commit: ca786887a2bc1311f892d74a1430c58d0bf96b3e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ca786887a2bc1311f892d74a1430c58d0bf96b3e

Author: Charles Davis <cdavis at mymail.mines.edu>
Date:   Mon Oct 19 12:15:24 2009 -0600

ntdll: Implement DVD_GetRegion() on both Linux and Mac OS.

---

 dlls/ntdll/cdrom.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 64 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c
index d3dd54b..70fc1d1 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -2348,13 +2348,73 @@ static NTSTATUS DVD_ReadKey(int fd, PDVD_COPY_PROTECT_KEY key)
 /******************************************************************
  *		DVD_GetRegion
  *
- *
+ * This IOCTL combines information from both IOCTL_DVD_READ_KEY
+ * with key type DvdGetRpcKey and IOCTL_DVD_READ_STRUCTURE with
+ * structure type DvdCopyrightInformation into one structure.
  */
-static NTSTATUS DVD_GetRegion(int dev, PDVD_REGION region)
+static NTSTATUS DVD_GetRegion(int fd, PDVD_REGION region)
 {
-    FIXME("\n");
-    return STATUS_SUCCESS;
+#if defined(linux)
+    NTSTATUS ret = STATUS_NOT_SUPPORTED;
+    dvd_struct dvd;
+    dvd_authinfo auth_info;
+
+    dvd.type = DVD_STRUCT_COPYRIGHT;
+    dvd.copyright.layer_num = 0;
+    auth_info.type = DVD_LU_SEND_RPC_STATE;
+
+    ret = CDROM_GetStatusCode(ioctl( fd, DVD_AUTH, &auth_info ));
 
+    if (ret == STATUS_SUCCESS)
+    {
+        ret = CDROM_GetStatusCode(ioctl( fd, DVD_READ_STRUCT, &dvd ));
+
+        if (ret == STATUS_SUCCESS)
+        {
+            region->CopySystem = dvd.copyright.cpst;
+            region->RegionData = dvd.copyright.rmi;
+            region->SystemRegion = auth_info.lrpcs.region_mask;
+            region->ResetCount = auth_info.lrpcs.ucca;
+        }
+    }
+    return ret;
+#elif defined(__FreeBSD__) || defined(__NetBSD__)
+    TRACE("bsd\n");
+    return STATUS_NOT_SUPPORTED;
+#elif defined(__APPLE__)
+    dk_dvd_report_key_t key;
+    dk_dvd_read_structure_t dvd;
+    DVDRegionPlaybackControlInfo rpc;
+    DVDCopyrightInfo copy;
+    NTSTATUS ret = STATUS_NOT_SUPPORTED;
+
+    key.format = kDVDKeyFormatRegionState;
+    key.keyClass = kDVDKeyClassCSS_CPPM_CPRM;
+    key.bufferLength = sizeof(rpc);
+    key.buffer = &rpc;
+    dvd.format = kDVDStructureFormatCopyrightInfo;
+    dvd.bufferLength = sizeof(copy);
+    dvd.buffer = &copy;
+
+    ret = CDROM_GetStatusCode(ioctl( fd, DKIOCDVDREPORTKEY, &key ));
+
+    if (ret == STATUS_SUCCESS)
+    {
+        ret = CDROM_GetStatusCode(ioctl( fd, DKIOCDVDREADSTRUCTURE, &dvd ));
+
+        if (ret == STATUS_SUCCESS)
+        {
+            region->CopySystem = copy.copyrightProtectionSystemType;
+            region->RegionData = copy.regionMask;
+            region->SystemRegion = rpc.driveRegion;
+            region->ResetCount = rpc.numberUserResets;
+        }
+    }
+    return ret;
+#else
+    FIXME("\n");
+    return STATUS_NOT_SUPPORTED;
+#endif
 }
 
 /******************************************************************




More information about the wine-cvs mailing list