Added skeleton for FreeBSD device handling.

This commit is contained in:
2016-04-13 16:28:50 +01:00
parent 53a926c135
commit 93474f1a9c
7 changed files with 619 additions and 4 deletions

View File

@@ -72,6 +72,10 @@
<Compile Include="Device\AtaCommands\Smart.cs" /> <Compile Include="Device\AtaCommands\Smart.cs" />
<Compile Include="Device\AtaCommands\Cfa.cs" /> <Compile Include="Device\AtaCommands\Cfa.cs" />
<Compile Include="Device\AtaCommands\MCPT.cs" /> <Compile Include="Device\AtaCommands\MCPT.cs" />
<Compile Include="FreeBSD\Command.cs" />
<Compile Include="FreeBSD\Enums.cs" />
<Compile Include="FreeBSD\Extern.cs" />
<Compile Include="FreeBSD\Structs.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>
@@ -80,6 +84,7 @@
<Folder Include="Device\" /> <Folder Include="Device\" />
<Folder Include="Device\ScsiCommands\" /> <Folder Include="Device\ScsiCommands\" />
<Folder Include="Device\AtaCommands\" /> <Folder Include="Device\AtaCommands\" />
<Folder Include="FreeBSD\" />
</ItemGroup> </ItemGroup>
<ProjectExtensions> <ProjectExtensions>
<MonoDevelop> <MonoDevelop>

View File

@@ -0,0 +1,49 @@
// /***************************************************************************
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : Command.cs
// Version : 1.0
// Author(s) : Natalia Portillo
//
// Component : Component
//
// Revision : $Revision$
// Last change by : $Author$
// Date : $Date$
//
// --[ Description ] ----------------------------------------------------------
//
// Contains a high level representation of the FreeBSD syscalls used to directly
// interface devices
//
// --[ License ] --------------------------------------------------------------
//
// 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, either version 3 of the
// License, or (at your option) any later version.
//
// 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, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright (C) 2011-2015 Claunia.com
// ****************************************************************************/
// //$Id$
using System;
namespace DiscImageChef.Devices.FreeBSD
{
public class Command
{
public Command()
{
}
}
}

View File

@@ -0,0 +1,261 @@
// /// <summary>**************************************************************************
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : Enums.cs
// Version : 1.0
// Author(s) : Natalia Portillo
//
// Component : Linux direct device access
//
// Revision : $Revision$
// Last change by : $Author$
// Date : $Date$
//
// --[ Description ] ----------------------------------------------------------
//
// Contains enumerations necessary for directly interfacing devices under FreeBSD
//
// --[ License ] --------------------------------------------------------------
//
// 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, either version 3 of the
// License, or (at your option) any later version.
//
// 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, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright (C) 2011-2015 Claunia.com
// ***************************************************************************</summary>
// //$Id$
using System;
namespace DiscImageChef.Devices.FreeBSD
{
[Flags]
enum FileFlags : int
{
/// <summary>
/// O_RDONLY
///</summary>
ReadOnly = 0x00000000,
/// <summary>
/// O_WRONLY
///</summary>
WriteOnly = 0x00000001,
/// <summary>
/// O_RDWR
///</summary>
ReadWrite = 0x00000002,
/// <summary>
/// O_NONBLOCK
///</summary>
NonBlocking = 0x00000004,
/// <summary>
/// O_APPEND
///</summary>
Append = 0x00000008,
/// <summary>
/// O_SHLOCK
///</summary>
SharedLock = 0x00000010,
/// <summary>
/// O_EXLOCK
///</summary>
ExclusiveLock = 0x00000020,
/// <summary>
/// O_ASYNC
///</summary>
Async = 0x00000040,
/// <summary>
/// O_FSYNC
///</summary>
SyncWrites = 0x00000080,
/// <summary>
/// O_NOFOLLOW
///</summary>
NoFollowSymlink = 0x00000100,
/// <summary>
/// O_CREAT
///</summary>
OpenOrCreate = 0x00000200,
/// <summary>
/// O_TRUNC
///</summary>
Truncate = 0x00000400,
/// <summary>
/// O_EXCL
///</summary>
CreateNew = 0x00000800,
/// <summary>
/// O_NOCTTY
///</summary>
NoControlTTY = 0x00008000,
/// <summary>
/// O_DIRECT
///</summary>
Direct = 0x00010000,
/// <summary>
/// O_DIRECTORY
///</summary>
Directory = 0x00020000,
/// <summary>
/// O_EXEC
///</summary>
Execute = 0x00040000,
/// <summary>
/// O_TTY_INIT
///</summary>
InitializeTTY = 0x00080000,
/// <summary>
/// O_CLOEXEC
///</summary>
CloseOnExec = 0x00100000
}
[Flags]
enum CamAtaIoFlags : byte
{
/// <summary>
/// 48-bit command
///</summary>
ExtendedCommand = 0x01,
/// <summary>
/// FPDMA command
///</summary>
FPDMA = 0x02,
/// <summary>
/// Control, not a command
///</summary>
Control = 0x04,
/// <summary>
/// Needs result
///</summary>
NeedResult = 0x08,
/// <summary>
/// DMA command
///</summary>
DMA = 0x10
}
/// <summary>XPT Opcodes for xpt_action</summary>
[Flags]
enum xpt_opcode
{
// Function code flags are bits greater than 0xff
/// <summary>Non-immediate function code</summary>
XPT_FC_QUEUED = 0x100,
XPT_FC_USER_CCB = 0x200,
/// <summary>Only for the transport layer device</summary>
XPT_FC_XPT_ONLY = 0x400,
/// <summary>Passes through the device queues</summary>
XPT_FC_DEV_QUEUED = 0x800 | XPT_FC_QUEUED,
// Common function commands: 0x00->0x0F
/// <summary>Execute Nothing</summary>
XPT_NOOP = 0x00,
/// <summary>Execute the requested I/O operation</summary>
XPT_SCSI_IO = 0x01 | XPT_FC_DEV_QUEUED,
/// <summary>Get type information for specified device</summary>
XPT_GDEV_TYPE = 0x02,
/// <summary>Get a list of peripheral devices</summary>
XPT_GDEVLIST = 0x03,
/// <summary>Path routing inquiry</summary>
XPT_PATH_INQ = 0x04,
/// <summary>Release a frozen device queue</summary>
XPT_REL_SIMQ = 0x05,
/// <summary>Set Asynchronous Callback Parameters</summary>
XPT_SASYNC_CB = 0x06,
/// <summary>Set device type information</summary>
XPT_SDEV_TYPE = 0x07,
/// <summary>(Re)Scan the SCSI Bus</summary>
XPT_SCAN_BUS = 0x08 | XPT_FC_QUEUED | XPT_FC_USER_CCB
| XPT_FC_XPT_ONLY,
/// <summary>Get EDT entries matching the given pattern</summary>
XPT_DEV_MATCH = 0x09 | XPT_FC_XPT_ONLY,
/// <summary>Turn on debugging for a bus, target or lun</summary>
XPT_DEBUG = 0x0a,
/// <summary>Path statistics (error counts, etc.)</summary>
XPT_PATH_STATS = 0x0b,
/// <summary>Device statistics (error counts, etc.)</summary>
XPT_GDEV_STATS = 0x0c,
/// <summary>Get/Set Device advanced information</summary>
XPT_DEV_ADVINFO = 0x0e,
/// <summary>Asynchronous event</summary>
XPT_ASYNC = 0x0f | XPT_FC_QUEUED | XPT_FC_USER_CCB
| XPT_FC_XPT_ONLY,
/// <summary>SCSI Control Functions: 0x10->0x1F</summary>
/// <summary>Abort the specified CCB</summary>
XPT_ABORT = 0x10,
/// <summary>Reset the specified SCSI bus</summary>
XPT_RESET_BUS = 0x11 | XPT_FC_XPT_ONLY,
/// <summary>Bus Device Reset the specified SCSI device</summary>
XPT_RESET_DEV = 0x12 | XPT_FC_DEV_QUEUED,
/// <summary>Terminate the I/O process</summary>
XPT_TERM_IO = 0x13,
/// <summary>Scan Logical Unit</summary>
XPT_SCAN_LUN = 0x14 | XPT_FC_QUEUED | XPT_FC_USER_CCB
| XPT_FC_XPT_ONLY,
/// <summary>Get default/user transfer settings for the target</summary>
XPT_GET_TRAN_SETTINGS = 0x15,
/// <summary>Set transfer rate/width negotiation settings</summary>
XPT_SET_TRAN_SETTINGS = 0x16,
/// <summary>Calculate the geometry parameters for a device give the sector size and volume size.</summary>
XPT_CALC_GEOMETRY = 0x17,
/// <summary>Execute the requested ATA I/O operation</summary>
XPT_ATA_IO = 0x18 | XPT_FC_DEV_QUEUED,
/// <summary>Compat only</summary>
XPT_GET_SIM_KNOB_OLD = 0x18,
/// <summary>Set SIM specific knob values.</summary>
XPT_SET_SIM_KNOB = 0x19,
/// <summary>Get SIM specific knob values.</summary>
XPT_GET_SIM_KNOB = 0x1a,
/// <summary>Serial Management Protocol</summary>
XPT_SMP_IO = 0x1b | XPT_FC_DEV_QUEUED,
/// <summary>Scan Target</summary>
XPT_SCAN_TGT = 0x1E | XPT_FC_QUEUED | XPT_FC_USER_CCB
| XPT_FC_XPT_ONLY,
// HBA engine commands 0x20->0x2F
/// <summary>HBA engine feature inquiry</summary>
XPT_ENG_INQ = 0x20 | XPT_FC_XPT_ONLY,
/// <summary>HBA execute engine request</summary>
XPT_ENG_EXEC = 0x21 | XPT_FC_DEV_QUEUED,
// Target mode commands: 0x30->0x3F
/// <summary>Enable LUN as a target</summary>
XPT_EN_LUN = 0x30,
/// <summary>Execute target I/O request</summary>
XPT_TARGET_IO = 0x31 | XPT_FC_DEV_QUEUED,
/// <summary>Accept Host Target Mode CDB</summary>
XPT_ACCEPT_TARGET_IO = 0x32 | XPT_FC_QUEUED | XPT_FC_USER_CCB,
/// <summary>Continue Host Target I/O Connection</summary>
XPT_CONT_TARGET_IO = 0x33 | XPT_FC_DEV_QUEUED,
/// <summary>Notify Host Target driver of event (obsolete)</summary>
XPT_IMMED_NOTIFY = 0x34 | XPT_FC_QUEUED | XPT_FC_USER_CCB,
/// <summary>Acknowledgement of event (obsolete)</summary>
XPT_NOTIFY_ACK = 0x35,
/// <summary>Notify Host Target driver of event</summary>
XPT_IMMEDIATE_NOTIFY = 0x36 | XPT_FC_QUEUED | XPT_FC_USER_CCB,
/// <summary>Acknowledgement of event</summary>
XPT_NOTIFY_ACKNOWLEDGE = 0x37 | XPT_FC_QUEUED | XPT_FC_USER_CCB,
/// <summary>Vendor Unique codes: 0x80->0x8F</summary>
XPT_VUNIQUE = 0x80
}
}

View File

@@ -0,0 +1,73 @@
// /***************************************************************************
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : Extern.cs
// Version : 1.0
// Author(s) : Natalia Portillo
//
// Component : Component
//
// Revision : $Revision$
// Last change by : $Author$
// Date : $Date$
//
// --[ Description ] ----------------------------------------------------------
//
// Contains the P/Invoke definitions of FreeBSD syscalls used to directly interface devices
//
// --[ License ] --------------------------------------------------------------
//
// 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, either version 3 of the
// License, or (at your option) any later version.
//
// 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, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright (C) 2011-2015 Claunia.com
// ****************************************************************************/
// //$Id$
using System;
using System.Runtime.InteropServices;
namespace DiscImageChef.Devices.FreeBSD
{
static class Extern
{
[DllImport("libc", CharSet = CharSet.Ansi, SetLastError = true)]
internal static extern int open(
string pathname,
[MarshalAs(UnmanagedType.U4)]
FileFlags flags);
[DllImport("libc")]
internal static extern int close(int fd);
[DllImport("libcam", CharSet = CharSet.Ansi, SetLastError = true)]
internal static extern IntPtr cam_open_device(
string path,
[MarshalAs(UnmanagedType.U4)]
FileFlags flags);
[DllImport("libcam", CharSet = CharSet.Ansi, SetLastError = true)]
internal static extern void cam_close_device(IntPtr dev);
[DllImport("libcam", CharSet = CharSet.Ansi, SetLastError = true)]
internal static extern IntPtr cam_getccb(IntPtr dev);
[DllImport("libcam", CharSet = CharSet.Ansi, SetLastError = true)]
internal static extern void cam_freeccb(IntPtr ccb);
[DllImport("libcam", CharSet = CharSet.Ansi, SetLastError = true)]
internal static extern int cam_send_ccb(IntPtr dev, IntPtr ccb);
}
}

View File

@@ -0,0 +1,226 @@
// /***************************************************************************
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : Structs.cs
// Version : 1.0
// Author(s) : Natalia Portillo
//
// Component : Component
//
// Revision : $Revision$
// Last change by : $Author$
// Date : $Date$
//
// --[ Description ] ----------------------------------------------------------
//
// Contains structures necessary for directly interfacing devices under FreeBSD
//
// --[ License ] --------------------------------------------------------------
//
// 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, either version 3 of the
// License, or (at your option) any later version.
//
// 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, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright (C) 2011-2015 Claunia.com
// ****************************************************************************/
// //$Id$
using System;
using System.Runtime.InteropServices;
namespace DiscImageChef.Devices.FreeBSD
{
struct ata_cmd
{
public CamAtaIoFlags flags;
public byte command;
public byte features;
public byte lba_low;
public byte lba_mid;
public byte lba_high;
public byte device;
public byte lba_low_exp;
public byte lba_mid_exp;
public byte lba_high_exp;
public byte features_exp;
public byte sector_count;
public byte sector_count_exp;
public byte control;
}
struct ata_res
{
public CamAtaIoFlags flags;
public byte status;
public byte error;
public byte lba_low;
public byte lba_mid;
public byte lba_high;
public byte device;
public byte lba_low_exp;
public byte lba_mid_exp;
public byte lba_high_exp;
public byte sector_count;
public byte sector_count_exp;
}
struct cam_pinfo
{
public UInt32 priority;
public UInt32 generation;
public int index;
}
struct camq_entry
{
/// <summary>
/// LIST_ENTRY(ccb_hdr)=le->*le_next
/// </summary>
public IntPtr le_next;
/// <summary>
/// LIST_ENTRY(ccb_hdr)=le->**le_prev
/// </summary>
public IntPtr le_prev;
/// <summary>
/// SLIST_ENTRY(ccb_hdr)=sle->*sle_next
/// </summary>
public IntPtr sle_next;
/// <summary>
/// TAILQ_ENTRY(ccb_hdr)=tqe->*tqe_next
/// </summary>
public IntPtr tqe_next;
/// <summary>
/// TAILQ_ENTRY(ccb_hdr)=tqe->**tqe_prev
/// </summary>
public IntPtr tqe_prev;
/// <summary>
/// STAILQ_ENTRY(ccb_hdr)=stqe->*stqe_next
/// </summary>
public IntPtr stqe_next;
}
struct timeval
{
public Int64 tv_sec;
/// <summary>long</summary>
public IntPtr tv_usec;
}
struct ccb_qos_area
{
public timeval etime;
public UIntPtr sim_data;
public UIntPtr periph_data;
}
struct ccb_hdr
{
public cam_pinfo pinfo;
public camq_entry xpt_links;
public camq_entry sim_links;
public camq_entry periph_links;
public UInt32 retry_count;
public IntPtr cbfcnp;
public xpt_opcode func_code;
public UInt32 status;
public IntPtr path;
public uint path_id;
public uint target_id;
public UInt64 target_lun;
public UInt32 flags;
public UInt32 xflags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public IntPtr[] periph_priv;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public IntPtr[] sim_priv;
public ccb_qos_area qos;
public UInt32 timeout;
public timeval softtimeout;
}
struct scsi_sense_data
{
public byte error_code;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 251)]
public byte[] sense_buf;
}
/// <summary>
/// SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO function codes.
/// </summary>
struct cdb_scsiio
{
public ccb_hdr ccb_h;
/// <summary>Ptr for next CCB for action</summary>
public IntPtr next_ccb;
/// <summary>Ptr to mapping info</summary>
public IntPtr req_map;
/// <summary>Ptr to the data buf/SG list</summary>
public IntPtr data_ptr;
/// <summary>Data transfer length</summary>
public UInt32 dxfer_len;
/// <summary>Autosense storage</summary>
public scsi_sense_data sense_data;
/// <summary>Number of bytes to autosense</summary>
public byte sense_len;
/// <summary>Number of bytes for the CDB</summary>
public byte cdb_len;
/// <summary>Number of SG list entries</summary>
public UInt16 sglist_cnt;
/// <summary>Returned SCSI status</summary>
public byte scsi_status;
/// <summary>Autosense resid length: 2's comp</summary>
public sbyte sense_resid;
/// <summary>Transfer residual length: 2's comp</summary>
public Int32 resid;
/// <summary>Union for CDB bytes/pointer</summary>
public IntPtr cdb_io;
/// <summary>Pointer to the message buffer</summary>
public IntPtr msg_ptr;
/// <summary>Number of bytes for the Message</summary>
public UInt16 msg_len;
/// <summary>What to do for tag queueing. The tag action should be either the define below (to send a non-tagged transaction) or one of the defined scsi tag messages from scsi_message.h.</summary>
public byte tag_action;
/// <summary>tag id from initator (target mode)</summary>
public UInt32 tag_id;
/// <summary>initiator id of who selected</summary>
public UInt32 init_id;
}
/// <summary>
/// ATA I/O Request CCB used for the XPT_ATA_IO function code.
/// </summary>
struct ccb_ataio
{
public ccb_hdr ccb_h;
/// <summary>Ptr for next CCB for action</summary>
public IntPtr next_ccb;
/// <summary>ATA command register set</summary>
public ata_cmd cmd;
/// <summary>ATA result register set</summary>
public ata_res res;
/// <summary>Ptr to the data buf/SG list</summary>
public IntPtr data_ptr;
/// <summary>Data transfer length</summary>
public UInt32 dxfer_len;
/// <summary>Transfer residual length: 2's comp</summary>
public Int32 resid;
/// <summary>What to do for tag queueing. The tag action should be either the define below (to send a non-tagged transaction) or one of the defined scsi tag messages from scsi_message.h.</summary>
public byte tag_action;
/// <summary>tag id from initator (target mode)</summary>
public UInt32 tag_id;
/// <summary>initiator id of who selected</summary>
public UInt32 init_id;
}
}

View File

@@ -102,9 +102,9 @@ Global
$1.Text = @/***************************************************************************\nThe Disc Image Chef\n----------------------------------------------------------------------------\n \nFilename : ${FileName}\nVersion : 1.0\nAuthor(s) : ${AuthorName}\n \nComponent : Component\n\nRevision : $Revision$\nLast change by : $Author$\nDate : $Date$\n \n--[ Description ] ----------------------------------------------------------\n \nDescription\n \n--[ License ] --------------------------------------------------------------\n \n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n----------------------------------------------------------------------------\nCopyright (C) 2011-2015 Claunia.com\n****************************************************************************/\n//$Id$ $1.Text = @/***************************************************************************\nThe Disc Image Chef\n----------------------------------------------------------------------------\n \nFilename : ${FileName}\nVersion : 1.0\nAuthor(s) : ${AuthorName}\n \nComponent : Component\n\nRevision : $Revision$\nLast change by : $Author$\nDate : $Date$\n \n--[ Description ] ----------------------------------------------------------\n \nDescription\n \n--[ License ] --------------------------------------------------------------\n \n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as\n published by the Free Software Foundation, either version 3 of the\n License, or (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n----------------------------------------------------------------------------\nCopyright (C) 2011-2015 Claunia.com\n****************************************************************************/\n//$Id$
$1.IncludeInNewFiles = True $1.IncludeInNewFiles = True
$0.TextStylePolicy = $2 $0.TextStylePolicy = $2
$2.inheritsSet = null $2.inheritsSet = VisualStudio
$2.inheritsScope = text/plain $2.inheritsScope = text/plain
$2.scope = application/config+xml $2.scope = text/x-csharp
$2.FileWidth = 120 $2.FileWidth = 120
$0.CSharpFormattingPolicy = $3 $0.CSharpFormattingPolicy = $3
$3.SpacingAfterMethodDeclarationName = False $3.SpacingAfterMethodDeclarationName = False
@@ -130,6 +130,7 @@ Global
$3.NewLineForClausesInQuery = True $3.NewLineForClausesInQuery = True
$3.IndentBlock = False $3.IndentBlock = False
$3.IndentSwitchCaseSection = False $3.IndentSwitchCaseSection = False
$3.SpaceAfterControlFlowStatementKeyword = False
$0.DotNetNamingPolicy = $4 $0.DotNetNamingPolicy = $4
$4.DirectoryNamespaceAssociation = Hierarchical $4.DirectoryNamespaceAssociation = Hierarchical
$4.ResourceNamePolicy = MSBuild $4.ResourceNamePolicy = MSBuild

View File

@@ -83,8 +83,8 @@
<MessageStyle LastFilePostfix=":&#xA; " IncludeDirectoryPaths="True" /> <MessageStyle LastFilePostfix=":&#xA; " IncludeDirectoryPaths="True" />
</ChangeLogPolicy> </ChangeLogPolicy>
<DotNetNamingPolicy DirectoryNamespaceAssociation="PrefixedHierarchical" ResourceNamePolicy="MSBuild" /> <DotNetNamingPolicy DirectoryNamespaceAssociation="PrefixedHierarchical" ResourceNamePolicy="MSBuild" />
<TextStylePolicy inheritsSet="VisualStudio" inheritsScope="text/plain" scope="text/x-csharp" /> <TextStylePolicy FileWidth="120" inheritsSet="VisualStudio" inheritsScope="text/plain" scope="text/x-csharp" />
<CSharpFormattingPolicy NewLinesForBracesInProperties="True" NewLinesForBracesInAccessors="True" NewLinesForBracesInAnonymousMethods="True" NewLinesForBracesInControlBlocks="True" NewLinesForBracesInAnonymousTypes="True" NewLinesForBracesInObjectCollectionArrayInitializers="True" NewLinesForBracesInLambdaExpressionBody="True" NewLineForElse="True" NewLineForCatch="True" NewLineForFinally="True" SpacingAfterMethodDeclarationName="False" SpaceAfterMethodCallName="False" inheritsSet="Mono" inheritsScope="text/x-csharp" scope="text/x-csharp" /> <CSharpFormattingPolicy IndentSwitchSection="True" NewLinesForBracesInProperties="True" NewLinesForBracesInAccessors="True" NewLinesForBracesInAnonymousMethods="True" NewLinesForBracesInControlBlocks="True" NewLinesForBracesInAnonymousTypes="True" NewLinesForBracesInObjectCollectionArrayInitializers="True" NewLinesForBracesInLambdaExpressionBody="True" NewLineForElse="True" NewLineForCatch="True" NewLineForFinally="True" NewLineForMembersInObjectInit="True" NewLineForMembersInAnonymousTypes="True" NewLineForClausesInQuery="True" SpacingAfterMethodDeclarationName="False" SpaceAfterMethodCallName="False" SpaceBeforeOpenSquareBracket="False" inheritsSet="Mono" inheritsScope="text/x-csharp" scope="text/x-csharp" />
<TextStylePolicy inheritsSet="VisualStudio" inheritsScope="text/plain" scope="text/plain" /> <TextStylePolicy inheritsSet="VisualStudio" inheritsScope="text/plain" scope="text/plain" />
<NameConventionPolicy> <NameConventionPolicy>
<Rules> <Rules>