OSDN Git Service

SlimDXの改造後コード。(June2010を変更したもの。)
[dtxmania/dtxmania.git] / SlimDXc_Jun2010(VC++2008) / source / ComObject.cpp
1 #include "stdafx.h"\r
2 /*\r
3 * Copyright (c) 2007-2010 SlimDX Group\r
4\r
5 * Permission is hereby granted, free of charge, to any person obtaining a copy\r
6 * of this software and associated documentation files (the "Software"), to deal\r
7 * in the Software without restriction, including without limitation the rights\r
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
9 * copies of the Software, and to permit persons to whom the Software is\r
10 * furnished to do so, subject to the following conditions:\r
11\r
12 * The above copyright notice and this permission notice shall be included in\r
13 * all copies or substantial portions of the Software.\r
14\r
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
21 * THE SOFTWARE.\r
22 */\r
23 \r
24 #include "ComObject.h"\r
25 #include "Configuration.h"\r
26 \r
27 using namespace System;\r
28 \r
29 namespace SlimDX\r
30 {\r
31         ComObject::ComObject()\r
32         {\r
33         }\r
34 \r
35         ComObject::~ComObject()\r
36         {\r
37                 if( m_Owner != nullptr )\r
38                         return;\r
39 \r
40                 Destruct();\r
41         }\r
42 \r
43         bool ComObject::Disposed::get()\r
44         {\r
45                 if( m_Unknown == 0 )\r
46                         return true;\r
47 \r
48                 if( !ObjectTable::Contains( this ) )\r
49                         return true;\r
50 \r
51                 return false;\r
52         }\r
53         \r
54         IntPtr ComObject::ComPointer::get()\r
55         {\r
56                 return IntPtr( m_Unknown );\r
57         }\r
58 \r
59         ComObject^ ComObject::Owner::get()\r
60         {\r
61                 return m_Owner;\r
62         }\r
63         \r
64         void ComObject::Owner::set( ComObject^ value )\r
65         {\r
66                 m_Owner = value;\r
67         }\r
68 \r
69         IUnknown* ComObject::UnknownPointer::get()\r
70         {\r
71                 return m_Unknown;\r
72         }\r
73         \r
74         IUnknown* ComObject::InternalPointer::get()\r
75         {\r
76                 return m_Unknown;\r
77         }\r
78         \r
79         void ComObject::SetFlags( ComObjectFlags flags )\r
80         {\r
81                 m_Flags = flags;\r
82         }\r
83         \r
84         void ComObject::SetSource( System::Diagnostics::StackTrace^ stack )\r
85         {\r
86                 m_Source = stack;\r
87         }\r
88 \r
89         System::Diagnostics::StackTrace^ ComObject::CreationSource::get()\r
90         {\r
91                 return m_Source;\r
92         }\r
93 \r
94         void ComObject::SetCreationTime( int time )\r
95         {\r
96                 m_CreationTime = time;\r
97         }\r
98 \r
99         int ComObject::CreationTime::get()\r
100         {\r
101                 return m_CreationTime;\r
102         }\r
103         \r
104         void ComObject::Construct( IUnknown* pointer )\r
105         {\r
106                 Construct( pointer, nullptr );\r
107         }\r
108         \r
109         void ComObject::Construct( IUnknown* pointer, ComObject^ owner )\r
110         {\r
111                 if( pointer == 0 )\r
112                         throw gcnew ArgumentNullException( "pointer" );\r
113 \r
114                 m_Unknown = pointer;\r
115                 ObjectTable::Add( this, owner );\r
116         }\r
117 \r
118         void ComObject::Construct( IntPtr pointer, Guid guid )\r
119         {\r
120                 if( pointer == IntPtr::Zero )\r
121                         throw gcnew ArgumentNullException( "pointer" );\r
122 \r
123                 void* result = 0;\r
124                 IUnknown* unknown = static_cast<IUnknown*>( pointer.ToPointer() );\r
125                 HRESULT hr = unknown->QueryInterface( Utilities::ConvertManagedGuid( guid ), &result );\r
126                 if( FAILED( hr ) )\r
127                         throw gcnew InvalidCastException( "Failed to QueryInterface on user-supplied pointer." );\r
128 \r
129                 Construct( unknown );\r
130         }\r
131 \r
132         void ComObject::Destruct()\r
133         {\r
134                 if( m_Unknown == 0 || !ObjectTable::Remove( this ) )\r
135                 {\r
136                         // test for CreationTime is to avoid throwing ObjectDisposedException when\r
137                         // a constructor for an object fails\r
138                         if( Configuration::DetectDoubleDispose && CreationTime != 0 )\r
139                         {\r
140                                 Type^ myType = GetType();\r
141                                 throw gcnew ObjectDisposedException( myType->FullName );\r
142                         }\r
143                 }\r
144                 else\r
145                 {\r
146                         if( static_cast<int>( m_Flags & ComObjectFlags::IsAncillary ) == 0 )\r
147                                 m_Unknown->Release();\r
148 \r
149                         m_Unknown = 0;\r
150                 }\r
151         }\r
152 }