13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#ifndef BASE_MAC_SCOPED_AEDESC_H_
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#define BASE_MAC_SCOPED_AEDESC_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#import <CoreServices/CoreServices.h>
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/basictypes.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace base {
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace mac {
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// The ScopedAEDesc is used to scope AppleEvent descriptors.  On creation,
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// it will store a NULL descriptor.  On destruction, it will dispose of the
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// descriptor.
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This class is parameterized for additional type safety checks.  You can use
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// the generic AEDesc type by not providing a template parameter:
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//  ScopedAEDesc<> desc;
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricktemplate <typename AEDescType = AEDesc>
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ScopedAEDesc {
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ScopedAEDesc() {
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AECreateDesc(typeNull, NULL, 0, &desc_);
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~ScopedAEDesc() {
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AEDisposeDesc(&desc_);
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Used for in parameters.
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  operator const AEDescType*() {
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return &desc_;
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Used for out parameters.
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AEDescType* OutPointer() {
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return &desc_;
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AEDescType desc_;
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(ScopedAEDesc);
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace mac
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace base
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif  // BASE_MAC_SCOPED_AEDESC_H_
54