初始化

This commit is contained in:
SmallMain
2022-06-25 00:23:03 +08:00
commit ef0589e8e5
2264 changed files with 617829 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
from plugin_package import CCPluginPackage

View File

@@ -0,0 +1,3 @@
#!/bin/bash -l
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
python ${DIR}/cocospackage.pyc "$@"

View File

@@ -0,0 +1,3 @@
SET script_path=%~dp0
python %script_path%cocospackage.pyc %*

View File

@@ -0,0 +1,3 @@
from package_helper import PackageHelper
from project_helper import ProjectHelper

View File

@@ -0,0 +1,90 @@
import os
import os.path
import json
import re
import shlex
import uuid
import sys
import cocos
from MultiLanguage import MultiLanguage
def get_template_path():
if getattr(sys, 'frozen', None):
cur_path = os.path.realpath(os.path.dirname(sys.executable))
ret = os.path.join(cur_path, 'helper', 'template')
else:
cur_path = os.path.realpath(os.path.dirname(__file__))
ret = os.path.join(cur_path, 'template')
return ret
class CreateFrameworkHelper(object):
def __init__(self, project, package_name):
self._package_name = package_name
self._package_path = project["packages_dir"] + os.sep + package_name + "-1.0"
self._vars = {}
def run(self):
package_path = self._package_path
if os.path.isdir(package_path):
raise cocos.CCPluginError(MultiLanguage.get_string('PACKAGE_PATH_EXISTED_FMT', package_path),
cocos.CCPluginError.ERROR_PATH_NOT_FOUND)
os.makedirs(package_path)
self._vars["__PACKAGE_NAME__"] = self._package_name
self.generate_uuid_string()
template_path = get_template_path()
self.copy_files_from_template(template_path, package_path)
def copy_files_from_template(self, src_dir, dst_dir):
files = os.listdir(src_dir)
for filename in files:
src = src_dir + os.sep + filename
dst = dst_dir + os.sep + self.get_format_string(filename)
if os.path.isdir(src):
os.makedirs(dst)
self.copy_files_from_template(src, dst)
else:
self.copy_file_from_template(src, dst)
def copy_file_from_template(self, src, dst):
f = open(src, "rb")
text = f.read()
f.close()
text = self.get_format_string(text)
f = open(dst, "wb")
f.write(text)
f.close()
print MultiLanguage.get_string('PACKAGE_CREATE_OK_FMT', dst)
def get_format_string(self, src_str):
vars = self._vars
for var in vars:
src_str = src_str.replace(var, vars[var])
return src_str
def generate_uuid_string(self):
uuid_str = uuid.uuid1().hex.upper()
str1 = uuid_str[16:20]
str2 = uuid_str[0:8]
vars = self._vars
vars["__XCODE_PROJ_ID__"] = str1 + "98D41A82028A" + str2
vars["__MAC_LIB_ORI_ID__"] = str1 + "966C1A81DF7F" + str2
vars["__MAC_LIB_CTN_ID__"] = str1 + "98D91A82028A" + str2
vars["__MAC_LIB_PRJ_ID__"] = str1 + "98DA1A82028A" + str2
vars["__MAC_LIB_BLD_ID__"] = str1 + "98DE1A820D18" + str2
vars["__IOS_LIB_ORI_ID__"] = str1 + "98A71A81E087" + str2
vars["__IOS_LIB_CTN_ID__"] = str1 + "98DB1A82028A" + str2
vars["__IOS_LIB_PRJ_ID__"] = str1 + "98DC1A82028A" + str2
vars["__IOS_LIB_BLD_ID__"] = str1 + "994F1A821434" + str2
vars["__XCODE_PRDGRP_ID__"] = str1 + "98D51A82028A" + str2

View File

@@ -0,0 +1,22 @@
import os
import os.path
import errno
def ensure_directory(path):
try:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else:
raise
class UnrecognizedFormat:
def __init__(self, prompt):
self._prompt = prompt
def __str__(self):
return self._prompt

View File

@@ -0,0 +1,43 @@
import os
import os.path
import json
import cocos
from MultiLanguage import MultiLanguage
class LocalPackagesDatabase(object):
def __init__(self, path):
self._path = path
if os.path.isfile(self._path):
f = open(self._path, "rb")
self._data = json.load(f)
f.close()
else:
self._data = {}
def get_packages(self):
return self._data.copy()
def add_package(self, package_data):
key = package_data["name"] + "-" + package_data["version"]
self._data[key] = package_data
self.update_database()
print MultiLanguage.get_string('PACKAGE_PKG_ADD_OK_FMT', key)
def remove_package(self, package_data):
key = package_data["name"] + "-" + package_data["version"]
if key in self._data:
del self._data[key]
self.update_database()
print MultiLanguage.get_string('PACKAGE_PKG_REMOVE_OK_FMT', key)
else:
message = MultiLanguage.get_string('PACKAGE_PKG_NOT_FOUND_PKG_FMT', key)
raise cocos.CCPluginError(message, cocos.CCPluginError.ERROR_WRONG_CONFIG)
def update_database(self):
f = open(self._path, "w+b")
str = json.dump(self._data, f)
f.close()
print MultiLanguage.get_string('PACKAGE_PKG_UPDATE_OK_FMT', self._path)

View File

@@ -0,0 +1,212 @@
import os
import os.path
import json
import urllib2
import re
import cocos
from MultiLanguage import MultiLanguage
from functions import *
from local_package_database import LocalPackagesDatabase
from zip_downloader import ZipDownloader
def convert_version_part(version_part):
tag = '(\d+)(\D*.*)'
match = re.search(tag, version_part)
if match is None:
return 0
return int(match.group(1)), match.group(2)
def compare_extra_version_string(str1, str2):
if str1 == str2:
return 0
if len(str1) == 0:
return 1
elif len(str2) == 0:
return -1
if str1 > str2:
return 1
else:
return -1
def compare_version(version1, version2):
v1 = re.split('\.', version1)
v2 = re.split('\.', version2)
n1 = len(v1)
n2 = len(v2)
if n1 > n2:
n = n1
for x in xrange(n2,n):
v2.append("0")
else:
n = n2
for x in xrange(n1,n):
v1.append("0")
for x in xrange(0,n):
ver_num1, ver_str1 = convert_version_part(v1[x])
ver_num2, ver_str2 = convert_version_part(v2[x])
if ver_num1 > ver_num2:
return 1
elif ver_num2 > ver_num1:
return -1
c = compare_extra_version_string(ver_str1, ver_str2)
if c != 0:
return c
return 0
def get_newer_package(package1, package2):
if compare_version(package1["version"], package2["version"]) > 0:
return package1
else:
return package2
def get_packages_adapt_engine(packages, engine):
packages_out = []
for package in packages:
package_engine = package["engine"]
if package_engine[-1] == '+':
flag = True
package_engine = package_engine[:-1]
else:
flag = False
c = compare_version(engine, package_engine)
if flag and c >= 0:
packages_out.append(package)
elif c == 0:
packages_out.append(package)
if len(packages_out) > 0:
return packages_out
class PackageHelper:
REPO_URL = "http://pmr.cocos.com/"
REPO_PACKAGES_DIR = "packages"
WORKDIR = ".cocos" + os.sep + "packages"
LOCALDB_FILENAME = "local_packages.json"
QUERY_PACKAGE_URL = REPO_URL + "?name=%s"
QUERY_KEYWORD_URL = REPO_URL + "?keyword=%s"
@classmethod
def get_workdir(cls):
home = os.path.expanduser("~").rstrip("/\\")
return home + os.sep + cls.WORKDIR
@classmethod
def get_local_database_path(cls):
return cls.get_workdir() + os.sep + cls.LOCALDB_FILENAME
@classmethod
def get_package_path(cls, package_data):
return cls.get_workdir() + os.sep + package_data["name"] + "-" + package_data["version"]
@classmethod
def search_keyword(cls, keyword):
url = cls.QUERY_KEYWORD_URL % keyword
# print "[PACKAGE] query url: %s" % url
response = urllib2.urlopen(url)
html = response.read()
packages_data = json.loads(html)
if packages_data is None or len(packages_data) == 0:
return None
if "err" in packages_data:
message = MultiLanguage.get_string('PACKAGE_ERROR_WITH_CODE_FMT',
(packages_data["err"], packages_data["code"]))
raise cocos.CCPluginError(message, cocos.CCPluginError.ERROR_WRONG_CONFIG)
return packages_data
@classmethod
def query_package_data(cls, name, version = 'all'):
url = cls.QUERY_PACKAGE_URL % name + '&version=' + version
# print "[PACKAGE] query url: %s" % url
response = urllib2.urlopen(url)
html = response.read()
package_data = json.loads(html)
# d1 = json.dumps(package_data,indent=4)
# print d1
if package_data is None or len(package_data) == 0 or ("err" in package_data and "code" in package_data and package_data["code"] == "1002"):
return None
if "err" in package_data:
message = MultiLanguage.get_string('PACKAGE_ERROR_WITH_CODE_FMT',
(package_data["err"], package_data["code"]))
raise cocos.CCPluginError(message, cocos.CCPluginError.ERROR_WRONG_CONFIG)
return package_data
@classmethod
def download_package_zip(cls, package_data, force):
download_url = cls.REPO_URL + cls.REPO_PACKAGES_DIR + "/" + package_data["filename"]
workdir = cls.get_package_path(package_data)
print MultiLanguage.get_string('PACKAGE_WORKDIR_FMT', workdir)
downloader = ZipDownloader(download_url, workdir, package_data, force)
downloader.run()
@classmethod
def add_package(cls, package_data):
localdb = LocalPackagesDatabase(cls.get_local_database_path())
localdb.add_package(package_data)
@classmethod
def get_installed_packages(cls):
localdb = LocalPackagesDatabase(cls.get_local_database_path())
return localdb.get_packages()
@classmethod
def get_installed_package_data(cls, package_name, version = None):
localdb = LocalPackagesDatabase(cls.get_local_database_path())
packages = localdb.get_packages()
keys = packages.keys()
keys.sort()
keys.reverse()
for key in keys:
package_data = packages[key]
if package_data["name"] == package_name:
if version == None:
return package_data
elif package_data["version"] == version:
return package_data
@classmethod
def get_installed_package_newest_version(cls, package_name, engine = None):
localdb = LocalPackagesDatabase(cls.get_local_database_path())
packages = localdb.get_packages()
keys = packages.keys()
keys.sort()
keys.reverse()
package_list = []
for key in keys:
package_data = packages[key]
if package_data["name"] == package_name:
package_list.append(package_data)
n = len(package_list)
if n < 1:
return
if not engine is None:
package_list = get_packages_adapt_engine(package_list, engine)
if package_list is None:
return
package_newest = package_list[0]
for x in xrange(1,n-1):
package_newest = get_newer_package(package_list[x], package_newest)
return package_newest
@classmethod
def get_installed_package_zip_path(cls, package_data):
workdir = cls.get_package_path(package_data)
return workdir + os.sep + package_data["filename"]

View File

@@ -0,0 +1,200 @@
import os
import os.path
import cocos
from MultiLanguage import MultiLanguage
from functions import *
from package_helper import *
from zip_unpacker import ZipUnpacker
from add_framework_helper import AddFrameworkHelper
from remove_framework_helper import RemoveFrameworkHelper
from create_framework_helper import CreateFrameworkHelper
from set_framework_helper import SetFrameworkHelper
def get_engine_of_project(project):
ver_str = None
x_ver_file = os.path.join(project["path"], 'frameworks/cocos2d-x/cocos/cocos2d.cpp')
pattern = r".*return[ \t]+\"cocos2d-x (.*)\";"
f = open(x_ver_file)
for line in f.readlines():
match = re.match(pattern, line)
if match:
ver_str = match.group(1)
break
f.close()
return ver_str
class ProjectHelper:
SUPPORTED_PLATFORMS = ("proj.android", "proj.ios_mac", "proj.win32")
PACKAGES_DIRNAME = "packages"
PACKAGE_INFO_FILE = "package.json"
PACKAGE_UNINSTALL_FILE = "uninstall.json"
@classmethod
def get_current_project(cls):
cwd = os.path.realpath(os.getcwd())
prefix = cwd
project = {}
project["path"] = prefix
project["classes_dir"] = "Classes"
if os.path.exists(prefix + os.sep + project["classes_dir"]):
project["type"] = "cpp"
prefix = ""
else:
prefix = "frameworks" + os.sep + "runtime-src" + os.sep
project["classes_dir"] = prefix + os.sep + "Classes"
if os.path.exists(cwd + os.sep + project["classes_dir"]):
project["type"] = "script"
if not "type" in project:
message = MultiLanguage.get_string('PACKAGE_ERROR_WRONG_DIR')
raise cocos.CCPluginError(message, cocos.CCPluginError.ERROR_WRONG_CONFIG)
for platform in cls.SUPPORTED_PLATFORMS:
path = project["path"] + os.sep + prefix + platform
if os.path.exists(path):
project[platform] = path
project["packages_dir"] = project["path"] + os.sep + cls.PACKAGES_DIRNAME
return project
@classmethod
def get_added_packages(cls, project):
packages_dir = project["packages_dir"]
if not os.path.isdir(packages_dir):
return
packages = []
dirs = os.listdir(packages_dir)
for dir in dirs:
dir_path = packages_dir + os.sep + dir
if not os.path.isdir(dir_path):
continue
uninstall_file = dir_path + os.sep + cls.PACKAGE_UNINSTALL_FILE
if not os.path.isfile(uninstall_file):
continue
info_file = dir_path + os.sep + cls.PACKAGE_INFO_FILE
if not os.path.isfile(info_file):
continue
import json
f = open(info_file, "rb")
package_info = json.load(f)
f.close()
package_info["dir_path"] = dir_path
packages.append(package_info)
return packages
@classmethod
def check_added_package(cls, project, package_name):
packages = cls.get_added_packages(project)
if packages is None:
return
for package in packages:
if package["name"] == package_name:
return package
@classmethod
def show_project_info(cls, project):
print MultiLanguage.get_string('PACKAGE_PROJ_PATH_FMT', project["path"])
print MultiLanguage.get_string('PACKAGE_PROJ_TYPE_FMT', project["type"])
@classmethod
def add_framework(cls, project, package_name):
cls.show_project_info(project)
package_data = cls.check_added_package(project, package_name)
if not package_data is None:
print MultiLanguage.get_string('PACKAGE_PKG_ADDED_WARN_FMT', (package_name, package_name))
return
engine = get_engine_of_project(project)
if engine is None:
print MultiLanguage.get_string('PACKAGE_PROJ_UNKOWN_ENGINE')
return
package_data = PackageHelper.get_installed_package_newest_version(package_name, engine)
if package_data is None:
print MultiLanguage.get_string('PACKAGE_NOT_FOUND_PKG_FMT', (package_name, engine, package_name))
return
print MultiLanguage.get_string('PACKAGE_PKG_ADD_FMT',
(package_data["name"], package_data["version"], package_data["author"]))
# unpacking files
ensure_directory(project["packages_dir"])
unpacker = ZipUnpacker(PackageHelper.get_installed_package_zip_path(package_data))
unpacker.unpack(project["packages_dir"])
# execute install.json
install_helper = AddFrameworkHelper(project, package_data)
install_helper.run()
@classmethod
def remove_framework(cls, project, package_name):
cls.show_project_info(project)
package = cls.check_added_package(project, package_name)
if package is None:
print MultiLanguage.get_string('PACKAGE_PKG_NOT_FOUND_FMT', package_name)
return
dir = package["dir_path"]
print MultiLanguage.get_string('PACKAGE_PKG_REMOVE_FMT', dir)
uninstall_helper = RemoveFrameworkHelper(project, dir)
uninstall_helper.run()
print MultiLanguage.get_string('PACKAGE_PKG_REMOVE_OK')
@classmethod
def update_framework(cls, project, package_name):
cls.show_project_info(project)
package = cls.check_added_package(project, package_name)
if package is None:
print MultiLanguage.get_string('PACKAGE_PKG_NOT_FOUND_FMT', package_name)
return
engine = get_engine_of_project(project)
if engine is None:
print MultiLanguage.get_string('PACKAGE_PROJ_UNKOWN_ENGINE')
return
package_data = PackageHelper.get_installed_package_newest_version(package_name, engine)
if package_data is None:
print MultiLanguage.get_string('PACKAGE_NOT_FOUND_PKG_FMT', (package_name, engine, package_name))
return
newest_version = package_data["version"]
dir = package["dir_path"]
if compare_version(newest_version, package["version"]) < 1:
print MultiLanguage.get_string('PACKAGE_PKG_IS_NEWEST_FMT', (package_name, package_name))
return
cls.remove_framework(project, package_name)
cls.add_framework(project, package_name)
print MultiLanguage.get_string('PACKAGE_PROJ_PKG_UPDATE_OK')
@classmethod
def create_framework(cls, project, package_name):
cls.show_project_info(project)
ensure_directory(project["packages_dir"])
create_helper = CreateFrameworkHelper(project, package_name)
create_helper.run()
@classmethod
def set_framework(cls, project, package_name, version):
cls.show_project_info(project)
packages_dir = project["packages_dir"]
if not os.path.isdir(packages_dir):
print MultiLanguage.get_string('PACKAGE_NO_PKG_FOUND')
return
set_helper = SetFrameworkHelper(project, package_name, version)
set_helper.run()

View File

@@ -0,0 +1,397 @@
import os
import os.path
import json
import re
import shlex
import shutil
import cocos
class RemoveFrameworkHelper(object):
def __init__(self, project, package_path):
self._project = project
self._package_path = package_path
self._uninstall_json_path = self._package_path + os.sep + "uninstall.json"
self.get_uninstall_info()
def run(self):
for remove_info in self._uninstall_info:
if "file" in remove_info:
if "tags" in remove_info:
self.do_remove_string_with_tag(remove_info)
else:
self.do_remove_string_no_tag(remove_info)
elif "json_file" in remove_info:
filename = remove_info["json_file"]
remove_items = remove_info["items"]
self.do_remove_string_from_jsonfile(filename, remove_items)
elif "bak_file" in remove_info:
ori = remove_info["ori_file"]
bak = remove_info["bak_file"]
if os.path.exists(bak):
self.do_remove_file(ori)
os.rename(bak, ori)
if os.path.isfile(self._uninstall_json_path):
os.remove(self._uninstall_json_path)
def do_remove_header_path_on_ios_mac(self, remove_info):
filename = remove_info["file"]
if not os.path.isfile(filename):
return
tag = remove_info["tags"][0]
workdir = remove_info["workdir"]
remove_string = remove_info["string"]
f = open(filename, "rb")
lines = f.readlines()
f.close()
contents = []
tag_found = False
for line in lines:
match = re.search(tag, line)
if match is None:
contents.append(line)
else:
includes = shlex.split(match.group(2))
headers = []
for include in includes:
include = self.get_ios_mac_path(workdir, include)
headers.append(include)
if remove_string in headers:
headers.remove(remove_string)
start, end = match.span(0)
parts = []
parts.append(line[:start])
parts.append(match.group(1))
parts.append(' ')
for header in headers:
if header.find(' ') != -1:
header = '"' + header + '"'
parts.append(header)
parts.append(' ')
parts.append(match.group(3))
parts.append(line[end:])
contents.append(''.join(parts))
tag_found = True
if tag_found:
f = open(filename, "wb")
f.writelines(contents)
f.close()
def do_remove_header_path(self, remove_info):
platform = remove_info["platform"]
name = "do_remove_header_path_on_" + platform
cmd = getattr(self, name)
cmd(remove_info)
def do_remove_lib_on_win(self, remove_info):
filename = remove_info["file"]
if not os.path.isfile(filename):
return
tag = remove_info["tags"][0]
workdir = remove_info["workdir"]
remove_string = remove_info["string"]
f = open(filename, "rb")
lines = f.readlines()
f.close()
contents = []
tag_found = False
for line in lines:
match = re.search(tag, line)
if match is None:
contents.append(line)
else:
includes = re.split(';', match.group(2))
headers = []
for include in includes:
include = self.get_win32_path(workdir, include)
if include is not None:
headers.append(include)
if remove_string in headers:
headers.remove(remove_string)
start, end = match.span(0)
parts = []
parts.append(line[:start])
parts.append(match.group(1))
parts.append(';')
for header in headers:
if header.find(' ') != -1:
header = '"' + header + '"'
parts.append(header)
parts.append(';')
parts.append(match.group(3))
parts.append(line[end:])
contents.append(''.join(parts))
tag_found = True
if tag_found:
f = open(filename, "wb")
f.writelines(contents)
f.close()
def do_remove_lib_on_android(self, remove_info):
filename = remove_info["file"]
if not os.path.isfile(filename):
return
begin_tag = remove_info["tags"][0]
end_tag = remove_info["tags"][1]
prefix_tag = remove_info["tags"][2]
remove_string = remove_info["string"]
workdir = remove_info["workdir"]
is_import = remove_info["is_import"]
f = open(filename, "rb")
lines = f.readlines()
f.close()
contents = []
lib_begin = False
tag_found = False
libs = []
for line in lines:
if lib_begin == False:
contents.append(line)
match = re.search(begin_tag, line)
if not match is None:
lib_begin = True
tag_found = True
else:
if prefix_tag is not None:
match = re.search(prefix_tag, line)
if match is not None:
continue
match = re.search(end_tag, line)
if match is None:
libs.append(self.get_android_path(workdir, line, is_import))
else:
# remove lib
if remove_string in libs:
libs.remove(remove_string)
libs = list(set(libs))
count = len(libs)
cur = 1
if count > 0 and prefix_tag is not None:
contents.append(prefix_tag)
contents.append(" += \\\n")
for lib in libs:
if cur < count and prefix_tag is not None:
contents.append(' ' + lib + ' \\')
elif is_import is False:
contents.append(' ' + lib)
else:
contents.append('$(call import-module,')
contents.append(lib)
contents.append(')')
contents.append("\n")
libs = []
lib_begin = False
contents.append(line)
if tag_found:
f = open(filename, "wb")
f.writelines(contents)
f.close()
def do_remove_lib_on_ios_mac(self, remove_info):
filename = remove_info["file"]
if not os.path.isfile(filename):
return
begin_tag = remove_info["tags"][0]
end_tag = remove_info["tags"][1]
remove_string = remove_info["string"]
workdir = remove_info["workdir"]
f = open(filename, "rb")
lines = f.readlines()
f.close()
contents = []
lib_begin = False
tag_found = False
libs = []
for line in lines:
if lib_begin == False:
contents.append(line)
match = re.search(begin_tag, line)
if not match is None:
lib_begin = True
tag_found = True
else:
match = re.search(end_tag, line)
if match is None:
libs.append(self.get_ios_mac_path(workdir, line))
else:
# remove lib
if remove_string in libs:
libs.remove(remove_string)
libs = list(set(libs))
for lib in libs:
contents.append('\t\t\t\t\t"' + lib + '",\n')
libs = []
lib_begin = False
contents.append(line)
if tag_found:
f = open(filename, "wb")
f.writelines(contents)
f.close()
def do_remove_lib(self, remove_info):
platform = remove_info["platform"]
name = "do_remove_lib_on_" + platform
cmd = getattr(self, name)
cmd(remove_info)
def do_remove_string_with_tag(self, remove_info):
info_type = remove_info["type"]
if info_type == "header":
name = "do_remove_header_path"
elif info_type == "lib":
name = "do_remove_lib"
else:
return
cmd = getattr(self, name)
cmd(remove_info)
def do_remove_string_no_tag(self, remove_info):
filename = remove_info["file"]
remove_string = remove_info["string"]
self.do_remove_string_from_file(filename, remove_string)
def do_remove_file(self, file_path):
if not os.path.exists(file_path):
return
if os.path.isdir(file_path):
shutil.rmtree(file_path)
else:
os.remove(file_path)
def do_remove_string_from_file(self, filename, remove_string):
if not os.path.isfile(filename):
return
f = open(filename, "rb")
all_text = f.read()
f.close()
find_index = all_text.find(remove_string.encode("ascii"))
if find_index >= 0:
headers = all_text[0:find_index]
tails = all_text[find_index+len(remove_string):]
all_text = headers + tails
f = open(filename, "wb")
f.write(all_text)
f.close()
def do_remove_string_from_jsonfile(self, filename, remove_items):
if not os.path.isfile(filename):
return
f = open(filename, "rb")
configs = json.load(f)
f.close()
for remove_item in remove_items:
key = remove_item["key"]
if not key in configs:
continue
# found the key need to remove or to remove items
if "items" in remove_item:
# remove items in configs[key]
self.remove_items_from_json(configs[key], remove_item["items"])
else:
# remove configs[key]
del(configs[key])
f = open(filename, "w+b")
str = json.dump(configs, f)
f.close()
def remove_items_from_json(self, configs, remove_items):
if isinstance(configs, list):
# delete string in list
for item in remove_items:
if item in configs:
configs.remove(item)
else:
# delete key in dict
for item in remove_items:
if "key" in item:
key = item["key"]
if not key in configs:
continue
# found the key need to remove or to remove items
if "items" in item:
# remove items in configs[key]
self.remove_items_from_json(configs[key], item["items"])
else:
# remove configs[key]
del(configs[key])
def get_ios_mac_path(self, project_path, source):
source = source.strip(',"\t\n\r')
if not source[:10] == '$(SRCROOT)':
source = '$(SRCROOT)' + os.sep + os.path.relpath(self._project["packages_dir"] + os.sep + source,
project_path)
return source.replace(os.sep, '/')
def get_win32_path(self, project_path, source):
if source == ";" or source == "":
return None
if source.find('\\') == -1 and source.find('/') == -1:
return source
source = source.strip(',"\t\n\r')
if not source[:13] == '$(ProjectDir)':
source = '$(ProjectDir)' + os.sep + os.path.relpath(self._project["packages_dir"] + os.sep + source,
project_path)
return source.replace('/', '\\')
def get_android_path(self, project_path, source, ignore_local_path):
source = source.strip(' ,"\t\n\r')
if source.find('\\') == -1 and source.find('/') == -1:
return source
if source[-2:] == ' \\':
source = source[0:-2]
if source[:21] == '$(call import-module,':
# strip "$(call import-module, ../../../../packages/"
source = source[21:-1].strip('./\\')
if source[:8] == "packages":
source = source[9:]
if not source[:13] == '$(LOCAL_PATH)':
source = os.path.relpath(self._project["packages_dir"] + os.sep + source, project_path)
if ignore_local_path is False:
source = '$(LOCAL_PATH)' + os.sep + source
return source
def get_uninstall_info(self):
file_path = self._uninstall_json_path
if os.path.isfile(file_path):
f = open(file_path, "rb")
self._uninstall_info = json.load(f)
f.close()
else:
self._uninstall_info = []

View File

@@ -0,0 +1,111 @@
import os
import os.path
import json
import re
import shlex
import cocos
from MultiLanguage import MultiLanguage
class SetFrameworkHelper(object):
def __init__(self, project, package_name, version):
self._package_name = package_name
self._package_path = project["packages_dir"] + os.sep + package_name + "-" + version
self._project = project
def run(self):
package_name = self._package_name
package_path = self._package_path
if not os.path.isdir(package_path):
raise cocos.CCPluginError(MultiLanguage.get_string('PACKAGE_ERROR_PATH_NOT_FOUND_FMT', package_path),
cocos.CCPluginError.ERROR_PATH_NOT_FOUND)
sln_txt = self.load_sln_win32()
if sln_txt is None:
print MultiLanguage.get_string('PACKAGE_ERROR_READ_SLN')
else:
find_tag = '(Project\(\"\{)(\S*)(\}\"\) = \"' + package_name + '\", \"\S*\", \"\{)(\S*)(\}\"\s*EndProject)'
match = re.search(find_tag, sln_txt, re.DOTALL)
if match is None:
print MultiLanguage.get_string('PACKAGE_ERROR_NOT_FOUND_PROJ', package_name)
else:
proj_id_win = match.group(2)
build_id_win = match.group(4)
self.set_win32(proj_id_win, build_id_win)
def set_win32(self, proj_id, build_id):
text = self.load_install_json()
if text is None:
print MultiLanguage.get_string('PACKAGE_ERROR_JSON_READ_FAILED')
return
find_tag = '(\{\s*\"command\":\s*\"add_project\",\s*\"name\":\s*\"\S*\",\s*\"project_id\":\s*\")(\S*)(\",\s*\"build_id\":\s*\")(\S*)(\",\s*\"platform\":\s*\"win\"\s*\})'
match = re.search(find_tag, text, re.DOTALL)
if not match is None:
old_id = match.group(2)
text = text.replace(old_id, proj_id)
old_id = match.group(4)
text = text.replace(old_id, build_id)
self.save_install_json(text)
return
index = text.find("[")
if index<0:
print MultiLanguage.get_string('PACKAGE_ERROR_JSON_ERROR')
return
headers = text[0:index+1]
tails = text[index+1:]
skip_str = '\n\t\t'
str_to_add = '\n\t{'
str_to_add += skip_str + '"command": "add_project",'
str_to_add += skip_str + '"name": "' + self._package_name + '",'
str_to_add += skip_str + '"project_id": "' + proj_id + '",'
str_to_add += skip_str + '"build_id": "' + build_id + '",'
str_to_add += skip_str + '"platform": "win"'
str_to_add += '\n\t},'
text = headers + str_to_add + tails
self.save_install_json(text)
def load_install_json(self):
install_json_file = self._package_path + os.sep + "install.json"
if not os.path.isfile(install_json_file):
print MultiLanguage.get_string('PACKAGE_ERROR_NOT_FOUND_JSON')
return
f = open(install_json_file, "rb")
text = f.read()
f.close()
return text
def save_install_json(self, text):
install_json_file = self._package_path + os.sep + "install.json"
f = open(install_json_file, "wb")
f.write(text)
f.close()
def load_sln_win32(self):
if not "proj.win32" in self._project:
print MultiLanguage.get_string('PACKAGE_ERROR_WIN32_NOT_FOUND')
return
workdir = self._project["proj.win32"]
files = os.listdir(workdir)
for filename in files:
if filename[-4:] == ".sln":
proj_file_path = workdir + os.sep + filename
break
if proj_file_path is None:
print MultiLanguage.get_string('PACKAGE_ERROR_NO_SLN_IN_WIN32')
return
f = open(proj_file_path, "rb")
text = f.read()
f.close()
return text

View File

@@ -0,0 +1,34 @@
[
{
"command": "add_project",
"name": "__PACKAGE_NAME__",
"platform": "android"
},
{
"command": "add_project",
"name": "__PACKAGE_NAME__",
"id": "__XCODE_PROJ_ID__",
"mac_lib":
{
"remoteGlobalIDString": "__MAC_LIB_ORI_ID__",
"remoteInfo": "__PACKAGE_NAME__ MAC",
"container": "__MAC_LIB_CTN_ID__",
"lib_id": "__MAC_LIB_PRJ_ID__",
"build_id": "__MAC_LIB_BLD_ID__"
},
"ios_lib":
{
"remoteGlobalIDString": "__IOS_LIB_ORI_ID__",
"remoteInfo": "__PACKAGE_NAME__ IOS",
"container": "__IOS_LIB_CTN_ID__",
"lib_id": "__IOS_LIB_PRJ_ID__",
"build_id": "__IOS_LIB_BLD_ID__"
},
"ProductGroup": "__XCODE_PRDGRP_ID__",
"platform": "ios_mac"
},
{
"command": "add_entry_function",
"declare": "void package___PACKAGE_NAME___register();"
}
]

View File

@@ -0,0 +1,8 @@
{
"name": "__PACKAGE_NAME__",
"version": "1.0",
"engine": "3.4+",
"author": "",
"url": "",
"description": ""
}

View File

@@ -0,0 +1,5 @@
void package___PACKAGE_NAME___register()
{
}

View File

@@ -0,0 +1,17 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := __PACKAGE_NAME___static
LOCAL_MODULE_FILENAME := lib__PACKAGE_NAME__
LOCAL_SRC_FILES := \
$(LOCAL_PATH)/../package___PACKAGE_NAME___register.cpp
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/..
LOCAL_C_INCLUDES := $(LOCAL_EXPORT_C_INCLUDES) \
$(LOCAL_PATH)/../../../frameworks/cocos2d-x/cocos \
$(LOCAL_PATH)/../../../frameworks/cocos2d-x/external
include $(BUILD_STATIC_LIBRARY)

View File

@@ -0,0 +1,8 @@
//
// Prefix header for all source files of the 'lib__PACKAGE_NAME__' target in the 'lib__PACKAGE_NAME__' project
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#endif

View File

@@ -0,0 +1,333 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
DABC98D01A8201AF00BF5CC4 /* package___PACKAGE_NAME___register.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DABC98CF1A8201AF00BF5CC4 /* package___PACKAGE_NAME___register.cpp */; };
DABC98D11A8201AF00BF5CC4 /* package___PACKAGE_NAME___register.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DABC98CF1A8201AF00BF5CC4 /* package___PACKAGE_NAME___register.cpp */; };
DABC99751A82179700BF5CC4 /* __PACKAGE_NAME__.pch in Headers */ = {isa = PBXBuildFile; fileRef = DABC99741A82179700BF5CC4 /* __PACKAGE_NAME__.pch */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
__MAC_LIB_ORI_ID__ /* lib__PACKAGE_NAME__ MAC.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "lib__PACKAGE_NAME__ MAC.a"; sourceTree = BUILT_PRODUCTS_DIR; };
__IOS_LIB_ORI_ID__ /* lib__PACKAGE_NAME__ IOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "lib__PACKAGE_NAME__ IOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
DABC98CF1A8201AF00BF5CC4 /* package___PACKAGE_NAME___register.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = package___PACKAGE_NAME___register.cpp; path = ../package___PACKAGE_NAME___register.cpp; sourceTree = "<group>"; };
DABC99741A82179700BF5CC4 /* __PACKAGE_NAME__.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = __PACKAGE_NAME__.pch; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
DABC96691A81DF7F00BF5CC4 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
DABC98451A81E08700BF5CC4 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
DABC96631A81DF7F00BF5CC4 = {
isa = PBXGroup;
children = (
DABC99741A82179700BF5CC4 /* __PACKAGE_NAME__.pch */,
DABC98CF1A8201AF00BF5CC4 /* package___PACKAGE_NAME___register.cpp */,
DABC966D1A81DF7F00BF5CC4 /* Products */,
);
sourceTree = "<group>";
};
DABC966D1A81DF7F00BF5CC4 /* Products */ = {
isa = PBXGroup;
children = (
__MAC_LIB_ORI_ID__ /* lib__PACKAGE_NAME__ MAC.a */,
__IOS_LIB_ORI_ID__ /* lib__PACKAGE_NAME__ IOS.a */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
DABC966A1A81DF7F00BF5CC4 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
DABC98461A81E08700BF5CC4 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
DABC99751A82179700BF5CC4 /* __PACKAGE_NAME__.pch in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
DABC966B1A81DF7F00BF5CC4 /* __PACKAGE_NAME__ MAC */ = {
isa = PBXNativeTarget;
buildConfigurationList = DABC96801A81DF7F00BF5CC4 /* Build configuration list for PBXNativeTarget "__PACKAGE_NAME__ MAC" */;
buildPhases = (
DABC96681A81DF7F00BF5CC4 /* Sources */,
DABC96691A81DF7F00BF5CC4 /* Frameworks */,
DABC966A1A81DF7F00BF5CC4 /* Headers */,
);
buildRules = (
);
dependencies = (
);
name = "__PACKAGE_NAME__ MAC";
productName = __PACKAGE_NAME__;
productReference = __MAC_LIB_ORI_ID__ /* lib__PACKAGE_NAME__ MAC.a */;
productType = "com.apple.product-type.library.static";
};
DABC98001A81E08700BF5CC4 /* __PACKAGE_NAME__ IOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = DABC98A41A81E08700BF5CC4 /* Build configuration list for PBXNativeTarget "__PACKAGE_NAME__ IOS" */;
buildPhases = (
DABC98011A81E08700BF5CC4 /* Sources */,
DABC98451A81E08700BF5CC4 /* Frameworks */,
DABC98461A81E08700BF5CC4 /* Headers */,
);
buildRules = (
);
dependencies = (
);
name = "__PACKAGE_NAME__ IOS";
productName = __PACKAGE_NAME__;
productReference = __IOS_LIB_ORI_ID__ /* lib__PACKAGE_NAME__ IOS.a */;
productType = "com.apple.product-type.library.static";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
DABC96641A81DF7F00BF5CC4 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0610;
ORGANIZATIONNAME = chukong;
TargetAttributes = {
DABC966B1A81DF7F00BF5CC4 = {
CreatedOnToolsVersion = 6.1.1;
};
};
};
buildConfigurationList = DABC96671A81DF7F00BF5CC4 /* Build configuration list for PBXProject "__PACKAGE_NAME__" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = DABC96631A81DF7F00BF5CC4;
productRefGroup = DABC966D1A81DF7F00BF5CC4 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
DABC966B1A81DF7F00BF5CC4 /* __PACKAGE_NAME__ MAC */,
DABC98001A81E08700BF5CC4 /* __PACKAGE_NAME__ IOS */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
DABC96681A81DF7F00BF5CC4 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DABC98D01A8201AF00BF5CC4 /* package___PACKAGE_NAME___register.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DABC98011A81E08700BF5CC4 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DABC98D11A8201AF00BF5CC4 /* package___PACKAGE_NAME___register.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
DABC967E1A81DF7F00BF5CC4 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = NO;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREFIX_HEADER = "";
GCC_PREPROCESSOR_DEFINITIONS = (
"CC_LUA_ENGINE_ENABLED=1",
"DEBUG=1",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.10;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../frameworks/cocos2d-x/cocos $(SRCROOT)/../../../frameworks/cocos2d-x/extensions $(SRCROOT)/../../../frameworks/cocos2d-x/external";
VALID_ARCHS = "$(ARCHS_STANDARD_64_BIT)";
};
name = Debug;
};
DABC967F1A81DF7F00BF5CC4 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = NO;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_PREFIX_HEADER = "";
GCC_PREPROCESSOR_DEFINITIONS = "CC_LUA_ENGINE_ENABLED=1";
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.10;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../frameworks/cocos2d-x/cocos $(SRCROOT)/../../../frameworks/cocos2d-x/extensions $(SRCROOT)/../../../frameworks/cocos2d-x/external";
VALID_ARCHS = "$(ARCHS_STANDARD_64_BIT)";
};
name = Release;
};
DABC96811A81DF7F00BF5CC4 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
EXECUTABLE_PREFIX = lib;
PRODUCT_NAME = "__PACKAGE_NAME__ MAC";
USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../../frameworks/cocos2d-x/external/glfw3/include/mac";
};
name = Debug;
};
DABC96821A81DF7F00BF5CC4 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
EXECUTABLE_PREFIX = lib;
PRODUCT_NAME = "__PACKAGE_NAME__ MAC";
USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../../frameworks/cocos2d-x/external/glfw3/include/mac";
};
name = Release;
};
DABC98A51A81E08700BF5CC4 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
EXECUTABLE_PREFIX = lib;
GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO;
GCC_PREFIX_HEADER = __PACKAGE_NAME__.pch;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
CC_TARGET_OS_IPHONE,
);
PRODUCT_NAME = "__PACKAGE_NAME__ IOS";
SDKROOT = iphoneos8.1;
USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../../frameworks/cocos2d-x/external/curl/include/ios";
};
name = Debug;
};
DABC98A61A81E08700BF5CC4 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
EXECUTABLE_PREFIX = lib;
GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO;
GCC_PREFIX_HEADER = __PACKAGE_NAME__.pch;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
CC_TARGET_OS_IPHONE,
);
PRODUCT_NAME = "__PACKAGE_NAME__ IOS";
SDKROOT = iphoneos8.1;
USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../../frameworks/cocos2d-x/external/curl/include/ios";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
DABC96671A81DF7F00BF5CC4 /* Build configuration list for PBXProject "__PACKAGE_NAME__" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DABC967E1A81DF7F00BF5CC4 /* Debug */,
DABC967F1A81DF7F00BF5CC4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
DABC96801A81DF7F00BF5CC4 /* Build configuration list for PBXNativeTarget "__PACKAGE_NAME__ MAC" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DABC96811A81DF7F00BF5CC4 /* Debug */,
DABC96821A81DF7F00BF5CC4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
DABC98A41A81E08700BF5CC4 /* Build configuration list for PBXNativeTarget "__PACKAGE_NAME__ IOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DABC98A51A81E08700BF5CC4 /* Debug */,
DABC98A61A81E08700BF5CC4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = DABC96641A81DF7F00BF5CC4 /* Project object */;
}

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{59411DD0-24F9-48F7-80EA-3F8000855168}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>__PACKAGE_NAME__</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '10.0'">v100</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v110_xp</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v120_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '10.0'">v100</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0'">v110</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v110_xp</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v120_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_LIB;CC_USE_CURL=1;CC_LUA_ENGINE_ENABLED=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\frameworks\cocos2d-x\cocos;$(ProjectDir)..\..\..\frameworks\cocos2d-x\external;$(ProjectDir)..\..\..\frameworks\cocos2d-x\external\glfw3\include\win32;$(ProjectDir)..\..\..\frameworks\cocos2d-x\external\win32-specific\zlib\include;$(ProjectDir)..\..\..\frameworks\cocos2d-x\external\win32-specific\gles\include\OGLES/;$(ProjectDir)..\..\..\frameworks\cocos2d-x\external\curl\include\win32;$(ProjectDir)..\..\..\frameworks\cocos2d-x\extensions;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<DisableSpecificWarnings>4267;4251;4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\package___PACKAGE_NAME___register.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\package___PACKAGE_NAME___register.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,113 @@
import os
import os.path
import zipfile
import sys
import hashlib
import cocos
from MultiLanguage import MultiLanguage
from time import time
from functions import *
class ZipDownloader(object):
def __init__(self, url, destdir, package_data, force):
self._url = url
self._destdir = destdir
self._package_data = package_data
self._force = force
self._zip_file_size = int(package_data["filesize"])
self._filename = destdir + os.sep + package_data["filename"]
def download_file(self):
print(MultiLanguage.get_string('PACKAGE_READY_DOWNLOAD_FMT', (self._filename, self._url)))
import urllib2
try:
u = urllib2.urlopen(self._url)
except urllib2.HTTPError as e:
if e.code == 404:
print(MultiLanguage.get_string('PACKAGE_ERROR_URL_FMT', self._url))
print(MultiLanguage.get_string('PACKAGE_ERROR_DOWNLOAD_FAILED_FMT',
(str(e.code), e.read())))
sys.exit(1)
f = open(self._filename, 'wb')
file_size = self._zip_file_size
print(MultiLanguage.get_string('PACKAGE_START_DOWNLOAD'))
file_size_dl = 0
block_sz = 8192
block_size_per_second = 0
old_time = time()
while True:
buf = u.read(block_sz)
if not buf:
break
file_size_dl += len(buf)
block_size_per_second += len(buf)
f.write(buf)
new_time = time()
if (new_time - old_time) > 1:
speed = block_size_per_second / (new_time - old_time) / 1000.0
status = ""
if file_size != 0:
percent = file_size_dl * 100. / file_size
status = MultiLanguage.get_string('PACKAGE_DOWNLOAD_PERCENT_FMT_1',
(file_size_dl / 1000, file_size / 1000, percent, speed))
else:
status = MultiLanguage.get_string('PACKAGE_DOWNLOAD_PERCENT_FMT_2',
(file_size_dl / 1000, speed))
status += chr(8) * (len(status) + 1)
print(status),
sys.stdout.flush()
block_size_per_second = 0
old_time = new_time
print(MultiLanguage.get_string('PACKAGE_DOWNLOAD_END'))
f.close()
def check_file_md5(self):
if not os.path.isfile(self._filename):
return False
block_size = 65536 # 64KB
md5 = hashlib.md5()
f = open(self._filename)
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
hashcode = md5.hexdigest()
return hashcode == self._package_data["md5"]
def download_zip_file(self):
if os.path.isfile(self._filename):
if self._force or not self.check_file_md5():
os.remove(self._filename)
else:
print MultiLanguage.get_string('PACKAGE_EXISTS_FMT', self._filename)
if not os.path.isfile(self._filename):
self.download_file()
try:
if not zipfile.is_zipfile(self._filename):
raise UnrecognizedFormat(MultiLanguage.get_string('PACKAGE_ERROR_NOT_ZIP_FMT', (self._filename)))
except UnrecognizedFormat as e:
print(MultiLanguage.get_string('PACKAGE_ERROR_UNKNOWN_FORMAT_FMT', self._filename))
if os.path.isfile(self._filename):
os.remove(self._filename)
# print("==> Download it from internet again, please wait...")
# self.download_zip_file()
def run(self):
ensure_directory(self._destdir)
self.download_zip_file()

View File

@@ -0,0 +1,56 @@
import os
import os.path
import zipfile
import cocos
from MultiLanguage import MultiLanguage
from functions import *
class ZipUnpacker(object):
def __init__(self, filename):
self._filename = filename
def unpack(self, extract_dir):
"""Unpack zip `filename` to `extract_dir`
Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined
by ``zipfile.is_zipfile()``).
"""
if not zipfile.is_zipfile(self._filename):
raise UnrecognizedFormat(MultiLanguage.get_string('PACKAGE_ERROR_NOT_ZIP_FMT', self._filename))
print(MultiLanguage.get_string('PACKAGE_EXTRACT_TIP'))
z = zipfile.ZipFile(self._filename)
try:
for info in z.infolist():
name = info.filename
# don't extract absolute paths or ones with .. in them
if name.startswith('/') or '..' in name:
continue
target = os.path.join(extract_dir, *name.split('/'))
if not target:
continue
if name.endswith('/'):
# directory
ensure_directory(target)
else:
# file
data = z.read(info.filename)
f = open(target, 'wb')
try:
f.write(data)
finally:
f.close()
del data
unix_attributes = info.external_attr >> 16
if unix_attributes:
os.chmod(target, unix_attributes)
finally:
z.close()
print(MultiLanguage.get_string('PACKAGE_EXTRACT_END'))

View File

@@ -0,0 +1,52 @@
import time
from helper import PackageHelper
import cocos
from MultiLanguage import MultiLanguage
class PackageInfo(object):
@staticmethod
def plugin_name():
return "info"
@staticmethod
def brief_description():
return MultiLanguage.get_string('PACKAGE_INFO_BRIEF')
def parse_args(self, argv):
from argparse import ArgumentParser
parser = ArgumentParser(prog="cocos package %s" % self.__class__.plugin_name(),
description=self.__class__.brief_description())
parser.add_argument("name", metavar="NAME", help=MultiLanguage.get_string('PACKAGE_INFO_ARG_NAME'))
parser.add_argument('-v', '--version', default='all', help=MultiLanguage.get_string('PACKAGE_INFO_ARG_VERSION'))
return parser.parse_args(argv)
def run(self, argv):
args = self.parse_args(argv)
name = args.name
version = args.version
package_data = PackageHelper.query_package_data(name, version)
if package_data is None:
print MultiLanguage.get_string('PACKAGE_INFO_ERROR_NO_PKG_FMT', (name, version))
return
if isinstance(package_data, list):
for data in package_data:
self.show_info(name, data)
return
if package_data.has_key('err'):
print MultiLanguage.get_string('PACKAGE_INFO_ERROR_NO_PKG_FMT', (name, version))
return
self.show_info(name, package_data)
def show_info(self, name, package_data):
print MultiLanguage.get_string('PACKAGE_INFO_PKG_FMT',
(name, package_data["name"], package_data["version"],
time.strftime("%Y-%m-%d %H:%I:%S", time.gmtime(int(package_data["filetime"]))),
package_data["author"], (int(package_data["filesize"]) / 1024),
package_data["description"]))

View File

@@ -0,0 +1,55 @@
import cocos
from MultiLanguage import MultiLanguage
from helper import PackageHelper
class PackageInstall(cocos.CCPlugin):
@staticmethod
def plugin_name():
return "install"
@staticmethod
def brief_description():
return MultiLanguage.get_string('PACKAGE_INSTALL_BRIEF')
# parse arguments
def parse_args(self, argv):
from argparse import ArgumentParser
parser = ArgumentParser(prog="cocos package %s" % self.__class__.plugin_name(),
description=self.__class__.brief_description())
parser.add_argument("name", metavar="PACKAGE_NAME",
help=MultiLanguage.get_string('PACKAGE_INSTALL_ARG_NAME'))
parser.add_argument("-f", action="store_true", dest="force",
help=MultiLanguage.get_string('PACKAGE_INSTALL_ARG_FORCE'))
parser.add_argument('-v', '--version', default='all',
help=MultiLanguage.get_string('PACKAGE_INFO_ARG_VERSION'))
return parser.parse_args(argv)
def run(self, argv):
args = self.parse_args(argv)
name = args.name
version = args.version
force = args.force
package_data = PackageHelper.query_package_data(name, version)
if package_data is None:
message = MultiLanguage.get_string('PACKAGE_INSTALL_ERROR_NO_PKG_FMT', (name, version))
raise cocos.CCPluginError(message, cocos.CCPluginError.ERROR_OTHERS)
if isinstance(package_data, list):
for data in package_data:
self.download(force, data)
return
if package_data.has_key('err'):
message = MultiLanguage.get_string('PACKAGE_INSTALL_ERROR_NO_PKG_FMT', (name, version))
raise cocos.CCPluginError(message, cocos.CCPluginError.ERROR_WRONG_CONFIG)
self.download(force, package_data)
def download(self, force, package_data):
PackageHelper.download_package_zip(package_data, force)
PackageHelper.add_package(package_data)
print ""

View File

@@ -0,0 +1,30 @@
import cocos
from MultiLanguage import MultiLanguage
from helper import PackageHelper
class PackageList(cocos.CCPlugin):
@staticmethod
def plugin_name():
return "list"
@staticmethod
def brief_description():
return MultiLanguage.get_string('PACKAGE_LIST_BRIEF')
def run(self, argv):
packages = PackageHelper.get_installed_packages()
keys = packages.keys()
if len(keys) == 0:
print MultiLanguage.get_string('PACKAGE_LIST_NOT_FOUND')
return
print MultiLanguage.get_string('PACKAGE_LIST_TIP')
keys.sort()
for k in keys:
package_data = PackageHelper.get_installed_package_data(packages[k]["name"])
print MultiLanguage.get_string('PACKAGE_ITEM_FMT',
(package_data["name"], package_data["version"], package_data["author"]))
print ""

View File

@@ -0,0 +1,40 @@
from helper import PackageHelper
import cocos
from MultiLanguage import MultiLanguage
class FrameworkAdd(object):
@staticmethod
def plugin_name():
return "search"
@staticmethod
def brief_description():
return MultiLanguage.get_string('PACKAGE_SEARCH_BRIEF')
def parse_args(self, argv):
from argparse import ArgumentParser
parser = ArgumentParser(
prog="cocos package %s" % self.__class__.plugin_name(),
description=self.__class__.brief_description())
parser.add_argument("keyword", metavar="PACKAGE_NAME",
help=MultiLanguage.get_string('PACKAGE_SEARCH_ARG_KEY'))
return parser.parse_args(argv)
def run(self, argv):
args = self.parse_args(argv)
keyword = args.keyword
packages = PackageHelper.search_keyword(keyword)
if packages is None:
print MultiLanguage.get_string('PACKAGE_SEARCH_ERROR_NO_KEY_FMT', keyword)
return
keys = packages.keys()
print MultiLanguage.get_string('PACKAGE_SEARCH_TIP_FMT', keyword)
keys.sort()
for k in keys:
package_data = packages[k]
print MultiLanguage.get_string('PACKAGE_ITEM_FMT',
(package_data["name"], package_data["version"], package_data["author"]))
print ""

View File

@@ -0,0 +1,67 @@
# ----------------------------------------------------------------------------
# cocos "package" plugin
#
# Copyright 2014 (C) cocos2d-x.org
#
# License: MIT
# ----------------------------------------------------------------------------
'''
"package" plugins
'''
__docformat__ = 'restructuredtext'
import os
import sys
import cocos
import subprocess
from MultiLanguage import MultiLanguage
class CCPluginPackage(cocos.CCPlugin):
@staticmethod
def plugin_name():
return "package"
@staticmethod
def brief_description():
return MultiLanguage.get_string('PACKAGE_BRIEF')
def parse_args(self, argv):
return {"command": argv[0]}
def run(self, argv, dependencies):
if '--anysdk' in argv:
argv.remove('--anysdk')
cmd = self._get_cocospackage_path() + ' --runincocos ' + ' '.join(argv) + ' --env ' + self. __class__.get_console_path()
ret = self._run_cmd(cmd)
else:
if '--sdkbox' in argv:
argv.remove('--sdkbox')
cmd = self._get_sdkbox_path() + ' --runincocos ' + ' '.join(argv)
ret = self._run_cmd(cmd)
if 0 != ret:
message = MultiLanguage.get_string('COCOS_ERROR_RUNNING_CMD_RET_FMT', str(ret))
raise cocos.CCPluginError(message, cocos.CCPluginError.ERROR_RUNNING_CMD)
def _run_cmd(self, command, cwd=None):
# cocos.CMDRunner.run_cmd(command, False, cwd=cwd)
return subprocess.call(command, shell=True, cwd=cwd)
def _get_sdkbox_path(self):
path = ''
if getattr(sys, 'frozen', None):
path = os.path.realpath(os.path.dirname(sys.executable))
else:
path = os.path.realpath(os.path.dirname(__file__))
return os.path.join(path, 'sdkbox')
def _get_cocospackage_path(self):
path = ''
if getattr(sys, 'frozen', None):
path = os.path.realpath(os.path.dirname(sys.executable))
else:
path = os.path.realpath(os.path.dirname(__file__))
return os.path.join(path, 'cocospackage')
def print_help(self):
print(MultiLanguage.get_string('PACKAGE_HELP'))

View File

@@ -0,0 +1,3 @@
#!/bin/bash
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
python ${DIR}/sdkbox.pyc "$@"

View File

@@ -0,0 +1,3 @@
@echo off
@python "%~dp0\sdkbox.pyc" %*