Mercurial > pidgin
comparison plugins/crazychat/Utilities.c @ 11218:ed017b9c532d
[gaim-migrate @ 13350]
crazychat commit, first one.
committer: Tailor Script <tailor@pidgin.im>
author | Charlie Stockman <chuckleberry> |
---|---|
date | Tue, 09 Aug 2005 07:10:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
11217:f854402837ba | 11218:ed017b9c532d |
---|---|
1 /* | |
2 File: Utilities.c | |
3 | |
4 Description: Miscellaneous Utility routines. | |
5 | |
6 Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved. | |
7 | |
8 Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. | |
9 ("Apple") in consideration of your agreement to the following terms, and your | |
10 use, installation, modification or redistribution of this Apple software | |
11 constitutes acceptance of these terms. If you do not agree with these terms, | |
12 please do not use, install, modify or redistribute this Apple software. | |
13 | |
14 In consideration of your agreement to abide by the following terms, and subject | |
15 to these terms, Apple grants you a personal, non-exclusive license, under Apple’s | |
16 copyrights in this original Apple software (the "Apple Software"), to use, | |
17 reproduce, modify and redistribute the Apple Software, with or without | |
18 modifications, in source and/or binary forms; provided that if you redistribute | |
19 the Apple Software in its entirety and without modifications, you must retain | |
20 this notice and the following text and disclaimers in all such redistributions of | |
21 the Apple Software. Neither the name, trademarks, service marks or logos of | |
22 Apple Computer, Inc. may be used to endorse or promote products derived from the | |
23 Apple Software without specific prior written permission from Apple. Except as | |
24 expressly stated in this notice, no other rights or licenses, express or implied, | |
25 are granted by Apple herein, including but not limited to any patent rights that | |
26 may be infringed by your derivative works or by other works in which the Apple | |
27 Software may be incorporated. | |
28 | |
29 The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO | |
30 WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED | |
31 WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
32 PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN | |
33 COMBINATION WITH YOUR PRODUCTS. | |
34 | |
35 IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR | |
36 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE | |
37 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
38 ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION | |
39 OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT | |
40 (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN | |
41 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
42 | |
43 Change History (most recent first): | |
44 | |
45 */ | |
46 | |
47 #ifndef __UTILITIES__ | |
48 #include "Utilities.h" | |
49 #endif | |
50 | |
51 const OSType kApplicationSignature = FOUR_CHAR_CODE('cvmj'); | |
52 const ResType kOpenResourceType = FOUR_CHAR_CODE('open'); | |
53 const StringPtr kApplicationName = "\pYourAppNameHere"; | |
54 | |
55 ////////// | |
56 // | |
57 // GetOneFileWithPreview | |
58 // Display the appropriate file-opening dialog box, with an optional QuickTime preview pane. If the user | |
59 // selects a file, return information about it using the theFSSpecPtr parameter. | |
60 // | |
61 // Note that both StandardGetFilePreview and NavGetFile use the function specified by theFilterProc as a | |
62 // file filter. This framework always passes NULL in the theFilterProc parameter. If you use this function | |
63 // in your own code, keep in mind that on Windows the function specifier must be of type FileFilterUPP and | |
64 // on Macintosh it must be of type NavObjectFilterUPP. (You can use the QTFrame_GetFileFilterUPP to create | |
65 // a function specifier of the appropriate type.) Also keep in mind that Navigation Services expects a file | |
66 // filter function to return true if a file is to be displayed, while the Standard File Package expects the | |
67 // filter to return false if a file is to be displayed. | |
68 // | |
69 ////////// | |
70 | |
71 OSErr GetOneFileWithPreview (short theNumTypes, TypeListPtr theTypeList, FSSpecPtr theFSSpecPtr, void *theFilterProc) | |
72 { | |
73 | |
74 #if TARGET_OS_WIN32 | |
75 StandardFileReply myReply; | |
76 #endif | |
77 #if TARGET_OS_MAC | |
78 NavReplyRecord myReply; | |
79 NavDialogOptions myDialogOptions; | |
80 NavTypeListHandle myOpenList = NULL; | |
81 NavEventUPP myEventUPP = NewNavEventUPP(HandleNavEvent); | |
82 #endif | |
83 OSErr myErr = noErr; | |
84 | |
85 if (theFSSpecPtr == NULL) | |
86 return(paramErr); | |
87 | |
88 #if TARGET_OS_WIN32 | |
89 // prompt the user for a file | |
90 StandardGetFilePreview((FileFilterUPP)theFilterProc, theNumTypes, (ConstSFTypeListPtr)theTypeList, &myReply); | |
91 if (!myReply.sfGood) | |
92 return(userCanceledErr); | |
93 | |
94 // make an FSSpec record | |
95 myErr = FSMakeFSSpec(myReply.sfFile.vRefNum, myReply.sfFile.parID, myReply.sfFile.name, theFSSpecPtr); | |
96 #endif | |
97 | |
98 #if TARGET_OS_MAC | |
99 // specify the options for the dialog box | |
100 NavGetDefaultDialogOptions(&myDialogOptions); | |
101 myDialogOptions.dialogOptionFlags -= kNavNoTypePopup; | |
102 myDialogOptions.dialogOptionFlags -= kNavAllowMultipleFiles; | |
103 BlockMoveData(kApplicationName, myDialogOptions.clientName, kApplicationName[0] + 1); | |
104 | |
105 // create a handle to an 'open' resource | |
106 myOpenList = (NavTypeListHandle)CreateOpenHandle(kApplicationSignature, theNumTypes, theTypeList); | |
107 if (myOpenList != NULL) | |
108 HLock((Handle)myOpenList); | |
109 | |
110 // prompt the user for a file | |
111 myErr = NavGetFile(NULL, &myReply, &myDialogOptions, myEventUPP, NULL, (NavObjectFilterUPP)theFilterProc, myOpenList, NULL); | |
112 if ((myErr == noErr) && myReply.validRecord) { | |
113 AEKeyword myKeyword; | |
114 DescType myActualType; | |
115 Size myActualSize = 0; | |
116 | |
117 // get the FSSpec for the selected file | |
118 if (theFSSpecPtr != NULL) | |
119 myErr = AEGetNthPtr(&(myReply.selection), 1, typeFSS, &myKeyword, &myActualType, theFSSpecPtr, sizeof(FSSpec), &myActualSize); | |
120 | |
121 NavDisposeReply(&myReply); | |
122 } | |
123 | |
124 if (myOpenList != NULL) { | |
125 HUnlock((Handle)myOpenList); | |
126 DisposeHandle((Handle)myOpenList); | |
127 } | |
128 | |
129 DisposeNavEventUPP(myEventUPP); | |
130 #endif | |
131 | |
132 return(myErr); | |
133 } | |
134 | |
135 ////////// | |
136 // | |
137 // CreateOpenHandle | |
138 // Get the 'open' resource or dynamically create a NavTypeListHandle. | |
139 // | |
140 ////////// | |
141 | |
142 Handle CreateOpenHandle (OSType theApplicationSignature, short theNumTypes, TypeListPtr theTypeList) | |
143 { | |
144 Handle myHandle = NULL; | |
145 | |
146 // see if we have an 'open' resource... | |
147 myHandle = Get1Resource('open', 128); | |
148 if ( myHandle != NULL && ResError() == noErr ) { | |
149 DetachResource( myHandle ); | |
150 return myHandle; | |
151 } else { | |
152 myHandle = NULL; | |
153 } | |
154 | |
155 // nope, use the passed in types and dynamically create the NavTypeList | |
156 if (theTypeList == NULL) | |
157 return myHandle; | |
158 | |
159 if (theNumTypes > 0) { | |
160 myHandle = NewHandle(sizeof(NavTypeList) + (theNumTypes * sizeof(OSType))); | |
161 if (myHandle != NULL) { | |
162 NavTypeListHandle myOpenResHandle = (NavTypeListHandle)myHandle; | |
163 | |
164 (*myOpenResHandle)->componentSignature = theApplicationSignature; | |
165 (*myOpenResHandle)->osTypeCount = theNumTypes; | |
166 BlockMoveData(theTypeList, (*myOpenResHandle)->osType, theNumTypes * sizeof(OSType)); | |
167 } | |
168 } | |
169 | |
170 return myHandle; | |
171 } | |
172 | |
173 ////////// | |
174 // | |
175 // HandleNavEvent | |
176 // A callback procedure that handles events while a Navigation Service dialog box is displayed. | |
177 // | |
178 ////////// | |
179 | |
180 PASCAL_RTN void HandleNavEvent(NavEventCallbackMessage theCallBackSelector, NavCBRecPtr theCallBackParms, void *theCallBackUD) | |
181 { | |
182 #pragma unused(theCallBackUD) | |
183 | |
184 if (theCallBackSelector == kNavCBEvent) { | |
185 switch (theCallBackParms->eventData.eventDataParms.event->what) { | |
186 case updateEvt: | |
187 #if TARGET_OS_MAC | |
188 // Handle Update Event | |
189 #endif | |
190 break; | |
191 case nullEvent: | |
192 // Handle Null Event | |
193 break; | |
194 } | |
195 } | |
196 } | |
197 | |
198 ////////// | |
199 // | |
200 // PutFile | |
201 // Save a file under the specified name. Return Boolean values indicating whether the user selected a file | |
202 // and whether the selected file is replacing an existing file. | |
203 // | |
204 ////////// | |
205 | |
206 OSErr PutFile (ConstStr255Param thePrompt, ConstStr255Param theFileName, FSSpecPtr theFSSpecPtr, Boolean *theIsSelected, Boolean *theIsReplacing) | |
207 { | |
208 NavReplyRecord myReply; | |
209 NavDialogOptions myDialogOptions; | |
210 NavEventUPP myEventUPP = NewNavEventUPP(HandleNavEvent); | |
211 OSErr myErr = noErr; | |
212 | |
213 if ((theFSSpecPtr == NULL) || (theIsSelected == NULL) || (theIsReplacing == NULL)) | |
214 return(paramErr); | |
215 | |
216 // assume we are not replacing an existing file | |
217 *theIsReplacing = false; | |
218 | |
219 *theIsSelected = false; | |
220 | |
221 // specify the options for the dialog box | |
222 NavGetDefaultDialogOptions(&myDialogOptions); | |
223 myDialogOptions.dialogOptionFlags += kNavNoTypePopup; | |
224 myDialogOptions.dialogOptionFlags += kNavDontAutoTranslate; | |
225 BlockMoveData(theFileName, myDialogOptions.savedFileName, theFileName[0] + 1); | |
226 BlockMoveData(thePrompt, myDialogOptions.message, thePrompt[0] + 1); | |
227 | |
228 // prompt the user for a file | |
229 myErr = NavPutFile(NULL, &myReply, &myDialogOptions, myEventUPP, MovieFileType, sigMoviePlayer, NULL); | |
230 if ((myErr == noErr) && myReply.validRecord) | |
231 { | |
232 AEKeyword myKeyword; | |
233 DescType myActualType; | |
234 Size myActualSize = 0; | |
235 | |
236 // get the FSSpec for the selected file | |
237 if (theFSSpecPtr != NULL) | |
238 myErr = AEGetNthPtr(&(myReply.selection), 1, typeFSS, &myKeyword, &myActualType, theFSSpecPtr, sizeof(FSSpec), &myActualSize); | |
239 | |
240 *theIsSelected = myReply.validRecord; | |
241 if (myReply.validRecord) | |
242 { | |
243 *theIsReplacing = myReply.replacing; | |
244 } | |
245 | |
246 NavDisposeReply(&myReply); | |
247 } | |
248 | |
249 | |
250 DisposeNavEventUPP(myEventUPP); | |
251 | |
252 return(myErr); | |
253 } | |
254 | |
255 ////////// | |
256 // | |
257 // DrawLobsterPICTtoGWorld | |
258 // Draws our lobster image to the specified gworld | |
259 // | |
260 ////////// | |
261 | |
262 void DrawLobsterPICTtoGWorld(CGrafPtr destGWorld, Rect *srcRect) | |
263 { | |
264 // put the overlay into the GWorld, move the picture to the bottom right of the movie | |
265 PicHandle pict = GetPicture(129); | |
266 if (pict) | |
267 { | |
268 CGrafPtr oldPort; | |
269 GDHandle oldDevice; | |
270 Rect frame = (**pict).picFrame; | |
271 | |
272 GetGWorld(&oldPort, &oldDevice); | |
273 SetGWorld(destGWorld, nil); | |
274 // normalize coordinates | |
275 OffsetRect(&frame, -frame.left, -frame.left); | |
276 // grow frame to be as big as source rect | |
277 OffsetRect(&frame, srcRect->right - frame.right, srcRect->bottom - frame.bottom); | |
278 DrawPicture(pict, &frame); | |
279 SetGWorld(oldPort, oldDevice); | |
280 ReleaseResource((Handle)pict); | |
281 } | |
282 } | |
283 |