1/*
2 * Copyright (c) 1998-2013 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24#include "DACallback.h"
25
26DACallbackRef DACallbackCreate( CFAllocatorRef   allocator,
27                                DASessionRef     session,
28                                mach_vm_offset_t address,
29                                mach_vm_offset_t context,
30                                _DACallbackKind  kind,
31                                CFIndex          order,
32                                CFDictionaryRef  match,
33                                CFArrayRef       watch )
34{
35    CFMutableDictionaryRef callback;
36
37    callback = CFDictionaryCreateMutable( allocator, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks );
38
39    if ( callback )
40    {
41        CFDictionarySetValue( callback, _kDACallbackSessionKey, session );
42
43        ___CFDictionarySetIntegerValue( callback, _kDACallbackAddressKey, address );
44        ___CFDictionarySetIntegerValue( callback, _kDACallbackContextKey, context );
45        ___CFDictionarySetIntegerValue( callback, _kDACallbackKindKey,    kind    );
46        ___CFDictionarySetIntegerValue( callback, _kDACallbackOrderKey,   order   );
47
48        if ( match )  CFDictionarySetValue( callback, _kDACallbackMatchKey, match );
49        if ( watch )  CFDictionarySetValue( callback, _kDACallbackWatchKey, watch );
50    }
51
52    return ( void * ) callback;
53}
54
55DACallbackRef DACallbackCreateCopy( CFAllocatorRef allocator, DACallbackRef callback )
56{
57    return ( void * ) CFDictionaryCreateMutableCopy( allocator, 0, ( void * ) callback );
58}
59
60mach_vm_offset_t DACallbackGetAddress( DACallbackRef callback )
61{
62    return ___CFDictionaryGetIntegerValue( ( void * ) callback, _kDACallbackAddressKey );
63}
64
65CFTypeRef DACallbackGetArgument0( DACallbackRef callback )
66{
67    return CFDictionaryGetValue( ( void * ) callback, _kDACallbackArgument0Key );
68}
69
70CFTypeRef DACallbackGetArgument1( DACallbackRef callback )
71{
72    return CFDictionaryGetValue( ( void * ) callback, _kDACallbackArgument1Key );
73}
74
75mach_vm_offset_t DACallbackGetContext( DACallbackRef callback )
76{
77    return ___CFDictionaryGetIntegerValue( ( void * ) callback, _kDACallbackContextKey );
78}
79
80DADiskRef DACallbackGetDisk( DACallbackRef callback )
81{
82    return ( void * ) CFDictionaryGetValue( ( void * ) callback, _kDACallbackDiskKey );
83}
84
85_DACallbackKind DACallbackGetKind( DACallbackRef callback )
86{
87    return ___CFDictionaryGetIntegerValue( ( void * ) callback, _kDACallbackKindKey );
88}
89
90CFDictionaryRef DACallbackGetMatch( DACallbackRef callback )
91{
92    return CFDictionaryGetValue( ( void * ) callback, _kDACallbackMatchKey );
93}
94
95SInt32 DACallbackGetOrder( DACallbackRef callback )
96{
97    return ___CFDictionaryGetIntegerValue( ( void * ) callback, _kDACallbackOrderKey );
98}
99
100DASessionRef DACallbackGetSession( DACallbackRef callback )
101{
102    return ( void * ) CFDictionaryGetValue( ( void * ) callback, _kDACallbackSessionKey );
103}
104
105CFAbsoluteTime DACallbackGetTime( DACallbackRef callback )
106{
107    CFDateRef      date;
108    CFAbsoluteTime time = 0;
109
110    date = CFDictionaryGetValue( ( void * ) callback, _kDACallbackTimeKey );
111
112    if ( date )
113    {
114        time = CFDateGetAbsoluteTime( date );
115    }
116
117    return time;
118}
119
120CFArrayRef DACallbackGetWatch( DACallbackRef callback )
121{
122    return CFDictionaryGetValue( ( void * ) callback, _kDACallbackWatchKey );
123}
124
125void DACallbackSetArgument0( DACallbackRef callback, CFTypeRef argument0 )
126{
127    if ( argument0 )
128    {
129        CFDictionarySetValue( ( void * ) callback, _kDACallbackArgument0Key, argument0 );
130    }
131    else
132    {
133        CFDictionaryRemoveValue( ( void * ) callback, _kDACallbackArgument0Key );
134    }
135}
136
137void DACallbackSetArgument1( DACallbackRef callback, CFTypeRef argument1 )
138{
139    if ( argument1 )
140    {
141        CFDictionarySetValue( ( void * ) callback, _kDACallbackArgument1Key, argument1 );
142    }
143    else
144    {
145        CFDictionaryRemoveValue( ( void * ) callback, _kDACallbackArgument1Key );
146    }
147}
148
149void DACallbackSetDisk( DACallbackRef callback, DADiskRef disk )
150{
151    if ( disk )
152    {
153        CFDictionarySetValue( ( void * ) callback, _kDACallbackDiskKey, disk );
154    }
155    else
156    {
157        CFDictionaryRemoveValue( ( void * ) callback, _kDACallbackDiskKey );
158    }
159}
160
161void DACallbackSetMatch( DACallbackRef callback, CFDictionaryRef match )
162{
163    if ( match )
164    {
165        CFDictionarySetValue( ( void * ) callback, _kDACallbackMatchKey, match );
166    }
167    else
168    {
169        CFDictionaryRemoveValue( ( void * ) callback, _kDACallbackMatchKey );
170    }
171}
172
173void DACallbackSetSession( DACallbackRef callback, DASessionRef session )
174{
175    if ( session )
176    {
177        CFDictionarySetValue( ( void * ) callback, _kDACallbackSessionKey, session );
178    }
179    else
180    {
181        CFDictionaryRemoveValue( ( void * ) callback, _kDACallbackSessionKey );
182    }
183}
184
185void DACallbackSetTime( DACallbackRef callback, CFAbsoluteTime time )
186{
187    CFDateRef date;
188
189    date = CFDateCreate( kCFAllocatorDefault, time );
190
191    if ( date )
192    {
193        CFDictionarySetValue( ( void * ) callback, _kDACallbackTimeKey, date );
194
195        CFRelease( date );
196    }
197}
198