Improved mac file utils and event responsiveness.

This commit is contained in:
Nat Weiss 2012-07-21 02:19:03 -07:00
parent d4b6d1262b
commit dc7ce1cd0f
4 changed files with 440 additions and 325 deletions

View File

@ -127,6 +127,9 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
[openGLView unlockOpenGLContext];
// send any queued events
[[CCEventDispatcher sharedDispatcher] dispatchQueuedEvents];
[pool release];
}

View File

@ -1,5 +1,6 @@
/****************************************************************************
Copyright (c) 2010 cocos2d-x.org
Copyright (c) 2010-2011 cocos2d-x.org
Copyright (c) 2011 Zynga Inc.
http://www.cocos2d-x.org
@ -32,147 +33,99 @@ THE SOFTWARE.
#include "CCFileUtils.h"
#include "CCDirector.h"
#include "CCSAXParser.h"
#include "CCImage.h"
#include "CCDictionary.h"
#include "CCArray.h"
#include "support/zip_support/unzip.h"
#define MAX_PATH 260
using namespace cocos2d;
USING_NS_CC;
static void static_addValueToCCDict(id key, id value, CCDictionary* pDict);
static void static_addItemToCCArray(id item, CCArray *pArray);
static void static_addItemToCCArray(id item, CCArray* pArray);
static const char *static_ccRemoveHDSuffixFromFile( const char *pszPath)
static NSString *__suffixiPhoneRetinaDisplay =@"-hd";
static NSString *__suffixiPad =@"-ipad";
static NSString *__suffixiPadRetinaDisplay =@"-ipadhd";
static NSFileManager *__localFileManager= [[NSFileManager alloc] init];
bool fileExistsAtPath(const char *cpath, const char *csuffix);
CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName);
CCArray* ccFileUtils_arrayWithContentsOfFileThreadSafe(const char* pFileName);
static bool isIPad()
{
#if CC_IS_RETINA_DISPLAY_SUPPORTED
if(cocos2d::CC_CONTENT_SCALE_FACTOR() == 2 ) {
NSString *path = [NSString stringWithUTF8String: pszPath];
NSString *name = [path lastPathComponent];
NSString *suffix = [NSString stringWithUTF8String: CC_RETINA_DISPLAY_FILENAME_SUFFIX];
// check if path already has the suffix.
if( [name rangeOfString: suffix].location != NSNotFound ) {
CCLOG("cocos2d: Filename(%@) contains %@ suffix. Removing it. See cocos2d issue #1040", path, CC_RETINA_DISPLAY_FILENAME_SUFFIX);
NSString *newLastname = [name stringByReplacingOccurrencesOfString: suffix withString:@""];
NSString *pathWithoutLastname = [path stringByDeletingLastPathComponent];
return [[pathWithoutLastname stringByAppendingPathComponent:newLastname] UTF8String];
}
}
#endif // CC_IS_RETINA_DISPLAY_SUPPORTED
return pszPath;
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
return (winSize.width >= 1024 && winSize.height >= 768);
}
static NSString* getDoubleResolutionImage(NSString* path)
static NSString* removeSuffixFromPath(NSString *suffix, NSString *path)
{
#if CC_IS_RETINA_DISPLAY_SUPPORTED
if( cocos2d::CC_CONTENT_SCALE_FACTOR() == 2 )
// quick return
if( ! suffix || [suffix length] == 0 )
{
NSString *pathWithoutExtension = [path stringByDeletingPathExtension];
NSString *name = [pathWithoutExtension lastPathComponent];
NSString *suffix = [NSString stringWithUTF8String: CC_RETINA_DISPLAY_FILENAME_SUFFIX];
// check if path already has the suffix.
if( [name rangeOfString: suffix].location != NSNotFound ) {
CCLOG("cocos2d: WARNING Filename(%@) already has the suffix %@. Using it.", name, CC_RETINA_DISPLAY_FILENAME_SUFFIX);
return path;
}
NSString *extension = [path pathExtension];
if( [extension isEqualToString:@"ccz"] || [extension isEqualToString:@"gz"] )
{
// All ccz / gz files should be in the format filename.xxx.ccz
// so we need to pull off the .xxx part of the extension as well
extension = [NSString stringWithFormat:@"%@.%@", [pathWithoutExtension pathExtension], extension];
pathWithoutExtension = [pathWithoutExtension stringByDeletingPathExtension];
}
NSString *retinaName = [pathWithoutExtension stringByAppendingString: suffix];
retinaName = [retinaName stringByAppendingPathExtension:extension];
NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
if( [fileManager fileExistsAtPath:retinaName] )
return retinaName;
CCLOG("cocos2d: CCFileUtils: Warning HD file not found: %@", [retinaName lastPathComponent] );
return path;
}
#endif // CC_IS_RETINA_DISPLAY_SUPPORTED
NSString *name = [path lastPathComponent];
// check if path already has the suffix.
if( [name rangeOfString:suffix].location != NSNotFound ) {
CCLOG("cocos2d: Filename(%s) contains %s suffix. Removing it. See cocos2d issue #1040", [path UTF8String], [suffix UTF8String]);
NSString *newLastname = [name stringByReplacingOccurrencesOfString:suffix withString:@""];
NSString *pathWithoutLastname = [path stringByDeletingLastPathComponent];
return [pathWithoutLastname stringByAppendingPathComponent:newLastname];
}
return path;
}
static const char* static_fullPathFromRelativePath(const char *pszRelativePath)
static NSString* getPathForSuffix(NSString *path, NSString *suffix)
{
// NSAssert(pszRelativePath != nil, @"CCFileUtils: Invalid path");
// do not convert an absolute path (starting with '/')
NSString *relPath = [NSString stringWithUTF8String: pszRelativePath];
NSString *fullpath = nil;
// only if it is not an absolute path
if( ! [relPath isAbsolutePath] )
{
NSString *file = [relPath lastPathComponent];
NSString *imageDirectory = [relPath stringByDeletingLastPathComponent];
fullpath = [[NSBundle mainBundle] pathForResource:file
ofType:nil
inDirectory:imageDirectory];
if (CC_CONTENT_SCALE_FACTOR() > 1.0f &&
fullpath == nil && [file rangeOfString:@"@2x" options:NSBackwardsSearch].length == 0
&& ([file rangeOfString:@".png" options:NSBackwardsSearch | NSCaseInsensitiveSearch].length != 0
|| [file rangeOfString:@".jpg" options:NSBackwardsSearch | NSCaseInsensitiveSearch].length != 0)
)
{
NSMutableString *newFile = [NSMutableString stringWithString:file];
NSRange range = [newFile rangeOfString:@"." options:NSBackwardsSearch];
if (range.length > 0 )
{
[newFile insertString:@"@2x" atIndex:range.location];
fullpath = [[NSBundle mainBundle] pathForResource:newFile
ofType:nil
inDirectory:imageDirectory];
}
if (fullpath)
{
imageDirectory = [fullpath stringByDeletingLastPathComponent];
fullpath = [imageDirectory stringByAppendingPathComponent:file];
}
else
{
CCLog("miss file %s", [[imageDirectory stringByAppendingPathComponent:newFile] UTF8String]);
}
}
}
if (fullpath == nil)
fullpath = relPath;
fullpath = getDoubleResolutionImage(fullpath);
return [fullpath UTF8String];
// quick return
if( ! suffix || [suffix length] == 0 )
{
return path;
}
NSString *pathWithoutExtension = [path stringByDeletingPathExtension];
NSString *name = [pathWithoutExtension lastPathComponent];
// check if path already has the suffix.
if( [name rangeOfString:suffix].location != NSNotFound ) {
CCLOG("cocos2d: WARNING Filename(%s) already has the suffix %s. Using it.", [name UTF8String], [suffix UTF8String]);
return path;
}
NSString *extension = [path pathExtension];
if( [extension isEqualToString:@"ccz"] || [extension isEqualToString:@"gz"] )
{
// All ccz / gz files should be in the format filename.xxx.ccz
// so we need to pull off the .xxx part of the extension as well
extension = [NSString stringWithFormat:@"%@.%@", [pathWithoutExtension pathExtension], extension];
pathWithoutExtension = [pathWithoutExtension stringByDeletingPathExtension];
}
NSString *newName = [pathWithoutExtension stringByAppendingString:suffix];
newName = [newName stringByAppendingPathExtension:extension];
if( [__localFileManager fileExistsAtPath:newName] )
return newName;
CCLOG("cocos2d: CCFileUtils: Warning file not found: %s", [[newName lastPathComponent] UTF8String] );
return nil;
}
static void static_addItemToCCArray(id item, CCArray *pArray)
{
// add string value into array
// add string value into array
if ([item isKindOfClass:[NSString class]]) {
CCString* pValue = new CCString([item UTF8String]);
@ -181,7 +134,7 @@ static void static_addItemToCCArray(id item, CCArray *pArray)
return;
}
// add number value into array(such as int, float, bool and so on)
// add number value into array(such as int, float, bool and so on)
if ([item isKindOfClass:[NSNumber class]]) {
NSString* pStr = [item stringValue];
CCString* pValue = new CCString([pStr UTF8String]);
@ -206,6 +159,7 @@ static void static_addItemToCCArray(id item, CCArray *pArray)
// add array value into array
if ([item isKindOfClass:[NSArray class]]) {
CCArray *pArrayItem = new CCArray();
pArrayItem->init();
for (id subItem in item) {
static_addItemToCCArray(subItem, pArrayItem);
}
@ -217,260 +171,382 @@ static void static_addItemToCCArray(id item, CCArray *pArray)
static void static_addValueToCCDict(id key, id value, CCDictionary* pDict)
{
// the key must be a string
// the key must be a string
CCAssert([key isKindOfClass:[NSString class]], "The key should be a string!");
std::string pKey = [key UTF8String];
// the value is a new dictionary
// the value is a new dictionary
if ([value isKindOfClass:[NSDictionary class]]) {
CCDictionary* pSubDict = new CCDictionary();
for (id subKey in [value allKeys]) {
id subValue = [value objectForKey:subKey];
static_addValueToCCDict(subKey, subValue, pSubDict);
}
pDict->setObject(pSubDict, pKey);
pDict->setObject(pSubDict, pKey.c_str());
pSubDict->release();
return;
}
// the value is a string
// the value is a string
if ([value isKindOfClass:[NSString class]]) {
CCString* pValue = new CCString([value UTF8String]);
pDict->setObject(pValue, pKey);
pDict->setObject(pValue, pKey.c_str());
pValue->release();
return;
}
// the value is a number
// the value is a number
if ([value isKindOfClass:[NSNumber class]]) {
NSString* pStr = [value stringValue];
CCString* pValue = new CCString([pStr UTF8String]);
pDict->setObject(pValue, pKey);
pDict->setObject(pValue, pKey.c_str());
pValue->release();
return;
}
// the value is a array
// the value is a array
if ([value isKindOfClass:[NSArray class]]) {
CCArray *pArray = new CCArray();
pArray->init();
for (id item in value) {
static_addItemToCCArray(item, pArray);
}
pDict->setObject(pArray, pKey);
pDict->setObject(pArray, pKey.c_str());
pArray->release();
return;
}
}
namespace cocos2d {
NS_CC_BEGIN
static CCFileUtils* s_pFileUtils = NULL;
static CCFileUtils* s_pFileUtils = NULL;
CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName);
CCArray* ccFileUtils_arrayWithContentsOfFileThreadSafe(const char* pFileName);
CCFileUtils* CCFileUtils::sharedFileUtils()
{
if (s_pFileUtils == NULL)
{
s_pFileUtils = new CCFileUtils();
}
return s_pFileUtils;
}
void CCFileUtils::purgeFileUtils()
{
if (s_pFileUtils != NULL)
{
s_pFileUtils->purgeCachedEntries();
}
CC_SAFE_DELETE(s_pFileUtils);
}
void CCFileUtils::purgeCachedEntries()
{
}
// record the resource path
static char s_pszResourcePath[MAX_PATH] = {0};
void CCFileUtils::setResourcePath(const char *pszResourcePath)
CCFileUtils* CCFileUtils::sharedFileUtils()
{
if (s_pFileUtils == NULL)
{
// NSAssert(pszResourcePath != NULL, "[FileUtils setResourcePath] -- wrong resource path");
// NSAssert(strlen(pszResourcePath) <= MAX_PATH, "[FileUtils setResourcePath] -- resource path too long");
strcpy(s_pszResourcePath, pszResourcePath);
s_pFileUtils = new CCFileUtils();
}
/*
const char* CCFileUtils::getResourcePath()
return s_pFileUtils;
}
void CCFileUtils::purgeFileUtils()
{
if (s_pFileUtils != NULL)
{
return s_pszResourcePath;
}
*/
//int CCFileUtils::ccLoadFileIntoMemory(const char *filename, unsigned char **out)
unsigned char* CCFileUtils::getFileData(const char *pszFileName, const char *pszMode, unsigned long *pSize)
{
unsigned char* out = NULL;
int size = 0;
FILE *f = fopen(pszFileName, pszMode);
if( !f ) {
*pSize = 0;
return NULL;
}
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
out = (unsigned char*)malloc(size);
int read = fread(out, 1, size, f);
if( read != size ) {
free(out);
*pSize = 0;
return NULL;
}
fclose(f);
*pSize = size;
return out;
s_pFileUtils->purgeCachedEntries();
}
std::string& CCFileUtils::removeSuffixFromFile(std::string& path )
CC_SAFE_DELETE(s_pFileUtils);
}
void CCFileUtils::purgeCachedEntries()
{
}
void CCFileUtils::setResourcePath(const char *pszResourcePath)
{
assert(0);
}
std::string& CCFileUtils::removeSuffixFromFile(std::string& cpath )
{
NSString *ret = nil;
NSString *path = [NSString stringWithUTF8String:cpath.c_str()];
if( isIPad() )
{
path = static_ccRemoveHDSuffixFromFile(path.c_str());
return path;
}
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
{
return static_fullPathFromRelativePath(pszRelativePath);
}
const char *CCFileUtils::fullPathFromRelativeFile(const char *pszFilename, const char *pszRelativeFile)
{
std::string relativeFile = fullPathFromRelativePath(pszRelativeFile);
CCString *pRet = new CCString();
pRet->autorelease();
pRet->m_sString = relativeFile.substr(0, relativeFile.rfind('/')+1);
pRet->m_sString += pszFilename;
return pRet->m_sString.c_str();
}
CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName)
{
const char* pszFullPath = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pFileName);
NSString* pPath = [NSString stringWithUTF8String:pszFullPath];
NSDictionary* pDict = [NSDictionary dictionaryWithContentsOfFile:pPath];
CCDictionary* pRet = new CCDictionary();
for (id key in [pDict allKeys]) {
id value = [pDict objectForKey:key];
static_addValueToCCDict(key, value, pRet);
}
return pRet;
}
CCArray* ccFileUtils_arrayWithContentsOfFileThreadSafe(const char* pFileName)
{
NSString* pPath = [NSString stringWithUTF8String:pFileName];
NSString* pathExtension= [pPath pathExtension];
pPath = [pPath stringByDeletingPathExtension];
pPath = [[NSBundle mainBundle] pathForResource:pPath ofType:pathExtension];
NSArray* pArray = [NSArray arrayWithContentsOfFile:pPath];
CCArray* pRet = new CCArray();
for (id value in pArray) {
static_addItemToCCArray(value, pRet);
}
return pRet;
}
/*
CCDictionary *CCFileUtils::dictionaryWithContentsOfFile(const char *pFileName)
{
NSString* pPath = [NSString stringWithUTF8String:pFileName];
NSDictionary* pDict = [NSDictionary dictionaryWithContentsOfFile:pPath];
CCDictionary* pRet = new CCDictionary();
for (id key in [pDict allKeys]) {
id value = [pDict objectForKey:key];
static_addValueToCCDict(key, value, pRet);
}
pRet->autorelease();
return pRet;
}
unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
{
unsigned char * pBuffer = NULL;
do
if( CC_CONTENT_SCALE_FACTOR() == 2 )
{
// read the file from hardware
FILE *fp = fopen(pszFileName, pszMode);
CC_BREAK_IF(!fp);
fseek(fp,0,SEEK_END);
*pSize = ftell(fp);
fseek(fp,0,SEEK_SET);
pBuffer = new unsigned char[*pSize];
*pSize = fread(pBuffer,sizeof(unsigned char), *pSize,fp);
fclose(fp);
} while (0);
if (! pBuffer && getIsPopupNotify())
{
std::string title = "Notification";
std::string msg = "Get data from file(";
msg.append(pszFileName).append(") failed!");
CCMessageBox(msg.c_str(), title.c_str());
ret = removeSuffixFromPath(__suffixiPadRetinaDisplay, path);
}
else
{
ret = removeSuffixFromPath(__suffixiPad, path);
}
}
else
{
if( CC_CONTENT_SCALE_FACTOR() == 2 )
{
ret = removeSuffixFromPath(__suffixiPhoneRetinaDisplay, [NSString stringWithUTF8String:cpath.c_str()]);
}
else
{
ret = path;
}
return pBuffer;
}
void CCFileUtils::setResource(const char* pszZipFileName)
{
CCAssert(0, "Have not implement!");
cpath = [ret UTF8String];
return cpath;
}
void CCFileUtils::setiPhoneRetinaDisplaySuffix(const char *suffix)
{
[__suffixiPhoneRetinaDisplay release];
__suffixiPhoneRetinaDisplay = [[NSString stringWithUTF8String:suffix] retain];
}
void CCFileUtils::setiPadSuffix(const char *suffix)
{
[__suffixiPad release];
__suffixiPad = [[NSString stringWithUTF8String:suffix] retain];
}
void CCFileUtils::setiPadRetinaDisplaySuffix(const char *suffix)
{
[__suffixiPadRetinaDisplay release];
__suffixiPadRetinaDisplay = [[NSString stringWithUTF8String:suffix] retain];
}
bool fileExistsAtPath(const char *cpath, const char *csuffix)
{
NSString *fullpath = nil;
NSString *relPath = [NSString stringWithUTF8String:cpath];
NSString *suffix = [NSString stringWithUTF8String:csuffix];
// only if it is not an absolute path
if( ! [relPath isAbsolutePath] ) {
// pathForResource also searches in .lproj directories. issue #1230
NSString *file = [relPath lastPathComponent];
NSString *imageDirectory = [relPath stringByDeletingLastPathComponent];
fullpath = [[NSBundle mainBundle] pathForResource:file
ofType:nil
inDirectory:imageDirectory];
}
void CCFileUtils::setRelativePath(const char* pszRelativePath)
{
CCAssert(0, "Have not implement!");
}
*/
// notification support when getFileData from a invalid file
static bool s_bPopupNotify = true;
if (fullpath == nil)
fullpath = relPath;
void CCFileUtils::setPopupNotify(bool bNotify)
{
s_bPopupNotify = bNotify;
NSString *path = getPathForSuffix(fullpath, suffix);
return ( path != nil );
}
bool CCFileUtils::iPhoneRetinaDisplayFileExistsAtPath(const char *cpath)
{
return fileExistsAtPath(cpath, [__suffixiPhoneRetinaDisplay UTF8String]);
}
bool CCFileUtils::iPadFileExistsAtPath(const char *cpath)
{
return fileExistsAtPath(cpath, [__suffixiPad UTF8String]);
}
bool CCFileUtils::iPadRetinaDisplayFileExistsAtPath(const char *cpath)
{
return fileExistsAtPath(cpath, [__suffixiPadRetinaDisplay UTF8String]);
}
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath)
{
ccResolutionType ignore;
return fullPathFromRelativePath(pszRelativePath, &ignore);
}
const char* CCFileUtils::fullPathFromRelativePath(const char *pszRelativePath, ccResolutionType *pResolutionType)
{
CCAssert(pszRelativePath != NULL, "CCFileUtils: Invalid path");
NSString *fullpath = nil;
NSString *relPath = [NSString stringWithUTF8String:pszRelativePath];
// only if it is not an absolute path
if( ! [relPath isAbsolutePath] ) {
// pathForResource also searches in .lproj directories. issue #1230
NSString *file = [relPath lastPathComponent];
NSString *imageDirectory = [relPath stringByDeletingLastPathComponent];
fullpath = [[NSBundle mainBundle] pathForResource:file
ofType:nil
inDirectory:imageDirectory];
}
bool CCFileUtils::isPopupNotify()
if (fullpath == nil)
{
return s_bPopupNotify;
fullpath = relPath;
}
NSString *ret = nil;
// iPad?
if( isIPad() )
{
// Retina Display ?
if( CC_CONTENT_SCALE_FACTOR() == 2 ) {
ret = getPathForSuffix(fullpath, __suffixiPadRetinaDisplay);
*pResolutionType = kCCResolutioniPadRetinaDisplay;
}
else
{
ret = getPathForSuffix(fullpath, __suffixiPad);
*pResolutionType = kCCResolutioniPad;
}
}
// iPhone ?
else
{
// Retina Display ?
if( CC_CONTENT_SCALE_FACTOR() == 2 ) {
ret = getPathForSuffix(fullpath, __suffixiPhoneRetinaDisplay);
*pResolutionType = kCCResolutioniPhoneRetinaDisplay;
}
}
// If it is iPhone Non RetinaDisplay, or if the previous "getPath" failed, then use iPhone images.
if( ret == nil )
{
*pResolutionType = kCCResolutioniPhone;
ret = fullpath;
}
return [ret UTF8String];
}
const char *CCFileUtils::fullPathFromRelativeFile(const char *pszFilename, const char *pszRelativeFile)
{
std::string relativeFile = fullPathFromRelativePath(pszRelativeFile);
CCString *pRet = new CCString();
pRet->autorelease();
pRet->m_sString = relativeFile.substr(0, relativeFile.rfind('/')+1);
pRet->m_sString += pszFilename;
return pRet->m_sString.c_str();
}
CCDictionary* ccFileUtils_dictionaryWithContentsOfFileThreadSafe(const char *pFileName)
{
const char* pszFullPath = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pFileName);
NSString* pPath = [NSString stringWithUTF8String:pszFullPath];
NSDictionary* pDict = [NSDictionary dictionaryWithContentsOfFile:pPath];
CCDictionary* pRet = new CCDictionary();
for (id key in [pDict allKeys]) {
id value = [pDict objectForKey:key];
static_addValueToCCDict(key, value, pRet);
}
std::string CCFileUtils::getWriteablePath()
{
// save to document folder
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
std::string strRet = [documentsDirectory UTF8String];
strRet.append("/");
return strRet;
return pRet;
}
CCArray* ccFileUtils_arrayWithContentsOfFileThreadSafe(const char* pFileName)
{
NSString* pPath = [NSString stringWithUTF8String:pFileName];
NSString* pathExtension= [pPath pathExtension];
pPath = [pPath stringByDeletingPathExtension];
pPath = [[NSBundle mainBundle] pathForResource:pPath ofType:pathExtension];
NSArray* pArray = [NSArray arrayWithContentsOfFile:pPath];
CCArray* pRet = new CCArray();
for (id value in pArray) {
static_addItemToCCArray(value, pRet);
}
}//namespace cocos2d
return pRet;
}
unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
{
unsigned char * pBuffer = NULL;
CCAssert(pszFileName != NULL && pSize != NULL && pszMode != NULL, "Invaild parameters.");
*pSize = 0;
do
{
// read the file from hardware
FILE *fp = fopen(pszFileName, pszMode);
CC_BREAK_IF(!fp);
fseek(fp,0,SEEK_END);
*pSize = ftell(fp);
fseek(fp,0,SEEK_SET);
pBuffer = new unsigned char[*pSize];
*pSize = fread(pBuffer,sizeof(unsigned char), *pSize,fp);
fclose(fp);
} while (0);
if (! pBuffer && isPopupNotify())
{
std::string title = "Notification";
std::string msg = "Get data from file(";
msg.append(pszFileName).append(") failed!");
CCMessageBox(msg.c_str(), title.c_str());
}
return pBuffer;
}
// notification support when getFileData from a invalid file
static bool s_bPopupNotify = true;
void CCFileUtils::setPopupNotify(bool bNotify)
{
s_bPopupNotify = bNotify;
}
bool CCFileUtils::isPopupNotify()
{
return s_bPopupNotify;
}
std::string CCFileUtils::getWriteablePath()
{
// save to document folder
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
std::string strRet = [documentsDirectory UTF8String];
strRet.append("/");
return strRet;
}
unsigned char* CCFileUtils::getFileDataFromZip(const char* pszZipFilePath, const char* pszFileName, unsigned long * pSize)
{
unsigned char * pBuffer = NULL;
unzFile pFile = NULL;
*pSize = 0;
do
{
CC_BREAK_IF(!pszZipFilePath || !pszFileName);
CC_BREAK_IF(strlen(pszZipFilePath) == 0);
pFile = unzOpen(pszZipFilePath);
CC_BREAK_IF(!pFile);
int nRet = unzLocateFile(pFile, pszFileName, 1);
CC_BREAK_IF(UNZ_OK != nRet);
char szFilePathA[260];
unz_file_info FileInfo;
nRet = unzGetCurrentFileInfo(pFile, &FileInfo, szFilePathA, sizeof(szFilePathA), NULL, 0, NULL, 0);
CC_BREAK_IF(UNZ_OK != nRet);
nRet = unzOpenCurrentFile(pFile);
CC_BREAK_IF(UNZ_OK != nRet);
pBuffer = new unsigned char[FileInfo.uncompressed_size];
int nSize = 0;
nSize = unzReadCurrentFile(pFile, pBuffer, FileInfo.uncompressed_size);
CCAssert(nSize == 0 || nSize == (int)FileInfo.uncompressed_size, "the file size is wrong");
*pSize = FileInfo.uncompressed_size;
unzCloseCurrentFile(pFile);
} while (0);
if (pFile)
{
unzClose(pFile);
}
return pBuffer;
}
NS_CC_END

View File

@ -23,7 +23,7 @@ THE SOFTWARE.
****************************************************************************/
#import "CCWindow.h"
#import "EAGLView.h"
@implementation CCWindow
@ -59,5 +59,23 @@ THE SOFTWARE.
{
return YES;
}
- (void) keyDown:(NSEvent *)event
{
// exit fullscreen if user pressed esc
if([event keyCode] == 53)
{
EAGLView* eaglView = [EAGLView sharedEGLView];
// cancel full screen
if( [eaglView isFullScreen] )
[eaglView setFullScreen:NO];
// let another responder take it
else
[super keyDown:event];
}
}
@end

View File

@ -221,6 +221,7 @@ static EAGLView *view;
// Show the fullscreen window
[fullScreenWindow_ makeKeyAndOrderFront:self];
[fullScreenWindow_ makeMainWindow];
//[fullScreenWindow_ setNextResponder:superViewGLView_];
} else {
@ -247,14 +248,14 @@ static EAGLView *view;
isFullScreen_ = fullscreen;
[openGLview retain]; // Retain +1
//[openGLview retain]; // Retain +1
// is this necessary?
// re-configure glView
//cocos2d::CCDirector *director = cocos2d::CCDirector::sharedDirector();
//director->setOpenGLView(openGLview); //[self setView:openGLview];
[openGLview release]; // Retain -1
//[openGLview release]; // Retain -1
[openGLview setNeedsDisplay:YES];
#else
@ -269,7 +270,7 @@ static EAGLView *view;
#define DISPATCH_EVENT(__event__, __selector__) \
id obj = eventDelegate_; \
[obj performSelector:__selector__ \
onThread:[(cocos2d::CCDirectorMac*)[CCDirector sharedDirector] runningThread] \
onThread:[(cocos2d::CCDirector*)[CCDirector sharedDirector] runningThread] \
withObject:__event__ \
waitUntilDone:NO];
#endif
@ -288,7 +289,7 @@ static EAGLView *view;
float xs[1] = {0.0f};
float ys[1] = {0.0f};
ids[0] = (int)theEvent;
ids[0] = [theEvent eventNumber];
xs[0] = x;
ys[0] = y;
@ -312,7 +313,7 @@ static EAGLView *view;
float xs[1] = {0.0f};
float ys[1] = {0.0f};
ids[0] = (int)theEvent;
ids[0] = [theEvent eventNumber];
xs[0] = x;
ys[0] = y;
@ -331,7 +332,7 @@ static EAGLView *view;
float xs[1] = {0.0f};
float ys[1] = {0.0f};
ids[0] = (int)theEvent; // index?
ids[0] = [theEvent eventNumber];
xs[0] = x;
ys[0] = y;
@ -340,38 +341,49 @@ static EAGLView *view;
- (void)rightMouseDown:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
// pass the event along to the next responder (like your NSWindow subclass)
[super rightMouseDown:theEvent];
}
- (void)rightMouseDragged:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
[super rightMouseDragged:theEvent];
}
- (void)rightMouseUp:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
[super rightMouseUp:theEvent];
}
- (void)otherMouseDown:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
[super otherMouseDown:theEvent];
}
- (void)otherMouseDragged:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
[super otherMouseDragged:theEvent];
}
- (void)otherMouseUp:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
[super otherMouseUp:theEvent];
}
- (void)mouseEntered:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
[super mouseEntered:theEvent];
}
- (void)mouseExited:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
[super mouseExited:theEvent];
}
-(void) scrollWheel:(NSEvent *)theEvent {
DISPATCH_EVENT(theEvent, _cmd);
[super scrollWheel:theEvent];
}
#pragma mark EAGLView - Key events
@ -394,11 +406,17 @@ static EAGLView *view;
- (void)keyDown:(NSEvent *)theEvent
{
DISPATCH_EVENT(theEvent, _cmd);
// pass the event along to the next responder (like your NSWindow subclass)
[super keyDown:theEvent];
}
- (void)keyUp:(NSEvent *)theEvent
{
DISPATCH_EVENT(theEvent, _cmd);
// pass the event along to the next responder (like your NSWindow subclass)
[super keyUp:theEvent];
}
- (void)flagsChanged:(NSEvent *)theEvent